From 0367bf549d74368178546810c1e38a265e23b68a Mon Sep 17 00:00:00 2001 From: Eric West Date: Thu, 6 Jun 2013 06:39:50 -0500 Subject: [PATCH] Initial Commit. --- .gitignore | 1 + 0.0.3_0.crx | Bin 0 -> 1623988 bytes 0.0.3_0/128.png | Bin 0 -> 86219 bytes 0.0.3_0/ace/ace.js | 15548 ++++++++++++ 0.0.3_0/ace/ext-elastic_tabstops_lite.js | 301 + 0.0.3_0/ace/ext-emmet.js | 270 + 0.0.3_0/ace/ext-keybinding_menu.js | 207 + 0.0.3_0/ace/ext-modelist.js | 157 + 0.0.3_0/ace/ext-options.js | 252 + 0.0.3_0/ace/ext-searchbox.js | 447 + 0.0.3_0/ace/ext-settings_menu.js | 625 + 0.0.3_0/ace/ext-spellcheck.js | 67 + 0.0.3_0/ace/ext-static_highlight.js | 121 + 0.0.3_0/ace/ext-statusbar.js | 47 + 0.0.3_0/ace/ext-textarea.js | 492 + 0.0.3_0/ace/ext-themelist.js | 90 + 0.0.3_0/ace/ext-whitespace.js | 204 + 0.0.3_0/ace/keybinding-emacs.js | 1058 + 0.0.3_0/ace/keybinding-vim.js | 1712 ++ 0.0.3_0/ace/mode-abap.js | 260 + 0.0.3_0/ace/mode-actionscript.js | 216 + 0.0.3_0/ace/mode-ada.js | 117 + 0.0.3_0/ace/mode-asciidoc.js | 372 + 0.0.3_0/ace/mode-assembly_x86.js | 217 + 0.0.3_0/ace/mode-autohotkey.js | 184 + 0.0.3_0/ace/mode-batchfile.js | 171 + 0.0.3_0/ace/mode-c9search.js | 182 + 0.0.3_0/ace/mode-c_cpp.js | 737 + 0.0.3_0/ace/mode-clojure.js | 299 + 0.0.3_0/ace/mode-cobol.js | 124 + 0.0.3_0/ace/mode-coffee.js | 443 + 0.0.3_0/ace/mode-coldfusion.js | 1765 ++ 0.0.3_0/ace/mode-csharp.js | 612 + 0.0.3_0/ace/mode-css.js | 773 + 0.0.3_0/ace/mode-curly.js | 1952 ++ 0.0.3_0/ace/mode-d.js | 388 + 0.0.3_0/ace/mode-dart.js | 945 + 0.0.3_0/ace/mode-diff.js | 166 + 0.0.3_0/ace/mode-django.js | 1971 ++ 0.0.3_0/ace/mode-dot.js | 320 + 0.0.3_0/ace/mode-ejs.js | 2327 ++ 0.0.3_0/ace/mode-erlang.js | 951 + 0.0.3_0/ace/mode-forth.js | 239 + 0.0.3_0/ace/mode-ftl.js | 907 + 0.0.3_0/ace/mode-glsl.js | 810 + 0.0.3_0/ace/mode-golang.js | 632 + 0.0.3_0/ace/mode-groovy.js | 1037 + 0.0.3_0/ace/mode-haml.js | 487 + 0.0.3_0/ace/mode-haskell.js | 321 + 0.0.3_0/ace/mode-haxe.js | 609 + 0.0.3_0/ace/mode-html.js | 1883 ++ 0.0.3_0/ace/mode-html_ruby.js | 2322 ++ 0.0.3_0/ace/mode-ini.js | 173 + 0.0.3_0/ace/mode-jade.js | 1971 ++ 0.0.3_0/ace/mode-java.js | 996 + 0.0.3_0/ace/mode-javascript.js | 876 + 0.0.3_0/ace/mode-json.js | 578 + 0.0.3_0/ace/mode-jsoniq.js | 2716 ++ 0.0.3_0/ace/mode-jsp.js | 1351 + 0.0.3_0/ace/mode-jsx.js | 635 + 0.0.3_0/ace/mode-julia.js | 245 + 0.0.3_0/ace/mode-latex.js | 189 + 0.0.3_0/ace/mode-less.js | 807 + 0.0.3_0/ace/mode-liquid.js | 862 + 0.0.3_0/ace/mode-lisp.js | 138 + 0.0.3_0/ace/mode-livescript.js | 288 + 0.0.3_0/ace/mode-logiql.js | 664 + 0.0.3_0/ace/mode-lsl.js | 832 + 0.0.3_0/ace/mode-lua.js | 455 + 0.0.3_0/ace/mode-luapage.js | 2342 ++ 0.0.3_0/ace/mode-lucene.js | 64 + 0.0.3_0/ace/mode-makefile.js | 313 + 0.0.3_0/ace/mode-markdown.js | 2285 ++ 0.0.3_0/ace/mode-matlab.js | 229 + 0.0.3_0/ace/mode-mushcode.js | 704 + 0.0.3_0/ace/mode-mushcode_high_rules.js | 569 + 0.0.3_0/ace/mode-mysql.js | 184 + 0.0.3_0/ace/mode-objectivec.js | 659 + 0.0.3_0/ace/mode-ocaml.js | 443 + 0.0.3_0/ace/mode-pascal.js | 233 + 0.0.3_0/ace/mode-perl.js | 316 + 0.0.3_0/ace/mode-pgsql.js | 929 + 0.0.3_0/ace/mode-php.js | 2291 ++ 0.0.3_0/ace/mode-powershell.js | 618 + 0.0.3_0/ace/mode-prolog.js | 313 + 0.0.3_0/ace/mode-properties.js | 101 + 0.0.3_0/ace/mode-python.js | 294 + 0.0.3_0/ace/mode-r.js | 316 + 0.0.3_0/ace/mode-rdoc.js | 184 + 0.0.3_0/ace/mode-rhtml.js | 2165 ++ 0.0.3_0/ace/mode-ruby.js | 431 + 0.0.3_0/ace/mode-rust.js | 204 + 0.0.3_0/ace/mode-sass.js | 442 + 0.0.3_0/ace/mode-scad.js | 670 + 0.0.3_0/ace/mode-scala.js | 1025 + 0.0.3_0/ace/mode-scheme.js | 144 + 0.0.3_0/ace/mode-scss.js | 832 + 0.0.3_0/ace/mode-sh.js | 204 + 0.0.3_0/ace/mode-snippets.js | 200 + 0.0.3_0/ace/mode-sql.js | 118 + 0.0.3_0/ace/mode-stylus.js | 483 + 0.0.3_0/ace/mode-svg.js | 1441 ++ 0.0.3_0/ace/mode-tcl.js | 319 + 0.0.3_0/ace/mode-tex.js | 166 + 0.0.3_0/ace/mode-text.js | 0 0.0.3_0/ace/mode-textile.js | 170 + 0.0.3_0/ace/mode-tmsnippet.js | 200 + 0.0.3_0/ace/mode-toml.js | 180 + 0.0.3_0/ace/mode-twig.js | 2034 ++ 0.0.3_0/ace/mode-typescript.js | 961 + 0.0.3_0/ace/mode-vbscript.js | 281 + 0.0.3_0/ace/mode-velocity.js | 1422 ++ 0.0.3_0/ace/mode-verilog.js | 126 + 0.0.3_0/ace/mode-xml.js | 788 + 0.0.3_0/ace/mode-xquery.js | 2750 +++ 0.0.3_0/ace/mode-yaml.js | 289 + 0.0.3_0/ace/theme-ambiance.js | 202 + 0.0.3_0/ace/theme-chaos.js | 179 + 0.0.3_0/ace/theme-chrome.js | 161 + 0.0.3_0/ace/theme-clouds.js | 133 + 0.0.3_0/ace/theme-clouds_midnight.js | 134 + 0.0.3_0/ace/theme-cobalt.js | 148 + 0.0.3_0/ace/theme-crimson_editor.js | 152 + 0.0.3_0/ace/theme-dawn.js | 144 + 0.0.3_0/ace/theme-dreamweaver.js | 171 + 0.0.3_0/ace/theme-eclipse.js | 124 + 0.0.3_0/ace/theme-github.js | 135 + 0.0.3_0/ace/theme-idle_fingers.js | 137 + 0.0.3_0/ace/theme-kr.js | 141 + 0.0.3_0/ace/theme-merbivore.js | 133 + 0.0.3_0/ace/theme-merbivore_soft.js | 134 + 0.0.3_0/ace/theme-mono_industrial.js | 145 + 0.0.3_0/ace/theme-monokai.js | 139 + 0.0.3_0/ace/theme-pastel_on_dark.js | 146 + 0.0.3_0/ace/theme-solarized_dark.js | 129 + 0.0.3_0/ace/theme-solarized_light.js | 129 + 0.0.3_0/ace/theme-terminal.js | 152 + 0.0.3_0/ace/theme-textmate.js | 0 0.0.3_0/ace/theme-tomorrow.js | 146 + 0.0.3_0/ace/theme-tomorrow_night.js | 145 + 0.0.3_0/ace/theme-tomorrow_night_blue.js | 145 + 0.0.3_0/ace/theme-tomorrow_night_bright.js | 145 + 0.0.3_0/ace/theme-tomorrow_night_eighties.js | 144 + 0.0.3_0/ace/theme-twilight.js | 145 + 0.0.3_0/ace/theme-vibrant_ink.js | 129 + 0.0.3_0/ace/theme-xcode.js | 123 + 0.0.3_0/ace/worker-coffee.js | 7442 ++++++ 0.0.3_0/ace/worker-css.js | 8240 +++++++ 0.0.3_0/ace/worker-javascript.js | 6447 +++++ 0.0.3_0/ace/worker-json.js | 2256 ++ 0.0.3_0/ace/worker-lua.js | 3364 +++ 0.0.3_0/ace/worker-php.js | 6694 +++++ 0.0.3_0/ace/worker-xquery.js | 21848 +++++++++++++++++ 0.0.3_0/badge .png | Bin 0 -> 2429 bytes 0.0.3_0/devtools.html | 6 + 0.0.3_0/devtools.js | 8 + 0.0.3_0/jquery.js | 6 + 0.0.3_0/manifest.json | 13 + 0.0.3_0/opal-console.html | 70 + 0.0.3_0/opal-console.js | 19 + 0.0.3_0/opal/opal-jquery.js | 1 + 0.0.3_0/opal/opal-parser.js | 9093 +++++++ 0.0.3_0/opal/opal.js | 6750 +++++ 0.0.3_0/update-console.js | 40 + README.md | 7 + 165 files changed, 168040 insertions(+) create mode 100644 .gitignore create mode 100644 0.0.3_0.crx create mode 100644 0.0.3_0/128.png create mode 100644 0.0.3_0/ace/ace.js create mode 100644 0.0.3_0/ace/ext-elastic_tabstops_lite.js create mode 100644 0.0.3_0/ace/ext-emmet.js create mode 100644 0.0.3_0/ace/ext-keybinding_menu.js create mode 100644 0.0.3_0/ace/ext-modelist.js create mode 100644 0.0.3_0/ace/ext-options.js create mode 100644 0.0.3_0/ace/ext-searchbox.js create mode 100644 0.0.3_0/ace/ext-settings_menu.js create mode 100644 0.0.3_0/ace/ext-spellcheck.js create mode 100644 0.0.3_0/ace/ext-static_highlight.js create mode 100644 0.0.3_0/ace/ext-statusbar.js create mode 100644 0.0.3_0/ace/ext-textarea.js create mode 100644 0.0.3_0/ace/ext-themelist.js create mode 100644 0.0.3_0/ace/ext-whitespace.js create mode 100644 0.0.3_0/ace/keybinding-emacs.js create mode 100644 0.0.3_0/ace/keybinding-vim.js create mode 100644 0.0.3_0/ace/mode-abap.js create mode 100644 0.0.3_0/ace/mode-actionscript.js create mode 100644 0.0.3_0/ace/mode-ada.js create mode 100644 0.0.3_0/ace/mode-asciidoc.js create mode 100644 0.0.3_0/ace/mode-assembly_x86.js create mode 100644 0.0.3_0/ace/mode-autohotkey.js create mode 100644 0.0.3_0/ace/mode-batchfile.js create mode 100644 0.0.3_0/ace/mode-c9search.js create mode 100644 0.0.3_0/ace/mode-c_cpp.js create mode 100644 0.0.3_0/ace/mode-clojure.js create mode 100644 0.0.3_0/ace/mode-cobol.js create mode 100644 0.0.3_0/ace/mode-coffee.js create mode 100644 0.0.3_0/ace/mode-coldfusion.js create mode 100644 0.0.3_0/ace/mode-csharp.js create mode 100644 0.0.3_0/ace/mode-css.js create mode 100644 0.0.3_0/ace/mode-curly.js create mode 100644 0.0.3_0/ace/mode-d.js create mode 100644 0.0.3_0/ace/mode-dart.js create mode 100644 0.0.3_0/ace/mode-diff.js create mode 100644 0.0.3_0/ace/mode-django.js create mode 100644 0.0.3_0/ace/mode-dot.js create mode 100644 0.0.3_0/ace/mode-ejs.js create mode 100644 0.0.3_0/ace/mode-erlang.js create mode 100644 0.0.3_0/ace/mode-forth.js create mode 100644 0.0.3_0/ace/mode-ftl.js create mode 100644 0.0.3_0/ace/mode-glsl.js create mode 100644 0.0.3_0/ace/mode-golang.js create mode 100644 0.0.3_0/ace/mode-groovy.js create mode 100644 0.0.3_0/ace/mode-haml.js create mode 100644 0.0.3_0/ace/mode-haskell.js create mode 100644 0.0.3_0/ace/mode-haxe.js create mode 100644 0.0.3_0/ace/mode-html.js create mode 100644 0.0.3_0/ace/mode-html_ruby.js create mode 100644 0.0.3_0/ace/mode-ini.js create mode 100644 0.0.3_0/ace/mode-jade.js create mode 100644 0.0.3_0/ace/mode-java.js create mode 100644 0.0.3_0/ace/mode-javascript.js create mode 100644 0.0.3_0/ace/mode-json.js create mode 100644 0.0.3_0/ace/mode-jsoniq.js create mode 100644 0.0.3_0/ace/mode-jsp.js create mode 100644 0.0.3_0/ace/mode-jsx.js create mode 100644 0.0.3_0/ace/mode-julia.js create mode 100644 0.0.3_0/ace/mode-latex.js create mode 100644 0.0.3_0/ace/mode-less.js create mode 100644 0.0.3_0/ace/mode-liquid.js create mode 100644 0.0.3_0/ace/mode-lisp.js create mode 100644 0.0.3_0/ace/mode-livescript.js create mode 100644 0.0.3_0/ace/mode-logiql.js create mode 100644 0.0.3_0/ace/mode-lsl.js create mode 100644 0.0.3_0/ace/mode-lua.js create mode 100644 0.0.3_0/ace/mode-luapage.js create mode 100644 0.0.3_0/ace/mode-lucene.js create mode 100644 0.0.3_0/ace/mode-makefile.js create mode 100644 0.0.3_0/ace/mode-markdown.js create mode 100644 0.0.3_0/ace/mode-matlab.js create mode 100644 0.0.3_0/ace/mode-mushcode.js create mode 100644 0.0.3_0/ace/mode-mushcode_high_rules.js create mode 100644 0.0.3_0/ace/mode-mysql.js create mode 100644 0.0.3_0/ace/mode-objectivec.js create mode 100644 0.0.3_0/ace/mode-ocaml.js create mode 100644 0.0.3_0/ace/mode-pascal.js create mode 100644 0.0.3_0/ace/mode-perl.js create mode 100644 0.0.3_0/ace/mode-pgsql.js create mode 100644 0.0.3_0/ace/mode-php.js create mode 100644 0.0.3_0/ace/mode-powershell.js create mode 100644 0.0.3_0/ace/mode-prolog.js create mode 100644 0.0.3_0/ace/mode-properties.js create mode 100644 0.0.3_0/ace/mode-python.js create mode 100644 0.0.3_0/ace/mode-r.js create mode 100644 0.0.3_0/ace/mode-rdoc.js create mode 100644 0.0.3_0/ace/mode-rhtml.js create mode 100644 0.0.3_0/ace/mode-ruby.js create mode 100644 0.0.3_0/ace/mode-rust.js create mode 100644 0.0.3_0/ace/mode-sass.js create mode 100644 0.0.3_0/ace/mode-scad.js create mode 100644 0.0.3_0/ace/mode-scala.js create mode 100644 0.0.3_0/ace/mode-scheme.js create mode 100644 0.0.3_0/ace/mode-scss.js create mode 100644 0.0.3_0/ace/mode-sh.js create mode 100644 0.0.3_0/ace/mode-snippets.js create mode 100644 0.0.3_0/ace/mode-sql.js create mode 100644 0.0.3_0/ace/mode-stylus.js create mode 100644 0.0.3_0/ace/mode-svg.js create mode 100644 0.0.3_0/ace/mode-tcl.js create mode 100644 0.0.3_0/ace/mode-tex.js create mode 100644 0.0.3_0/ace/mode-text.js create mode 100644 0.0.3_0/ace/mode-textile.js create mode 100644 0.0.3_0/ace/mode-tmsnippet.js create mode 100644 0.0.3_0/ace/mode-toml.js create mode 100644 0.0.3_0/ace/mode-twig.js create mode 100644 0.0.3_0/ace/mode-typescript.js create mode 100644 0.0.3_0/ace/mode-vbscript.js create mode 100644 0.0.3_0/ace/mode-velocity.js create mode 100644 0.0.3_0/ace/mode-verilog.js create mode 100644 0.0.3_0/ace/mode-xml.js create mode 100644 0.0.3_0/ace/mode-xquery.js create mode 100644 0.0.3_0/ace/mode-yaml.js create mode 100644 0.0.3_0/ace/theme-ambiance.js create mode 100644 0.0.3_0/ace/theme-chaos.js create mode 100644 0.0.3_0/ace/theme-chrome.js create mode 100644 0.0.3_0/ace/theme-clouds.js create mode 100644 0.0.3_0/ace/theme-clouds_midnight.js create mode 100644 0.0.3_0/ace/theme-cobalt.js create mode 100644 0.0.3_0/ace/theme-crimson_editor.js create mode 100644 0.0.3_0/ace/theme-dawn.js create mode 100644 0.0.3_0/ace/theme-dreamweaver.js create mode 100644 0.0.3_0/ace/theme-eclipse.js create mode 100644 0.0.3_0/ace/theme-github.js create mode 100644 0.0.3_0/ace/theme-idle_fingers.js create mode 100644 0.0.3_0/ace/theme-kr.js create mode 100644 0.0.3_0/ace/theme-merbivore.js create mode 100644 0.0.3_0/ace/theme-merbivore_soft.js create mode 100644 0.0.3_0/ace/theme-mono_industrial.js create mode 100644 0.0.3_0/ace/theme-monokai.js create mode 100644 0.0.3_0/ace/theme-pastel_on_dark.js create mode 100644 0.0.3_0/ace/theme-solarized_dark.js create mode 100644 0.0.3_0/ace/theme-solarized_light.js create mode 100644 0.0.3_0/ace/theme-terminal.js create mode 100644 0.0.3_0/ace/theme-textmate.js create mode 100644 0.0.3_0/ace/theme-tomorrow.js create mode 100644 0.0.3_0/ace/theme-tomorrow_night.js create mode 100644 0.0.3_0/ace/theme-tomorrow_night_blue.js create mode 100644 0.0.3_0/ace/theme-tomorrow_night_bright.js create mode 100644 0.0.3_0/ace/theme-tomorrow_night_eighties.js create mode 100644 0.0.3_0/ace/theme-twilight.js create mode 100644 0.0.3_0/ace/theme-vibrant_ink.js create mode 100644 0.0.3_0/ace/theme-xcode.js create mode 100644 0.0.3_0/ace/worker-coffee.js create mode 100644 0.0.3_0/ace/worker-css.js create mode 100644 0.0.3_0/ace/worker-javascript.js create mode 100644 0.0.3_0/ace/worker-json.js create mode 100644 0.0.3_0/ace/worker-lua.js create mode 100644 0.0.3_0/ace/worker-php.js create mode 100644 0.0.3_0/ace/worker-xquery.js create mode 100644 0.0.3_0/badge .png create mode 100644 0.0.3_0/devtools.html create mode 100644 0.0.3_0/devtools.js create mode 100644 0.0.3_0/jquery.js create mode 100644 0.0.3_0/manifest.json create mode 100644 0.0.3_0/opal-console.html create mode 100644 0.0.3_0/opal-console.js create mode 100644 0.0.3_0/opal/opal-jquery.js create mode 100644 0.0.3_0/opal/opal-parser.js create mode 100644 0.0.3_0/opal/opal.js create mode 100644 0.0.3_0/update-console.js create mode 100644 README.md diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..cfaad76 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.pem diff --git a/0.0.3_0.crx b/0.0.3_0.crx new file mode 100644 index 0000000000000000000000000000000000000000..e0ea1dec81cdf65a0acdd040b90464ef8b5a92ab GIT binary patch literal 1623988 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�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%0DJQ*P#&M%h^+sd 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ŋh)m3+v%lynVwVTS%d{)*A(HXol3{j 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Ⓢ=Ym2eTf=! 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�CS~*fP_?UtgJnSyGFv!_b9j# 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�p6qOZ}3@jM$OOZfG!xy6;8$t0&Cp4S@_gJ(x|< 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

%c-`GU=FaaQ zewOL0d$+?eJEFqJT-^-6F0lf^X8on2MX-+nsoEt9YM*;AZzjO75>8-F{_ z_vNRZNV{!(ze(Ho&F+vP`OUuC%qipQxcm0D_~9Uu+f4>||GImdpz+ONf0xp3*&ZaQ zzBvgj@aA;C&pi<^^XBos0PweIGTyqDPutx8w}<`XL-B&H*Fg9-eXtX&yi35eyL;Fl za+&*_y4n7eUmQW+<#pZNzuO*m;;ZBK{^;QEhpo(#)t2zK^BlvWsL-v{(IEtpu}|p) z)s9a{6Z{{?JWD=(C4c;Go2tIu+`oO??N*l9isTOt(9_#~|B%x^ zZVwV;=3Rd0@XgTyR0fi}{f$WO-ux`y9&<15_PG-YEj1a%uDlnijP&mJIdxSnoXdGQ zY~4!bg)1s_>0^FLpY6Z>53yAH>+8ouDz;CMm6vCKpLc7yDKeby4>#NLWqVV+iVf*O z{Ow`$@UF=?iX4HU9vrE3n4sMq58K1l-R?F|yUVziAHF+?WpzB`PWIl--St*tvXoJy zkb0Kg`wzSQWA5%@?}*OPf4OU^++j=Nd3?8f$ax+J^4r6$fRDrW^mw>0-$ZX*4qPC;^<@jco*Z$}z``xB|yK2~vkY5ppk zAszRk`vr&M-ZCOOIvjB)KRe}J?52HpeUfkTC$}Px4kQaKbNq29xF5-BoZfBkMf$jT zJmkeb?e6lJGMYPi1fO5hjyXNv6|i*r`C%*5WiKA@#iF{G?=!pecwguQ#X13z}QM?>>a@HNaK8lX~=*Z-|G`Jtd?6`CWj~^Y+m|ubbddwO3H~Sy+ z+v%N5?;mshZk#fmYWV5Av&%zp9z@!u~W zI+@>X=hqa3Uwz=xA35@{{fGnj=!c!#Is3!$qrbQf=UAree{$1%>!;Y^(94Uj-46f$ z(KAw)7mf+?1pergfx=vTb9oW@j8~!L2ecFHLHoq(Ow_iSaFK0Wk`>*krR6+bYl)=zZYn)@EH(4=%2~{JX z>I+vb-YC_}Mm(ka(3cKv`C%XSKe{6Rm)8#QzdqiE21P?(yE5OzT8pgDKD%(z7WEhx zf4KPin~RT|QlY-og5S)pviFZ}AG)c19eelwnTB6KJRaY@il4{%h|_U++#;u#Va#4L z@HE4I*!P?oRO{29h~GQ{_Fr!t!yl@>xY)h9c;&mke}gu@_8)Nu-cKX=Fn*d#grq|({`azP{u`8ulNdkvdMD6=A697d;&%nG{QciwgxL(g ze~k)W_owx50?~BJze4)M-0m+a<%PE5bFsb7eU;`lY-gn2^XTfo08mQ<1QY-O00;m8 z0002*d#7y51^@u?4*&oX0001CV`VRNXk~3>EqG&ZWMwXDbG27lbK5u)e%G()@;+Ej zQJ0T(Vpkq`Kr%BjsgRT%?Ph9<5+NF69vT3&teTqtz70@{B}IKnn@rR8amzllEFapvlG+D+`DV^d~5= z0z_Hy8PzjWR>XV-^OEPnfF+X;P;&iUR#I8X%Y@C@ELJuQh&hD?# zTF7{_fgRkN5=A)Vv80^EnRwX*y?M&^b}(B}dX#BZB~rvWRmgVo3BmJS07^{n4#WJy zC~C7M7wCTlQ>qdQ<0*j_3C>cLJBTMQC54(UDYn8v#F(EjM~RvsQO@O3rN=tqKrHA? zr5kE9m4{pV--V6xfcog_|u0tHKCb&qz_D7Sz9o$54;}0DY zgkX9O&U#VcTI0yai6b*a%_Fs-&yqI*@@*85Fa$pU_jWXN(H=SoOfPatXn^b4!?ELf z0|U?ocz%S({ML<7EbK}@DKB(+s< zQX2?}9jO3bMmExgaE1niBVxO1K)w-#Zw3=XF@R)+?e5D~#M|91$4!zN6UytPzkuT=X(>~j&8=&rLw(`VnT+27Rm`ko<}K?iOb_|R!I;u&oxbj}LeJjQVc&vi~a z&#Jy28}Q#_PXDSHSL0*)yePR8YKYao%IGoRP$^|>+DXd%_;&;5RWVZqrMXr#V6A3A zt#kr^HyZ1?HWN?{@nSB}s@OXE4(S&!(mRLh<98An2H2{MZ3 z7f&scPXaSqA9EE`Tjq;QDME8RcAYCAm)+K>b=hy7JEYgLE>F)}_T@#tch)D} z?#GK0J{7yYO{*WVknGAlVwoSmJ0Z~XJK zJ{GM)w(^*#Sjo}Kk|pxt3VMs@>w_lujqEsXZM^mMv*o_4pMwZy6&Gb4LCLY+wlX@G zS8%#`##)=PT=L|6-_$^}BLGUOe_-3DLF2AZ^%81GBs?Z$m5FV+c*jh2iHsefc~ zkydd^ji2Qn=}I{`u!7xcd|>)1#+GZE(H+AI-{xf6AG=-i{2(Y+JTbvgd0YM$o3|6h z>>~ye zHXcAKs)efZJI>z_+uS`VHuHG)TrIA_k3L6aHRq=L9 zE4F`AT|vdOW)jQzisgv4vnbN*X)Nf!&kc5G`N6XL+aN7Xe7tb{K*p&W67`>Ln-lf* zpL9AY^lUdHU+=!U`Tgj;gU|eYI?Ps`jsw!f@de?JU(z)F{Q0DQ z3s$dbG?uLuhJbBF15YfzMdjE}tlO66QM{2{+?fPHZ@g(BGLP8bZ56ng34}$ED#;b$yf*-IsLAn8A$>{ zC!1_5WVV0<1Ignz-a=QzTL;xQ;h9J4G*vX?l0fG|s=n3Qs%G-m|`2K3p4 zmP0nHFoju!!ppqCc!~hAlGWfod!{X!kjf4~niZHd4Ta(y^M_h!sqQ(AHejLOFbU#0 zB?pfE#;GC_GZD_*EQWWzzeU?H^|YRA-voEj}HTQ1M5c<9H!usrabGymFf zO~B`|>s(nwa|rz#+%#d}jBi}){KAI|XEZcj4-9*VtG4f2{fY13Lf7z6vr8M|FxfX? zejdA~=YivbbvYhcXb&B@hV5IXr-5Y;Mw6jspKE|Nz;=8*=a-g`V!opZzfz41t~J3q zgGwKBjB7_zD@4V(4PTg!}YDfWMsH7p15NN*#m&UAhw)i=-1D-EeG@Sm{gGK(wQouTt~u~2fc4V=(}i$G8hB%KV9|s5 z*+lq;d!tbXFj=1YuL%m_CJc>Bn>$c^nyXT@USNaeq9V*VvG3AV8J%eN7lJ%4@?qp z$k4UrnJSja@<_lcJzpE>b|PY@mOyOfqb0Ieb*(0f2-X=G!z+vMOL?rkXUQ%R=^I?g z?CWwkl!L~^4r&=Qu;1%+f{^JEo5d+p_VBrfJkEOI$D9Q`eB9IEc8{}vFJsQ|d5?Wt zWW31f5#^Q%+XH+gwIsgpW!Yj+z6vV^`&Lv7MfSwf_&mW()WP zQcmgWdKFGrJrx2zMsi6Lr!FPp>#90!NUr>jCGHXr4?U|*JT2xnfi`RsmVZyf)vRMYSR0*DznU*@M+E5LM@`>g3 z4@E71DSKJxQ=zx^SQS-&VAUg*Yi%uCg-qIQAt`lv3BJm|^jHs;#NSRk*cW=7;)KLu zr_j2#>JJp?C|kj;eIQaBMMrqrtW<(qiRU=K(N=<+crOUzze}{uXu&gfM+jt zmrY+aePt!R_VcFdVUQ%EAUfVDimZ5Dh=Rytugl((-S|dZ?~-2&Dg8k*+_Ly5(A0ZG z(uRR3X-iF>)}7?EAk?~`Z+ zJ0QhNE|0^m23suVrzM!h{xL;XDLtnRL%^3Ivr zIir8$iQz%|z<%d(a7kz5KnOe7(qgZgIqh?>-otNOy!~^!+`*Ia43xh>?<;oIhaUD{ zF8Nt)R8_L+4F51=k|b-(q`m*;O{)K1Ms1@~$^*ebIozf>L^DWPQ)ne53W-uAtcw?= z_f-*a)Sg;{D&iCZY6bhKwoSIeELqM|G$zDukEeRV(ud-)=`mZdRFr0%wEx@NwWqx+x-Z^ONsoONF))Gl_oGlXE6*m{r zjf%j2q}5|MJXSU7uC2gp*PD&kGMO6{!-DnH+oNgAd~7)lJLYBkxoN)}iYl~o!`9{e zf1RTxNwnSj>HCgW{_sTI9;$6Lv&}Rl*$?t}F2(}i_KmovP$j;$v_Vo0*0030hU4uk z=++h2qnUge@F#K6rsM7D`(I9el&nwxYno+T-&a5Mwy(!tku4gk`N5B~Y?($i`Nn;h za9zg{-O*(t*H=F#{#B#VKe-}t)85Hj#0*kgm#5H35;}-^3yDdl6NA%5&n!7E z@k{JGV{hpE(nuFw6*k4V@GI=sxF7yr`8<(^HYjUHb?V~-zSrkRW0)XfPy}&-AT~IF zW4y=LQbwdDs2Bf)L8-q&f?o#*YRgTA;BdC~oZrUNjp0>&?l}vdP8(ZqowhNz!GVIQ z%29yqhn!d|-`jhMsamg@m-lmV2*(ui-##JDLwtDH7IULt;_2y6lk)#dNW77ba!521 zB7V!0Rk3(=+MCQRNcg`{O9KQH000080000007EY)d|Rgg0QCt401^NI0AXWgFKusR zWi5Ddb!BpSE^2e^efxJ6x3%!^`72K8U5(usXC%!_P?ALmZTW5jDUh3XQSM#F9N;v@ z=GrEYujc#Pzx~k6=sk0ejUg~uF`6?YY3s4IU)tLG{Ev%2;(v>;ZvW-Z-NiR|Zr#57 z;P&FHZ|>dtPyX`B;*X23S0|^(t0%8dmrob351%fN7pE_li?1Ghy*OCyFAqW zymj>I*W=am7pIG@{q2P;M6t8D`LDfSc8`vqFTUFSuU*V^^Wb1XnNAkR%ai5tPs^wD z9{=typLVcTM~92OLjZWPT&xZkCr7W3_m}kM$?9TkY>*9XpG?6dKQbr zqf;2P9mupgf$@V zdbI!ggC<#ii%>E!@ZYFY?*^l z(D-Aw0hoH33z5C3}S!Q#QaKR^88 z=Kb3Xc>eDGz5lxN_3f`0U;P6<-d^0g_uW74-}%d5A1?lS@0+i0-+!>UdG~90d-vh} zJ70bO@E*Lla`OR{yn-KSG2Q*g;`ZOayMOz^gT=l3i#y+b_st!s4*=Z1dH3O++YfdY zckbT$=KHVj-2KbW0_s@Yz4s8-`L}l-LbiwZb_lL1h7}Ga7x(_W`1bbwTYrV0H@~{` z&7Ft;pyvGf&cnM1?#}@4=Hk1X_aEN5_5C+D?=Qal{{DCOfO{*gChWg_2Bm3zK2Zkaq;!dZ*TtP_5-YK zYh)Z?E^d8)|Ms`oMCkd0@4tHR@Xo{UAKqU4<=(xoX>=dlzW-l9As<}F`o6jMfQIP% z2e)?s&cmAo9%_N{d2k({zxw{c9U7@ScOTxqfB*aM9^SckcN?bm2N(!w=}jp5bvKds z?$TVsY}~v553Co*g9d$P@xxzl!~6Rtkq_tbYp31}NX-l5U!uy%(gadGF*i<@8n z*BxxX$qzIC;Eur(8opb9HKV_4m;*DK+kin4HnaHS=b!BDFL$3VpREp;Tc5)7=Rn4n zpa1f|ub0Qae!8=G^y%^Pe_yYTm+<`Q@|Raf$EPRw2)SM#EI(bqBNqDk==jIwu}S`C z|6m2Q=u`9UVD;qlqoY^dPpbcP`OB&Ef&qU1_rGEC&GMJ!argOn@9_E3$@^saV(+IF zaDkzj!$%;OPk~r|zJGH1D>U%&&f?kY!+j)hTc#&F3)7FC1@~fm@$XMQ`Q)d)E1+q-s&>r@AH)hlWS;L0{p#QDhy8Nr18V59T{mNH ziuALDvw=JS$^PztoF4tSJY4->7=s05I$Zv2kINQ}=#aHpsl?iOKGE z19QKDM#9YPt`3160%zO84?Fz~LXJ2uzy1E0x8{t!*^#m9-)N=qI zK>*l$()Aht!!cQPCAeo$7uT_cB}^~6yujc0UqDv;v`as>KL6**AGf}|1`PV}Y+#v2{`vD~Uu;8`|M=XhYV~ZfMWwg6^A_eBpPc{R>RY#s zGvIce=b-CJVSUE>_Kyx;zdVErDcd9Qc=up=`26&R3-##L^6;x;Ac@}{otP#9eSi8b zmI0i{Pd_eCxBd<7y@p-eG4)6@TcPK{@04uoB(VR7RIk5QuCNrbkC&#!db8cfUw zg7pD>-NLm>By5Y?UhLR?xGJ`H47g#whq*pIdj9-idF$vUO3MiKBsJyme0+KzD+ZDE zemMUtMqzK{do(&de(ilbMsy+6{O8uSt=&IvU;F3w=hirZ2C>*$-RR(6U#$Lg!@!2; z&pxvo&`-?qk`de<$JO?>pBMid+GduGpW(^za_>j?^_x$IC$}?(y$o|v&`jX}*0inL zr^upOZM#h($h%Y{VIE{(#c}`?{+`XzFDP1}-C}Yw+o(qcclx3H(q7od%WYVYi))K3 zTi32EKI6W8wzzU_`-;_tHwj`1V}H72X~MzCB`GuZIDInA!p~iPoCaGI*?M#ZntKJL zpDUh-^*>zZ3VdPq$i=RBgp2faUar<~aM|6x)6>2E7Y~oVHd<%bN}RL)oxOVf3ZP?G zmdD3O*o?lbOBWfsI!~6THxEHsCe`+2>k&w+d#8Jk?I9h3boAo{F#89~y<;2D8US8^ zW`BU%y$y#XmlGElj;bZo>~bC)XL_KXnU~iy#SVyWL9yt#F$rqUr)B;4Rk7jCA~%T??wSjc=0Eyrdv6&HElovq*r^O`QL#yVv$Fy z$KJ|*x;$8(F8fYBdH&Gt@gpeqcybY<<*_oc%+Ekt{r(jU|MK=vOKu=DeY@zJJVF@O z$9Un28gI6D_xBDCNPOIVb$oPsbo%Qn5+98!vTLMZ7L2L-oMPtbNfVW{u!4R7ChJMm z-$8NcD{zH=?_;kw^lz>Y716uD?j1foa48?!_Xbq@q{AeV!qU<3a25VPSspxt7f;XjPT>E2 zs1;zG0gq$j``MEvki6yD{@w}wb4vg0Jvo41FIERn&p?DYAf5qFBvziGwHN+*4UbQk z`v-ea8W!^2>jV6a1Pc-Zv`0C*$G$P<6*lAP>Zh~LxZ6KmJp}v(&2C9=NyA&de0BOO z{|j}%8ix*^K^lrla==kZ<{JVU52FwI||LS6=y!Yw_v<$%G%$}T`u3)InfY&@dIeYRe;oy>bXL91e%z@0#=Fa^ALdh|1_g|pWu^d2VkB|Z%B%-}%9 zs{@=WnlhMr(7=8HoCA~qnsr8|h!yl4c`Q~yEBox|S>H`kKF$t~j$YBL)ggRd{<1nX z(?d)0)hop4f1Lo7S4Sr+1`m_8e|ly294j7!RV~$GrdDk)cmff`@M?z<&y29nma!Z>qckM8?Pi+ZIbepojas7jkhh$uzhFGX5{8 z*Bo7S|HtirFDTu8b@U2ky~P`+U45JOQLscZ2t$jj^>p_D6q(n1&zDz*(K>|LCl=i2 zvOfOu^1x6x&OndW_g5=?54o>WsQc1|{N(itEpJ!6Ve1TW9Ydfsb#3ve=LN$s zZT;RF9fmMAI>>6Sd`DTY@G$MfD!yh9d)LWHbsLL9w(|cMseKn{`dSb`&d&h()9i_oo z=ya_5L1naoyncl&a<{AfO0?*=#Q(kq2_ZsYCSo+`2fw5ncaMnvc_94H?Z4fHx-$I- zF8L5-sYvgU@5OumUxqtDp}thdvEn5Fvmf2U{k})mWD;4Mws^jVoas)0PP%-)JpKj* zmg7BZtPDwv6@furz1%xktH{x7=-)ae?!AJnr(`DaW^ebX`xGr`X00!lU_Hd4h*jTv z#-Dz7GoS+v?<_ z?XJ;gwMW^mk5bu=M8NyNjhxiOW?B{nefQSe1>NCET-^BL(~S`j>b!+&evYB~!wQ*K zr@!u!^UiLsgIvYjiKTQSK(DvKXOYmqH7+|+`RCC&*gc*u6?Z7m)jrHj9NAgbGg)rE z*gKv!#BY^LU4nG?cBw5aaW-f^y-i4dfBDRjh&|n8cX_hEml7dxPR>*Q(|?ClIl&@A z9`V-5e2kSJKHYFu82QImLbtZ##BU>-(Zh;$hvo!zP;ct1J{WXnouzWXi@vq}&vTVwn#*kTqP z#z`=eLpcaq@u6HDCx_B9vqoEc_39TJ34rNoN0Bp*^!Vig8~MYAvPC)C#>bDpSXcT@ zHt)MTsUiICPK2hc;w^G5mWe!HIGHwX@nDj?B!TLE;#e0X+@<(+Ofbof^@WQj@84LT zTTB`oYf3w}ht6BY^-cF&w?BzHPkb^sMx$%e!|rQenjM0T3#R38OK%|KmU*~wV_}35 z^hEs~z1?1Xx%l*vdHwj)#WgN9Y(&xILM8v_!M(e?to#2eqg#xt$ySf_pUBP@6U94{A=hJ zxLCXh{Z=S<*UCp%XaN2Pw;OGMkGDK0z}4ZiBkbtwgM)~_)9Tq)2g$NLF8=U`z5$Pl z$GdcXjOOfz2Uk3AxTqfpefjm(vKLOBFUBLphCr{ZOm7^gt-gu4LA+0Hsv>a5bo$lL z8g$))<2m!vb|vJXealDAFgot9wT32OH76nRQ7>H_+s*J@}Ckply#}bY2-QL87|NOr5wS ziTKDh<}6(C>e;VbJu|WouDr1b&jS6nJnvw{?xmflpQ%s!e+MRl%Vc1*|9Rk6 zj$gfnD^DFvF=t!sS3Tk|?HorPn{M}*6Vl>;aee>7`n=KWYyMY^ET1f2f@HPYf7rqB zNNFmWbdHH_ z^53|JdoNi}@N%E-!oK-`anE;GEwaD#NZ~6AJkmRKBmy4j)Pd1Cw$IhV^Yssz@9H$$ zI-GtchX>E>6GB7|T@k_Y28X#Iv_INe{DNKV*M(_t$9A4{%Wrx36vx(CjYt~07e~*Y zv6D2sJn9Sm@@lz{5l3z;e!1=*$NkCxu+>$A)&%>y;m%$D+XO$78=(4mJB2Nhn-x*N z?xC460OqS->Yml(NU?rEuD|iR{_XPQWbe7#z)x&!@oNC)SfKdZ3DkRsdk4RstWFls z_JF<^r=VXCPxpRV@Hwu){l3TiQH1JoVQIZJr-i({45d4-!Ic^U39G7qCr>6GYrMmPD3FK*DRd$elz;l2O7efQB3 z9&PMQ0dKC`ZRoI>iac;+y17I^?o{O8-lJ;8$B|Df~SGjkz68po4 z%)C(2PF49R-dnF#k00Ch`O7pM5L^?HMduC1=`dcYq1>{qPtQQ>eQITP=ibTsioB`1 zLrpGkU-s0nAE)j>JIWbcv~#Hc=iwDEk2x%R;;b^~a60Q1lo!oagM26~gB&l|rJ=Mi z@mHOOIjFg`h}f3JA3s}cnK2nOcA`x?W~|V}MNdv4=oHCGW(JYoU2!VyCZ=mSRF6K9 z-D?ob&?Io>(UndR#=QSJf_CG%+HC~!_{z2q(}lqUfGh6o%(V7*UN7j-(&FUxKAvKE z248+%ob2x%9#Vs$4yppGUhIR&xwntUZ>0p;qLCP z(_9~o?5WyWe7kr0V)rFHb2c6|7tx@Oy7Yzwfq09DEt8}=$BD8-8Be^^cik>EfbLGA z9~>S1xc6eY_f-6_B}%r3*#CY0`C{-s#$Cu2%D7Q39?01UGtk@HN|ou>%^WHt7oTMRTZ{8S;R8TG01WR;%bocIBtBA3)&NAZ6IgB#UR+4=zC=s-0MirWicSu| z#Qa1{1oM;yI7npfbfp0XC4wGiNlho&x&2Gi8!vwVEW4I|SRFjw-#dQl0!uF_FMj|m z%lX|yZ!XBR5D+aD0M61q_voApI86ehr2@cB7O;H)&xPBh;YJDt4~3y%qBM2Rnwd_J$deeT1^C~u!9fygWopkebEaT1E1 zIp|9k42-(ll{Anc>j$U0d8=>o5}vRm!&MWk%HfdTM(ff#y%}AZTOuasFk!_7Ne8#! zA>uWPpMxWY@X|PicFTEe#mYSC3?R5@pP7bK$#=ku(yNSGN`ve`Ni4J=cd(v6V9T7y zuJQ=k6fqM%1}Klb)c>G0`E8ut;tDg9~WP56_o|q?u)`Q39QncLu2L zG^VAVphSQ$St1tcnF~2h%+f_?T9XDf)0z)M*bIqHK+L)`#~Tr|J_bgdm_?CugqUHK z@FQ{*Izr4yZ5$(JBD<;vsP1}BFRY+MfRS18DAF?*L({TSy68;I(x7Hyc8SXQTO?*7 zu?dJ79sb>jl5q^1giMwoW3i*g18KtZ#G|AsyMGj`-(9Ea4W&%kKpDXww#B2IQ2hZ!Ixy-{&E75$SPw_?Jjjl z>tnG(fsrTgE#W&wWxOSlK2devtp24>crs@7FE1IxY%B;ds|z2z0d{e)-#CUv#TF9E z>|iwmiv6BY?DyNFD3+EMOuYqE98It`jBA2haCZrA!6mpm!QBZC0Ty?64esv2A-D!7 zxH|+V=+3`+@4e^y&)Ksw(>v8&Q~gxU(^3Pcx%~=AQDbU>ACvxaUFYm-49`=aV3*y5 zod5l9l{h}rur=}}dXqNEdlX|_@W|M~y9e*!nqIp&V|9sJywz@RRO`U6xYiq6%_66` zw#2WSbx4X`zSo6VuS9l*{+oaH+yebPaS(Pc;z>^_pA>snbS2ULbp5YRH517)MQ0U@ z+2FwTy=-X=I?n(~U2}B7Js8Cz|3>q^VUduWo{?YQp7^(+*d)jX^q1TZnekpZ| zyeTC$W<`w$pDpM*eC3Tj4BXU@JXpJVx?agrOh$}IXBFFAnZ?e=Lm#nXqWtE0H|IJX zZn4}%4W6e>Hx-u@a#30LXwMFTe4Z%j^li_Lok_(7y^d=t_db?6L~D_eUx1S^#k$}- zf4LD<*_ky?&wy)mSKh4KqR#B}m>3L?FPesS;o6vxHa2xlLcr=LXkXmex&F}@_ptJ)l)iILgn z7?e!F_d&9IHzc8z3DrkRQ=7cX} z_0TJd-hW->$b5Z*g$-GuzNZbAW0`&+oeAN?J46q(V89-}xfLrpNz4^=V;+03{ZT&; zo6aZvfsNAx>EKtGON}=U4F&>bV}Sm>Mr0o=w<;^f3X79|&P}lPmUu zo>256`d$>Ri1eIB9)F-z{D(WT+k}iWk#FVUpl(rf93LO@EwtK_g`iSD$ASsJqJKdU z45AD~2nuM3@}2qf?%VXPbI|08n~F$3>xfP-SDTAW7%^ze~hQtM3r*)(C4-e;njfO?LOuVNo~R+%G!C@Ih!6Q()H z4D=hT=T__iLt`^VD$&GG=YxD&vItz7CVpN`oL_?^b*p~RxykRiu9egBCe+SttWAbl zN{UftgolH=e{7_rXxTNpE|sTV!!6ZY`_OqDXZ(tFE|Q{KF=3p>L@HxVQI zdk0m)0a>Fln0^0@u2wj1?~jChohUB|iCLaW`9VpW?w8gCHko0T7J}4I#oy=7VIGW` zss*lT44KPZ%5g9_WAvFGe=t=1jRZ}t(?67OI9aB9D<(Zq`srlW*a?37(Uxss(bL7m zsb{FSnreYZqD0ZTmB$f_t^_e94~yLAR-#N*I_3E^qD-{Y7#bt8FjlEe~n>vDASx=x#_L+YmyvpNL9Ja>xENhf1q%l`H9JfV)G1=!R~ zQMzyS6#|WC{wX)I^7K4oYS7z>!i8+{mlUZp!lv*r&QG`zC6G}*p<-Ej@>wkCzJ~WV z|I!$y>M8%2Uvapx?sr!HDBqap@_JJBD=yCHc~I1xtH7(>nT?9+fd&05|q;9gYIzWRy;JxtYH-Nvl+$}3rI%vT8*(Aa+WOK*a5Yk8+{FF0K)G4Q`rTB}r{A|P zT4jN{nG)IBco(xwD{UHWHeH^L;Rrd^aTrqKxmsA#A3t84&J%&epA((`My4XUU!9AR zvc-lFUr#ET?|`y%007B2{r{xPm2>`CH)qw|NdQE$x3ItNjje<$DW6Rl9Aal(x7pOaU5o$km>o5zd>}xjQL{Y?TeL^Jn3Je zO}=2&XE*0O&^jBPw0{oRWaRsmhD?c>hTN9Y2y@Xtn|OJhfE;Xnq?BiW zEaOYK_q%b8>M;Zs{n`w)NA_{J6@nzD7)V10aG8{B1xTq;TA1kU@{J9 z+5<-RA3;x>kLjn>pfSTUvPQxC^Nm;kZ@fmO6W8aMf;2CPe=r4KV!?;6(pH|+_M7oP zb6q_=i6>srHb_Lg5F1xEPI-47-M#%)$nxW7J`;T0yOAg|Fr5jKkNfEn3609iAJyku z4RFLkl041+<+t57cJ%qC3d?p2_u^ardO^wve54Zf|4~-V#?pFFLh|Qr`r_sL*=V#%*I=6dhHZRbm2d^K4?+oYqMJ7> zjl6EWeHx5}xKqdn&efBzX@{hBaP}`c59tcX4`boXUvzrghqsZC(_SZ#BV3;4A%3Hf zzwQOqCh(KtzeB%oM}+^dd*UqVeE&}Qg~f4QCuj9D*c6}FC*WHG2p}RvIVRXT1%8Hy z{{`PZYg&dz%l@%B zo3)$A$78Q(rY&6@K^05HRgsjhf)1WTCwzUcB;uamloa*w{K^zj&CHA!UyJLfRl^*- zA{o!n_37m8&Oxh!h5>l>`yBZJ%&oOXo@+sQ(4SIEe;RPsKiy#pK>hTJ5b*LY8(Y&n z%s1uz@yfQRyG7V`@i0}Ogov=uux>d|tY`4YifBtjSJ;T;VIa~8DqMZfa-+J7_1IOM zM+Tv(qlph1XH8dUTiJ-1?5&IM3%E-Z_3@9V7x;mPB)8vAZ$tboVAq%I6{#vn<-q5! zwA)$nH?yMO_qE%nSBq!!tcbNmf7&l`aEHKfUTyAC(YO6Kchl-d0oDtypw@xcvNLh&;e&dk4q~oL*=10fL^FpSoOcvp>Ubk4RKN^8d}#u-!o4b`C*Z zD%OB>QbKEM*#x-QYT4E+N-5bM;{KvPC@Iyhv3(u$Pz0-g_O*udZ0KVtzdk%k8*6xv zQ(<(G=V!SofLarv7iFXuZ2J&(y7L)fXDxdRHy$#4@h8a4$8!0lnT3*D{WHdAie-Ew z=J7Lilc>)+*JPsd>xRB*Nn~byjo~hjVrp!0Kzw{%@EwzZ*cerR1_7JXJLQ4uCvhGLC`Gg z9(IgB&z*ceorlm#NFkuvBGF8ps1PZY4}PE)FpUi=;0b(m0S-41MZ5oO_%*l4)lo66 zMd8!e;^qm0#JHHhtPAZl>pNxLg%c?}KDUXwglq1(UMg3g_5_4d?B9PE^H71IJz21h zm+h5i|Lo)UQ`^cRu4ZCru}Wy`IQ0F1apJ}~c^Ap|x!fVmKu|aRqGz~v_FA(4PBp?X zbaFx6Kr|ahe668D=)fhH)t+J9nv?!EiiIAO-{M7(-~gAUzK~NjoQe~ttCMix7vUgb zqwm68>&rdjn|ScxjY#a2gV{a9F43r^qk%tt&R<%L4D==Wd`B8Yu1ib$#vbRzdANmr z5#W?MOh(@NKN6&3CHKumHO51+hvk*^oM?J*H`lBZ-ThxKw>En2 zuO5~yQ>%Vcw%tS^d+%G5js~%OTj$gwq$mITD<TUzfc>d^j8v5b-Sx-)*}_`cjVLhNF#zUIWdVBE zb<1<5+MCKf@Sv(zbejcH-{YE=AVG5=jZ%fsD>Ig#z^s2&=)OdebR>D+x7-;ed zb!fsX!5^yTlt%&9foN^luT zF3JJxtSyc*g;jJf;n)H7$=^_MOa-ni7oMnIhOw3ubE26bqa||$YyIkun)XvdBUAnI z_M}G9l7;E89>^v@BT^;D_;)Z9$Vo9$(Xru`vU=8MQO~t4t83$v^5Dp?w@~WBr}|Y7{OazO=`*M z2Qb~f;4H9;b+RJ33ld$*!2QAsB##F9H@zy~ZVKa+CF*1Yi{}U`cy>3vrQ1%IX#o3j z+)c0C$3{-TPR^hIwwFIM*)ym4eKH*RVM>1Z$cqV(^G}o|n3v9#gU%@tXgQZFrKwR= zEFRneiEczB7zhCK3f*i8fLMFf@gJJoUM+3gL(sokZskmly`;!|DH05RQ*SGHb6o-k ztAVLkr$Z3rQe-+XI0|bo|5NgR1>CSxtEDByEuc_piAG+n@d3$E^e@A&bu5sEU;)YE zSSNEq{LB9p{;#I-LbIXNri)J?JUph1``%1|#S+|>@t@%E%;TWnNzC$vx_b}G1}g9J zGXF<1q+$@IzNZr<9uuZ#a9P6vFE8mh9)hC(_dKL#y*qF?A|`7hRIli1e(pO*WX&p* zkF2Rczw5+B*B5Y^6qOa2_ZA{;YAmNqIZ`sHHTeMKWC5VNbismo&mb*Y%lxknIc_*H z$8)}5lmDlW&#Bh3zEbjsOi^vnJ0kgxiqZWUnqu0*V~vCKJ#q!HF5Ja}++{7w{k5$)5^+!JS>f2AIV9kEBztzDZ<2zXe$HgE z@)e(zs?B)AO>|62gfruCc5wv3vCq@H71-IhE42CQ44$w=ylc^PFM&D!7>PTjLs6{h zt{H9|*cSRWPaU^?r){EL>Cs0TG9&q{vfUOXh1+)Bhq8VsS6gz}Gw;>P^}SD!F-xDJ zov*+~an!1Vp+X7%XXyC^10-RNH}~fov%^v%+p^+pshxDw23hs#un@uw98=#|22q!I zM|ipro){|>f)70PI8jV{N^N}mNF-HZ2YtPK=3N{*qHTXa&{m&Cff~MC3C{#U3^ATL zk>H1a*)m`Xxf9l^Xp(4y-sU_kEO*3aqpoma31*T>L1EoYU_|a{)nl^_wntB`vJ3)UmS}uAAoOR5#I*|8-l%$o=DKaU!Uey&r;pgjgv+8*D?Vtk6y1->0M8!H{|o5`E^d%D_UHSMI+o@yl- zRL;ONv2**W!_%-l-Dq>4eQ7BU3DMO}(59oNrn9;e85PeWTF_OetjM7hrj>X6Ft!O5 zSRSV0^M=1{y5hS5Kd}OQ9P8Zv2Y%JWmZn-{x9>KJX%?ZIllaP644DQ>s;a^pd0!f z$(PR~UP4jr30BsWs!ipHm0n`hZ_GUhJwmZJ!)1=N&b?1@-@V^I;x?+C;1=J16 zLI53fi=@txFW5;KfH;zy@6?>Yx8BD*3^S8uf2LQ+QQ`me@mJ70{wc3K8*})7TJ-Al zFG3Oi1pXU$CnB};8RCZi7kGVtkKur|aho04(tt6J_OD!PBLAWCe@Z2L-0GYK^6{`U zU(}xR+JR$|>)t1D(SL|NId*U@B0CN7mD(CS?hr5aukmf1|B2u7C!`n+pPj|gZ!(z}Ya_(~aO9t_8 z*Q$`KfhQpDFQ;n*uAF@186_ll>5vbYhq;954tW8n;r0F#?D2nYH5gbN$_HdCrtq*g z1RY0P852gu#B~EuxSrlb)^%k6j4*UW3U&fz83S3Ujdo%PdWxRy9vA^ol*^8pawk}R zUd6Ui&b@NT9nxPK7PT0D(xu@SiKr0EH;R!N<=2) zU|iXN^xjPBbpE(0H%wK zNvlMncN+n8M71;{v))^?6l=?xy?1{Vp$Mlg)xp-aBg~%b0Ov*7$BCxP4A__OZy6~F z0IU;B7+$BAaX_kX)fOCBJECJO4-|evE{t~zXnYiw&~H5265FeHGdg5KV4sv47WxQ6EJ7;xZdjQ zn}>kiXR=Hgx*U)w2mLoNoyAadjxP1`E`w=_G$q=4LX4Tzhd|cIYxh^>CWiXmZkfw% ziM3HNfN4#IB{+R>wj~8qbX_DIU?6yk2-D?Wl0O8=A-5{E4hCigRat_yWjPYH+{J1R zTlrpZo+R61n|Kr#4;PebJ@ z`%@eQE-;>rm=+N|L3>)72N(q|*w6k&pO>GY!P@%IMw%ET)hHakC{lv@eS+3SMda8T zG{0M=AsElIdKI2^k7)XiMfPt=f+Sz&BEv3qei?@P{-c%XVg!ShI3{X^u0;{2O&B2C zgsa6lRSCy{o7$e)M)^e8Hg{|>wq;AZHYm#|yb@&Q$77b{ixcC;})?$@MJGOvYvAh1%pHQEq`61qxjFzqy~pAn(T zR$M`f&-$)c53{q@=4T+o%@uu;k%oSgYRX}EsgRybMCx*C0xZC}Hg#?ehg|S+O~ho> z2IfBqykUJZvO58}OWjrTbgJwV%|pH`nlG#X!RalX@@8Y3+)WAVU^10LQ@Vn9#Tg*r zOS<6G?PZ_IJ@p&rN2W1t7?D}lht|uvbOJwXl#PIFTx!XSu8s1&G>g zrExIP6%5Mzkng)AKw%G7^1v;50^k@fH2cUFOYYEyS?*Gmr8yzJFf2MTFfg4)Z3i`B zr7s@M^Eq^!(4t^BU)=?I)yEEp$l4}hHZ=8slLH4Qq_gi-@4=5-|F?OU15QIzP+N8& z2ssbvetTrg7nZ|P@;aD&_yuu)p1G2Hc?G%gGAd&s)slglnn|x%SxMC*?BFsKv5}?S zSLHQQUsbU7tZYXMq+q<27fzp|+d!w!-u15lpSIw)dE%IfM(={;xQsY(I92)WjO#0U zd)@S{NXhRs-f2J-LIPfe69U*X>hEI1Da=Hu6&2)8RtZP>!7C7#_c=>uC1M6BF#%nM z)$l1wDLJQ7+v%xm4m^oe*lp?*m`!;J#}TMX5rxq#BZu_UdUL~K9S#zx?v%Fj#$`z( zyrLUIwge(eWb+!RuQ?XYEuQM0#u?QUn|JxaqiCDC0}8`(k0QuLN9+zpS$NMmUuw!} zVjT~ML=RKmLE-r*UDYf+e8iwH96y7{738b3CgP`xq3DR}+LJiFr&;neM3h2{>K*k! z6dNVuDogiwJDc<|FUT~lbq%X2(2%D~bFKao>Fan}UD2-DZUTmFL{dwCkVakFG_Uwi ztMw1xP?m6T^N_4lX+>!+URr(Unpl|pW!JnNWDoR)nKO9pB~=rSN^QLaAADcy5@`OW z@xoU{b=ML;NH7vGb5jlj!L4d5Aq&O0F zMmPTd#`A}d%U@s0QWi5P8ZS%LsAdG;>d1w=E5M#M55LgG0R3-()6ze`DBJ;eC&C0S z+yAYQkU-JM-4n_pzu-$)U*ct+P`_73Zf9L3Ki4<<)o`(x4BCvma#k&Xex{u(ZyJ)q z)tQrwv#4={W6uG1;}vdICR#8L zpiXl^VDXe!%FGW&9GCH#Z?gG)R)n|XjjE_>M{a}g!fFjl4Hf!1nK6eK5;Yx404~$8 z^ZtD|!d>}?Z>tXw?X5->KD-fG7zlPOBxHlQ8u`VD=p&GC57htwb^F!PU8=`4DAmv) zv8lQ?S`1JRHB~4b5dQCh-}?yps+Xe~WGk`Fpiw*vq$KTscf1pESYIx7@6f$z_a>)r zo@HZbHc^J)tJU_PF@U3omv&oZK3`;6kbN&QrX@Y2R>EHN{_4{kx}zSQ^eAn-4PC;3r@341M&9 z#qUJQt26gN(~yvo6RiFInM~T4`b~_$vpopA2SNL02z}gHF6mEI)=!%8IJ^w&OpTV( zgow)h+pq3S%yg;K;0k_m8hEobG+wS(bT@KX9+GnThEGPVi3AjAK(HR)9~pbZ=@!tb zob;=R6n}ahxB_OvDYeeBF{H z&A=P8OJcq(Ma1k7k)_wKQ6x9+N4BfmFlR;IF>L9 zkC#V?5uK}crE8`f8WWGK@to%DnsFB2iza*3KOP&*t0~L|4Ui!Tw;N_>9!g-kPYs(A zVkDH0?qR2V6O;m<;c4?S_Nr;#la1PoD&5E@e@t^>tT@X)@b%%;Tm z{3O8k-1U$XNG(KJl?)4c)d)<45CDdA8AFd`zVp7#3FKbaA`_>%*ntq_jOT&|FTZ;x zW1fw&u%=9H+)wTZvOyX`3Y0{=t_##pK$Or-LawBRRUN^UliG(NAYB_ZZ{NEF0`dCG z>S@THOtCcv6qEM-^cZPLQ<@O<36|xfVZ{Q&+LIfN=31~5bo!N3==pb1jk;%gH6&io zzAs)gh_4V%aruFv`OL*+&B!#ObAVuGNnA0Y$;8zD!D4$6vV*%%wXe`CCO6n0dQ8TqGzS(SjMLF0EhN<<@; zhFUOU>^3aCG*G0nDVL;+ZWj0vqU*SF;#IB4B!6hz<6Q1nqX5?mNKDLo z`5#?(J9rOBGGVjxqGd5K1hga(y4`WlJh2V^p8KUk(BG;t~mn9HRMM8%{|RBO2U+x z8ZI=4dS&rv(##XxJgTHitZ4l2w!CJeQ>7M3Rg7jS!y-F+eK*9Er3`xM< z^}}=C4roTy#5X;1058j3VoVnIN+h7K?2ET&3s-H2`ct0x8l&axAw6RruqXQCe=yf7 zGNq>e)o6y!F}yaNMvr_XyD@yCX8aVG&sdn3KlT2vNZ$m{KAtZoOB7Tv5RIM|Cqpl_yh!&)q>^Z2jk^e7 zSVWSCuhqA7FIm)&Az}IUhR)WrNR6Rm^6uTk_Iowoui@>mt=1k(%fOW$1xljBLh z#N&L;FWAX0PmrZy?o#qaA34x?d^54OE(-M6k3j*;@9i>hFHdL5KVOQdv4lezLkx0p z8;Hz?8@%H$!_-Ax4M$*^+rS1fq9Qy=YAFGq$VhDi4G~I}@|ZWZ=+- zGxHMmxEzI!EiPXB!D7f0tJwvD#7AUu9fr_%P*HgApHaw0IrQ~>!GR>7PO}Dz7qkcn za8PxARg9ViF^^tFvqihKl1zlLp*iuP$cm-3n&YElla^Tpn_pOf5x2ae6Y3VXQA1TO z>@zQt2vxK7BBs-`c(I9wM$qJi2gGK?G>ete_p2zq0lXBl)!+L}nQ{j3T_}dOF1Cyc zqe?~AX?PFTQ#(p1+#fxlM!pvgbEfjHRkj}F6c=lDQRpr2W9X+0H%0w69*WYTkyH9@ zYLFdkDy&uUyJqRP$OkGhMv9$~x_Br3B`1raB&7j57q3nJu0$e$a9D@>(P#mTJa6Ji zy+g%4&Nr_D1=(ClfhjQtfKj8N{H9;!sRZ{gN}7W(IS}KbPdf@E!Xl}Tkd-x?toYs3 z%a~dByDb~-2=h@ovr&wcEYyOYJb{NxCd&OcYKzCB z4St`&Z25E9*xA2D6WowcJ6-^Dp&a1$5=73n&G1@B`Bc&b;vw$pwAEGL?{lAhTqaOK z<2R)GA7biKf|BMMHy+R&-jp!!YyzQR3(j`~<$}U83yL0X{pyS3kzO@aN5IUD1;2EZ zn!p`r3<$x#9vL>356o6+OhSJM?7o0bDSwi&ZUPqLZe3*R9MD1e1)kF=IZ-l74jLUHgy7~MJ}8@)B_1X7N;AkX06BvYMXv1#u3n-~KP$vJXbR>122h|;OF>(S;%JD!SNOsqY zCa(WuX5>7tvNDy%z&U|GZ$OS|Glr4BSbG6T-b;Mnn{;hCJq8$S{mfWBj@ol^*d-|> z`hNAA$J{XryJXKeWPSPwTB;Q6`yWb_KXVv}DTB8YijuO?YZI5hA*6rYHZmwADzF}v zM~~Ki#q!o1;3`(7!DO0Z&xO-mN+_eJE`G!%j;Llm;WH|FB-&sJABxH5Hp}E5O`mNAk-bClp}ZAaHLvoRaUk+jQ$-?@t^H z$Mv_d{XpU#Fz1HV$eM{*zYG%d=e&v*vUvRHp`Q9lPO_Xx_>o+P%9cKfc4@^qmt{G! zSgqdu0|U2zRc3oCH!>V?bZ13m8ZWm&6$RWc%is~d9c_sjB9BG~K2o|3r-;;RE|)$* zj?Kyr$|c*{r^O(_jie*h`8h{Nb=MF};eZwA1dd>#!o#l=BL>Wdu3rfw!>USG;6xRU zXqGEJq`OHZuh#dO<=Bt)qr_9q)CCki!q`Q%7-Bx6Wt@A@ijy_eAOA(?tlj)&xd|uA(qtEmbTYpR< z`c+j_Guqas%B(g^!gQ77O33AhZru+Fj7HM(!{71&6LX2eU`();A_3 zh5ujKZ!lad9e_s=*y?eM|6YVVTw%iM4Kj)f;m}3?w+ddb%2lRUwkNMf0!}_2b{~&` zRqApq)Rf|QsAl}_o7{FiPe*sN{ z+5S;uvM|JfwE~rPKFCRYw7PHcR6SfrH=sZxmq7qNAPM{Q9DuOo|9LSEI{dsopd;l+ z^)(5z(HNVUB`)<{lz5tq_+txwfH4d|>5)OC+=o27~m5uyIfBfkgOHJ^J)TFdcw zahJcBJJc)H8~Q3xR_z-@FDtW^p4AwY&lhelFT$6SDWaMGZ8nvwVX|Qefs?0|-1QYn zB7DTo@TlN2qEB?EWhmNw;~^Pjh}BVnGsj)ZrCR@j7ztP5PMV_ei4-gmo?Z0meq95l zyzI-j1lwi}NHz(YyQK_Ird0Az$ys`%&%_#>Y9{(A$hP<=9GfLyz8GKMBYd&rr!AAT zet_$@GCmK?aLuH2qR{JcweV7B9G;XNDiEpN=0utoKYgZ*RD#7qTv|RRSQ#6?cQ9yk zsGf@itkQM$&MPFv#A<)_8jp|T2Al=4SgOV>-)ESktxI;|^1$quTB`@TMc`CZC|9ig z*iKXxzA_wW%w?Rf9f5x?uq(DNdLtB5)PWCWN`}R)c`S_5TkyFJT{Ro>DG>;3AU(Py z815u6QDwh4Q#s4ws;VK<C!1L7(%zyg^%GEViRcQL)Q8PQdqighb(@O2t@sfB6#?{;f>1uwGT`L8^q~#xC zVwJktc9r3T4=3xV+N74gRGgdizv%(WdrLl7&~4$S?U1pi605eJX_xGx-A4Q4%7eDB z&7gyQF-o!Eg9V1VQ!Ov2X0A1k#!8K!&1)%LF+}gkGjSfnhiHnspo$Qziyer_oV&iq z?Mq<5RD~I=GY)z1EsC-|iIus5vA(C=R)nmuNW-1@m(xXdZm87tHbZ9FGDvWXGTAOK z)PGl-!yS>vozoP9fs2$mgAUraHVh|mimygM=PS1q{GD2iNE|(rv z+UJKDV~l1iO~|Igi0m^-XoFX!u!-1|0vJy39SWm8ew)d&uA!0*BI(+$s`|N;(0HqF zvSy{=%WVCW2tPWkVbD;cv?qV;}2y(VZoafl9=k>+)t8k;3HtJmpt*p`@MWYiq zfF5;V$Q?sr-!IgC2%z{t94CXH%WoNF!*G$yJ#@EMJFk>HK@O^;SKMXIEyOYV6iOGK z<`vyd<*5m?h znAyB>|H%vd^-M(-4fI61*Hp*ytt zMCCnoJd4uwN!eQ*EPU%RIsMO+@|%c%48y}wqA1jpJ`xg84Pwetvb7R>Ghn4y+q#J$_;pl17_*7}%S(X-+-WbWkDbV^`h%(d4 zJ4MM{0ISl#8vBW>HJ)N&_>+y#*hj8x? zd_xH_U!Mg>IGXc78R`wXUb68wAoxx@Y+qpf+-{*`z7R@UErXIvL#9rhtZdRyb7?cZ zp}li3clk<;3p?U?Fx7!L+WObv7YA=>m%Q%k_re&lUBx9VT$i#5kR4tuuxva-^wp8_ zFr|e|e-Sr%&Gn3xcQH&v2H7+ea4|KbN$J1TEl`3f?!y~+gLoB>Ugou=@{qXd?_^E6 zf67q)VwY`W>~zniW!lkZ+sp9Hd$Ge9t15MH4>%qQ*jF!KI)25V<5mutB;XwSuu(W; zH?2Z}?HZM4W4I6Vmfp^5F)N9DBuXc?W4rqqo=#{%PupU_H~SluYG=WeP&1b;%5|8@ zh~guEhu8q0h=MtJgGkiZGW9)~ew!u2C#|fO#C=b>nw_H^u9gOsX=puD-!%8EmGo*t z)Rr7eEzFg5tI-9#0!z(D*Cv z9~sfLyR~H!uz&mw3#N;$FC>t~UZtZ9Q&1K?Vz>=5iRGd5%WoTZY>!wcZs7=8{z{6G z`E!(M_POYjK;z=*c~E&*|1MPl@8%J0;~y741?Gxs8R1a&p({pY$z$o*I571jmiwZ} zhjKe4++1cKRZ4hiXrkw)9q>ZOVV8fNqMYJvJF9P#!)|#iH3=6!d+Eo7np+rb*>ED) zQNGr=VmWh;MxvG;!n=G$8eVcQpDv4{xm5b*Skdd&fF9-|rztN~Ss*P|J5>dzv*s?8 z->dG#FE@;dKE%L9HEm-b7cZb^*nP>>uN{7G{jiS2j97SsQpdxIvVyQtbG4ks5 zo7zbQ-C3je_yo=}!X^>omE8RU*a z6~!Lw(+a9Y#`q~*L*rf#$t=Lg-XJO3arrCb0r~ zf{J@-B($YicB>WxlSITa(T?n%j;O52X}yAM%DCbUw5tQsmut*lsP-K1EcG>OtGF=8 z6EoEFi#rI!RP&1)_10S9)aV_Usv|}6Vd|R9--$qRw{(l@flNM07}K{;O}P*Wd3o(d zmQ!g#tDdetmFzuzv`;B~T(&?y`*vGUiITZpc_x&Cay5mC9B``g$^6~mT;-HlK&5sx zy=(lZg{$8RQ^X8tSids9aG4K7{hnhnWY9i@*3-8w6B4x>YYb~{RZ<{MNN_2h$QOpD zSnn!p&syt9Rbrzh2|<4S7&Z@`OE!Ffbv{n)uwTW3_)|y54-Ji|pqb@!TAs8q`*2t8 zhkZQ*`p=IHSJab|m7!5zGO-FpFB#}~CQVET(HmlM76>r>D*3eO74bWyygtJ-0#a9T zl`KLl-K@*d7mc`f?5rf1IOx5lhkm25Io!4Vrh{}*#{rmmjBS^8QsNVzLfFZ8t489U ztlh}EYDN;bpkOks6W^bO%&|v~Ba_pqOEKug)KoG4G-cNO#K|m8f`KT4PXEp^G+;-- zI-YkUU)(1t+!5Nl=nO^ztTF8~f+48M!as<%kr+tfv2U(=_&Sm%5VnXBOfT-v9J+Zd zOjGLOcy_)u6mq4D9^Q#f%fA9cW?iH&%N@qZBEXr{4TBf%hRbdc&DcMEg=F>Rde#f3 zf4KXEBE>?)qT32>b)2caKaO61h3QvE90AMjcf^RG^i!uFB$>4WXK&d=$Sa zuaP)p?ILptY}BUI?S}jwZRCl4DWL!)D(-KlX;T??@XeWQ@IgG`E>UCi3+}HW8!6$Y zbh|BjKPkC)j{E@q$KqI=4e$L21K7~Q@61oy?p0m9^tg+Xo>d)@*qr;WNkZ&){D<&h zB|oT|5BO>Z0kl=3q%6BIXv6O*F0l5(n)#UJG-%`n-VpY;DLZUF5h#v_*hZ(c;5xS? zOqVq-v`lkaeS+W8$77R^8Oj)Y_7!hF$#-1)A-&rq*`#;2G#@3ZXRMBq@5h8atlc#& zKXkzx^eTa!4buGaHt%O|eiSD4*We&V#CB3Za#5o-9^+MQn$1k;XQ=+LyNp#I7Xn!~ z)D3#H^k4<^pEc?`hxN9Cm-<3nJb~#-)gI-@B#G~p7=y=f(%&nrD;C{;d`Pc84(AJbHmH&~=<+-ph}M!&xBX!<+rlS6>qp0I%DbRpL^W! zF%@d@-$6cC z@S_IF(qpI9RL1V7LrvL}+x6}XuV2^WM^`d7VRaM88_bzY(fK2c{QTU>0$<(t$L&3H z)XMEc>$DS9(DSa#)Z+extWBy@$C8vSw=|wKe#Y_o#Vz>quLwhzB(axpNK!mCOIEpQ z9&uDR^z=4q)r1MtJD7 zCr*|+3UKP567g15Y2+H|6-Shr*NCWNT5AY-q|f9S(%sRT{ltA~iw3umm8STacpr%9 zGr#9)&&7lk6>hC?bW-Awz}}nBq3_rsb##A z-lx*!!%7#vBOi32p`l0W`(NDL?$ijGm7mHqli?W`O8YK4y~08CL=(kyA1y1- zeaQB7Y18=_VW)`aM0;<=xwcAjEQ_wrx~3q4!;WflL@Ag7n@w_=wG_D06TE$ry0?1@ zC*8VvQ|IVxHcw%jn3?mZZjp+vHtNUPMQ8}Uz}9)~iOtmEpv~trw$(`e+qZQ5FD$1H z_yz|lzvb*a43l7bN?|)i$A(|%@Hb3|-=;mG)}>;Q_#3(}mWL*jf>+~=X-zKSmE)MB zXh8)39{@!_y1!z>YByX){J$kM6;)GhQW085yFY`6fJ1cK)CKqT;%lU1n(LqU0M0D= z=&}Pex?J9V#DonW&UbaE&#WZ$nK#1UMx3N*9Pv0??7UpkQN}NRB)e<;hBv`Aew)?2 z&gG8b(tu_(t-5r|lCM>=qvb`jzLo>>#}~7x_;$d^iWVl^xy4hucli)U?b}|}Z{Nlj zTN~X?RZ3Y05Z4Z`VidTTO4g9?zyxoR#!%WIc3>AZkV6JCBnlarR~G4-v2_lhT5@^8 zPZQ474nai>`FGCMQZv^$Su2{haWZ&${qD%3^UVp)t`0Nen?iZ@mR$sw^=15A zt<^v@E}CUld;sC1S*Ae0Ewxd-LX@=C7d{k2h7I&^bc`4mN-kb1shUzv(Z`X7DwYYl zM`e55Owc9lV2|`q6Z|t(ok$t$RoiZGv?!aqoBilN za{fcEc&f5}JEwa=P2znBP?IXXZt)Hw&^{}0v27lZk0K>)5D!^9QA7F|nbH484fdNf zLi@4w8Zj#R#V)Eu?j_nam{h4!ExS0fkKz^n)E8Q7i%b&T?H~wYbQzs$zX{C0A{Y zyMOrlLS-vtMh$(w&{c+e$rPYkT<9vpKrAiGKo?mpI!~bfu#s4msaBvd1FOBzRfZ}$ zsvLB%?*glZTx8G@7rM$&O>2q0T<9u8`vfX=V*I9|wW_T#SR^sSwX40D3yg}51Q^!r zqjsmnrnYe?U+)r$V#mHfV(q&t+$PxZlmvOeUw|o0@IMJ-m1xTD!Q>EaZ)LGeF0zZV zC@ag}L$0${R7=++;fQtIFk^ynJUqz$XoqsJ|N3d^gH$QpSzdpl?AtzSI-sa53y10g zz#0R`#Qi|jAU87QH2J?O7OQf!knrO4+T*x(wA3CCNgsiK&8RopYFeY~>Fpzv=&)8| zWcC{Q$J;sU1CkS?TWf%17lQ6 z=x)ieyQ$;drbQd?8xaz*ZV>1?wFogRO#Dk{G$3iBsiv6?M5PkF7sOkGw^Ai622*Hz zQ_2CY+039v91GKb5xf(!T$6bKyB6zEW}wAxMt60~>0^;v4{qz)4OUmvNWU7L8J3iZ zs#{I1WtfWX$rnIk=mF0NmLyJQB5p=;TKR&}nhaYICFQE>bx3<(s*AdO9>L1SYt=fx z*1~d;Sg)ciGAlWfyNQ3HW0w4oS8hK?{()7sYhE4V3=)I~8~6K^HE-Ii-E zrD3$~%Zi*?YrBn8(6U576QVQMNBCM|qWX0y+ERwVV$`*7o|dguL8=$gg{2GSPv{u1 zMx-E3#K9;d7Zj2sY+sX5DAz?)P>>tcUDmucC8c;!Gh$(@bAPpJT^bBXx~428L=_q3 zP!cHDYb7sa6EVUs3uZ{Ek}-Fik^f{+I9>A$*-6uDM3zc z4_^$eC2iaj_7$bJbArU?EfSqm2U35^UqC|JcLTvM6<_?$NKd6RLU+=H(B|CaP=TNh z48*0=w3AJ5$;>&S)1tLy5BQbf)H21H*RX>rm7r3SO;DS=tSO|&s`1FUu11C@`X>Sz zil$-$%`6+$Jy^n3X^Tg+iNA?ZK$tcd+L;i^`S*Ax45 z;_8#+Qcg6XHDlLD32N@>fala8d+oO6M3UP2V>*G5i^jITPADYmPP!4b-LQ7-dVz^d zAQ;R77mq0X+v#$Dm4CP|sI;s$lyOVj(Atkl6}uQ~%3r0G)BDY@;SjZOei=e7YPDvQ zT0byQw?Js%nj#`dOzJ64W95tV(VozewJ|9>RoY`*by_g)DU|Dhf z0PmX+P|@`z);1lJmPc8l^nF*)!*(J*HKN9yVfZ)UZzCwWK>SO`!Qg468@vSN8Y^1J z6iH>aXB!8lEh45|id#!@GRNwWMPbo%p;K1cNs~yyAnO63EPUBA z#t8lDfiYz0n<%^eO6<{vcx9LY5cWX`y04HPI$kF1DH7y}L#Ii!c_ndaNs978UetBx zrqNhJZCWFxLn1lf4AnhY%8%-2X96=>ZB`Hn|e&mp0e3Z=kRJ|MRjVQ zra#p)iK~^7vCuZIQ!uF7z6r5GACty6EC;k7nPD^4PDy7A!Xb+=4Z4?tAEwlc3zTlp zY?{m@(J?AI8aBK^zi3^g%ZRd^xH;tV0oz#NGol{4_8QyYo|`4HWj8kFS8M-jtidGP z*_5VpSlJD|a|(3OF_fw8h<)4H(pvjY?3mJ2B(%ZkvTb}H7eTn^pfv(5CmMv>nEYE1 zAE#MNIZ247BerG$s)!2&T_4O36NG}g7_soQs9Uu->}_g0g|Z=GXzl1tBo(yXJ)aZy zlclU=+x@Og+Ju`u#G%%bJ%xYQsy%D;S4`bXAq%{}6|?5~9=sc3YUc2v(oG_C@T7;j zlrkPeICt6!9#mnj=~WG|)0Q4|D%>1s!mS%Cy)1$GMZ*JXpNFpdry0=`u4c@(rc~2R zjP2!+#X=5G6ZZ#2StV*4YUM)>Hd`6J3plo{jDV%$acYOjDPVdE_FbvjIbURaR{*@| zpECI-$Q;QvTTw_4aUM$n(KkT^plwJ zmlPv9xS-IH@wQ|ZN$@vzSRLkm0wtcZB6_@+Q^lV6s;N4<8{Gnh-fBxRL5)? zM9hj{mqwJnpYSw15yMl0W{Yx);mpeI&5S5@hA?J_kuKp$e_h9ML{z?iF15BwDb%9M zDJA&V_!i}+ooJtiy7BlAS!$j4b#D_STdkRPb!vib?lTHCrd-?fR@BPf;2TAj8h4mPT~8{r>V^av=;ALGpfHpOY3&%gU zUZ-8Li5G=!YzB5eVi|`VBdoERVtf-tOrjMC`8+z3CxTQ93^b{VUJU3tc+9mP3_H zknZt={u8|esyZS7SKTq30SDGGvfAC1F$Ez)_XSzG0wrjeOhm27i2=)a0+PtI%*@Tl>NY&waRwe6jdF`Q~Q?v+E)8( zogguy-x`}FVHGiB-#`$iIFgM0C4@ahoQaLB?2r?pE<=mTcD_Z4F z@zu&ko<@)CTV&B9X4M-=coz{VrkSrtOd4Y1;WCzE78(bY#$2kMnmcctVzX#W_@``} z>a;*eU5{hoGA6M8$Oy!texr`kPcF2gF!uW(^0}@55xs`oL zm3G*oxs>oh#hsPwfU8rt5 z$l3F%Wr8f%(i5NS&TlX39agI@YLU!G93i!JT9ja|QleIs(nLj-;sHW*Vd&v$in5z> zL+jT>Pq~`$+Tz&aZ-CT(!y4b8B=*<%p;v^IBghbKj`qg1ks~8;-oHj?KDPcrjDVO_ z?eH{VcLXGz5z9}giQ$DOdblSj+D???+a%#l*!~6@Sga}NgL+={&F#q6_|Jh(Op(0; zpk?PSCn#!mykVQ}C-wB3C`-{q#&QFHx(Sig0*zKoajtPobP})-vbNu+Y^>937SjGT zZMQ8i z+Ohj~nX4o+HJvdVB$ac_Fyl$<$YB%^wT#(@;q8?An$+bt1Az>fa35nsl(`EH;A@0B zi8i-sm7DKwZX|ijnN{x6@>pQjkmASA;S4C03l)O*JK8n%o8QTeHS=|X<0m?~=X0>Z z+p#dJqPBiIcwOaA91ppK3`nJDdeId8BmiPR&($wcLchcs`epiFHanSx(cfG`HL&g0Hp+15f)trKV2Ym9T# zbO5KB5~RoeBj5LI(;NHf>Hlx<+neLMjXnR@rxago|xxF~ZuM z1?|wV_ud_G1=w^^B(xjE618?{bSyfpQ)4&~#X7Bv9hQ+LVqgEzbcS>Wt&^v^@XN~T_ZWDq6%((=8#gLSgGqQ5GSoW zc%g-jDN`Gt;sJzl|2%<|O2jl3VD@|2^<<$BO(8`bVCo>Gl*W5>;S{5Kf<_`)Z0x$Njb~iz91Z>{m)%4lTiWScixS zclmhh0`C3Y1`BB`#JsxOQ!Bt&3W=K`!81uG3D?)GD>EvOq~vX=N=+*J?OQd6nr*Z^ zv+8g5x;oDJ_Mut2!N>|f3BJ~j9VvB}F5G|YjKJECZORODWPP;99gI%4zYDib@Fs7+l6LvFjryd5OJ zIg`A4Yzx@^cE&1bWXrYAEn4d_mmm<~dsko=GrNn4mg{D=QW`!YuQQhN5X^A3saH_& zZL5hS*=l8cz-M_;cYe$yMNSI+c@dgYn#vEgsI1-nb#Fr2_gV!5(ng;FFSNXqK;3@q z440u^7MjC_jD;1cD*{JOl)ZVcs=d6=uiF~*`cje5ws!dNHtjp~|BQH7g zcHxSJbve-`YHR0dxx?33>h&2)Pxig%*@L|mPzC>!y+)Yg5;gIKX>%Ep)imSFuA>7x&GejX!1)O3)vRJh{>AlQO-ZE|3LS%*@r?jHj$^7@y)Roi$^}xfCa0#0lyw zC*WSyLsjy2f}V~wV@43MEG7+Z;n`R*O`h_JBVzXeKPz&QGcz}evogh;Svf^d+l}2U z#3GL3za7%7v$E078-2}5xSH*9?)oSjLuC4;i;DoE2Czc6S$R zLjT@T3Ip3gG#qk6XgF2sM#-3+O-Ll>=P^ZA*Axj1>zV{9h$U$P??kMV)|TtGFIt>3 zw_!}QQQ!d_i;V7^^)V;EPstrX??wm8a z0n{j$9Xz!Wf55s{esQxc{Gyb4ZBe>fb=?16N;X>N?7Hiw2qOkmfaMg+a)52{6un0D zL5J5kyHQr@W%u;ETjaMM+9P(qwTm#GE0AW;16AuLbaQEowkGH2G3z1JL-8`SB~PZ} zIX5;g5{{l2B-y73BdoPCFRH}E9I_FgwRwaR9?BeRGH6GivgV!Vbzz82Yp_3d|;{=WM%0WLDiW>m#DUShpJfDYj&F64WUG?)*)Zk}$xk#_!Abi=yx^FwwEC{LYLXvG zQtSo2Hv>$!Q_9Bbg#dRgvbhxT;ASwpfr5kZ)!40A@uXAqld0?NOOTP|M$(1yAqQKI?3SbE36uF zMiu^?r-E&0_}IGVRdU}pyix>xVt_N;M&z7Lv6O~+aPOn4JF1bxZa`}V-{=0cK05IYs0-n){dPBVnv-%r?FzlwHH!URp~vAOge&aUHoBX zQTmSwE+gjJe%eye<2dijY;C{*Z6Hv$9L_}s(g+DVqvm03?D}?-vK;dEDBv`pND{op zc%;-?N5%$y`(=Fqhit{OdSXn;n2o;tDrg6_W+uG52*z_weg-DbZk>vqUrP0kRPjdA43emE;3V`;r~+% zu2Q{V-cdVNugJ@rI9)jjObc1-Ic1mM7%k`VSrHUx5CtyAo|i`_Ww z$ymz7FN>rscd~@BkWv{-88tCjJ){X>iov;)dW1HW6mX!LUrn{)Z3@YOnj-!QiE+q8 zyPa|@3p{q{+@b|ec&%0%gyE3+Y>iJq3}1xD<&mD+oFK6bgw?`}(kLbSTw%Lork1pn06y1HKIWlr4=uf07f%^yb2(}85*vmncR-RHyjZjft;uKGasaG%fiLBrQAm>B|j{O&Q-87#}pHcdqCD<*zzrNmsCqaJis@w_KG%azEp-9 z^wM=lTcyA~>5_%6m?+>>``mO`4IOn9Q>`;^4Go8uVsKC{ZGRw(sEZM`d>wkT#zhQu z?xM%R>67)YO$RZwK5n+g-J+ngaCMrIvE&BhFsIJB&Uil#i0ho_!pgRFAwSs2F`wqT z&^l$0UQfAjow2eWPle)A#~HJUvr37akfy(pfyl6PEf(p^1}D-Xvo;p7B<39u6Hm1X zX&=)=+B0+~)WbE{l+E3B#oF-lsSzn}AO+*hA&NFNUADO$uO!2%bEb@KYD2G`Y7$M% zEOpEo#kiHWDd!gB?Zz3-+C5n=A={-?1KpIRB}S@FZV|ghg@+$0a_Wv&n`CsIw(>(^ zu0FBb=L8G&AiIl|x+0;UatEXlTv%c_dFoyjE>V!vZC>F*j1^Pvv9PJj+Iu=+I}JIj z+|3F?fUTmKWV#_|w~Tuxu<_qJ-cXXNbKJH@7Mqv}U21hUoA_%_5_d;%sd9RFvqtz+hADQ%#PfThl@dGeZFI#h&E7Z$l2y zsybNFM3}-8kueH~k}~s7o{J}%o}9sA=6Y(zr&^*gb3d~vaq7M?AG+eI8oN^7Buw3o zQR(>yjVtvzHW5nbcUZI~CSuwYV>N-q+Z1;-UF}nBmUvir9C8}x(;S*5T@14-bR5U3 zp~Y^~4y{z-scQIQa8`xlkcb(htuj1FoSd9PPx|54>t&rnhOzJHO}4n;dUQD6++c2Vcbr93!e0WV*_$cN!bxk+qnSeEi9)+OX5}8<=xXo}1 zSk$cArPf%{a)x!TaXM?&ZbK5>t)6j2C?imoS|M154!4r@klVLP(nA|cNG!Poh>@_G zfbmhT=%S)DNZLdX`2L8Tf|k#8Lr^hjkEd#O#lYq@UtwBfO$#)t=r_Cr#GG`P1Wh=| zV7)%Mp8>)?n@z4Aih+XRf~kewp6W}p@DAC?VRwkZL*V|$9QU(K@-_uSpSloSLu2_e zyzL+_74fN@(Q^=62Dwt`QH2g%sLG!#)~6@ys(5d@wKU4^<6NB8Q=EU)V{7%M zY)=yxbQB)04LX@juCsdg-mYOp2v=Q6DG|F8c+*cTSbp2o4kF{Jv%ZXn2Sa?kp1Km` z;g!&-Zne3qg+@8w=!F1XPMiknWyCpe7R{ZbAD(hTJoD$weSKjfS2J~=VY)pzD|*7F z17u-;9NYtKV(p~Q^OQN?!vpxA5o*Qy6E5 zim{D>L7cJYXZb!yU$eN}YpnO_KXWFQ~i z|61+YQwN-d35_sAOGHBkEA`av<2=95HKg8CgF6iB$DO)w*S~3)Cpj-m z`PIqtX_hjwVeri!>Hr;5oKkc>et=I#6;L7Y_t9u)Is)O=O#hWU&nHV+o5c zU-OWybqy4UMaKcD)ClU9<`TfkG2DO~#W;eyET#!`5ZQ{9?>1`Vy{C`v-TUjG?-rY% zzFYsWSS|nWVsrlZuYY>{`FD?hKl}9F6FQZQO+(_J(j*I(N^nMj^Te>VB>gq7l-qxt z(J3YA;)G`@t*%NbeUU-AYypmIak*;3kt}8Y4VAtuUM{lWK@hgsu>OJS2>T(>3Br&9 z%d!?8c44Rt)i;iA%jV)S_^Dv89L6Qm;WU(aq$|elTUMrv4}YMU!ht;4)nN+_4#Ths z15R3Xrs0ww!6+LSKx1DNr`EBTO>V#B;7K?`1|?HX+_|X{lA|hH1qWlSp#2OicqGI?8*~m%W`WTVZb^eXF+fbhsg*oQ zIgyf&%rIk#kF;YT+XnaD*ae57q>7U)NDd9oCbuvHFi6>wBE6S42+5%V>?)0lIC9*= z09>jP>6Szpg02X64B`L)w!P_^Xk?Rmf5=O)AMNDWLM70l`*KYWpVD-8m~8iHm}Qz; zqdNR4KtgDH8z+-UBy^PQOZ{-x2m?SYN+nA4IC}}RBH1IjJ6DNIbzg#d?3773J;GvMjxDU4fwS0mCq|7l zA}H|&y9_m60r|VQVJ=5PMh2{wTvi^llD{1apz8?w!v0oB*^!J7QA;8NgOM&B`zCcC zxwzHk#J@F;bTvrXbk5r*tWk0kvVtX>Sy5xuD*Q5NpO_pR(KeLX(l7O>%CyHRjoMRF zT~uae;^9Ha&+E2U-6RzErRZ(>jNsW)znW8Z5?$27P(tC9 zM!8ULfwvehM(uBU8z0rq;4qwg@8Ptsf($E=t3|k>mdh9pXpj?r8WDzg9G?+s&;}C5 zfi1Yxlg^To2QKnE!*ERsnISM3j4~X!qZ_svTuw3=?lV{ium%`Hzi?ro!)UYnR>i|c zr9t20w+GOQ2r}2IPZ`yo06Epq&~5HBv^%1-AwxohAocQ`wZ2>YE05C{x3^Eym?>pKS zq+8(`q%2l(`i0A=(n3}B#Vy~#B5dR&;fa!)I{6m27_thq({&*pLR=*W|3Q3XaG>hK z7OG!od|PsV)rXkSv~>{E7CeZ-Oh8BU2BkAf-_<;rZuGj)j$cyAUx9DoV3Hs zAR+1))LsJvAtkbwwAaKXsQut(4Ras{>Zn=e#2{QZVN7SCQPt@&C4G6rEIr~DD?OUP z+m`qhci@8=7MJE4NIKXE+Ubd()FBSTRWU1R?3y&kXcQG^FkEr4kYB;hly(daEy&t? zP%(@d740X=1YO_`&g5GMKA;`Q%cd68>rgIaC00A_=dEoOclduBaoy6HJ8&vWr|g|s zBjOBI6P5#0T1^X;Ewgp;D=mHK^2+ytzTLou`K^j>jZpaoTq^S(o<#G7nri)ht z3`gzGjD`iYNEt#>Nj{lbj4-DJm+0Dv!_e$dg|&Clcr}2h*B*=xt^rEa+x3x5*jhOB zMTmhl#-exld{>5W>mn+^<#OVe(xYUDj)L^PI0Pr~$Br+q5mCQA;SzH7 z)V9**!eW*j12Zg-S*PYrNcBkBLT1AnlwlFdury zz6Vu;!{ByN5l(Udxj}QPW)v42WQIDKi z3EZ!8T3#k#W#1CSnhf{G5d^v*IQ15{%NG$J)^9u8!iaOK_`>1&(FzV)J_fBRFVbr? zQ9Ixh@r^!eRZEg~8}Tu49+E?#5DmB-aEWlZLrY|Ojx{*P3YW728hOd7I5cD;3}t;u z+Zfmv#vwGUxV>N6>VUM*aVapz?8b2#i-UV`wPPz+5FApsSQgjV(JX?J;TWECjxcSa zVEZ2HXim7zXd^*lh>F2#T8CAPEm_6%&fC5W(|dU<6E5Wla`=7WFuE2EK}!H1&Uv~7 ztc7)5Rq&RzwsxH9)$L6D@+8a^tcuzRqZVweCt%XI>2?wfVF{pXEYo$hZfOy;dz(w) zLqorS6=&(%X%ynp+*+E_^c1=aQ5r^}%|O1-#6+V2KYRhSizvpz1V?c>G&w;zeURS6 zWH)78vTC8z7s3Z#2Qf@Rva;zZzC}4aY6HcW>3Y2}rMgs^mde~Rb$V(~VKFMg77mF^ zwG%Uo*CQ7XOB%<*gnewM%|fy%qF!`CUikRsSofKpQoS+;yPEzlxC+*o9Jg9?crD?y z>xPvG$EuCP{#J1FI_Z z&@41IcmXy-Wgb2zqWbS)J#wRfrw7=3W;zDh$Lo3k8SVw`4k$eaeYVIQHR zP`IJWmvWTXTH5mWa?$Ru15e1ty1&3H>^}0U3EPQvmPp?MN)=KfZxh0&Y^hb~1&ve_ zVtAYq@|Z{&wwX4+-4d!k96M+OICOx1Odqu^!X=8K-?*L7r}2_-Cc;wPi#iBX?a&Ga zrL{k-zh{d_E$IGEV;T4S$b7>Z%$6EPKjyrS*7`piE(`jjXT@w!>^D1fyB*U7xbWsPn5^$(dONn2)^#b@)6Tih8 zq^>B2+KF0dM8NrLq995WQ7gf}A=uKmgL1vLq28*sxC9p^J|%)S8%05Q3!Yy`)a2qb z)~&o(?hUEsfIR3Cc4N9PG)8?i;)ur?q$Eeh99m~^ptbl+oVoLGJLdD?kZOiabAX!4 z!OYvmZxy`*N{rHkZ7bWD|JZgy2f}f#%^N}b?IQS;UF+mU7$fWTRN+7ols{HHQymVF=80^KGj8%R})GuOME%KxoRF6`u+(P<0>Y6ruq z%%*I^c!yUsj+D|=A+;)wq~@|rt7vW_Xw+%CsF@p&alvY|(I=VGxgaC8>Rd;Ilp$VK z1b;}mO*D^aYN9mg1=iX)Q^TQ?HyDM!JF*ZXen`9;?ZmEu$V+uO;}v0-mWu!rY8%zq z+LQ$U3gc2mvZaD~o1sT)Aus{QMR*-ioE|}2LPJtIFpw$vp*JmLG^05Zg~AYUMVJb4 z?6@Unf5o36d$&a>3FtJ$y-SM&EstuX-zJFZBRIev6mLi}aZ8}pM@=%JOH(b{7Qqv( z!j)*eCHXMwUEMjePh&ZQ%O8lJV9$lOu^h-LJZX(%1qvt*0We~&@9YdX`EUc#<-(N@-vLqICgeYwR9FT zw94q{5KWPhh!lUTgY-U+!dt9*x+=mJSC&@P>XZQ9-avl{qeu>WElwu;U4*?It-mNu zm0l^}CQWZ-z0rhjp>g2TfhzlGT%eKmV6Ng_U8tIW!&*pAXqDga#5|S!u9HUv7()1)tphsOqBMS1EaeCkq z{NDO+3C@73DwAdh&=N1R~N+a3`OW^_TYV-ats>vm#p6XvBBw$2K%k7jw* z3(~WJPWz0Gt0Fle;&rgc*<}rF+*w$LszjxnhDAo?#i9%TFF6jH&DYc23a3iAOtvH!~T@JP)c{?V+X zpXgr{Vg6y-s1)v-ciq5KL)~!E!y*Yaxa4HCqKCr3+ku1yyECLhL}QizwoskKPooTv zqJOqv2^9t6O1CFnEd6nJC`x7Pto~E(_%{j64u2t_5^aruAD88)6f2lctPyDSMm@0@ zK)|Q=SEaD zL(_Z($7s~l0Y)#D1M0v*uTB8SgDdiX(Mx@5QEVu8)`iU&h(?P{=h+c!4QICZ12E8T>p z>YJKuIyLkq@iyA3OcJ@~d&DvdmsRww$llc!m_e3OEGKc2#ZK8KubnliHFnNWYL1BiA4Q5KuO%C-s!iJJP61`GYJDpFK6=Qu=kw+;|8Z^AbftaQ) z7&*1|X(%c}$1C9ZsS6)B9l@#UxWzk{CTyAxhpL3U)(}Z*ayXMt9E31jyYSL5VK~ed zVVpCnCSZxZF3OTMbOItZKy*~U*0PC^`MbD+=-CLC8Z~T%7B}2lGD2@ETXO7k1vpe| zdqSOv8oN&$i2*dByy(Cv4-3PZR1ul<3DLp{rKI%2;k#YfG^(XDT#Xo)O<6j^nURfM z9_S`8XdOw>osaO0;2(>zMtU3&XI{2^$hFUUc7fE(V!!veBPwba%Ypm^vs*VHCwHD+2Hi56LbjyGIOPn zkQ{pHWuU;LUabrZmB^iCbTYHZH337!4oEB`uKX2TSc(hAM4V|jA)oCz6&K99$x_32 z(b~*Nr*_WLa#|<2Un@n`bWlTG_1`JLFDutfLpYU9spr|V)Ed&HhAji&dgf!RNu&e? zf`%Q&Kq8Oj6f5M9$tkfWW+bmiCsAf^;m~kWQCWC6<(zqQ@t|168hL=0Hj6x*4B#** zrWH~0OsYWmvF}_`_qkM%C7*CGZIMJi(^@;-c8&PJEH@YcZv|x_)w#r$(+(MltSTFk z9ZLIncs0A?G(?^xuKwjEZi`qpq{pBbLP}jLX*p=7Os{eWDM6LuD8byKyoY$E7(vm& zA@_=&TB0*2D*l<8&htPs#25VUuro)$Ras%zEUdtccdLAJ1Z&F@gx+hpP(#+6JX5W8 znV+|qi_}K3D4cX<^WE3~`|(%OkIlW=?C7{SIXabrFV|Oh*NfjTF0bkNv(;+7o9~wE z6+M4_E5r8v*SCw!e7D}v)Bl-omh)%V3wru){(=IJS63$dr_KDu&HVHAYPVSJwiNgK z<>vGC&5ekN;{Wu8ANBd~=ezm0i%Z!G|IKH+-R8T+c1KTtSzcdV&No-80e}8#exq9T zg~;?`vH9b2Ct9w0A^NktnP2;H>pRgCFX~U5#ns~Za<#a6yxJ{yKYg=!PA~3X99GAc#>9viQd1Qa07czVD#aEx(9y*=^C}it^*HEz`QfXe_{%KqyxYH=akbrT=F2eVF37an zi8NdH*)L?bc)W5)@YzbxBB0|GcxQ{dBF=Lrpn5ZpVz-OiIoPZ7;(Bi3 zFSybC?%K(Az1TS~G0tz17-=&VqpxF}ItA7%4k&UV$RKwGSrS`q_UvL$$uVyxW*$YlB&Kc-AXRtv*p$ zJY8?D7XHKH%6oJOQlj{a&HVOd6tQ(;90qkOrb@vHV(JhA@!8Gt+Jap~T)G)wZk%Bi z^4!vGy@1{2!sTQpB4i;Ul*RMkm+L#*+|61{I$N1@8P9T?1x=pYm&;olCy~HD-CjHR zv03cyHY@+hX^p6Se!aZ%CgiPC+E%>TK403g--?<2X6`?oMdF8w46d{06VPnHpF1&_FKv+XPu3$QOQckYw>N{q;zKuM3w zY+o%M>Bp5cb}ttzC%m2CZR}w0mN&Lfmd))XgSQWcVs>{o9xm;Ex?Q+ozZG{YXHdn% zk5=5dTLpA=cPnwgmV9@6>+`X@t@Bpl%))uTa~^0hX`Tf;cN+3aOp`B7=UzF`5n+oS zuY}BKAJnRFYa>=y>sR(^_tFio?`-*^pKjQc@cPF)M~)B+>-Cu@7rik76Z%;P-kN|2 z$wm6?9X@YQ9^Di4dQL0U-FXHNvZ{&*+FqSKiWY2g=$Dp`eR#Ru{dB#^ynKCgt>5gVBI0|jt|jw)dOFi`%CTzO z=}fikbVltunZ3DpPryhZ#!NJ8_UTNeJU%)RcXA%2(wYBybDhe0qssHkHbzI2S_gV-&}6u*A1Q_Vj8bauvc^YzDe;rU!F z7JTBN`6+z!_MRpbCygrS(LM224B_9@}Q9f4i5xNBNu;1 zr?Vpn5D3YcVD;krs~_*yLjFE_dh%%Y@Zs!#E_O3|Gc&l7s>DScn^PcFl+DdOzq&d; zn&0i#m)C2_gJnBNq=s_O>7tn4c7pomcobB4wG_y8I@?NVLPp40$sG-horsg;bpJQ^ z!-0|z)nbkSB^7u6VzK*N$aw3`pVX`4lSfgurKN<`;+0Pw$EH2H@bk_3mGgADzP`Iz zB}xTmiz0RDsx4BwLk+2x%vEdC=q6JDYU1_(`u6Lu&c#q~7X-+Y^V{`pSfm6Q(dO(w z{zH)(CO-i~1;n3!Rz-d!VvfF*B8Sw_ohZDG%lnAR6Zt+0sQ>=WVmCkE&0mOOMRgw? zhwmY0oCHldzmbZVAAwuRtSeN%KNPqcMx+qP}nw(VbR+qP{^ zY}=d|6DJef$({SH@8SL*s#o{wwfdz`)!DVrKD*FSmacA2G6Z{2SRJ6C-n@8+$@rUr zqHv_lgq5K8qQbIrljhfC(DM{p1IM1Xr81RfN>fnS6oS+H@}%>`isun*v@C3#M@tKj z9;=YD1zHZC8maY7X8&Hl>jbMxQjD=L5)L&a8ARgD;t7}8-{db+;WvvRvL&KK9-(mt z?4zlQweaz(vWoyAj-MLXKtxujgnUGm{@MuH_%aks{V_X6G+VLG)T*VIDtVo}jAFy` z%npjq)4E;^Nfcr0-X(xso;;t~-(?9wahW@`ri?^(Nu6OPImU**^po)l>Nqh=n@Z## zX{R32Rd9VMtt3@+^+6m;p%ZbZ*kOBIvWaUcwM$a{U^Z(Hii^Mj%D zbS6`tnRz+I{Tyx%UBFMD2-n8v_d`p2?H>Qv5uY=DqgEZMIpv@Y%&s%{WoR^HsQ0A+ z^-rwgo(zqiP~5&(YdBjvf!_aCBGffrLwomp7P-4S6X4x8fqBvUJpE)a8O%I>9Q|zD zmw~Zj$_y_kJoIq;9GS1&Uos zEVislByjIgs9S$8zAzoOlC52KkcFL)=4V0%6+5i+qpMlVX3pJd5JXg{*{yQrCq}b z-XUCDrTum%?GS`*37XC^(vg8)@=^-3;?bd;Dj`NTzD(Ue92%s54$n}C^2Tg_mG((L zJDGi<(Ceu9B^~qmI^R7WT#ZgHN1QHQ9%>a2q9%M6P&`b{XVzj)LrFR$piK2CcXa)l z9b^f#6yZz(t_EHA>pEwO6%*X+aS;@h;&kbviO~%I$8|}2lX7a6omVm@X)((Z&$b*F zsOmIH=+mY%k0i2-zW#P;0?6KxM|whC zXl#`_-r+8~=8V}I_4T03T(Z$$bM@ zxpdVrY|lcID$ttL2zw8%%Gl>ddn&{B?P9CUbov!gcf}2LU9%Zgd+*e#r%kupR)!0{90x+e_mim zpGPb$@yM;Om^5*&{}xicPWfs3cX6EZdpES0^7B4R{rLC!-SO0q$NuM3To1)H9=Ct* zZm8FM{iRjwr{jLa|1E|QKbTpr%c+lplsf~iKf`jpk}v%Hf4@pm(CHI#sFUb8_r6I^ ztOfu2V?|v151i-zIg&q%^lnh~&aSxO2b{-7$mvtu9K5A&T*Mv&;GZNBD(MwsS4PE? z{~nF2?nwyAwxNxg*S~9d;QYfx8A%~u!W_e=y$5x^Jb z&hMGaeFx?JmF}7BXoZx5F5Ybx9`H?w<}c@dA_Esi`> zTJGaV4-Y?_wB}CjMGf>V@oXI;mIXP7+c)o;Lr>t>NzOn&l3c;cXJ>dK(Z(aZ$n^E0+d$Zw4v=^J~@A%0z_TBr{5GWUT;|M z>vsvgPBz}Dtdjn*hTi3-_${2=-je^IpdvnQ+nb{Hj;HR+K*m$ce~gEYukjOspCf^dB5EpfYgd<5fd19KYj0xjwbgQb`ALa-tQXx zzqdx84-aD^FbNCzd{ZYb1NZm$#Of(A9rB|e9Rm71z3(6P^7ZT(1=8mU4f#^v0Kmc0 zlM>(NUgRP;;_|YyJ){?J8YuYB0ixuROxjqZ!JML*{8s$TiNBJ9gbNXbH%l3VHY(I; z=)*w1ZJGp(6`L*J7K2;cVZXaCo{kaQUb>)M4IF0^<7$F)ziEF?P+DZhLt;THDr*m_ z%!d^;@jJyic7*cSIypgD<}nz-E;TeIDWfpBX0yQnacqzvyw|gXe>7z~5aIm2U?U&_ zpEBYLlW)hL@0&_DZ&wz*x}xZT?FrXk0ZOuy~1EBlPYaAa+O zqhuq;BjD{EQgxE^6-aPr3$;v7tx2PfZynNi^UtL9a)KBZ?2D)_V#vUcZl@nX6;hmOhybcEB{wJqE}k8Pcf2R2x!!IAGb_G27$e2JG55_ z38*#_joORKWw;-Zjk0Y6TwUUHDvH+bWvgNQ#?94dmFjMh{P1~{{bAF6tF`ci2%x2Y#L-f9O@wWi4 z5X-m(_vo0obK={-nH~*AN$lKI$|rV5UK8hN980myqoA3CgXG*^d`}Y%2F(KfN$&t9 z_a*Ap(vrYJ94~yILli`nrlV5KSxg$3;s&H`LYfnt$wo6}|DOJCTR}xsD;I|}D{R^) zTTf)g8Y{YpxTINKkF88!16%8W{+qV_`XU=|A1;qa2u-toIr^wb(nC+II{scTg|6Dl zV#g7VEf|54+5uOaI-I&cCx1wFlP!$9mBgGs*=m>>Q#9&bKZz!sYC;x37oSE3sq+Y93fpvJ#9y=PoLoCvvwG=qlQ>7+~)S4qNdTc!GzJ8m;>3bs2gZw#cpg*Xj z8hS{%Z_||ct4C3cj{k@aYd`lYQbCF}RKzIs5LDSE6ndu)yufkf>?oL|Hj$X0G?N?F7rCn)Rt-Tr?Mo4eAH%J8v9gX;uwVJielcQp^k;$bDElz!@ zLOMV8Z#O-1rk)bZMb|%$tS+`wRMWpP9WfXO?pd%F7_>cwE}-WmCmZxgXZ#++I7jByO=?ndvTH?I8YqH1y3Wu{>VdIyk!zsXWK)N>E(gw^)Ay`o`{dQ5 zPw@JF&f(MmrPK9s<%dx6F&shh^`ITv;sMlCnF&#~49;LbVVBKWaedNG0lm} zw@#SiSc2r-X6hZV>fIC<^)YQ%8yJ?t`Wc#lFKA*vWKOX3ZQ1o5RSPk>AhLJ`T(-46 zt80WLjzN}b#~~qeoh$kCC7Ch_!f4nR9gP?G+)7vAL-v?V#9Jyxh9)xVQ`v+c%&FkP zHQ^T7kg_Re`9Tj_x=N|xWt1#Mvy;}5zd1;B(2m|U8;X;Llw$NEonci0!(mzW;V0p+ ze${6khPSOi`ZAj7APpl&5ub4|nkl(eW`n=+^o20dxI3b)9y4h4!@_Nj<(&9rK<%s0ozdp^n{ z>_~Z-)>pgC($qZ_ddC!g(L(VdtDH!u#d0&|>|O75^`K>PzQ{aBH^apE=m37=%hZ`E zW@Bw)f*b&;RMu4V1+{zKLJ<>>jDNe=Y41DkB5{I+WwR192I;WiQ38TMnMWzqtkGX_ zaL$R_`kHJ({Aibc9cf-ch1B|+p%*wzbt*p`c{ke-i^soxqGV?N6KzU ziy5H9&0B}JbKuAoHsFB!mySvmLER|TIYa}2)^7i`t(~o%?j7Dw$j7VwX)lSmix8X8 zZ+r&Ann4a@O#iupT;KMdj!FXj>p*@1zFbO|>?Or>!h#$@M#FqTfw$RvDoVZSobFK0 z0NwnMs~5_KQEC1%1~s3IuGg#k&$|@rtn7suOG%G;N4A`sA?I=mdUKdX6$*6Oh)%%J zizK}ro_O9gVaBN><#fhEK(R8u!QsGc()EFfQw9jnPpqRw@cHuGpEp}TsNyqX^&-RB z6U!euN~*4pT&Q45f0C~o-r)K? zSLhlHXV5Tbg?6skL;^@;`i6&-st4`PaXpPlJJ=}RbeD1*Ez99AjHC9 z25r)LBF*OASF#k+obSEAmur7v6`lZ9hJ0-3QnfQ5(~^Igj&Xa6yl*X5w%0)T0N(x0 z=kSg4UUVs#%wNW2e#c%-dx{&ulX#z-XqlZ}5j7f})Axj*9c2QlQ)3p2+2>dP@exO# zpC=X(C}^St0?%kF6XY?I{kXgU;hE7<R7VlUIHbxTZmdN94&h9CNTYmvl~-X$<%c>FvX2ZwN5 z{eb@$7t60CUFyIA0fmtR0U`ZgT=l?Cl(QqzCAU;uZMr#w zLFwYc8Ay*jlMEqS{c6QPNejJNIlSrX=S^nHl$2`XpBBzu^PA7(b&*U%p;>@JjHeVh%MwYGTuE};g@ew5$`2M~J3E)fx`zF~z%YmOY}>pHGa-pAdZ)%G$T$OZZ|nd=E0 z-Dksb-eA22p?sf_FlLLNzMPY-*T$M;$)yl8$Lrdiz~vDunaPc8hE5nW5IImRzFl=u zmafket7eAr6YO~irsaSGT_Y{kB8l@7@n(MK$E3H|r^>L#>H^9igIn~8f7BFwU#A78BC$^fEaH6tF`r_PIr7Qq`q6 zvhB!)|3Kt)4_#|yFA^wbcS*)~k0O|QG1QVE8_WvY-&|B4!#fB{a# z#LY|a39D0THcSQaGjBIASyZSv;rXXHBjrXY-zn2EJ)1V_bR}ryR*?fl%%+eFkKE&k zAZxhMb134-e&Bfmk<__`$gPuW?vXfpHOii)dFR)hx~OSo0rpjbw|-6YUvda`4ch{J zocFt^QH9OfE{jY#!0*MaCb-_s#?7;Jb$O%fr9eHII@xmlTqn(ZzH2h zdfBxZmSx>mi;DX8_-Qyctr~!FTESn8fm(O%``LxaKd2P8oafh)SKz(u_m92CZ`IWO2sy|f* zRDeUSypd{%tQ8wo*{U`MRgiFvW~rbG9r%-Au2~k=`Ic-2^ed5&e+z{+1?+%U`Evt8 zAk)O(zg6C~Sz>j!;Jii*Hu$2v`0ZP6*7~Zf0we<2{|u@&ILe}U z$~7PeWz#N&!JnBCs|>C(yIN9ro7jfWa<#p?)kjwHhmjK1z-{;oCfsG`$Sq0$dMNr$ z5p3RBc?DKyoD^tot^lExu+xmUoQXaA2M8 zj5vf$&lySw2Q@B*Yt=S3oWk{--X>r@jS-(^MPBEo2FlgU~zYYcVtZFwnEuhWDVgd9!H<@ z1%7&VglH@G0O6uMr-LBV&s#tO@rIF;ld%#q=)#V-&}K)Wk{fmEHeM}V=L&%e;_aFV zVFg4&-vT+7?XX;_Ri@K)BkeaG0P-h9Nq6#ieY^F62)%3fN z(<^`CVhmGc=#ztTf1~J}_|awz46)5|%csT({<8CSZ&DS()L$w=SSP6To*Oug=6j?% z$5xg;R6|hgk2JjV8QAjCxBOvr``P<4(D3U0N$_u2`7+yjHu%T#%oXuB79FZMmVI)M zc8;o>tPDECTEu*%So?mJjwLe~j+>EIJlcg@53Ga5Hy3J@=U~EpRZRomg*++{Am%}P zd<@%CI)`f|(l-9tm|Ib-1(;hT)V8N7?>O?Tk5zW>880*5t&g1jm@T1`G;msHT zdl(-v{EZ9@){~yp+>`*lB&P75vtwq@c-GVT2>J4k>gA>3%Rbys6ze2jCs`J4wJ zOf_WIi4N$wNF(!{Y=a$by>R9!S}!Mh5K4rSYU7Sqv?H@_*W}^SlC&<{S+&0Z9*7D< zCCyP7Av&0gON7o&G=Y+N2Rl9)f)B$DLmm9egzZ2`0AY6KGbFM_+m-S>jAHB&dgVj* z_Y8v^klGGk18LMLy~7!$H&_;HxdFL`ArojfVZr|s)e-p$rN{zqE;r6jxC>;4Gcp$m zdt`8My_rI$XKZ4M`cKCunj{vVk+|R#TMwn3`Df6T?&ulgZc4 zHo%{DtpA&2%whMNL88AOqlB~nKzJAyg}H2P0ug^Aw2TD8_$=o9#ssF2nyF#{uL!T` zF)-L3Q65oVig5_Kvq-90lljsz_5FNP_?Y8SZ*d_f8%utuqX6oNYiN`L11Zyt`*K{H zdvmd@rBT~S1Fc?dCt)@G7rOdCRtQu@fdM7e-21{7inOxs5gvOqG)O$kIs@V8)H z7|PCZyQhz^lo&sz!{)v62z7p5OD2g2nXqD}cS}&4LH?f@j#{wri zZ5>gH0`0`9n4tq_H9U=u^`e;a6`S1GUh(2TSy(buU0Awz^`t~|K`bTI%McHL3jS4} zvO{}zMrAIp_Go1RF4ami>%r3X8k~Hqk_~1n1eqIv6^aC*y8 zC0mQBcD|096=t>=FQ=<)3CzT*xtIT9(S5P0OwU6tTczFO7GbDx!#`h?h3S^WpqDZe zfDKV^zO8k5QY(ji&h{$BJ&D7_A=malA9ci|6P3gplk>3G!M5&}eZ0vzlm3Xbg{=YC z6H=&w3AgYGFBGJ`cuwE)n4RV|`GiK3zM#hQW-1+Dgg^W-6{GSe+R2aEdk(b67e1F` zq;CDh+Wjc=o3!To;co&?%d}f{f1B%S&@iShO&|Lf z_Y)VrV)(<#8T$L_+|dcItAxU5t+B$m%4~Y%y?W!O_%)2S89l#j+O`7eYRT^60E|g; zHT!5JcapzBP;VOCCc6tOkaQ+${|EqNSiJX(LlK@ zk`)kCpA(Jtd5`uI z=aOGO;&)ZHWJnGJEkJ;P&cK0y{+G4?Uw+=))0N)E)!5a| z#l+b8-(I9ljn`p|32FC%R;wtIY@~ddT{s;FxQk76Q$bj1;fUNqHi<^MliB9yWmh_N zX8l|Z9z=ZSr2~?h%n@91Q$!sG8rCx^21)#KNaodfj6eplpXUmAjl8F2Zd_=3tZGhZ z(oveJL=*Nno8^OTNFXDD^?5}byR})JB)d_J)f7~E_B$64Y8h$CNhhu@E}^@!<_D(S zhc5DgwhZZaz7sI=dsY}XHGXbhid?nxvN1=;?Z@6=TY)C9}pLL6GYV%{bHVFO>M;16nV zVU7Md#G{)!s~voopXygxPcvviA*Ka4qNMnoFBM9G(*z}4mpfwdf~oY_oD({|+VXjB z#2{G&=nWE&vu?W3+pwQ~IbWdtLz{F=Diug073dtxSV1P^$vJ>Ipo&%w)e%)KlNkzi zVky{1ZYFkUb%t*v{BaMQ@1M-DOOabIKruC|Gh`-IPWHhYqc{h0MuRVnzc6X7WKDq(x4Qas*72 zR%SibvN8aHR02BexpV-9&=UI?;XZ0PSNOc1uO>4jmRZ<1mR1JR{G6*m*_#dpp^5r| zYDbBul9LDtd+J z)8#}CY!Yb9qjk#J6*7&disFrF0`^J+eL}u%mF^v9m{z~LmgggUs^S5s;t}eS3{aVVXDJaLbIpz^B@2CP;W8epLI;O zYXpG4rwk|FY*RR>Bxjr`+!a0#NEQv%rY^)1n;0E4PPv<6#}VSbEA(|edv5zg3<)OM zeOMfK5zlY)N)*)*ZFUT}tLg?r>+tGDkd(k{S6$u_rgIMZ1=(2-m}-2OEo$;aUG9~z zmvn8~D57A0Xqg)g%I}ybEH7O{vna;`@7`N~mqzYX+_-S;7UP^C#kxHFHBrZGul!WMI2~Uvj4hA66Mz++c=;pvpToWx2;6(vWVjXZ@bUNC`w87ShK(wu z?xaN@2XW3aD#s0Z_g*ImV6Woke*@k%gU}( zO??1jcDV(jmhZ83>@ZF~2}o@S!0pTm`swU4wY3;p40$RFaZ7xPru$U|zcDBjjWOa$ zBqm^4y_k5c3R=mv3=l4mShoGP1Ep_v0?Zz;mumhb6bJu)M`}ObmUq50R|`!tJP{7t z&0s{ybtgN+3#cb=2SM+YRwDWhuVqO%1|yjpPg3=UG!27Z35wDLH`8x?fXvD>&L`&6F8^ z7~19QcPy2DR9FW;13KQ_(LD$WQ(vx>5Vf>w56;z8 zyv~lyw0@)Lq@jU8<%)QMV53CnX+QjPM@(?x&q;cA0At~d1D(faJ8+>1Eh9-~&eg?4 zF~xN26Q0&}9{_a=$4$N3RpvmxdIuw>yG^qn7)cPaC)zOIPmV8Ea}LzUlJKa&i!b+t z7Ko5E@%Z7aA8A6f`!L^EqhB@pN*azEcKty|mqs?Vy5;%tz%<7WO#G~W@+epm60y54 zr~7oMwaywvFLpcDxHY_8e>r=yUk|)0m~ogup~YB8G>)OVdV6{NCwS41#Nt@$!~a7+ z;Ra%y-Zw5m^2=)1#?4a37x(pQwRXoI`t6$2*0cC-+(8)0_v`(akJdMcWIqx!r^C!7 z=__7yNH_E!Q&fQgI)Zcr_ng_|;g#$CQ3QXs;mkP{oAiw#O-NfsLB@GaMnrk47tX#P z;QyxOAEt41!hgyR?teM?KeV-(wS~q1OUD5YB~mC~A9TmOD@AD_%%T(?o4nNddJtP= z#%s(11CwG-_F{5d#*iTmgKthz{U7S=Mj=;Ryeay!7+2-h@4su--P#vQbmU*q<>qGR#EA=p- zxyKqc#u5Zu#0qyhf;>uvs(_ZIW-gqkX#qP>4zkAju;P9{%ll*~>$f#- z8>n}CT(kZfM~>gx5VW+%f@(3Y39DPf!0S>o{5bG5#6!;-Gcy5$(S`mR8y@0=F3~>d2yC)mC4R_90&vdAWx9XuzlXXVz0Hk+>6WrH}ehyy+`oH`NA?_ z&F+b}3%<8+r}_4A;Ao`En5Qn@J|7nV&-|y$NDoUNGnch@8TbqHE5>4@LK{5?!el82 zpEPE(cM4=(V!8}0y#!+^%#nwNi@(HtY2ej_$akktB?_2qn)!Q2lC%dJ@TDinju%bQ zKM1;7{JTBQB{(vR_pAIc+kTJz&q~w3PL}asjJKh#IA{%~+`+|trj;G>H8ID`F!zUS zR@;}n~GIPxGLaIc>+%J((_?M-H<447YCbFLqK0GAme4k&udJ~OD#2XAX$Hm6zkyoB(` zkv`tdq4eDI9TVYIwPWw}Mt~)-CD*Qb!g6K>H2k6kMw9*kacAh@l|P=M$3p>$$P~e{ z2}xXkBh@S6Av&zi;RSwv3~^qZA-9Aa4TR_Go9Cmsk-Zw$Y%wvuhBJap7+x|AHW7IK zKiSP@Zv>yzCCn@B9foz$+YrSIH|>2B zb=_Z>9F%b+KyH24aic0QuSAAdUEvoFpG4Szq->z zG>64#;<|3=q%fLvvMsP!Upg2YdMOZYrX&s=#M5d2y!GST!?e+_m(K^iE@IGHX+V5X zBcBe^{vl)m8H>0wrn-ulg)@6W-lpDSxB(W7DLf&Cb*_NC%b^~Dj>2egzL)!l`mux3 zF|Wsv&WND&+?H88G$gghEP%MkO}rk)CPFTw_@Gn1p6y*q`tO}uuxJOvEC%7+*ySBk z>CeP?L}^4w!6~EU{Lky@=P@YEG5K=LeM)J4Hw^o!SlZW^W&LZFL%7~wR?WeaiuGUIEs zid%&bSLU<;aVM+8_*CH<)gptsW!@}gp?=AzKX2d9bzWa<@BQ{tM&lb8U&MLj&D8jd zn>oBPuE>H)y|a@}9D|sXSLc31B45UDy;V-$Zn0wla^YJ`#rj0|RROO|SbQsKrr7hV zaslJItf{xq7@qCKCGI7B4DlcLk1s_mRRxQGbqQr-7WPoH{UD~uOO?DZwcLwd zt3@<2f)p9)xz%BpL!$&E)!uDqJ(envKp$R(sjr9+=*5DHbnWGtdC9n&?9|}IePrnw zcX>*sXy6VVIR^D5nOhRY4<8Xysy&IDx$9`f7()_F5Lh-KtlSm`rYlN@7!#sXp1PWv zKALZBS1|LTzXIq2)QFYZ){5|0v4E%aWwn#1QqziS^GMorz4p=#9yYy6_F;-hAhoT9 zdgFTrDWPzGWzXJJ4=0G!zLEr&l+@ z+FnmBLWoO2Op45$@?n-+Gro3FWFvQxqxh06qVy?9EJX|q1PaKeQTKGiLEVjW zVVz1P9o6!B0b}E=wd>iSvD3cxaD3gi|2!8~bnx1LTYh-Qu6(4RKHUp)_8XU zR$R?$%;YjNsDRHZX+Hs7j&v`4=7B2wdjw-3x>ZN?2PcJ0M2$au|Bacb4mc|p>K3xB zkfPUoel7_7Dqe3otMQjQJOW$IzIYI5Z|f=00cOYq(vCcB^Vg#9SkJl&*f!YaYa%(D zg~p7?xN}J=lo(&F?oI6KH0p_x^2~uYYj~nL7EB;wGmsHSaXcs-L@(0scVn=tJ#5i% zIPkAK_>&E!=|m5p{47FN(L&nzmTRDqfx~P!=R`P5F<@NcZeeT4HzqNO z2e4`Jq`!#Y`aM^!ao6Yjql(?90MH@J(~28j$SY9O8%!xX+>Z*&{#=jUo?fQid;t!YAlQ8IMHzj7C zd%Ll#!gIndzN^A68(ifu7k4iZx8Sv&P+QD0L@RBKahSFA;o}0AeZftC*!WKGobu@b zCdlb87pLG^d=a1Sv5o6Dam$~b#p_O|=j+c)v=&I$_!fzZ?tqppZhOKOAPB29tA2+9 zJ*=JfZb`|pYeDw_`@H;qWVLNuP`Pd&Nr3XjBx7;#!}B+|I}!X9Xctg!N%$ha?TrW1 z!gnY9pPT%jB_TMVrmm}i-VnJ&E4)jBn?7rg#+arb@zaAH z@hwjmZ*QUXtG4;QknqdCq4#)&?$Bb79e2>p&h@gBB8&mW7xeI#T{qs)s<}z=kI&DY z4e`^*5wN9iut*>&kD{|6lB09zMU+Y>?{C=Em{+1w&e($8HsWu*MyZ}(F&$?hikF6G z8->zFNilYoaVgI^C388?lm57@xhCR*Ze0M>iIsDc@OZ1Y3Vo|*{3m>E5F^w<1Y<=f zKuDyOD?;2($P0d`;R)oF2XC@0l;4K~`Lpg47nJBS1Og2+>)88Av*l`Js~v|spN3(` zEybBr+nX&~Eqm;)&V+vsFLB5%PB;7~Q#=!t_6dV7D^Vo5o@K}RhZa#CkwtrBbmSN9 z2{)m3<|MGZo`NuCS0yH+XeHBBX~+SNyzq@af@ownSW&z1uz3^Q#!8p_0D)b6@#~y< zmY7m52b!jINH}x852>1)+eS?|@y802Sc2T)anoBD=RnWFHf$|Zd@~uYEFt%F)VWdZX6Ez@X)J=GKk&t7UAg=fQ( zMUH_6tMm-F#Psr2V>ysYKMv{xU)~;n7Z=J+JlyOJAwPdTyE@^lKeY}rjr(z@FN9r2 z*FxqF-gm=XCL@{}d1Gl6Yt83^NfT;VXIqoFA2s?;57a32J{1TCL64Er1V_Y(c9P6c z#D*CyJ;%5V56(;lLMj!nM~)5Gqh1n^&NGxIwp%);j!!+U;yRDra$>;dHs-`XE0m?A z7fW9P;oto`x=y;z*v=kj06&~i2xi3WKEiIup7|$X@7pip=kitx_j2m1S?oE&Wjqf5rWgGCT8SuPJxQE7LRb;Vp8b%hiO=MS zba^)$9jqR2$nn->d@dAnHS{V(6t++)v)w_GZUE1=VX3@feJ74^bA{~KxhILY z9XsM1G^VOHRD}bVMb|2YqzJdTc_JZu7fGxV8Z9-6gm`$OU|&c`v^4zALN$i+$c8+h zx)x(gezE`86$xyt9-*&a9wdrYpWkf2;74-b zDYxjVmP!tpnKXX%NSddOw46XPU)@ul#lsc|jW)X+DP$@9f$N$7@MnT8H!q2rO*tifNhNnftYJPYh(TG}fGI&1 zwsSSHvy2*KQ99aF&3eYXq@xzCcp^AHeI=sLa5EY2Hd3T=Wr@sNOvyo z&QGvjDqAB1Mm9MVqw28^W;do>iI`ixs1&Sd(;)0eShS(`BT=W%|0l=4zdZpJ;#T*> zywJX_ZhZ+4Zimk-8>Gzv!cN$fw{Uv@kHYT&J*j}t4pQjJ`p0v{IiT5FM{ zaRO5_>hOkAJK>87DvLE;n`nECihn3R9qK}qiX5Rc4RW|Ev@&W`82iMmD=~g;iiy(K zdj6{10vD7c>FpVo9SBMFLCOujFl?!cLt&JA`I4=3-1ro4eKEYw5iEN6N#iYjC9Xy!A9n&8Fyb!MHL^Po%2W$|1>iM`BFz=%<|?1jc0%!5oMvbJn+#TzNPh z0u*Cbgk2m7jcQrs)CxBEYNQkc;nQU!q1B+>6_&CHYb*mP*4XLA97wU?Z79G#r<9n= ztT~AhTsIm?f`SLQV2q&~K;i&7NeZ4gP6{LZ6>r(8Ly<_1q67uPAXc}y()5Lk>?(lb z|7*0IJsz0{1`!+1I?LCwX9D<(qsdC3m6||L2{Sh|M`;aCgiwtbRq>U-fEu5iP)W7= zb_7NZ>8X*x-omC3D@c!Df=F!)D2pF`6_q3xFCJSM$dTyOyCiY;5o_BVRFT+m*lLap zfr*S6Nca_&G?1z+{7S6Spz|t(r`7e#UQ~Pm#)_5*RJ}Y_SQ|!JFoj5mp1veGI!x-$ z+@zi!^N&U0OsKnMGf|&yeCCCO@8!sA2F>rr3tgvW!USa0$AR&{_LKE&?&~}#Ra9xI zK}wQ?#LUhQBMv%}4^@QrT+} z32n7FTtL*GIT$p+w=!b#i8>&|LI=wSRF@*i$r1`eP*BnU!}Jy5_iuB?H2tMw$SV8= zRXqrJ)e~Z0hG})HscUR4LXtv@k-D2=0v{~4Im(+9R0<+NQ0s`N1Xy|^n?emk zrvZ;sW})pC58iwRUbritbcIDR_{|6{;5(vv1juj)AIdT?6iv8--+6~?oWi3N&btb; z8x>4ol8z@1Wke64e55~%VCqGPXVCjoD{><7B!!2-v@RZ{=@Sn+k83e9OhgtzNow(MjRp===;vk% z12-}WEcM&9NDlf0ji68~xPU3$Knf~TLJx%ak3z@QGDFrwiId{6RZFRblOcyci_b%s z!yqnHzL5HjvbFBZ`O0FgT1w3tl2wG!Be^!rp2#4Kg26)p2Me4(i~fKmhYV-~!5ix? zfSmc@z#(>R`eNGn4P9(<-IdR-oMq^W2q96>H+Ev^#7ANc!PzbC=@9M}4LZioEmS*UKKL)dTN4-jKIwW&Lcxd$(1bpytsGHsK7qhD z@Z$!2>e!$!;U}~vmS;7c(4Sh#BcFom`-r%Ar7x)n+9Y<@p2>6onbVlS0+Sa{8G@h2 z3f$<70V54zeC3`M(LXuG$ff6>xTM6gKWU}4Gp0Xy&^mb8M~5U7qq!2!=XR3WO#(k;=%xZ$lVy-SHL??fMK;cpOZLm z#$cQe&N1`m@D)YmR{=I>zz*o9BF}h=O+A)|Zh(GZy13`#hy*PMhBTpuM;x)?FRovu zv2sSnLoMKe(FDjmAB{YAz=kmCfA2=Mp;q0&V~kPt#vGEi#^urjcWT&Ib<^l?D!zXEcEIeHuW*Sj|Nq z_vOH59tJLQJaCNTqBV^fh$R8b?-)vEIfRE`5~6AdRdNkyN?h^|=HVR}>>2t2K8&HD zDKN3t%=Z%Wh4$zg-6yarGr$z6()q}-Egs#?zo7i-kC z8co6Ve!nH-Oo<@yUFNpmc4-n$M@=E2R`2(>Hq3s1SeFx%!lN5IA(#W{Ovndh)|vmY zDfa7-Hc%m~Ak+3f*r13-Mxkw$ux&uwTcTlMZ~=3pE8+JD2Z*NAz}FB@0*KMnaaGtK zi`ka3KblA293aaeH^+GF38$dYep;xn&>+g96jUXlOIN7(Id}##9Yb37qz9haXcfMt}spE>Lwy*XWSCLTWXc<;)1pB9+r0un= zNnvQI8f#nmaZIC_S#6$3Gb>>#$&6i2GvdM*rOz- zG6W0}gj_~Ils3NBs||#5=)^-swY15#!4kdfrTcWG z%Z^(v)VAY6)mELFu^~0(hEX%?;7W{UFo2qX%7AeRAA>%((eT*(?MF}o{0e?%;9y2P z7;&(i0r*oEx=u3=YI`1f{Cdi-XZ-qxe`~I^yC{LW6jFlmQPmkpgDJcHn?V9oj)%YW ztmYUs|EIs*KMrcy$`8x6^20K%^lI8n9a2+lyK2z^+!oG+h+!$t#YvmcWWpe|Mp0Bn z^sMFjGGL6*Ha!f4G-1oYP|&^&P0EU?l?*=*-G0Ar)?4c)7;JMH9?ckw$_-}C9l4?H za-i*OgZRPvf;P|-?Z6n8rUb9q7HQlxy9^C96`X2cv3uDM?sh})4C}gXmRpSE)1s3D zMwznU{TxqwzE5c%PpA7 zjFauOh4W_W7gc+@@oz)zvC>*i8!V%rOqH0aKKW4zAq?5Y?FV@St8YgH^9n{bqiQP- zh2#jk3hV%v>*s?0uiNw@_&*`MAQTha$hB-hPLZqgLB z^r@s75a28#7B-^{LTLkk2Xt38p|Ol;puGO#DK5PMH18il={GM28xPl|&X-l9qqS0X z3%kCxQdP;ArM$AG>UzMg=^Lyi@|W6R{ba10QBGf)fini~GfA1Xae6C-o#g-F;opyk z6(<32$)KL9NDrwp*eE1kYE|T-3c_-!RhWrrTw+JC5*{cO=@0_#@hE*X9|F;%|q4q3bc3Mvn z@NC8HFa+GTuPs-EI=J%Ysi$*XXplh$onqcdK6Yb2=%`Kq0%F1lCgzadz4K!0Ruse8 zP7!){-VuQn@ScMmw-wn8D&k29Bq#7aTrUDpWnvQ260dPhIy%JVX~t^;_7gh2kg!g| z|GDls(TR1!!9|D|QB?#1Z!2<8p*#QRo}TbyE1s@gQK4e&&M8jZWLrRCx@;isQHm(hUYUMb;k88oTJPyR}B3if` z;e9x?WyJC3EZy$GTt<5`ICCRhcL8Rl?Z6>VHeVI0b;dZW>5#K9V*VJH!g6>yD$a;My&E z19k?A!a_^78p~y2ys+WcP*{u_o^%Uw3Dp9YNDlVZ9NbIjj2*lu>s4yOZuV%&PAn4= ztL2#~%PW#k3JfAR8uxtF(%REDMg4M;u-|`v*`L37VZChj!90w|gCxN&rmf4>E>)@E zA6qSK_WSjnE&Z(Rr|<8T5}UHy6k~He&tH=~azkR853+qffUo}=e0tGH>+(nGn5*^! zr2kE1+9}WQUkeg@e}$w>dM3GL)*hPp@cc`1>uCg;;gqa9Pn9e_vWp)ze%yrN<7R99 z`DP}^eYQZAONJMFb#Xj~PxTt8PkHp!Y^)675@X&x-0PdgepOD|h;A(crF2}Tw^>`O z?`*g7XVsHdF~@JRlBaBTtwznREo$}=?N%=CRO9?b@Al_`e#X5&%=69aEz;4J>Na~D z&B0FJ-jHjDt-if(;>Ly^YY$YKxnu6E1WK=vf}gBm00pY82(@s_Gy37B>o7&qP<>V9 z<c1%#$c|Alr{d}b=_$q29z;WD6lrJivi@Asv}VjQo6&+_`e2#&u- zME)^My&Nox2oDkaD-nbZ{Jz=vdT9AO;4hDWDtvyOTB4lU7i)yyQ5z%Dw!R)!p?dlS zG4V(AwqhYB3)s#U5=k4FB8hMeSnc2EmVq9Gqqn>>w*ZHmb<|xE06c|1JQM8SK;YQ7 z;hVvTC^~Q~*Pn396#og?(zbQF-SsVPbT|1imd1>8Jn-qdPQ>ty3K6v9#Z!}a#Up>~L#Ftj>@MQ- z5K@1^(;)leF#d%z!}|Ss4E>?GRGex2pHteFABm~$cNhDJv!z>un$?`R>tbVO65_kG z71-ofID#_2g?NGm?@GC5XQ7&~#e>hTYjPx+PnWUSE^A-o?g!je?o6=m5z^E`1n&Db z+l~1y;ulfHJw&4=4rR_QJhl|hOg;-77aC@c%kj zv{nG|bQ^Vd%2>?L{9qn%$|I)tfnkUl;P1`xg`DK?BHAfL$K*}^4jbK>kKenULvcvyd1Y?TIX5xj*SdWx zX36(0>K&iY0?zQ>8HrY8N<^DDH;-rEVl^9hgVUP8oi<&1OgvrNB z0&HkeXc06~Ht~8F4`1vPuZW0ugfR-6{1)+pxFIsCGl)J&MtEa|kmmXzjL?C7;Av!N zQ{bJugq15QYuOz1lNH4sL1&XN8UYpPE>Ng3A}&nm%Kae-55#;=`XzAhIL=WD<%7z| z6lnM7Qr$?lmq-UF;b-p-l^qBE9MMi%LI$U^NqGJN4}xJ803046M0u2yk##{EfLtFW zaDw@O?MSJK`>BO0TSAkegphhs=MkiyA*CXf*hk+3y5eO6Ajt=a8$63`K2m=r#mlr9 zVj1;2-3{SpdqZ8G5#8|27^0Bs!XvaM;1V8oP_to;ekIYSrdoP#yGGR^)FZ)mKWt4yveZE9OU$K}lJTpBo# zc8~yz&zzVnT#Sa0*efR8HDh)M&)Fn>$5`ZlU|3fu)~SUR?&B#8Oo{j*2pKRK8Us}v zMV&-tBt#{`!-G^$s=xQioY1W`cr$8OT@w}ve!75UBp@zjU`c-H`vCKSTw*!|=Z?yr zh5iUHRQDzwx%7s$v`MzXy-t=LrB*W2uAz~zh9tbgQ;0wqQ5gIiE<7o|k0;;|VUU%9 z$lz&2xq>7!?vvx<7QvR_Qdx0e2Hz5d#avHXHrqz4Lz<4zDRLu*2xYO5>TD_<&diWX zB$f~iNH$?vvdZn;SUtH>w1|CSP4L$Q&#GgarKBIa^YF{Cakx6@D0JQi#TH*`H1Kc2KBpQEYekh1tbcP_bs1o<+Y`xS2 z;zFJI7>`;7{CmW?T-J9 zYVb&LH18%slYAxw<}pTMo!bygToh$nxkCqXzAqT)y8ude`Q=KZ}5=JTba0sEg-i zl`kRJrFo35H0nj}UpY(}Rj_^sEWoR0$Zzn3zr{#Q<{=%S4Cb^GUl>8O>F_u7!Cn$) z?r_M{@$g0rOUQyxS0CWkeG~6Uz#cG;Huf%v{nSJAk#;;VQPPnp$-NpKahb{5wi$;P(D}HmN-TIL?*?NYy8mG5MtJH{Y~R3P1V3rN*}dqzZ(nv!4m&5E zi(iBbNED@O5@CdsR*fu6)f40LT{T)ng@A-}nDPY3i6VZ(C2i>_fri+~Med5mZlZ7`ku(8{j}bWeS`yTqw|WZk61CpW=$a3(zEypoAP; z=yl2fh4p?2*&@#oIqmp}i&+BD3N#P_U?;9W1U9%8{^X3%38Q#7cIdD!^X4c4be~uy zdjl|NSy6SpK+SdfhJtPWeOvmK#Kc$zT}l!J>>Sl5f}%l^*%{|@-}_BO}= z{2Tng&41kHui+biUgIA=yyidh*Zdp)-FLhX|9F3=zs39O+x**Ys1W{|+x$ED`LJEJ z(*KyLz-1?<)2#+O9N}v4{wv;ZJuN8J8}2h8^!mN}r@_r0IcqKUig*e-+m0 zZ*K2AS+^eE@d7P=_{%rN{VvIqCeyO*{EYoqxEZGW5J-Z@v}Un|=u+NVv)XQvhjtPr zx6eO+s%iUVb4-ic2&#!%%bzYwTg4-0v~OyK&Q>g=X5J~mKRjhW>FSCF{j2U=vM+22 zh87u@+&`ue7qpg@=dEOO-n`fE+uFvvTmAX_d)_j?01p87-BigyHKGf0OrVPmInulMhJ8|woOU(Y}63`F?(he2;=0G9334~_drZI()Qdx{D4MX=QSJH4&# zZ=gAoX8}W?24Kf}b@Ta$jrEO? z&sAE>u=l??*}eePYHNI9n_rA-6uPf?gLBnbx?#}xSp&GYaNOPYY%%Iix?vinZ~Ur$ z-`e8i-wTcjSHJnS`Yib3GuxkW82tA*t)6ZwXz`zu*rQ7d5K)c?mV4 z0c|`Q>Z*&63O>ujASYU8fh1Jlim*V_* zmO~QZD5h<|msuaC_`b@8RoB*vFND{s&eS{rVradi=~rAq7rQ9ybcc7tDD7?1#HRvC z2`I9>4us~rK6C-&VxQ$n-brg{swagjuXSX4m?MZ$aNlUn7ctbd4igiv(QS#%bmV;f#&CsGvvb z1GB`zA|5E#-oicYnZmC!h4IAo^0n1om60dCT(x!pLd=_%iSt6x0ls}A}q zFR8rUC6vVgckPX=xGpUi?QfH#1vI9W*Ejv=;-;_b;-;0ZY{K+9MdDkLVw^BfZ&$(V zQ}9j{c^QhjnxrQ7Wh9rcO#IkSt{92#ywNoDJ?A5{(-QJd4!l#t87KFY(9JVx9=hd4 zzE3A}tBJa_L|nF!7PyO|_P-IeMR5!d%7@{Jwi0AIKTC0wTErkhs8i!D9z z@)B{|3tc!PL^X4d?c8x~$5R)%6FC>&wSt9{(&#{?uM()IFqT&%5g|LM@8ZR3qm%+0~@>zm$l7IM>+!MWS$Kz#FvH^P$vi$C z@8O=Vs2nfdd4R9IiGH#|j}H9c#YW!suOi&phkNPd9bBH=+r@06 zpxmG*65rzsH%e%oMW%-1WjaDgtA&nP6K)4TACBZ zi+Bk{81D`{liC?CI|DtErQJDnf(|~O&pq0ICzw#NC{@t$z{Ca63gi=#KTU6eD^fw% z8#C;p^2%d;aDv?BdKv_#P957^`gcJN5fm!k5A8O#pr{if^%K;Kk8O7NIq+1uf zB0BPeJZyy;f#mIvMdSEH*HVfr^7Ko`k~{4ZH)`=!XazI9@WwOUEGwTrcWv3Sv%Z<3 z^iyqQ%jEg`FU4AVAK>asOAlQ-rI+74ee)~52#u6@J%{pb8! z{vG_T!(S8rbMXgc-oPLJzbkLf@8f^?1Ilb+#bSp(ZP8bI^!p$13y*&kZyJ?%mdbl0 zanQJufIqlBzShIt@vBt%;I{W#uTT5lpL*Ny3Y&KxXVw$ORSB@~_et49I9Kz23i<#YGdZiY$h2Jud+ac&cH5pRYqjb4}>0 zZR5H&G7~O2)G^nqOeP{EzMKb=Tl7%h{7@%w%uQ1RmHJ5;Oa=A}Em^#5314N4YaE!Z z_j1s386I@Zwup!Si8N<^B*6pbvURFmvAF&TVBNxQHDtY8^7p;~Ri;MHGcB~B24j0$ z;HLs^$CD@({yiW|9GR}`sLNMsYKX*q^2Nq=Ff@Ww>je9YhTezfOS2)HD?pcTBwklvgk#sVaTQy9tsXOM-d*X{JhnP zq&5{x`u)<8uOnE~ilW=~*$WcIHHke1K`v(k8K|Emk6dIx7}XmSiVbADfU667eo+N> zrW`a(p%E!&>+T-n@#k*)`~rS1FHZm2KIt0U#09u12MOSJ9^;n0l31PMrchm$gUKLW$QFx8!%VG-3B-ls1iMu9JXV%@2Racuy&eoer z5=*mSZ>y@#wk%(Ti;S)_O1iN}NiKcmGPazkYk9I}%&kd1vvCruVML6k?efZfL>Ham zYlB20XX0m)0N`Zp`E*Lavy$3KeU_23xGFl)tTa`?mYf)!v(tHgAEl*Tp(kQ;=hXeX&5W8pcrQiqDoX>2Jw;Te|a*(x_C9oM=~5ZTn)_ zBnveR;dquPKd|>X#;ew>WjTZvOkpd}mFhc*D3B`hJ)$|TS=Ou6L>Vj_8_Uw}I90h{ zJ@Jlp^H4^;9F-PWs?sdgbgHymI)Pr~RXGq)qHRGKP0Bh-pD%W-;u?p6g52(3j^I;H2cwOs5q}8E(oYv5+ zr8bdZ+w~gF+(hW0JIep8HL^R>aht3~j}4=sdFi&FKSJ$d!^j+KpVrEp#)!$wG&5jy zRje4B=e)wS9J7ny;B1;GmegJ1RVL-pDXZ0h*Ntq{CyGl!`YE)6gdZY#fn2@d2;--4 zAVB}bbS@LH0eU@Yal=@6IpHx#0_SjuI}`AMXhmzAD!OPSY?>a#2# z{lRQh>w7gCGbYa=#FTN?D6zS;ltmB71<@6h+q zd5~3asAs*s4MoleeF~InQAjTTG>m*qQRee5M{dF_S@S7#Uuju?RqvG+4)gBoGA^Jf zn41WoNK_B%a1VIyy8l=0tuAnYMWwX%oAZKI;RP}*3Nsk9C^62*e1>(*SEUB~nLL8+ zLa{KLA#Ro1Q>q2kSZW2h2db=K@a|gD$RPdPi0{f4nLXc+XB)`A*Ib_`t&n$8O5b6R;g_g9Q!UV$2UZ6<#~wS z0nKzbU%sMy{ZLyQH&cdp-xxP+Ed)QriyWI7mPfPWqEM?ivpWWg*0I)G+6DkWKgyn{ zjrYdw#zqyI#6g*DS)zA4C^vni4$_@?C^+({VO7OOu9xM8F7>#Q+&>yGma0>LLzh`4 zn*}Mk!g?2Jt~yrNs}eZFnQq_3jfQ#3t9>ceUI1OFvI-2yG8-BRGLS68ykZ*~Q4;iY z29>DEG{TX}OOA9wT0NhrF0;jo3T!X!A!aP%Yy(o8FU_yF<|#eCKzZXQ>+!9;Eg%uR93i)t5W%M%Jg85>^^rua#@B-g#m~dO zGk%uypYcy^tKTeNAU+&NAbgQ2HPM&w+&}B{^HPTZ;`iZLI zxsY7UqH|PZA1|<&eC{bKane#hQl%=!-%E`70*9u`&T1BqYtr#5D`JNL$uR(uy^1Y? z4+^Lp^1zK&K;c@8N_WNzb9ashdKIT2E0x73k}lChJ57(R@QSG;GmyP~8`Lx0QcpRakL22OSV}=fcVE@!+Y22S}zz_4=O%kpG_J z?H(U`{iwf=&+Gk7ET2{YiVT7L$+01%STwyUR_SMKhu#Od=vb{bQds_IZ3PZ;DqWtk zE$U`RovjsaZ*H?kQndH7`hr-3z|YL&?YaKwD($_hLLOXo@_R~TMOy#m0d_>KcJkE$ zo)UGv7^FKvw65M~kMSm07vAU$Ff(Kmz@2B;$_`WK4)H#SZN)T?M0T+^k4C@TN%Mu# z-+-}K2HW(loeWm;nmrAS2I>C+P)h>@6aWAK2mk;8006v%(tlME003iK000sI003cQ zWiM@SWMwU5b7*05a4u?d?Hp-y+cx%leg(sEBT@%t_uJZW(j;|eGu<>hNoKmUBIBV% z$mWJ7Rg&^iL;KtJJsc!Jf;#NDO}gdSl8EEs-R}V)7|w_nk$IdFrx(u1_#%tQcvhT; z`Jy+pCcT{ex{PxIzkB3*k>zE9KcUq!Aw3IzVy7gYjOx_uG;V}uRb7a{w_K59vP#LVrCvdGIixZ-wI~FL|(q*tki*; z*^R^)x(ZAgXJ1Mo==(Qx_pXkj;*`lthn8t|&hXuJSxCyuDK4 zeM+usSvYuS;+5liXGH!4LD#Udie=c>#1cnqKUJ8*M$<{x8Vf3=pgD3XQ?T{w=n-h2 z7pLbWkITZr@?oWg(BP5NVnaPd0yh3CySM;6Ka^pPblBsutspT?ve{?R1Zr;!Y<38( z`ZkzJ8o|&0*j^nq00X;z1|0qY@ZY3@LlqtXqXZ;z@S#BgxQl1fxR`sf+jJRM86LaD4Q5gz?*%}<=vF4`)&c;%#A=Bc2%Mrl>ERF288X0VtTT9A+mX0Jd5(&@1qXZ*?Q zPyAco@h5>_^!LUJ;Sw}!*@VX`xiALDC@H<)O2f6fG0+40QR~L+oXkGgzQ(K;ak^NR zDn0_LW_B7VN9|Y*t14x5#0w90M^3Tl4)FY9i zfNuj?=`u-bNGsQyg-ODU*<0jUnV}M)F^jRW;5ZM)`i727(?jjf>DR_b+AoTV(4yl6OpMSh__rcw*5?QuChFO8!i@1 zjTF`TNv(2fZL*0iNXkkPH##ArPm~)*(J&II3iGSLuWX^Jjue6F2X##C@3m_Hirrve-3aL zd3*_6pvxF=o&iU(l!Q==#sVk-%w>|LXOuYzxH|(IqKoAe=%K)CQ94V)qM-4dLgy$; z0lQ^dgmXe?Sz44dz7X{1WKNgGIcO=?lyM5^$0_Bu3pEg>X+&o6MVL@TsbI8S#(BAf z5-`hfnUq*V@;Mj?El8Na@RwNYTOD zfD%G6G=sRp*=OKvHlqZY&&WoX29%O?c|p_gf)oojY?&jbpd&Q8f#P_kY6YV?1UILu z4wF0+7Za_`UDVLBWAuXYJjP5_b?$q)P-#Ued9bn$t%(*s+OdYkPH0z!%3-TXPR__R zHu3#2{CWL7TaQV4moDqZq=02Sc<0#QB1R&l4tK`U8jr0D5OB;wmnF(KVBR;-mV#NS zkQ;=pLxzjiV`D7Vv28LAoacw|=lc`(>H7hle1gxw9l)ncMd_HAjsw^2Lnq(A>idv9 zIM0tKt~Wdi=$^Yff}B}svEXw^-ihY82UvL2_npJ%%ZVR_qxp-`>tH~y)tgB<&F4Kk z1r&SZyWqk^4kbOi$C6q0lkUL{ilV8n^15Y!4hF-FN7|xT~!#c7agKOBM-_a-V-G~1X{89c7 zVjkcZ{VzQ}KBo9bALHLKeR@ov!6$w_!+*SaMxWAW^f7&cpzsg=K{AI3_?UiojG*vi zbWES%_b2?A0$U;e$4nqIjLVofVHAfLF0vJj-8*^61?GUu5Yxb|cmQ}(j_45nkKo_i zX}B;ash6;?wE<(|+y=V?&Nl@Wtv9~4YM_M&fGEgGB1weoZ398 zUOxf8=j!-F&zQgTe0I$YT$|HwJ3(lueN*K|muDyT9##X7t|dta$WShFlyUZenwHJcm+VxK`D5wgdWiRPbK zA-|Ljm_te6LzqX%H#ZM(_Xv?nyBIbl}~&qocB}3Di{>iS2T- zNT8PO(lKpx81DN+m4?xQI~2p21Y8f@R6N6?ye2Ua*w~%y2ZmL8gEe%l+MDghyp!7P z8VuXp_eeV`Xxh&FX<+U?`bMDG9zZ8S?xoB2 z90U?$Mh$D&swOu3@Z$B!>6@QFoV@=CU#B16{dDs42kV$=!9>hRnvWW4?Bo7fiQ! zJ9Ja8SP{6Vm`63;?Z&k_R*w}(m6Kb4Ljl&~E{p%>o=btod@lD_%>6J>AHkV8atwhD z=mk$IfeGN2rQ#TM)-~-GOL*Vk5ov2+9T;|#*CYS^ov=5|X4QxM9w)-z_cn^4HfEX$)8mA_bHSVL>deZ{>kOypYvuBRpswTz5*6c;ZP z*Y=9%|Duz8 zUG7&eytit2FiEc=r8SYt*rZ!dosmlw(0lR=T zweTB8wSQ*qTTh;7j8|OcF?i0VEi_t7b#FGUt*_amn_FE#wqcSTa%{G8Q(%G~%ly+G>dRO7;91CShgQq;Vy5tixLq6=m7{mtGbN1$NytoO(={3& zWGSDUH?qRIABo!N;3_8XR>3x8l~sRC%4{1Sy3~tqSy_$JFL}7A^r1LO@yRGi0ZorN zwpI_-t7K0D05`y|S0fIr-l}Kbw6BObzvrG<~~Fd8?^Us{tE<0G2@XFTx( zf91P@vSK#T%s(*p#cNZp*Uk~_mEDlnR(w@?+r`TUKPLx6>mV?;T(vO}jNOGy#bFre zyuCM_4?^Z6^PQqsl}WFRCY|G=^sDnQ*E5nj%@Rtp-Skg^W*kwDD%ZFbhp>k$mG2fL zRTe7I&aB&Njk1XVTmL&$g6qm4qv{!F91fiYKG}xeVyl#?ktZ?7ysh<^BW2S+%4=Ia z`h(TT_EVe98LRsoN=%wHt75Kgw>4$ET&$7m8@N-Cf{S+^SKaqyLBi4j=QK3Oc7qJI zP9mBDT>Z{Ah1{1^^LW^0WsU6sX=&YC0@`Yi$?8@^X4PgZ(>4p*t2XS?o_aSTt?wAL zj+3Z|1r)xvQryaSvn(T=e&Fp~1MWB~Zu6aPI(~Ae+`&&Vd60)G;mfRycHbKeBzSf4TUCuXVHQ{!pJw`7m=TbYU z2HTPNf-@T}LvguU*E&S6V-yi4e+`jYuJ(Q9=_kyi-j}DI5At3bD*3~&F&q;1wkzNjY zNLs`ZvBH$Cj`L1ldu4YH5_J&jHG2#IzMfjz3x1$zFz8|vKY(&9-wbpem_uLnHlg}e zLE>O`7htPFr8&^m8CTW%skOfqOpeZFm@G;4upq1Mh~90POTru#lz3Uv00oH;8a5>_ zpG)b^0@%AmcEJHvW}t{b!(PSiQaWYCy~DlIJn6^RIB&f4jBn@1 z0xH962=aIf6a2E12YIzpA0gCker;qZUYm1gytd1q@iMTK72iLzZl_#dZ+`7)2{zB; z)FRB~zTKo-Qt~@x-t80Kx<4A$r-ZaK-K}#Wt(Qr5pQCEL3G}X~sQ5`s(a~qrD(rCK(^Qs zBiUhBgur@Q=&V|=^OQUvYEo>!*7MOCRsktv$G@fi#GQQdSAG!m_b8rcbo{a3cgIJD z&I%jGpP<*ozYU=MisBohK27|>@8f;nA7lR-05~#4@|QTm7p4joZNC2yYysM^SDCIm zR;$buwm(|i!GnfNH@@wXJ$53`*7CHs@vukLb#f4No=0LBWZFvJOMFvXO}zvm4z9+{ zXG#Phg?@2-99gTJe2qb;IIR7keiB3>b)_HUt+>v!(F@?rl$-(Y(#SR)rfwYK-NbbUpz_k!0aEw+)Lv&`&3Q_OMBH%17kq?A5cpJ1QY-O00;m80002cz^l|<1cx# z|I@+C$V2DqC)as>l@ulYznIquWm1gti+q?O zjDC`qSu)GYNnRuVv$FV*kKm)eN^9!JMKK;1*ZK4^85Yw~j+H8^G|6i0Sb{$nwJIqt z6i&lp1cm2S4gIN8z!jmU=fwxik_1t3l4M%cK(sy-$}6BB)B;Gn<>|;l3)&ry(|nSZ zgE%_SETfA;2YNf21B!ncMv3UI0X8az^GPDc*cnF(! zhV}AgmQz(MGEFBLVrDTEAYa-DU@;n<92g9GA;1=81?}G^=NU2-^ruL&=?GFY3g zQq)-@$W>RYJAg4TXmSB11c9pJqP|Age#7gQxpXlP7N=b3fTTeD&t&;HRHYlAjNsKixk%PIg~Dh18cP zM+Z+{pBzF$XZILtb})k`)5|x>{%^02_K%N~!=vQj#jEEB01p~C+I@L)uz%c74qom( zfBp2}e~Cx?A%S5`xSre<>ZEP1hiwD&Xox%=ec`N7E>Lg(4R z$xCeR8ML>XyxKiFIoNyseD^4M_4?@5AxIDC97&CX-u-QGc=VGP#V7lK)9#b!`vU6AHv+)X{@w|8z&LMjq3>>@3W zfhYD(crj=aSmea+Z1Qsdr{@Ph?Z4dH#{!24=+}ee{T>X{!7&y%5H0_@3(dZ!z9UNj zZsPNRsHeELPlK2oJWF<;{&Il$%knVt#|M&2hSU%^-MIO(Lrtg|EXF2}`rI)+5M9!^^j#Pf1W z6L#mpU9a1NDi89Dr2EhY_}OPkeLKrQT9ny8=6RX@UL_A7Lo>L{UF6ej)afyR2nAby zCo-XF-7>5>^Dzj~Q8t4`X_nrOi*%&W!Iot^q8v4{f+BBvxuQy`k`g+|xcm}C`naca z@#p3a(%Ec$+XcA*X+W00JSwhnwYwzwTS1pqm23=R?hgwJ2*#=yXM?OPi?X{iDvQ|+ zCA&oLJR7FC@XCH(r`7cBN}Z&MKzXpjpmT6_3FFgcnRoh2QBb66vS@q<<7|2fs{s&Z z%k)?h5-5#?-7)nZDmn;^D^5fw3o8F{x8vnX&^%jU`yf>6Q~*1J(lTl1L7**GY&sv0 zf%$d>$4LI-EHi^uWLh7L`iWwmVLBe4r^EN0Zw}9Y&xZ8?mZrKu9valeu^0p_E%~ko zWCN}}EvRs^TbAkVS%=dEk$?u%3HJB&%#Z`rg`|tQIb?voh7(Evl_RnPIo~Jaon&=2 z?>TIQ^kYl_IHDl8`9J;=8dUF^B;Om=&w zF!DI^?vr;xGro9;Lc zujbSDm7YITt(uMVnkwzM)N$})$Ou5E8)v;_HG#VD@4~{HXFX152m9ewTJF}}4HOhf zXW)s3^R&uHvEGY3 zpRH1+%}w)Wx=xw27=sSX|0}5+rK%_`?}Z2EbVW z83Y9-Am~(2S3={J-OP%zc9&(=1I+Ojf_${i`rP;O=ViW~tgQGMvbk;b;g^_!AWJVZ zXrM0VnU#IVI9Fi^f+(c<#Y81z4kg1F`v(^Pofa4%xL?xo-0*W3VE1(&G0_2J$j+<( z`6m_~$V|IN0}la|V3koe&R`?mj(P6lT-Vs7L>e-<#Iq(KO}+CVitKx4kAWIx0r z1F6gd@%Y~Z#r+`-TCKInG^UE(^gwTh-ZfpohAH4`*vQ&Oq5zhgOjtE!hr28Ay$=7a^pn#S2^+pwBopJO;GLBOKC$pPKVQGd zZ;J8gyezJ(tfWFJXH-o1pV&SAV;%gYZ z7h>@2ifmM&9xEp59m$ckE4kwiHGdIFs=TQE0{P&W*uVzB83Zb`ayy*vA)Y~^u_8g% zamp|ba&p3qe?En?FzUewU-5 z$;LZYYKF2*+0qA>S-n5b@bk&-!Ke#W+#O-&Y?|sTV0E&V2_%Q}`eZ8VNwq;>g#u=f zjz-V(s?LA}dYju3^+EAKYAfh=XP^_EQ3m{0+;*72iNAzQAEJ2NhYzI8RBCXIxDaJfuci4HPRY+Js^_kW35`OYpxHPe}Bj2H>Vq zvyrmIuqtAUVoT!Qg%p6`n!bcSP-d4TV(jhuvYTwU4HNou|7OPQpO|d#;cDRZKtW8l3&IL8yxLBr{nV7Cbi1fD z0R#%m9J@H#O9F){-E4SFrC~9FtaMuMLw8=zhGH2?$J9Mx+FkGVe*96`98NdSXk)F9 zCHl$wdNRDqhVPUA#2WvZ(Bg?Ed=SyoVmeF9Iv?h?|NHvojzc);1d?8K;>NL=u*vuEW-wN*vQ1&P$ISdq z_`xFOQPEwN1l%AGS^WcH=`PH~6xOH+gCia)adV^12vgeAms|GwEKiw4Gt3fcV6n9Ys>M*n1x}c)qAO z?RCd!-@@XPMa4lS#SO?vAakRO<8u9~EM^5dAK|RsKmHOX=X5xpW9fXF>>hs+fmy*q z{{B{V@K(YM(@w4gDDKMiwx8s6HtCc1l51zAGh)VhvStr4eO+bJJ63OyUb*U=lH=G!^xQaan7V75nubx; zT`Sw4Q0di!wLh8Fx48PM3}I%#P1Xri+9zj{P7F>1jjhH2dmbuS=m1B#dN6X^=9gg=P-4ln<57KlQNmSt8!FpRxu zhg^(!l@=6A>rY7`N2hR?9Q@@MU5S_GQw6?h(kP&_fCE`*`qJM? zc_~3T#6{S5O+iD3A}N_- zKwAmwKJf)i%)C=j5=2j*WUyc{@u5G20wj7SC8pHnOb50$`1ZS1jjwxLDsmjKQG?AxxUYhaw*(8?gP@fX#>KN3aI# zn_W+CD3!^EK=c3>tKb1VYg+dEASaxq-%L5Rv6SS%;r(`rfr4Ec+QaZ{L=2NJEtIoz z!usWJxd9Mtoi{=wXtL!f2kD6=9w#C2cgE3_3MpEL+7eJU8UcLYRP{w#UkxVdjhv`3 zMTtZko_WjXW(2;#I%zgjbi#abqgJrt(ht?24T;@jK0X|eUJ-X-Pgf<-c=4CnwJ6T&t`b?-7S{Dx!oUbu5(RfJK<7A8oz<09 zYrz3wsD96yk^09F%|^Sy;j;bcg)u|p9(11PKOEds)AlOan{}eVVKrnu#b3bi%-qmT zhkl53=t;aoxg0Rri+pWuC;6B518~Hy^u+{xta!IOEdVNPFF*?%6}|9SVioixwq_z@ zipH6zCA?RSG#}7CaBY&tu}?CAV^g*TN@6AvV)9OH1-ei=%$i45+1#*d8wQ=J5fz;X zn)9hEi=?4cSGR;^v7-MgT&+ZI;*m++;{5lJ3#Zz6iu}Ok8E30~Ufg6O zy``1LmQLD{$A5IrtFu{Q+%=#HE$xs`V|RmY>Y9Ai%31G>S^|T#pPGZgNH*`WOu|i5 zvi`Za&pZ2k-96VV)b746WH-dgo;4;_Hon01k#!3%n`o+06^m>liwM4EY}VL%MtVqX1=_zj7_nsm^h4@+Q@ zCdM|u6XLv(TC(7D#c*LjLq}qW)9|JE(KBaqvvZs=FY+<0aZwpaxt0i|6q`en{}L>U zzfZ!Zr;e2TfY&_!-(c6^c1PTik<1xBI&nE!kc{zh{0Ie!E^e1nrN#TQkDU?OhpfDf zO$f^5^MMlnD^7=xnF{|+*_(VdS_s_+d*MY2JB(%}ft6;LU!v?-73NN6D33EE{{26^ z_}_*XKaLd*a~ah9FQ0GYtXO6k>L|vHBA2tHNYMi{ z!*f^-x|hh2EH07^&(P)B8by+t7HSy98Xn<%!}L~?>j@DIPx1phpj1Dtdxd9t(6BQq zA{OCBb;fEYD8OpNJAiZR8kIX~do{I4d%*493S z3|m{vW5<~I`{Y9r#-@b`^XR5&CMMZmEv*!WKzHsGvXtmjj>dofnRHJ9kIggf^Sg;B zs5mXxHhVF#rm8>oT$j65F~`wBiH5$x!U6sB^~9BG|5}07Bs!Y}S4et9+*#H(qto2c zR>HH|mp*iQR~$_14DUYjnH?5zc(Q}i0X;VIWZRtkZ|GCu)g*U4xtHHMNM@x|IWgP~ zJB2*T$1dk;hwdoX>MII1=dxr9bo9j{_T_LG3v)OTHvWH%i+NX6kz_&Hg9^4qdK=2?>=(_ewtOoGN0kKes*nq z|LEx5%fpxN4xjw*{k;>QLT5o`c10n@dkH~3f_|N8FKD?F915=bss)V+xk7uWhr;;n z*z4Lz_q>lZsk0I_8R3tu%8fV$lRuJd3Uj^0>qjD9S3eOkJLW9S_VZ7C|Lt%bIpd7) zvj0wqv(4mq>~nCyW$jXVOmnYlpKd!|#mcUD+^S*|k~_Yqo^N| zBGIKYZWjIhN>wKG|8ON0pFx*jEHD{tb?PHXaHw*SKGP{XE_5Zx z_t~v36v0ab(cr>PhSk6gjHnX~9?Q5v2?2%%gW=tl3XIMlc-KL~>ueJ=KJgqc+@)Kg z=qs|68!3<(uVD?QQvPW*C5yvq`*MxWv{tXjfqeV6NwA3Gu7he{OQvAKyt3BhK#96| zUceHRDMzAUk%mm-`v`0<2YhO%a4m*?@Mi_Mv^b9soJcX3KeR;3?Mv&%6lDu%CU*lo zi9cV zYAj-135#4a)8tU7x|hqEMZZ0|Y!u{}Q4m(?O>Tje93XBLz0&2~g$Re;leB!`Nt&5! zu%jZYo^qJCzZT_tM@rV^EgRnuCbt@oP6c}b$QXC}Kw}>llaIo~!VEM(yd~ewZid+m zu~Y3UFT`NWR;(hgC)MFp->8f9Rbv^2@RTCeNybw#s1iF=JuKeL#uRKwhZK`DNnDfZ zc1HOJ9nwQa=#F;-9T{Utx)a_m_e=)K)Gm|`A$K&bt<}yhgzbmH#+CnfPxp`ajt*X( z93J65K!Z{W0Qt7znF)G`$*ag*Q>$N}=~Dk!ZCcbwMfNTVH@3?N+e5mwWPIiL#>NJ3O5ob#Y><}2$sP2_Wrd~N<>wL+E$*SeeQ%|^HOSaN zd>o$}K?rvO*VOpE>_#~_uwz=p8>*TbituFL*-SS+#NcUP(bYBgHn?tfbWwW9ybM~iS$_y?Sc!^ z9A(=A<1>dcZ}htMSh+)p&r@U=!>`V!7)#WhUtT^RSTFOQe3Vzmz=S4zx|3{QoDymA zmV)kh8sf9E_-E#FiAuH`5^48sND}3I?9LCKWjAQj1C6pMIw}*DxiDWYeHTc5(Tg-9 z@*V~>R>|^6-m;`qcs;jas=Er6e_RQPEV=%wuzR+frT=z>-yS!-b6sOz>S+NSJ)KXU%r7O1<|J|?^XQo>tK%JI`s(!EbZ#|sbEQqpO|}htZmwmj zb2CE*Ker6CD|U3wS)iNG)v2pa(a{8`uwF8Oj<{O>VaOmXu6LY4JmT^hWNq|tSoqxF zHfOGV<4{^%`>4%a(2ONFOggWX4;AkQKeaQv?FO$Y+4DOJ^{=SwmpC@T=%WEJm-w_oITf;=h4ugBA~XY!>dQH$5{PU#iMs(OuuzeA8hMO zF$hfy7A0Aprgb)$7S{>|^*85d__G^WQILzUc(;ej`AI&}wo`r6_ZnHF^Y&)rJNR!G z{(A!d?ZJOf-`;F(yuI1ocst+x`dj?>+l~FV^R11I4f=PJ{@tQ~zfiWB4*mHh{reUD z`!)Uh4gLEq{resLyNmyBJ;Q&$f`7k|V7I=tKy5+cXZz2dbwp&UhhD^K_?zM>URU(l z)dMB^b&BEkt}*mNN8NFzC<{>ZNp_h}k3=L|VOy4Qf;)fLl|;?YJIr?ktL{%np^Ci9 zBQ+nx7_*@hX!~QwJ!13|T@K8{C_a@@6Y}b1 z`ck7eHO^Tq?t-YXfkIJyb~o2IdgjkH`kQwX;Xt(?pc0H9hHw5{c&A*93lMqQQDv$O zwbr{wQ@c;Ng5{GO<9BxR>1XfDC^flb5!ZSv2HVw|PZ zNG=G7^Q??y$~QA8r{@k@LkD5em)H0XFVIm)u#Oo{pE?14V|2Nbkmd23$Wq5`2CO8g zE*IUZe4q`YEGH~)0u9^P$I*nsp3Ieqen`E*f#P2lgim1XQ$hv%)Fl_-Y`;GGmmnR~ ztfg>P4s6y*TA`Yt)haQEh!m&;&E6DvIIEKL0)2Xslj&)B#khv^LaK&%I|Vel4;VD4 zvs$cnFzkq}Wmt1j?IL>O8M0_}S@ERPCkrh5fDLHmh{$=(7)kmYKCklb;(FXzD8`BXOWbC&Y$BR!wOhT|dr&D7puV&1i} zWDY*wafPtZoDSdS&711U?MZrxt`pr3mgw{_sD>=2V9ByO=9#X_KI7sz*6Af^ZhBi{ zFbJHD0bwk+wpgj|l-{LN)C8%MUOFzAk;6AEC>TW{4qD(|Rqc(_itFgzY%KLn?)HI& z$S9YM2lNMfc69x1wYq+3KY1c6Xm4!+P`tZoz0;D8Ms1J~&ky;Cn}S>ba3paT+oABk zQ~hA)9mhaMrTXNQ;12rEaV1d&9SuTMa^##S>OKUEKj+$l(P|Y~8BdWwPy}NpLo5;* zOvKBpNylN8y12X?e^MIBP)p2o@b9CSz{I(>+=htx1%+1g>hKL&OKP*ZgMpGbgH~A` zqWrWNp;w{;+gEYk`IK>z2o-8p|WR2DnbSLr=ZuW+pd(>dV&a=A8 zGWGVS7V1(aOWCfwieg$wyyN9TI=d4T%=m$RG^jtrw_Sc;_<;u_5=-kWg7&rI_W(T%0W7=+W6>d4V>%W>ByDmRe* z!^teZ95Lj)_aZ9!e3Izb@!ZMgqob7o3-XVl5?!MpC?2vZZTpopvoWt-fpt2YWz*3f zu-%9e5&QfSX1*Hfo-2rh6wrP4go>l=k%nhAO#p(zh4J3)m>8amn0c979N2~zf;<3# zVv>=fLFQBRI0~wT-4)DTVI;!8L6G8RXN7u3c&|7GuF4EIg3$7PD25<{1XC{|{+f^K zD|a(=0vIFRkdE9aWdov6(2VGFrf$3(jya1~|&n{r^0?XzGf6QcAD0FdB zgE2u+Wx;`X^piTH_wa$<{+v1Yn?HGXPm0;c_x4Fq*Z4N93&-xQ=nU^J^0jzdaWG3S zvp0tq7Zts%!5^WLJ!PbM1!a$iWicKD_MA8YTZIqaSWTl~kq6qt{mp@U_kc~cd!ns( zMCZlmc2KEWp9c33aID5{fNW?0{2m|wp4GU;8Uar23o+`RCsqcMgI%my#&*KD?2o(N zDS@FqZ>Qs(!Lz&Y54SqP(laSvVqR##>W5Z`1zB3s&MFR%x(fDu9QIQY;A-~jB?n%P{h*C z`M4OqSALk}BtNeg;Z8*q?pm+H16|A*NG*$UMSHWN%4_kiX(v6eiZPUvXo&)2F`+tZ z&}oLVRF6Jn<;9pzSUOkvXp~K@Y)!B&uV$E5E|oUFa`R&J5&h$9DN&Wb*o)JhS($tj z5f&twz`+n;4rW>$D~==kDUMx1B9J;{QJ2$4@F_c6!9W6SK+&lIZ}hQU)!J$}Fa=rI za%=4ysIzi!=yz5r>!#^73%tAK6-#zK87GdlAy*lEB4*nBMqBM-nvrfwdzjwN`g)^B z`i|VAOSPOm2CdstMPQ9W;eo)_`H$$UmSEY~-pyy)WGL6@4!$V7S4?Yss2tCLV=Uw@ z))jldI!F{!!)-GdYfE*tFKhn(uBU&j@%6Z1v=awcOjyczDfUZk|_J2?`8>vCaV6Tlksx0(-w1 zQ#$e~B;ANzL?^3qBf3z+N{kBe{xdT}sh7cBg`l5^dtO7w{TwF|=40J`q?ZB^9PL24 zt_`=JNHJkq_EZ~noer<4x@(oZE>W^uXuBpy)r3;RXn48D2(vdT5BYZnuKe0z^TI}{ z+bO2>vK@6u77uRu>_^y_Cbg*EirRsq%Mg5&1qtrv***7(2lG#NCSdfh>S9K4EJ}D1 z7fPY?R(hGr0y|c|^qYJt=Dp628_*np!N!RaZb_s4dRbk)epMMOHN@uy$4}5R_Dpnia&=2-zZc0%QcxIEp| zAcp4@8Xxk8bvgc9c8hjKEv^Q6^&$~w(4l~MMA>Cp`L?pV&JylFqF5>$k9u;?}zaev<&p2>pQ{O2nFRKQK&O1fFUrs zW0T8)xDdpA1^`^zECFO(RGA#bFd!QezJ_j%Lf9oSu;RAvc5~fD{f*XM*iqI;!|;|b zT|nFXG!uX^`3vmi>sd2*)47Gq?F-ozYsLB4s;@;sXn~CmVn1;r#I*z^$5eJ*L$SLb zTZ$ac)6IE`SbMY=!HD3i`GhN+ROr{MEE|XQAzu$dX?T%}_zlUoX45?m)pyNT+29)6 zdYX;vG;EHImHw@{xEKQ}{u^MhW>;O882f@#mV4vYc@wDVp_9R!`dFgqOfR4wW6BM?`w5)&Yi~qk7FiVq7fK^}|Gb~%%OldUk#9u&iUFNfK z=H`3}IscfaBat4oH-u>g`@3nU-y{cIg||yCQGP5@xA#$gBNKG>GP~Zx8p&f5W-gOf zy5H0@n7{RsACj+-)x0uqRGBwaCZwYgt+BFc&A%AQ(GK-z^)bfd^MDiV5VR~UPXynD z$_SJwwv#Hwx8W+AF0U8{Je9btC7X26@%6@rwPta|RDS{icLhn&+NkKfogOnR^9|MEcyzEI z@jSApkC~s5*<*EWYv&_aXy-5Ip=HOlWxb{$P{Sa&3#Apipi)lKasJP2ub4~#@ZazP zma)TReYErK6(dXfUZvI5!N_nCc`I2%JA-d}DWuy0i04IG3Z;zf*}~S<>xFjM_AN5m zN<#bc2`q-VFaI&wOtw)dQffM`MdB7ETI8Yv)m45Wi+suIsa^h$$+wg$spCpf7YS4C zQy^iwWFcYZizGf$jczo(IDC5W>|p=s-QV`#SPD#aozwkjztpLO;ROPvM>jjW!C zmRSXJ8RyjLcS06eNn2+G#h2;epz*VEFpyK>= zIqcc%mwP7%hc6|E1zkPucK&L8ijxC7x?Q!${3g8a3m;>G86|;(3c9kgHLX z#9t6@HjtF|7ll|uG!l(1=~LT9%ZQIsXmJYq%|T6RQ+*{YtYq^OWcoNd@!6=!<6l@; znCSTTi@U3#IV*UiGnqOY)QPTb$P0?E==PBVh#Ve73gwMi?||R+GDqKfMWesuLKeJ^ z>m8|hmahiF_%R~y+V`GpKKB@XyV2%mE{fs2nZhl^8E;DT(RJ7>s``Zp=0HLwsz;Oj zG==$6sm5WN-GDYr+d+-A;azCZ_VB=C7yK75^U4!ym5GhX5EJs^Lg$}ZS*%G#cunT5 z;W?azRI}+9n!!D@D9lK!tqfr7X+ELeiEMejRhF3)|2%3@>^eJtpVw_l zPO3JgieMqh@LrdC9`mZ6dTE1mXh2SxUckMOSN2%n(x%OR&&-U?Zy51o{u$EQVhQ(* zqL?k|c~Ou(sCD*X!f9sWR-9KXMX zZ`d}#=hoJj@cjaW|BB(}zLAyy_Z>9i!R`!6yH7TOr&HX3BwO%RP++G{f`8e?E3vak zzNAT4r||i09}jP7^;LgO=qrebrPU@bI^W`jht3liWqPgNiK6ly<({PHPWt8-n0`bn zvzzrDX1z*5OglMS-(b#uHFVOyz@1~~IMDnTUkF&2+3T5`^`**sN}7(H`4zPUjed6We>{c6)OZn|kK2>r=NltR*b@Q;d;uM6kgL1^) z`8sms3&3V20kN2Ti6U}?zM!8goA~t=bZupezMwZNU(grU_!7Rp0)&&5uU0IazCz*p zHI)P0R=%Mxl*-@I7mDQX=nLD}!LP3o@?-e=`YVK&+VH-{y6035>kjD)F&)ttLc#Sa z`35n)pf7}X318oAA-pRa-Zy~sN>1ev)8FX}F?~;8*xH!Bu(b(&VQW)__Z`A3Y;p^M45#9#}9=3Z;<*?lw`odn`;@5ZB+COnU z+rV#E)auPB*{#0(%StZM&YAc&+HJhZHh6YAp;kEAE&o_lqZme`(niAua{Rg?q9&?>4$J|XOa_Ol$x(0ZSx+vChY zyuyi4oc|6a#Z=WxH-w&*N%P|TcjOLaP0FJ`0yb1A=iR#YgNslv926{U?Gg*z&biO{ zr(!dO&Ec`$lsrFp`T93hLh=7{fqt>O2PyEc{QK8~mroCWg|)XMzdDYyD8ci%mG3RR zqb7C2sWBQrdzMMkuKqlq&TpClP!}RrO~1743bX#OAUf0ZLw=b$G2sItbPAfMy7XW+ zPHW)0$$;Vxb=N29@K4wr|2anN*K@j!ciJgxnB$!@jArAC9CGAOalUAn$OyZabfLqL z<5%MSZb4_^9cZG{>`MtA>aHZDpL(<||6=@22E7stD^+0R7#I*q$nz&UeH8@^26Kh?%NS|{Lep6&#?F6cJlXl z=Es_%Qxc7Mp$<*F2cqowUc9*d3MBzNv%2$ZcK)}#RvL{Mzj>pGFpJ)B@-`ppvPq7y z?^TAhI#uf99sC1b^7G}9&O4Q03gAP5OBnr_sm~t^x-Atn3(C=nUbT|LrSfs8`~sM| z;8K@0uBt3vpF0p?8=X61&Tw~n16@{BC2v9H|7_I`umn`+kpX4+K3G+E$Yj&%@=~ZZ3wYB0D$ajlJ&$)kXcm(mOEbnnEDi8#KduHW18Z+ zeG+Y4|0^?)j-`0flW1+Zk;2NE=2O`_QBXuMkm>3kuw2XOWn*4Rf3tiAh{2TmOj%tM z0k z#G2gE1A)6Sw&j+g(9tZRcY6e^Z%uPfTWD1|q8I{m69vz5U6CI)ig~*@8qlISle+i6SN1lZuElI+3snF$@IPpn=jR7VNRSM z_Kn(fQT1^3T~YBT>NZnVw2nHn_!?XVub|!el(+GfuPXS2-C1^=-LAQgb9am zu%UL__W`iWUb-1GQ#p7?{;Ls_HDvL}dYQ23;5{4d)^z!S6teNipur0VXe@KW7p{g^ zw7U1@a1~P()@zS4T&Lxh@PP9<%srjBG`zZapH1_BX65VID6Kir6FcXgn4YBP#{k4b zR;J$*>aQT|pJRw<53bJn2*^R|s*I)KDgd|udQdU(o|rx>K?!(~mhZFD2W#@~2^~+= zBfw48ePN@M?yR7bWEZy1x+m=2>9nZHGsS~#vhE4{@IzK!m$@}d_U2_(lpi&jb*M82 zR;PUe$igka0gZ_owkQ5zHOq#zFa1!6AFDjqD@s>tLP^l89RXVb)adXosx%KQyP#t) z9*LIkb^%XfD~h=3!hwk?iJ}LBZ2ra8_UnSJ)BBoiFMzUH5DdB|?Ov!hEjeEM&e~y+ za59#}WSPY(LKC^}D2y~+oqU6sF0urz7B6}c?DXp84x7%n*VwgNE*o$Pags{EH%5z= z*$6(kWV*Ou+P&~-T9jk$o3+(L!(;`qu|#PUrPk|u1VOVtyZD)$`=i%ZF^D0j7kCdj zo%0dMwbU#k$Qcd6Mb6~hAGx-wiH{sxA{k;V_5Mh;&}lq;9OcBIok~JA3e_TA%B~PaWRWK2Q^(ed7;)^3CfY1Qs+~4wL*>du*GJqj4X#@E z2Lp4#Bc%&r&AzK1=3NhpKggjXc2@%>JUJdMW29-kh?Z&5B1Wq;-YUAj1E zD@W<*_jy%oUBQE-3(iUVdNv=A{ehI$QpG3YD5dXSz8C4+>ce*QG*+2y_HC5=fIaCl zXitint1KgrW0ulU&J+-OB5X*U_o}d-p0>zKPgBV1^qiGrih5{3gf@A|P`iSjD#zUV zS2aZ-1HZaF_s^c?<7^)$^+F(Pi=Z51^aE>f-PgDr>U(5cKzm&$WF6!pvmH!X*auZ+ zRc<|j-MuKvVdf1Z+aVlL6aeEUxsdg|H)BV|#0k<*RrO&Y zT?>fnmPuivYQ=u?m?l z56a@Yk9YtNkLQ!A_;wOkH=UN)k)DP8qY3Wl0aMk3MYuHAwtz=3QL3&JO#gh%ZX&>T zRsoD#C3u^_;Vrdc_D6 z6)DT{&8ugam5ti06$YNJ7J_*`o=1=Q95`4s1frNeYa*nP3>uN}@txJ|Bi>ninmcRP zRdFpQU0iAXkXLhx2=L4u2Clb?%i_TfK53wm2(k5X9dtsp+Sp&^qpWogpRhr4JBS0= z39d{-+x`&e24^2&qh-^~GpdI#;R_EW3@k{27ScN1vGSA{qB4V0cu?^I7@Ob-FTPtN zLInpD$qPj#YQ7=~IzS1q1ri`rp>v@3c1|}OpM#cAb%F)dMRP1*kFmreahkEU@kot> zDXb`YecQa}qE_90^%a=r&6pFd${+M@h%G`^{`erG$75g&8@d7&U@a{xyk~^p*cFBc zN5nTswct_pR?r(;3BoOg0;d;fr{e)T(-IB-7HJUS@fKNwdu?Z+H*6t6WZOf6%A$j` zX#ZeZ7x(}|Bou5!jrHv@Vwm*`zB|O1o^jM;qRF)_1*KFJYSS8S&i@>1fkitCoTdQp zSR{2iZCVY5xsavxu2k%q9*T<-8Qpex=os4ailT4|>hyf&=!)qU1pkPBbpjiqMDxzH|Z`#YM!JwUDL;YveC28J7Pak8E?4DzVD%kKqqB9`zE^cupxARQrHO`~eE-<=73+)YkDU4o1~f*A@VNGa zgXeVaq3X%1i_2o(ViR0kFBm++hubIT;|wOyK1^O)lw4mG;|yoMxMW}t6vjP0&Zekv zeaJ!u1YXp6G;5^bAys2eD4}jZqB-u08Tyz~$E?Y`@>m?vul z4D^IZ6A7AhGhSvQCMRPx}UBa|zl!xNa>8>uSQf9}Wr11@8HNxBdMAUgZ^x<(deTj!xX? zINrGo*=kD=Eni&~^D!#RBXPr?=ELwR8@`umU5$rO)jb}UI~Ufdlv`>5WO;kW>M4l3 zQO*0BF+(=UKruO7cnY!wRg(4f6a8egACRrk%SWg78{fTJLjLKv0;0DK7 z;|z)AYe4u8sE_jL#@V8+Qd>xyXYPzsri6BcfCdJCAsO!7|8QU1Q!Uc)*1a13!Y6V- zf^icX%sF*N*zFDIZ6cb3G!H^z45!t>lutka@e)cu*BS0C98}{R#Q#R$mLR=;5?uy- zkw$N#Q}vUAjoa#GpI!y=ZDqoD$Y}u;=zw7jHu<_wFXxkUPZM_mMPjv*|unZxUeQfZjm&pL|q!sMI`y~o+w07Wu6V=J})4#v1 zlraX83LNv`kMn}I012%6Cexc{e;Jb$X1P<1|Ha&b%baTU2h9JZ%%dQ${T1B9fCt#e zQH#tvK&#gVoq+d~JT5~y5Wx~h#dT#bBOs9E!1kH2462eOh`CNcB7Se zPg!!k2UwJ$=#GfWvLFJin!BT8pv}`BmQlukx2CZr110?Ajciy~u9&9H+bvXL)J2@v zWX1g^E+b8}@Tq2-03U8$Twac|g`h2%PMw&uG5HT1&obLDt-^#RkJ-x9!^0jb9;8R4 zffhc(yooUKPs{Z3DX4uG8;w+A6Z*OkhW*hMf*lAp(gJ(>x#94UI&0W6uI0biMG9Eoih&??R2nM~|NNc#)Qub~NnD&RRHrtgKfz zI)ah5+YTXbGu%N|Vo&)N-K&cppmv>XY`;x6{dU70J(6c99KJqJX^@<%Ob4U-%i_VF zgc@kE9%%Ssw7oM2>%vzi(wgu;cLCtpsjL?4M{|oUdgQkl?i!w^esuS)LqHaFadFEn zx*2XcE=KT>_t$)M>0DsLS<qlINU@4rFz?*eR29DI;Lzoo3hX%!NAVP}e_K6^51-iUS!u zKXs4QRL^xg{;07-z;~`^aX4mH>@`j__WqJ>hHXrcHAs}x~S`0 z&KQ;*7nh1zQDx6Fw7N9jx@}E1|4ROSJ1gS0OU{ZoZBR%O#nt*v7Z(=`q&#ABE#3=U zHm=iI-@Qb`8n+Ify!#taS$Q(cGaz|%oU8^?*WBy({w*Z#t)MFP6F=3u$?y37w8Rmx z31hi+A1t>*SO#%)rk`-VlGi&B+2FZ^e$=SRd$TBW*cYecqviF$_F}_de?N&v%Dhiq z1~&eqLGc+OB{^VOuR-}0<9;a?DT5>OdN%u?5xLKZXu^Hk5z)RHOJDa{jyzEvgq#MP z`}2SPX(=CCrn(wN&>vA;6&I#;jY>A66KzLC1@3gH*J1sYP< z3mG5dQ_!mQMa8jf@$}48CPyN4A~KXEZ=%PByzuwxsuQLIAq{5p>Zl#muGi1%>q1BY0aAf9?X#APAqS>NH<7oj+@o z9l}8dy@)7K>Vj#Z%!l4YB^zQ)_6IgL_mV}-+UQ}e434})KM9JgkcnFWe1bAdLTw_$ zlDo-fszo<{?UlhsD)CN5s3ce?x?x8bWpeA?wWyM?y;S1G9h*{(BYb#u{q*hH*^lB0 z)9#PkZwKPD_v8AduA|G-5aD8mH8-5A6tN975>J=BzRJg0(hWiUK8b5|ctyz6p(|5P zu+#jaI}wjzqBJoUESb1E!6$B|6X*}BfO9sXS`!T=j|0k>C^DXB+sP#ALQi66TQwan z1L9;mgq&CS&P$PkSzzgCIDuWWEabahCZs?4E3X-4wxFvxU3RDr z%UIJ;DRk=w?F#<7;utqSg+}%iet*_9&WhUOmH*EgAjov*(n{ z8#NufWzd|V+M0SXJruMHw7N{o0r8o6;B_Ehc1?c7Om!h8Ty8blOtvu(*lZ`*$S51; zlaxXagrLcpvIfWmRB+nhCe{PFs%F3^yG}lr{^qmdy1Tj2*NykoJxZH6U7*0j$B!lc zNPoTkyO;&$EdB(;dM!y1dRwuUxRx~h1^05xK@LIn`$pdX0$_+v>v1}{g^BG1-@#h) zEWgP{-37&^P7;|`iVNhl65R`pW&l_~r@zon!9e#BuUJLvt_wA!<5(Cr+|(=AD#9|% z=&+}EoyHY^{sGM=-CP80zecGM#%Ho)DCK5#6FAsgBdIH1G?UOEX?1C%&w<)%wztLg zLHR3+hK*u1wuqX@r_#&i0M z(0x6-7qV`g4P^n>XP1j^swg0VntqEI!Qw9?kA;>q`4B1?Js#*&(pD<`Y)X8TdG+my(QGTI4pD6 zpo0<+3t!i$HH4h0wAt|mbR7j2kzg=P$7A`lbCY>Q4-iQ_tor1(YrxqG0sc&9FfxPP z9WR7JY!#q_l|>p#!Y6#hR~2j3lpAGrI=r%<&yC$f&egJ3>C3+P+S*PM+c;5KWu9?d zs!i2^Cl~bCy=NPrjn15@PB+e?bJ@(Qv<}TGyLC$pJ2I+qN3_7y>2amIJln*l0o-=g zReLLeqq}V%2%F9XG<>>hs}3DK&%)r9U^~FSsU0E$RFdflOVySB-PW4D5&(n`-!>%2Ex&ks}5leftl^WRq zCZk}8kU%_OCPikr2f@QjLIUH+-QEuqkE|S45HFWVUWJeb24zi=J+f^rdt-|3@jWT( zx|j&O)?$TDikT>(gQnW?XNA0dmD;hBM|r8jcY4xDHjy|aaLvxsi~Q0p11i*QR_;-r zvmF;Q5HBWtE-X?Pc5Hm^;c6n>q8}{jYP5+y79t<6toEiraTQr3oOcms z*4krb0;1Ar1_K-##lRpv6p^r9|Iwy*4X`{AWAIfkgi0#z!Rp?1HR2&x2top9M!U_O zm_=Q*-&tWa0|47>b|tvAIK0aOw${z)g|OqMoe;Psk&A&7q+OnTji8poEeh$RaMr*w zaI?*0ZWN>*g-P#0^oo1aT^v4-!C`K2L}57dJ^J+eJ_URtYNG%GkP`Po;P( z&9PAw*V|lTyMBeM%7m)6L2It+*#o)0<+!McjNggplBf`@{D*G=a=%K z7WAi6a>Sb`u5Q|9`3|1Ewty|1{Mxk;b`X5kUa{tA*qpF*7cKtrrQog;!@!%#i{A`( zy@#DAR)b(n>?UizSc_vLUW-;#*P5!1+8k-q54c)H*LZbMXPtA#8Vd2`EcmuahdqFfp;tP(Up9Nh~Hpv9S4LFEp!`7!NXS_orv)GQ*qtb zPye{<_THYpJv&>!^bgi%csMbYO7*rM9v*+v?c@&yoH!vgl&4vms%NZqVl0NjzS+0xKrpb4eN`bZp=ZPf=&h&@-IP zoj1ulfBuQt_FxAd*fd&W$kwFK@eKI9+W*Hq9mj8vg)MarN1pr_HPHnn7fkTLi=RQ? z=|JaNqU4|cw`kK@GF^2sr0@vu8^!ZlVOd&|vVwx0=F^K}3^SN!muU&75u0IxYk_Mv zEN9uai%NEr*X|L9dM753=OJqmIE*AA*KVP*MO@g%;j|LG#OkV(94QiIdX#*bubvKX zzlJRs&m|T%)wZqn*ZIVbLKM7s#NMf)htRwN?8HADG(ZP86Xr|@Ksp^>6(X=pz_S&9 zTsI0XvUU^kJ$b9CfHolDadpYE9;{IXV?PLy-`&97YXI&|e_?L@3#q?vxmo=S zY2SkMZv25D>6dyNEX>!TV}*eF@KL-Rdflsma`=rItz-mEn`UBv*l+n5)Cc8 zcG|FUY1TqW$%a~@sdCh%t97X+Yl13IRsg=Q@ccpvE1X-*_bav&*AKpl zN}=a?9@XXTk$sz-^*j)&L$}Z5uN~K0bc`JI@pxp>)%u{fW$3ubnL@gnK3!pEg}(6) z2yf~=(nMIou>>x|6`_uY`67Uyf2p?I(y%?XrJn1OxA^AU!rgVy z;JD#DeGzvFqvtyz`3DO3zqaN%`{WmqiGUte&67b8O;C#;EO z*qL=N;6BTH>8xbAjG*t@&f<|O7%-Q2)qM~GYBy{1DTfi0B;23d!mf4)JOHzMKsK8x*Ln;fhQr9i?MzM)^0FhQbq`j~N)9m_aS>=m!ignl$ zTtih0c72r^)C>@&jKQM|x`xk%t=t9iJy)izz#TGuVJ2`#Cwx^*O5ETXj=#Y9%;O5Q zm(GojCSk@-%BuJIY)`z9Cf`F&bU(L++s9o%GKO(@1=P=rd9^$qy3_)MFyStM23I&W z0|Zv+7!s{cqOB8(;5E5r6!JC-$^G`g_tfyYCxqgCNiTHL5-vau`-!DC$@A%`Xxy4M zc=)-}^)tA~kHy7?PmO83lM?Bs^EodPrULQW_rgP!Ry z4{%@u&JrqDJ1VkEM-;(zl;w+SndGoD7?v5#lKnAh(m<;GL&w>7IyHT8rZ`W934J@x z2E(e7xBEKECw)6TuRv$1vyL-d!(v*e`4k3J+!%e5!4@#XSVJDDv6T>@_NIJ|fQaL}Wn^0GI+z?V88bLMn-1E%e?c z-Z4!W%AhMmF{fwA_QrVIqti71r(eXWj?8jUZUw^Lplb+0N?TPQhWCBC8DCzBu@z+K%x*e_Tmh@;tK8Na3zWBty3yP4BTS@Wftfu6G9*}yz6PgIP zwh)7$`58@+`yVK3SygAi+@aOMTTB{F*+HPT?6hR<^1z%$#9nr|h&NjjW;HCcO1VWg zKEWqKrQI4Ef|RSG(w~1Oopi_-apQhTlGj^8xL9_S7?#tlKXJ*9yP8Q+)K^bnw!9}D zUto)-Ez01!46m72stO?aP*FubQG}}$!2#*fxz0zbi%7-0p17AP7;7*qi@HEl7g{48 zJdksDl))}CQzk#RXg}#>lmr7OXwCc>Zqc%0MgV%a%^Y4aJ7{NsstSf+RQKSUtHTa^ ztM?lJ7^QW(ExK-5b&S&~hQrF!@h>74S_frR=K(7dc(5?u8|a82{G9Gk2A)fVPDC3= z;Sg+E-Ec+gSpzA(*8v4CAwsssL2*#LS@xz@WG+H`af;JY%3EafG2W^X<0J-QaWW zZ3@MtJwt-fuOxdp)9f1Sp@XfL2kn3~c^`l`H*vhZyjn!*_R^8Zy+kzP$!V-}9*~VY zyO|YbT@A!C0?U>7*b%uf+vIZ7U4ifQaelsz!Le8R$>~a&{bQb&8GNruDEK)kM)PsD zlAQIqT%wZwM3(C(q7*JR1_c#xTSc*A3loLJmJ&!BvPGhJjHTP@^ae82Qnxqwy~wAS z1fAIN!DBpc20fABRd{dNir6Gp^D&lPSrO}%^cNFB#(%IkRpONn%=pZWi6P;vK9)#3 z2WJx84_+({QJU8y!N;i}K#Pvj-m%OlPcoR>N7*HG9B^O%``hYm_4)da&flMoOfF?U zTKDL50tFq9nxt_c)B&o40dT}ha3HV&*I}rA3%U;h_!zTWSv13$fD1{XkalPm))|o-_cGnq37YELWLX0gvT5GWc-+l zn`kxPkG*i#WW2^wr}-Ie|HbL3PKut7Qopc(vU@4YbxmcatI?J^0zj2-MV3*P&GtmE z&Db-Vvm;(eB~4l3?;nOk4sX;YD`cbD3YcgNmauV8* zapj!}X~=|3LzT(Epk{D#ln>u=wl_10l=TY3BT(WWaYMJqp_ym-Du8=oP#&S(Ge#kV`O>dNGf zO8(MHUQx;4S;^naNU3^b1t0v4Zw?v<5g zHrh*Vm%@u7-BHrrM-TSWGNzFLl=tbQr(9kwnr=fct&KD&TtQ&HH4T4!$4o8pgEq{Bls`krFZf`vWbxdK#bGfhGvU+ z%IU6+5}_lg1)%7!9hSkks|jJ!7z8?@ATP^uzm43-v9AlOiA9&AyY&J9Ya_2-Wpp;U z$dM7@1bJEx!(C)23hL2$k(Q%%jBiG+p)K~L@TqpO`^HgELDNqbjRRP2@Py&-xktauof7^fg?s)&? z>F&uc6xOZ4$n9N~#Ux9}xl`TWWnLHrndH`S! zR7{oWoSvZ@j?=1onNDzup@r`qrmoSbO5-?AE{@|#F&|#NN=Ign5g16JlLY`set&NS1Y$EF$>e}84ShLS_Ee{1f0I#0!?(P44`26Yq z5rTeuv$2W)by$(17*2D1D)&seSmW*VSz6Vh^qfZ#^t0=1GE-+j%7{YMDs2a+TZGoh zb6wshf5>9;AfLOGq-4OC3?)wTfF?Vzs~VyP)y2ujc7im~2I**|kGBK~JLlth)Xf0- zc~DHBKoQIJm*K;Dsx-Q2Q)F6=B#Cd z^8FUh;@B ztT-pTD=~ovh!KRqWpOm+d2`kE)9@FEhi=-A*G--8b=B|#+j5&RG75&CriO^F2sX=S zUhOJxV`o$BMCetTuHZVG#UCqwEi03_S*~l=M6v{_@XieKvIZ%XFMT1y((}VLy#QE| z2@#mT)DsTgjFY z_c?ycZ6LIH&W~Zkv@4Mg$D@ON|8C%`vY3HFdn-I3d>209Eb5oi-d#?tS|M5O^6jIG zp<7B4?wbM5m0Te0L#l*k1*&Wb=yolWFB(qM00a!r9vcvpbgHM8pmUbz>4<`VBXoy* z0`&KtK7IMvP~926J9{KK#v#qi9cg~t6w{|?vW8fY$V1HoVj=N9yRC)eA1Jn)UuQ6B&*58^Ipw!{U>DG|AL0wqPVM2jb3-{+8LF!79xK82dgPe8S4@$tFS6;}9tpEM zlOl`5Ch6s=&~YkCQO=8mC18Y5hOVkLVfI)sT7gMPt$K4#DwD4eXb7>8k;P%6$Z`>o zM=sqX=-|7z_*gKI18*{o(NnW3=H*a1+XbS#`;8%5gKB;*&fGB6!d7qLx+sT>)$MLM z6tVgZ9c{Bx2Ee-SbJ}33q}i!1-v}M&LZ8>%cK!uTEXR7$Zu)W=Jh zj?vhY^Gj@r7ieoSrN`H0xYUHzs{upSBvBCK{T8!ZYR0{5?n*2C38g~b{eCLWpt|9k z*?cUl_J`wqMn@e_1tPG_TPdJg$jdWUy6a?S)xqeI_8CAhirajKry3-Ztopc`;QzZF zqy&hJkd(#CG73OQ1CcBV z5!7DPFRpLv+{Q?_aa!Ir>I|s6SzcKGjo6=K_kS<jh$!Of z_o?PUfTD{g0cm87v*0ff!XciMlg(zgON-q;nYQU#YYz4sccb3Hy_65tHD$9lE+BInFhrxoS())DkiP$(P1Et`L?$&9!;MY%y?Gqic9R(u?x8VEFtYl9oRsvmJ_B0O^5YTGM+z8Qj=4 zk($%2^*d|9a;vlQ1q;iW4tI!IWd}j zMTrb>tU_EA1de?IPLk0uAmaLXxtKkCwWq=8fIl$_Yz0TZYFLwh=P<_EqJB)1)nFbn z0OCftXU%Meggx>|22SPz3+`7shHis`s%ufyHJ1+j%svK$Yl1&z!}mq#|Gtdz;J7Cs-#Pa^x1U$*O@CPb6=GKxOm`aFB5ll|6I%QS@Z494gBqN@S#I{ z_lYB1%+g_A-)?UVHg{;GJNzVf`BO3~BI8m_Q}i1hitfYs&GD!MSn(3C_FzFbV3qXx zB^XP@z2ad_$N?I7X^xlvDIS6i&8b$)H)wUFB-}?;*}=5#Drezxl$9sN?ALr$U-jJE zGUWX&F6|N!87as>p;Q3`FZafwOwyYZgN*c1UQ0wkD(SP0ofk2LoVw1fIzOg};Sh;! zCc*s%&?#vx*$M_GVpRpP=z+IM4y{NKZ#0@)ec6qk2kLIeNO?rJYk3SX(Tq1wjX+

|d-XW#u`j`|YSjHzbAzZ7oMVn_lvqXqD*v!&`nO*_ zl9pY$J*ccI9yvO_fm7ZBB7(%2%}4-}O*(*Q)e+EMAiegzo^sMcMN>-RAn6-!US?tk z>~f+q3+ZU+B@#(p(P#zSWkhH$HGfFLW-9VZCL^y<)-=0z$=zk)Wm&dG6t9fk0hJw5 zhy@0Gsjzl4VF4g3UHG?DNDXd08qf~eLT`YkPDmls)G%TYuZ8PT6s5XR&7OfmF*eSJ z?`3#i5Kab+I0L|BU8>g-CjEty*@624k}R;Mpa+_s6Qo-B9AUVj(=RqQ`U(BB_0`6i zXbiyeZgf1rnDy&bmW>;RmSat2eYCGJxzpo=BSkNYIStLF5vqc(*5469!g#7Z>JX#yd9cY3$+gSq~kB{_U4X+uw zj~IPQiqJ%BL6Qj{v*y-Je@!L4d79}rZXU7VXvydNniQ)+bNx5ki;2&8sW+z7n-;_} z)kB2AEq(2rQdD*Dd1YCQ{vUuOw>v~BYt8-8Pdtdi^oWV}{*t343%Fgp!R~(;-0axN zw<4KcO|tXziZFXsW>x62rxTT$6Vne)EuK4SzsYR5zqD-_v7qsh$?fe5C=kF6-`(%{ z`L`_p4d0+YaN67xquX@;fIqTNAHe>i{D4oPqk;Osz3QWZ>2jV&%lP6{#C{;2TTMF9 zZs$xz7!T!n`y49sh?W3;*VT`Aym&C1Hk$X`W8Qarse9(JbHJ^K3i1U=TF1$F%Vu75 zwABE`Os#>z3Jua(RF*X zomi|}cV6&Lr^M!08+U;Ko=&NaJ7Fx)76oU6#{X=zD+D(EOPCg%cp}EIu-wjmVF-}c zyLz!3KHB~1-Qlxm$NMJcInTpK~{(d??jC;Av6Or?(P%<7-t@yI`6C zg4@yG(rUdM-9g|+N@&X#e!WHTeBJ(OF+U$?dzg41fOVPApyxKs6H2@{%zw<&kpuDn zK+?V8u{~aNJLp0*qbHaXhVRt)$93qy?^yqd(^ma|pU&3k^Vc-5J0@V7PLo9l$WvLB zW;In%f!)*;z9`E5ba-WC?2Q%AjUj$|qvA5cmlSULwH}{yMR%UuV#HpvC%J)*!$`C9 zlUtuYxH-!xJ}{lgs%?1?HpUNM9=3k7kAmj8dp>WsfwRHZg#FvNe1gKF#1h;?E%6Ep zltG77d1F~W&(6vc26}?3O-%N|hNfpfTh|;l;2d_k3NJi%qd#58b6E%<{PZ3GD(LId{l%3j$u1;@)W2wJlqqrGAf8- zqsvqPf-9euuooiU;FN4|BJV}SL)6|AGJzBrAa5gzb1tNPOWUYx7;W(Ix6K-yg8H>k zr=yTAX3p_deo_A|!}uGR*0S$v)2#%$!;{w4R^u2R0%8k;0ji=fm%3!2rfbAKdN&l3 zgAYp>+Uvz5tS~R2{vxW|b_vsQE<%w8tcyY>;=gJTT&pN(w^=qlDR7ImSAhJ^r_dE) z%pcsyb@$d0Y9Xpw;}|5fCmqCBRH`^m`Rutjn~|CtYbm_K__c9=bvQt(8evP4J6P^& zm&!-p!fOvNIaIsndk?2So(rf-%}(^gmriMNBT38bRguFsTA&wNbqK;^yeArvWU2ki zp3{Q$jw?}@-K`g3?*Y|$?UljxA<^EyL{m^UQp+{$KZo>vNEs;&Y^bGvqN(D-)uU+v zABbeXxbBc$JawKUq^^V(Da$!e<0oFx>Ix|0on`s$J+aIt=E5oMvqFGn{l_sw6Ub9T z`COXAei}nG{yXOshgRC^oTkvJLi9|MMvz*5Yf|5Lda4T%i{~hNcQ&9|0;qlS3VjPe znejv9s2h}U(v#b$fc$+xAGVmgoeWUzXe5xF=oV#&Yl017wxBR8AxZ8*#h+%0;LFg& zpq300k+BlhPto%q?$y&kTXtXdd+4#=^7qm2*WU#aH$1R0F}w)2MUqAI{vX-=f0=C7 zHjyU%rdb9DbZM?fi)Sk!ahZ)WcXkbwS8ss%jp!mTQhfS|3vzK~2HhAat7{|H7ZHLr z)jNHG0Bb}U$)nmOy5-_!(W=_R$ipGO7i|r&$v)hO4>gr(B$M8|d^7(^?+l&fDU78LovTE1~3ncu>ZP6b?aW{5b zy#+&m-T71SuJ2D`RW*ze2ASE8IYEVf?EF!VjrAUvkCXb*nGX^@;yD{F@7(MNmg9Tj zNLl~Y)4PaFy7PnrjM)>xC&-+NA-Lz3$8!Neq0JLbf?||IU#3GP!=K7OgZoaUfH}#x zGC8K7E!gB+6H24=gLM{xTWW-|7Plh&ka&il(1AW1xX9MpH)w{4tLzVrSK$8r#N|a7 z*jeM`UuX_mmXbtGqu?wa+R)S&Q-F>F;|St98NbtLjbxKQK?pTvB1OsMF0H1SVOq3F|*hBee)F9Nrcd-xFJ@K}2akm7}kH7+&@>~FbI z2)l%M@O=t0y0CdE0-71!H#j5RvjGLF9V3KyM1qzYQeZk;N94_?jBQU2+ev^puLTW6 zj7gr9>F~X}FKZjA^}auJ4XLyb`+{y*o=ISBEpYDRm`PSwo3^aMLmjzyZ#*WkjpQx^ zn8qF~XvyOcegusK6te(7ynS*IC3)^0G~Zk95q~v5Ekcuy{=MCCI|^wB07ap2Z?)@2 zb6*$WZz14>rftT#abNF{1vgQVK?}Pz+x?&wC3F%=X}iN=HWsH^jr>ZAuNZgZlLwk2 z;5eB%OFx-tLA#V|C&ma6k8Y!ijFFK|`6Z=KUJ)P}P1;q4WG-btxy4RPzv|BsZSuTlo$;j$^j_pz`JM zZ3J--3Az)D+qE!ZUAV)88} z3)dQ}HP6Udise`u_++CY+wo&&k0n`PF_Sp&+X6yc#$!MwU}9eLmJdO8t*|U=8$-{M z_d@`e%nnP}fdam~h1iWYU^_20PK zvH+lvzoL5?EOsN2l;D6%(Zbb5G=Nu%XrUB;Qs^a0@}mUU6&|Cv;&}9HK7uOMqG$o6 zqv9-uomEhe5fg$JuR@xK&~9~>7stT%8?kWmk1o2T(DCIl67f4TYw#$8&CwXUzt!O7 z77d=yW@gsf9SVO7yp5YxGozN-fGwc5E0GQa8Bh-wbU^r?t6{8*VqE7lc}IX>km{>E z{jocp7Glj2kj%0q9@r73>=!&mS`vJJag=|s)LK#2e}PeO_L|J^_%%e}g;8G3#IvcL zX)(=MIoFIbNM|z;0rXN~R{~MgabD1>u8QkW$Hdu-tm@wTvB?n{S~KC;g|?P6FV(|f z@!x`4nc1e3v~U2=FJ# zsAFC#Uw%dojs_W&B$fP2na(7%Na{>NTYxzSE><3Dj8?=ryXH>w_;}l$ma-={UjA92 zo(l9_nDyLU6G;t&g-FNg>{+;FRH=wov^cz!O#>Z2=>|44n_qc>j>J-Z3+Z3rZq8|R z41!ria1yn@=i#23iLaln^`i3G<6{S`672?>TXbZQ zMEX|ri^f`U1%SFFSx`XmFoW5_0ldgy4}H;xC+RIl=r13lwj{eVmLWGzkP`!FaSSLG zUg^_BfckfbV6uXFSeIG72p>wuDBoNwEC@TtR-Zd2*NaJnIVSr?8Aw&sJ_E$Q>aPPM zu+ne*(r>s)`H|2ko%hQg**Dcpt|@}A0;ZR#@H;DDx8dAM7yTAO{gv3J@giOf6%{j8 z*F{_BE7M5qEMLrZr*PMzx@&0Q+9s%k!U{Q&cIoNiHVBP^k z^cs#X5!jx^S~QN_c(NB-6m@RE_|I8y`FlK)>H8L+`{n@$0qaq9i@g_gkQaWaVnf7x z%!=FM*iu=Vk3MXTQlB8HP_~g9NzSZw-?eKpGJVwDP3!)pb5+w{_*g_-4V8 zWK)|C#@g$k`JmON!*%Niuwke`WSIB=EaaRFot(xCeP*?ZUK zHgY6g_n zfgvSw!gd*MHnZO>8=Z*o*+0CMj3#o`WkmERw@b9LdMK`pKhBDgF{ z3-Jf-N~NJ+axdx^+lE?({g(4tfp13*0C#Vfyn0$nB|3B`Zgpoy7#FCFA7y3xN;K`h z18jX;yl%QzIE4IcR?*|-3TDe@F#Po0c8`fY9=kg>ot5~+R?Pwmevz28#-AIALsxxC z96~+Wt$%ROr+J5u?sxiWlQ{I0K5ccMlTiD@<)xyAxpKh?8RiTTIYS#nBEHmXK0)kL zN937>39mDvUUx_5p4JrY*Dl_w&3BqFj3Xv^yIJ4(Y!KeiQb4QVTA6#2D~Qt=&mK;w zev>P*He(2U973k1G7iIJH3zbqlq8LSn7&WT(@z1H>IDEd%6zQ*M)AK{OMq#8d^hl-B#Jt2LQNbj{J?a#vLvKGp1*0R|uKV_d77KfDZU z3WzS#SMyz*zM2~!rLcfe)n}_dq@8&nr%Qv&FdRJA^%eHrK-!4Al z_sK6?_3DwN|IeG{_O$YMpTVSgV%qe6ZuTpRsaLgu)_s2Xup-A9X3yV5Hp}z7ceK_| z2fy;oX1%FZe_p*`QJgOomL9o*PvwZd=$T9rO~F4$%EeO;v2BD{z4EJjZQdV?pNkmq zP#3$q2twoLTnMUR;_528we*KKztD22f_ErjfN@V2H@9j7j2R{_+qpYYP4~I=$w0>9 zqNo-5IvlEKqB#A2PT4P_or}qwj>dgElQH$^{mJ%rNf#GA(HnM5{j{oXzW@HaEOjpa zs<_s4{mlg>=~Yt^Pi-awBeS`)3v*wa0WEH9v)8!Q{(AoE`1Qr%?=|uNqr)e4=Yl4| zA)*FIZ4dafienKK;n2Kz>JS32&J1VR<{nk5GzP0GFI6k^h6a=m;Y1JKpqN0GHVH2m zXd{Kqp(}r$R0B9i;^kA9>E!#0huJYPwrJv!@m1BTQc6@0qcQhgn%A~>Z??OD&65m7 z^DX7~D|obA&-AHtyw|Vkt*qF0?$Dd>McwPwx5(qVcx0-cTVBHSwPci5@?tCgci?y) zVOvo6iFBUxhO=qPzV`EEI%K0-B-;EI0d{5?2LV;AaygUN03Vv$XXR3{C@G@B1r$5C zK$u}Hs6*xCHwDNW2ju`3RKV|Vq&^}(ewl@bv zaYy~};(pS+;^y+gKL;)gkDY`x(VC6B^Fy(w=`yYTLMapD{in;#;?_)lc8;sXq^2=? zSht|0)Y2s>sxrq9S~O|o?0~edFdNA#yjL};>?ws>sQlua$>a?zomp8!5d~B)eta^MxMpCdcN|B-2hIqL=zbiy%Ab^>6OPv9--*6r=?2d`pS^;fob% zR$e7D4Q6ZWvhOTV)52fQ8uiNZ%;qtT{H5}BWr_d%wz?J3rb$!o{Fh)*65f=2BGez{ zZmm_xV{{A^yp~ zXuBDxd~!qc3xL*6{&e{2303gw_|=D_!{@JH7Svun{~fAQ&^tH5Mtp}GZ^8*rZJw1G zyleE_CZ8zHig{_c2IZe7N;?DBS@D+$#2|l^x>cO;lqq1XuBeEUWRTnkPMd2HFq2Rk zl(F(6ST>~q*wuVF-_6-%Unan=sVr80M*r4wT1{BL4VYM%L$oqby<174coiHfadb&( zw8a3F)@l4b?#OWNceXbo+fi~{J2|9#o9&d2Ng{KWMQ^f`-TLQSn1SP&xW-RRU!OdS z9A@ILi!0#>kTn5Ug`cz5ip=Eda=BaDaugk5Ym(!+*Ri4XN1t7lwMe=s0Gc9ZK$|Gw z@|XDUI)NbmBgwxF<@jd4m78$%{GvPcAW?`uP7+GGZIui5)`T^=TDKB@C~tOfR2?_LJwm&>cc>&#RBfNKDqZ<{rS5ZfD~=h$!Ac-zTM+QWY;*N;o!rB7?q$2sS78OO9j14Q z5Jn22Lh`WU_NO@$F3G1*C72Nv(n6;ttt5n?UaCdXcXVZ$M#Jg2>qN(eW9wgm>en9C zW4?8$MGnB{`kN)uVdXTUyq(8n&)e?TK;?2uekd8`pqwO;i;%=dF*@i-uz-k zjltWm>YR!bBe~{tp+@?8?_YkI;YCiFtikKCw(wsoiasbqWKq zd;=rNWwMX&#G>l_L*>7|`}WVf-R%nioo~%fW~862Z|AGp{s6S@ zqnMpIn!K9}k0G63a<;<$d2XFj!n5J}SNtQ&kEIRsSj)TZiFAY98s|M#;T8)ww}c z%zo$2LYoiS6b~wN0ND94x=mLsruZcj3k;5WHy0~zYcUUradhC$hpwV2ec@uurjtY6 z%UCfOK6Nt(T;`UG88CR`0rDBmg%h!${~~k-DF<;#yU0asGMq0i^qs$f7je!E5MM5c zyP4dLL8eJTzl&wCXsAT~b-$E@7WGjuZnlf-)oi(Mz=Yh(judbO_=6apw4Vr|qPDWl3s~+@|!8jg$Ap*3A}^8*Nnr|^&K;CnzH7I6`2 zej&Q|;3yT3o8b)Y)(*lFI8?GcKr#8u_6Hl#R>KX@dI)cnXAMSjhALJl`Sx%DeWSok z&aDf)dX=0?9;7)H&pG$dz?`ie1kFxJ5$!9%c@jH0846UM)AEowGFPpfR;o1qs~2JS zsp;Drj6tuweH(U*zXh33y-&aW&*`javx}fSfEM(Hg(x#0r258;0?H;wLPTvzyy0^B zt<$2IcCNFQY42e6fS-I zQwvnNgyp*k*hnS1DCiIRx<&o6sc5d|bdl`_8Lec0X9OV?i-JKuJkTPu+2kIP70dI1 z#zxcAL4ve+=Cz0m7x!gw5M{lZnj#`3v<$--?h`8&*U|ycUY2|RPIm4_|6kP4LM@!_ zX8xG}afT*|kuMJPh_h>=uN<$ghn~Lb02xo@4+`f@zuqo3+nu`pAnIl|6usZ(Ae8P? zHfvI938dYyf+X%KD5kQCrQnKSrX-mDloL|)NnSMPf`MWvU{p^|PO9o$I0K75rOt!? z9W6W!DMuUoNmid$8sYv@f#_H1Uqyq-iDBf-Z0HQ?0yBB5Rkz)vIi#TN~ z>A(QuwleM3i4Pg^#a+bTzlnm~6yDw9`$V7mB_BmT*!OROEX;*q@89@=dVLbfrk;8< zRa6TuP2L57)6EoCx7m)N$?mH+@6O-3he}9>1Bf?hqG)3u-Yu5%xF}}S@YTT?OEJb! z=6fT6=SsLDG8<#orCglXr<~9QqvO>nVz@M3L^L+m2#S}m$AiMYRqhoRfosm}Hkm>= z!nNdK5NVry&8P*uTCa$*0s7{8)Aw&^+wtu3osWZgU2|EP>kzifi@EuJluibB2%`lR z(%)$qMb5r_ry4JRaIJJI@}hCsre7D1;#9yLgW-9AuroxM${vwP98~9;ujCd>-C5~4 z{&gSh*7?Wz<=t-X4}$F-Y@w}y>l0VpE}$g1>Apa+J6vYn|8ZZN1%Tt@r*Skxg;rGT zd~tE&U)ouVlm;t|i*E1)HN29XzHjlMr7`nMH+w>(Cwdb-F2_$>XzOov(5EZ7(XHG0!2(%WvXfnCvlEM(p}0&vB+X-xSegc zay9orHjXi&Ob|bjvBueAs=~Oiv+Cxfs&`q-g3Q=juf~!*LCmbV$424puS#3fH@<4k z?L=jLxt1w4T{M(b+<@LQh*{iekI6Ty+dFTSoC4%TM_(*!r4cyJz!m4kY(+hy)Xl zLcgGM5>Kev`h~EE^bfr&NB<_@=ks` z17eatYaR(H;d786h?ig4k2%=pC*!#Bgo|Jee*?}VA%Sn#i`6bN3t>B4t~WEiP1a9) zyTR-!BZ#;s1{F{=F_m^B-it^%nfo5}Sj#Rp^Qc=L#>PZiYyloB;bgZqQhl#JC$ArP zwK6xgxw5%dl^e^*`=Es&W*hVFg!~M0H@dqg>56QyRvnv%)BEgmE~X--&RK(TR-T;$}q_V!5Ybhj27T(uiJN2+4#w6YRgRe#ru z?>`X5{N3F06hshkf@_=G$rzw)@K<^t&wO|rMhsH@Z6-Y3agouBvT`@3vzq|mEXx#v zFo?amHUpnQ&`I@sGl-cg)~!Rw3JQ#28_lY7X8EpPZ_dAAT-Q*=Sc;*I@M z1mNp46yeq%ZWbi+MV=#(<=Hcrb~@XoSKT>Exo5pKl_|*Lv&v;`P{=k=T}L5wv%7-| zf6WyZZKbluT-hkQKHIsta=RoPON7yJ#(H7QXiW`AHDj)?7H=29iDR4mVKci8rbe5% zS$~lCAaTQo8PT;yU_{(kV$oWG0TNnlW)Af%wvZ3iQj83MSd1-Ywd)f_wHDTRHD3z) z@l{6jFGNYeItf-zTv07g!qN;RmTatTcXx~0=OQZKYPO^<{Xrq`8P(F+p_QKYQ2e8$+VJ(99v8b(rYPxGA6u-F(A9YwNN-nL>zD{5*n1K ziC@r~UCP6bRl6{z1BQhk>iq3##X}{^7%o(O`ih~!V)b^t5tLN4JK3Tu$%;x`k`?j2 z>O9k7AsN;76QLX#U182l(qN_N{8s1~Fp7-MTnns!U)}R!#nM$}(PD_r8VA5EEiK$$ zW(AGmw1QM69HL}QYfksjf;Hih&~g+3?YsNf21Hj4BLRQ!1q3d>4hoK1}C^qN_Dc2)`R7j{2^ z^Hku>sKKJnic@zumC$>3vBp1FCGwr<{eO!vK?fkd1ij@OzKNRcC<`n8oN?|lm@~7* zD$<=-#`*QfiKkdgil-6I^BT`JmvlY%GP->%(O~+hD?jWp3C@D}ZFTugSXWA5>5n)Y zQ4U2HRawlL;AN+$_rBQdMY;fe$WwNEDz`T!^Z@!uV5gN36Se@ic_qY)nTSmB{X`&j z>dVsrQ`0?306ZQ{fp`F5K%c)P+=Bo%avrM@(#PR%vHU>sxzaQ+dg1JHE_JN}QqaQK zY31BSs4m)eQJNY|8(nY=Wj>V|?6h;5Vz2_r?6>*VSO>O9jMvmTWKo1Xsg(CWh&@sx z+e#I&nE~u1 z(PlXSIWdb`vH7C! zc8|Q+(RvuOU7gQUIrHx0O=O~|$s*RbL7~WXFfwa)6bkke(^}~gd02y!?WiSEMDT1I z{yJ!g3Vr=Kt)Yw5yk*M$T;?omvSK9x5AE5;wBXlB=@TBArt(FGU<8jSNH&?^6S}#? zrbTl6q2v=joe~7x*Vu>D?UB0tfHMgqZcAd*rIV?Eb{;rx#0I?~j^f6nFj@gnF)eu* zpGUNy!wP&je;^X(VjZt~dB+au^S8g%#Z6)L%3?L8y#UdU(JSNF)=U0$8=9BrMpqE% zGQwf6jvx41z6fD)D*q$7Ll?6LhJZfUAal_gy9j$hM`Tnps+H#&kiE0Q;i|v=4JopX zUXp6*Y31NReGSsDPVqRS)?-43PKMatc8c@G6)~YC&eJ%v*O60O&@Tg`43moZ1(s0$7m>WG zi3Ac&4~N^Z|5tRP3oKSEQl0osbY9+!Z-zd)%!ReV+*X<7ryM`*IVWN3-Wt-F&V9~c zQ#p-M@GHJy@1|4oSEV{wbBp@2Cn9VZ9-!mtafcPzbx@J)hAY!A47ciG`XFL>rpG&H zqnfiDF`+we{mp8eN7Dr;_a}KpRJ;}Eez*D6@rU(>HfdGmmOqB*Va1vmLzz@FwMTSL z!XoYF#r%5y@s`@HNW>6`))>5g5x(*l;^gY;>V?vTXhuy)K^*`}WER`SR(CgVh$q5; zc4G26Q#pNdsL~X?N!HG_Q}mdC66sn3u%!NOep?M!v~?^tbez1x%{H=O+xgAvErs@U zBZ|tUax1u_8~qe*Fnv=L0GjU&ouXw0=R({-4IQpl>z&!mXu4u%U&p%e%q!#kDpIX% zMFsXu0-K~g<6`2(C5yDi5^x!U)Xpy$G-2uOFv`B4e;}$CEl5jwOLxbdiEWA|(ErJw zp4VP&p1)chKDjvz1uC-e^XTkux3;y4j3(5-Kr%fs`bBAr=N_r~7YL9S;Rca{#muFI z94#LP!(p*{sg~V>Lpja@Ci%t#{Zbb?IG}n?z)+jvPUkXq^~-ytWc74_L4G^R4i6JGJbAT!Qecny zn5@3TiXcI4)%UEmfM?VlZ{jGR(lliyXZBnI7l?;4nJql=-q4U`%%=G8 z=zvRV8#Vt%oZbo3gS!fCsAEAsPA^a;M2pB{LFk!lVNuls@&!qs8_|S}l6FUS9cb6`wPN5Rw8b zWFt=;N@)?A>$~->l>Ui8uYxN8if#df*Ti$Vx1aOv^ldgsqbMDcShM5ZDK)|UAiWiQ#t0q>oc z4JG#N!iZG@moK>17HulO=kYIPeQB1AjIqEl()m17$?xg(C^hix+#-NIa=q#{(^iJl zqNDX9n>y+4!|yuMprRaWa=MO@$@YYV$FEXBnwOVZTuZ2wy#<__O8CjB~An3G;PtD^>e zD?+Nh6nlaizB2xklVttD`lVZw3*?Fs|!e5N>5}*PBcBnnUM&A37w;W+6Mr0F_TSVbPFQxtZO57b({T zO)(;vPIG>{!0Z=**G?^Sjz)Q4hH_0Lie4(t(yB9`60(03G|s(TgG;umvy=n95oe>R zTc0dWB!BBT-%Nmpb5rnwFZGl1%o+&K%~yMnvT|yckeC(-|F)o#Id`Ks%B`xMFE*+~Ij6JOUn7_bldKzG{xiHIyPxJ~Lh;PDFJ@Vl;UfXO9pLqZN?~DTF zM0g6)4=f9_MeXR`I;XGYFi(-$oUd_`xxxCcH?)-E;vvAQFn`pb64zh-gU6I$w>^XE ze-GPkU1E7_mn*toh(920a?4Dd^%QmjHzpQa$`W>kQ=cI|8_Nuy#)Us-)&4ZGjXoaDVt{<3 zNWgCd3J4S(5!81gI3Z;&p?1zgV~?xO7cu;qK?PrKSfD}jqc}Yf$FQkaqE{tQ2wLnA z*OO;iS$S4MmhGV^ee{`%s70~#G8arxpw!#hh5~e>u)e^CzUpl&GURn)T2_^am>n9o z0$NI9mBAaP=I3I)AL)E`RSPODh46l^6y;K?&_Ao660;P2zQjN&Ppe?~_yzs#3jQ>9 zz(+YW<@zCNI~w-nH>!m01>zjAjcX*!A|-jVGqA zumL~Ch5Txa(i!o$i=q7chal(gg5*()1JvtojL1aDJ!3Ft&6TL+kztUSHX&V7d08pr_?CPQVB@mC zbz7(YPj{$>vp+cgWaF;SE zDX`ay{J(onD#?7(UGF(XocDm>{xq}YlUKVZ*M4vldEbJIv#|}(@H2B(iGF>3rp`6d z5BDl^rx9Wds@uz)8_OD>0?cCqtnYRV1(+M=6mBM{yi%f;%h~OAPQ}A}Gvz5k}ISG35tQ;M&(RsQ3@{2Ism(vb+2)eQ0 z!fa+Bg_#WgzetbPFR%cq*@WRQ@i>#$|JuFzzZ{a5`?&JBbZ9(+peqSaLi{4^g2%6R zk2#SPH(N&_to#y>%CPk|Z@eH_< zBIk?7kU3zK#L#JLA$rf)wKuY=O5v=k*yAq>JMq!wa&e2_FV|*QBGZpdUor*b4h_)M zAdV|ee|g7hV&9x6Z7q{F96tSC9Hc$@ZunoX|IhH-pY!`zRB~nrl^UOB1^P^&4O~T& zyr%}l$?^REDKzc$juB!z3L)i{e_m=e*eh}xu2~kZA=4*VKlKY7QLE|_O-}`IqDt%7 z*1jqkyUZbAuuDsrugnOR=+p3R`of~l1|UA&p4jl1oq2vzT!yd z>DwIdmJBSOf>xHI3egljE#NdYO^HIEx!s`(6#MSxYIozSzkCrC)RwTN07hsOj0*x! zy^C;A=Zc-W+>^z6?`<$#Tr zyR9Xkzr|#`*vzlQ`+DWk?Pei@Qe7{YFf7Poug>usHnYXbG%je7#)ZIJyaFeNg?kV+kBlMv<5|2M8;fY?K*2pbm_N~w zJWCc2=}!_y*A%fagR^Ya3w=SRF3QLQ`dIQ&H1q2#Y z@P<_DeS~rGm&HzQ=9}xer6`YpTdr~zfZ&V7CX;B1=vKqJW;|KM+2e-HIXz+T0o+po z^J@pD*?N2RF>U$<+-XXmqg3L^q1y}oMxKK0J0bNVt|>=5h5&oza7uuS>2-6x<;T_@ zC7C`{n5=MTDJpqNv&bkXI0Z&GeF6(z%13!}qvog81vt)jPtn0?inyh>mhKRN>D@~7 zox1{8h_x@>Io$mm=@xvp{NE>w3*^sd3uC)q*Ng#glk+#L?cz$s*_G1SmB{?Y2xrS} z@?tLfFe6;_!!B9fe)(rdaGGDd{J|uYEI=Q-P~}cin3hT)`H8>ZIiOd1+jtSu-m3F` z5xXz-{x?k>X5`&#?zrF7!T%~ysf8g<*L^W&l~t5NBZ}pLhw0A$41HBL{Ww}6@#*(K zNxDx^?jLt9^|f7)=-A)_PR9f>7i^mu)!uo{EjdMj*;Rm}`DU};)T-eE)eP2f1p3|V z*Lh{PuDqcOUgnkU>}GxtyH-t?xh7f|pd{2!7*}B6zAM_&kqE3LA-wRWW)@E9opBi~ z?MHbLUS(gj{p?MA1k%?Tj1G2D2@l({*%f3zH;1OCVCg*=_lfKxj%%1(>zMtaZboO_ z$LHOBer(2NZ0~UnJV|Q!g|`7D)N8AH8<(Z&GS8{udx}+XX0gb9#?g>IMZ!g>D+yCg z9APOEG5-D4bVhcvfG#xqP2FAXT;cd~v$%O7E~}8yOEz>%93x|OPv{G$w4+(ZE<)l@ zq-$+u#K5iN(zO>FGQJA(P#p!rEv3VoM)6C6N~nIAE#KR{ZMQZSVBOtaE!lb;ZD0vM zg4+P`Wxz<`hkC@RD|MbNBB}wM?yEuo;m2#QcguHyzUE_c-k|RN@!R1z|ML&uPVyJ8 ze|kB5@v^u$cRJRB+;`D<0Wymanb8lE|F0MqUZoT%Mdo2#`DgTr9ZM(MyEk&A)hx@I z?K|lUf%T_sC#G9%g@FWxiT!f6tJ!v@)JrEmE01RwKZ?&KX%XhV&~g)+d{m5+KT@E2 zglZcwp#s!ZPIM;zvM?&~66@xehMtm)Db+8b!!N1>k8^ zURpo~3cFX)rv9>q+Cw*{GS-_qCzUnnoD_e3vhxvpX3kjSy$Jf}0}qC`*Aqv~UOCzO z(q-vpW{wHy?lkmfSxN~opLvcQ0MB@KrjKDqwFaipPVJPiBj8+=a>O7*IZv{dDPYJG z>29*g;Ty}*3<2qb83|Tk6lP&ho6Z<5B?3(wl!{7`Q1j;o&R~afBZ@y&?LKh3K|~4@ z@8ck0_rtzOH!6s&xX%xy5!fm=GpHw>{`)$NK76O~wcmqx=@S$D>p;lL*J*7sruV_V ze%GIWKo^_^b4IEavcgK`$&-q>{dOz7Dq_4IFW2kaSYZA^gHPO+wpeLFXEp$B^#D+F zn;8&6J^EHD#efEsRozrCeO+!)sCrA?WVN?W8i`hqd1!U+0Mm7GuuOj(9eqxZ++#!~ zIUw3kCg(ikD5C#(1IX3IVBFLz>$h*W^XP)T*=ED2PfG8#FJ)omR9_&o8>w@{YGDzT z?h7M#Ni#CC(Sh0V`f5JhiQ~axpIuV_4_GHk63t+O_aB0$`kluIZPPw%O2DrV4im7BRkqH(gKnG0Pgl1YB&Vcgv-W!+Tj=6y1B#WkW=oC3!V0m-HKG zT6hJXgQLXyGOCv z15V-AVFS?dU4_#rdy&Am(*JM9g?otul9}a|+qH2&$~^Xzoj#dq3m2XV58{9c5HHtm z_fmjp9e8f*FYN}c(I_O_g9-#b_&;VHVZ~~kouwlWC0g>1q43S&>FW@+d?Peb|9Oph zNHw38w`d4aY+8?q5=r^9D7$XD?bBzrhNW1N*&{oA zI0s8tVtCDmj^f~!JUgA(#Pj|9qg`v4?PB7n-2c`Q1H#_`z|QmZaak!+fMUdS*UIG} zTNq8Iezs(%c+;};o}DRDmDS=>O6A4`cl(xEETE69k#h=*Ktc+i{ddzCwhNcQjuO|? zl)_q?p)>!mlJ;~Wc9BTY@Xn9_BfqLpgBdBiPx?5L}O$NHAq#UWNnJJ z>{d%ARvp`?4kPw4i^~tq;biPh@!3MJo(+?t$p52$hY37#h{4b|JEV@U|Y|h^f6=*`|S>T9? zO(runX$OI`uNgBP4*}gDwI+w(~?yW7*oO?FQxxj z>*(G#mvg(Q(`5gG(ZgsMIHq(WvXQD)+Q902&c}%AIl0;{S64XmqoDZ2M)VW2RS)jRSn1hf1e1>DSve~|XQPvhE@)TcS!YL7OZ&_&|s~oUYm~H(y~wzl zsG|`zN+Ti5hHgDgs#0ny>7}lm^LAb8s){7!4|@GLIJKxZHmPQ7_3+u5uJSwp5iJzZ z$KiFxunizYo7s~cppmjfk6w1 z6~Ne^xk>7NMavjQUk!>Uy_bxizO)ir3XvFs=i@bq*cFVz%St_V-|`Ayq|cRe?R#KD zS6V#i^tod*TKR*>+@1}cbKhwI)fk;UQgi~WkCpDIXYu1gm2;1w?#GT{&(Fm)QHp3? zHI}7WM6dHjbl)+jB`NpQ9`%Smo{E$>a1@a4C=$7w)Z(W8Y!Y(NM)lt7-P>5ZpoCkm z4B_1TKJn7D3(J-;^z|+&LqKmlJ9h}W%ld)&N?T#%4glT`_b<>=Z-adUm*fMZpPebD zfv_be^RVS*9`=edPlsOSX#wPBt2uBo)-S?28+Z-O zMg=|C%Eo@?yr5HBnMdbVGb=))+4M8F3s|((?D(0dMUY!w54IA~cXX@-i1O|8(G?F&!4M=rqr~%z0KY zx~F-|&)jJiW$v`S%-wlE^6Sk;f|E)6n#{XIrne|Xe0E$`UC}Ywp`ZotHti8 z`F2Zz4{kT>-I{!qP{&yU zkn&1fc+#dT0ChXtY$?#9#Gy|6c!)A#7z9l_tEUloN#a;JQ@42Ygim@`{MghrfkN3` zv1;E0kvSy6N^DlDLW7m>P6PWS#36{M38-ROA?4-?u%=!v+=b~Sg5LV*CB?Y@_0yX&8wE7aJw8+uYa9yK5Q1d0-9p9 zvK;+`E?UIULY%o3uI3+T4AG!1RV4*C*^<}Z6cedMG9$cu_u4OhxOcpNB@V34Ki;l4 zyX}cHFQcoRUr%Me+2vf#y`7zN`1ih#|j{Q1ryyZ=Z`D+N=257 zH&52<+sDpN3KHV}p8q;u?F9XI^NmgrA(tX`2-(TMo!D{))snnbXp z)u_setE2-)L<9;l&|94&CscBYNu1L|6nc@HTb4H$A=-kXA;_%mnxtGmX)=178YSiR z_*PSq?whUd7n6qWx9{EU$0p){$acA$&o-t)Ex|+*Qj8bG^z66JOX9Fg2>0E5xVn6| z-qf7?8AXPfcpbqQdaqMZ1Q_9foG;(1%mH>Mz*r5*s>2DM5Tw%n=pEl}w(CtbSWG?; z86PdS`OWR_H(%PvFbu^KVBXK?w-XuAUix88IBO{N^Aqw8sSOhc6uDTa1#C1z3GT`T z_D4AbxHgbyuH^DeJY&nR3cemUvbf~@*mEA_hQO|fk9CInH zUi4H7o>O^^!3{YjyYC^ZZ7@oh)dU70U0olI<9*k2xkTPN@ZIcBxs7I;C0P~EVVKxl zizjV%$nvKF(hcMBKY?$9v$n>*3PJrw|7Y)7-p_a9~(8#U5- zRSWs}z|9Y7<%^nw__SnVl+~H|v`p$t2&3E|cBG%3zPV6SGzVrfdLv@IQTcD}p7V7!1?=;;XVnQv2XuvrC!# zoJvkEQa>9mmqlC!POlm-t1O_8l@^CCQFfhgT{xS17vu$8KgSM5`?56l!If6$Y~{Fb<;o z$l2jR37d!ulR|Tk-jgB_J2ki>N1!3s4+sX!c#>FURnD?=Sv)*^&D2o704Hu!`K=#A z?elOln%b=wSS^i{e~t4#M1uN$zD>dn?`pm$WGbG7Eh55x25?b63H{so+s^?`#nZ4M zJIx-DhgP6r6xO145r0M$Z@4GKbG4WCOX10z|>U)Gze&*dfqqp+6GC=I;CnRlT`Zwlxl!E~Hg;%{umr99v|C=YKhxFSg&5B%7L=5Jsp zUSrNeCPn~7j7mv^I$dG1UupF>oz~-{ZLw`5wuZV@u`!FCT+&6tUWgPUpO!8^(14Md`5F?d+1qhKuQm*!Eg`^4C|}KRpRlRkzrA!<=Y2 zFyRrv_6J@&X`@Ly`H%`DM)`Idj{g z7s029tWV>1mG1@7n3A2(H&!on7s|QBKy*tm%?KMru4A-&gTpYdF##3rjaCKjQ-w0L|-Z~jxIqZN;jw(r*BWX~1!S`FK- zrg(BckduNg^~ypcgldBO**?5m?B-jt*j|w41_R)UpFuS&L0m^cd+4~k$1JAXQMQ-Z zr4$t=q9!o$>N^+kFN9CXrOOGv?U4U4=3a>r#e;}AUM68=@$R(!TGBnRJ<#9`risuK zWvlg?#-^f$JdF}H`($}mVeeas>OVd%%u{e76@AKGclssyfo(*Rh$fdum%TtmtJ95U zQ}*4@#d&HI%wp2jO5ef`I!|s{8TXSGVE?xmqMvITGE>_F>_cuQFZTZE(2bn=;+c zzISJ$c!CZvcv^DyuN+ChoEE^0ra#h3`m$!yJ@|c(t&|+)%!UQtY!+{+iXKoWo{1Mw?1fAVqy%<+Dsy;V5Ln+0>Vp#AYiwhNLKc?xW}W(G~>h< zt$w+(E4$H#`Vf3_dIHrLTJBjI{ZU5YmUj(o>rrim$2eq-CV;p@f+N}Es^b-bi`X{>2JVN=0&Sl&TfoKk-~IbD_0cPFoJjB6IdcyuMNAcT zzs&2uH8Eru3G23Dw=UlTp*uUfs?~NzU^4g!N z%o=LRea1R22rEbY&Xe@cir-WB10rVbJfJj(el|J=bIDseqYGQ=> z`L$uE#)6kvAbXhzT>Hdt99D%}42|K(M7r1L`BIenpGu5-44sFP;$ML?RJ%%&;y|^` ziKWN2Ut1`?sD$<6Fzl;%}Q9j~(Wp zbcNx%nfDtA^SQp@>Y80c)T2UOjlixQ-mI_YPw2pN`70;H{_4fw>|GKD#_M;B>vv1q zA@+KM5?e3BoB6xhuZ#7aDR#G7Tp}TLb%m(r^

Q%y#R~y0_w`M!4eM9C2bBQawB| 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

K5j`M4fn`E6NtbNy(RC0lwAwaTPUqZdp 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

# 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
}6Xj)w6gZGq2@;Y{g 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
;4k+lK2zDZj^}<7eyU@ZwN~~VfBqIXDVqiYU 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 O|A=6A#`b9zQvVOwYxbf5 literal 0 HcmV?d00001 diff --git a/0.0.3_0/128.png b/0.0.3_0/128.png new file mode 100644 index 0000000000000000000000000000000000000000..8e4e4f55f5eaf7440982e23936cceb24ac02623c GIT binary patch literal 86219 zcmeFXQ*$m{6RjO5ces+Q*tTukwr$(C?G@X$ZQHi3{k-+n_ZRljKA2Ur=HaNGJ$h7M z5%RKPaL}00KtMon65_&&KtRAn|2t3+|GoH1E3g0o;R8ts3n;s9Ty=ZZ)t;-MzE!<` zUhno~JH2phpUVm^IJ+5=iG~V{V5CG6=;KquYeu6*B0+J6ZvZG!O&F9X8mL{cVNmW^ zVgHtdBBJCNU}O9>nNS!_bO`3>gg*@Smk8G;bncML<4x=K+x?uv+x7BT`RGZaM@p1^ zprw4`_4=*ZJ=VGPTxraOL}xG@3P&UojsAa^|LYM+;(15*`Gn5ypV!h?;ChpsJ0K6hHV9_?{@;a7~f zjf0+VUi_q>?eX7&>`m9uvfX8%DLvSOthCvYL|Az_WpVKjufg}AQY-+V&q{qp?(>gh zM(Snu#0osh5F+YoB*(6o~gmRZ)%>q;$A$7Kcf z^>RCzZD~}and@v$fCq=H2Zy|9;08@2eJkSrje=jd;x&ndEz{u{m+U|WfknNMo?9oZ8<$z*2`q9$V zaUP`K>~^+o&(*v0=kRkogjPjvhwo8~gY_#Bv%qxzMj4C=tAzNm9EYmJ<>}6AFUOUr zkt;b$_V6mP7RqP`|7t}A0aqgZF;_x+*J(p|^R#1$R)WkUd7Co-@oc%Wm+3P%P0DBy zOv|(92oSMlfQ5KIX@etn15K?Q?JPs(__&&UlVZENUz+OKhGH5`1pTs(Z*3WMKsPU_ zk{_=^W!`c7)I(dMhD5vUIve|QdvoA9URjqa7q?VS``;4jMiUyn;-O{dG2a>i?x#CA zX(gnuX@BHEI-)wZ@<^z(&-GSKmWbvU37%ffQlvG5G`K#L+@4=pvfZ!tyiW^1mnv-{ z0w2NQ-v=Q(uKar&xm&)sEU24t_+It){Fq5-5gFCsUDvcx<~KkeFeLU>{NEl;q_}E) zCS`Sz+aGHh1C1AZnDzvGPR2kLhk8kARoC9{*Av{v&=<_7M3+S!0-lQx72ZZ#U0#bs z=h_gEONP~1!B%#P;8e{L1_||(pP7b#EK612db5ob#8sNYE!*wZM`?UdR`|_AmNXa& zysHfhboQ83(wckh6GrCcK8+eXg+eYY5!4Z6XyP@3Zr2}GtCUrJE+hmgMXJ3#lb6pj zfwgluM9 zHUU|Dby;d;5U`&Z3`ETGMNSZ=c4<8IRX_XSy zDn7|N_TSRDEgB!PI6s6&j>nYynHY)|u1X&w&_2Z-@fkb9Ey{}2DJtvrgPwL2&Y=Un z)6eN2RIf*k-ZEC>Fx7^VHH-z%mgD+kncI^tu6`O@2jn^y0*zHM(5G=jT1xN}T9Pr9ilqakJOx=O;xk5MG{AaHh$ zN!TcnkmpP2++1OAvMQqNEBo+XKkSvdhi@D66v@cMnqweP!poO{pSi76RpF!2rUWHj znfKDT=m~0xq)CMbXRaZXA+z{pO&d9R9pn)pMWjW-0>nW|jJk#ZL{%T~Y_`3n?&rrd z1Hz{itF)`GaoAz*Q1mVFw_>;PQ>w}7cq39nz!1fz$+zEW;# zGcxv~Pq@?#((3Jxf6lnSz~w!Ls{JYJQeM9!O8-9f?}$>S}eTBM>&M479)7rJq|L|oOk&fH=AN@x`Xs9! z1`8?@gxk=Fkl;>C3ItdGI6;%}P~c*8$%;`d2a0n%qiHGV^;~P05B~%tvfTpARO2 zK+B4p#nQd4y&arDFey`Ue!^`Ai`f>eO}3&{^?9nBtVqK8T&NBQVHlsHyJ!JlBNhJ= zMenx!X-N4~j3yx%dJOYCUrn;(Ru=U`%s?%dnMVT2FzC+ndHBJjI?$h$qd?$Wzr8Pp z29QAm7S_@pzAT^by4sV#Kavbhj@+F#yc5-+ii5#8y|_ErtoX?VxTNI3uy=F}etc}S z7f|mUbBDh(@fBKV#Tk$xD=sl9tY39H(_eI~rn&pqeq?(5$sG=PbHnZv&~J-%pF8{0 zrM8VtwIeQ0r=5O-v+J45^xLWRdD?ULGJlP;zRpLFe;RArnx!)aaf0e4BiwRB1(+;n z9DZu{-UVbi30#xTlG>x7lG72>L;4u!Z~>h6AW|}@f3)Irf2Cb^pbQc&c>euJnd%YL z`>3*p&j~o)bdv+Z1qtsve^{wAgjhg@DyGaDAz+FVxt(##k+G}`&5Rq^UyGWvQj{GN{HWgt^dtK$C|%Cr!TWVW^SdO5e-_mzLQ+?MVntd0-?EeJ$r3jmk^`6w8q2muFCFK6%gp#y{woULBa zXvYn6N7OJv5#0f`~IW8bp zpv}*_wtFrf)5f`f_!|Xl%8JH=0X+{4#OWv_T3Sq8)+_j(lAih!(vCbP=nc{6N2)Bv zE1wFQZZ*5IHA15mRHF<4W}EPCkq>AQad@**FYR7m@G+5o0a}Hi06M}q`L?~uXhfH! zh6JFPSGm-0%?4EztuDHaKDK-O89LdzU(UIn=SIHU2nK#Gqy?CK!VgsXLrQ-)bpNc< zS#IY9+E*4hlXI*D>L}NYFhr=CiJH7(v7$PKtkhW-v6}eA_FxepR;%4HPoy~s_tFg@ zIqi6^_MX(uAyHI)Pf8?BH znL`a0b+RAyPDOAFYVsXZn9Xv^P%sHo@|C0?qh~i=i@jC|6wNzwT5UAVr%LFqF7V|n zg_O>#4LStu!Ia^OCT9PLi;E8`B*L%a!g$gA4M4_3e{WQj(vAe)Yk~p&{{o_HoD`8? zQm97TJfDjw%-^gktQmE|?hJyXSRmJG2EvP3jrn}#RUnIZCZCO&)8akt#xcLr((Pj# z&1USsrjMR>yM7+^I8cY;@|vpD$W=Y5n1PfC{-moyt~jaJTp3wV zukx-JEr*85mkC2zdzTVV-z_DzvzU(<^H5HTTr4Y?0Cx&6sqzOXDCwnBeT}WyH}VP- ztJqw(wt=_NI-RULkpf*adKni~7%$`nK1C|)4R$;Py=N4eK%r743dt!7I?IPw)6}j| z6|usU&Q(64u&KKwkIsX6+U7Mv(bfCmBBb%ZoblU-XLo zj3ELHs`WZaR}0R4vuPqM2rXYp78FC43(YZF?N3KwzkVvYJ0bR}jX1DT7Dj70KN5al z)Q*{dBe*^{?b^0=W+( zbzL<&XLJ;x)xq9`9%h`@QhFj8As9uu*5z5J z)JnhdWeGm@q}fOUskizdl^v1eU@yUmNU0}oG$)Bt$daEeEvSmWG~I+y3Wgp@#LXd7 z_!fNQiWa-?Lratd7H6lb1jP?I)e;0I%gsra(G5(jQ zrR-eWua}{@=z*|%0{#ep*l$qaB=p1_D#3P1Ro`S#wHT%AXV)oJuH$L=ZrP8Ouz#0S zxZXGOzC+1G6)^$lM)A?PACGUp=9gXY85m`Itwha2x7OZbRrmo6_(KZfH2R>rEwlKQ=#C}w zL+JBnPD0{;V7qxu_L;TWxQ7$#xScv1%G2gqsc8m?JBo=i_j6$#h=Y?x*ACt8_S0}C5C6l|J4BMN_ zLgEQ?wEzo&0MjXaM)>q7b>fD2I53EcsFnradKCtn=ePm?0wVPA3r8t>6^;#t?MTf) z%X$+nPbO6JiwXfW2n`CjD|juG27yq1fo@I2=@a}S$<nqc1m@xwOGPxUrMZsB!IqVWFp1~F?}C;kwT@OL^SYPM5B2Kk zCOKsdM_2$LcBMM`h8;|6zm_=D&Agk91h`CI4qCFNV=p`B#^HGaP%^%F@u_0y)A+>b z&vtfHwMJ{{)JY)ozO_&dg9XtfGwqq(Z%9|k)5}N|Av}nZz15W{_v5~P_I17L^Fx(~ zOLZbH-b;M{x^thVE4JsIds54OMeFx?eB&5~LOVO>Mm8259W8}z->02uTfCwU^?4w0usUxh4`b3RFmfxrLQ z*Qh~O3?k@OuOuzQYI8JzxT5#j9y;&Tdws9{>Qm1KBH`2K@5C)%I*{ zZ{oOyHT6vY-H>lbHiTd}^zVEGch^^IS&957d1EFcF5!CdOt69>tdTk6B9;T{qy8ZS zox^e&92302nsavno^vw2FlLHTaV%*AB8v;CgDY&JRVeacm}_VzGhW!T-OlGdlFYwT z_>lbYOqN`1#S$#$7&T3Onm%$@;Fa_0b@U~jh)y^=a(TxuPnI6i(9#pHVUQBHL2vo# zZoDt!&vThzB}P<8Lg-f2$zl>jk51u5G@;*ojx&GNQx|NudiX5d4u-_-iloT!>oP~s ztUkiiNu0mP2`rW@6qZk3ql(_!&|~^+KZuO8P1s2Nh)wnZva(s7GR<%BJ3)wS^AU0 zC<4#_wk?4Pg9m8-!L^w0TQS z`_G$;u8rDvkhI5SNe;i_95$ZWC9t0k4R#Q;3AW#(l4xVSesQ0nI53EyqZKPrM<+)GRWo;wml908Dsqs@MW@Xo zGz^W7v^(-#esRzu8lPj>?u_kIK)JllA%|eb{xezkw4(RwQHu`R)a#G#B))lXA^z@l zo6YN|h!)V}S$pdJ5j!FLS;bUEs)cUI0=%T|g4;``3$<>W5sP{G7jP2jd z43TKa6HLsl&na6Mt=7*-)M1odmXa*W06lU#h}I7s>4_f9RN{n99g)3pA7TK&XEa-4 zYm!NPZ`9VOuJ+QlXHbrzC&kbdq}bs>Pkep zf>W)gJFAaNhBf^^ue8GA?l^6yE$aGtcnl6k#^&)EtnuD8^Vy;5ajdE%BKRIinpg6B zVVhq35YP|p#fR~3o)&~E}uXhQm<+o482{!@2=3C`y?NMThTDJy3#r;q<5$A01+YZRd260 z8`sLHj4=(`o+1NR)+nHy{OfWV{CuWdt7C{3J~L;t_x!4;!kokXUZYx+vmv-N1|Nb+ z{nvp=7z3*z_~o*g%CD4FFZo~cZ6=W7rxsSQiJJZybszkC!pfF@%8$)m7LCav#U~S+ z`ZP>c$%iY(OnhCI0LbSzyjpGU-kW(VuCB_W=u^KsNFOrL>xZY6&4gExtr9DedPZ2Cx|CuKdC)Igs>~T6Hn%6B^0!SpxA(Vk=k4vf{vbBE3FCJ! z=l3}c@r4S0@hjue`EAQ16DG;_!tx&$io$BUK;bdvFxxUOFl=Xx@e#xA@h)ChTa=XP zR##V_QyQADztTyVw94S5U#Dq+Q>$hK3? z;YuP{QlxpcgsLWFOebP2GE~8hKyV>%AzM9yC`pqM2|FFzVX};1f*l(mp?}{IPq&(# zgd1_ydZ7)LlyIDMD1_0mA~8Zd}t87Cp+GwusYAOKd7FY7L-aP7% zi=C2ZkBxC*lVDkOlb7Wgj6gVD_+&&e)YMgC6}`DRD9Ce+{O;FpGbP)#6yLqG;`_bN z!>GI!7pLjDE$0IV>OHLE^0s01_LSwA?&NT>NPhl;9QrJlc*qL7))u6+paf2zh)F^} zGA>vGz|QJ!4LXIv0EJ=jPI&4C}uTq|*dvI9>1JAjg^!&=%fSGKt{Et#iM zu^O_gzEqf*xzVaPv0b1|89vcaNz?p24{v7nDS|7$x7ov`0KWUM6R}rWZSk(YX8ttc zD?xER6Sa)=E$>*VP%B+0#jr3ZCidRt`V|Iw5A`@;)5X>4VU*)I@A}5fjp_{}cOBd&te} ztYNuYtArriOEM}h6{=x`l5!_l(mV(AA_+fLP8Ff5-LOoN5G4!DoZezDI@WzFCkf@^ z#p-d8d{$kK5&bpQ8>+6`+F(Ee5angPyH2-nJ3`XdM(&3oTyhH&!*+eHEVdClj7M`Y&GlYBCibbE>~-6cC2X)!Mlnc~;8Kz0rvyU!9RX@hNixlLh9sL{ZT4 zaLq_Wox(%{_7vflk=NuP(PyzU7N~OJ`N$kJWvCTBnnbiAMmdbkU9#M8%EgIwc#;tl z_dDkEIi!N{ejQJb@A)nNr8LRXg;?Xd&E4S`Z%NT-zL!1|1+hRz)oN9aVuL4mx^3cj zdH6iB$FB>lMkVhCaD~15wAvj6rM+S{L-8g$uP$Jx%LY2G20BxQ_Npc?329KY zXlGqelx4)3TLC5~|G@$O9}8f?kQ$6r>{gVojA1#BRHMf?JU*Ua_SC3%siP;4Yu}_S zMis=@PK(3|+LS1WM59csl!w)rS!cc2zN(-TPH&p8B-3HPKvo~Jyr2;0d-~UWR|*Lu z+=`ted;ds_tf=*;f{ph@f{*`moGr}wU?4U6#Gi_+S68%N z)JZo3Nkcgc&c~5BL~84B-d0ys-6t+L=WzZZEGrG|?OtnkOo)7;#5x!Zl=b+1`#>{R zG>Njp>p=7tuIV9{?SQq;fPQ_*w2;U=X9!~@AH2V(mH!IK$b_1@ z2$bf4f9gVZyVl$cE<3$E$Ra_Kyt?V}iBEU5Svw)wqp zdmd6DiOC(@)`9Tbb_}LjB7P4V2p0{XjOwuH3txX2c zYyIqVNnTITH_}1tTj@&8oCs8os3v|Z1aV0ILkWA;b$0U2H~Wq4xPqmUm!$eBz~^CS zl^FauAW;BETBjN^)9?~o#1}uk-9?OA44ETFIXFo5OKS8PE5GlsFiQ>|6?^+D%Abld`PBQK->P1x5-D56h$v6P)Hbyu`|}pe2~c)v!gt zhCEyNQVha;dhF}%V)CSX>lzzW5eC|XU369XhSq(C>8fM`VJKu+hE6$gZ;3XD*r&GY z6WZ_g!CkPIe>3A;9ZX31tTj{Ii;(szD|mWY2%il0*DN-CX#}Q$9m%tK$=>h8J!R1E}|f&*RW2EFqp(;1I9((duXJn3>O`Jqs@cn4_NlyaYi=JDr%I zU&vKvgSJ^WpaEVC9yB(9jNba=hW`Nme-m%>*yrS zvpQ51%T@UWYF)TIy+hxmD*7sQ8E-pS&T6iUeIZjLYh#tS0ja$bsAK}r?i=4H5_0~Z zALbG_xWwg?Y8`RN3kE{9+&y~xmm~;!gUrS9&riArDx9+iAlAh0 zAZwGrx$f$77$l3{d1X3TRwDsQUb zFp=`@h^{0YW4Wr1TTb+6H8sOWV*?bSd4< zK}M99J+zTV(k16SLlhyu4Cjr{Ab08`^#hDtXE#$fcuU<~W_1X;rxo~8d@lCbpT7&B zfT99LeP}KTMoOhD+qGs=Osc$j?3M*yt;zGNNMzIekIJCBGxEgaGN&eXh&5i;f)QD^1l>5^Q;`3wn3ofqPjJQZH{_RxGXIc#}mbUkz zE-Ozx8I2OlEl0cM7l#GqD6ls9c0h{dq8L|4fChFTb8(IFv6D@%bh{$lu-FiucK*Fc zD@=;puT2~Co#W8#c3W3X9M%Ww1ta#kE6IcE`5*qy()jWK2q7C7pG98OK@b&a6zp6@ zTFxMpb&f!TX1_XGx=RJ$$p>9iN^0ZcKoI;qXJ)IWY##+bn@aR@m5O6rP?=eq2Y$!| z^SxPpp*^4|Q6Y7;c3H71F!@IZ8R_|Bezo$SQa`tjO0@2QTFQZ7@sIsc(%v{xZ4(zKH8@;c?;^6$*qM zzc_JWZRnXYC^%HAWQ924`R9LBf&Iu~F9U(kW9?T=-1iwii#PV@@B0#-EKtwY!`TCZ zqnrCsw1r_BW;OjX^=9WqaQjy^E4h=rr97h$K`rYlYu?{0p`#DdB8u1)AIE@eQ+!q^ zB+qZQenqzWL(CsFH!kgrSRizG4kKE+ucu+1si`cl#G8e!*CN;}@aAN5p^7sn#&pSp z^nH=ZH2_qK$C8u1O+{3zLbd>6d>&PxXfZ?RtJC+(PddtT7il)wEOGLG*wkMRI%R8z zh9f}@guhzmcZ+J0&}kb>Nu-TPypkX@DetDbZhx#CGtU%>K&dKkVhX!9x*7i%JzZoY z*&kc)hFA}0O$4X38w#(mv)*|djZXc;pooNDE~>+#vs4>H7?SK>h9V$+m#^ejDW|Xc zY>5`Ds)MP#InG=)9@tytn(%H`$#q40bp^b1#$KNtl;8U8w)%`<;rUn+7sWNc<(K~K zaZK|@?ft}`@C_DDLQa1yxkKOajTMA8!X||?u0iKsbc0Kp{BZnmUu_uJF!t9K6{YR$Nr*P35m$T9!DnRIcM zg0egYk`pQPMpc`y%KEL&BCB z5V{#;C(Mx;wKf`&tf4xbm>x&=1KR5E&H?V-G=E$Dy(9abDE%Fg`(^`e_+*d3^SD6B znN8*6!`cxArH#G4MkDXp?aPVSbd!1{4OUaQpkbdS1VT$x{MBOI{o8_1v&5z*VZNAO zdPIA1MDHb@v>H)5qG;{ZV*Y+Bx7`zBMt2JgX8H$>W6%-Wkt4w)Yz4?I3T#-g^QXfT zx{mH_=|`ai&2Rb&v^qogq>40KJaEm0#ct*#RJT!;lJqVoByvPKaO|T18wt6A?+1QI zS(S)~pa9N7ae1h;;J9S4Y+Ogl`Mb0xJ^u0GHe0DYyCc5R6B7g0L)NCR#joY)Lkw`& zsC46XW-3d5{S41Acz%y)o1OPTMQ?N+kz9Wf)gtXO7_T?7%pwaufRit9gO%SVWE`aU zkIG-`@G4T(83pS5hO~wfx?Q7{4F15-zB%JHoRU$nfwFma96J-V4?`B7jQvLo`Fa-1 zTw*^?Is7Tv^2`E^G){*C)Lr3!459TiKqW(~j-F3+X#Z!it?A@>h_o z3g4(^*8~W`3K(*eyJkP!iVe0dl`eR-dBJBvyOA|r{KGa(t&L>QG5wTE3?S$`qmf6 zq@qFP8Vf$uJRO^38XE5NerNWUKX}o(Hmk@eof1T!yR!D)Z4*gBh`*!^KDhpyc`sRf zF8r=^b6p>w^f*6H-rntUC@2lG7P-){1XIRWb&0B%JC-sSjWvSh%*;t!BAPtRE={C7 z#@q8YlU3ZX2b4uZt6ub*g4ON5vB38Dkb`qYVKLb~sv2E2H?enAwS2+S2RUrNK6oe0 zHT50Py&8YGs#D-ja>ts`OtjzHoOJe=(z+^X)%(NM!$Pvj0{Gn}_ORZ3yy#KN3veJtQ|7oDc>KD$1A!pu6J zGy@rLzSb%kFN9@NDhBF=js~ms`KryQf(J00uagO}t43@(F&}*L=Xxo)Y@C*n8PbMN z$ZUDSPU+}$7KerSdOT`DE5yqOt=6^q{%s$nn22FSi{N7$`^%K{2WzB#*;~gqPMO9k zjCSGIPg$L+LszvrR*B#X%r#P~g@(6~><0s-Ezg7IYe0TCyG{jDq(vz!k)~ddgL07R z*GO)g+v5%el}my(3n)-VpVcN2gD$O5R?~|q$&NPvM-I3iqf>~G%b8Vsf>^Mkz!MU^ z(f6Twg>y)we$|c{l4Bdro6*aY#Ym*1vk<1fzM@0qhGJ$3OmAUDALSECI1W zWr0|$z4E~Ml?7H;2U0RSsHPyLj+TBAYJXA$eQ)Uf>_`-3%(-dU1s~1Wt>AhH2&^9vgZE+KUL;#fWmZm~#h$BUF`rCInk2K#HfI3}> zY}TaAB`Jr5YX+&A{QWe?jDYGtfaPQZZ|Wa)#4qL74})*FDQ22vlz^G0)+SLV(> zQjz_)OgEC;j%Ku6Y|b}Ocr^V37Yi7-S|f3bDgDQ4NLXsJbfK9Su1-SP+ECZ{OsV7TfK&5(9X^7n)DvrE$F`x?bJEKDQS)DB z5xxKAeO~qg+J(Bi7@j}2I@R&jkX2#LADe1pHMH?CUpA_ESy*Gw4F0$bU$@Yqrlel| z+izqj8GGl?db&qO)V1SQmdeaDprn!FTi6zjZaojlD$}#H`$%e zx$9H>PP9-^Uldrac-i^T__IrDbE1`=cHZ3p`5#ky^)wa%)k(14b%RVoxR!=>2b6#Z zWN%n=Z0sq$`J6EjD%+*kzF=o>d11@dMiSD*sdS=$y&{r2F}}1rRfMGd9B(K%L6z2g z#6R%xrk#jPp~})++catRe&o05@JgolEfV*$cShiod^noxIjKVE_wDWcKD=%}KtYDC z1YMG3n!ii%9amh-j}bvJ5Pi+4ucfUN5E`w?qF}yFx}Qw;W`<}UO(OabG5z69-rlf zBiS2*nnjLdUMK-l(~(ZK`E(_0T8?yZlHp`3iMrZeve3IwOCwm-#0Z*tMt$h=R-%i* z;lf@y=(!?}WZSl~2O*u+C7-SqNpH2RRb&KMX;+~G3@tcS(vu{uB}?rN&Tm*yv8w0T zHLT1YTK+%))o8CDn&)ki_FH$F4cYUI^c&@3+9Q!aRTK%-+qh9H>V3DZ#8e*CuMkcYsaF@cDUbc!*PZ-6hM$WDdB=$3$eei_}pbpG6U z{Vr7Yp4Iy?AT5Yd?0mF7+q`Tlhg}y3X|N3Nd^5HxgJ=q!}UZ|1Z9KPgSIuS?{(^ZO%PcvkCvKd zA{ms5m4g`&#b$JPd;oEK0Cpg3hRI^wii3^QYBmJREu!CEJ&m$To zI|kg)V$b^x6=b$(vWjqWfo`E2?iM%Dxzp1nlt;_7fod}Nnx_nmI}-VV+d_m-CV6UKi*T-|y7D8kaA=5%g;UMt1a$F%&3G+we_#Obu1VaC)S zIlEo|5)VT=Z;XP;8aCJw^g>%1I5>yJXdBIuOCRP=+p?S0X#yHmcMvm$S8YHnKb47& zuM-yutqfj9-$g>+E z(yA1HfppV>&kM;@p=ntrME|5@#4hLKnqt()KDDQy$mS&t$jSA%f^y!kpY353vp zGfe7hb8{9bJGG*makft%M6FvlsDl)nv)X_1_G~ z*wfEkvSUtW%!*J5R4yM2wPo4!#8{!<#_n$cl`xg?JI8CRAADmz`_;P)5k-G+A?-yf z_kC+h7_)UxH;@e5k(qI1(p?1ZmQ}|o|Ip2yR&b}+fY$9~j|jS~BmF(!GV}>7>|NZn zR%H8R0%D!~OvYUp@E6XiWJ*g;9mO$7tG&C@>CE;eoANzK>3y8%{_pGK?>xq`3n0F zHeLgDyk-&h(^XM!KKw*IQR+m$N+g2C!AKESFaadN7Ix?=-wx7aKh^-zi6a+gf@kuV zOO8{IvxEQU)7D6C>hCk4*cAqAC)r8x(-1WGqFlIbr%wwa)1mx5DQ=oFM((LjQDm{L zO3soTlx3_s#h zAB_`qk3V9ae{jk5>(lSu(3k5yh~o22T!3i_6TY*7@B%FzL#Jsq-Wc-6vJ?h*@KfZsdu4& zdxyA$`)@`v&^$L8CenbNX+j;(K{9nR~0w6&*Z?U$B zEr66->x`2a7@rd@FB826o0lK?X0HBbu|CPT1SJVisj8q?HEL$#N0(zGeViuWfHe|V z{XNdYU*czXk0Vu)#gVGJP+2+-O78%X=p-*a_DS1OGT2;3Y5t+^p1-MFx{N52=sl|Q zk#s-Xw{k)4a1t?=6+4YmUan6h#y;=AxXKVgdOaywY;m0v>^!}A2Z^w?9+I9c>`G^4 zjkzJJ78X-MoSf3Kin$g-U1wwUSdS z$*_CpRe>U&Y~SF55W(qe>5JWfjGst7RW1dmLe7+yQTV{iG)GygN@AjKTIx-7ww3=B zn@KXJjfB!HD0nGD6CeMKD_RNUuOs=E99EOErE9=^`Arh=^7p0T;X}gJwi@9bx-a(A zvPWf63BIzRD=Xa{*J>N`ZuZ#2U)~kL37k zmT<5NT#8Lf*#OBb+(OM0ShfO|Aq#5a-&RYBq#SR2;^1LOkQ|F;{!$==wkf8YWe-v$ zKG#c)QDw(qq$s}9fr8CCGe~=UeFclgw$rXWxGga+#xj#`z5#E>Q^HdAl0N8w(hF9N=g`5&>BxW z;lQBnQM)SNxT99(9y!uKxoFbQZf1dR*cmPdLHRhH>04F$ljW+Se-Tw96N7>tEmbCe zu%CRF5KFzm&3-)xo?QMD)#%swKR?s&x)saq64=8+7)8??+V)n|perH^(h$dlGGdwx zY_OFa~Z0|1@Z~HBafmm*~SVFv_kbVHo$=PKQ!vv z`b-^jl#V#0HRDyCGY#={8w}-=@aR`$@n|4$6n*kv?O|1(KT*1N$F3%#7P>U9Vp=s@;l57b7VpQ?M&W55qgX zCl3AUPv`Ueo}}=;d*+2c?8nc-cE6zFf5mw@zgT4-d$y;jKJF)KOpgUm{^^t|92DWP zxys(x>MS<8G|y$dv=DM9kC+qj1h3oIvsCc*>V}iV$7SCDHElbJ&KQEEyFFOhZ&1r! zDIGySN#3B*9qq@&mTFydQ{rh;FtAhWIetcCz8w-REXP)_%d=M+BP9aC0(8)toP5W0 z$V95XhzP6vr6Yfo<)KKUWGtjoT=G+E!k4(M=I_pbRzExD-yp%px!usHDlEsiG)~?h zZTQE0TUR-Spq3jqUf0s96z8MgYQos3RqHg2&cakB{i4c4IiOnS{bzVM6g*vd&ce!0 zPl9`%QdGD2Q!v9S{{>oyTn<)f)DdyHNPK0vprYk85F2}e=b#ygZs#@U_L~K0=ld*; z_k~SVa3lP+_j_Dz;X!Sx^ZoU>aF90l`=&q>DPSGKyEKi`XED=2x%0U!EoTB7Onj-G zMZ|nAd(i^FI$Z&6o;UP2>UV|>f8bc*@r$l7OLtB^F{v``aA#D_;>^oQIeu{DKg}EHe(H8K2 zn*$4{=D{%Nws_p_Yz}ooYygB7FYUw^hD7BT#w)H}2;{INqIz)fRf`4JXsjxCS3)Yj zN2lDy!*~#?;gOP_<7s@>pj0g8pPytfzdl+O*E%!Hw7I%QHy#$Q7)b`~Y=7dOC7-aX zXZhTgsmRw-mX^PSmJ!>r&XVE;UV}v*g=*tWZ)$L+Ydx!kjt0u=7{O(RZ6;EG%x9_L zq5axE;d4b=rYODJN)KNMs3><|-V^Ij31U*H$)|d1o^}NT&5xm*nAg5!^Xrc$%Q?K{ z^2FwX-Ob{?KcKJLi`@V$je2w)#(qkSf2a@2Hyt>5A-- zq=r=Wfi77DC+vz9Gmi{JSyqUyJT%MplX135HWQ-f#SQ6~xYz7LtYyKqg{bh(n;!%L zT!5IX%#$VnNM#U-8kKQr@;3{%@AWgYTUqsCyXV`X5b6V^unj*MVPW8sha;~!hbEz&ekmf~%_QCTrobC5* zamyK9M72D3Vuxuv$$^;4cTco7e*-b~!yd~(ta+X7q?Rp<&4TM6={!;@3EISb&upEL zRH4eGoYq9qY3v?N@XWaNkgKzzDB6t^v7zGKlUD6dr6L=pgRYZ6bE(a76_kWxNg-^- zF1ng~4~;^KXrG~g!R35SuzZczo=!+#K;Yjz`liPYpOgvd1OMvDt2yC25672p$Vc;z zr8mG(`MAa1?$hJg{04qz#<8o+TrX%{K=oKZL+YmifYNlSyX7dw9HX#F!H$R<+Ei|ZVn2geCd|VQ&lYB>KrcQ2Hu|$Sr(DZ zD63ujF(m<5r||#y-RE#~zQhbHb_%*@O?5C;sN!1jR%k6VB%1!-Id~XRh$a+5gw>4z z;R!Tc2Art^ydr8!>zj;v4wXHZYqeAzic2!-Nyr*eVOC~dRc3&CCoMz;<6=Ew=n2YP zqpEBu=CZhD;DM`GaJJw36E=4kIKTvgZ(-qe&Ug@_}C|wux@Zl5qO)Th77ZB`6{3Vf zV$RuG1`t))wSJGRHJ)|igKKD(Ii}X^v>8epHwP53rM-$lDpAZUJ^L2!_8x`n->dj= z2AE4Ps|ulIO0}SXzOQ7hx{V_Aw5+?vG7P60fM0fY4FvGh7kBWJ7q>eTuDQWhfl)ea zp31XGwn^QrOf3~lHF$e?hQ7t3bfDJg-45Jh|EOs$#^fxFP75mD)-vsqEM+rfT-@Q^ z9$pdCI(KK*p)>OpzNzM85n_Gt!7Dh~9d)K*Wmio7=iD|?)Y;)O=U0B8M24vzp48>G z)*Vnkvd~1O3}JLsglSRL`)w`EYTa@Kwt_6ethskawg@y+ROw4QA+4BtY}ZgmrF;8+ zsS~0t5O;^!ymE;fgLiW)oh)S1O*g4l;VQtz)1@&G(V@WS?B>;Tp8p?!eF1>Cf6`P) zANavH?~V9@%d@*rM{1P@J)=)I6FD@GsW4u!VXus_Cc%-!xNrHca{>-!VYtk|J8ykZn)4|@wbo%q zGf{i6wv+GkPleJ>b*C}kUy8JQCXpgaURYHP4eM)J?^ER>88x%BondNIY$B4oY=9TBc*7aaerCe- zmQQ`tb`N2(}xQbb+Cb5N&7+Zo3hqy%q`ZQK8&JYM0t zK!#XT*OEYw+sUXK<`wLMk;I_PJjkv-SY_ljQpf57TN7^rU=uhm@6{>>GqEuzo|_lz ziyymv6BhxNt(6OBsa&O$Wnpl&ghjDyPNF zIVLl;q1a|Op$ZK`NT^8*ZFUJ=jRIZKp?zkB>axhul;rZ#2d-mRE5t1H<3f07qPtoC zULPxp_7mY6?BJrxfKLJJwD))t6|(DaTvCr$s=~LpzS2vks(M0wy}r80Xl-G^O|HM> zx~cc=134PDtrL^Qu3;lD2z+P$_$47M7}0bD7Y#wSjX@(=knZtn506kO)p;f-5-Ubd z3*rLokn#yn-gRWVp9AnckG$#ezxWB4ke>dRZ~iqPzY2+05672ZIPY_3(iuZSGA|mi zQdC&?joN-(sjEic58CP#nVM|beW}m6nCmfkw`?gh)InQMc7V58*nnw(Xb@;?M^x!4 zRR=pd`-dPmWWkkmYan;U&Wi`#&)7JXbFDg8Di84eCU=W_eXq{);|kVl5K<}&e-?VP zI=osEB@V+g^8qt}pS`$)XAc)$@U&>T)ub2IDV(ZBtp-AJ;+8stvl{Qoav?e-x3sB{ zYTb;q!Pi&~NpGo&2Ink^sVu;mhHR-h#MYr?O{h&K$O|o@hmDN16Hf!O-LGk}kwS4CCjUX;a^#E|MSuXYZVZD&nK$ zGe;jnv>@kp6{Lg)6j4>}UnKz&lc0Vnb5%{H#(ICh#N;o%MRUu>qkepJsTaQ->VAK(VLl=-SffqO@1kH+JTCtL?t<+L3 z;rrgl*LG_cE=M6jn59M>Fefu2Ge2R(SHAx{-h1)Ln;!eCANL9AnSb`=Ynk#}xSM}# z-XD^lSU1F2EyC9sL0DoNG;SU8#KyvBL8aGxzo}iGv@kU1FOYO!W=8)(XCHE`v&;hQ z$F8;`e}|J9>hIr40lC~1)qp)FqH^1-+nsr~n<2^KUse?QA>&n1)Ae&!Tztb~o@bNx z%(${|=+@=_-nR|5q_)SF#j+D5TDpjmY`+r~O&@H?s?WE(ve9ZVbzB?H{o&@XEXG_CiGoH_%$Rf_7tl3rb+F+yiL83nb} zPHDo`D<^$X%-ybICJbp7|$FekPCd zAItm0Z_3AWS|As1RZSUGjdPh@v6(A~3kV}5#?@RUiIa<_Py$)Y_}BGhsc7mqbN6Ikv|FcqE~dCD(uQ)aKGtv9Jdu zf;ecEr_sJksIU+!8X_oG_?sQ6SSpw&otQv$v{-@oB+|a8DY2kd9SQHc{S0OR&mU%7 zN&?k{OeQgu6MrG0e6#h5#Ougpam}{Dep}8%uD>TXVY<0NY!<4h^6xBjOvT0{1AQPC zYp9Wq>R#ctWkYqm-{VDB&RX?qxf2*n^otx5EQ|fR_L~ZN;-l5M)^`wvrxnfmhJH0tw@RJ2?KCJf`zPChY=2r)V+aR!d zCrM8z$qbU~L6y(i#cIp*vo-CyMjxlSL0r&6Z;1__0~xrqd1H0Wh3HW4q=Yk^J+s5~ z6#)L(BX4@;-H)q;^z8rs=0`c@Z<|jpUzhiDf(iXM`2OamC+3lv?&hh6Zd**bzPRy2 zvFt3UJE-KEbxVpZ3TYFy^y*fX4;Ba!ByW0;-h1b*+S=H+94cnkR+7Jl^Qdz zlM>R#Eu`$a+IlrNFxwMS*8yXlX%bF*`#jkyI4%@xVJxQdnCd6As(6Z0O;sEy6eJ48 zzf}@Ct0s2j)H=5PTYZZP^9_DD`X}z(!n2114kQklp0Gh%SZ3%8e?2}k)vBYbV)W`{ z5>f$RoE&^c6blKUCmwWi!dyuTFyx$C(#@*q&}_)3UOnaQ{!!}{X0`&lEqZ1+-5ue^ zl`BOQmA!|fEILU_3D)M38d~8VOUJ@%N$cDeLW7bRfaU~i&RV>ye_L4?Ej*@Kkn8=+ z6wZDy9JCEWf)W}w6B1prbi@QvrbzHIjxE_3k!mkCtI~obq@er_)`8fvozchSPD+^2 zmDwxpJOz&`Bi+CIu2H=}YU0cyq{qgLyoxKglcnF1klz0CH@)KS3pyd){Qfs509TQK zocK@YD;KZMM{{xuM@bBp%vCVWq1A*29oTXolHee)6m5;Dbq&1xDLDiJgl*HvS96;J zh4j}A4z@v+pi`NpvLl>Dx~&Kffk44-tKorzW#?@h6;exHn=0Xx`e45#+f-A>++_-Y)2VaE&Y0B8kOT)A~mWJI{AxPLPy_U>oLBVqa zUeXC5Q-ixxql!CfH>~v&l57f;aaaF4Nu}(QR<}$KXmHzYHX8_$MQWZ%+@^OY>w~3j zsMWNW)e{3EL4tHj3{jb(c^TvHICNw`*eW^MM; zM5e|UaiCU!<>w6lw|+V0PItBHbDNslA9R++CbZEGEM4!#d-|Lhl!#BqM6U=FS(5PCfa+QR;<_U0zOf7&c% zs<%oP`(znzH4$2MV-IzKtM0t@TF}yhw)CVbOjZBJsxaOeU^IX)GVn#_`WcziV)r17 zLqj(R1c*apv!#`d<<#yYE^JtI*J7;@t&C}yOBc0z@PrItJ@D#@5av8=x5Qh`=m;NG zvkr!?83+-hWhX~9Q@(oN1P#6AyP<7e*Sql2vm=X%VrMM+0T#NovzfTJ#$hUJ0~__> zCZ0XH#%q7mYtC09N59jwDA&RF~S**ATyjD6|KOoc%Cbtx9 z6q4&&1b#qP(_4q?{EU&U`cf;Vf?axsLX^vo3QQs-K3nfqBtNXod1 z?zMdeCdv!>lQA{EAGzhPl=_6fW0I*4P&IrLNrIopNK$Xcwk8G2C=xu33G2Y6eB zc0Ovwlw#Ufb?&t(V_z*&VMHdWW`cha4HxBO{^;}1;?5xpRN1SQMJ!|S9nyhgrQfqs z(sh<78thRkqa?kgTIHlpX3&06qlhP`RH5|lT2+~=b~;n;+Q~7_Pfr%Vp9Mc$;74|9 zvqEvUqKu1(r_jyISWA-)0vBa(K3J>F-Vf^g!_;Zd70_d+RVSw4Fx3+miPn#*>fn9o zw(n(<%w9*^429de=3MC6gpO^i)+q3uR%24BwHOGN7k+Zsu6Zd`qx9F!LJ)%J$H!G)QCC zv=7qly#0iy`m6^^bd{fB*HEBVVvaUT|F`hiwX^F|UUStyl3U8=GOJLhrjn;(OFyiy z{7FPrr9NvN;k54FZJiJ65H`!5ABAxt^Jt+xC-Y_NaRI*>!N!0!MD4gT6B8W9ilr>r z+ahZE#MwDA4L^PN4u1afo~vjmN|~)XUa2e@HneHQR=txLq6d;1G^%GvW=O(R1&XyQ z2sQ-r3E{_EL&yv8jHJ?O7-$^NP&7HGGBkzfafzh_PV~^*YVJLtba}P4u>K?Pp51ahY{RsMf1R=x}t*?o2*i8d_WugSr}*V z&Z*Hh1s}7G#JElKR;i(ybd*q|dV7uFP$=^i&Z4uC z+8)w&uD-%#ZN5w8HIAl)DJ8GQVFGsp-P0#l{B`4Gg$|wrdsRh7GJtb{*WgrBoJL!P zDXE*TPO4F4F}2wwYoB9cWYl(*w|Z|+?0R<_+b8!sV?P$_CCmd~jR28tg|tN5b`Y&% zbyi}vl2N@o#(BxmNZ0j&+PKxR5nIWanFVRDnh^En>zdLOQCQFqE6-n&;wA3A6yO)X z|2uvxKk}wmz4c=T+1>h{C%HktUoE^Xox7R> z`a-p>rPovgpz=1-Xs_^_v|XEub)_{|QP&MO7-sgKlYTy3TpLtrYs$OHMGp_@y4SQ0 z$x%g4-L(~=(`c?IJv4;l0?(#HrPZ4!N8Fh+e*WTKgVp}s-Mg3zvBC8DOhV63-sea> zjKH+W2Ej1rDoK^r8g{vl2;>3_(kVEk_88`9Z6Z0jB#x{5J+2<_ag-(p;k8Xqw#Ec& zY7Mz8c-dz`Qx;u)jV!)HGr*TDNeM;X2-@Fi^m=pyKBv?mbZn|Fc=uaUsLvd;4$jmC z^k-e6xCF0nm#|I!-uzjrpEaaMv0N`K#Rj8xLDZ;a7yYJ;@o!u|23`Hz*<#Rv+bt+(LQI4I}HMYs=%9~-1EU6)d{XU0l|H7eC`)#Q%9_jaG$DrgKFj54lTo2w$o)~>Z) z`X`jv(%=Wz38-BjjC6DVxfvfmr|^#I;aL@L1;|ON#f=43dlX1QQKn}SnmN(W zHXK{-2KFM_&yA%@$?jXnX1J$xeRV|D{!;4`rS-8lY&h7!Yy3GGCjU3W)9SnZ#PVI= zbN6}78F=P!iF;Z5ZlYfo%=TK}$Wlp2Sh4BcW0AU3Mx8;Dq{Yh8W4O+Qk_}lj&-Qzq zpB!VCCO22)Dt{SIsf!`2zs?MIbE<4mWrDFlORPeyFEQX+PtYdETIZOWw--$kj7dU5 zqb?-rCH2L)&M%oyHbih6^F5ce8jcWuB@okAaw5C@k#&*OJ|9JIG+3$S*(Wgzb4W=< zQaj_W&lYvqkB$)0#A`Ky%i~O|wy@Gzm_xGFsxv!|>_T?(y{HqM-rnQnYt8VtU;gE< zy8TO=yNV zTjNfj6O)ua4#6Byd2$vQH85=27dvI?4U)swfNZRY-0L`^L$8dmL4L^5{(`<|(Xo`| z=XCNU#1C^s2fCd`-<8ApImzoPRIu`ZE<1g6qr9d~X8~d|3+G;v6ZP>zrm*B^l*Gia zD|-lg#+1Y%yP}$OEbN7y18bL|pa zm$vE(TaRZ;NTLXiMjeM6+-;Di(C$Cw`gw=yRKXh?q=k@h08dze)3Gz>X1}as2JQ`b zQ3B3t$(%$VPmX)GRid(R!zD*{C=0dKMO-T?3pM}pm`T8WO=Rj}WRB`>Js~k9uPpyg zrFwH_cB_~jq?h$p05f9J^^439JM2M#yxoncab zW!O|YLKedg7L6Ha`ZrBRDS)_6FO&|(Q93na)dGBo--SwtYxv(y|8G=C3Jn^!sw@A3 zl>U@+EXB4t;Hnbh+D<)-GJ=EbOdV{|5|yji=uP7s8!T1`@KqKe$wzxbW$sDmlUnjh z+MNkjXGxiaWhgcbzk0?Tf^s&xLU`@XsRD*6UY?w%POBPChFG1w+FHDpQL$T&*U#R& zhxgyT(|&h1bJ<%KJ*rIci*sNcwm zCe@1tsLe#VpYnB&^I(rq=VZ2`5q{ebvUUNbaL`7%HxtS&S#N&R>TDdSdzQ$Q3 zVb)2qN$PdPUZr7+k>|m6Hxgo0i?Kp{u&%FZoPFQ5?=Y6TY$GAn3-Kz>FG^MW)(Q64 zU-qWgJo6DtNVmT0%{wGMfrKA8Jb3qnTNRB8Qkt#cx0txT8s6kjjUyFO-@J zc-shM^-7Z0tI(MFV=gS-Wg$<7Pq}`+_G4^`fU+ACGe7p(K+9c>*1OG$$5QJB{eSGe zd9bZlbszX!`#Zy(-lP#EnZW@Jguyg6iOU3In}&3{tE*GxO0^RY-5wwX#4eYUZlK+^ zt0dq#7!zy+W(qjL!~q9W28%ERWa*hf#x!O&Cb9rYXdd2h-yP1`tN-}+@LOx|^8^Ti z1`Z|Od-tAu?svZPeS5F(ot24TKj;m#7BL%gMCd zDG7^dP1ccmK||Giijup7mahdfJ@$4_pb4l@6muV6a};%ls|?03ZNKL_t(r zyKC{B8jYLP=oosLE}@}IEYlD(2}m?T(#1EP^d%q>l1gbc5u(dv51@c9p$6N587`Vw>e&k!69Gt{WYh{7)*w{f)?lF_AUa<)*4y@+i=!pETY`fbY-<~&np#|E+jOhUku z4<5k}9y)@}$R=fw ztWW1ewMr9szO7y#>1WP?^6LUl%l2#+yT1b9#b5i6fAcM&egCgIpT2y#dHnDSjVK#Q zH<7vA8PotQDTbU49b8ESfF|u4Cb9xv87-C)UDlVX+Gj}2Xl2#Du4C*rJoMh|NZf2m zR`j952BSh^LME?MPLp)leInHXJ$ib4p@P>+qk7?0>ToDfUrb+LCYBiI`|uD!3jMR{ zlIVTO5}Fu8%Fm$-V>F+&JXQ;hrsuFNx2x;G`(m+rW3c!3n`(aoV^SL>u;Pni6MJW0IW8`Q+J zmwYF;i3w?uTHTU;ZBZ+O$~vwU@u#&TYW$7KKa`-s>e?PKXfzdgnxE>{(;CV#b6_KU8w+D)ZV=;8PR>F zr2~-Kd)MAt8+aYQ+n4IBSvedD8WUUSavNhVGZnKL)`Ejj)998~a(ys_A$qe6?W2={ z6$y4OzK8{>rLAkkh3!Er$hM579iEd&TZvX8+P>@^+}4x-_{KN??VIjahxFlx3|~2W zJ6`d~Tk-T#$BE6nG4U~-ED{kozqzJmsuhrOH6&zT<2xzZY(m|^eSsRltSPHqf`ib{ zgw`pX@1C?CeI8PBp-afQN5vn`)aTl^n=Up(Tvg{O>DjL@`<1C?wL5)ZP&~V{Kr;W^ zo`a?Bl=$Y%RB^uBRNHK(d~ui6EcvccHcTxM>LygjMkIhO-Z0vP0IEn6Q)I0jda#L- zi#e>LhH3lMSn|}Cy_(}ziKX>h%$2_;dc7tW`1uep8wAr~l4#fC0`tYwr$@JOVo0(- zBWvE2zfSg9S}jk?2D&yGa9}>iY%-yYB%ezq2AY(V#0rAx46Bq84zl9WTFB7g zwR*6wY=S?B&Q#unH=>$IHwfxERKz5ijeFZ}(R^-V*ZP5$2Pdr!46JADYTZamuHc4AR4gYTnV z5QJfsc46j4Fay(4GKlR4;`}$-?-zP(3$<0_(#jmE9M-@AkDxoG(snTzGu{`=vs(-Ok8b z2YCnRws_?@b5nHpm{+Tx!h5RHVdFJp+pg{X7}$Kpl;Y7KHl z8*;;iYio!Q3^L%vVu@4Bh&%U}h0gEUqgEV^Y!6p2#0bp7fY~rHIy*7L2N=5%ksKeQ zZNcN+n8cz1#_2u<0qGIA0!*CQz89Hu_-1y`r;^FZ_eMHA4b`SIm#zaovIGWqY&PU+|(YHFmCbdo9vnn8^-CPfIE=1GyBpEVq@ zy8kNqE9BXcE@@V@G|Q#YCkO{;#Ev+_!f|3wo_6L;aCr=9j2Lpvghw|$t4Pg89387q z921G0BuMJ7qGnE!XJJZgIrFtZEIApm{A?J0!F-NKZEoVC^)(!tO>k&B#i8k>{7w~V z-!qX4@=Rbl1RPkKV`DzEL{YIW1p~~RLHz9L3{TiPi0|JzfG2EiVJ!@p4?{f{GP;ec)N`iPwH%nQVSPI5q6@V{ z6iXy6vn5#pXE_Z+upd&Tu`4jC$40SwRf{cRjceR4nA5vB6?m2XcC|4~ok(caBB%lf zA~1A3BMAnM9fCwW!ycjpi)I%LlUb&mVWv>+?0)IZ1z5JRWpis69V+o8l=vK>wd3-P z%#z8a4eVLq&V1b_Rc{n4seo#eNWdHLj_&RJwSM-hXYT#P+rJUo_i$HF_{hb_^dpxX z`(*h2e|+NmZ#@0DwS7HHq>Tv>C(~e-i(mZV43o=+Yh)?n#rnn>LDfYS3wq9FCWfh9 zn3RNZ_J{28is_=v*hrjaNNl$S5AAh=Tcx2ot9f5sjMhKJ8hF#@>(TjOkogf>3lcG% zoDRdVuZ(ezLd6`?#%>4dcv@*br0yahM@;dcV&Da)R@Z`P7k@U>ruXYN3hiz?(u!*Y zepM!p9!IsK*w9p(xpX}7#C9hFD}FWIL?Hc5Nt_uM1>q=rmjWyT34#mP=D2We9k(r( z*h8!x3ffRdfna?$!z2t9Y*wph5K9QG!qyIL23TQ-CE~KCl0bL{=tVH+4r-Zo8J5fE zSbVpUb}~tHa80u#5m)$8gAl}w{A%H5?r}95KVuHlc&6~{Fk7|GmIbV*R1+`JzZ#_t z+#@FjC>oY+(-1r3R68!AVTPzpR^az3YPw{W&GZ#30+ndaIioyqiNQVM-FCjE`xtgB^67{ zC6=F#HD5q;pRo@R*$N*>Ey$Y z1@G3R)+w}8v3B_?Himqhmq@+FT!o;Jjz6KaWp$}iiAhBlrFP&fWzj4ZT_)#&)M324gb4>Vn6^R(IRd^~(&$O2LoLCa3PjyfF}KQ?x`vz9SGhlX^es7bGt6{l7=L~lMaJjDjOYF*Uw=%b8kYfd$6h^C;u z3hN*&i^RnRT4@s0SDuJnz($D%ktLEXN8zIBSXkw?MghES`OZIm&EgHOLBL1x4L*ji z_lY05_*i`K%YSV8;FF7oZ0;}5ziVGs>Ez~#>k3GuXE6lRT8U$Lh~K5$d{ zZ?$}fZbwxrBH>PierM`dgceC@-ilQ^cp5Y7KE%znawRFrXp}{p;$Zv?>4mV5LH6s7 zB@rS^Gmw<97@bWtsOlvB4lNa|QioVfgM!lVmULijC8buBti3^9`o6Fs7%`{HF;I1E zZy2i)vF9&zRL;Bs1zX*F|0=azh*6A5URV-y5VgB05ERWdaz_!xE8N9hAU5rmm)!Ai z$7^hBI>CeHb8HO(x9l&*#WD!a-`K=#I&lO^vBGrHmIy`D*XyW8JMi%sB*M{&M?@z; zlIwyTq>ctDp_e);QDVz6oJW7=f<}tSxN5KLeJt%93^g;Y!rPfZRi7XH+LG^K;i0{l zL+eFfa@P|axz`t(5=MyB{&M9Rh8X(7NDvc- zp1nXFc>UtdZ@nzO_cdSEuYLl*h`oDkLjr)uzWC|aE&{f<_Vm1id+~ymhzV~<-Eew$ z1-TPmKd}}L^Hoygd?M{@8Awj*1>1w?n0(OOsLh5X_TukeB<_2wHcChra_kdig=S4k zx6fF;1X*A@oD348s!kK_dYOEzLV^J!f-FQN0y0z-B+WmbfHfM7+-%EgzBqY!DKvRugV zJgZlHN;5yED2ntNK~Q2RD#R_-mrput1G}43W~*eOEQw|-geeU)7f2q%Y`w5*Rw`;g zGjStN6588FL5jUuEgP&4g$U&;(Y5i$<(uC6(RkJCKdGPk6rPRK_$D6TP-5)w%wBrS zukOC^vWxyvoWJMWBO!VwWx$7gVQQfliy?zrM{Oq{ zE-AA78EJ>zqD+?N!7l~(q5HF9WJw+x@yNV-TD#G?nJ{D0D=Fin^@2&vjvz|}(UefB zbX?g&63{pSFo}7F5fCA=fP`fLH15ZBW8TQb0q)9_6Jrt6VoHPsVM7xZ#>Nu!Fb+e1y2*hYoTo|WQE%-?RQ^oa zHL+)fo~w0}^U>%!cCb?kI4l7Hz_PQ(Vh_kyS1*RF%`Vt z-2y~2CsZols<;2)Rq^AW!n5&BXCe*X=ns74l4B>?Ib7FvENGY(i`Dd#a0YX?JgvH2mVG>JjZ@ubhC(sGgYMRlAYMmc0IoL3=K`$w#uPc-I(XFyDkYdGo9E* zijQ>eaRd|`(SaSxGqqWqgMk=Jom$|zV+9aIusNM$I!v%J1Z)liCL-7v0tNw2FRd)o zk^*dXC~nTvdH@RbdZ7idCIa0eqb{NAL+rV>FrAQBo>VB&f52ipE#}4qtl+Tl^S!i# z8ncksC%!MGC#|4k;||BJI>sfo#XsQwZhJ^k`)BR6dJ%G7Q0#hGVnX!tlxs(&9THY9 zMq=yZ$j%<)RvfR4SAOt8^58eT_ZQxG2kypW^3D9v%jZY0{ngzUU3PjhV7ffH_Mq*> zL0lu!|f8%~gALSBI5+`Lyt; zw!{d|r|A$8GCN19^7VQgZ79k{me&-||c z=7G5w2aKAoYJVrx!)|T}Zk%E$Ql4GFX%MV5gk~;C@suMt(U2a*#*}0?g%ASP!W3Jx zIT;Eo&Y4bt=>&HymYB$Xaa6fwe+i18B|*KjD-nnNN!8d{_)+ThI|X!I+9VtG4@QBv;%h!MG+!B)Cs*fNq{;Rh)j&qWNkG7hC=T(NUhl2c0d-uQn!v+ zs(?1jks1<_cV|$;X09T8S%D#F(FD3Rhx6G?Ib}B-^~ce?&iLl{vA^?q{ro3ixcIe8 zw{`nC?&f3oW`FP_mt1+`QAeNtl{?pm-N)aw^Gt{QTL}jnkPFx zm*Lsizq=cf+}#(r>4QIa5db*!FWIZxOm#N^&i5%W%q~|;&mo8zd ze8j;G`GPc8j573;UO%>Dg|;q{u4k}eVOm$&-t*O1bHFuvtqeiT#T15-+!AA`^9c+k z9$RFAA?$=joW_zqiily@3#!2Way`a4!2;8oKcg%bBwdZdI3O3Ld`O-T`9y}HMs=6Z zP5>P$1zduI_VVmt7{mLt!hh99s=`O=6JDiFe64W~gPRZKjL{lFu6zMWFcI#WNDXz4 zBu&iwGC_8+1nbp{F=|byQYV4V@#bcuEg^&BfO|g7aCo|IFNQ=DXBDTo694n3wsCS_ zv5bnPs_B@dtN5ptPY6L1?RaY34b4ir)GI=1zE0bnuu`hpelsD^s zlq0`6E?i2NFr?=VkplS=Fc4^##Hq0ZvE2rKeWjWzzlOqSk!oEw{+=Er!Q>X$b_m{T&(YBHjx8zj{^(46?2y_l$-N_)p zk?<{5mQ6*)c%#7jJHj&Y8Wt?P7+t$FAigY_O&4gs5=7kM4DeOZh>c;%NTO;wB}?bF zpJUJ8zcBA;<6-fvs7*s=rkixBBpy{!m%5zRM<#5T2^SMZ)T9-BRzLe!KfC|azl~?( zPw*{#guD9!Dsplu^14?&<(!LmCUT3}t4%bqZJU@hQ}Tf*hLS(bk`3kahL`p6<=2-&>zi?VS=!g=E67DxE4jz>HAWwJ$S>sN*GvV+ zP&P+Z!6MGFzub&V9UbmQMwi;GCV_4DTjK?Ul!QCxIK{%cla#e2#mvRp5^1&|lE}eY zsQFA38dHAO47H4-gt@H*tqj2>&3d#vGw0MJ$<%E}wM#)xDYcAho-29Fm5k+Ue_kbO zI_Is~99#2weI4h`R#Pf%KA8zR5#XZr8Gi8a7QSz5t)VaSBCkzBWT9?70N}9oTQfz0 zD&T9uE(X0YTc}7g!6@Rxp{u{1 zScV_q%(KdK>XlLFlBf@i{$ znWuh6hbI#}`Oqewe0T#ta9{&7)-c7IHwI$D6%vY6d`sPsSUVUz+ifZPK&HWt1czKm zYliAK7Q>tsX*w+q#f5atjp@czX$XOJ<4d2n%MCR_dU+GgVSuCWGllB0m!7%}s|WKN z@GN!R;!;CkeezcA!@l3~iwQfF`)pnR+8>J_JNB>kp8FpBA{O834QcpRyvSc%atwcQ z@v+?}y!h#Vw;yEx$j;)z&3!$`qhvm}!>_qUX|0_L&(Lq%^D6L}D-KIXUw~@7+>^*mVzmr5ty_jk51TUcaQ1S?cR*3Su%~kof>GXCR{2)SkxswnV(8&*Q@8ZHok4n z-N1B540k!kAX!bTThzwyMbZ*Evm&?K_pJEM=c2L#nq}t&DRCHG;(`!GTUyd{RkS-& zgAX?pHWP)Rz@z!y26nKfy{SXrn$EF4%tl6;T~TS+tnE#uHe$fI-HTw7{|kZx!+`T< zQ|zf?N7Y?LRbyD3L)HYC1J((F>Dj(D4fK)Pds+B%3N3}XLfx*}p=_M4gMSacgY|jj z*9k;g5+V!c`Pd2;^mq)>kwC>2K59t}JWKLWq_G_04x(kH*rL`1Qr7#(iW6YwNQTHz zsP`@-U4Ucpip$><|LpZw#w-3D@A~G%ulM+dlpn_~K6dgEzxAVETVLpMeLtSJwI9!8 zZ#Z$eNFGaNDT;J#gCIVa5RHsUS0Q44{Za>?^)wm0QA+3U>I?x^R3?xWd=0TtK8+4Z z9b>W4%G)Zc=Wkcxs*J5?^ZAe*!IxualG0uCoJlp5MNxWh0MZm2T`~#@c}1iOFbRE7q|oLm)>p3)$A*fuORHgGYap`;(bPf9oQ^$cW0278heh1P#oaX0VZ5qIeI1LLc^I%30_H(*a57*T0!}SsS-#oR zLAM0hloG~gofsPRon<_Vw+`~N#JXMtc+mB03ZNKL_t)2)zG>ByvcEH#NdBM z>Fc~viINKo=Nw7DcvN3(Yr~oK*+U#{V>L}3u)bTMw^x%8#3RjU-KGarvcn4Je5YUf zuwHrjpT`fq={@n!K7?oER@?)R;amNJ$1XW`$HQL!<2O9;0320zJnVgOJk|hKb{7P7IYzk=DDllY~0cy&X_G8%SMP zgf@ZzXco>g)2z3PcRmQW3E1MDk45UAhM7pTTciK%@{p@)pSEH_C(wsH>SP6tv)1wf zJ;Nu%f}{9zr7ns^t|sfp2x%*`&|?2R7jX-*hyYuYbxcFB1&*$o$+R;XSyi3+n3l9@ zt%ZQC$$)tXm`cE*=>&&{2~I4Q#S2gm2(T^=UY2$mpuv|X=JQgw@mKFcTd{hwh7^L4 zoePH5fVcO{|0^8KYVB@_a7S7jIVzRvR}8|;U+ z%UKZ`$nCZ`M6$~o%(D+!xsRh&8L+xM5Ti^Gb%Gcth&n)ZAQ(znWn+RG#1R}qW$C3G zg?=XSbBn7)sy;&w4Gej%GA(3fN#^zD8D;j=ICJ(cu+SOiQ#3>i|BkP^ zIT`TK^*J88KF34Wr#Npu!FjU@rp?Az8I>Y^0))7$$ZWpSUhgX?J*M*&LC2ugI>(5M zdSSEPz#eYFwpH2z#YWg!DOS@iCrj8oCd0eZUbvl`C#j1tfp)oD{`E`lRs-4Bz&$jU zXWGXe>3d6w@eBI7PrPRFyRZG=^8FvUCpV*eq(jP&Lzg~tcWt4QvraF+ced0mt~k)^ zVuHoXeZeTJ+Hr9kL=Q8Q)eu|{U*k#<-dS5*eJ#D2kr?dWTa}m`sSduq3Yy4NarSGF z2KcFJ|Hfh5K{?iaI&V~*FsTjrAg<*T+GV}{3U@{fm+{<5ngxj$7B%y+`k6TJlFU$h zW~mkk36?ox=;pyp7&$9RVKacDv{0Re?NGlicBZ4~T)<%UNUgHxGR2|UI)>0**kk7v zi=(z}B&}@@yM~mHOdNjQb1w!vcMHy%O>p*Xg1rEQbpa;8q9c7UhONR~l(i4C=tSQP zr**U!XIw;dWieh7WhN3j=t*FRJcnAUhyQG(yAcel8f#-8H_PtaT(E?8@3%%7vVx~1 z{f?rLu6lE6f#WXvD~&mg(l~o9vE2Q+-JksRYw?wL;W;>gd-x&u?h7CB_#3x> z_Q$_;;@Q)s9+bN}(Xs+A^OEI&yTH*_fKIM0ja8yKa{_JpLG*bksC6PH8 zD3|9F`9o7w*J+IwF;KMZ0U@EwFe}U`vN3zvkGAIpdfg({i>CmiE zf-QB_h6t8hF#3QxsbWzg6a(vYh+DPED=EC>*O0?Nu*JwkUs5; zXN%ai{EmbcL>BUb1iERn@Cojc!vHmH%#rCf#eB7B{S(90N=3BfELAik!e%NdB9?In z+t&kl{ImX#r|#g}@Cf(hi(fK->6boz{`#eFd;F2#iz0hHO@vudV~Rv~l}3|mA8m_k zJg}&r4e0_Rrwuv!3F)0Vvbo6TAoo=f_xLKjzOK0AIeQ9SLT z&QFwFq6Nzm%dT8sAqn@;5DtIxz~mOmXKp^kvep zWqLSCFpFs~OAV5O&=kEfm7TRf@&vqCuKSpDPHJFo7eAiAH!fcB1n#)$SvyaC*|T<^ zy1=*TG2GL?;75M_soQ%)`1EHUw0`=DH*EhyQB0bFnyw}QG*Fqsm^S;FeK(U$+7`Ko zP&7!9tn8FmlNh9(FB_Pu^~CQp?^eC$it}7;bhKgiwI?*Q-a<1k>APX{Z*&XeiAhoI zaw$5bMv+{R3qr_MZ6!Limfq5BrG*_Aq$j)yX2{PJZUc%6cQ2mD#G6i_Tf4)y6WF+M znui)Kym;%N@far|;GFrv<`UM9e4$owPCrG8VC{KK^MG4?VV7gnQGC-3OuBAY`FRjr zIGy66=@b{vrnq^3iRDV+gijo*^JH|g#e8s`@qz0w@B%Dl+lTCVw{WI{2Y>%J@SB>h z&!EiegK+Hn7SsakX3i`AHj##LCuN3JH*Jm)=hrdPYgq*(X@{vd{&~G#``>?V?|*;U zj_kY%iUr<%KiQD3xcHd<@NfL1T@CpBb%*EsfA5yP$4yk%n?=eWk@!1i-8H~Z&!X#m>2C>n}!ZQxf8WNgGbS`I8wb=Jw!`|5WmHw`wR69|sf1Gx5IiWTM zmi;W0=12T9Dt>ks%sek2=}ZP3nQb9R=%k~Hom0Z018k|Sjx^&xX&xPEk1m>EK`x{u z07n3w()kb$j2xY}&z=l;@N|kj1-9d=>(O2p0XD{ErCDlbmSviR3Nh~NJ(ET3WwVhE z$AdesW2KF&bdN)J6}mebmqWPatA}TAo<=?1RVy<~NnAxr z&jW!qrWjPmaB9eQT3B@A=uzsRJoU^+kAoySjXDHLorjetJc+c{KcXGi3g6tRBT|*5 z$%2w3Kezx(8L)iVxGQ+^&nIkzppu%+-qFb7H3~eY2f|lhKr3PeU7Q-thq}&}i z5ss|rnrvzaRfeIGxBSlpH;NGlgP30()ndy{Mv8QyKsD?drD3*fQaaM8oZ%uIB|tT{ zO#?*(Kk>cVu8#D zi4J8}GyX(Of6p=F5t7BdWiz5=TDA?*oXbS6aSBHY$(c}r&KFy&wC?PHr}{cMzBZpW zreVP5WafrHLfRGI4e?Y(?JTHZVFBQbr4<;krf$PIsU{X|`o|`<8vGhsjgCh?#kC&Brc69i zzz3SLz^a@4xR)=J+K(L&qK*tdT>*kfew}q{b zUKZbZ8J>rm@Ev$ezTLm@gO51)A1BK=d+6=E|72@7ULfM=Xf^MxXDQZJSlXFUm=CJs zp`FvQ1-;BK8x`S!Tv)Yrj|5o7a&3H;bbroyeJT13L+!oKdSiGyzwQi3OoW$v(|)j? zM4bxreySsN`n|$2^o z4!_acQL6iT>4ubHQUwk?tPv;lZH}6OS()B{VTqA>c~xc2GPB?ft(^W%91aM0P@9C zZ8uDJ@u~>Vxf|kje~IVddVGf-!?*hvUVh1yH$3#;J>%wcPwsDS?8gU9qaFay zG*--SOioaTIAB{O=?2zX+P8M|&3&O1JWk&zo7sC$+m_8J${kT7Pmn;P5c!KFz}T`R;eR z8hfUs7rjV&RzVH35chm3kX)HV7UL-ju4^*u9C^V(?A~2cdjX>2kPF@twI55-nBBR# zQEy0IwOz`YparHA_}#D08m`rAzWDydyZ-Rs?Y`u{;WFI*fZ31$;6s-jyZ#}+`#;`% z*7joa;7)wVH0nk}I9L_2(DV9g5@8)Hs7pwog^rS2l@}^QQcyCLY|U5w#vm&WlEtmk zm}Az(fWMyrE*Ik_D>oi=XU3Lgkr6!>ZHk-C2@O#VR_|uhLNHcuaTZT@IK%piW@)4) zv&=T?>t~pRHAOzH)DIU#TJbAK88n*--SRP0a#tv;+ejfcb%i4_R8j0i2CNNJOj3|x zBhKt11hTSQ>O#exQbro_x72RO+>ik>#b~5z+#ST+Q%&wev5e9#^muRxIA;hL1X!qI z5WzzGV)$wwBtF5)e&QnL(=`UF=4;*u&n5$yWrdShwd3-uzS!)I54_zM5hX<0wAaop zQr02Sk}t;Rr=S_RaFUMxsQmsB;=WaHy!K6duYSWj7jJtzo`-Aj9efPmsbBn|i;rFZ z@K-+LYx70iIPc`*QA5P6PpDI?QxHoDRar6YG;>b1uE*}y6z#Cd#Ctu8Y57AT@cL!g zSNq){Vp|xQ-zCjLBqUg4mji8}I2Ro)oq;qv5QwxS>TZ;{5RoBKvemhy2Q>q6F3-d; zI8Z(9kZpxnEib7nZGxrKY$=%c>8o*Z4h-T6u1x=?Dp@HHM>#qim5!V@BUma#4e1jh zuR0D2BqBpPrbwS`(11g;O{@*GCNa1#IpB)DUUgMBW;cewi>=yNWcHRbSAzswybXXJ z#+ckoGhF2^qs!`a*R%MqrO{Lfc+hmffe>)}GGYqBG@Z-FBvoCJ#a)pUyWMgf*`AqV z%uC^CnQf9b9npRf(3nK$OPQ`GE&{}b9daB@T_Mg*bR?-`7{3e_AE@l_tu>sRH->N zT|1q!w=g*2Zd}n4wO}eg6(eS=GmqYa>>>~xC01M;UQ8U#1*mRV&}r$+hG`cNyZHtV zP%n3acIX?G#_aVA`PhQpfmP8K+|qU}RYzN4ObMOBTWAa`kU-{>fzTk8j?w@GUgN}`RAa_n>(ts@v8WpEo?O*l(f zq|0s+)Oiih5Jwk|I+s{!KcdEx7RJ<5vNMO6IU)jpwE{j@w1811sW4|lRrehi`iA_o zAh>8Y;KJ#E3#J2ZSuC;i8xj4P-MSk+61gwH>yu!0O|`YKc3)_O@}15{X&&u|&7Qca z^;Uw*kyP4H>Kv}${#pz{o0Qvz=%hq&DS~BSAG_N>x&5r8*Xvhbhv$ChU^;$;@Awg@ zeCbENbo}igDzgnklXgzKtT$B|;uxIT zOmv8??EFDb?+%m!)Z2{UxbzSp zgcAQ;QekD>fP_{B&G11QDu=v)1TB@H(Do2YCXK?HLa^2a7^w1P$LeZg8UbAtRvuI- zEwiOm*K?e!O=C&P#BIY{vSbJCM4Ea1zdD+Rl1xC+wPX}Ktx%BOAbl=T>8RAE4=Xg8 z7S~kX!mgrZ*(lk~B7c2+4m$yq&$5}xN@d)O6A06$q$Vq>gYNNSD!`LAX856vHJmpY z+EFoe^i1esjh}XA(l(hxt6W*{I!=XMnew?vj#CXrm%p!KNm|O*k=5O)WG7b#1`2pY zve%M&-0WwPui%pNs%l6|HZ?ioPTYFSKimGX-`K^@s{x$Ez2xy7-;n;_wHL?B{{E3` zFMrgb*A-Bc7a3_l3d@e`x$SdX|pMs4@35D7c2b((4xQ4UU{h<0Oj(f^Dr2`K%h&@TAKr<}!~hKC@K z2_OgArCb`U+nBZXoL2(wGL#Yq*_D#h7X*0de1a!!&hW7Lq{d;SP-twiOyTF>PGM z0XE|jY~s)zr*Psed)VETv7zBT*7Yfk<1pgJoxq3>GN zU<+NUYlBs5$IV#lji(%{MT{@yi6F&BDtqi0?=h_2G_?ve#OY9!^$;CME+mBwW7;N` zMJge>Xp}H&8+t-5(P}{=RB4GJgr^Qth{7)H-4-2PxSHaOmL{2sQSJIgw0fFpo!tbk zoc%E?qwFK8z~J)^s!>yfuvt$mDvkP@u|jGp^lvSYV~rV5(&=dFu*LORn#613yLH&} z6hv@%x`k<>c&mlf)K1e&PLSG9NN7P_sZ#(P=iPDGQf3ew&|5mZ>^kb|S7jmueRe8D zbJ5OjV_u*$D-#EiiDC+1CW6Uiz(xq;HKU3zonF+Akl}N6b~vr~62bLEtXAih=RRYp zZD)0`;9)dtuwhLpG%CTJ1f`{)%fkA+9*pFfm{a1({&YkTB0-Y*>J~LvkU9Pgx8E9X zzV@BFfAF92T-w{K3qI$Pk-S=-Bp1;wnh6SW%)db^f% z{=LfNuFo}>4qL1bEuh1I)g}_IA!(rF5F);L6{5YT`C8A2FYAFCsk*cKVU3pRN|Qb@ z^lm5a%{@U-Q!%O`WN5XMBUYRxZg8j9n<%slIf27ITnK?7EjS)}!`Ab5KvIhU+r+X@ z9gGu0L4UKGSQCqGO|*Hn6$v;r-Lz1zGF9D+HN^^_9UHV2hKnICw8AudE(_UCT4|}K z`B4Y-vWz>ETHBdp`dd~S>|>QVe<4l`5Uhv#-&znHnGD#Cn%H?#W=+Ac?flha!wD-Og?F#8RKF0^?Ds+@syFJjS6{KX?Co#e zd+mS1W%o?#>wSJh0)P)(d@TOxZ$AB|ubef%{+yHhXK#)grF8>vWO18#mX0(-Yw3+b z_#Q&XUPR#ZKwTa}*ALI`1-y`}k;(e+wL4J-z(uS%st6he9YpPTlS0eXiGkg2+wSWo zKHRl<**1p)&5Hg?U@7tG=auv!DlPlUYrcdw5zP}Kp$%Hvg;Z$s4h^VhNe_;zQg{h3HV6>%LWt#sb=)#hIsAOA75Va&NuG8 z?5%hnzJPn-V{&ggnE!kB;t1d>?7raj|Ku}w;6ZopKYhN4=NP1%)^irbugVWn#FYVB9{gJe%{lg z6ICkI1=gWJ3~d)m5GQqpwUdxSu+Y~37)>AnH*I1mmzPC{m6~I<-=X(a(g*-!~0B+O}N?_vM!t$u{Cm#9_G-8y|_)6o)1A{ zox!T?yJr2$lu$cg5+O~K$jYIypA1x1oth5O!?&Hj6VcX%LA2vU zV3QJs0{O~oDMNBKrVM3>ojb_N&r{9YmX}9b7N$B8Y`$`$>z)`kV=Er*ie&94G7A$N znjUanfOG}cEzpIQs6(5dtn~08Z5YAJK7K>8qMxtxiJ*YzPTSRU)=)S2XJ>ZfO((1y za&GVC{*V>mt-HUd?^_Rov!??#L%``}#99cLhjD}A_==`O$+8gb6E1ok4-7)16Uwp-( z(~Hl=AUm$~?N)%|_X(-bw|WV(_E0G%*5!57sbg3$$LzdlnReco+1kl-DV~mrBLa-t zGFbLs8s3Vroc6Bb*|y(GNzu5lSv6B}(>6PhwsF&H!xBLFzlZ;tzJ`>8#bT&vt9-15 zn)vAoIZ%}>oo+E5a}bBw7cGiqSy?ac%AC`}S<2gOqI;+ouVqbtFYfAExlH*rqt@JA zuS`nWXK4`MaUmztjVKYz*{(*cPhT(1 zIi7#-gz4@R8xjEg`=_4&o~zGZySy=hA|;t8&!}Ub@<5L_G;twi*$2M5GjnW#qzy=` zRlnaK9g9}Iqq9%IXE4fn(&DJ2cBIm?(M_y%F<;a{SbUkIjJ;8(_yk=E6}bz3 zz$&GC2?*n#lnQHL@RB$htQb<%_7m!vkwP7hrz)#4XBdar>=&TUu`We?3ko%yK~-^^ z2}%NOtT(qTt4>Lhrm^< zXy!^$%#EP6r**P}G-puOV+pX1(cPO!7qycV6Qf}DS*<&WWtU=Q7?(J@O8IS_uEX19 zc_Klejp{L*Gd%I&9A{65mKl(fd>PuLbDA}cK$|&aW{u7$y3SnP1~kyDQN}zlH8)@< zlZKVSIfkNi@Rbf;^hr9Z&Qukz+rIeCKXvC1-Rn1_d)*AF?R@m|W8ZgpdwYK3_!GW* z>YwpKqP;fNGI_g<1~IYS72`D;if9HtbVFwxUukwF4r6X7pgj{96^m7u*NzssYGVx& zYOLh{OB$01=T9wSM4g;2z+YokplYJ1VTPM&8`Dt*`UI3iy|c$E0*zIj?#~>6=WeTpfZ3bP2(n>JIkfN0 zHiq>&Q7f~6(1loQEu+OqwlM(ZwUca)DwDWYM>PdF7V-=Dvo*nTp)+Ywpy|AYrMlpB zO>?bjZ*F4qb2}4YcMEqMzO~Y|3vra*lby|te|zZq6yLKp#qIk`{N1U&7W#Kcgdr*^ z8kc{ju{5qL%9c@@An1G>Yw4EB?xi;9ux5H9^KlxZ%FAAr1HDgM0ra$MhM$4*J23001BWNklm5g< zY;bv%p0!r}`4yZ~?<;45he>TJj&UPh9#fqo2}2K#`j>NoRK?JWlwg1kS*~+icp8up z>&|M1Sj1yRwAyE11J$dA71G#0Fjp^DI4&(%;tgOwB{U zx$_Cmnhv;SZ`qs)G{?4jerD&(y)!NSIB0_^q^mnvT^-O#%Y}|kC-8oo_1y2v-p;E| z{p(A=rq}%balP$E{Hs(=eRo5;dyn^BeC6V)mpuJ82(CLlleP2jTs)T6^>(39aqJg# zp@Eh0=;9_JhOVp@GBiXB*qhqm#b@B4^ZqLK(nrrx+K@DO;YL4pQ{+r1p~2{_4ynb< z>%djX$P|tWAiQceL4bAR40Kk5s}QW$N^jW_@7V498H}TMqr#Vlbdbfn(XlEk4cr;E z!a}qrI)FR_HzyldALb(zY8nh_#NRy7x7V7_AQBQ^ORu%+1aYm<5|u?Y)X#Vg)!Dl# zf`Z{I%NedQ8w=iZ(Qh}lI#cQs_C=&AK1ufGGKOelQ?98-^VX>dwg$o3vkA_g2J9{s z`_Ubfo9SXDbO>8Wb-O=%PC$mqxno@=GvUpt*HvcX(>6}r@y?w~|HD=L@BjTf^_J`K zd@OJuc?|c3gM9BLSMLANi+|*{?b&esB;u?i+slUsLSk2HgPJQ}nkd$u?!iP%H2R`` zG=TKtlhtW^3R|qbqN-VCFb1&In@dX6gRID1G7ctGlIn`3LZoS=tQEg`&+MQL<2WwP zalIY-b~Z*0y|WINi9IegQq6*Lw3K_ObURJpaDY8QmvH z4gC1k`O)n=H>V%}{~o^e8Uc3DA2-9n@Tuy?Lb1b8=Oy zI6{VDIaZ7#GL^YJ-6-$w*|cSHJ?K7M8X(!C%5 z^c^3*ZFBOeD0x%TF4@dfow4(Mppi&wXFc$2I8Eyc+lKXtbW#%`RV>X^?Rr?Rt8@vg zHV0%xyV_e_(7risn-$)945eLs;Gh5+CSqBL|+ z>1a~2Lq%}ae+RZw>%U-Pq+PtUi8M)@j~3r+-k2h7OxdS7VjiaH28(qt4NcD{=9tF1 z!Kk*2e6hgy6me$c(YaEfpB%Tkh%3gv05BaFJmtVQXv>urTG;v8R&A>~S2?kcrh%kH z?8fUVJW>1k)q6;d{K4Lk{zeh|b!V?|U=ncA+5{J*In$A8z>(R2K|1O_m9}_rUQR|w z2(?)nbPhDh7z$m+JV(J2yRx|_YWOMKdCTp3^C$3pd;<5;$8cXe;D^2DnfiqbH%@-< zO*@aAFX9nVnMlhu=xb-&(9>p?BHCd&uX?T<>&ObLd+CuW+-qqYX3{EKr8D#Cf^mMf zCMF7AXcoX45ExtRgM^OhDVs^PI-}MTRLsJc1LW+Y z==UG7a_b%|!+?OHK6f*b8G1v+;;_;B*>zA$!}=4iO_Gjv5G+y2lOKfVMCQJ3qs<%1 zlDN5$*;!pbnVvj>;K*#ik?Hu~=@>`QT*tDbmy&$OFl03?8Re*vajO|!Te6XfF{fMW zG)~;{H~SyI{I~D?Ki`7O@a6mJh9vjZ1Apc23x48%yXv-IKD@nnLJ*yqAU*cc=v73 zejs2cBm#DsvIbZ#`%ESVfLpujS_cqiJrLa;1mEYgSXsGU*&5Yx?bCDR8@BU4jVai|)0;s_BUlO>%$LV}gZDD3{uUNrC5< z5E96a%W)h-3*k~3Yub%5E-JGRw_p|51A_TV@T8uhveZ?Vz}HiMYR@d*4(Y`%vO+VT zF~dlm>jp{?paZc0=o#&SzMhggta`G3{iV40&g3p07pzb4ghO*YbYn_TrGHK7o?DB2 zx4%@ojjVN5mn2%(0K9Me&F^^g9skcOq4(|0=sw*c0l=&FUKD0~%V+%17w>%D!*AYw zriX@Y^7xs(=S-n!+G<%bi0N$UXJT0QQwGw{1mt|7m{>EKqNGdqkWaDlzhS=Q%q-)T-LUb5|n)B6w2nT z63P})pEtfn)S+xKKqww`xhq=0n%poQA$NC+^gDB>Gr#vrG?^-$}tvO9PUiBnK%C^o?szxRY>{ysLR$}Tj zChD+kv9Uy6t3?36am64whfTZGNFQstYDA_Y4P9JH48@S*E&}yGb$N_pdXd6#vK^u2 z?yK0jT<(jQW(ykp&xaWf&klEHW8_c)PxMeT=c(=((y%oPVWWY9LLX}C=(1R*AS$f| z{F+p|D77vJx=K*IVlHJiBcMyxuh5;AuVp=0aQRB1L((CMbT?80KqJa-f|YCTddD@S z6`G4fIz}5U;H=qzbLRujU7KJhM(jmx^?Qs`xEYfFUam*PBtK^p*zrE!3P*nJ@>Bom zukp+G9j(#*60*yW=g*IB-*|ZT(Ss)!??+U3+gU?N(NsltXxZht99^yzk`vegcxDGl z6i5^cM5&UrR-1~EE3^tZhlvuiA`%qju1yPA z!(vcdrP4_)<}=9`uW1xBjlC=r0ju1t+x(+``zaC#^5Y?Og3?^PfT)YpQ)@QbqaJf_ z7CfW}U?M_6(WwtBbZ>&@jPYtrOuJYhu;NOVyba+@T&*i_HG(Z<;~pPD*m~2#!?k8+ae(?6VD_5t-U|@z?&1n!I|LP zwE^F=KE?TKlV(t6UMpySks?$i>$sM>xA&1#@BGtar{3|}_nvs;Ew~>&hWpDKdEzUd zv9lP$9qYUL;LX#Eiy&+`>0mV1!n5J1h~!*3LvOaxY1U}8Fzd9#FA%>7^cIKlVvIh? zRis-pnD0yL>(_--nl$!cMEu4EsC<#S3|Z|7D6lpe(qsly2uPT)ATa)PW=o(!mx?r< z62plq!Th|s_oKA&Tj?b%Eu2J)+8et&*f0Nc8s^xTY+^pF8DOi+E>K6A(9R^=tW7pw zhoM@VUTOw|9^`WxE-|v!aztC!q!q@6q<0;59r)b8S^>JdluEH<%O#<$#kIDVzjXZaL^p;oez36?%H>Y^oXO>%s zPAwjtts%u;Z%vCNDsCZhmUi8L*NsG6w}i$*L~ZnqIEuRPj7jQj%bP8u6PvB{GX%$# zMO?LIxT*G?(%mX2WzyQ3X6DyWnlJGNt8Q$azY}RmG_x}GRydhX&GQ?_3=yVDw<@0= zz`}Yn&_`n#j_D|jdq7RBRX4_8A7)q|W+uWwk{ddj&I~1ZaO^|^o!Ln6ZYW)fZ8RuV zl!x{r)YSlO0&O#)K!^EbW4Z->*Aw#!Jh-o)YqKfvu-?Z#6Dh%NUG-WsRPI7%C(k=I zr=abOR{q;z+}dlH#AG3fUq`gggDNq_{=R7dE?OT5%8%HKf}Lf=?vg-M_Q1^I^wdS} z=&9ph-TmxUufFMdmjbu~zjWUxG2jf-$os|PwYx7^n=bSx{->*M{WqI?%kK^BS6tJC z?b0J{97Cfc;&ilZEZSpnhqfEzXow~~fxZ^A?ns%5mo+u9Ze~1?H|)DG8qkLnwcw&H z4dc!z3zaNP__<0&Wc&M+ZXR`uU5+EjapEXCpgf7mQ3~OnlP#uDS(_ViU;0QH&RAGnF9a6@qRS{^+ej>fue>%V>8Q1v~MN5#V>77bmW!`9# zU=vEV4R8=t`H9fNDa8wgV#C$#s3!WO#oak*Eq{ipS-+F!E}f9W)(^bp1>`Mjz~~r# zaB=|a!@9{&V*-Sjc~309Q>sg}_Cs0IRCPyInHgc(Fp;*%XyUDnM)#bZ|<#qK_ zR|p@^Tbtm~2j}>njTt7%+%=2(`8B?}`}t42;<}&yz5DZKbidq?(#;>Cc*}eK;khq6 zxiR@t9s1L7l}zf``bxobWv!?PS4-^Hpw=YPFma^boXTEfLN*~h>Q&mPwCXR^F-)9UmLWlNh=)4I(pLyC?wB!4;!D|vcBiKnn) z+K#}=44y4VxLDyiXx0Le)+Ma<&&89|#-~dDhH74;x9KVr z2c`j!J3Pmu56;JHHIUgV6c1m2;%A`v0Pg3H$^G$7J!gIt0OA|>Uij9nQ_FvmUkggHlRwUSO+)O`G?oB?GF`+6OvI0STVX zP*OVIO7vpM$-qbv?A&E&aI2?v6E2KGwai0t7h$WDYiBzJPJ|_SNKcjI0)n|Qu-m?x zqN?cNGM--8g;sNwJN2MES3>Rh)fO8DGIyO>EhTE4*kjP z2dAIR3%$guh!(XWV7>#86cf%~R^@_^Z70&GyqD7C*;LiNlx8C41)&46H4uO?cg|gv z5iX!diptNa6l|s8InOC#hq8-G(^gwOTB>+!yc4{olMA+khIF%r#>l)vP=b~{<;8}r zMv8gpn&TyU+*|5a#iZA2Ctqt^z>dt%#t?>fw??HKn?FU1rH+A|SYKpdP_D3-s4n6) zdZGyD=yk0{mYsZ+Sq{UU69u-k=j`N+yF(zajCTc2RXIK8QQ4sF6OGSuAt6$<(+d$7`up2G)IM4^YP{QlR*T708hN=@812- zpLoZmcPwuFFdhJp$^HEeUU%-=`!@D;?O`{Z{^_&t-1`Au>6&7>)V{ptN^8FAuCvye z!L|NE!%kvEDKU(=(9%SlFfIbdP(rHai10HtP30XT1Cl7sg2%+nh6E2I*zqte+H$#m2zjViQaI<{K1vsHZQ@Ce=0!)dib(5}7UN4AZR@Bm60OG&qiWp~gnIpU9xN8$Yup#8#m`Rk z@h&!~a*warxYUqD?Q5gPvZ%?wQcJE5AS^xzl`k%!iF^5 z-{0W7E;)AcsW1Dn8)y4^db-eaH+Pm7SjXj$ z&78>Vt+2{Md0sDuykP!rv*hqX@gI6$jaaDd8Py3Aur)no5>S1#eOQsO$}ZON+OIawbx-w7Md{KS=}US-lV^(eefi*G)E*1>T@#ye`f?^0)u>+#`Sc z+OrQ`^D&tmy%P_R$K-+VCVye}l55|%`=ZOD021Tm>=TRc2fD27_KRF~ai>Bzm?0E2 zG7q6ymAk^#{!A&>SfWHG*Hw+HrhDVoNSuzS&X%-b+192@X$>M+hqO{6VrFh)V|=Kp z&K0!S_t4px>dT9TGR3M>{KBdnS*!MB=U57!W`^DnfLVnh zwdkU>TW^g&SLxu^!9Go?RN-AS=7Tl^+{QAgIaa!NAAIg-UVmWoh7Zf+=t(?)9`ZnXvv1ga!Gpf%rrrPL zaaW&s-l6T~qw8c^Ok-0vn~q+|T)zR%{uhlmmF7jkX*z41aa)x8h#Zq|M6H?<8KMNq zA*Mz`*kleRR4!zfglG|uKoJ4#TEH6s8RHcRO}WogXHzno^3l{xpqfV%$|zq`ldhU4 z1WZg0#f=uFl09lz{{m*Rp0Q)9Ix;eDh7jW~a{Ls}T|^S|+Gg zn2>KkQ#(en=%;$9u_u&mY2XOb04Z-z5~msJPv$ zoy~Ni^4=~8evfsjSEhw~m92sVhZUZpc7$w#m46 zZ{fW9n1(5~rU%Vyj#Th*+Zs)}|+}dE%q~@*eK6On0T# zF&J(PlT&5Ib%5M~nJlKxJj@d<5}mL5zlr(T+$pg`Lxw*24}Sc4L{s9ej` z?jtAHW{p;abP9z)Q5|M$1ji0G>9Z1uD3Lz=xj;86xnvwDF#y(9M?!JSO#T*^IV66X zsAP!52E6q5klt%x|G53B~d3O5*PF7scWA6n76!4pl^}M(fB}Io5KU~P5;@`&fR(M51;c}%Yc*W z2AQkOlNEjU`4SA;DVDU;I6)VZInvPhLUff3P#s>~JN~ANFcHucYoXS0Vr55_ z7e`-!(xPf2rpbOuP$9m;xR4c56ND>z)>b{4ZHlV;DGmvVyA7!JEB&=$69=Y;RzzsD zvkM9?uM`c6yD%M;Tck?}n^0$!FBVnn2;NDgHUFk#Q?oTIuoi)JqA3foT4-8@!W>ls zN6%(kJ;Rf9=Lob>ub32;&L%LUuG5_vo+S%{J7on-6iBBtqB*K`K5QG;;VItk{JL`~ zX49+l*z}rleSZ5FpY(ly^jlDUOAW#K?uPV$cr1eK><{79ANU97ym)UKZsKc6(BE9h zTCTnRR<)m;b>yAAY5ncSPpci;Gs|?P-c=D z@oE3{f@*^AwCR0d;w@I&>{tbn|5-=%*UpC4V!Gxei<4RxtyL3ouU77*)so9il+ZYA zoB;}KKGp8ctDTa}NhZu|txlB|X`wqk6UIcz)5b{Oy@`XHH+=jt4}Z^Zg|PoN2@+-U zQhawqdH_9sc77Bw$o8rA;Xi!hF$Z6HYJIpm-!Q6xE;YNO)M%RKQdbL6M=sv{5=wKx0 zpB9dVP;>!kmAp^Q001BWNklL%$fL4+xo=`}jsIJ&-lJHirVsmSMRtx~@$@l8_ zlor}DL5|rzNvlRF{e5r{gY-H#nh$XXl`uBibTQf#dfJ&m2{=u;Q;mq9OVyi1;HxDy zfPW;y}Il3pq19vlez-~wY@H6w5LPc)7{@k^a(J9$hgWWI^r5WDE0Q ze#XwZ{9M|I10g#6Ukw0FP?X=~d1^!FGDyR%a|<(v|1Dv{{n7$leD3mMyrz&DAQD|A z)i*%3f1*y?O0Z-iPbiCG>xN+FK4t=@O(z6+^9;2`UG~jWg~BJ`I)A@*U`Gt_`o5I9 z#?twiagwgayUPaa$RG{^<<#Gtek%ZW_YQva$bm0^P$n-uj_*Dm7&@etozm>30C4SF zc3<$0*+QW=@BHMUlgr08T|qFmphkNHWBVgT(XD=vl${_F)!guGoIFBZu9BI{GO{5~ z(CC8D8r>4|{6s3nyJt^qtWMN2_p)|KT@;hHDiJTA)Q00uaE-!9F0EE7RL!UWoj_v0 z`Ywt_bVT3w=gQ_C@$#?j_Z8TfY+^QSAjn|8XOobGbU}?{4OsW0KE0IS%B(($J{E|e8k{#Q!EF&LigW5oWq6ymgUw;&E&;t2s zwz3&;>j%Ab7*~I1Cdp`HxXP>p+^{i(-kDF~Oss}`bmME%M7~^4y z`8>p^`1#{ViWao8e$JxFTyzZM{)XwW)+FsoL|3ZK1<|Y+=k5@=~``e34 zFMs8!{og+6yU!ZZfuU(@UmLY9^D-(e_+2Ffk$RT0vMX;ed2IFNS8fvq$>55@G!l^VuAowg4o-pdCqI-~Un)wB4l=8KN|KEJv#m1m`1d?) zqnnbEDJspNW^JXQdn>Iy)I*@HeN)03*|wupSYmW4EF9>G4bl8gY6wqVY>6Vy=(vk9 zS3jO6ZZ+~s#gwV$bRNJW=A5xLc&ise(&}Bc*h1=fy`nd)!Z|ghry)7>yjbkpGgV&N znyX&t&K!*R=B|bGDA?P+@%)9eU;EXMy#N1xVH1Hj38_v>^S^g>eiHxH{Y7}CBD-cO z`~pklrflOX6=CxlmDcEnp{v%N4DsF&()cR32jJb8T|AQCSWsF(NFFq^qv*_jnpgBW zSl4qm@1;8^)`%`ywOLX~T_@1zIA;wmIxu)0HnCcGi?Ee7{+c34YSt>~LKTvOaSc(8 zaGtiR(2!`U7DV-*SkEo_o|D)>Z-TDq8K&utdI5vDv$*x* z`yT$+zxe3+Kl&YZPha0e-?DX^Q&6_Q{0o2Mq>C~;bufISkFp~!qfk3&I&}xrn`l|} znERye@6d%mqSCEP-vq9s9I*sm(nlFHVt=Gv9GEZD3rE7UAAse$Dp;|sYP^YylR1657bj3Yi+ePy{Pfp?Rw!8 zP+&T$W6lZ;R2@U9weixW(kU{FCBC4cj3CwL>6PT@h5^@W+BI&c`NZuykY41@oi|pi zu{fU{e*1?%_<#Pd`#U%OdFU^_v5C6h@e}yo-hTb~?>_n1jidkSN5A~mf7`FPmxe*C zj+K}tkZ7|#k7Oxca8zs?afOE{sUJHOJK{CsWsXu|5+pP1s0M1Og;TTNv#JF0j9?Mc z6AwigL0GkBWte&rDDpVe>&}pEwe#~Bn!K{{7$+O@={2GQr?Tvir1rhoR=X&^iMZj{ z3dky6LD2x4qw@LL#l^f*78iJ>e311TUO}7!7=6L0E{Y8MimyVcAYJQQWvB&u){B}n z0tL8P9^V*B$1EiKg!G!jXNPHNXa}$~f2qb@v*ox+(gFl@E}^hFD64<>l0k*szy~Cx zHTUbqinIiN)oTL)BbaQ*;01^C=&mKr82_rN^`t8-L#7}CP7eRWzx2!h6S?}O&|g|^ zqHVqPn^RCBUDsYeKmUc#{)wa{;rsT#Hf$p8rb7A?R7sx*^OJaL`#AnLKla62|9yzEQ(+i+s&$oDw|d~DD9D6N zDg1gM^{y0TJ^L1o+=A68yV`(MpOx?ka$%kqN>0lr8Ef!%8LN{ z&|`mozW6i&w)$|%F8TC`si1;Qh`G$AVIF5C4l(O#Gb=TEDY2NSHjKbUfHt*4Rfoz5 z5~l(rjMXY66e;;hlvSu}nqZPCCv=}mh?NQgvywuost98rOn})S*gCRf12y@~(p9|Y z5g|Z#60vn}8D_`Pb`xtm2T|`MttD0_-w1#h#X+)C^=rLxiO1zdrE<#-oOR0^KX~p7 z&kFFr?{EE&aT8@X3F%L?{gdNQgdn)^$Q#E${jnGC{GHiJyihSfyXh9K@SmVEs+F|~ z^s27{La-{2_j-2;-b<@B7He#}_cItr?%R~rbtcB;(n?@Q;aL*p=+~^~fM|Z#D&Pg4 zV@V+DcA4Nh``nPNB1EZB$E0hQl2b}3Q&f)9g5p#lPs-j>Ptv4>1f^GyYOXFUu-BhL z2(x_N;R2FoTcU#LEF6?g|5TqylRS#t5*6y>l*3`6IME4+Ix&uk>(ss7l4!*X?@p}H zhoC7WbE&9}Wz% zK8!WS0*silQQ2Y>325r&8N`9EFV&WqC5Wx=-nIAdzxYqiZr%7505|*o=}my$B&0t@ zQd)iz0G|BM|M2yH9-{oEwP!DX_f#^PsuyiaDc1BfKS#jQpN3s;@g7lTOp#DXJNv8oP=I=kfl zi+Br#{JO!sP9kumL@*m>g#;m1@m;2!jTc2(hB&EDTbi4m5nyM?a-XS!v(_mSYZ2Jw zA>`~LpsMm*U6cV*bj!%u{eknNf!!)TID9#;7k6KcxHg<9v*w~rjf9?GbL0-Pdd;2w z?n@7EU;nL(yVriR?=Ni_b(@6r@4vnH+)w{655IZzUo1}IBTZq`h5~r1LLv)0uU!R| z6?GCasMvbWYl%LwnfJH;PDQd#oS2q_x>X!VEWGSwJN1dOpHc9X?WyWff5&v2r0Oo% zWHcqBm;yHgj#e`a)0~r-o?6Hj;l;m5&xHXJi()oR!YS;#oXk{pGwbHqn(t!PZ8iE* zsuYOE41e8WlP%Hk3Y3^Yt8HP`)J5nM+TPRCL>j zfTOTyzI@icf^~cXs*y(B`w-=0Ax6QUc~w82qF}}-by7+YPDw}>($d!BR?lxrerljs zl$w&b;2l-i5)iX~h6Q&q8@5I%IC$G`+X$~$%To2(=^RL{s)y>4tRZBKb2y7EH)4Z1Ck;e%E!&o?xYsDj z=>CBD(SWcreI6KxV|`>&U{EUih#J3Z{w_xS+ngq}R&$l01INnf?Bey`dVKHd?`)FM zCL#TqZvW-t?|tbvm!HJPFTafoZyx_=^JRRb8bV6_jZP4|!d=yrZWHhm92V5YPC7dl z=H3i~8tzOYqEx+|REg>PVXLHw4u|2w1ZmNVBzc&4#iJyUMN}t5>PwUZVkz zNnEp<_4AR!f~v$4puD7z{=d-nD=30_zlBA=08qE9ec+O2!dVmKE9}ogTded8En5%S z`)68wc*8}*)+>pGVpl#zN=a;z5@fbykxNp{Igy-B%Dh#~{S+D@B^DJ8)0HV8oK@DY z*?`E2NZn6>VThRD8#q565LQt$APrGe^+TCyafQ7n)UPdTFd|W3ga#vzPDE8@Vb7QZ zfm8Ea|Kf?gum5)6Z<5h_Iw2i?{SyG>kw}J&hfl#bhAewF233}x0>aqP9d$iz&m~TC zIx(&6gS~7c1vrsczwv{o{zZKG?uCorKKh&C1oLEDqLqS|3t(7GiAG`32tf^zLeZlY z)D;|cn#{~C3BlgZq6=Nf2+HzX^>lJCN~*YWiCWa^=)qJAK4L%8k&?6{Xq*p>`vVGSa5HyaZ%05yz7q#}A<@M*PhC-tx z097p%asV31Y`t$)UUu}N_QX>AZCwx@tmsuOSoMCO)FniMdcDxF{?KX}QrkJ$^aalE z51bz@M>a&!p|ivSRf!oAic}R)S!UUJAyLZ=(m@%B4H*!7qJ_35o$=(>t>cTI{qWiU zdXtRa4GBqJ_ynZK92|vAVoDo<`Kl15>X?(xm^69_{yP9WW$`Tykb(vJa*`lE-c=zb zQKK_-HeT=_h``B{yUW+lgsXe6-21)|(bqj0y&@}LF-E6w(1Nfd#>AOjRFiCug+2`3 zSM`OY(u211J<+kJO03ZplRrmRmb9|huoHx(%928jZUK#%y(D51OQz_i_!Y~E%0WBr zSDcbkOw;<)D%}sRiVi#DfaBiQDa^XLO(5EyUJLBHqDQ<)vsU_n3crjiOM1@3I=<#?qAlY?VEzjieuroWP}HbuX8bJ)|# zTE(KIP1mVwz@YjV=?oevMm59cNWlZUO`>*i5?*aB!9;+La`>TBU;fpziyPNA>E+#$ zkOX@G{t5(tg^)+7Atu@ttF`G)6l(VNdrQQS1|KE+S*GNWXvz^ZUM%`M-J;u~@)!bo zgj>V8?aQ|pA)fu}osa5OzDDs(&|-^;s_fWEt?$@S7$g{(t;n-p9yJ5XRXH({59-DH z8fnXVt*TbbSxwtTAu*_iRZkYND{E<0Iu!_3S2smiwlx2nL0bh5D*82D!Z^Ki7NMK9 z;W<~OaZQ9u$w6o#L#=mb`yI8vR2Hrk1(QiVPhRAX+(N`LX{e1JS(1^Odn=0`-B*jX?iM+!CTtxnxi}okMJKjj?5wLa_^5BIe>?Ddxny7~14YHz4{IXXd z%OI&)q0}FIZH-}82nxF+{Tjbsq3C&})>=Y&7l}4GG<0B^luJLo@8CTv-YV``+;do4 z@EC{^hBYŋh)m3+v%ly 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 1 && indexOf(match, "") > -1) { + r2 = RegExp(this.source, real.replace.call(getNativeFlags(this), "g", "")); + real.replace.call(str.slice(match.index), r2, function () { + for (var i = 1; i < arguments.length - 2; i++) { + if (arguments[i] === undefined) + match[i] = undefined; + } + }); + } + if (this._xregexp && this._xregexp.captureNames) { + for (var i = 1; i < match.length; i++) { + name = this._xregexp.captureNames[i - 1]; + if (name) + match[name] = match[i]; + } + } + if (!compliantLastIndexIncrement && this.global && !match[0].length && (this.lastIndex > match.index)) + this.lastIndex--; + } + return match; + }; + if (!compliantLastIndexIncrement) { + RegExp.prototype.test = function (str) { + var match = real.exec.call(this, str); + if (match && this.global && !match[0].length && (this.lastIndex > match.index)) + this.lastIndex--; + return !!match; + }; + } + + function getNativeFlags (regex) { + return (regex.global ? "g" : "") + + (regex.ignoreCase ? "i" : "") + + (regex.multiline ? "m" : "") + + (regex.extended ? "x" : "") + // Proposed for ES4; included in AS3 + (regex.sticky ? "y" : ""); + } + + function indexOf (array, item, from) { + if (Array.prototype.indexOf) // Use the native array method if available + return array.indexOf(item, from); + for (var i = from || 0; i < array.length; i++) { + if (array[i] === item) + return i; + } + return -1; + } + +}); + +ace.define('ace/lib/es5-shim', ['require', 'exports', 'module' ], function(require, exports, module) { + +function Empty() {} + +if (!Function.prototype.bind) { + Function.prototype.bind = function bind(that) { // .length is 1 + var target = this; + if (typeof target != "function") { + throw new TypeError("Function.prototype.bind called on incompatible " + target); + } + var args = slice.call(arguments, 1); // for normal call + var bound = function () { + + if (this instanceof bound) { + + var result = target.apply( + this, + args.concat(slice.call(arguments)) + ); + if (Object(result) === result) { + return result; + } + return this; + + } else { + return target.apply( + that, + args.concat(slice.call(arguments)) + ); + + } + + }; + if(target.prototype) { + Empty.prototype = target.prototype; + bound.prototype = new Empty(); + Empty.prototype = null; + } + return bound; + }; +} +var call = Function.prototype.call; +var prototypeOfArray = Array.prototype; +var prototypeOfObject = Object.prototype; +var slice = prototypeOfArray.slice; +var _toString = call.bind(prototypeOfObject.toString); +var owns = call.bind(prototypeOfObject.hasOwnProperty); +var defineGetter; +var defineSetter; +var lookupGetter; +var lookupSetter; +var supportsAccessors; +if ((supportsAccessors = owns(prototypeOfObject, "__defineGetter__"))) { + defineGetter = call.bind(prototypeOfObject.__defineGetter__); + defineSetter = call.bind(prototypeOfObject.__defineSetter__); + lookupGetter = call.bind(prototypeOfObject.__lookupGetter__); + lookupSetter = call.bind(prototypeOfObject.__lookupSetter__); +} +if ([1,2].splice(0).length != 2) { + if(function() { // test IE < 9 to splice bug - see issue #138 + function makeArray(l) { + var a = new Array(l+2); + a[0] = a[1] = 0; + return a; + } + var array = [], lengthBefore; + + array.splice.apply(array, makeArray(20)); + array.splice.apply(array, makeArray(26)); + + lengthBefore = array.length; //46 + array.splice(5, 0, "XXX"); // add one element + + lengthBefore + 1 == array.length + + if (lengthBefore + 1 == array.length) { + return true;// has right splice implementation without bugs + } + }()) {//IE 6/7 + var array_splice = Array.prototype.splice; + Array.prototype.splice = function(start, deleteCount) { + if (!arguments.length) { + return []; + } else { + return array_splice.apply(this, [ + start === void 0 ? 0 : start, + deleteCount === void 0 ? (this.length - start) : deleteCount + ].concat(slice.call(arguments, 2))) + } + }; + } else {//IE8 + Array.prototype.splice = function(pos, removeCount){ + var length = this.length; + if (pos > 0) { + if (pos > length) + pos = length; + } else if (pos == void 0) { + pos = 0; + } else if (pos < 0) { + pos = Math.max(length + pos, 0); + } + + if (!(pos+removeCount < length)) + removeCount = length - pos; + + var removed = this.slice(pos, pos+removeCount); + var insert = slice.call(arguments, 2); + var add = insert.length; + if (pos === length) { + if (add) { + this.push.apply(this, insert); + } + } else { + var remove = Math.min(removeCount, length - pos); + var tailOldPos = pos + remove; + var tailNewPos = tailOldPos + add - remove; + var tailCount = length - tailOldPos; + var lengthAfterRemove = length - remove; + + if (tailNewPos < tailOldPos) { // case A + for (var i = 0; i < tailCount; ++i) { + this[tailNewPos+i] = this[tailOldPos+i]; + } + } else if (tailNewPos > tailOldPos) { // case B + for (i = tailCount; i--; ) { + this[tailNewPos+i] = this[tailOldPos+i]; + } + } // else, add == remove (nothing to do) + + if (add && pos === lengthAfterRemove) { + this.length = lengthAfterRemove; // truncate array + this.push.apply(this, insert); + } else { + this.length = lengthAfterRemove + add; // reserves space + for (i = 0; i < add; ++i) { + this[pos+i] = insert[i]; + } + } + } + return removed; + }; + } +} +if (!Array.isArray) { + Array.isArray = function isArray(obj) { + return _toString(obj) == "[object Array]"; + }; +} +var boxedString = Object("a"), + splitString = boxedString[0] != "a" || !(0 in boxedString); + +if (!Array.prototype.forEach) { + Array.prototype.forEach = function forEach(fun /*, thisp*/) { + var object = toObject(this), + self = splitString && _toString(this) == "[object String]" ? + this.split("") : + object, + thisp = arguments[1], + i = -1, + length = self.length >>> 0; + if (_toString(fun) != "[object Function]") { + throw new TypeError(); // TODO message + } + + while (++i < length) { + if (i in self) { + fun.call(thisp, self[i], i, object); + } + } + }; +} +if (!Array.prototype.map) { + Array.prototype.map = function map(fun /*, thisp*/) { + var object = toObject(this), + self = splitString && _toString(this) == "[object String]" ? + this.split("") : + object, + length = self.length >>> 0, + result = Array(length), + thisp = arguments[1]; + if (_toString(fun) != "[object Function]") { + throw new TypeError(fun + " is not a function"); + } + + for (var i = 0; i < length; i++) { + if (i in self) + result[i] = fun.call(thisp, self[i], i, object); + } + return result; + }; +} +if (!Array.prototype.filter) { + Array.prototype.filter = function filter(fun /*, thisp */) { + var object = toObject(this), + self = splitString && _toString(this) == "[object String]" ? + this.split("") : + object, + length = self.length >>> 0, + result = [], + value, + thisp = arguments[1]; + if (_toString(fun) != "[object Function]") { + throw new TypeError(fun + " is not a function"); + } + + for (var i = 0; i < length; i++) { + if (i in self) { + value = self[i]; + if (fun.call(thisp, value, i, object)) { + result.push(value); + } + } + } + return result; + }; +} +if (!Array.prototype.every) { + Array.prototype.every = function every(fun /*, thisp */) { + var object = toObject(this), + self = splitString && _toString(this) == "[object String]" ? + this.split("") : + object, + length = self.length >>> 0, + thisp = arguments[1]; + if (_toString(fun) != "[object Function]") { + throw new TypeError(fun + " is not a function"); + } + + for (var i = 0; i < length; i++) { + if (i in self && !fun.call(thisp, self[i], i, object)) { + return false; + } + } + return true; + }; +} +if (!Array.prototype.some) { + Array.prototype.some = function some(fun /*, thisp */) { + var object = toObject(this), + self = splitString && _toString(this) == "[object String]" ? + this.split("") : + object, + length = self.length >>> 0, + thisp = arguments[1]; + if (_toString(fun) != "[object Function]") { + throw new TypeError(fun + " is not a function"); + } + + for (var i = 0; i < length; i++) { + if (i in self && fun.call(thisp, self[i], i, object)) { + return true; + } + } + return false; + }; +} +if (!Array.prototype.reduce) { + Array.prototype.reduce = function reduce(fun /*, initial*/) { + var object = toObject(this), + self = splitString && _toString(this) == "[object String]" ? + this.split("") : + object, + length = self.length >>> 0; + if (_toString(fun) != "[object Function]") { + throw new TypeError(fun + " is not a function"); + } + if (!length && arguments.length == 1) { + throw new TypeError("reduce of empty array with no initial value"); + } + + var i = 0; + var result; + if (arguments.length >= 2) { + result = arguments[1]; + } else { + do { + if (i in self) { + result = self[i++]; + break; + } + if (++i >= length) { + throw new TypeError("reduce of empty array with no initial value"); + } + } while (true); + } + + for (; i < length; i++) { + if (i in self) { + result = fun.call(void 0, result, self[i], i, object); + } + } + + return result; + }; +} +if (!Array.prototype.reduceRight) { + Array.prototype.reduceRight = function reduceRight(fun /*, initial*/) { + var object = toObject(this), + self = splitString && _toString(this) == "[object String]" ? + this.split("") : + object, + length = self.length >>> 0; + if (_toString(fun) != "[object Function]") { + throw new TypeError(fun + " is not a function"); + } + if (!length && arguments.length == 1) { + throw new TypeError("reduceRight of empty array with no initial value"); + } + + var result, i = length - 1; + if (arguments.length >= 2) { + result = arguments[1]; + } else { + do { + if (i in self) { + result = self[i--]; + break; + } + if (--i < 0) { + throw new TypeError("reduceRight of empty array with no initial value"); + } + } while (true); + } + + do { + if (i in this) { + result = fun.call(void 0, result, self[i], i, object); + } + } while (i--); + + return result; + }; +} +if (!Array.prototype.indexOf || ([0, 1].indexOf(1, 2) != -1)) { + Array.prototype.indexOf = function indexOf(sought /*, fromIndex */ ) { + var self = splitString && _toString(this) == "[object String]" ? + this.split("") : + toObject(this), + length = self.length >>> 0; + + if (!length) { + return -1; + } + + var i = 0; + if (arguments.length > 1) { + i = toInteger(arguments[1]); + } + i = i >= 0 ? i : Math.max(0, length + i); + for (; i < length; i++) { + if (i in self && self[i] === sought) { + return i; + } + } + return -1; + }; +} +if (!Array.prototype.lastIndexOf || ([0, 1].lastIndexOf(0, -3) != -1)) { + Array.prototype.lastIndexOf = function lastIndexOf(sought /*, fromIndex */) { + var self = splitString && _toString(this) == "[object String]" ? + this.split("") : + toObject(this), + length = self.length >>> 0; + + if (!length) { + return -1; + } + var i = length - 1; + if (arguments.length > 1) { + i = Math.min(i, toInteger(arguments[1])); + } + i = i >= 0 ? i : length - Math.abs(i); + for (; i >= 0; i--) { + if (i in self && sought === self[i]) { + return i; + } + } + return -1; + }; +} +if (!Object.getPrototypeOf) { + Object.getPrototypeOf = function getPrototypeOf(object) { + return object.__proto__ || ( + object.constructor ? + object.constructor.prototype : + prototypeOfObject + ); + }; +} +if (!Object.getOwnPropertyDescriptor) { + var ERR_NON_OBJECT = "Object.getOwnPropertyDescriptor called on a " + + "non-object: "; + Object.getOwnPropertyDescriptor = function getOwnPropertyDescriptor(object, property) { + if ((typeof object != "object" && typeof object != "function") || object === null) + throw new TypeError(ERR_NON_OBJECT + object); + if (!owns(object, property)) + return; + + var descriptor, getter, setter; + descriptor = { enumerable: true, configurable: true }; + if (supportsAccessors) { + var prototype = object.__proto__; + object.__proto__ = prototypeOfObject; + + var getter = lookupGetter(object, property); + var setter = lookupSetter(object, property); + object.__proto__ = prototype; + + if (getter || setter) { + if (getter) descriptor.get = getter; + if (setter) descriptor.set = setter; + return descriptor; + } + } + descriptor.value = object[property]; + return descriptor; + }; +} +if (!Object.getOwnPropertyNames) { + Object.getOwnPropertyNames = function getOwnPropertyNames(object) { + return Object.keys(object); + }; +} +if (!Object.create) { + var createEmpty; + if (Object.prototype.__proto__ === null) { + createEmpty = function () { + return { "__proto__": null }; + }; + } else { + createEmpty = function () { + var empty = {}; + for (var i in empty) + empty[i] = null; + empty.constructor = + empty.hasOwnProperty = + empty.propertyIsEnumerable = + empty.isPrototypeOf = + empty.toLocaleString = + empty.toString = + empty.valueOf = + empty.__proto__ = null; + return empty; + } + } + + Object.create = function create(prototype, properties) { + var object; + if (prototype === null) { + object = createEmpty(); + } else { + if (typeof prototype != "object") + throw new TypeError("typeof prototype["+(typeof prototype)+"] != 'object'"); + var Type = function () {}; + Type.prototype = prototype; + object = new Type(); + object.__proto__ = prototype; + } + if (properties !== void 0) + Object.defineProperties(object, properties); + return object; + }; +} + +function doesDefinePropertyWork(object) { + try { + Object.defineProperty(object, "sentinel", {}); + return "sentinel" in object; + } catch (exception) { + } +} +if (Object.defineProperty) { + var definePropertyWorksOnObject = doesDefinePropertyWork({}); + var definePropertyWorksOnDom = typeof document == "undefined" || + doesDefinePropertyWork(document.createElement("div")); + if (!definePropertyWorksOnObject || !definePropertyWorksOnDom) { + var definePropertyFallback = Object.defineProperty; + } +} + +if (!Object.defineProperty || definePropertyFallback) { + var ERR_NON_OBJECT_DESCRIPTOR = "Property description must be an object: "; + var ERR_NON_OBJECT_TARGET = "Object.defineProperty called on non-object: " + var ERR_ACCESSORS_NOT_SUPPORTED = "getters & setters can not be defined " + + "on this javascript engine"; + + Object.defineProperty = function defineProperty(object, property, descriptor) { + if ((typeof object != "object" && typeof object != "function") || object === null) + throw new TypeError(ERR_NON_OBJECT_TARGET + object); + if ((typeof descriptor != "object" && typeof descriptor != "function") || descriptor === null) + throw new TypeError(ERR_NON_OBJECT_DESCRIPTOR + descriptor); + if (definePropertyFallback) { + try { + return definePropertyFallback.call(Object, object, property, descriptor); + } catch (exception) { + } + } + if (owns(descriptor, "value")) { + + if (supportsAccessors && (lookupGetter(object, property) || + lookupSetter(object, property))) + { + var prototype = object.__proto__; + object.__proto__ = prototypeOfObject; + delete object[property]; + object[property] = descriptor.value; + object.__proto__ = prototype; + } else { + object[property] = descriptor.value; + } + } else { + if (!supportsAccessors) + throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED); + if (owns(descriptor, "get")) + defineGetter(object, property, descriptor.get); + if (owns(descriptor, "set")) + defineSetter(object, property, descriptor.set); + } + + return object; + }; +} +if (!Object.defineProperties) { + Object.defineProperties = function defineProperties(object, properties) { + for (var property in properties) { + if (owns(properties, property)) + Object.defineProperty(object, property, properties[property]); + } + return object; + }; +} +if (!Object.seal) { + Object.seal = function seal(object) { + return object; + }; +} +if (!Object.freeze) { + Object.freeze = function freeze(object) { + return object; + }; +} +try { + Object.freeze(function () {}); +} catch (exception) { + Object.freeze = (function freeze(freezeObject) { + return function freeze(object) { + if (typeof object == "function") { + return object; + } else { + return freezeObject(object); + } + }; + })(Object.freeze); +} +if (!Object.preventExtensions) { + Object.preventExtensions = function preventExtensions(object) { + return object; + }; +} +if (!Object.isSealed) { + Object.isSealed = function isSealed(object) { + return false; + }; +} +if (!Object.isFrozen) { + Object.isFrozen = function isFrozen(object) { + return false; + }; +} +if (!Object.isExtensible) { + Object.isExtensible = function isExtensible(object) { + if (Object(object) === object) { + throw new TypeError(); // TODO message + } + var name = ''; + while (owns(object, name)) { + name += '?'; + } + object[name] = true; + var returnValue = owns(object, name); + delete object[name]; + return returnValue; + }; +} +if (!Object.keys) { + var hasDontEnumBug = true, + dontEnums = [ + "toString", + "toLocaleString", + "valueOf", + "hasOwnProperty", + "isPrototypeOf", + "propertyIsEnumerable", + "constructor" + ], + dontEnumsLength = dontEnums.length; + + for (var key in {"toString": null}) { + hasDontEnumBug = false; + } + + Object.keys = function keys(object) { + + if ( + (typeof object != "object" && typeof object != "function") || + object === null + ) { + throw new TypeError("Object.keys called on a non-object"); + } + + var keys = []; + for (var name in object) { + if (owns(object, name)) { + keys.push(name); + } + } + + if (hasDontEnumBug) { + for (var i = 0, ii = dontEnumsLength; i < ii; i++) { + var dontEnum = dontEnums[i]; + if (owns(object, dontEnum)) { + keys.push(dontEnum); + } + } + } + return keys; + }; + +} +if (!Date.now) { + Date.now = function now() { + return new Date().getTime(); + }; +} +var ws = "\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003" + + "\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028" + + "\u2029\uFEFF"; +if (!String.prototype.trim || ws.trim()) { + ws = "[" + ws + "]"; + var trimBeginRegexp = new RegExp("^" + ws + ws + "*"), + trimEndRegexp = new RegExp(ws + ws + "*$"); + String.prototype.trim = function trim() { + return String(this).replace(trimBeginRegexp, "").replace(trimEndRegexp, ""); + }; +} + +function toInteger(n) { + n = +n; + if (n !== n) { // isNaN + n = 0; + } else if (n !== 0 && n !== (1/0) && n !== -(1/0)) { + n = (n > 0 || -1) * Math.floor(Math.abs(n)); + } + return n; +} + +function isPrimitive(input) { + var type = typeof input; + return ( + input === null || + type === "undefined" || + type === "boolean" || + type === "number" || + type === "string" + ); +} + +function toPrimitive(input) { + var val, valueOf, toString; + if (isPrimitive(input)) { + return input; + } + valueOf = input.valueOf; + if (typeof valueOf === "function") { + val = valueOf.call(input); + if (isPrimitive(val)) { + return val; + } + } + toString = input.toString; + if (typeof toString === "function") { + val = toString.call(input); + if (isPrimitive(val)) { + return val; + } + } + throw new TypeError(); +} +var toObject = function (o) { + if (o == null) { // this matches both null and undefined + throw new TypeError("can't convert "+o+" to object"); + } + return Object(o); +}; + +}); + +ace.define('ace/lib/dom', ['require', 'exports', 'module' ], function(require, exports, module) { + + +if (typeof document == "undefined") + return; + +var XHTML_NS = "http://www.w3.org/1999/xhtml"; + +exports.getDocumentHead = function(doc) { + if (!doc) + doc = document; + return doc.head || doc.getElementsByTagName("head")[0] || doc.documentElement; +} + +exports.createElement = function(tag, ns) { + return document.createElementNS ? + document.createElementNS(ns || XHTML_NS, tag) : + document.createElement(tag); +}; + +exports.hasCssClass = function(el, name) { + var classes = el.className.split(/\s+/g); + return classes.indexOf(name) !== -1; +}; +exports.addCssClass = function(el, name) { + if (!exports.hasCssClass(el, name)) { + el.className += " " + name; + } +}; +exports.removeCssClass = function(el, name) { + var classes = el.className.split(/\s+/g); + while (true) { + var index = classes.indexOf(name); + if (index == -1) { + break; + } + classes.splice(index, 1); + } + el.className = classes.join(" "); +}; + +exports.toggleCssClass = function(el, name) { + var classes = el.className.split(/\s+/g), add = true; + while (true) { + var index = classes.indexOf(name); + if (index == -1) { + break; + } + add = false; + classes.splice(index, 1); + } + if(add) + classes.push(name); + + el.className = classes.join(" "); + return add; +}; +exports.setCssClass = function(node, className, include) { + if (include) { + exports.addCssClass(node, className); + } else { + exports.removeCssClass(node, className); + } +}; + +exports.hasCssString = function(id, doc) { + var index = 0, sheets; + doc = doc || document; + + if (doc.createStyleSheet && (sheets = doc.styleSheets)) { + while (index < sheets.length) + if (sheets[index++].owningElement.id === id) return true; + } else if ((sheets = doc.getElementsByTagName("style"))) { + while (index < sheets.length) + if (sheets[index++].id === id) return true; + } + + return false; +}; + +exports.importCssString = function importCssString(cssText, id, doc) { + doc = doc || document; + if (id && exports.hasCssString(id, doc)) + return null; + + var style; + + if (doc.createStyleSheet) { + style = doc.createStyleSheet(); + style.cssText = cssText; + if (id) + style.owningElement.id = id; + } else { + style = doc.createElementNS + ? doc.createElementNS(XHTML_NS, "style") + : doc.createElement("style"); + + style.appendChild(doc.createTextNode(cssText)); + if (id) + style.id = id; + + exports.getDocumentHead(doc).appendChild(style); + } +}; + +exports.importCssStylsheet = function(uri, doc) { + if (doc.createStyleSheet) { + doc.createStyleSheet(uri); + } else { + var link = exports.createElement('link'); + link.rel = 'stylesheet'; + link.href = uri; + + exports.getDocumentHead(doc).appendChild(link); + } +}; + +exports.getInnerWidth = function(element) { + return ( + parseInt(exports.computedStyle(element, "paddingLeft"), 10) + + parseInt(exports.computedStyle(element, "paddingRight"), 10) + + element.clientWidth + ); +}; + +exports.getInnerHeight = function(element) { + return ( + parseInt(exports.computedStyle(element, "paddingTop"), 10) + + parseInt(exports.computedStyle(element, "paddingBottom"), 10) + + element.clientHeight + ); +}; + +if (window.pageYOffset !== undefined) { + exports.getPageScrollTop = function() { + return window.pageYOffset; + }; + + exports.getPageScrollLeft = function() { + return window.pageXOffset; + }; +} +else { + exports.getPageScrollTop = function() { + return document.body.scrollTop; + }; + + exports.getPageScrollLeft = function() { + return document.body.scrollLeft; + }; +} + +if (window.getComputedStyle) + exports.computedStyle = function(element, style) { + if (style) + return (window.getComputedStyle(element, "") || {})[style] || ""; + return window.getComputedStyle(element, "") || {}; + }; +else + exports.computedStyle = function(element, style) { + if (style) + return element.currentStyle[style]; + return element.currentStyle; + }; + +exports.scrollbarWidth = function(document) { + var inner = exports.createElement("ace_inner"); + inner.style.width = "100%"; + inner.style.minWidth = "0px"; + inner.style.height = "200px"; + inner.style.display = "block"; + + var outer = exports.createElement("ace_outer"); + var style = outer.style; + + style.position = "absolute"; + style.left = "-10000px"; + style.overflow = "hidden"; + style.width = "200px"; + style.minWidth = "0px"; + style.height = "150px"; + style.display = "block"; + + outer.appendChild(inner); + + var body = document.documentElement; + body.appendChild(outer); + + var noScrollbar = inner.offsetWidth; + + style.overflow = "scroll"; + var withScrollbar = inner.offsetWidth; + + if (noScrollbar == withScrollbar) { + withScrollbar = outer.clientWidth; + } + + body.removeChild(outer); + + return noScrollbar-withScrollbar; +}; +exports.setInnerHtml = function(el, innerHtml) { + var element = el.cloneNode(false);//document.createElement("div"); + element.innerHTML = innerHtml; + el.parentNode.replaceChild(element, el); + return element; +}; + +if ("textContent" in document.documentElement) { + exports.setInnerText = function(el, innerText) { + el.textContent = innerText; + }; + + exports.getInnerText = function(el) { + return el.textContent; + }; +} +else { + exports.setInnerText = function(el, innerText) { + el.innerText = innerText; + }; + + exports.getInnerText = function(el) { + return el.innerText; + }; +} + +exports.getParentWindow = function(document) { + return document.defaultView || document.parentWindow; +}; + +}); + +ace.define('ace/lib/event', ['require', 'exports', 'module' , 'ace/lib/keys', 'ace/lib/useragent', 'ace/lib/dom'], function(require, exports, module) { + + +var keys = require("./keys"); +var useragent = require("./useragent"); +var dom = require("./dom"); + +exports.addListener = function(elem, type, callback) { + if (elem.addEventListener) { + return elem.addEventListener(type, callback, false); + } + if (elem.attachEvent) { + var wrapper = function() { + callback(window.event); + }; + callback._wrapper = wrapper; + elem.attachEvent("on" + type, wrapper); + } +}; + +exports.removeListener = function(elem, type, callback) { + if (elem.removeEventListener) { + return elem.removeEventListener(type, callback, false); + } + if (elem.detachEvent) { + elem.detachEvent("on" + type, callback._wrapper || callback); + } +}; +exports.stopEvent = function(e) { + exports.stopPropagation(e); + exports.preventDefault(e); + return false; +}; + +exports.stopPropagation = function(e) { + if (e.stopPropagation) + e.stopPropagation(); + else + e.cancelBubble = true; +}; + +exports.preventDefault = function(e) { + if (e.preventDefault) + e.preventDefault(); + else + e.returnValue = false; +}; +exports.getButton = function(e) { + if (e.type == "dblclick") + return 0; + if (e.type == "contextmenu" || (e.ctrlKey && useragent.isMac)) + return 2; + if (e.preventDefault) { + return e.button; + } + else { + return {1:0, 2:2, 4:1}[e.button]; + } +}; + +if (document.documentElement.setCapture) { + exports.capture = function(el, eventHandler, releaseCaptureHandler) { + var called = false; + function onReleaseCapture(e) { + eventHandler(e); + + if (!called) { + called = true; + releaseCaptureHandler(e); + } + + exports.removeListener(el, "mousemove", eventHandler); + exports.removeListener(el, "mouseup", onReleaseCapture); + exports.removeListener(el, "losecapture", onReleaseCapture); + + el.releaseCapture(); + } + + exports.addListener(el, "mousemove", eventHandler); + exports.addListener(el, "mouseup", onReleaseCapture); + exports.addListener(el, "losecapture", onReleaseCapture); + el.setCapture(); + }; +} +else { + exports.capture = function(el, eventHandler, releaseCaptureHandler) { + function onMouseUp(e) { + eventHandler && eventHandler(e); + releaseCaptureHandler && releaseCaptureHandler(e); + + document.removeEventListener("mousemove", eventHandler, true); + document.removeEventListener("mouseup", onMouseUp, true); + + e.stopPropagation(); + } + + document.addEventListener("mousemove", eventHandler, true); + document.addEventListener("mouseup", onMouseUp, true); + }; +} + +exports.addMouseWheelListener = function(el, callback) { + var factor = 8; + var listener = function(e) { + if (e.wheelDelta !== undefined) { + if (e.wheelDeltaX !== undefined) { + e.wheelX = -e.wheelDeltaX / factor; + e.wheelY = -e.wheelDeltaY / factor; + } else { + e.wheelX = 0; + e.wheelY = -e.wheelDelta / factor; + } + } + else { + if (e.axis && e.axis == e.HORIZONTAL_AXIS) { + e.wheelX = (e.detail || 0) * 5; + e.wheelY = 0; + } else { + e.wheelX = 0; + e.wheelY = (e.detail || 0) * 5; + } + } + callback(e); + }; + exports.addListener(el, "DOMMouseScroll", listener); + exports.addListener(el, "mousewheel", listener); +}; + +exports.addMultiMouseDownListener = function(el, timeouts, eventHandler, callbackName) { + var clicks = 0; + var startX, startY, timer; + var eventNames = { + 2: "dblclick", + 3: "tripleclick", + 4: "quadclick" + }; + + exports.addListener(el, "mousedown", function(e) { + if (exports.getButton(e) != 0) { + clicks = 0; + } else { + var isNewClick = Math.abs(e.clientX - startX) > 5 || Math.abs(e.clientY - startY) > 5; + + if (!timer || isNewClick) + clicks = 0; + + clicks += 1; + + if (timer) + clearTimeout(timer) + timer = setTimeout(function() {timer = null}, timeouts[clicks - 1] || 600); + } + if (clicks == 1) { + startX = e.clientX; + startY = e.clientY; + } + + eventHandler[callbackName]("mousedown", e); + + if (clicks > 4) + clicks = 0; + else if (clicks > 1) + return eventHandler[callbackName](eventNames[clicks], e); + }); + + if (useragent.isOldIE) { + exports.addListener(el, "dblclick", function(e) { + clicks = 2; + if (timer) + clearTimeout(timer); + timer = setTimeout(function() {timer = null}, timeouts[clicks - 1] || 600); + eventHandler[callbackName]("mousedown", e); + eventHandler[callbackName](eventNames[clicks], e); + }); + } +}; + +function normalizeCommandKeys(callback, e, keyCode) { + var hashId = 0; + if ((useragent.isOpera && !("KeyboardEvent" in window)) && useragent.isMac) { + hashId = 0 | (e.metaKey ? 1 : 0) | (e.altKey ? 2 : 0) + | (e.shiftKey ? 4 : 0) | (e.ctrlKey ? 8 : 0); + } else { + hashId = 0 | (e.ctrlKey ? 1 : 0) | (e.altKey ? 2 : 0) + | (e.shiftKey ? 4 : 0) | (e.metaKey ? 8 : 0); + } + + if (keyCode in keys.MODIFIER_KEYS) { + switch (keys.MODIFIER_KEYS[keyCode]) { + case "Alt": + hashId = 2; + break; + case "Shift": + hashId = 4; + break; + case "Ctrl": + hashId = 1; + break; + default: + hashId = 8; + break; + } + keyCode = 0; + } + + if (!useragent.isMac && pressedKeys[91] || pressedKeys[92]) + hashId |= 8; + + if (hashId & 8 && (keyCode == 91 || keyCode == 93)) { + keyCode = 0; + } + if (!hashId && !(keyCode in keys.FUNCTION_KEYS) && !(keyCode in keys.PRINTABLE_KEYS)) { + return false; + } + return callback(e, hashId, keyCode); +} + +var pressedKeys = Object.create(null); +exports.addCommandKeyListener = function(el, callback) { + var addListener = exports.addListener; + if (useragent.isOldGecko || (useragent.isOpera && !("KeyboardEvent" in window))) { + var lastKeyDownKeyCode = null; + addListener(el, "keydown", function(e) { + lastKeyDownKeyCode = e.keyCode; + }); + addListener(el, "keypress", function(e) { + return normalizeCommandKeys(callback, e, lastKeyDownKeyCode); + }); + } else { + var lastDefaultPrevented = null; + + addListener(el, "keydown", function(e) { + pressedKeys[e.keyCode] = true; + var result = normalizeCommandKeys(callback, e, e.keyCode); + lastDefaultPrevented = e.defaultPrevented; + return result; + }); + + addListener(el, "keypress", function(e) { + if (lastDefaultPrevented && (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey)) { + exports.stopEvent(e); + lastDefaultPrevented = null; + } + }); + + addListener(el, "keyup", function(e) { + pressedKeys[e.keyCode] = null; + }); + + addListener(el, "focus", function(e) { + pressedKeys = Object.create(null); + }); + } +}; + +if (window.postMessage && !useragent.isOldIE) { + var postMessageId = 1; + exports.nextTick = function(callback, win) { + win = win || window; + var messageName = "zero-timeout-message-" + postMessageId; + exports.addListener(win, "message", function listener(e) { + if (e.data == messageName) { + exports.stopPropagation(e); + exports.removeListener(win, "message", listener); + callback(); + } + }); + win.postMessage(messageName, "*"); + }; +} + + +exports.nextFrame = window.requestAnimationFrame || + window.mozRequestAnimationFrame || + window.webkitRequestAnimationFrame || + window.msRequestAnimationFrame || + window.oRequestAnimationFrame; + +if (exports.nextFrame) + exports.nextFrame = exports.nextFrame.bind(window); +else + exports.nextFrame = function(callback) { + setTimeout(callback, 17); + }; +}); + +ace.define('ace/lib/keys', ['require', 'exports', 'module' , 'ace/lib/oop'], function(require, exports, module) { + + +var oop = require("./oop"); +var Keys = (function() { + var ret = { + MODIFIER_KEYS: { + 16: 'Shift', 17: 'Ctrl', 18: 'Alt', 224: 'Meta' + }, + + KEY_MODS: { + "ctrl": 1, "alt": 2, "option" : 2, + "shift": 4, "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", + 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: '.', + 188: ',', 190: '.', 191: '/', 192: '`', 219: '[', 220: '\\', + 221: ']', 222: '\'' + } + }; + for (var i in ret.FUNCTION_KEYS) { + var name = ret.FUNCTION_KEYS[i].toLowerCase(); + ret[name] = parseInt(i, 10); + } + oop.mixin(ret, ret.MODIFIER_KEYS); + oop.mixin(ret, ret.PRINTABLE_KEYS); + oop.mixin(ret, ret.FUNCTION_KEYS); + ret.enter = ret["return"]; + ret.escape = ret.esc; + ret.del = ret["delete"]; + ret[173] = '-'; + + return ret; +})(); +oop.mixin(exports, Keys); + +exports.keyCodeToString = function(keyCode) { + return (Keys[keyCode] || String.fromCharCode(keyCode)).toLowerCase(); +} + +}); + +ace.define('ace/lib/oop', ['require', 'exports', 'module' ], function(require, exports, module) { + + +exports.inherits = (function() { + var tempCtor = function() {}; + return function(ctor, superCtor) { + tempCtor.prototype = superCtor.prototype; + ctor.super_ = superCtor.prototype; + ctor.prototype = new tempCtor(); + ctor.prototype.constructor = ctor; + }; +}()); + +exports.mixin = function(obj, mixin) { + for (var key in mixin) { + obj[key] = mixin[key]; + } + return obj; +}; + +exports.implement = function(proto, mixin) { + exports.mixin(proto, mixin); +}; + +}); + +ace.define('ace/lib/useragent', ['require', 'exports', 'module' ], function(require, exports, module) { +exports.OS = { + LINUX: "LINUX", + MAC: "MAC", + WINDOWS: "WINDOWS" +}; +exports.getOS = function() { + if (exports.isMac) { + return exports.OS.MAC; + } else if (exports.isLinux) { + return exports.OS.LINUX; + } else { + return exports.OS.WINDOWS; + } +}; +if (typeof navigator != "object") + return; + +var os = (navigator.platform.match(/mac|win|linux/i) || ["other"])[0].toLowerCase(); +var ua = navigator.userAgent; +exports.isWin = (os == "win"); +exports.isMac = (os == "mac"); +exports.isLinux = (os == "linux"); +exports.isIE = + (navigator.appName == "Microsoft Internet Explorer" || navigator.appName.indexOf("MSAppHost") >= 0) + && parseFloat(navigator.userAgent.match(/MSIE ([0-9]+[\.0-9]+)/)[1]); + +exports.isOldIE = exports.isIE && exports.isIE < 9; +exports.isGecko = exports.isMozilla = window.controllers && window.navigator.product === "Gecko"; +exports.isOldGecko = exports.isGecko && parseInt((navigator.userAgent.match(/rv\:(\d+)/)||[])[1], 10) < 4; +exports.isOpera = window.opera && Object.prototype.toString.call(window.opera) == "[object Opera]"; +exports.isWebKit = parseFloat(ua.split("WebKit/")[1]) || undefined; + +exports.isChrome = parseFloat(ua.split(" Chrome/")[1]) || undefined; + +exports.isAIR = ua.indexOf("AdobeAIR") >= 0; + +exports.isIPad = ua.indexOf("iPad") >= 0; + +exports.isTouchPad = ua.indexOf("TouchPad") >= 0; + +}); + +ace.define('ace/editor', ['require', 'exports', 'module' , 'ace/lib/fixoldbrowsers', 'ace/lib/oop', 'ace/lib/dom', 'ace/lib/lang', 'ace/lib/useragent', 'ace/keyboard/textinput', 'ace/mouse/mouse_handler', 'ace/mouse/fold_handler', 'ace/keyboard/keybinding', 'ace/edit_session', 'ace/search', 'ace/range', 'ace/lib/event_emitter', 'ace/commands/command_manager', 'ace/commands/default_commands', 'ace/config'], function(require, exports, module) { + + +require("./lib/fixoldbrowsers"); + +var oop = require("./lib/oop"); +var dom = require("./lib/dom"); +var lang = require("./lib/lang"); +var useragent = require("./lib/useragent"); +var TextInput = require("./keyboard/textinput").TextInput; +var MouseHandler = require("./mouse/mouse_handler").MouseHandler; +var FoldHandler = require("./mouse/fold_handler").FoldHandler; +var KeyBinding = require("./keyboard/keybinding").KeyBinding; +var EditSession = require("./edit_session").EditSession; +var Search = require("./search").Search; +var Range = require("./range").Range; +var EventEmitter = require("./lib/event_emitter").EventEmitter; +var CommandManager = require("./commands/command_manager").CommandManager; +var defaultCommands = require("./commands/default_commands").commands; +var config = require("./config"); +var Editor = function(renderer, session) { + var container = renderer.getContainerElement(); + this.container = container; + this.renderer = renderer; + + this.commands = new CommandManager(useragent.isMac ? "mac" : "win", defaultCommands); + this.textInput = new TextInput(renderer.getTextAreaContainer(), this); + this.renderer.textarea = this.textInput.getElement(); + this.keyBinding = new KeyBinding(this); + this.$mouseHandler = new MouseHandler(this); + new FoldHandler(this); + + this.$blockScrolling = 0; + this.$search = new Search().set({ + wrap: true + }); + + this.setSession(session || new EditSession("")); + config.resetOptions(this); + config._emit("editor", this); +}; + +(function(){ + + oop.implement(this, EventEmitter); + this.setKeyboardHandler = function(keyboardHandler) { + if (!keyboardHandler) { + this.keyBinding.setKeyboardHandler(null); + } else if (typeof keyboardHandler == "string") { + this.$keybindingId = keyboardHandler; + var _self = this; + config.loadModule(["keybinding", keyboardHandler], function(module) { + if (_self.$keybindingId == keyboardHandler) + _self.keyBinding.setKeyboardHandler(module && module.handler); + }); + } else { + delete this.$keybindingId; + this.keyBinding.setKeyboardHandler(keyboardHandler); + } + }; + this.getKeyboardHandler = function() { + return this.keyBinding.getKeyboardHandler(); + }; + this.setSession = function(session) { + if (this.session == session) + return; + + if (this.session) { + var oldSession = this.session; + this.session.removeEventListener("change", this.$onDocumentChange); + this.session.removeEventListener("changeMode", this.$onChangeMode); + this.session.removeEventListener("tokenizerUpdate", this.$onTokenizerUpdate); + this.session.removeEventListener("changeTabSize", this.$onChangeTabSize); + this.session.removeEventListener("changeWrapLimit", this.$onChangeWrapLimit); + this.session.removeEventListener("changeWrapMode", this.$onChangeWrapMode); + this.session.removeEventListener("onChangeFold", this.$onChangeFold); + this.session.removeEventListener("changeFrontMarker", this.$onChangeFrontMarker); + this.session.removeEventListener("changeBackMarker", this.$onChangeBackMarker); + this.session.removeEventListener("changeBreakpoint", this.$onChangeBreakpoint); + this.session.removeEventListener("changeAnnotation", this.$onChangeAnnotation); + this.session.removeEventListener("changeOverwrite", this.$onCursorChange); + this.session.removeEventListener("changeScrollTop", this.$onScrollTopChange); + this.session.removeEventListener("changeScrollLeft", this.$onScrollLeftChange); + + var selection = this.session.getSelection(); + selection.removeEventListener("changeCursor", this.$onCursorChange); + selection.removeEventListener("changeSelection", this.$onSelectionChange); + } + + this.session = session; + + this.$onDocumentChange = this.onDocumentChange.bind(this); + session.addEventListener("change", this.$onDocumentChange); + this.renderer.setSession(session); + + this.$onChangeMode = this.onChangeMode.bind(this); + session.addEventListener("changeMode", this.$onChangeMode); + + this.$onTokenizerUpdate = this.onTokenizerUpdate.bind(this); + session.addEventListener("tokenizerUpdate", this.$onTokenizerUpdate); + + this.$onChangeTabSize = this.renderer.onChangeTabSize.bind(this.renderer); + session.addEventListener("changeTabSize", this.$onChangeTabSize); + + this.$onChangeWrapLimit = this.onChangeWrapLimit.bind(this); + session.addEventListener("changeWrapLimit", this.$onChangeWrapLimit); + + this.$onChangeWrapMode = this.onChangeWrapMode.bind(this); + session.addEventListener("changeWrapMode", this.$onChangeWrapMode); + + this.$onChangeFold = this.onChangeFold.bind(this); + session.addEventListener("changeFold", this.$onChangeFold); + + this.$onChangeFrontMarker = this.onChangeFrontMarker.bind(this); + this.session.addEventListener("changeFrontMarker", this.$onChangeFrontMarker); + + this.$onChangeBackMarker = this.onChangeBackMarker.bind(this); + this.session.addEventListener("changeBackMarker", this.$onChangeBackMarker); + + this.$onChangeBreakpoint = this.onChangeBreakpoint.bind(this); + this.session.addEventListener("changeBreakpoint", this.$onChangeBreakpoint); + + this.$onChangeAnnotation = this.onChangeAnnotation.bind(this); + this.session.addEventListener("changeAnnotation", this.$onChangeAnnotation); + + this.$onCursorChange = this.onCursorChange.bind(this); + this.session.addEventListener("changeOverwrite", this.$onCursorChange); + + this.$onScrollTopChange = this.onScrollTopChange.bind(this); + this.session.addEventListener("changeScrollTop", this.$onScrollTopChange); + + this.$onScrollLeftChange = this.onScrollLeftChange.bind(this); + this.session.addEventListener("changeScrollLeft", this.$onScrollLeftChange); + + this.selection = session.getSelection(); + this.selection.addEventListener("changeCursor", this.$onCursorChange); + + this.$onSelectionChange = this.onSelectionChange.bind(this); + this.selection.addEventListener("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._emit("changeSession", { + session: session, + oldSession: oldSession + }); + }; + this.getSession = function() { + return this.session; + }; + this.setValue = function(val, cursorPos) { + this.session.doc.setValue(val); + + if (!cursorPos) + this.selectAll(); + else if (cursorPos == 1) + this.navigateFileEnd(); + else if (cursorPos == -1) + this.navigateFileStart(); + + return val; + }; + this.getValue = function() { + return this.session.getValue(); + }; + this.getSelection = function() { + return this.selection; + }; + this.resize = function(force) { + this.renderer.onResize(force); + }; + this.setTheme = function(theme) { + this.renderer.setTheme(theme); + }; + this.getTheme = function() { + return this.renderer.getTheme(); + }; + this.setStyle = function(style) { + this.renderer.setStyle(style); + }; + this.unsetStyle = function(style) { + this.renderer.unsetStyle(style); + }; + this.getFontSize = function () { + return this.getOption("fontSize") || + dom.computedStyle(this.container, "fontSize"); + }; + this.setFontSize = function(size) { + this.setOption("fontSize", size); + }; + + this.$highlightBrackets = function() { + if (this.session.$bracketHighlight) { + this.session.removeMarker(this.session.$bracketHighlight); + this.session.$bracketHighlight = null; + } + + if (this.$highlightPending) { + return; + } + var self = this; + this.$highlightPending = true; + setTimeout(function() { + self.$highlightPending = false; + + var pos = self.session.findMatchingBracket(self.getCursorPosition()); + if (pos) { + var range = new Range(pos.row, pos.column, pos.row, pos.column+1); + } else if (self.session.$mode.getMatching) { + var range = self.session.$mode.getMatching(self.session); + } + if (range) + self.session.$bracketHighlight = self.session.addMarker(range, "ace_bracket", "text"); + }, 50); + }; + this.focus = function() { + var _self = this; + setTimeout(function() { + _self.textInput.focus(); + }); + this.textInput.focus(); + }; + this.isFocused = function() { + return this.textInput.isFocused(); + }; + this.blur = function() { + this.textInput.blur(); + }; + this.onFocus = function() { + if (this.$isFocused) + return; + this.$isFocused = true; + this.renderer.showCursor(); + this.renderer.visualizeFocus(); + this._emit("focus"); + }; + this.onBlur = function() { + if (!this.$isFocused) + return; + this.$isFocused = false; + this.renderer.hideCursor(); + this.renderer.visualizeBlur(); + this._emit("blur"); + }; + + this.$cursorChange = function() { + this.renderer.updateCursor(); + }; + this.onDocumentChange = function(e) { + var delta = e.data; + var range = delta.range; + var lastRow; + + if (range.start.row == range.end.row && delta.action != "insertLines" && delta.action != "removeLines") + lastRow = range.end.row; + else + lastRow = Infinity; + this.renderer.updateLines(range.start.row, lastRow); + + this._emit("change", e); + this.$cursorChange(); + }; + + this.onTokenizerUpdate = function(e) { + var rows = e.data; + this.renderer.updateLines(rows.first, rows.last); + }; + + + this.onScrollTopChange = function() { + this.renderer.scrollToY(this.session.getScrollTop()); + }; + + this.onScrollLeftChange = function() { + this.renderer.scrollToX(this.session.getScrollLeft()); + }; + this.onCursorChange = function() { + this.$cursorChange(); + + if (!this.$blockScrolling) { + this.renderer.scrollCursorIntoView(); + } + + this.$highlightBrackets(); + this.$updateHighlightActiveLine(); + this._emit("changeSelection"); + }; + + this.$updateHighlightActiveLine = function() { + var session = this.getSession(); + + var highlight; + if (this.$highlightActiveLine) { + if ((this.$selectionStyle != "line" || !this.selection.isMultiLine())) + highlight = this.getCursorPosition(); + } + + if (session.$highlightLineMarker && !highlight) { + session.removeMarker(session.$highlightLineMarker.id); + session.$highlightLineMarker = null; + } else if (!session.$highlightLineMarker && highlight) { + var range = new Range(highlight.row, highlight.column, highlight.row, Infinity); + range.id = session.addMarker(range, "ace_active-line", "screenLine"); + session.$highlightLineMarker = range; + } else if (highlight) { + session.$highlightLineMarker.start.row = highlight.row; + session.$highlightLineMarker.end.row = highlight.row; + session.$highlightLineMarker.start.column = highlight.column; + session._emit("changeBackMarker"); + } + }; + + this.onSelectionChange = function(e) { + var session = this.session; + + if (session.$selectionMarker) { + session.removeMarker(session.$selectionMarker); + } + session.$selectionMarker = null; + + if (!this.selection.isEmpty()) { + var range = this.selection.getRange(); + var style = this.getSelectionStyle(); + session.$selectionMarker = session.addMarker(range, "ace_selection", style); + } else { + this.$updateHighlightActiveLine(); + } + + var re = this.$highlightSelectedWord && this.$getSelectionHighLightRegexp() + this.session.highlight(re); + + this._emit("changeSelection"); + }; + + this.$getSelectionHighLightRegexp = function() { + var session = this.session; + + var selection = this.getSelectionRange(); + if (selection.isEmpty() || selection.isMultiLine()) + return; + + var startOuter = selection.start.column - 1; + var endOuter = selection.end.column + 1; + var line = session.getLine(selection.start.row); + var lineCols = line.length; + var needle = line.substring(Math.max(startOuter, 0), + Math.min(endOuter, lineCols)); + if ((startOuter >= 0 && /^[\w\d]/.test(needle)) || + (endOuter <= lineCols && /[\w\d]$/.test(needle))) + return; + + needle = line.substring(selection.start.column, selection.end.column); + if (!/^[\w\d]+$/.test(needle)) + return; + + var re = this.$search.$assembleRegExp({ + wholeWord: true, + caseSensitive: true, + needle: needle + }); + + return re; + }; + + + 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(true); + }; + + + this.onChangeFold = function() { + this.$updateHighlightActiveLine(); + this.renderer.updateFull(); + }; + + this.getCopyText = function() { + var text = ""; + if (!this.selection.isEmpty()) + text = this.session.getTextRange(this.getSelectionRange()); + + this._emit("copy", text); + return text; + }; + this.onCopy = function() { + this.commands.exec("copy", this); + }; + this.onCut = function() { + this.commands.exec("cut", this); + }; + this.onPaste = function(text) { + if (this.$readOnly) + return; + this._emit("paste", text); + this.insert(text); + }; + + + this.execCommand = function(command, args) { + this.commands.exec(command, this, args); + }; + this.insert = function(text) { + var session = this.session; + var mode = session.getMode(); + var cursor = this.getCursorPosition(); + + if (this.getBehavioursEnabled()) { + var transform = mode.transformAction(session.getState(cursor.row), 'insertion', this, session, text); + if (transform) + text = transform.text; + } + + text = text.replace("\t", this.session.getTabString()); + if (!this.selection.isEmpty()) { + cursor = this.session.remove(this.getSelectionRange()); + this.clearSelection(); + } + else if (this.session.getOverwrite()) { + var range = new Range.fromPoints(cursor, cursor); + range.end.column += text.length; + this.session.remove(range); + } + + this.clearSelection(); + + var start = cursor.column; + var lineState = session.getState(cursor.row); + var line = session.getLine(cursor.row); + var shouldOutdent = mode.checkOutdent(lineState, line, text); + var end = session.insert(cursor, text); + + if (transform && transform.selection) { + if (transform.selection.length == 2) { // Transform relative to the current column + this.selection.setSelectionRange( + new Range(cursor.row, start + transform.selection[0], + cursor.row, start + transform.selection[1])); + } else { // Transform relative to the current row. + this.selection.setSelectionRange( + new Range(cursor.row + transform.selection[0], + transform.selection[1], + cursor.row + transform.selection[2], + transform.selection[3])); + } + } + if (session.getDocument().isNewLine(text)) { + var lineIndent = mode.getNextLineIndent(lineState, line.slice(0, cursor.column), session.getTabString()); + + this.moveCursorTo(cursor.row+1, 0); + + var size = session.getTabSize(); + var minIndent = Number.MAX_VALUE; + + for (var row = cursor.row + 1; row <= end.row; ++row) { + var indent = 0; + + line = session.getLine(row); + for (var i = 0; i < line.length; ++i) + if (line.charAt(i) == '\t') + indent += size; + else if (line.charAt(i) == ' ') + indent += 1; + else + break; + if (/[^\s]/.test(line)) + minIndent = Math.min(indent, minIndent); + } + + for (var row = cursor.row + 1; row <= end.row; ++row) { + var outdent = minIndent; + + line = session.getLine(row); + for (var i = 0; i < line.length && outdent > 0; ++i) + if (line.charAt(i) == '\t') + outdent -= size; + else if (line.charAt(i) == ' ') + outdent -= 1; + session.remove(new Range(row, 0, row, i)); + } + session.indentRows(cursor.row + 1, end.row, lineIndent); + } + if (shouldOutdent) + mode.autoOutdent(lineState, session, cursor.row); + }; + + this.onTextInput = function(text) { + this.keyBinding.onTextInput(text); + }; + + this.onCommandKey = function(e, hashId, keyCode) { + this.keyBinding.onCommandKey(e, hashId, keyCode); + }; + this.setOverwrite = function(overwrite) { + this.session.setOverwrite(overwrite); + }; + this.getOverwrite = function() { + return this.session.getOverwrite(); + }; + this.toggleOverwrite = function() { + this.session.toggleOverwrite(); + }; + this.setScrollSpeed = function(speed) { + this.setOption("scrollSpeed", speed); + }; + this.getScrollSpeed = function() { + return this.getOption("scrollSpeed"); + }; + this.setDragDelay = function(dragDelay) { + this.setOption("dragDelay", dragDelay); + }; + this.getDragDelay = function() { + return this.getOption("dragDelay"); + }; + this.setSelectionStyle = function(val) { + this.setOption("selectionStyle", val); + }; + this.getSelectionStyle = function() { + return this.getOption("selectionStyle"); + }; + this.setHighlightActiveLine = function(shouldHighlight) { + this.setOption("highlightActiveLine", shouldHighlight); + }; + this.getHighlightActiveLine = function() { + return this.getOption("highlightActiveLine"); + }; + this.setHighlightGutterLine = function(shouldHighlight) { + this.setOption("highlightGutterLine", shouldHighlight); + }; + + this.getHighlightGutterLine = function() { + return this.getOption("highlightGutterLine"); + }; + this.setHighlightSelectedWord = function(shouldHighlight) { + this.setOption("highlightSelectedWord", shouldHighlight); + }; + this.getHighlightSelectedWord = function() { + return this.$highlightSelectedWord; + }; + + this.setAnimatedScroll = function(shouldAnimate){ + this.renderer.setAnimatedScroll(shouldAnimate); + }; + + this.getAnimatedScroll = function(){ + return this.renderer.getAnimatedScroll(); + }; + this.setShowInvisibles = function(showInvisibles) { + this.renderer.setShowInvisibles(showInvisibles); + }; + this.getShowInvisibles = function() { + return this.renderer.getShowInvisibles(); + }; + + this.setDisplayIndentGuides = function(display) { + this.renderer.setDisplayIndentGuides(display); + }; + + this.getDisplayIndentGuides = function() { + return this.renderer.getDisplayIndentGuides(); + }; + this.setShowPrintMargin = function(showPrintMargin) { + this.renderer.setShowPrintMargin(showPrintMargin); + }; + this.getShowPrintMargin = function() { + return this.renderer.getShowPrintMargin(); + }; + this.setPrintMarginColumn = function(showPrintMargin) { + this.renderer.setPrintMarginColumn(showPrintMargin); + }; + this.getPrintMarginColumn = function() { + return this.renderer.getPrintMarginColumn(); + }; + this.setReadOnly = function(readOnly) { + this.setOption("readOnly", readOnly); + }; + this.getReadOnly = function() { + return this.getOption("readOnly"); + }; + this.setBehavioursEnabled = function (enabled) { + this.setOption("behavioursEnabled", enabled); + }; + this.getBehavioursEnabled = function () { + return this.getOption("behavioursEnabled"); + }; + this.setWrapBehavioursEnabled = function (enabled) { + this.setOption("wrapBehavioursEnabled", enabled); + }; + this.getWrapBehavioursEnabled = function () { + return this.getOption("wrapBehavioursEnabled"); + }; + this.setShowFoldWidgets = function(show) { + this.setOption("showFoldWidgets", show); + + }; + this.getShowFoldWidgets = function() { + return this.getOption("showFoldWidgets"); + }; + + this.setFadeFoldWidgets = function(fade) { + this.setOption("fadeFoldWidgets", fade); + }; + + this.getFadeFoldWidgets = function() { + return this.getOption("fadeFoldWidgets"); + }; + this.remove = function(dir) { + if (this.selection.isEmpty()){ + if (dir == "left") + this.selection.selectLeft(); + else + this.selection.selectRight(); + } + + var range = this.getSelectionRange(); + if (this.getBehavioursEnabled()) { + var session = this.session; + var state = session.getState(range.start.row); + var new_range = session.getMode().transformAction(state, 'deletion', this, session, range); + if (new_range) + range = new_range; + } + + this.session.remove(range); + this.clearSelection(); + }; + this.removeWordRight = function() { + if (this.selection.isEmpty()) + this.selection.selectWordRight(); + + this.session.remove(this.getSelectionRange()); + this.clearSelection(); + }; + this.removeWordLeft = function() { + if (this.selection.isEmpty()) + this.selection.selectWordLeft(); + + this.session.remove(this.getSelectionRange()); + this.clearSelection(); + }; + this.removeToLineStart = function() { + if (this.selection.isEmpty()) + this.selection.selectLineStart(); + + this.session.remove(this.getSelectionRange()); + this.clearSelection(); + }; + this.removeToLineEnd = function() { + if (this.selection.isEmpty()) + this.selection.selectLineEnd(); + + var range = this.getSelectionRange(); + if (range.start.column == range.end.column && range.start.row == range.end.row) { + range.end.column = 0; + range.end.row++; + } + + this.session.remove(range); + this.clearSelection(); + }; + this.splitLine = function() { + if (!this.selection.isEmpty()) { + this.session.remove(this.getSelectionRange()); + this.clearSelection(); + } + + var cursor = this.getCursorPosition(); + this.insert("\n"); + this.moveCursorToPosition(cursor); + }; + this.transposeLetters = function() { + if (!this.selection.isEmpty()) { + return; + } + + var cursor = this.getCursorPosition(); + var column = cursor.column; + if (column === 0) + return; + + var line = this.session.getLine(cursor.row); + var swap, range; + if (column < line.length) { + swap = line.charAt(column) + line.charAt(column-1); + range = new Range(cursor.row, column-1, cursor.row, column+1); + } + else { + swap = line.charAt(column-1) + line.charAt(column-2); + range = new Range(cursor.row, column-2, cursor.row, column); + } + this.session.replace(range, swap); + }; + this.toLowerCase = function() { + var originalRange = this.getSelectionRange(); + if (this.selection.isEmpty()) { + this.selection.selectWord(); + } + + var range = this.getSelectionRange(); + var text = this.session.getTextRange(range); + this.session.replace(range, text.toLowerCase()); + this.selection.setSelectionRange(originalRange); + }; + this.toUpperCase = function() { + var originalRange = this.getSelectionRange(); + if (this.selection.isEmpty()) { + this.selection.selectWord(); + } + + var range = this.getSelectionRange(); + var text = this.session.getTextRange(range); + this.session.replace(range, text.toUpperCase()); + this.selection.setSelectionRange(originalRange); + }; + this.indent = function() { + var session = this.session; + var range = this.getSelectionRange(); + + if (range.start.row < range.end.row || range.start.column < range.end.column) { + var rows = this.$getSelectedRows(); + session.indentRows(rows.first, rows.last, "\t"); + } else { + var indentString; + + if (this.session.getUseSoftTabs()) { + var size = session.getTabSize(), + position = this.getCursorPosition(), + column = session.documentToScreenColumn(position.row, position.column), + count = (size - column % size); + + indentString = lang.stringRepeat(" ", count); + } else + indentString = "\t"; + return this.insert(indentString); + } + }; + this.blockIndent = function() { + var rows = this.$getSelectedRows(); + this.session.indentRows(rows.first, rows.last, "\t"); + }; + this.blockOutdent = function() { + var selection = this.session.getSelection(); + this.session.outdentRows(selection.getRange()); + }; + this.sortLines = function() { + var rows = this.$getSelectedRows(); + var session = this.session; + + var lines = []; + for (i = rows.first; i <= rows.last; i++) + lines.push(session.getLine(i)); + + lines.sort(function(a, b) { + if (a.toLowerCase() < b.toLowerCase()) return -1; + if (a.toLowerCase() > b.toLowerCase()) return 1; + return 0; + }); + + var deleteRange = new Range(0, 0, 0, 0); + for (var i = rows.first; i <= rows.last; i++) { + var line = session.getLine(i); + deleteRange.start.row = i; + deleteRange.end.row = i; + deleteRange.end.column = line.length; + session.replace(deleteRange, lines[i-rows.first]); + } + }; + this.toggleCommentLines = function() { + var state = this.session.getState(this.getCursorPosition().row); + var rows = this.$getSelectedRows(); + this.session.getMode().toggleCommentLines(state, this.session, rows.first, rows.last); + }; + + this.toggleBlockComment = function() { + var cursor = this.getCursorPosition(); + var state = this.session.getState(cursor.row); + var range = this.getSelectionRange(); + this.session.getMode().toggleBlockComment(state, this.session, range, cursor); + }; + this.getNumberAt = function( row, column ) { + var _numberRx = /[\-]?[0-9]+(?:\.[0-9]+)?/g + _numberRx.lastIndex = 0 + + var s = this.session.getLine(row) + while (_numberRx.lastIndex < column) { + var m = _numberRx.exec(s) + if(m.index <= column && m.index+m[0].length >= column){ + var number = { + value: m[0], + start: m.index, + end: m.index+m[0].length + } + return number; + } + } + return null; + }; + this.modifyNumber = function(amount) { + var row = this.selection.getCursor().row; + var column = this.selection.getCursor().column; + var charRange = new Range(row, column-1, row, column); + + var c = this.session.getTextRange(charRange); + if (!isNaN(parseFloat(c)) && isFinite(c)) { + var nr = this.getNumberAt(row, column); + if (nr) { + var fp = nr.value.indexOf(".") >= 0 ? nr.start + nr.value.indexOf(".") + 1 : nr.end; + var decimals = nr.start + nr.value.length - fp; + + var t = parseFloat(nr.value); + t *= Math.pow(10, decimals); + + + if(fp !== nr.end && column < fp){ + amount *= Math.pow(10, nr.end - column - 1); + } else { + amount *= Math.pow(10, nr.end - column); + } + + t += amount; + t /= Math.pow(10, decimals); + var nnr = t.toFixed(decimals); + var replaceRange = new Range(row, nr.start, row, nr.end); + this.session.replace(replaceRange, nnr); + this.moveCursorTo(row, Math.max(nr.start +1, column + nnr.length - nr.value.length)); + + } + } + }; + this.removeLines = function() { + var rows = this.$getSelectedRows(); + var range; + if (rows.first === 0 || rows.last+1 < this.session.getLength()) + range = new Range(rows.first, 0, rows.last+1, 0); + else + range = new Range( + rows.first-1, this.session.getLine(rows.first-1).length, + rows.last, this.session.getLine(rows.last).length + ); + this.session.remove(range); + this.clearSelection(); + }; + + this.duplicateSelection = function() { + var sel = this.selection; + var doc = this.session; + var range = sel.getRange(); + var reverse = sel.isBackwards(); + if (range.isEmpty()) { + var row = range.start.row; + doc.duplicateLines(row, row); + } else { + var point = reverse ? range.start : range.end; + var endPoint = doc.insert(point, doc.getTextRange(range), false); + range.start = point; + range.end = endPoint; + + sel.setSelectionRange(range, reverse) + } + }; + this.moveLinesDown = function() { + this.$moveLines(function(firstRow, lastRow) { + return this.session.moveLinesDown(firstRow, lastRow); + }); + }; + this.moveLinesUp = function() { + this.$moveLines(function(firstRow, lastRow) { + return this.session.moveLinesUp(firstRow, lastRow); + }); + }; + this.moveText = function(range, toPosition) { + return this.session.moveText(range, toPosition); + }; + this.copyLinesUp = function() { + this.$moveLines(function(firstRow, lastRow) { + this.session.duplicateLines(firstRow, lastRow); + return 0; + }); + }; + this.copyLinesDown = function() { + this.$moveLines(function(firstRow, lastRow) { + return this.session.duplicateLines(firstRow, lastRow); + }); + }; + this.$moveLines = function(mover) { + var selection = this.selection; + if (!selection.inMultiSelectMode || this.inVirtualSelectionMode) { + var range = selection.toOrientedRange(); + var rows = this.$getSelectedRows(range); + var linesMoved = mover.call(this, rows.first, rows.last); + range.moveBy(linesMoved, 0); + selection.fromOrientedRange(range); + } else { + var ranges = selection.rangeList.ranges; + selection.rangeList.detach(this.session); + + for (var i = ranges.length; i--; ) { + var rangeIndex = i; + var rows = ranges[i].collapseRows(); + var last = rows.end.row; + var first = rows.start.row; + while (i--) { + var rows = ranges[i].collapseRows(); + if (first - rows.end.row <= 1) + first = rows.end.row; + else + break; + } + i++; + + var linesMoved = mover.call(this, first, last); + while (rangeIndex >= i) { + ranges[rangeIndex].moveBy(linesMoved, 0); + rangeIndex--; + } + } + selection.fromOrientedRange(selection.ranges[0]); + selection.rangeList.attach(this.session); + } + }; + this.$getSelectedRows = function() { + var range = this.getSelectionRange().collapseRows(); + + return { + first: range.start.row, + last: range.end.row + }; + }; + + this.onCompositionStart = function(text) { + this.renderer.showComposition(this.getCursorPosition()); + }; + + this.onCompositionUpdate = function(text) { + this.renderer.setCompositionText(text); + }; + + this.onCompositionEnd = function() { + this.renderer.hideComposition(); + }; + this.getFirstVisibleRow = function() { + return this.renderer.getFirstVisibleRow(); + }; + this.getLastVisibleRow = function() { + return this.renderer.getLastVisibleRow(); + }; + this.isRowVisible = function(row) { + return (row >= this.getFirstVisibleRow() && row <= this.getLastVisibleRow()); + }; + this.isRowFullyVisible = function(row) { + return (row >= this.renderer.getFirstFullyVisibleRow() && row <= this.renderer.getLastFullyVisibleRow()); + }; + this.$getVisibleRowCount = function() { + return this.renderer.getScrollBottomRow() - this.renderer.getScrollTopRow() + 1; + }; + + this.$moveByPage = function(dir, select) { + var renderer = this.renderer; + var config = this.renderer.layerConfig; + var rows = dir * Math.floor(config.height / config.lineHeight); + + this.$blockScrolling++; + if (select == true) { + this.selection.$moveSelection(function(){ + this.moveCursorBy(rows, 0); + }); + } else if (select == false) { + this.selection.moveCursorBy(rows, 0); + this.selection.clearSelection(); + } + this.$blockScrolling--; + + var scrollTop = renderer.scrollTop; + + renderer.scrollBy(0, rows * config.lineHeight); + if (select != null) + renderer.scrollCursorIntoView(null, 0.5); + + renderer.animateScrolling(scrollTop); + }; + this.selectPageDown = function() { + this.$moveByPage(1, true); + }; + this.selectPageUp = function() { + this.$moveByPage(-1, true); + }; + this.gotoPageDown = function() { + this.$moveByPage(1, false); + }; + this.gotoPageUp = function() { + this.$moveByPage(-1, false); + }; + this.scrollPageDown = function() { + this.$moveByPage(1); + }; + this.scrollPageUp = function() { + this.$moveByPage(-1); + }; + this.scrollToRow = function(row) { + this.renderer.scrollToRow(row); + }; + this.scrollToLine = function(line, center, animate, callback) { + this.renderer.scrollToLine(line, center, animate, callback); + }; + this.centerSelection = function() { + var range = this.getSelectionRange(); + var pos = { + row: Math.floor(range.start.row + (range.end.row - range.start.row) / 2), + column: Math.floor(range.start.column + (range.end.column - range.start.column) / 2) + } + this.renderer.alignCursor(pos, 0.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(row, column) { + this.selection.moveCursorTo(row, column); + }; + this.moveCursorToPosition = function(pos) { + this.selection.moveCursorToPosition(pos); + }; + this.jumpToMatching = function(select) { + var cursor = this.getCursorPosition(); + + var range = this.session.getBracketRange(cursor); + if (!range) { + range = this.find({ + needle: /[{}()\[\]]/g, + preventScroll:true, + start: {row: cursor.row, column: cursor.column - 1} + }); + if (!range) + return; + var pos = range.start; + if (pos.row == cursor.row && Math.abs(pos.column - cursor.column) < 2) + range = this.session.getBracketRange(pos); + } + + pos = range && range.cursor || pos; + if (pos) { + if (select) { + if (range && range.isEqual(this.getSelectionRange())) + this.clearSelection(); + else + this.selection.selectTo(pos.row, pos.column); + } else { + this.clearSelection(); + this.moveCursorTo(pos.row, pos.column); + } + } + }; + this.gotoLine = function(lineNumber, column, animate) { + this.selection.clearSelection(); + this.session.unfold({row: lineNumber - 1, column: column || 0}); + + this.$blockScrolling += 1; + this.exitMultiSelectMode && this.exitMultiSelectMode(); + this.moveCursorTo(lineNumber - 1, column || 0); + this.$blockScrolling -= 1; + + if (!this.isRowFullyVisible(lineNumber - 1)) + this.scrollToLine(lineNumber - 1, true, animate); + }; + this.navigateTo = function(row, column) { + this.clearSelection(); + this.moveCursorTo(row, column); + }; + this.navigateUp = function(times) { + if (this.selection.isMultiLine() && !this.selection.isBackwards()) { + var selectionStart = this.selection.anchor.getPosition(); + return this.moveCursorToPosition(selectionStart); + } + this.selection.clearSelection(); + times = times || 1; + this.selection.moveCursorBy(-times, 0); + }; + this.navigateDown = function(times) { + if (this.selection.isMultiLine() && this.selection.isBackwards()) { + var selectionEnd = this.selection.anchor.getPosition(); + return this.moveCursorToPosition(selectionEnd); + } + this.selection.clearSelection(); + times = times || 1; + this.selection.moveCursorBy(times, 0); + }; + this.navigateLeft = function(times) { + if (!this.selection.isEmpty()) { + var selectionStart = this.getSelectionRange().start; + this.moveCursorToPosition(selectionStart); + } + else { + times = times || 1; + while (times--) { + this.selection.moveCursorLeft(); + } + } + this.clearSelection(); + }; + this.navigateRight = function(times) { + if (!this.selection.isEmpty()) { + var selectionEnd = this.getSelectionRange().end; + this.moveCursorToPosition(selectionEnd); + } + else { + times = times || 1; + while (times--) { + this.selection.moveCursorRight(); + } + } + this.clearSelection(); + }; + this.navigateLineStart = function() { + this.selection.moveCursorLineStart(); + this.clearSelection(); + }; + this.navigateLineEnd = function() { + this.selection.moveCursorLineEnd(); + this.clearSelection(); + }; + this.navigateFileEnd = function() { + var scrollTop = this.renderer.scrollTop; + this.selection.moveCursorFileEnd(); + this.clearSelection(); + this.renderer.animateScrolling(scrollTop); + }; + this.navigateFileStart = function() { + var scrollTop = this.renderer.scrollTop; + this.selection.moveCursorFileStart(); + this.clearSelection(); + this.renderer.animateScrolling(scrollTop); + }; + this.navigateWordRight = function() { + this.selection.moveCursorWordRight(); + this.clearSelection(); + }; + this.navigateWordLeft = function() { + this.selection.moveCursorWordLeft(); + this.clearSelection(); + }; + this.replace = function(replacement, options) { + if (options) + this.$search.set(options); + + var range = this.$search.find(this.session); + var replaced = 0; + if (!range) + return replaced; + + if (this.$tryReplace(range, replacement)) { + replaced = 1; + } + if (range !== null) { + this.selection.setSelectionRange(range); + this.renderer.scrollSelectionIntoView(range.start, range.end); + } + + return replaced; + }; + this.replaceAll = function(replacement, options) { + if (options) { + this.$search.set(options); + } + + var ranges = this.$search.findAll(this.session); + var replaced = 0; + if (!ranges.length) + return replaced; + + this.$blockScrolling += 1; + + var selection = this.getSelectionRange(); + this.clearSelection(); + this.selection.moveCursorTo(0, 0); + + for (var i = ranges.length - 1; i >= 0; --i) { + if(this.$tryReplace(ranges[i], replacement)) { + replaced++; + } + } + + this.selection.setSelectionRange(selection); + this.$blockScrolling -= 1; + + return replaced; + }; + + this.$tryReplace = function(range, replacement) { + var input = this.session.getTextRange(range); + replacement = this.$search.replace(input, replacement); + if (replacement !== null) { + range.end = this.session.replace(range, replacement); + return range; + } else { + return null; + } + }; + this.getLastSearchOptions = function() { + return this.$search.getOptions(); + }; + this.find = function(needle, options, animate) { + if (!options) + options = {}; + + if (typeof needle == "string" || needle instanceof RegExp) + options.needle = needle; + else if (typeof needle == "object") + oop.mixin(options, needle); + + var range = this.selection.getRange(); + if (options.needle == null) { + needle = this.session.getTextRange(range) + || this.$search.$options.needle; + if (!needle) { + range = this.session.getWordRange(range.start.row, range.start.column); + needle = this.session.getTextRange(range); + } + this.$search.set({needle: needle}); + } + + this.$search.set(options); + if (!options.start) + this.$search.set({start: range}); + + var newRange = this.$search.find(this.session); + if (options.preventScroll) + return newRange; + if (newRange) { + this.revealRange(newRange, animate); + return newRange; + } + if (options.backwards) + range.start = range.end; + else + range.end = range.start; + this.selection.setRange(range); + }; + this.findNext = function(options, animate) { + this.find({skipCurrent: true, backwards: false}, options, animate); + }; + this.findPrevious = function(options, animate) { + this.find(options, {skipCurrent: true, backwards: true}, animate); + }; + + this.revealRange = function(range, animate) { + this.$blockScrolling += 1; + this.session.unfold(range); + this.selection.setSelectionRange(range); + this.$blockScrolling -= 1; + + var scrollTop = this.renderer.scrollTop; + this.renderer.scrollSelectionIntoView(range.start, range.end, 0.5); + if (animate != false) + this.renderer.animateScrolling(scrollTop); + }; + this.undo = function() { + this.$blockScrolling++; + this.session.getUndoManager().undo(); + this.$blockScrolling--; + this.renderer.scrollCursorIntoView(null, 0.5); + }; + this.redo = function() { + this.$blockScrolling++; + this.session.getUndoManager().redo(); + this.$blockScrolling--; + this.renderer.scrollCursorIntoView(null, 0.5); + }; + this.destroy = function() { + this.renderer.destroy(); + this._emit("destroy", this); + }; + this.setAutoScrollEditorIntoView = function(enable) { + if (enable === false) + return; + var rect; + var self = this; + var shouldScroll = false; + if (!this.$scrollAnchor) + this.$scrollAnchor = document.createElement("div"); + var scrollAnchor = this.$scrollAnchor; + scrollAnchor.style.cssText = "position:absolute"; + this.container.insertBefore(scrollAnchor, this.container.firstChild); + var onChangeSelection = this.on("changeSelection", function() { + shouldScroll = true; + }); + var onBeforeRender = this.renderer.on("beforeRender", function() { + if (shouldScroll) + rect = self.renderer.container.getBoundingClientRect(); + }); + var onAfterRender = this.renderer.on("afterRender", function() { + if (shouldScroll && rect && self.isFocused()) { + var renderer = self.renderer; + var pos = renderer.$cursorLayer.$pixelPos; + var config = renderer.layerConfig; + var top = pos.top - config.offset; + if (pos.top >= 0 && top + rect.top < 0) { + shouldScroll = true; + } else if (pos.top < config.height && + pos.top + rect.top + config.lineHeight > window.innerHeight) { + shouldScroll = false; + } else { + shouldScroll = null; + } + if (shouldScroll != null) { + scrollAnchor.style.top = top + "px"; + scrollAnchor.style.left = pos.left + "px"; + scrollAnchor.style.height = config.lineHeight + "px"; + scrollAnchor.scrollIntoView(shouldScroll); + } + shouldScroll = rect = null; + } + }); + this.setAutoScrollEditorIntoView = function(enable) { + if (enable === true) + return; + delete this.setAutoScrollEditorIntoView; + this.removeEventListener("changeSelection", onChangeSelection); + this.renderer.removeEventListener("afterRender", onAfterRender); + this.renderer.removeEventListener("beforeRender", onBeforeRender); + }; + }; + + + this.$resetCursorStyle = function() { + var style = this.$cursorStyle || "ace"; + var cursorLayer = this.renderer.$cursorLayer; + if (!cursorLayer) + return; + cursorLayer.setSmoothBlinking(style == "smooth"); + cursorLayer.isBlinking = !this.$readOnly && style != "wide"; + }; + +}).call(Editor.prototype); + + + +config.defineOptions(Editor.prototype, "editor", { + selectionStyle: { + set: function(style) { + this.onSelectionChange(); + this._emit("changeSelectionStyle", {data: style}); + }, + initialValue: "line" + }, + highlightActiveLine: { + set: function() {this.$updateHighlightActiveLine();}, + initialValue: true + }, + highlightSelectedWord: { + set: function(shouldHighlight) {this.$onSelectionChange();}, + initialValue: true + }, + readOnly: { + set: function(readOnly) { this.$resetCursorStyle(); }, + initialValue: false + }, + cursorStyle: { + set: function(val) { this.$resetCursorStyle(); }, + values: ["ace", "slim", "smooth", "wide"], + initialValue: "ace" + }, + behavioursEnabled: {initialValue: true}, + wrapBehavioursEnabled: {initialValue: true}, + + hScrollBarAlwaysVisible: "renderer", + highlightGutterLine: "renderer", + animatedScroll: "renderer", + showInvisibles: "renderer", + showPrintMargin: "renderer", + printMarginColumn: "renderer", + printMargin: "renderer", + fadeFoldWidgets: "renderer", + showFoldWidgets: "renderer", + showGutter: "renderer", + displayIndentGuides: "renderer", + fontSize: "renderer", + fontFamily: "renderer", + + scrollSpeed: "$mouseHandler", + dragDelay: "$mouseHandler", + focusTimout: "$mouseHandler", + + firstLineNumber: "session", + overwrite: "session", + newLineMode: "session", + useWorker: "session", + useSoftTabs: "session", + tabSize: "session", + wrap: "session", + foldStyle: "session" +}); + +exports.Editor = Editor; +}); + +ace.define('ace/lib/lang', ['require', 'exports', 'module' ], function(require, exports, module) { + + +exports.stringReverse = function(string) { + return string.split("").reverse().join(""); +}; + +exports.stringRepeat = function (string, count) { + var result = ''; + while (count > 0) { + if (count & 1) + result += string; + + if (count >>= 1) + string += string; + } + return result; +}; + +var trimBeginRegexp = /^\s\s*/; +var trimEndRegexp = /\s\s*$/; + +exports.stringTrimLeft = function (string) { + return string.replace(trimBeginRegexp, ''); +}; + +exports.stringTrimRight = function (string) { + return string.replace(trimEndRegexp, ''); +}; + +exports.copyObject = function(obj) { + var copy = {}; + for (var key in obj) { + copy[key] = obj[key]; + } + return copy; +}; + +exports.copyArray = function(array){ + var copy = []; + for (var i=0, l=array.length; i= 0) { + anchor = this.$clickSelection.start; + if (range.start.row != cursor.row || range.start.column != cursor.column) + cursor = range.end; + } else if (cmpStart == -1 && cmpEnd == 1) { + cursor = range.end; + anchor = range.start; + } else { + var orientedRange = calcRangeOrientation(this.$clickSelection, cursor); + cursor = orientedRange.cursor; + anchor = orientedRange.anchor; + } + editor.selection.setSelectionAnchor(anchor.row, anchor.column); + } + editor.selection.selectToPosition(cursor); + + editor.renderer.scrollCursorIntoView(); + }; + + this.startDrag = function() { + var editor = this.editor; + this.setState("drag"); + this.dragRange = editor.getSelectionRange(); + var style = editor.getSelectionStyle(); + this.dragSelectionMarker = editor.session.addMarker(this.dragRange, "ace_selection", style); + editor.clearSelection(); + dom.addCssClass(editor.container, "ace_dragging"); + if (!this.$dragKeybinding) { + this.$dragKeybinding = { + handleKeyboard: function(data, hashId, keyString, keyCode) { + if (keyString == "esc") + return {command: this.command}; + }, + command: { + exec: function(editor) { + var self = editor.$mouseHandler; + self.dragCursor = null; + self.dragEnd(); + self.startSelect(); + } + } + } + } + + editor.keyBinding.addKeyboardHandler(this.$dragKeybinding); + }; + + this.focusWait = function() { + var distance = calcDistance(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y); + var time = (new Date()).getTime(); + + if (distance > DRAG_OFFSET || time - this.mousedownEvent.time > this.$focusTimout) + this.startSelect(this.mousedownEvent.getDocumentPosition()); + }; + + this.dragWait = function(e) { + var distance = calcDistance(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y); + var time = (new Date()).getTime(); + var editor = this.editor; + + if (distance > DRAG_OFFSET) { + this.startSelect(this.mousedownEvent.getDocumentPosition()); + } else if (time - this.mousedownEvent.time > editor.$mouseHandler.$dragDelay) { + this.startDrag(); + } + }; + + this.dragWaitEnd = function(e) { + this.mousedownEvent.domEvent = e; + this.startSelect(); + }; + + this.drag = function() { + var editor = this.editor; + this.dragCursor = editor.renderer.screenToTextCoordinates(this.x, this.y); + editor.moveCursorToPosition(this.dragCursor); + editor.renderer.scrollCursorIntoView(); + }; + + this.dragEnd = function(e) { + var editor = this.editor; + var dragCursor = this.dragCursor; + var dragRange = this.dragRange; + dom.removeCssClass(editor.container, "ace_dragging"); + editor.session.removeMarker(this.dragSelectionMarker); + editor.keyBinding.removeKeyboardHandler(this.$dragKeybinding); + + if (!dragCursor) + return; + + editor.clearSelection(); + if (e && (e.ctrlKey || e.altKey)) { + var session = editor.session; + var newRange = dragRange; + newRange.end = session.insert(dragCursor, session.getTextRange(dragRange)); + newRange.start = dragCursor; + } else if (dragRange.contains(dragCursor.row, dragCursor.column)) { + return; + } else { + var newRange = editor.moveText(dragRange, dragCursor); + } + + if (!newRange) + return; + + editor.selection.setSelectionRange(newRange); + }; + + this.onDoubleClick = function(ev) { + var pos = ev.getDocumentPosition(); + var editor = this.editor; + var session = editor.session; + + var range = session.getBracketRange(pos); + if (range) { + if (range.isEmpty()) { + range.start.column--; + range.end.column++; + } + this.$clickSelection = range; + this.setState("select"); + return; + } + + this.$clickSelection = editor.selection.getWordRange(pos.row, pos.column); + this.setState("selectByWords"); + }; + + this.onTripleClick = function(ev) { + var pos = ev.getDocumentPosition(); + var editor = this.editor; + + this.setState("selectByLines"); + this.$clickSelection = editor.selection.getLineRange(pos.row); + }; + + this.onQuadClick = function(ev) { + var editor = this.editor; + + editor.selectAll(); + this.$clickSelection = editor.getSelectionRange(); + this.setState("null"); + }; + + this.onMouseWheel = function(ev) { + if (ev.getShiftKey() || ev.getAccelKey()) + return; + var t = ev.domEvent.timeStamp; + var dt = t - (this.$lastScrollTime||0); + + var editor = this.editor; + var isScrolable = editor.renderer.isScrollableBy(ev.wheelX * ev.speed, ev.wheelY * ev.speed); + if (isScrolable || dt < 200) { + this.$lastScrollTime = t; + editor.renderer.scrollBy(ev.wheelX * ev.speed, ev.wheelY * ev.speed); + return ev.stop(); + } + }; + +}).call(DefaultHandlers.prototype); + +exports.DefaultHandlers = DefaultHandlers; + +function calcDistance(ax, ay, bx, by) { + return Math.sqrt(Math.pow(bx - ax, 2) + Math.pow(by - ay, 2)); +} + +function calcRangeOrientation(range, cursor) { + if (range.start.row == range.end.row) + var cmp = 2 * cursor.column - range.start.column - range.end.column; + else if (range.start.row == range.end.row - 1 && !range.start.column && !range.end.column) + var cmp = cursor.column - 4; + else + var cmp = 2 * cursor.row - range.start.row - range.end.row; + + if (cmp < 0) + return {cursor: range.start, anchor: range.end}; + else + return {cursor: range.end, anchor: range.start}; +} + +}); + +ace.define('ace/mouse/default_gutter_handler', ['require', 'exports', 'module' , 'ace/lib/dom', 'ace/lib/event'], function(require, exports, module) { + +var dom = require("../lib/dom"); +var event = require("../lib/event"); + +function GutterHandler(mouseHandler) { + var editor = mouseHandler.editor; + var gutter = editor.renderer.$gutterLayer; + + mouseHandler.editor.setDefaultHandler("guttermousedown", function(e) { + if (!editor.isFocused()) + return; + var gutterRegion = gutter.getRegion(e); + + if (gutterRegion == "foldWidgets") + return; + + var row = e.getDocumentPosition().row; + var selection = editor.session.selection; + + if (e.getShiftKey()) + selection.selectTo(row, 0); + else { + if (e.domEvent.detail == 2) { + editor.selectAll(); + return e.preventDefault(); + } + mouseHandler.$clickSelection = editor.selection.getLineRange(row); + } + mouseHandler.captureMouse(e, "selectByLines"); + return e.preventDefault(); + }); + + + var tooltipTimeout, mouseEvent, tooltip, tooltipAnnotation; + function createTooltip() { + tooltip = dom.createElement("div"); + tooltip.className = "ace_gutter-tooltip"; + tooltip.style.display = "none"; + editor.container.appendChild(tooltip); + } + + function showTooltip() { + if (!tooltip) { + createTooltip(); + } + var row = mouseEvent.getDocumentPosition().row; + var annotation = gutter.$annotations[row]; + if (!annotation) + return hideTooltip(); + + var maxRow = editor.session.getLength(); + if (row == maxRow) { + var screenRow = editor.renderer.pixelToScreenCoordinates(0, mouseEvent.y).row; + var pos = mouseEvent.$pos; + if (screenRow > editor.session.documentToScreenRow(pos.row, pos.column)) + return hideTooltip(); + } + + if (tooltipAnnotation == annotation) + return; + tooltipAnnotation = annotation.text.join("
"); + + tooltip.style.display = "block"; + tooltip.innerHTML = tooltipAnnotation; + editor.on("mousewheel", hideTooltip); + + moveTooltip(mouseEvent); + } + + function hideTooltip() { + if (tooltipTimeout) + tooltipTimeout = clearTimeout(tooltipTimeout); + if (tooltipAnnotation) { + tooltip.style.display = "none"; + tooltipAnnotation = null; + editor.removeEventListener("mousewheel", hideTooltip); + } + } + + function moveTooltip(e) { + var rect = editor.renderer.$gutter.getBoundingClientRect(); + tooltip.style.left = e.x + 15 + "px"; + if (e.y + 3 * editor.renderer.lineHeight + 15 < rect.bottom) { + tooltip.style.bottom = ""; + tooltip.style.top = e.y + 15 + "px"; + } else { + tooltip.style.top = ""; + tooltip.style.bottom = rect.bottom - e.y + 5 + "px"; + } + } + + mouseHandler.editor.setDefaultHandler("guttermousemove", function(e) { + var target = e.domEvent.target || e.domEvent.srcElement; + if (dom.hasCssClass(target, "ace_fold-widget")) + return hideTooltip(); + + if (tooltipAnnotation) + moveTooltip(e); + + mouseEvent = e; + if (tooltipTimeout) + return; + tooltipTimeout = setTimeout(function() { + tooltipTimeout = null; + if (mouseEvent && !mouseHandler.isMousePressed) + showTooltip(); + else + hideTooltip(); + }, 50); + }); + + event.addListener(editor.renderer.$gutter, "mouseout", function(e) { + mouseEvent = null; + if (!tooltipAnnotation || tooltipTimeout) + return; + + tooltipTimeout = setTimeout(function() { + tooltipTimeout = null; + hideTooltip(); + }, 50); + }); + +} + +exports.GutterHandler = GutterHandler; + +}); + +ace.define('ace/mouse/mouse_event', ['require', 'exports', 'module' , 'ace/lib/event', 'ace/lib/useragent'], function(require, exports, module) { + + +var event = require("../lib/event"); +var useragent = require("../lib/useragent"); +var MouseEvent = exports.MouseEvent = function(domEvent, editor) { + this.domEvent = domEvent; + this.editor = editor; + + this.x = this.clientX = domEvent.clientX; + this.y = this.clientY = domEvent.clientY; + + this.$pos = null; + this.$inSelection = null; + + this.propagationStopped = false; + this.defaultPrevented = false; +}; + +(function() { + + this.stopPropagation = function() { + event.stopPropagation(this.domEvent); + this.propagationStopped = true; + }; + + this.preventDefault = function() { + event.preventDefault(this.domEvent); + this.defaultPrevented = true; + }; + + this.stop = function() { + this.stopPropagation(); + this.preventDefault(); + }; + this.getDocumentPosition = function() { + if (this.$pos) + return this.$pos; + + this.$pos = this.editor.renderer.screenToTextCoordinates(this.clientX, this.clientY); + return this.$pos; + }; + this.inSelection = function() { + if (this.$inSelection !== null) + return this.$inSelection; + + var editor = this.editor; + + if (editor.getReadOnly()) { + this.$inSelection = false; + } + else { + var selectionRange = editor.getSelectionRange(); + if (selectionRange.isEmpty()) + this.$inSelection = false; + else { + var pos = this.getDocumentPosition(); + this.$inSelection = selectionRange.contains(pos.row, pos.column); + } + } + return this.$inSelection; + }; + this.getButton = function() { + return event.getButton(this.domEvent); + }; + this.getShiftKey = function() { + return this.domEvent.shiftKey; + }; + + this.getAccelKey = useragent.isMac + ? function() { return this.domEvent.metaKey; } + : function() { return this.domEvent.ctrlKey; }; + +}).call(MouseEvent.prototype); + +}); + +ace.define('ace/mouse/dragdrop', ['require', 'exports', 'module' , 'ace/lib/event'], function(require, exports, module) { + + +var event = require("../lib/event"); + +var DragdropHandler = function(mouseHandler) { + var editor = mouseHandler.editor; + var dragSelectionMarker, x, y; + var timerId, range; + var dragCursor, counter = 0; + + var mouseTarget = editor.container; + event.addListener(mouseTarget, "dragenter", function(e) { + if (editor.getReadOnly()) + return; + var types = e.dataTransfer.types; + if (types && Array.prototype.indexOf.call(types, "text/plain") === -1) + return; + if (!dragSelectionMarker) + addDragMarker(); + counter++; + return event.preventDefault(e); + }); + + event.addListener(mouseTarget, "dragover", function(e) { + if (editor.getReadOnly()) + return; + var types = e.dataTransfer.types; + if (types && Array.prototype.indexOf.call(types, "text/plain") === -1) + return; + if (onMouseMoveTimer !== null) + onMouseMoveTimer = null; + x = e.clientX; + y = e.clientY; + return event.preventDefault(e); + }); + + var onDragInterval = function() { + dragCursor = editor.renderer.screenToTextCoordinates(x, y); + editor.moveCursorToPosition(dragCursor); + editor.renderer.scrollCursorIntoView(); + }; + + event.addListener(mouseTarget, "dragleave", function(e) { + counter--; + if (counter <= 0 && dragSelectionMarker) { + clearDragMarker(); + return event.preventDefault(e); + } + }); + + event.addListener(mouseTarget, "drop", function(e) { + if (!dragSelectionMarker) + return; + range.end = editor.session.insert(dragCursor, e.dataTransfer.getData('Text')); + range.start = dragCursor; + clearDragMarker(); + editor.focus(); + return event.preventDefault(e); + }); + + function addDragMarker() { + range = editor.selection.toOrientedRange(); + dragSelectionMarker = editor.session.addMarker(range, "ace_selection", editor.getSelectionStyle()); + editor.clearSelection(); + clearInterval(timerId); + timerId = setInterval(onDragInterval, 20); + counter = 0; + event.addListener(document, "mousemove", onMouseMove); + } + function clearDragMarker() { + clearInterval(timerId); + editor.session.removeMarker(dragSelectionMarker); + dragSelectionMarker = null; + editor.selection.fromOrientedRange(range); + counter = 0; + event.removeListener(document, "mousemove", onMouseMove); + } + var onMouseMoveTimer = null; + function onMouseMove() { + if (onMouseMoveTimer == null) { + onMouseMoveTimer = setTimeout(function() { + if (onMouseMoveTimer != null && dragSelectionMarker) + clearDragMarker(); + }, 20); + } + } +}; + +exports.DragdropHandler = DragdropHandler; +}); + +ace.define('ace/config', ['require', 'exports', 'module' , 'ace/lib/lang', 'ace/lib/oop', 'ace/lib/net', 'ace/lib/event_emitter'], function(require, exports, module) { +"no use strict"; + +var lang = require("./lib/lang"); +var oop = require("./lib/oop"); +var net = require("./lib/net"); +var EventEmitter = require("./lib/event_emitter").EventEmitter; + +var global = (function() { + return this; +})(); + +var options = { + packaged: false, + workerPath: null, + modePath: null, + themePath: null, + basePath: "", + suffix: ".js", + $moduleUrls: {} +}; + +exports.get = function(key) { + if (!options.hasOwnProperty(key)) + throw new Error("Unknown config key: " + key); + + return options[key]; +}; + +exports.set = function(key, value) { + if (!options.hasOwnProperty(key)) + throw new Error("Unknown config key: " + key); + + options[key] = value; +}; + +exports.all = function() { + return lang.copyObject(options); +}; +oop.implement(exports, EventEmitter); + +exports.moduleUrl = function(name, component) { + if (options.$moduleUrls[name]) + return options.$moduleUrls[name]; + + var parts = name.split("/"); + component = component || parts[parts.length - 2] || ""; + var base = parts[parts.length - 1].replace(component, "").replace(/(^[\-_])|([\-_]$)/, ""); + + if (!base && parts.length > 1) + base = parts[parts.length - 2]; + var path = options[component + "Path"]; + if (path == null) + path = options.basePath; + if (path && path.slice(-1) != "/") + path += "/"; + return path + component + "-" + base + this.get("suffix"); +}; + +exports.setModuleUrl = function(name, subst) { + return options.$moduleUrls[name] = subst; +}; + +exports.$loading = {}; +exports.loadModule = function(moduleName, onLoad) { + var module, moduleType; + if (Array.isArray(moduleName)) { + moduleType = moduleName[0]; + moduleName = moduleName[1]; + } + + try { + module = require(moduleName); + } catch (e) {}; + if (module && !exports.$loading[moduleName]) + return onLoad && onLoad(module); + + if (!exports.$loading[moduleName]) + exports.$loading[moduleName] = []; + + exports.$loading[moduleName].push(onLoad); + + if (exports.$loading[moduleName].length > 1) + return; + + var afterLoad = function() { + require([moduleName], function(module) { + exports._emit("load.module", {name: moduleName, module: module}); + var listeners = exports.$loading[moduleName]; + exports.$loading[moduleName] = null; + listeners.forEach(function(onLoad) { + onLoad && onLoad(module); + }); + }); + }; + + if (!exports.get("packaged")) + return afterLoad(); + net.loadScript(exports.moduleUrl(moduleName, moduleType), afterLoad); +}; +exports.init = function() { + options.packaged = require.packaged || module.packaged || (global.define && define.packaged); + + if (!global.document) + return ""; + + var scriptOptions = {}; + var scriptUrl = ""; + + var scripts = document.getElementsByTagName("script"); + for (var i=0; i i) { + this.$docRowCache.splice(i, l); + this.$screenRowCache.splice(i, l); + } + }; + + this.$getRowCacheIndex = function(cacheArray, val) { + var low = 0; + var hi = cacheArray.length - 1; + + while (low <= hi) { + var mid = (low + hi) >> 1; + var c = cacheArray[mid]; + + if (val > c) + low = mid + 1; + else if (val < c) + hi = mid - 1; + else + return mid; + } + + return low -1; + }; + + this.resetCaches = function() { + this.$modified = true; + this.$wrapData = []; + this.$rowLengthCache = []; + this.$resetRowCache(0); + if (this.bgTokenizer) + this.bgTokenizer.start(0); + }; + + this.onChangeFold = function(e) { + var fold = e.data; + this.$resetRowCache(fold.start.row); + }; + + this.onChange = function(e) { + var delta = e.data; + this.$modified = true; + + this.$resetRowCache(delta.range.start.row); + + var removedFolds = this.$updateInternalDataOnChange(e); + if (!this.$fromUndo && this.$undoManager && !delta.ignore) { + this.$deltasDoc.push(delta); + if (removedFolds && removedFolds.length != 0) { + this.$deltasFold.push({ + action: "removeFolds", + folds: removedFolds + }); + } + + this.$informUndoManager.schedule(); + } + + this.bgTokenizer.$updateOnChange(delta); + this._emit("change", e); + }; + this.setValue = function(text) { + this.doc.setValue(text); + this.selection.moveCursorTo(0, 0); + this.selection.clearSelection(); + + this.$resetRowCache(0); + this.$deltas = []; + this.$deltasDoc = []; + this.$deltasFold = []; + this.getUndoManager().reset(); + }; + this.getValue = + this.toString = function() { + return this.doc.getValue(); + }; + this.getSelection = function() { + return this.selection; + }; + this.getState = function(row) { + return this.bgTokenizer.getState(row); + }; + this.getTokens = function(row) { + return this.bgTokenizer.getTokens(row); + }; + this.getTokenAt = function(row, column) { + var tokens = this.bgTokenizer.getTokens(row); + var token, c = 0; + if (column == null) { + i = tokens.length - 1; + c = this.getLine(row).length; + } else { + for (var i = 0; i < tokens.length; i++) { + c += tokens[i].value.length; + if (c >= column) + break; + } + } + token = tokens[i]; + if (!token) + return null; + token.index = i; + token.start = c - token.value.length; + return token; + }; + this.setUndoManager = function(undoManager) { + this.$undoManager = undoManager; + this.$deltas = []; + this.$deltasDoc = []; + this.$deltasFold = []; + + if (this.$informUndoManager) + this.$informUndoManager.cancel(); + + if (undoManager) { + var self = this; + + this.$syncInformUndoManager = function() { + self.$informUndoManager.cancel(); + + if (self.$deltasFold.length) { + self.$deltas.push({ + group: "fold", + deltas: self.$deltasFold + }); + self.$deltasFold = []; + } + + if (self.$deltasDoc.length) { + self.$deltas.push({ + group: "doc", + deltas: self.$deltasDoc + }); + self.$deltasDoc = []; + } + + if (self.$deltas.length > 0) { + undoManager.execute({ + action: "aceupdate", + args: [self.$deltas, self] + }); + } + + self.$deltas = []; + } + this.$informUndoManager = lang.delayedCall(this.$syncInformUndoManager); + } + }; + this.markUndoGroup = function() { + if (this.$syncInformUndoManager) + this.$syncInformUndoManager(); + }; + + this.$defaultUndoManager = { + undo: function() {}, + redo: function() {}, + reset: function() {} + }; + this.getUndoManager = function() { + return this.$undoManager || this.$defaultUndoManager; + }; + this.getTabString = function() { + if (this.getUseSoftTabs()) { + return lang.stringRepeat(" ", this.getTabSize()); + } else { + return "\t"; + } + }; + this.setUseSoftTabs = function(val) { + this.setOption("useSoftTabs", val); + }; + this.getUseSoftTabs = function() { + return this.$useSoftTabs; + }; + this.setTabSize = function(tabSize) { + this.setOption("tabSize", tabSize) + }; + this.getTabSize = function() { + return this.$tabSize; + }; + this.isTabStop = function(position) { + return this.$useSoftTabs && (position.column % this.$tabSize == 0); + }; + + this.$overwrite = false; + this.setOverwrite = function(overwrite) { + this.setOption("overwrite", overwrite) + }; + this.getOverwrite = function() { + return this.$overwrite; + }; + this.toggleOverwrite = function() { + this.setOverwrite(!this.$overwrite); + }; + this.addGutterDecoration = function(row, className) { + if (!this.$decorations[row]) + this.$decorations[row] = ""; + this.$decorations[row] += " " + className; + this._emit("changeBreakpoint", {}); + }; + this.removeGutterDecoration = function(row, className) { + this.$decorations[row] = (this.$decorations[row] || "").replace(" " + className, ""); + this._emit("changeBreakpoint", {}); + }; + this.getBreakpoints = function() { + return this.$breakpoints; + }; + this.setBreakpoints = function(rows) { + this.$breakpoints = []; + for (var i=0; i 0) + inToken = !!line.charAt(column - 1).match(this.tokenRe); + + if (!inToken) + inToken = !!line.charAt(column).match(this.tokenRe); + + if (inToken) + var re = this.tokenRe; + else if (/^\s+$/.test(line.slice(column-1, column+1))) + var re = /\s/; + else + var re = this.nonTokenRe; + + var start = column; + if (start > 0) { + do { + start--; + } + while (start >= 0 && line.charAt(start).match(re)); + start++; + } + + var end = column; + while (end < line.length && line.charAt(end).match(re)) { + end++; + } + + return new Range(row, start, row, end); + }; + this.getAWordRange = function(row, column) { + var wordRange = this.getWordRange(row, column); + var line = this.getLine(wordRange.end.row); + + while (line.charAt(wordRange.end.column).match(/[ \t]/)) { + wordRange.end.column += 1; + } + return wordRange; + }; + this.setNewLineMode = function(newLineMode) { + this.doc.setNewLineMode(newLineMode); + }; + this.getNewLineMode = function() { + return this.doc.getNewLineMode(); + }; + this.setUseWorker = function(useWorker) { this.setOption("useWorker", useWorker); }; + this.getUseWorker = function() { return this.$useWorker; }; + this.onReloadTokenizer = function(e) { + var rows = e.data; + this.bgTokenizer.start(rows.first); + this._emit("tokenizerUpdate", e); + }; + + this.$modes = {}; + this.$mode = null; + this.$modeId = null; + this.setMode = function(mode) { + if (mode && typeof mode === "object") { + if (mode.getTokenizer) + return this.$onChangeMode(mode); + var options = mode; + var path = options.path; + } else { + path = mode || "ace/mode/text"; + } + if (!this.$modes["ace/mode/text"]) + this.$modes["ace/mode/text"] = new TextMode(); + + if (this.$modes[path] && !options) + return this.$onChangeMode(this.$modes[path]); + this.$modeId = path; + config.loadModule(["mode", path], function(m) { + if (this.$modeId !== path) + return; + if (this.$modes[path] && !options) + return this.$onChangeMode(this.$modes[path]); + if (m && m.Mode) { + m = new m.Mode(options); + if (!options) { + this.$modes[path] = m; + m.$id = path; + } + this.$onChangeMode(m) + } + }.bind(this)); + if (!this.$mode) + this.$onChangeMode(this.$modes["ace/mode/text"], true); + }; + + this.$onChangeMode = function(mode, $isPlaceholder) { + if (this.$mode === mode) return; + this.$mode = mode; + + this.$stopWorker(); + + if (this.$useWorker) + this.$startWorker(); + + var tokenizer = mode.getTokenizer(); + + if(tokenizer.addEventListener !== undefined) { + var onReloadTokenizer = this.onReloadTokenizer.bind(this); + tokenizer.addEventListener("update", onReloadTokenizer); + } + + if (!this.bgTokenizer) { + this.bgTokenizer = new BackgroundTokenizer(tokenizer); + var _self = this; + this.bgTokenizer.addEventListener("update", function(e) { + _self._emit("tokenizerUpdate", e); + }); + } else { + this.bgTokenizer.setTokenizer(tokenizer); + } + + this.bgTokenizer.setDocument(this.getDocument()); + + this.tokenRe = mode.tokenRe; + this.nonTokenRe = mode.nonTokenRe; + + + if (!$isPlaceholder) { + this.$modeId = mode.$id; + this.$setFolding(mode.foldingRules); + this._emit("changeMode"); + this.bgTokenizer.start(0); + } + }; + + + this.$stopWorker = function() { + if (this.$worker) + this.$worker.terminate(); + + this.$worker = null; + }; + + this.$startWorker = function() { + if (typeof Worker !== "undefined" && !require.noWorker) { + try { + this.$worker = this.$mode.createWorker(this); + } catch (e) { + console.log("Could not load worker"); + console.log(e); + this.$worker = null; + } + } + else + this.$worker = null; + }; + this.getMode = function() { + return this.$mode; + }; + + this.$scrollTop = 0; + this.setScrollTop = function(scrollTop) { + scrollTop = Math.round(Math.max(0, scrollTop)); + if (this.$scrollTop === scrollTop || isNaN(scrollTop)) + return; + + this.$scrollTop = scrollTop; + this._signal("changeScrollTop", scrollTop); + }; + this.getScrollTop = function() { + return this.$scrollTop; + }; + + this.$scrollLeft = 0; + this.setScrollLeft = function(scrollLeft) { + scrollLeft = Math.round(Math.max(0, scrollLeft)); + if (this.$scrollLeft === scrollLeft || isNaN(scrollLeft)) + return; + + this.$scrollLeft = scrollLeft; + this._signal("changeScrollLeft", scrollLeft); + }; + this.getScrollLeft = function() { + return this.$scrollLeft; + }; + this.getScreenWidth = function() { + this.$computeWidth(); + return this.screenWidth; + }; + + this.$computeWidth = function(force) { + if (this.$modified || force) { + this.$modified = false; + + if (this.$useWrapMode) + return this.screenWidth = this.$wrapLimit; + + var lines = this.doc.getAllLines(); + var cache = this.$rowLengthCache; + var longestScreenLine = 0; + var foldIndex = 0; + var foldLine = this.$foldData[foldIndex]; + var foldStart = foldLine ? foldLine.start.row : Infinity; + var len = lines.length; + + for (var i = 0; i < len; i++) { + if (i > foldStart) { + i = foldLine.end.row + 1; + if (i >= len) + break; + foldLine = this.$foldData[foldIndex++]; + foldStart = foldLine ? foldLine.start.row : Infinity; + } + + if (cache[i] == null) + cache[i] = this.$getStringScreenWidth(lines[i])[0]; + + if (cache[i] > longestScreenLine) + longestScreenLine = cache[i]; + } + this.screenWidth = longestScreenLine; + } + }; + this.getLine = function(row) { + return this.doc.getLine(row); + }; + this.getLines = function(firstRow, lastRow) { + return this.doc.getLines(firstRow, lastRow); + }; + this.getLength = function() { + return this.doc.getLength(); + }; + this.getTextRange = function(range) { + return this.doc.getTextRange(range || this.selection.getRange()); + }; + this.insert = function(position, text) { + return this.doc.insert(position, text); + }; + this.remove = function(range) { + return this.doc.remove(range); + }; + this.undoChanges = function(deltas, dontSelect) { + if (!deltas.length) + return; + + this.$fromUndo = true; + var lastUndoRange = null; + for (var i = deltas.length - 1; i != -1; i--) { + var delta = deltas[i]; + if (delta.group == "doc") { + this.doc.revertDeltas(delta.deltas); + lastUndoRange = + this.$getUndoSelection(delta.deltas, true, lastUndoRange); + } else { + delta.deltas.forEach(function(foldDelta) { + this.addFolds(foldDelta.folds); + }, this); + } + } + this.$fromUndo = false; + lastUndoRange && + this.$undoSelect && + !dontSelect && + this.selection.setSelectionRange(lastUndoRange); + return lastUndoRange; + }; + this.redoChanges = function(deltas, dontSelect) { + if (!deltas.length) + return; + + this.$fromUndo = true; + var lastUndoRange = null; + for (var i = 0; i < deltas.length; i++) { + var delta = deltas[i]; + if (delta.group == "doc") { + this.doc.applyDeltas(delta.deltas); + lastUndoRange = + this.$getUndoSelection(delta.deltas, false, lastUndoRange); + } + } + this.$fromUndo = false; + lastUndoRange && + this.$undoSelect && + !dontSelect && + this.selection.setSelectionRange(lastUndoRange); + return lastUndoRange; + }; + this.setUndoSelect = function(enable) { + this.$undoSelect = enable; + }; + + this.$getUndoSelection = function(deltas, isUndo, lastUndoRange) { + function isInsert(delta) { + var insert = + delta.action === "insertText" || delta.action === "insertLines"; + return isUndo ? !insert : insert; + } + + var delta = deltas[0]; + var range, point; + var lastDeltaIsInsert = false; + if (isInsert(delta)) { + range = delta.range.clone(); + lastDeltaIsInsert = true; + } else { + range = Range.fromPoints(delta.range.start, delta.range.start); + lastDeltaIsInsert = false; + } + + for (var i = 1; i < deltas.length; i++) { + delta = deltas[i]; + if (isInsert(delta)) { + point = delta.range.start; + if (range.compare(point.row, point.column) == -1) { + range.setStart(delta.range.start); + } + point = delta.range.end; + if (range.compare(point.row, point.column) == 1) { + range.setEnd(delta.range.end); + } + lastDeltaIsInsert = true; + } else { + point = delta.range.start; + if (range.compare(point.row, point.column) == -1) { + range = + Range.fromPoints(delta.range.start, delta.range.start); + } + lastDeltaIsInsert = false; + } + } + if (lastUndoRange != null) { + var cmp = lastUndoRange.compareRange(range); + if (cmp == 1) { + range.setStart(lastUndoRange.start); + } else if (cmp == -1) { + range.setEnd(lastUndoRange.end); + } + } + + return range; + }; + this.replace = function(range, text) { + return this.doc.replace(range, text); + }; + this.moveText = function(fromRange, toPosition, copy) { + var text = this.getTextRange(fromRange); + var folds = this.getFoldsInRange(fromRange); + + var toRange = Range.fromPoints(toPosition, toPosition); + if (!copy) { + this.remove(fromRange); + var rowDiff = fromRange.start.row - fromRange.end.row; + var collDiff = rowDiff ? -fromRange.end.column : fromRange.start.column - fromRange.end.column; + if (collDiff) { + if (toRange.start.row == fromRange.end.row && toRange.start.column > fromRange.end.column) + toRange.start.column += collDiff; + if (toRange.end.row == fromRange.end.row && toRange.end.column > fromRange.end.column) + toRange.end.column += collDiff; + } + if (rowDiff && toRange.start.row >= fromRange.end.row) { + toRange.start.row += rowDiff; + toRange.end.row += rowDiff; + } + } + + this.insert(toRange.start, text); + if (folds.length) { + var oldStart = fromRange.start; + var newStart = toRange.start; + var rowDiff = newStart.row - oldStart.row; + var collDiff = newStart.column - oldStart.column; + this.addFolds(folds.map(function(x) { + x = x.clone(); + if (x.start.row == oldStart.row) + x.start.column += collDiff; + if (x.end.row == oldStart.row) + x.end.column += collDiff; + x.start.row += rowDiff; + x.end.row += rowDiff; + return x; + })); + } + + return toRange; + }; + this.indentRows = function(startRow, endRow, indentString) { + indentString = indentString.replace(/\t/g, this.getTabString()); + for (var row=startRow; row<=endRow; row++) + this.insert({row: row, column:0}, indentString); + }; + this.outdentRows = function (range) { + var rowRange = range.collapseRows(); + var deleteRange = new Range(0, 0, 0, 0); + var size = this.getTabSize(); + + for (var i = rowRange.start.row; i <= rowRange.end.row; ++i) { + var line = this.getLine(i); + + deleteRange.start.row = i; + deleteRange.end.row = i; + for (var j = 0; j < size; ++j) + if (line.charAt(j) != ' ') + break; + if (j < size && line.charAt(j) == '\t') { + deleteRange.start.column = j; + deleteRange.end.column = j + 1; + } else { + deleteRange.start.column = 0; + deleteRange.end.column = j; + } + this.remove(deleteRange); + } + }; + + this.$moveLines = function(firstRow, lastRow, dir) { + firstRow = this.getRowFoldStart(firstRow); + lastRow = this.getRowFoldEnd(lastRow); + if (dir < 0) { + var row = this.getRowFoldStart(firstRow + dir); + if (row < 0) return 0; + var diff = row-firstRow; + } else if (dir > 0) { + var row = this.getRowFoldEnd(lastRow + dir); + if (row > this.doc.getLength()-1) return 0; + var diff = row-lastRow; + } else { + firstRow = this.$clipRowToDocument(firstRow); + lastRow = this.$clipRowToDocument(lastRow); + var diff = lastRow - firstRow + 1; + } + + var range = new Range(firstRow, 0, lastRow, Number.MAX_VALUE); + var folds = this.getFoldsInRange(range).map(function(x){ + x = x.clone(); + x.start.row += diff; + x.end.row += diff; + return x; + }); + + var lines = dir == 0 + ? this.doc.getLines(firstRow, lastRow) + : this.doc.removeLines(firstRow, lastRow); + this.doc.insertLines(firstRow+diff, lines); + folds.length && this.addFolds(folds); + return diff; + }; + this.moveLinesUp = function(firstRow, lastRow) { + return this.$moveLines(firstRow, lastRow, -1); + }; + this.moveLinesDown = function(firstRow, lastRow) { + return this.$moveLines(firstRow, lastRow, 1); + }; + this.duplicateLines = function(firstRow, lastRow) { + return this.$moveLines(firstRow, lastRow, 0); + }; + + + this.$clipRowToDocument = function(row) { + return Math.max(0, Math.min(row, this.doc.getLength()-1)); + }; + + this.$clipColumnToRow = function(row, column) { + if (column < 0) + return 0; + return Math.min(this.doc.getLine(row).length, column); + }; + + + this.$clipPositionToDocument = function(row, column) { + column = Math.max(0, column); + + if (row < 0) { + row = 0; + column = 0; + } else { + var len = this.doc.getLength(); + if (row >= len) { + row = len - 1; + column = this.doc.getLine(len-1).length; + } else { + column = Math.min(this.doc.getLine(row).length, column); + } + } + + return { + row: row, + column: column + }; + }; + + this.$clipRangeToDocument = function(range) { + if (range.start.row < 0) { + range.start.row = 0; + range.start.column = 0; + } else { + range.start.column = this.$clipColumnToRow( + range.start.row, + range.start.column + ); + } + + var len = this.doc.getLength() - 1; + if (range.end.row > len) { + range.end.row = len; + range.end.column = this.doc.getLine(len).length; + } else { + range.end.column = this.$clipColumnToRow( + range.end.row, + range.end.column + ); + } + return range; + }; + this.$wrapLimit = 80; + this.$useWrapMode = false; + this.$wrapLimitRange = { + min : null, + max : null + }; + this.setUseWrapMode = function(useWrapMode) { + if (useWrapMode != this.$useWrapMode) { + this.$useWrapMode = useWrapMode; + this.$modified = true; + this.$resetRowCache(0); + if (useWrapMode) { + var len = this.getLength(); + this.$wrapData = []; + for (var i = 0; i < len; i++) { + this.$wrapData.push([]); + } + this.$updateWrapData(0, len - 1); + } + + this._emit("changeWrapMode"); + } + }; + this.getUseWrapMode = function() { + return this.$useWrapMode; + }; + this.setWrapLimitRange = function(min, max) { + if (this.$wrapLimitRange.min !== min || this.$wrapLimitRange.max !== max) { + this.$wrapLimitRange.min = min; + this.$wrapLimitRange.max = max; + this.$modified = true; + this._emit("changeWrapMode"); + } + }; + this.adjustWrapLimit = function(desiredLimit, $printMargin) { + var limits = this.$wrapLimitRange + if (limits.max < 0) + limits = {min: $printMargin, max: $printMargin}; + var wrapLimit = this.$constrainWrapLimit(desiredLimit, limits.min, limits.max); + if (wrapLimit != this.$wrapLimit && wrapLimit > 1) { + this.$wrapLimit = wrapLimit; + this.$modified = true; + if (this.$useWrapMode) { + this.$updateWrapData(0, this.getLength() - 1); + this.$resetRowCache(0); + this._emit("changeWrapLimit"); + } + return true; + } + return false; + }; + + this.$constrainWrapLimit = function(wrapLimit, min, max) { + if (min) + wrapLimit = Math.max(min, wrapLimit); + + if (max) + wrapLimit = Math.min(max, wrapLimit); + + return wrapLimit; + }; + this.getWrapLimit = function() { + return this.$wrapLimit; + }; + this.setWrapLimit = function (limit) { + this.setWrapLimitRange(limit, limit); + }; + this.getWrapLimitRange = function() { + return { + min : this.$wrapLimitRange.min, + max : this.$wrapLimitRange.max + }; + }; + + this.$updateInternalDataOnChange = function(e) { + var useWrapMode = this.$useWrapMode; + var len; + var action = e.data.action; + var firstRow = e.data.range.start.row; + var lastRow = e.data.range.end.row; + var start = e.data.range.start; + var end = e.data.range.end; + var removedFolds = null; + + if (action.indexOf("Lines") != -1) { + if (action == "insertLines") { + lastRow = firstRow + (e.data.lines.length); + } else { + lastRow = firstRow; + } + len = e.data.lines ? e.data.lines.length : lastRow - firstRow; + } else { + len = lastRow - firstRow; + } + + this.$updating = true; + if (len != 0) { + if (action.indexOf("remove") != -1) { + this[useWrapMode ? "$wrapData" : "$rowLengthCache"].splice(firstRow, len); + + var foldLines = this.$foldData; + removedFolds = this.getFoldsInRange(e.data.range); + this.removeFolds(removedFolds); + + var foldLine = this.getFoldLine(end.row); + var idx = 0; + if (foldLine) { + foldLine.addRemoveChars(end.row, end.column, start.column - end.column); + foldLine.shiftRow(-len); + + var foldLineBefore = this.getFoldLine(firstRow); + if (foldLineBefore && foldLineBefore !== foldLine) { + foldLineBefore.merge(foldLine); + foldLine = foldLineBefore; + } + idx = foldLines.indexOf(foldLine) + 1; + } + + for (idx; idx < foldLines.length; idx++) { + var foldLine = foldLines[idx]; + if (foldLine.start.row >= end.row) { + foldLine.shiftRow(-len); + } + } + + lastRow = firstRow; + } else { + var args; + if (useWrapMode) { + args = [firstRow, 0]; + for (var i = 0; i < len; i++) args.push([]); + this.$wrapData.splice.apply(this.$wrapData, args); + } else { + args = Array(len); + args.unshift(firstRow, 0); + this.$rowLengthCache.splice.apply(this.$rowLengthCache, args); + } + var foldLines = this.$foldData; + var foldLine = this.getFoldLine(firstRow); + var idx = 0; + if (foldLine) { + var cmp = foldLine.range.compareInside(start.row, start.column) + if (cmp == 0) { + foldLine = foldLine.split(start.row, start.column); + foldLine.shiftRow(len); + foldLine.addRemoveChars( + lastRow, 0, end.column - start.column); + } else + if (cmp == -1) { + foldLine.addRemoveChars(firstRow, 0, end.column - start.column); + foldLine.shiftRow(len); + } + idx = foldLines.indexOf(foldLine) + 1; + } + + for (idx; idx < foldLines.length; idx++) { + var foldLine = foldLines[idx]; + if (foldLine.start.row >= firstRow) { + foldLine.shiftRow(len); + } + } + } + } else { + len = Math.abs(e.data.range.start.column - e.data.range.end.column); + if (action.indexOf("remove") != -1) { + removedFolds = this.getFoldsInRange(e.data.range); + this.removeFolds(removedFolds); + + len = -len; + } + var foldLine = this.getFoldLine(firstRow); + if (foldLine) { + foldLine.addRemoveChars(firstRow, start.column, len); + } + } + + if (useWrapMode && this.$wrapData.length != this.doc.getLength()) { + console.error("doc.getLength() and $wrapData.length have to be the same!"); + } + this.$updating = false; + + if (useWrapMode) + this.$updateWrapData(firstRow, lastRow); + else + this.$updateRowLengthCache(firstRow, lastRow); + + return removedFolds; + }; + + this.$updateRowLengthCache = function(firstRow, lastRow, b) { + this.$rowLengthCache[firstRow] = null; + this.$rowLengthCache[lastRow] = null; + }; + + this.$updateWrapData = function(firstRow, lastRow) { + var lines = this.doc.getAllLines(); + var tabSize = this.getTabSize(); + var wrapData = this.$wrapData; + var wrapLimit = this.$wrapLimit; + var tokens; + var foldLine; + + var row = firstRow; + lastRow = Math.min(lastRow, lines.length - 1); + while (row <= lastRow) { + foldLine = this.getFoldLine(row, foldLine); + if (!foldLine) { + tokens = this.$getDisplayTokens(lang.stringTrimRight(lines[row])); + wrapData[row] = this.$computeWrapSplits(tokens, wrapLimit, tabSize); + row ++; + } else { + tokens = []; + foldLine.walk(function(placeholder, row, column, lastColumn) { + var walkTokens; + if (placeholder != null) { + walkTokens = this.$getDisplayTokens( + placeholder, tokens.length); + walkTokens[0] = PLACEHOLDER_START; + for (var i = 1; i < walkTokens.length; i++) { + walkTokens[i] = PLACEHOLDER_BODY; + } + } else { + walkTokens = this.$getDisplayTokens( + lines[row].substring(lastColumn, column), + tokens.length); + } + tokens = tokens.concat(walkTokens); + }.bind(this), + foldLine.end.row, + lines[foldLine.end.row].length + 1 + ); + while (tokens.length != 0 && tokens[tokens.length - 1] >= SPACE) + tokens.pop(); + + wrapData[foldLine.start.row] + = this.$computeWrapSplits(tokens, wrapLimit, tabSize); + row = foldLine.end.row + 1; + } + } + }; + var CHAR = 1, + CHAR_EXT = 2, + PLACEHOLDER_START = 3, + PLACEHOLDER_BODY = 4, + PUNCTUATION = 9, + SPACE = 10, + TAB = 11, + TAB_SPACE = 12; + + + this.$computeWrapSplits = function(tokens, wrapLimit) { + if (tokens.length == 0) { + return []; + } + + var splits = []; + var displayLength = tokens.length; + var lastSplit = 0, lastDocSplit = 0; + + function addSplit(screenPos) { + var displayed = tokens.slice(lastSplit, screenPos); + var len = displayed.length; + displayed.join(""). + replace(/12/g, function() { + len -= 1; + }). + replace(/2/g, function() { + len -= 1; + }); + + lastDocSplit += len; + splits.push(lastDocSplit); + lastSplit = screenPos; + } + + while (displayLength - lastSplit > wrapLimit) { + var split = lastSplit + wrapLimit; + if (tokens[split] >= SPACE) { + while (tokens[split] >= SPACE) { + split ++; + } + addSplit(split); + continue; + } + if (tokens[split] == PLACEHOLDER_START + || tokens[split] == PLACEHOLDER_BODY) + { + for (split; split != lastSplit - 1; split--) { + if (tokens[split] == PLACEHOLDER_START) { + break; + } + } + if (split > lastSplit) { + addSplit(split); + continue; + } + split = lastSplit + wrapLimit; + for (split; split < tokens.length; split++) { + if (tokens[split] != PLACEHOLDER_BODY) + { + break; + } + } + if (split == tokens.length) { + break; // Breaks the while-loop. + } + addSplit(split); + continue; + } + var minSplit = Math.max(split - 10, lastSplit - 1); + while (split > minSplit && tokens[split] < PLACEHOLDER_START) { + split --; + } + while (split > minSplit && tokens[split] == PUNCTUATION) { + split --; + } + if (split > minSplit) { + addSplit(++split); + continue; + } + split = lastSplit + wrapLimit; + addSplit(split); + } + return splits; + }; + this.$getDisplayTokens = function(str, offset) { + var arr = []; + var tabSize; + offset = offset || 0; + + for (var i = 0; i < str.length; i++) { + var c = str.charCodeAt(i); + if (c == 9) { + tabSize = this.getScreenTabSize(arr.length + offset); + arr.push(TAB); + for (var n = 1; n < tabSize; n++) { + arr.push(TAB_SPACE); + } + } + else if (c == 32) { + arr.push(SPACE); + } else if((c > 39 && c < 48) || (c > 57 && c < 64)) { + arr.push(PUNCTUATION); + } + else if (c >= 0x1100 && isFullWidth(c)) { + arr.push(CHAR, CHAR_EXT); + } else { + arr.push(CHAR); + } + } + return arr; + }; + this.$getStringScreenWidth = function(str, maxScreenColumn, screenColumn) { + if (maxScreenColumn == 0) + return [0, 0]; + if (maxScreenColumn == null) + maxScreenColumn = Infinity; + screenColumn = screenColumn || 0; + + var c, column; + for (column = 0; column < str.length; column++) { + c = str.charCodeAt(column); + if (c == 9) { + screenColumn += this.getScreenTabSize(screenColumn); + } + else if (c >= 0x1100 && isFullWidth(c)) { + screenColumn += 2; + } else { + screenColumn += 1; + } + if (screenColumn > maxScreenColumn) { + break; + } + } + + return [screenColumn, column]; + }; + this.getRowLength = function(row) { + if (!this.$useWrapMode || !this.$wrapData[row]) { + return 1; + } else { + return this.$wrapData[row].length + 1; + } + }; + this.getScreenLastRowColumn = function(screenRow) { + var pos = this.screenToDocumentPosition(screenRow, Number.MAX_VALUE); + return this.documentToScreenColumn(pos.row, pos.column); + }; + this.getDocumentLastRowColumn = function(docRow, docColumn) { + var screenRow = this.documentToScreenRow(docRow, docColumn); + return this.getScreenLastRowColumn(screenRow); + }; + this.getDocumentLastRowColumnPosition = function(docRow, docColumn) { + var screenRow = this.documentToScreenRow(docRow, docColumn); + return this.screenToDocumentPosition(screenRow, Number.MAX_VALUE / 10); + }; + this.getRowSplitData = function(row) { + if (!this.$useWrapMode) { + return undefined; + } else { + return this.$wrapData[row]; + } + }; + this.getScreenTabSize = function(screenColumn) { + return this.$tabSize - screenColumn % this.$tabSize; + }; + + + this.screenToDocumentRow = function(screenRow, screenColumn) { + return this.screenToDocumentPosition(screenRow, screenColumn).row; + }; + + + this.screenToDocumentColumn = function(screenRow, screenColumn) { + return this.screenToDocumentPosition(screenRow, screenColumn).column; + }; + this.screenToDocumentPosition = function(screenRow, screenColumn) { + if (screenRow < 0) + return {row: 0, column: 0}; + + var line; + var docRow = 0; + var docColumn = 0; + var column; + var row = 0; + var rowLength = 0; + + var rowCache = this.$screenRowCache; + var i = this.$getRowCacheIndex(rowCache, screenRow); + var l = rowCache.length; + if (l && i >= 0) { + var row = rowCache[i]; + var docRow = this.$docRowCache[i]; + var doCache = screenRow > rowCache[l - 1]; + } else { + var doCache = !l; + } + + var maxRow = this.getLength() - 1; + var foldLine = this.getNextFoldLine(docRow); + var foldStart = foldLine ? foldLine.start.row : Infinity; + + while (row <= screenRow) { + rowLength = this.getRowLength(docRow); + if (row + rowLength - 1 >= screenRow || docRow >= maxRow) { + break; + } else { + row += rowLength; + docRow++; + if (docRow > foldStart) { + docRow = foldLine.end.row+1; + foldLine = this.getNextFoldLine(docRow, foldLine); + foldStart = foldLine ? foldLine.start.row : Infinity; + } + } + + if (doCache) { + this.$docRowCache.push(docRow); + this.$screenRowCache.push(row); + } + } + + if (foldLine && foldLine.start.row <= docRow) { + line = this.getFoldDisplayLine(foldLine); + docRow = foldLine.start.row; + } else if (row + rowLength <= screenRow || docRow > maxRow) { + return { + row: maxRow, + column: this.getLine(maxRow).length + } + } else { + line = this.getLine(docRow); + foldLine = null; + } + + if (this.$useWrapMode) { + var splits = this.$wrapData[docRow]; + if (splits) { + column = splits[screenRow - row]; + if(screenRow > row && splits.length) { + docColumn = splits[screenRow - row - 1] || splits[splits.length - 1]; + line = line.substring(docColumn); + } + } + } + + docColumn += this.$getStringScreenWidth(line, screenColumn)[1]; + if (this.$useWrapMode && docColumn >= column) + docColumn = column - 1; + + if (foldLine) + return foldLine.idxToPosition(docColumn); + + return {row: docRow, column: docColumn}; + }; + this.documentToScreenPosition = function(docRow, docColumn) { + if (typeof docColumn === "undefined") + var pos = this.$clipPositionToDocument(docRow.row, docRow.column); + else + pos = this.$clipPositionToDocument(docRow, docColumn); + + docRow = pos.row; + docColumn = pos.column; + + var screenRow = 0; + var foldStartRow = null; + var fold = null; + fold = this.getFoldAt(docRow, docColumn, 1); + if (fold) { + docRow = fold.start.row; + docColumn = fold.start.column; + } + + var rowEnd, row = 0; + + + var rowCache = this.$docRowCache; + var i = this.$getRowCacheIndex(rowCache, docRow); + var l = rowCache.length; + if (l && i >= 0) { + var row = rowCache[i]; + var screenRow = this.$screenRowCache[i]; + var doCache = docRow > rowCache[l - 1]; + } else { + var doCache = !l; + } + + var foldLine = this.getNextFoldLine(row); + var foldStart = foldLine ?foldLine.start.row :Infinity; + + while (row < docRow) { + if (row >= foldStart) { + rowEnd = foldLine.end.row + 1; + if (rowEnd > docRow) + break; + foldLine = this.getNextFoldLine(rowEnd, foldLine); + foldStart = foldLine ?foldLine.start.row :Infinity; + } + else { + rowEnd = row + 1; + } + + screenRow += this.getRowLength(row); + row = rowEnd; + + if (doCache) { + this.$docRowCache.push(row); + this.$screenRowCache.push(screenRow); + } + } + var textLine = ""; + if (foldLine && row >= foldStart) { + textLine = this.getFoldDisplayLine(foldLine, docRow, docColumn); + foldStartRow = foldLine.start.row; + } else { + textLine = this.getLine(docRow).substring(0, docColumn); + foldStartRow = docRow; + } + if (this.$useWrapMode) { + var wrapRow = this.$wrapData[foldStartRow]; + var screenRowOffset = 0; + while (textLine.length >= wrapRow[screenRowOffset]) { + screenRow ++; + screenRowOffset++; + } + textLine = textLine.substring( + wrapRow[screenRowOffset - 1] || 0, textLine.length + ); + } + + return { + row: screenRow, + column: this.$getStringScreenWidth(textLine)[0] + }; + }; + this.documentToScreenColumn = function(row, docColumn) { + return this.documentToScreenPosition(row, docColumn).column; + }; + this.documentToScreenRow = function(docRow, docColumn) { + return this.documentToScreenPosition(docRow, docColumn).row; + }; + this.getScreenLength = function() { + var screenRows = 0; + var fold = null; + if (!this.$useWrapMode) { + screenRows = this.getLength(); + var foldData = this.$foldData; + for (var i = 0; i < foldData.length; i++) { + fold = foldData[i]; + screenRows -= fold.end.row - fold.start.row; + } + } else { + var lastRow = this.$wrapData.length; + var row = 0, i = 0; + var fold = this.$foldData[i++]; + var foldStart = fold ? fold.start.row :Infinity; + + while (row < lastRow) { + screenRows += this.$wrapData[row].length + 1; + row ++; + if (row > foldStart) { + row = fold.end.row+1; + fold = this.$foldData[i++]; + foldStart = fold ?fold.start.row :Infinity; + } + } + } + + return screenRows; + }; + function isFullWidth(c) { + if (c < 0x1100) + return false; + return c >= 0x1100 && c <= 0x115F || + c >= 0x11A3 && c <= 0x11A7 || + c >= 0x11FA && c <= 0x11FF || + c >= 0x2329 && c <= 0x232A || + c >= 0x2E80 && c <= 0x2E99 || + c >= 0x2E9B && c <= 0x2EF3 || + c >= 0x2F00 && c <= 0x2FD5 || + c >= 0x2FF0 && c <= 0x2FFB || + c >= 0x3000 && c <= 0x303E || + c >= 0x3041 && c <= 0x3096 || + c >= 0x3099 && c <= 0x30FF || + c >= 0x3105 && c <= 0x312D || + c >= 0x3131 && c <= 0x318E || + c >= 0x3190 && c <= 0x31BA || + c >= 0x31C0 && c <= 0x31E3 || + c >= 0x31F0 && c <= 0x321E || + c >= 0x3220 && c <= 0x3247 || + c >= 0x3250 && c <= 0x32FE || + c >= 0x3300 && c <= 0x4DBF || + c >= 0x4E00 && c <= 0xA48C || + c >= 0xA490 && c <= 0xA4C6 || + c >= 0xA960 && c <= 0xA97C || + c >= 0xAC00 && c <= 0xD7A3 || + c >= 0xD7B0 && c <= 0xD7C6 || + c >= 0xD7CB && c <= 0xD7FB || + c >= 0xF900 && c <= 0xFAFF || + c >= 0xFE10 && c <= 0xFE19 || + c >= 0xFE30 && c <= 0xFE52 || + c >= 0xFE54 && c <= 0xFE66 || + c >= 0xFE68 && c <= 0xFE6B || + c >= 0xFF01 && c <= 0xFF60 || + c >= 0xFFE0 && c <= 0xFFE6; + }; + +}).call(EditSession.prototype); + +require("./edit_session/folding").Folding.call(EditSession.prototype); +require("./edit_session/bracket_match").BracketMatch.call(EditSession.prototype); + + +config.defineOptions(EditSession.prototype, "session", { + wrap: { + set: function(value) { + if (!value || value == "off") + value = false; + else if (value == "free") + value = true; + else if (value == "printMargin") + value = -1; + else if (typeof value == "string") + value = parseInt(value, 10) || false; + + if (this.$wrap == value) + return; + if (!value) { + this.setUseWrapMode(false); + } else { + var col = typeof value == "number" ? value : null; + this.setWrapLimitRange(col, col); + this.setUseWrapMode(true); + } + this.$wrap = value; + }, + get: function() { + return this.getUseWrapMode() ? this.getWrapLimitRange().min || "free" : "off"; + }, + handlesSet: true + }, + firstLineNumber: { + set: function() {this._emit("changeBreakpoint");}, + initialValue: 1 + }, + useWorker: { + set: function(useWorker) { + this.$useWorker = useWorker; + + this.$stopWorker(); + if (useWorker) + this.$startWorker(); + }, + initialValue: true + }, + useSoftTabs: {initialValue: true}, + tabSize: { + set: function(tabSize) { + if (isNaN(tabSize) || this.$tabSize === tabSize) return; + + this.$modified = true; + this.$rowLengthCache = []; + this.$tabSize = tabSize; + this._emit("changeTabSize"); + }, + initialValue: 4, + handlesSet: true + }, + overwrite: { + set: function(val) {this._emit("changeOverwrite");}, + initialValue: false + }, + newLineMode: { + set: function(val) {this.doc.setNewLineMode(val)}, + get: function() {return this.doc.getNewLineMode()}, + handlesSet: true + } +}); + +exports.EditSession = EditSession; +}); + +ace.define('ace/selection', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/lib/event_emitter', 'ace/range'], function(require, exports, module) { + + +var oop = require("./lib/oop"); +var lang = require("./lib/lang"); +var EventEmitter = require("./lib/event_emitter").EventEmitter; +var Range = require("./range").Range; +var Selection = function(session) { + this.session = session; + this.doc = session.getDocument(); + + this.clearSelection(); + this.lead = this.selectionLead = this.doc.createAnchor(0, 0); + this.anchor = this.selectionAnchor = this.doc.createAnchor(0, 0); + + var self = this; + this.lead.on("change", function(e) { + self._emit("changeCursor"); + if (!self.$isEmpty) + self._emit("changeSelection"); + if (!self.$keepDesiredColumnOnChange && e.old.column != e.value.column) + self.$desiredColumn = null; + }); + + this.selectionAnchor.on("change", function() { + if (!self.$isEmpty) + self._emit("changeSelection"); + }); +}; + +(function() { + + oop.implement(this, EventEmitter); + this.isEmpty = function() { + return (this.$isEmpty || ( + this.anchor.row == this.lead.row && + this.anchor.column == this.lead.column + )); + }; + this.isMultiLine = function() { + if (this.isEmpty()) { + return false; + } + + return this.getRange().isMultiLine(); + }; + this.getCursor = function() { + return this.lead.getPosition(); + }; + this.setSelectionAnchor = function(row, column) { + this.anchor.setPosition(row, column); + + if (this.$isEmpty) { + this.$isEmpty = false; + this._emit("changeSelection"); + } + }; + this.getSelectionAnchor = function() { + if (this.$isEmpty) + return this.getSelectionLead() + else + return this.anchor.getPosition(); + }; + this.getSelectionLead = function() { + return this.lead.getPosition(); + }; + this.shiftSelection = function(columns) { + if (this.$isEmpty) { + this.moveCursorTo(this.lead.row, this.lead.column + columns); + return; + }; + + var anchor = this.getSelectionAnchor(); + var lead = this.getSelectionLead(); + + var isBackwards = this.isBackwards(); + + if (!isBackwards || anchor.column !== 0) + this.setSelectionAnchor(anchor.row, anchor.column + columns); + + if (isBackwards || lead.column !== 0) { + this.$moveSelection(function() { + this.moveCursorTo(lead.row, lead.column + columns); + }); + } + }; + this.isBackwards = function() { + var anchor = this.anchor; + var lead = this.lead; + return (anchor.row > lead.row || (anchor.row == lead.row && anchor.column > lead.column)); + }; + this.getRange = function() { + var anchor = this.anchor; + var lead = this.lead; + + if (this.isEmpty()) + return Range.fromPoints(lead, lead); + + if (this.isBackwards()) { + return Range.fromPoints(lead, anchor); + } + else { + return Range.fromPoints(anchor, lead); + } + }; + this.clearSelection = function() { + if (!this.$isEmpty) { + this.$isEmpty = true; + this._emit("changeSelection"); + } + }; + this.selectAll = function() { + var lastRow = this.doc.getLength() - 1; + this.setSelectionAnchor(0, 0); + this.moveCursorTo(lastRow, this.doc.getLine(lastRow).length); + }; + this.setRange = + this.setSelectionRange = function(range, reverse) { + if (reverse) { + this.setSelectionAnchor(range.end.row, range.end.column); + this.selectTo(range.start.row, range.start.column); + } else { + this.setSelectionAnchor(range.start.row, range.start.column); + this.selectTo(range.end.row, range.end.column); + } + this.$desiredColumn = null; + }; + + this.$moveSelection = function(mover) { + var lead = this.lead; + if (this.$isEmpty) + this.setSelectionAnchor(lead.row, lead.column); + + mover.call(this); + }; + this.selectTo = function(row, column) { + this.$moveSelection(function() { + this.moveCursorTo(row, column); + }); + }; + this.selectToPosition = function(pos) { + this.$moveSelection(function() { + this.moveCursorToPosition(pos); + }); + }; + 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(row, column) { + if (typeof column == "undefined") { + var cursor = row || this.lead; + row = cursor.row; + column = cursor.column; + } + return this.session.getWordRange(row, column); + }; + this.selectWord = function() { + this.setSelectionRange(this.getWordRange()); + }; + this.selectAWord = function() { + var cursor = this.getCursor(); + var range = this.session.getAWordRange(cursor.row, cursor.column); + this.setSelectionRange(range); + }; + + this.getLineRange = function(row, excludeLastChar) { + var rowStart = typeof row == "number" ? row : this.lead.row; + var rowEnd; + + var foldLine = this.session.getFoldLine(rowStart); + if (foldLine) { + rowStart = foldLine.start.row; + rowEnd = foldLine.end.row; + } else { + rowEnd = rowStart; + } + if (excludeLastChar) + return new Range(rowStart, 0, rowEnd, this.session.getLine(rowEnd).length); + else + return new Range(rowStart, 0, rowEnd + 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 cursor = this.lead.getPosition(), + fold; + + if (fold = this.session.getFoldAt(cursor.row, cursor.column, -1)) { + this.moveCursorTo(fold.start.row, fold.start.column); + } else if (cursor.column == 0) { + if (cursor.row > 0) { + this.moveCursorTo(cursor.row - 1, this.doc.getLine(cursor.row - 1).length); + } + } + else { + var tabSize = this.session.getTabSize(); + if (this.session.isTabStop(cursor) && this.doc.getLine(cursor.row).slice(cursor.column-tabSize, cursor.column).split(" ").length-1 == tabSize) + this.moveCursorBy(0, -tabSize); + else + this.moveCursorBy(0, -1); + } + }; + this.moveCursorRight = function() { + var cursor = this.lead.getPosition(), + fold; + if (fold = this.session.getFoldAt(cursor.row, cursor.column, 1)) { + this.moveCursorTo(fold.end.row, fold.end.column); + } + else if (this.lead.column == this.doc.getLine(this.lead.row).length) { + if (this.lead.row < this.doc.getLength() - 1) { + this.moveCursorTo(this.lead.row + 1, 0); + } + } + else { + var tabSize = this.session.getTabSize(); + var cursor = this.lead; + if (this.session.isTabStop(cursor) && this.doc.getLine(cursor.row).slice(cursor.column, cursor.column+tabSize).split(" ").length-1 == tabSize) + this.moveCursorBy(0, tabSize); + else + this.moveCursorBy(0, 1); + } + }; + this.moveCursorLineStart = function() { + var row = this.lead.row; + var column = this.lead.column; + var screenRow = this.session.documentToScreenRow(row, column); + var firstColumnPosition = this.session.screenToDocumentPosition(screenRow, 0); + var beforeCursor = this.session.getDisplayLine( + row, null, firstColumnPosition.row, + firstColumnPosition.column + ); + + var leadingSpace = beforeCursor.match(/^\s*/); + if (leadingSpace[0].length != column && !this.session.$useEmacsStyleLineStart) + firstColumnPosition.column += leadingSpace[0].length; + this.moveCursorToPosition(firstColumnPosition); + }; + this.moveCursorLineEnd = function() { + var lead = this.lead; + var lineEnd = this.session.getDocumentLastRowColumnPosition(lead.row, lead.column); + if (this.lead.column == lineEnd.column) { + var line = this.session.getLine(lineEnd.row); + if (lineEnd.column == line.length) { + var textEnd = line.search(/\s+$/); + if (textEnd > 0) + lineEnd.column = textEnd; + } + } + + this.moveCursorTo(lineEnd.row, lineEnd.column); + }; + this.moveCursorFileEnd = function() { + var row = this.doc.getLength() - 1; + var column = this.doc.getLine(row).length; + this.moveCursorTo(row, column); + }; + this.moveCursorFileStart = function() { + this.moveCursorTo(0, 0); + }; + this.moveCursorLongWordRight = function() { + var row = this.lead.row; + var column = this.lead.column; + var line = this.doc.getLine(row); + var rightOfCursor = line.substring(column); + + var match; + this.session.nonTokenRe.lastIndex = 0; + this.session.tokenRe.lastIndex = 0; + var fold = this.session.getFoldAt(row, column, 1); + if (fold) { + this.moveCursorTo(fold.end.row, fold.end.column); + return; + } + if (match = this.session.nonTokenRe.exec(rightOfCursor)) { + column += this.session.nonTokenRe.lastIndex; + this.session.nonTokenRe.lastIndex = 0; + rightOfCursor = line.substring(column); + } + if (column >= line.length) { + this.moveCursorTo(row, line.length); + this.moveCursorRight(); + if (row < this.doc.getLength() - 1) + this.moveCursorWordRight(); + return; + } + if (match = this.session.tokenRe.exec(rightOfCursor)) { + column += this.session.tokenRe.lastIndex; + this.session.tokenRe.lastIndex = 0; + } + + this.moveCursorTo(row, column); + }; + this.moveCursorLongWordLeft = function() { + var row = this.lead.row; + var column = this.lead.column; + var fold; + if (fold = this.session.getFoldAt(row, column, -1)) { + this.moveCursorTo(fold.start.row, fold.start.column); + return; + } + + var str = this.session.getFoldStringAt(row, column, -1); + if (str == null) { + str = this.doc.getLine(row).substring(0, column) + } + + var leftOfCursor = lang.stringReverse(str); + var match; + this.session.nonTokenRe.lastIndex = 0; + this.session.tokenRe.lastIndex = 0; + if (match = this.session.nonTokenRe.exec(leftOfCursor)) { + column -= this.session.nonTokenRe.lastIndex; + leftOfCursor = leftOfCursor.slice(this.session.nonTokenRe.lastIndex); + this.session.nonTokenRe.lastIndex = 0; + } + if (column <= 0) { + this.moveCursorTo(row, 0); + this.moveCursorLeft(); + if (row > 0) + this.moveCursorWordLeft(); + return; + } + if (match = this.session.tokenRe.exec(leftOfCursor)) { + column -= this.session.tokenRe.lastIndex; + this.session.tokenRe.lastIndex = 0; + } + + this.moveCursorTo(row, column); + }; + + this.$shortWordEndIndex = function(rightOfCursor) { + var match, index = 0, ch; + var whitespaceRe = /\s/; + var tokenRe = this.session.tokenRe; + + tokenRe.lastIndex = 0; + if (match = this.session.tokenRe.exec(rightOfCursor)) { + index = this.session.tokenRe.lastIndex; + } else { + while ((ch = rightOfCursor[index]) && whitespaceRe.test(ch)) + index ++; + + if (index <= 1) { + tokenRe.lastIndex = 0; + while ((ch = rightOfCursor[index]) && !tokenRe.test(ch)) { + tokenRe.lastIndex = 0; + index ++; + if (whitespaceRe.test(ch)) { + if (index > 2) { + index-- + break; + } else { + while ((ch = rightOfCursor[index]) && whitespaceRe.test(ch)) + index ++; + if (index > 2) + break + } + } + } + } + } + tokenRe.lastIndex = 0; + + return index; + }; + + this.moveCursorShortWordRight = function() { + var row = this.lead.row; + var column = this.lead.column; + var line = this.doc.getLine(row); + var rightOfCursor = line.substring(column); + + var fold = this.session.getFoldAt(row, column, 1); + if (fold) + return this.moveCursorTo(fold.end.row, fold.end.column); + + if (column == line.length) { + var l = this.doc.getLength(); + do { + row++; + rightOfCursor = this.doc.getLine(row) + } while (row < l && /^\s*$/.test(rightOfCursor)) + + if (!/^\s+/.test(rightOfCursor)) + rightOfCursor = "" + column = 0; + } + + var index = this.$shortWordEndIndex(rightOfCursor); + + this.moveCursorTo(row, column + index); + }; + + this.moveCursorShortWordLeft = function() { + var row = this.lead.row; + var column = this.lead.column; + + var fold; + if (fold = this.session.getFoldAt(row, column, -1)) + return this.moveCursorTo(fold.start.row, fold.start.column); + + var line = this.session.getLine(row).substring(0, column); + if (column == 0) { + do { + row--; + line = this.doc.getLine(row); + } while (row > 0 && /^\s*$/.test(line)) + + column = line.length; + if (!/\s+$/.test(line)) + line = "" + } + + var leftOfCursor = lang.stringReverse(line); + var index = this.$shortWordEndIndex(leftOfCursor); + + return this.moveCursorTo(row, column - index); + }; + + this.moveCursorWordRight = function() { + if (this.session.$selectLongWords) + this.moveCursorLongWordRight(); + else + this.moveCursorShortWordRight(); + }; + + this.moveCursorWordLeft = function() { + if (this.session.$selectLongWords) + this.moveCursorLongWordLeft(); + else + this.moveCursorShortWordLeft(); + }; + this.moveCursorBy = function(rows, chars) { + var screenPos = this.session.documentToScreenPosition( + this.lead.row, + this.lead.column + ); + + if (chars === 0) { + if (this.$desiredColumn) + screenPos.column = this.$desiredColumn; + else + this.$desiredColumn = screenPos.column; + } + + var docPos = this.session.screenToDocumentPosition(screenPos.row + rows, screenPos.column); + this.moveCursorTo(docPos.row, docPos.column + chars, chars === 0); + }; + this.moveCursorToPosition = function(position) { + this.moveCursorTo(position.row, position.column); + }; + this.moveCursorTo = function(row, column, keepDesiredColumn) { + var fold = this.session.getFoldAt(row, column, 1); + if (fold) { + row = fold.start.row; + column = fold.start.column; + } + + this.$keepDesiredColumnOnChange = true; + this.lead.setPosition(row, column); + this.$keepDesiredColumnOnChange = false; + + if (!keepDesiredColumn) + this.$desiredColumn = null; + }; + this.moveCursorToScreen = function(row, column, keepDesiredColumn) { + var pos = this.session.screenToDocumentPosition(row, column); + this.moveCursorTo(pos.row, pos.column, keepDesiredColumn); + }; + this.detach = function() { + this.lead.detach(); + this.anchor.detach(); + this.session = this.doc = null; + } + + this.fromOrientedRange = function(range) { + this.setSelectionRange(range, range.cursor == range.start); + this.$desiredColumn = range.desiredColumn || this.$desiredColumn; + } + + this.toOrientedRange = function(range) { + var r = this.getRange(); + if (range) { + range.start.column = r.start.column; + range.start.row = r.start.row; + range.end.column = r.end.column; + range.end.row = r.end.row; + } else { + range = r; + } + + range.cursor = this.isBackwards() ? range.start : range.end; + range.desiredColumn = this.$desiredColumn; + return range; + } + +}).call(Selection.prototype); + +exports.Selection = Selection; +}); + +ace.define('ace/range', ['require', 'exports', 'module' ], function(require, exports, module) { + +var comparePoints = function(p1, p2) { + return p1.row - p2.row || p1.column - p2.column; +}; +var Range = function(startRow, startColumn, endRow, endColumn) { + this.start = { + row: startRow, + column: startColumn + }; + + this.end = { + row: endRow, + column: endColumn + }; +}; + +(function() { + this.isEqual = function(range) { + return this.start.row === range.start.row && + this.end.row === range.end.row && + this.start.column === range.start.column && + this.end.column === range.end.column; + }; + this.toString = function() { + return ("Range: [" + this.start.row + "/" + this.start.column + + "] -> [" + this.end.row + "/" + this.end.column + "]"); + }; + + this.contains = function(row, column) { + return this.compare(row, column) == 0; + }; + this.compareRange = function(range) { + var cmp, + end = range.end, + start = range.start; + + cmp = this.compare(end.row, end.column); + if (cmp == 1) { + cmp = this.compare(start.row, start.column); + if (cmp == 1) { + return 2; + } else if (cmp == 0) { + return 1; + } else { + return 0; + } + } else if (cmp == -1) { + return -2; + } else { + cmp = this.compare(start.row, start.column); + if (cmp == -1) { + return -1; + } else if (cmp == 1) { + return 42; + } else { + return 0; + } + } + }; + this.comparePoint = function(p) { + return this.compare(p.row, p.column); + }; + this.containsRange = function(range) { + return this.comparePoint(range.start) == 0 && this.comparePoint(range.end) == 0; + }; + this.intersects = function(range) { + var cmp = this.compareRange(range); + return (cmp == -1 || cmp == 0 || cmp == 1); + }; + this.isEnd = function(row, column) { + return this.end.row == row && this.end.column == column; + }; + this.isStart = function(row, column) { + return this.start.row == row && this.start.column == column; + }; + this.setStart = function(row, column) { + if (typeof row == "object") { + this.start.column = row.column; + this.start.row = row.row; + } else { + this.start.row = row; + this.start.column = column; + } + }; + this.setEnd = function(row, column) { + if (typeof row == "object") { + this.end.column = row.column; + this.end.row = row.row; + } else { + this.end.row = row; + this.end.column = column; + } + }; + this.inside = function(row, column) { + if (this.compare(row, column) == 0) { + if (this.isEnd(row, column) || this.isStart(row, column)) { + return false; + } else { + return true; + } + } + return false; + }; + this.insideStart = function(row, column) { + if (this.compare(row, column) == 0) { + if (this.isEnd(row, column)) { + return false; + } else { + return true; + } + } + return false; + }; + this.insideEnd = function(row, column) { + if (this.compare(row, column) == 0) { + if (this.isStart(row, column)) { + return false; + } else { + return true; + } + } + return false; + }; + this.compare = function(row, column) { + if (!this.isMultiLine()) { + if (row === this.start.row) { + return column < this.start.column ? -1 : (column > this.end.column ? 1 : 0); + }; + } + + if (row < this.start.row) + return -1; + + if (row > this.end.row) + return 1; + + if (this.start.row === row) + return column >= this.start.column ? 0 : -1; + + if (this.end.row === row) + return column <= this.end.column ? 0 : 1; + + return 0; + }; + this.compareStart = function(row, column) { + if (this.start.row == row && this.start.column == column) { + return -1; + } else { + return this.compare(row, column); + } + }; + this.compareEnd = function(row, column) { + if (this.end.row == row && this.end.column == column) { + return 1; + } else { + return this.compare(row, column); + } + }; + this.compareInside = function(row, column) { + if (this.end.row == row && this.end.column == column) { + return 1; + } else if (this.start.row == row && this.start.column == column) { + return -1; + } else { + return this.compare(row, column); + } + }; + this.clipRows = function(firstRow, lastRow) { + if (this.end.row > lastRow) + var end = {row: lastRow + 1, column: 0}; + else if (this.end.row < firstRow) + var end = {row: firstRow, column: 0}; + + if (this.start.row > lastRow) + var start = {row: lastRow + 1, column: 0}; + else if (this.start.row < firstRow) + var start = {row: firstRow, column: 0}; + + return Range.fromPoints(start || this.start, end || this.end); + }; + this.extend = function(row, column) { + var cmp = this.compare(row, column); + + if (cmp == 0) + return this; + else if (cmp == -1) + var start = {row: row, column: column}; + else + var end = {row: row, column: column}; + + return Range.fromPoints(start || this.start, end || this.end); + }; + + this.isEmpty = function() { + return (this.start.row === this.end.row && this.start.column === this.end.column); + }; + this.isMultiLine = function() { + return (this.start.row !== this.end.row); + }; + this.clone = function() { + return Range.fromPoints(this.start, this.end); + }; + this.collapseRows = function() { + if (this.end.column == 0) + return new Range(this.start.row, 0, Math.max(this.start.row, this.end.row-1), 0) + else + return new Range(this.start.row, 0, this.end.row, 0) + }; + this.toScreenRange = function(session) { + var screenPosStart = session.documentToScreenPosition(this.start); + var screenPosEnd = session.documentToScreenPosition(this.end); + + return new Range( + screenPosStart.row, screenPosStart.column, + screenPosEnd.row, screenPosEnd.column + ); + }; + this.moveBy = function(row, column) { + this.start.row += row; + this.start.column += column; + this.end.row += row; + this.end.column += column; + }; + +}).call(Range.prototype); +Range.fromPoints = function(start, end) { + return new Range(start.row, start.column, end.row, end.column); +}; +Range.comparePoints = comparePoints; + +Range.comparePoints = function(p1, p2) { + return p1.row - p2.row || p1.column - p2.column; +}; + + +exports.Range = Range; +}); + +ace.define('ace/mode/text', ['require', 'exports', 'module' , 'ace/tokenizer', 'ace/mode/text_highlight_rules', 'ace/mode/behaviour', 'ace/unicode', 'ace/lib/lang', 'ace/token_iterator', 'ace/range'], function(require, exports, module) { + + +var Tokenizer = require("../tokenizer").Tokenizer; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var Behaviour = require("./behaviour").Behaviour; +var unicode = require("../unicode"); +var lang = require("../lib/lang"); +var TokenIterator = require("../token_iterator").TokenIterator; +var Range = require("../range").Range; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new TextHighlightRules().getRules()); + this.$behaviour = new Behaviour(); +}; + +(function() { + + this.tokenRe = new RegExp("^[" + + unicode.packages.L + + unicode.packages.Mn + unicode.packages.Mc + + unicode.packages.Nd + + unicode.packages.Pc + "\\$_]+", "g" + ); + + this.nonTokenRe = new RegExp("^(?:[^" + + unicode.packages.L + + unicode.packages.Mn + unicode.packages.Mc + + unicode.packages.Nd + + unicode.packages.Pc + "\\$_]|\s])+", "g" + ); + + this.getTokenizer = function() { + return this.$tokenizer; + }; + + this.lineCommentStart = ""; + this.blockComment = ""; + + this.toggleCommentLines = function(state, session, startRow, endRow) { + var doc = session.doc; + + var ignoreBlankLines = true; + var shouldRemove = true; + var minIndent = Infinity; + var tabSize = session.getTabSize(); + var insertAtTabStop = false; + + if (!this.lineCommentStart) { + if (!this.blockComment) + return false; + var lineCommentStart = this.blockComment.start; + var lineCommentEnd = this.blockComment.end; + var regexpStart = new RegExp("^(\\s*)(?:" + lang.escapeRegExp(lineCommentStart) + ")"); + var regexpEnd = new RegExp("(?:" + lang.escapeRegExp(lineCommentEnd) + ")\\s*$"); + + var comment = function(line, i) { + if (testRemove(line, i)) + return; + if (!ignoreBlankLines || /\S/.test(line)) { + doc.insertInLine({row: i, column: line.length}, lineCommentEnd); + doc.insertInLine({row: i, column: minIndent}, lineCommentStart); + } + }; + + var uncomment = function(line, i) { + var m; + if (m = line.match(regexpEnd)) + doc.removeInLine(i, line.length - m[0].length, line.length); + if (m = line.match(regexpStart)) + doc.removeInLine(i, m[1].length, m[0].length); + }; + + var testRemove = function(line, row) { + if (regexpStart.test(line)) + return true; + var tokens = session.getTokens(row); + for (var i = 0; i < tokens.length; i++) { + if (tokens[i].type === 'comment') + return true; + } + }; + } else { + if (Array.isArray(this.lineCommentStart)) { + var regexpStart = this.lineCommentStart.map(lang.escapeRegExp).join("|"); + var lineCommentStart = this.lineCommentStart[0]; + } else { + var regexpStart = lang.escapeRegExp(this.lineCommentStart); + var lineCommentStart = this.lineCommentStart; + } + regexpStart = new RegExp("^(\\s*)(?:" + regexpStart + ") ?"); + + insertAtTabStop = session.getUseSoftTabs(); + + var uncomment = function(line, i) { + var m = line.match(regexpStart); + if (!m) return; + var start = m[1].length, end = m[0].length; + if (!shouldInsertSpace(line, start, end) && m[0][end - 1] == " ") + end--; + doc.removeInLine(i, start, end); + }; + var commentWithSpace = lineCommentStart + " "; + var comment = function(line, i) { + if (!ignoreBlankLines || /\S/.test(line)) { + if (shouldInsertSpace(line, minIndent, minIndent)) + doc.insertInLine({row: i, column: minIndent}, commentWithSpace); + else + doc.insertInLine({row: i, column: minIndent}, lineCommentStart); + } + }; + var testRemove = function(line, i) { + return regexpStart.test(line); + }; + + var shouldInsertSpace = function(line, before, after) { + var spaces = 0; + while (before-- && line.charAt(before) == " ") + spaces++; + if (spaces % tabSize != 0) + return false; + var spaces = 0; + while (line.charAt(after++) == " ") + spaces++; + if (tabSize > 2) + return spaces % tabSize != tabSize - 1; + else + return spaces % tabSize == 0; + return true; + }; + } + + function iter(fun) { + for (var i = startRow; i <= endRow; i++) + fun(doc.getLine(i), i); + } + + + var minEmptyLength = Infinity; + iter(function(line, i) { + var indent = line.search(/\S/); + if (indent !== -1) { + if (indent < minIndent) + minIndent = indent; + if (shouldRemove && !testRemove(line, i)) + shouldRemove = false; + } else if (minEmptyLength > line.length) { + minEmptyLength = line.length; + } + }); + + if (minIndent == Infinity) { + minIndent = minEmptyLength; + ignoreBlankLines = false; + shouldRemove = false; + } + + if (insertAtTabStop && minIndent % tabSize != 0) + minIndent = Math.floor(minIndent / tabSize) * tabSize; + + iter(shouldRemove ? uncomment : comment); + }; + + this.toggleBlockComment = function(state, session, range, cursor) { + var comment = this.blockComment; + if (!comment) + return; + if (!comment.start && comment[0]) + comment = comment[0]; + + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + + var sel = session.selection; + var initialRange = session.selection.toOrientedRange(); + var startRow, colDiff; + + if (token && /comment/.test(token.type)) { + var startRange, endRange; + while (token && /comment/.test(token.type)) { + var i = token.value.indexOf(comment.start); + if (i != -1) { + var row = iterator.getCurrentTokenRow(); + var column = iterator.getCurrentTokenColumn() + i; + startRange = new Range(row, column, row, column + comment.start.length); + break + } + token = iterator.stepBackward(); + }; + + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + while (token && /comment/.test(token.type)) { + var i = token.value.indexOf(comment.end); + if (i != -1) { + var row = iterator.getCurrentTokenRow(); + var column = iterator.getCurrentTokenColumn() + i; + endRange = new Range(row, column, row, column + comment.end.length); + break; + } + token = iterator.stepForward(); + } + if (endRange) + session.remove(endRange); + if (startRange) { + session.remove(startRange); + startRow = startRange.start.row; + colDiff = -comment.start.length + } + } else { + colDiff = comment.start.length + startRow = range.start.row; + session.insert(range.end, comment.end); + session.insert(range.start, comment.start); + } + if (initialRange.start.row == startRow) + initialRange.start.column += colDiff; + if (initialRange.end.row == startRow) + initialRange.end.column += colDiff; + session.selection.fromOrientedRange(initialRange); + }; + + this.getNextLineIndent = function(state, line, tab) { + return this.$getIndent(line); + }; + + this.checkOutdent = function(state, line, input) { + return false; + }; + + this.autoOutdent = function(state, doc, row) { + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + + this.createWorker = function(session) { + return null; + }; + + this.createModeDelegates = function (mapping) { + if (!this.$embeds) { + return; + } + this.$modes = {}; + for (var i = 0; i < this.$embeds.length; i++) { + if (mapping[this.$embeds[i]]) { + this.$modes[this.$embeds[i]] = new mapping[this.$embeds[i]](); + } + } + + var delegations = ['toggleCommentLines', 'getNextLineIndent', 'checkOutdent', 'autoOutdent', 'transformAction']; + + for (var i = 0; i < delegations.length; i++) { + (function(scope) { + var functionName = delegations[i]; + var defaultHandler = scope[functionName]; + scope[delegations[i]] = function() { + return this.$delegator(functionName, arguments, defaultHandler); + } + } (this)); + } + }; + + this.$delegator = function(method, args, defaultHandler) { + var state = args[0]; + if (typeof state != "string") + state = state[0]; + for (var i = 0; i < this.$embeds.length; i++) { + if (!this.$modes[this.$embeds[i]]) continue; + + var split = state.split(this.$embeds[i]); + if (!split[0] && split[1]) { + args[0] = split[1]; + var mode = this.$modes[this.$embeds[i]]; + return mode[method].apply(mode, args); + } + } + var ret = defaultHandler.apply(this, args); + return defaultHandler ? ret : undefined; + }; + + this.transformAction = function(state, action, editor, session, param) { + if (this.$behaviour) { + var behaviours = this.$behaviour.getBehaviours(); + for (var key in behaviours) { + if (behaviours[key][action]) { + var ret = behaviours[key][action].apply(this, arguments); + if (ret) { + return ret; + } + } + } + } + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define('ace/tokenizer', ['require', 'exports', 'module' ], function(require, exports, module) { +var MAX_TOKEN_COUNT = 1000; +var Tokenizer = function(rules) { + this.states = rules; + + this.regExps = {}; + this.matchMappings = {}; + for (var key in this.states) { + var state = this.states[key]; + var ruleRegExps = []; + var matchTotal = 0; + var mapping = this.matchMappings[key] = {defaultToken: "text"}; + var flag = "g"; + + var splitterRurles = []; + for (var i = 0; i < state.length; i++) { + var rule = state[i]; + if (rule.defaultToken) + mapping.defaultToken = rule.defaultToken; + if (rule.caseInsensitive) + flag = "gi"; + if (rule.regex == null) + continue; + + if (rule.regex instanceof RegExp) + rule.regex = rule.regex.toString().slice(1, -1); + var adjustedregex = rule.regex; + var matchcount = new RegExp("(?:(" + adjustedregex + ")|(.))").exec("a").length - 2; + if (Array.isArray(rule.token)) { + if (rule.token.length == 1 || matchcount == 1) { + rule.token = rule.token[0]; + } else if (matchcount - 1 != rule.token.length) { + throw new Error("number of classes and regexp groups in '" + + rule.token + "'\n'" + rule.regex + "' doesn't match\n" + + (matchcount - 1) + "!=" + rule.token.length); + } else { + rule.tokenArray = rule.token; + rule.token = null; + rule.onMatch = this.$arrayTokens; + } + } else if (typeof rule.token == "function" && !rule.onMatch) { + if (matchcount > 1) + rule.onMatch = this.$applyToken; + else + rule.onMatch = rule.token; + } + + if (matchcount > 1) { + if (/\\\d/.test(rule.regex)) { + adjustedregex = rule.regex.replace(/\\([0-9]+)/g, function (match, digit) { + return "\\" + (parseInt(digit, 10) + matchTotal + 1); + }); + } else { + matchcount = 1; + adjustedregex = this.removeCapturingGroups(rule.regex); + } + if (!rule.splitRegex && typeof rule.token != "string") + splitterRurles.push(rule); // flag will be known only at the very end + } + + mapping[matchTotal] = i; + matchTotal += matchcount; + + ruleRegExps.push(adjustedregex); + if (!rule.onMatch) + rule.onMatch = null; + rule.__proto__ = null; + } + + splitterRurles.forEach(function(rule) { + rule.splitRegex = this.createSplitterRegexp(rule.regex, flag); + }, this); + + this.regExps[key] = new RegExp("(" + ruleRegExps.join(")|(") + ")|($)", flag); + } +}; + +(function() { + this.$applyToken = function(str) { + var values = this.splitRegex.exec(str).slice(1); + var types = this.token.apply(this, values); + if (typeof types === "string") + return [{type: types, value: str}]; + + var tokens = []; + for (var i = 0, l = types.length; i < l; i++) { + if (values[i]) + tokens[tokens.length] = { + type: types[i], + value: values[i] + }; + } + return tokens; + }, + + this.$arrayTokens = function(str) { + if (!str) + return []; + var values = this.splitRegex.exec(str); + if (!values) + return "text"; + var tokens = []; + var types = this.tokenArray; + for (var i = 0, l = types.length; i < l; i++) { + if (values[i + 1]) + tokens[tokens.length] = { + type: types[i], + value: values[i + 1] + }; + } + return tokens; + }; + + this.removeCapturingGroups = function(src) { + var r = src.replace( + /\[(?:\\.|[^\]])*?\]|\\.|\(\?[:=!]|(\()/g, + function(x, y) {return y ? "(?:" : x;} + ); + return r; + }; + + this.createSplitterRegexp = function(src, flag) { + if (src.indexOf("(?=") != -1) { + var stack = 0; + var inChClass = false; + var lastCapture = {}; + src.replace(/(\\.)|(\((?:\?[=!])?)|(\))|([\[\]])/g, function( + m, esc, parenOpen, parenClose, square, index + ) { + if (inChClass) { + inChClass = square != "]"; + } else if (square) { + inChClass = true; + } else if (parenClose) { + if (stack == lastCapture.stack) { + lastCapture.end = index+1; + lastCapture.stack = -1; + } + stack--; + } else if (parenOpen) { + stack++; + if (parenOpen.length != 1) { + lastCapture.stack = stack + lastCapture.start = index; + } + } + return m; + }); + + if (lastCapture.end != null && /^\)*$/.test(src.substr(lastCapture.end))) + src = src.substring(0, lastCapture.start) + src.substr(lastCapture.end); + } + return new RegExp(src, (flag||"").replace("g", "")); + }; + this.getLineTokens = function(line, startState) { + if (startState && typeof startState != "string") { + var stack = startState.slice(0); + startState = stack[0]; + } else + var stack = []; + + var currentState = startState || "start"; + var state = this.states[currentState]; + var mapping = this.matchMappings[currentState]; + var re = this.regExps[currentState]; + re.lastIndex = 0; + + var match, tokens = []; + var lastIndex = 0; + + var token = {type: null, value: ""}; + + while (match = re.exec(line)) { + var type = mapping.defaultToken; + var rule = null; + var value = match[0]; + var index = re.lastIndex; + + if (index - value.length > lastIndex) { + var skipped = line.substring(lastIndex, index - value.length); + if (token.type == type) { + token.value += skipped; + } else { + if (token.type) + tokens.push(token); + token = {type: type, value: skipped}; + } + } + + for (var i = 0; i < match.length-2; i++) { + if (match[i + 1] === undefined) + continue; + + rule = state[mapping[i]]; + + if (rule.onMatch) + type = rule.onMatch(value, currentState, stack); + else + type = rule.token; + + if (rule.next) { + if (typeof rule.next == "string") + currentState = rule.next; + else + currentState = rule.next(currentState, stack); + + state = this.states[currentState]; + if (!state) { + window.console && console.error && console.error(currentState, "doesn't exist"); + currentState = "start"; + state = this.states[currentState]; + } + mapping = this.matchMappings[currentState]; + lastIndex = index; + re = this.regExps[currentState]; + re.lastIndex = index; + } + break; + } + + if (value) { + if (typeof type == "string") { + if ((!rule || rule.merge !== false) && token.type === type) { + token.value += value; + } else { + if (token.type) + tokens.push(token); + token = {type: type, value: value}; + } + } else if (type) { + if (token.type) + tokens.push(token); + token = {type: null, value: ""}; + for (var i = 0; i < type.length; i++) + tokens.push(type[i]); + } + } + + if (lastIndex == line.length) + break; + + lastIndex = index; + + if (tokens.length > MAX_TOKEN_COUNT) { + while (lastIndex < line.length) { + if (token.type) + tokens.push(token); + token = { + value: line.substring(lastIndex, lastIndex += 2000), + type: "overflow" + } + } + currentState = "start"; + stack = []; + break; + } + } + + if (token.type) + tokens.push(token); + + return { + tokens : tokens, + state : stack.length ? stack : currentState + }; + }; + +}).call(Tokenizer.prototype); + +exports.Tokenizer = Tokenizer; +}); + +ace.define('ace/mode/text_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/lang'], function(require, exports, module) { + + +var lang = require("../lib/lang"); + +var TextHighlightRules = function() { + + this.$rules = { + "start" : [{ + token : "empty_line", + regex : '^$' + }, { + defaultToken : "text" + }] + }; +}; + +(function() { + + this.addRules = function(rules, prefix) { + for (var key in rules) { + var state = rules[key]; + for (var i = 0; i < state.length; i++) { + var rule = state[i]; + if (rule.next) { + if (typeof rule.next != "string") + rule.nextState = prefix + rule.nextState; + else + rule.next = prefix + rule.next; + + } + } + this.$rules[prefix + key] = state; + } + }; + + this.getRules = function() { + return this.$rules; + }; + + this.embedRules = function (HighlightRules, prefix, escapeRules, states, append) { + var embedRules = new HighlightRules().getRules(); + if (states) { + for (var i = 0; i < states.length; i++) + states[i] = prefix + states[i]; + } else { + states = []; + for (var key in embedRules) + states.push(prefix + key); + } + + this.addRules(embedRules, prefix); + + if (escapeRules) { + var addRules = Array.prototype[append ? "push" : "unshift"]; + for (var i = 0; i < states.length; i++) + addRules.apply(this.$rules[states[i]], lang.deepCopy(escapeRules)); + } + + if (!this.$embeds) + this.$embeds = []; + this.$embeds.push(prefix); + } + + this.getEmbeds = function() { + return this.$embeds; + }; + + var pushState = function(currentState, stack) { + if (currentState != "start") + stack.unshift(this.nextState, currentState); + return this.nextState; + }; + var popState = function(currentState, stack) { + if (stack[0] !== currentState) + return "start"; + stack.shift(); + return stack.shift(); + }; + + this.normalizeRules = function() { + var id = 0; + var rules = this.$rules; + function processState(key) { + var state = rules[key]; + state.processed = true; + for (var i = 0; i < state.length; i++) { + var rule = state[i]; + if (!rule.regex && rule.start) { + rule.regex = rule.start; + if (!rule.next) + rule.next = []; + rule.next.push({ + defaultToken: rule.token + }, { + token: rule.token + ".end", + regex: rule.end || rule.start, + next: "pop" + }); + rule.token = rule.token + ".start"; + rule.push = true; + } + var next = rule.next || rule.push; + if (next && Array.isArray(next)) { + var stateName = rule.stateName; + if (!stateName) { + stateName = rule.token; + if (typeof stateName != "string") + stateName = stateName[0] || ""; + if (rules[stateName]) + stateName += id++; + } + rules[stateName] = next; + rule.next = stateName; + processState(stateName); + } else if (next == "pop") { + rule.next = popState; + } + + if (rule.push) { + rule.nextState = rule.next || rule.push; + rule.next = pushState; + delete rule.push; + } + + if (rule.rules) { + for (var r in rule.rules) { + if (rules[r]) { + if (rules[r].push) + rules[r].push.apply(rules[r], rule.rules[r]); + } else { + rules[r] = rule.rules[r]; + } + } + } + if (rule.include || typeof rule == "string") { + var includeName = rule.include || rule; + var toInsert = rules[includeName]; + } else if (Array.isArray(rule)) + toInsert = rule; + + if (toInsert) { + var args = [i, 1].concat(toInsert); + if (rule.noEscape) + args = args.filter(function(x) {return !x.next;}); + state.splice.apply(state, args); + i--; + toInsert = null + } + + if (rule.keywordMap) { + rule.token = this.createKeywordMapper( + rule.keywordMap, rule.defaultToken || "text", rule.caseInsensitive + ); + delete rule.defaultToken; + } + } + }; + Object.keys(rules).forEach(processState, this); + }; + + this.createKeywordMapper = function(map, defaultToken, ignoreCase, splitChar) { + var keywords = Object.create(null); + Object.keys(map).forEach(function(className) { + var a = map[className]; + if (ignoreCase) + a = a.toLowerCase(); + var list = a.split(splitChar || "|"); + for (var i = list.length; i--; ) + keywords[list[i]] = className; + }); + map = null; + return ignoreCase + ? function(value) {return keywords[value.toLowerCase()] || defaultToken } + : function(value) {return keywords[value] || defaultToken }; + } + + this.getKeywords = function() { + return this.$keywords; + }; + +}).call(TextHighlightRules.prototype); + +exports.TextHighlightRules = TextHighlightRules; +}); + +ace.define('ace/mode/behaviour', ['require', 'exports', 'module' ], function(require, exports, module) { + + +var Behaviour = function() { + this.$behaviours = {}; +}; + +(function () { + + this.add = function (name, action, callback) { + switch (undefined) { + case this.$behaviours: + this.$behaviours = {}; + case this.$behaviours[name]: + this.$behaviours[name] = {}; + } + this.$behaviours[name][action] = callback; + } + + this.addBehaviours = function (behaviours) { + for (var key in behaviours) { + for (var action in behaviours[key]) { + this.add(key, action, behaviours[key][action]); + } + } + } + + this.remove = function (name) { + if (this.$behaviours && this.$behaviours[name]) { + delete this.$behaviours[name]; + } + } + + this.inherit = function (mode, filter) { + if (typeof mode === "function") { + var behaviours = new mode().getBehaviours(filter); + } else { + var behaviours = mode.getBehaviours(filter); + } + this.addBehaviours(behaviours); + } + + this.getBehaviours = function (filter) { + if (!filter) { + return this.$behaviours; + } else { + var ret = {} + for (var i = 0; i < filter.length; i++) { + if (this.$behaviours[filter[i]]) { + ret[filter[i]] = this.$behaviours[filter[i]]; + } + } + return ret; + } + } + +}).call(Behaviour.prototype); + +exports.Behaviour = Behaviour; +}); +ace.define('ace/unicode', ['require', 'exports', 'module' ], function(require, exports, module) { +exports.packages = {}; + +addUnicodePackage({ + 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" +}); + +function addUnicodePackage (pack) { + var codePoint = /\w{4}/g; + for (var name in pack) + exports.packages[name] = pack[name].replace(codePoint, "\\u$&"); +}; + +}); + +ace.define('ace/token_iterator', ['require', 'exports', 'module' ], function(require, exports, module) { +var TokenIterator = function(session, initialRow, initialColumn) { + this.$session = session; + this.$row = initialRow; + this.$rowTokens = session.getTokens(initialRow); + + var token = session.getTokenAt(initialRow, initialColumn); + this.$tokenIndex = token ? token.index : -1; +}; + +(function() { + this.stepBackward = function() { + this.$tokenIndex -= 1; + + while (this.$tokenIndex < 0) { + this.$row -= 1; + if (this.$row < 0) { + this.$row = 0; + return null; + } + + this.$rowTokens = this.$session.getTokens(this.$row); + this.$tokenIndex = this.$rowTokens.length - 1; + } + + return this.$rowTokens[this.$tokenIndex]; + }; + this.stepForward = function() { + this.$tokenIndex += 1; + var rowCount; + while (this.$tokenIndex >= this.$rowTokens.length) { + this.$row += 1; + if (!rowCount) + rowCount = this.$session.getLength(); + if (this.$row >= rowCount) { + this.$row = rowCount - 1; + return 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 rowTokens = this.$rowTokens; + var tokenIndex = this.$tokenIndex; + var column = rowTokens[tokenIndex].start; + if (column !== undefined) + return column; + + column = 0; + while (tokenIndex > 0) { + tokenIndex -= 1; + column += rowTokens[tokenIndex].value.length; + } + + return column; + }; + +}).call(TokenIterator.prototype); + +exports.TokenIterator = TokenIterator; +}); + +ace.define('ace/document', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/event_emitter', 'ace/range', 'ace/anchor'], function(require, exports, module) { + + +var oop = require("./lib/oop"); +var EventEmitter = require("./lib/event_emitter").EventEmitter; +var Range = require("./range").Range; +var Anchor = require("./anchor").Anchor; + +var Document = function(text) { + this.$lines = []; + if (text.length == 0) { + this.$lines = [""]; + } else if (Array.isArray(text)) { + this._insertLines(0, text); + } else { + this.insert({row: 0, column:0}, text); + } +}; + +(function() { + + oop.implement(this, EventEmitter); + this.setValue = function(text) { + var len = this.getLength(); + this.remove(new Range(0, 0, len, this.getLine(len-1).length)); + this.insert({row: 0, column:0}, text); + }; + this.getValue = function() { + return this.getAllLines().join(this.getNewLineCharacter()); + }; + this.createAnchor = function(row, column) { + return new Anchor(this, row, column); + }; + if ("aaa".split(/a/).length == 0) + this.$split = function(text) { + return text.replace(/\r\n|\r/g, "\n").split("\n"); + } + else + this.$split = function(text) { + return text.split(/\r\n|\r|\n/); + }; + + + this.$detectNewLine = function(text) { + var match = text.match(/^.*?(\r\n|\r|\n)/m); + this.$autoNewLine = match ? match[1] : "\n"; + }; + this.getNewLineCharacter = function() { + switch (this.$newLineMode) { + case "windows": + return "\r\n"; + case "unix": + return "\n"; + default: + return this.$autoNewLine; + } + }; + + this.$autoNewLine = "\n"; + this.$newLineMode = "auto"; + this.setNewLineMode = function(newLineMode) { + if (this.$newLineMode === newLineMode) + return; + + this.$newLineMode = newLineMode; + }; + this.getNewLineMode = function() { + return this.$newLineMode; + }; + this.isNewLine = function(text) { + return (text == "\r\n" || text == "\r" || text == "\n"); + }; + this.getLine = function(row) { + return this.$lines[row] || ""; + }; + this.getLines = function(firstRow, lastRow) { + return this.$lines.slice(firstRow, lastRow + 1); + }; + this.getAllLines = function() { + return this.getLines(0, this.getLength()); + }; + this.getLength = function() { + return this.$lines.length; + }; + this.getTextRange = function(range) { + if (range.start.row == range.end.row) { + return this.$lines[range.start.row] + .substring(range.start.column, range.end.column); + } + var lines = this.getLines(range.start.row, range.end.row); + lines[0] = (lines[0] || "").substring(range.start.column); + var l = lines.length - 1; + if (range.end.row - range.start.row == l) + lines[l] = lines[l].substring(0, range.end.column); + return lines.join(this.getNewLineCharacter()); + }; + + this.$clipPosition = function(position) { + var length = this.getLength(); + if (position.row >= length) { + position.row = Math.max(0, length - 1); + position.column = this.getLine(length-1).length; + } else if (position.row < 0) + position.row = 0; + return position; + }; + this.insert = function(position, text) { + if (!text || text.length === 0) + return position; + + position = this.$clipPosition(position); + if (this.getLength() <= 1) + this.$detectNewLine(text); + + var lines = this.$split(text); + var firstLine = lines.splice(0, 1)[0]; + var lastLine = lines.length == 0 ? null : lines.splice(lines.length - 1, 1)[0]; + + position = this.insertInLine(position, firstLine); + if (lastLine !== null) { + position = this.insertNewLine(position); // terminate first line + position = this._insertLines(position.row, lines); + position = this.insertInLine(position, lastLine || ""); + } + return position; + }; + this.insertLines = function(row, lines) { + if (row >= this.getLength()) + return this.insert({row: row, column: 0}, "\n" + lines.join("\n")); + return this._insertLines(Math.max(row, 0), lines); + }; + this._insertLines = function(row, lines) { + if (lines.length == 0) + return {row: row, column: 0}; + if (lines.length > 0xFFFF) { + var end = this._insertLines(row, lines.slice(0xFFFF)); + lines = lines.slice(0, 0xFFFF); + } + + var args = [row, 0]; + args.push.apply(args, lines); + this.$lines.splice.apply(this.$lines, args); + + var range = new Range(row, 0, row + lines.length, 0); + var delta = { + action: "insertLines", + range: range, + lines: lines + }; + this._emit("change", { data: delta }); + return end || range.end; + }; + this.insertNewLine = function(position) { + position = this.$clipPosition(position); + var line = this.$lines[position.row] || ""; + + this.$lines[position.row] = line.substring(0, position.column); + this.$lines.splice(position.row + 1, 0, line.substring(position.column, line.length)); + + var end = { + row : position.row + 1, + column : 0 + }; + + var delta = { + action: "insertText", + range: Range.fromPoints(position, end), + text: this.getNewLineCharacter() + }; + this._emit("change", { data: delta }); + + return end; + }; + this.insertInLine = function(position, text) { + if (text.length == 0) + return position; + + var line = this.$lines[position.row] || ""; + + this.$lines[position.row] = line.substring(0, position.column) + text + + line.substring(position.column); + + var end = { + row : position.row, + column : position.column + text.length + }; + + var delta = { + action: "insertText", + range: Range.fromPoints(position, end), + text: text + }; + this._emit("change", { data: delta }); + + return end; + }; + this.remove = function(range) { + range.start = this.$clipPosition(range.start); + range.end = this.$clipPosition(range.end); + + if (range.isEmpty()) + return range.start; + + var firstRow = range.start.row; + var lastRow = range.end.row; + + if (range.isMultiLine()) { + var firstFullRow = range.start.column == 0 ? firstRow : firstRow + 1; + var lastFullRow = lastRow - 1; + + if (range.end.column > 0) + this.removeInLine(lastRow, 0, range.end.column); + + if (lastFullRow >= firstFullRow) + this._removeLines(firstFullRow, lastFullRow); + + if (firstFullRow != firstRow) { + this.removeInLine(firstRow, range.start.column, this.getLine(firstRow).length); + this.removeNewLine(range.start.row); + } + } + else { + this.removeInLine(firstRow, range.start.column, range.end.column); + } + return range.start; + }; + this.removeInLine = function(row, startColumn, endColumn) { + if (startColumn == endColumn) + return; + + var range = new Range(row, startColumn, row, endColumn); + var line = this.getLine(row); + var removed = line.substring(startColumn, endColumn); + var newLine = line.substring(0, startColumn) + line.substring(endColumn, line.length); + this.$lines.splice(row, 1, newLine); + + var delta = { + action: "removeText", + range: range, + text: removed + }; + this._emit("change", { data: delta }); + return range.start; + }; + this.removeLines = function(firstRow, lastRow) { + if (firstRow < 0 || lastRow >= this.getLength()) + return this.remove(new Range(firstRow, 0, lastRow + 1, 0)); + return this._removeLines(firstRow, lastRow); + }; + + this._removeLines = function(firstRow, lastRow) { + var range = new Range(firstRow, 0, lastRow + 1, 0); + var removed = this.$lines.splice(firstRow, lastRow - firstRow + 1); + + var delta = { + action: "removeLines", + range: range, + nl: this.getNewLineCharacter(), + lines: removed + }; + this._emit("change", { data: delta }); + return removed; + }; + this.removeNewLine = function(row) { + var firstLine = this.getLine(row); + var secondLine = this.getLine(row+1); + + var range = new Range(row, firstLine.length, row+1, 0); + var line = firstLine + secondLine; + + this.$lines.splice(row, 2, line); + + var delta = { + action: "removeText", + range: range, + text: this.getNewLineCharacter() + }; + this._emit("change", { data: delta }); + }; + this.replace = function(range, text) { + if (text.length == 0 && range.isEmpty()) + return range.start; + if (text == this.getTextRange(range)) + return range.end; + + this.remove(range); + if (text) { + var end = this.insert(range.start, text); + } + else { + end = range.start; + } + + return end; + }; + this.applyDeltas = function(deltas) { + for (var i=0; i=0; i--) { + var delta = deltas[i]; + + var range = Range.fromPoints(delta.range.start, delta.range.end); + + if (delta.action == "insertLines") + this._removeLines(range.start.row, range.end.row - 1); + else if (delta.action == "insertText") + this.remove(range); + else if (delta.action == "removeLines") + this._insertLines(range.start.row, delta.lines); + else if (delta.action == "removeText") + this.insert(range.start, delta.text); + } + }; + this.indexToPosition = function(index, startRow) { + var lines = this.$lines || this.getAllLines(); + var newlineLength = this.getNewLineCharacter().length; + for (var i = startRow || 0, l = lines.length; i < l; i++) { + index -= lines[i].length + newlineLength; + if (index < 0) + return {row: i, column: index + lines[i].length + newlineLength}; + } + return {row: l-1, column: lines[l-1].length}; + }; + this.positionToIndex = function(pos, startRow) { + var lines = this.$lines || this.getAllLines(); + var newlineLength = this.getNewLineCharacter().length; + var index = 0; + var row = Math.min(pos.row, lines.length); + for (var i = startRow || 0; i < row; ++i) + index += lines[i].length + newlineLength; + + return index + pos.column; + }; + +}).call(Document.prototype); + +exports.Document = Document; +}); + +ace.define('ace/anchor', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/event_emitter'], function(require, exports, module) { + + +var oop = require("./lib/oop"); +var EventEmitter = require("./lib/event_emitter").EventEmitter; + +var Anchor = exports.Anchor = function(doc, row, column) { + this.document = doc; + + if (typeof column == "undefined") + this.setPosition(row.row, row.column); + else + this.setPosition(row, column); + + this.$onChange = this.onChange.bind(this); + doc.on("change", this.$onChange); +}; + +(function() { + + oop.implement(this, EventEmitter); + + this.getPosition = function() { + return this.$clipPositionToDocument(this.row, this.column); + }; + + this.getDocument = function() { + return this.document; + }; + + this.onChange = function(e) { + var delta = e.data; + var range = delta.range; + + if (range.start.row == range.end.row && range.start.row != this.row) + return; + + if (range.start.row > this.row) + return; + + if (range.start.row == this.row && range.start.column > this.column) + return; + + var row = this.row; + var column = this.column; + var start = range.start; + var end = range.end; + + if (delta.action === "insertText") { + if (start.row === row && start.column <= column) { + if (start.row === end.row) { + column += end.column - start.column; + } else { + column -= start.column; + row += end.row - start.row; + } + } else if (start.row !== end.row && start.row < row) { + row += end.row - start.row; + } + } else if (delta.action === "insertLines") { + if (start.row <= row) { + row += end.row - start.row; + } + } else if (delta.action === "removeText") { + if (start.row === row && start.column < column) { + if (end.column >= column) + column = start.column; + else + column = Math.max(0, column - (end.column - start.column)); + + } else if (start.row !== end.row && start.row < row) { + if (end.row === row) + column = Math.max(0, column - end.column) + start.column; + row -= (end.row - start.row); + } else if (end.row === row) { + row -= end.row - start.row; + column = Math.max(0, column - end.column) + start.column; + } + } else if (delta.action == "removeLines") { + if (start.row <= row) { + if (end.row <= row) + row -= end.row - start.row; + else { + row = start.row; + column = 0; + } + } + } + + this.setPosition(row, column, true); + }; + + this.setPosition = function(row, column, noClip) { + var pos; + if (noClip) { + pos = { + row: row, + column: column + }; + } else { + pos = this.$clipPositionToDocument(row, column); + } + + if (this.row == pos.row && this.column == pos.column) + return; + + var old = { + row: this.row, + column: this.column + }; + + this.row = pos.row; + this.column = pos.column; + this._emit("change", { + old: old, + value: pos + }); + }; + + this.detach = function() { + this.document.removeEventListener("change", this.$onChange); + }; + this.$clipPositionToDocument = function(row, column) { + var pos = {}; + + if (row >= this.document.getLength()) { + pos.row = Math.max(0, this.document.getLength() - 1); + pos.column = this.document.getLine(pos.row).length; + } + else if (row < 0) { + pos.row = 0; + pos.column = 0; + } + else { + pos.row = row; + pos.column = Math.min(this.document.getLine(pos.row).length, Math.max(0, column)); + } + + if (column < 0) + pos.column = 0; + + return pos; + }; + +}).call(Anchor.prototype); + +}); + +ace.define('ace/background_tokenizer', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/event_emitter'], function(require, exports, module) { + + +var oop = require("./lib/oop"); +var EventEmitter = require("./lib/event_emitter").EventEmitter; + +var BackgroundTokenizer = function(tokenizer, editor) { + this.running = false; + this.lines = []; + this.states = []; + this.currentLine = 0; + this.tokenizer = tokenizer; + + var self = this; + + this.$worker = function() { + if (!self.running) { return; } + + var workerStart = new Date(); + var startLine = self.currentLine; + var doc = self.doc; + + var processedLines = 0; + + var len = doc.getLength(); + while (self.currentLine < len) { + self.$tokenizeRow(self.currentLine); + while (self.lines[self.currentLine]) + self.currentLine++; + processedLines ++; + if ((processedLines % 5 == 0) && (new Date() - workerStart) > 20) { + self.fireUpdateEvent(startLine, self.currentLine-1); + self.running = setTimeout(self.$worker, 20); + return; + } + } + + self.running = false; + + self.fireUpdateEvent(startLine, len - 1); + }; +}; + +(function(){ + + oop.implement(this, EventEmitter); + this.setTokenizer = function(tokenizer) { + this.tokenizer = tokenizer; + this.lines = []; + this.states = []; + + this.start(0); + }; + this.setDocument = function(doc) { + this.doc = doc; + this.lines = []; + this.states = []; + + this.stop(); + }; + this.fireUpdateEvent = function(firstRow, lastRow) { + var data = { + first: firstRow, + last: lastRow + }; + this._emit("update", {data: data}); + }; + this.start = function(startRow) { + this.currentLine = Math.min(startRow || 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.$updateOnChange = function(delta) { + var range = delta.range; + var startRow = range.start.row; + var len = range.end.row - startRow; + + if (len === 0) { + this.lines[startRow] = null; + } else if (delta.action == "removeText" || delta.action == "removeLines") { + this.lines.splice(startRow, len + 1, null); + this.states.splice(startRow, len + 1, null); + } else { + var args = Array(len + 1); + args.unshift(startRow, 1); + this.lines.splice.apply(this.lines, args); + this.states.splice.apply(this.states, args); + } + + this.currentLine = Math.min(startRow, this.currentLine, this.doc.getLength()); + + this.stop(); + this.running = setTimeout(this.$worker, 700); + }; + this.stop = function() { + if (this.running) + clearTimeout(this.running); + this.running = false; + }; + this.getTokens = function(row) { + return this.lines[row] || this.$tokenizeRow(row); + }; + this.getState = function(row) { + if (this.currentLine == row) + this.$tokenizeRow(row); + return this.states[row] || "start"; + }; + + this.$tokenizeRow = function(row) { + var line = this.doc.getLine(row); + var state = this.states[row - 1]; + + var data = this.tokenizer.getLineTokens(line, state, row); + + if (this.states[row] + "" !== data.state + "") { + this.states[row] = data.state; + this.lines[row + 1] = null; + if (this.currentLine > row + 1) + this.currentLine = row + 1; + } else if (this.currentLine == row) { + this.currentLine = row + 1; + } + + return this.lines[row] = data.tokens; + }; + +}).call(BackgroundTokenizer.prototype); + +exports.BackgroundTokenizer = BackgroundTokenizer; +}); + +ace.define('ace/search_highlight', ['require', 'exports', 'module' , 'ace/lib/lang', 'ace/lib/oop', 'ace/range'], function(require, exports, module) { + + +var lang = require("./lib/lang"); +var oop = require("./lib/oop"); +var Range = require("./range").Range; + +var SearchHighlight = function(regExp, clazz, type) { + this.setRegexp(regExp); + this.clazz = clazz; + this.type = type || "text"; +}; + +(function() { + this.MAX_RANGES = 500; + + this.setRegexp = function(regExp) { + if (this.regExp+"" == regExp+"") + return; + this.regExp = regExp; + this.cache = []; + }; + + this.update = function(html, markerLayer, session, config) { + if (!this.regExp) + return; + var start = config.firstRow, end = config.lastRow; + + for (var i = start; i <= end; i++) { + var ranges = this.cache[i]; + if (ranges == null) { + ranges = lang.getMatchOffsets(session.getLine(i), this.regExp); + if (ranges.length > this.MAX_RANGES) + ranges = ranges.slice(0, this.MAX_RANGES); + ranges = ranges.map(function(match) { + return new Range(i, match.offset, i, match.offset + match.length); + }); + this.cache[i] = ranges.length ? ranges : ""; + } + + for (var j = ranges.length; j --; ) { + markerLayer.drawSingleLineMarker( + html, ranges[j].toScreenRange(session), this.clazz, config); + } + } + }; + +}).call(SearchHighlight.prototype); + +exports.SearchHighlight = SearchHighlight; +}); + +ace.define('ace/edit_session/folding', ['require', 'exports', 'module' , 'ace/range', 'ace/edit_session/fold_line', 'ace/edit_session/fold', 'ace/token_iterator'], function(require, exports, module) { + + +var Range = require("../range").Range; +var FoldLine = require("./fold_line").FoldLine; +var Fold = require("./fold").Fold; +var TokenIterator = require("../token_iterator").TokenIterator; + +function Folding() { + this.getFoldAt = function(row, column, side) { + var foldLine = this.getFoldLine(row); + if (!foldLine) + return null; + + var folds = foldLine.folds; + for (var i = 0; i < folds.length; i++) { + var fold = folds[i]; + if (fold.range.contains(row, column)) { + if (side == 1 && fold.range.isEnd(row, column)) { + continue; + } else if (side == -1 && fold.range.isStart(row, column)) { + continue; + } + return fold; + } + } + }; + this.getFoldsInRange = function(range) { + var start = range.start; + var end = range.end; + var foldLines = this.$foldData; + var foundFolds = []; + + start.column += 1; + end.column -= 1; + + for (var i = 0; i < foldLines.length; i++) { + var cmp = foldLines[i].range.compareRange(range); + if (cmp == 2) { + continue; + } + else if (cmp == -2) { + break; + } + + var folds = foldLines[i].folds; + for (var j = 0; j < folds.length; j++) { + var fold = folds[j]; + cmp = fold.range.compareRange(range); + if (cmp == -2) { + break; + } else if (cmp == 2) { + continue; + } else + if (cmp == 42) { + break; + } + foundFolds.push(fold); + } + } + start.column -= 1; + end.column += 1; + + return foundFolds; + }; + this.getAllFolds = function() { + var folds = []; + var foldLines = this.$foldData; + + function addFold(fold) { + folds.push(fold); + } + + for (var i = 0; i < foldLines.length; i++) + for (var j = 0; j < foldLines[i].folds.length; j++) + addFold(foldLines[i].folds[j]); + + return folds; + }; + this.getFoldStringAt = function(row, column, trim, foldLine) { + foldLine = foldLine || this.getFoldLine(row); + if (!foldLine) + return null; + + var lastFold = { + end: { column: 0 } + }; + var str, fold; + for (var i = 0; i < foldLine.folds.length; i++) { + fold = foldLine.folds[i]; + var cmp = fold.range.compareEnd(row, column); + if (cmp == -1) { + str = this + .getLine(fold.start.row) + .substring(lastFold.end.column, fold.start.column); + break; + } + else if (cmp === 0) { + return null; + } + lastFold = fold; + } + if (!str) + str = this.getLine(fold.start.row).substring(lastFold.end.column); + + if (trim == -1) + return str.substring(0, column - lastFold.end.column); + else if (trim == 1) + return str.substring(column - lastFold.end.column); + else + return str; + }; + + this.getFoldLine = function(docRow, startFoldLine) { + var foldData = this.$foldData; + var i = 0; + if (startFoldLine) + i = foldData.indexOf(startFoldLine); + if (i == -1) + i = 0; + for (i; i < foldData.length; i++) { + var foldLine = foldData[i]; + if (foldLine.start.row <= docRow && foldLine.end.row >= docRow) { + return foldLine; + } else if (foldLine.end.row > docRow) { + return null; + } + } + return null; + }; + this.getNextFoldLine = function(docRow, startFoldLine) { + var foldData = this.$foldData; + var i = 0; + if (startFoldLine) + i = foldData.indexOf(startFoldLine); + if (i == -1) + i = 0; + for (i; i < foldData.length; i++) { + var foldLine = foldData[i]; + if (foldLine.end.row >= docRow) { + return foldLine; + } + } + return null; + }; + + this.getFoldedRowCount = function(first, last) { + var foldData = this.$foldData, rowCount = last-first+1; + for (var i = 0; i < foldData.length; i++) { + var foldLine = foldData[i], + end = foldLine.end.row, + start = foldLine.start.row; + if (end >= last) { + if(start < last) { + if(start >= first) + rowCount -= last-start; + else + rowCount = 0;//in one fold + } + break; + } else if(end >= first){ + if (start >= first) //fold inside range + rowCount -= end-start; + else + rowCount -= end-first+1; + } + } + return rowCount; + }; + + this.$addFoldLine = function(foldLine) { + this.$foldData.push(foldLine); + this.$foldData.sort(function(a, b) { + return a.start.row - b.start.row; + }); + return foldLine; + }; + this.addFold = function(placeholder, range) { + var foldData = this.$foldData; + var added = false; + var fold; + + if (placeholder instanceof Fold) + fold = placeholder; + else { + fold = new Fold(range, placeholder); + fold.collapseChildren = range.collapseChildren; + } + this.$clipRangeToDocument(fold.range); + + var startRow = fold.start.row; + var startColumn = fold.start.column; + var endRow = fold.end.row; + var endColumn = fold.end.column; + if (startRow == endRow && endColumn - startColumn < 2) + throw "The range has to be at least 2 characters width"; + + var startFold = this.getFoldAt(startRow, startColumn, 1); + var endFold = this.getFoldAt(endRow, endColumn, -1); + if (startFold && endFold == startFold) + return startFold.addSubFold(fold); + + if ( + (startFold && !startFold.range.isStart(startRow, startColumn)) + || (endFold && !endFold.range.isEnd(endRow, endColumn)) + ) { + throw "A fold can't intersect already existing fold" + fold.range + startFold.range; + } + var folds = this.getFoldsInRange(fold.range); + if (folds.length > 0) { + this.removeFolds(folds); + folds.forEach(function(subFold) { + fold.addSubFold(subFold); + }); + } + + for (var i = 0; i < foldData.length; i++) { + var foldLine = foldData[i]; + if (endRow == foldLine.start.row) { + foldLine.addFold(fold); + added = true; + break; + } else if (startRow == foldLine.end.row) { + foldLine.addFold(fold); + added = true; + if (!fold.sameRow) { + var foldLineNext = foldData[i + 1]; + if (foldLineNext && foldLineNext.start.row == endRow) { + foldLine.merge(foldLineNext); + break; + } + } + break; + } else if (endRow <= foldLine.start.row) { + break; + } + } + + if (!added) + foldLine = this.$addFoldLine(new FoldLine(this.$foldData, fold)); + + if (this.$useWrapMode) + this.$updateWrapData(foldLine.start.row, foldLine.start.row); + else + this.$updateRowLengthCache(foldLine.start.row, foldLine.start.row); + this.$modified = true; + this._emit("changeFold", { data: fold, action: "add" }); + + return fold; + }; + + this.addFolds = function(folds) { + folds.forEach(function(fold) { + this.addFold(fold); + }, this); + }; + + this.removeFold = function(fold) { + var foldLine = fold.foldLine; + var startRow = foldLine.start.row; + var endRow = foldLine.end.row; + + var foldLines = this.$foldData; + var folds = foldLine.folds; + if (folds.length == 1) { + foldLines.splice(foldLines.indexOf(foldLine), 1); + } else + if (foldLine.range.isEnd(fold.end.row, fold.end.column)) { + folds.pop(); + foldLine.end.row = folds[folds.length - 1].end.row; + foldLine.end.column = folds[folds.length - 1].end.column; + } else + if (foldLine.range.isStart(fold.start.row, fold.start.column)) { + folds.shift(); + foldLine.start.row = folds[0].start.row; + foldLine.start.column = folds[0].start.column; + } else + if (fold.sameRow) { + folds.splice(folds.indexOf(fold), 1); + } else + { + var newFoldLine = foldLine.split(fold.start.row, fold.start.column); + folds = newFoldLine.folds; + folds.shift(); + newFoldLine.start.row = folds[0].start.row; + newFoldLine.start.column = folds[0].start.column; + } + + if (!this.$updating) { + if (this.$useWrapMode) + this.$updateWrapData(startRow, endRow); + else + this.$updateRowLengthCache(startRow, endRow); + } + this.$modified = true; + this._emit("changeFold", { data: fold, action: "remove" }); + }; + + this.removeFolds = function(folds) { + var cloneFolds = []; + for (var i = 0; i < folds.length; i++) { + cloneFolds.push(folds[i]); + } + + cloneFolds.forEach(function(fold) { + this.removeFold(fold); + }, this); + this.$modified = true; + }; + + this.expandFold = function(fold) { + this.removeFold(fold); + fold.subFolds.forEach(function(subFold) { + fold.restoreRange(subFold); + this.addFold(subFold); + }, this); + if (fold.collapseChildren > 0) { + this.foldAll(fold.start.row+1, fold.end.row, fold.collapseChildren-1); + } + fold.subFolds = []; + }; + + this.expandFolds = function(folds) { + folds.forEach(function(fold) { + this.expandFold(fold); + }, this); + }; + + this.unfold = function(location, expandInner) { + var range, folds; + if (location == null) { + range = new Range(0, 0, this.getLength(), 0); + expandInner = true; + } else if (typeof location == "number") + range = new Range(location, 0, location, this.getLine(location).length); + else if ("row" in location) + range = Range.fromPoints(location, location); + else + range = location; + + folds = this.getFoldsInRange(range); + if (expandInner) { + this.removeFolds(folds); + } else { + while (folds.length) { + this.expandFolds(folds); + folds = this.getFoldsInRange(range); + } + } + }; + this.isRowFolded = function(docRow, startFoldRow) { + return !!this.getFoldLine(docRow, startFoldRow); + }; + + this.getRowFoldEnd = function(docRow, startFoldRow) { + var foldLine = this.getFoldLine(docRow, startFoldRow); + return foldLine ? foldLine.end.row : docRow; + }; + + this.getRowFoldStart = function(docRow, startFoldRow) { + var foldLine = this.getFoldLine(docRow, startFoldRow); + return foldLine ? foldLine.start.row : docRow; + }; + + this.getFoldDisplayLine = function(foldLine, endRow, endColumn, startRow, startColumn) { + if (startRow == null) { + startRow = foldLine.start.row; + startColumn = 0; + } + + if (endRow == null) { + endRow = foldLine.end.row; + endColumn = this.getLine(endRow).length; + } + var doc = this.doc; + var textLine = ""; + + foldLine.walk(function(placeholder, row, column, lastColumn) { + if (row < startRow) + return; + if (row == startRow) { + if (column < startColumn) + return; + lastColumn = Math.max(startColumn, lastColumn); + } + + if (placeholder != null) { + textLine += placeholder; + } else { + textLine += doc.getLine(row).substring(lastColumn, column); + } + }, endRow, endColumn); + return textLine; + }; + + this.getDisplayLine = function(row, endColumn, startRow, startColumn) { + var foldLine = this.getFoldLine(row); + + if (!foldLine) { + var line; + line = this.doc.getLine(row); + return line.substring(startColumn || 0, endColumn || line.length); + } else { + return this.getFoldDisplayLine( + foldLine, row, endColumn, startRow, startColumn); + } + }; + + this.$cloneFoldData = function() { + var fd = []; + fd = this.$foldData.map(function(foldLine) { + var folds = foldLine.folds.map(function(fold) { + return fold.clone(); + }); + return new FoldLine(fd, folds); + }); + + return fd; + }; + + this.toggleFold = function(tryToUnfold) { + var selection = this.selection; + var range = selection.getRange(); + var fold; + var bracketPos; + + if (range.isEmpty()) { + var cursor = range.start; + fold = this.getFoldAt(cursor.row, cursor.column); + + if (fold) { + this.expandFold(fold); + return; + } else if (bracketPos = this.findMatchingBracket(cursor)) { + if (range.comparePoint(bracketPos) == 1) { + range.end = bracketPos; + } else { + range.start = bracketPos; + range.start.column++; + range.end.column--; + } + } else if (bracketPos = this.findMatchingBracket({row: cursor.row, column: cursor.column + 1})) { + if (range.comparePoint(bracketPos) == 1) + range.end = bracketPos; + else + range.start = bracketPos; + + range.start.column++; + } else { + range = this.getCommentFoldRange(cursor.row, cursor.column) || range; + } + } else { + var folds = this.getFoldsInRange(range); + if (tryToUnfold && folds.length) { + this.expandFolds(folds); + return; + } else if (folds.length == 1 ) { + fold = folds[0]; + } + } + + if (!fold) + fold = this.getFoldAt(range.start.row, range.start.column); + + if (fold && fold.range.toString() == range.toString()) { + this.expandFold(fold); + return; + } + + var placeholder = "..."; + if (!range.isMultiLine()) { + placeholder = this.getTextRange(range); + if(placeholder.length < 4) + return; + placeholder = placeholder.trim().substring(0, 2) + ".."; + } + + this.addFold(placeholder, range); + }; + + this.getCommentFoldRange = function(row, column, dir) { + var iterator = new TokenIterator(this, row, column); + var token = iterator.getCurrentToken(); + if (token && /^comment|string/.test(token.type)) { + var range = new Range(); + var re = new RegExp(token.type.replace(/\..*/, "\\.")); + if (dir != 1) { + do { + token = iterator.stepBackward(); + } while(token && re.test(token.type)); + iterator.stepForward(); + } + + range.start.row = iterator.getCurrentTokenRow(); + range.start.column = iterator.getCurrentTokenColumn() + 2; + + iterator = new TokenIterator(this, row, column); + + if (dir != -1) { + do { + token = iterator.stepForward(); + } while(token && re.test(token.type)); + token = iterator.stepBackward(); + } else + token = iterator.getCurrentToken(); + + range.end.row = iterator.getCurrentTokenRow(); + range.end.column = iterator.getCurrentTokenColumn() + token.value.length - 2; + return range; + } + }; + + this.foldAll = function(startRow, endRow, depth) { + if (depth == undefined) + depth = 100000; // JSON.stringify doesn't hanle Infinity + var foldWidgets = this.foldWidgets; + endRow = endRow || this.getLength(); + for (var row = startRow || 0; row < endRow; row++) { + if (foldWidgets[row] == null) + foldWidgets[row] = this.getFoldWidget(row); + if (foldWidgets[row] != "start") + continue; + + var range = this.getFoldWidgetRange(row); + if (range && range.end.row <= endRow) try { + var fold = this.addFold("...", range); + fold.collapseChildren = depth; + } catch(e) {} + row = range.end.row; + } + }; + this.$foldStyles = { + "manual": 1, + "markbegin": 1, + "markbeginend": 1 + }; + this.$foldStyle = "markbegin"; + this.setFoldStyle = function(style) { + if (!this.$foldStyles[style]) + throw new Error("invalid fold style: " + style + "[" + Object.keys(this.$foldStyles).join(", ") + "]"); + + if (this.$foldStyle == style) + return; + + this.$foldStyle = style; + + if (style == "manual") + this.unfold(); + var mode = this.$foldMode; + this.$setFolding(null); + this.$setFolding(mode); + }; + + this.$setFolding = function(foldMode) { + if (this.$foldMode == foldMode) + return; + + this.$foldMode = foldMode; + + this.removeListener('change', this.$updateFoldWidgets); + this._emit("changeAnnotation"); + + if (!foldMode || this.$foldStyle == "manual") { + this.foldWidgets = null; + return; + } + + this.foldWidgets = []; + this.getFoldWidget = foldMode.getFoldWidget.bind(foldMode, this, this.$foldStyle); + this.getFoldWidgetRange = foldMode.getFoldWidgetRange.bind(foldMode, this, this.$foldStyle); + + this.$updateFoldWidgets = this.updateFoldWidgets.bind(this); + this.on('change', this.$updateFoldWidgets); + + }; + + this.getParentFoldRangeData = function (row, ignoreCurrent) { + var fw = this.foldWidgets; + if (!fw || (ignoreCurrent && fw[row])) + return {}; + + var i = row - 1, firstRange; + while (i >= 0) { + var c = fw[i]; + if (c == null) + c = fw[i] = this.getFoldWidget(i); + + if (c == "start") { + var range = this.getFoldWidgetRange(i); + if (!firstRange) + firstRange = range; + if (range && range.end.row >= row) + break; + } + i--; + } + + return { + range: i !== -1 && range, + firstRange: firstRange + }; + } + + this.onFoldWidgetClick = function(row, e) { + var type = this.getFoldWidget(row); + var line = this.getLine(row); + e = e.domEvent; + var children = e.shiftKey; + var all = e.ctrlKey || e.metaKey; + var siblings = e.altKey; + + var dir = type === "end" ? -1 : 1; + var fold = this.getFoldAt(row, dir === -1 ? 0 : line.length, dir); + + if (fold) { + if (children || all) + this.removeFold(fold); + else + this.expandFold(fold); + return; + } + + var range = this.getFoldWidgetRange(row); + if (range && !range.isMultiLine()) { + fold = this.getFoldAt(range.start.row, range.start.column, 1); + if (fold && range.isEqual(fold.range)) { + this.removeFold(fold); + return; + } + } + + if (siblings) { + var data = this.getParentFoldRangeData(row); + if (data.range) { + var startRow = data.range.start.row + 1; + var endRow = data.range.end.row; + } + this.foldAll(startRow, endRow, all ? 10000 : 0); + } else if (children) { + var endRow = range ? range.end.row : this.getLength(); + this.foldAll(row + 1, range.end.row, all ? 10000 : 0); + } else if (range) { + if (all) + range.collapseChildren = 10000; + this.addFold("...", range); + } + + if (!range) + (e.target || e.srcElement).className += " ace_invalid" + }; + + this.updateFoldWidgets = function(e) { + var delta = e.data; + var range = delta.range; + var firstRow = range.start.row; + var len = range.end.row - firstRow; + + if (len === 0) { + this.foldWidgets[firstRow] = null; + } else if (delta.action == "removeText" || delta.action == "removeLines") { + this.foldWidgets.splice(firstRow, len + 1, null); + } else { + var args = Array(len + 1); + args.unshift(firstRow, 1); + this.foldWidgets.splice.apply(this.foldWidgets, args); + } + }; + +} + +exports.Folding = Folding; + +}); + +ace.define('ace/edit_session/fold_line', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) { + + +var Range = require("../range").Range; +function FoldLine(foldData, folds) { + this.foldData = foldData; + if (Array.isArray(folds)) { + this.folds = folds; + } else { + folds = this.folds = [ folds ]; + } + + var last = folds[folds.length - 1] + this.range = new Range(folds[0].start.row, folds[0].start.column, + last.end.row, last.end.column); + this.start = this.range.start; + this.end = this.range.end; + + this.folds.forEach(function(fold) { + fold.setFoldLine(this); + }, this); +} + +(function() { + this.shiftRow = function(shift) { + this.start.row += shift; + this.end.row += shift; + this.folds.forEach(function(fold) { + fold.start.row += shift; + fold.end.row += shift; + }); + } + + this.addFold = function(fold) { + if (fold.sameRow) { + if (fold.start.row < this.startRow || fold.endRow > this.endRow) { + throw "Can't add a fold to this FoldLine as it has no connection"; + } + this.folds.push(fold); + this.folds.sort(function(a, b) { + return -a.range.compareEnd(b.start.row, b.start.column); + }); + if (this.range.compareEnd(fold.start.row, fold.start.column) > 0) { + this.end.row = fold.end.row; + this.end.column = fold.end.column; + } else if (this.range.compareStart(fold.end.row, fold.end.column) < 0) { + this.start.row = fold.start.row; + this.start.column = fold.start.column; + } + } else if (fold.start.row == this.end.row) { + this.folds.push(fold); + this.end.row = fold.end.row; + this.end.column = fold.end.column; + } else if (fold.end.row == this.start.row) { + this.folds.unshift(fold); + this.start.row = fold.start.row; + this.start.column = fold.start.column; + } else { + throw "Trying to add fold to FoldRow that doesn't have a matching row"; + } + fold.foldLine = this; + } + + this.containsRow = function(row) { + return row >= this.start.row && row <= this.end.row; + } + + this.walk = function(callback, endRow, endColumn) { + var lastEnd = 0, + folds = this.folds, + fold, + comp, stop, isNewRow = true; + + if (endRow == null) { + endRow = this.end.row; + endColumn = this.end.column; + } + + for (var i = 0; i < folds.length; i++) { + fold = folds[i]; + + comp = fold.range.compareStart(endRow, endColumn); + if (comp == -1) { + callback(null, endRow, endColumn, lastEnd, isNewRow); + return; + } + + stop = callback(null, fold.start.row, fold.start.column, lastEnd, isNewRow); + stop = !stop && callback(fold.placeholder, fold.start.row, fold.start.column, lastEnd); + if (stop || comp == 0) { + return; + } + isNewRow = !fold.sameRow; + lastEnd = fold.end.column; + } + callback(null, endRow, endColumn, lastEnd, isNewRow); + } + + this.getNextFoldTo = function(row, column) { + var fold, cmp; + for (var i = 0; i < this.folds.length; i++) { + fold = this.folds[i]; + cmp = fold.range.compareEnd(row, column); + if (cmp == -1) { + return { + fold: fold, + kind: "after" + }; + } else if (cmp == 0) { + return { + fold: fold, + kind: "inside" + } + } + } + return null; + } + + this.addRemoveChars = function(row, column, len) { + var ret = this.getNextFoldTo(row, column), + fold, folds; + if (ret) { + fold = ret.fold; + if (ret.kind == "inside" + && fold.start.column != column + && fold.start.row != row) + { + window.console && window.console.log(row, column, fold); + } else if (fold.start.row == row) { + folds = this.folds; + var i = folds.indexOf(fold); + if (i == 0) { + this.start.column += len; + } + for (i; i < folds.length; i++) { + fold = folds[i]; + fold.start.column += len; + if (!fold.sameRow) { + return; + } + fold.end.column += len; + } + this.end.column += len; + } + } + } + + this.split = function(row, column) { + var fold = this.getNextFoldTo(row, column).fold; + var folds = this.folds; + var foldData = this.foldData; + + if (!fold) + return null; + + var i = folds.indexOf(fold); + var foldBefore = folds[i - 1]; + this.end.row = foldBefore.end.row; + this.end.column = foldBefore.end.column; + folds = folds.splice(i, folds.length - i); + + var newFoldLine = new FoldLine(foldData, folds); + foldData.splice(foldData.indexOf(this) + 1, 0, newFoldLine); + return newFoldLine; + } + + this.merge = function(foldLineNext) { + var folds = foldLineNext.folds; + for (var i = 0; i < folds.length; i++) { + this.addFold(folds[i]); + } + var foldData = this.foldData; + foldData.splice(foldData.indexOf(foldLineNext), 1); + } + + this.toString = function() { + var ret = [this.range.toString() + ": [" ]; + + this.folds.forEach(function(fold) { + ret.push(" " + fold.toString()); + }); + ret.push("]") + return ret.join("\n"); + } + + this.idxToPosition = function(idx) { + var lastFoldEndColumn = 0; + var fold; + + for (var i = 0; i < this.folds.length; i++) { + var fold = this.folds[i]; + + idx -= fold.start.column - lastFoldEndColumn; + if (idx < 0) { + return { + row: fold.start.row, + column: fold.start.column + idx + }; + } + + idx -= fold.placeholder.length; + if (idx < 0) { + return fold.start; + } + + lastFoldEndColumn = fold.end.column; + } + + return { + row: this.end.row, + column: this.end.column + idx + }; + } +}).call(FoldLine.prototype); + +exports.FoldLine = FoldLine; +}); + +ace.define('ace/edit_session/fold', ['require', 'exports', 'module' , 'ace/range', 'ace/range_list', 'ace/lib/oop'], function(require, exports, module) { + + +var Range = require("../range").Range; +var RangeList = require("../range_list").RangeList; +var oop = require("../lib/oop") +var Fold = exports.Fold = function(range, placeholder) { + this.foldLine = null; + this.placeholder = placeholder; + this.range = range; + this.start = range.start; + this.end = range.end; + + this.sameRow = range.start.row == range.end.row; + this.subFolds = this.ranges = []; +}; + +oop.inherits(Fold, RangeList); + +(function() { + + this.toString = function() { + return '"' + this.placeholder + '" ' + this.range.toString(); + }; + + this.setFoldLine = function(foldLine) { + this.foldLine = foldLine; + this.subFolds.forEach(function(fold) { + fold.setFoldLine(foldLine); + }); + }; + + this.clone = function() { + var range = this.range.clone(); + var fold = new Fold(range, this.placeholder); + this.subFolds.forEach(function(subFold) { + fold.subFolds.push(subFold.clone()); + }); + fold.collapseChildren = this.collapseChildren; + return fold; + }; + + this.addSubFold = function(fold) { + if (this.range.isEqual(fold)) + return; + + if (!this.range.containsRange(fold)) + throw "A fold can't intersect already existing fold" + fold.range + this.range; + consumeRange(fold, this.start); + + var row = fold.start.row, column = fold.start.column; + for (var i = 0, cmp = -1; i < this.subFolds.length; i++) { + cmp = this.subFolds[i].range.compare(row, column); + if (cmp != 1) + break; + } + var afterStart = this.subFolds[i]; + + if (cmp == 0) + return afterStart.addSubFold(fold); + var row = fold.range.end.row, column = fold.range.end.column; + for (var j = i, cmp = -1; j < this.subFolds.length; j++) { + cmp = this.subFolds[j].range.compare(row, column); + if (cmp != 1) + break; + } + var afterEnd = this.subFolds[j]; + + if (cmp == 0) + throw "A fold can't intersect already existing fold" + fold.range + this.range; + + var consumedFolds = this.subFolds.splice(i, j - i, fold); + fold.setFoldLine(this.foldLine); + + return fold; + }; + + this.restoreRange = function(range) { + return restoreRange(range, this.start); + }; + +}).call(Fold.prototype); + +function consumePoint(point, anchor) { + point.row -= anchor.row; + if (point.row == 0) + point.column -= anchor.column; +} +function consumeRange(range, anchor) { + consumePoint(range.start, anchor); + consumePoint(range.end, anchor); +} +function restorePoint(point, anchor) { + if (point.row == 0) + point.column += anchor.column; + point.row += anchor.row; +} +function restoreRange(range, anchor) { + restorePoint(range.start, anchor); + restorePoint(range.end, anchor); +} + +}); + +ace.define('ace/range_list', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) { + +var Range = require("./range").Range; +var comparePoints = Range.comparePoints; + +var RangeList = function() { + this.ranges = []; +}; + +(function() { + this.comparePoints = comparePoints; + + this.pointIndex = function(pos, excludeEdges, startIndex) { + var list = this.ranges; + + for (var i = startIndex || 0; i < list.length; i++) { + var range = list[i]; + var cmpEnd = comparePoints(pos, range.end); + if (cmpEnd > 0) + continue; + var cmpStart = comparePoints(pos, range.start); + if (cmpEnd === 0) + return excludeEdges && cmpStart !== 0 ? -i-2 : i; + if (cmpStart > 0 || (cmpStart === 0 && !excludeEdges)) + return i; + + return -i-1; + } + return -i - 1; + }; + + this.add = function(range) { + var excludeEdges = !range.isEmpty(); + var startIndex = this.pointIndex(range.start, excludeEdges); + if (startIndex < 0) + startIndex = -startIndex - 1; + + var endIndex = this.pointIndex(range.end, excludeEdges, startIndex); + + if (endIndex < 0) + endIndex = -endIndex - 1; + else + endIndex++; + return this.ranges.splice(startIndex, endIndex - startIndex, range); + }; + + this.addList = function(list) { + var removed = []; + for (var i = list.length; i--; ) { + removed.push.call(removed, this.add(list[i])); + } + return removed; + }; + + this.substractPoint = function(pos) { + var i = this.pointIndex(pos); + + if (i >= 0) + return this.ranges.splice(i, 1); + }; + this.merge = function() { + var removed = []; + var list = this.ranges; + + list = list.sort(function(a, b) { + return comparePoints(a.start, b.start); + }); + + var next = list[0], range; + for (var i = 1; i < list.length; i++) { + range = next; + next = list[i]; + var cmp = comparePoints(range.end, next.start); + if (cmp < 0) + continue; + + if (cmp == 0 && !range.isEmpty() && !next.isEmpty()) + continue; + + if (comparePoints(range.end, next.end) < 0) { + range.end.row = next.end.row; + range.end.column = next.end.column; + } + + list.splice(i, 1); + removed.push(next); + next = range; + i--; + } + + this.ranges = list; + + return removed; + }; + + this.contains = function(row, column) { + return this.pointIndex({row: row, column: column}) >= 0; + }; + + this.containsPoint = function(pos) { + return this.pointIndex(pos) >= 0; + }; + + this.rangeAtPoint = function(pos) { + var i = this.pointIndex(pos); + if (i >= 0) + return this.ranges[i]; + }; + + + this.clipRows = function(startRow, endRow) { + var list = this.ranges; + if (list[0].start.row > endRow || list[list.length - 1].start.row < startRow) + return []; + + var startIndex = this.pointIndex({row: startRow, column: 0}); + if (startIndex < 0) + startIndex = -startIndex - 1; + var endIndex = this.pointIndex({row: endRow, column: 0}, startIndex); + if (endIndex < 0) + endIndex = -endIndex - 1; + + var clipped = []; + for (var i = startIndex; i < endIndex; i++) { + clipped.push(list[i]); + } + return clipped; + }; + + this.removeAll = function() { + return this.ranges.splice(0, this.ranges.length); + }; + + this.attach = function(session) { + if (this.session) + this.detach(); + + this.session = session; + this.onChange = this.$onChange.bind(this); + + this.session.on('change', this.onChange); + }; + + this.detach = function() { + if (!this.session) + return; + this.session.removeListener('change', this.onChange); + this.session = null; + }; + + this.$onChange = function(e) { + var changeRange = e.data.range; + if (e.data.action[0] == "i"){ + var start = changeRange.start; + var end = changeRange.end; + } else { + var end = changeRange.start; + var start = changeRange.end; + } + var startRow = start.row; + var endRow = end.row; + var lineDif = endRow - startRow; + + var colDiff = -start.column + end.column; + var ranges = this.ranges; + + for (var i = 0, n = ranges.length; i < n; i++) { + var r = ranges[i]; + if (r.end.row < startRow) + continue; + if (r.start.row > startRow) + break; + + if (r.start.row == startRow && r.start.column >= start.column ) { + + r.start.column += colDiff; + r.start.row += lineDif; + } + if (r.end.row == startRow && r.end.column >= start.column) { + if (r.end.column == start.column && colDiff > 0 && i < n - 1) { + if (r.end.column > r.start.column && r.end.column == ranges[i+1].start.column) + r.end.column -= colDiff; + } + r.end.column += colDiff; + r.end.row += lineDif; + } + } + + if (lineDif != 0 && i < n) { + for (; i < n; i++) { + var r = ranges[i]; + r.start.row += lineDif; + r.end.row += lineDif; + } + } + }; + +}).call(RangeList.prototype); + +exports.RangeList = RangeList; +}); + +ace.define('ace/edit_session/bracket_match', ['require', 'exports', 'module' , 'ace/token_iterator', 'ace/range'], function(require, exports, module) { + + +var TokenIterator = require("../token_iterator").TokenIterator; +var Range = require("../range").Range; + + +function BracketMatch() { + + this.findMatchingBracket = function(position, chr) { + if (position.column == 0) return null; + + var charBeforeCursor = chr || this.getLine(position.row).charAt(position.column-1); + if (charBeforeCursor == "") return null; + + var match = charBeforeCursor.match(/([\(\[\{])|([\)\]\}])/); + if (!match) + return null; + + if (match[1]) + return this.$findClosingBracket(match[1], position); + else + return this.$findOpeningBracket(match[2], position); + }; + + this.getBracketRange = function(pos) { + var line = this.getLine(pos.row); + var before = true, range; + + var chr = line.charAt(pos.column-1); + var match = chr && chr.match(/([\(\[\{])|([\)\]\}])/); + if (!match) { + chr = line.charAt(pos.column); + pos = {row: pos.row, column: pos.column + 1}; + match = chr && chr.match(/([\(\[\{])|([\)\]\}])/); + before = false; + } + if (!match) + return null; + + if (match[1]) { + var bracketPos = this.$findClosingBracket(match[1], pos); + if (!bracketPos) + return null; + range = Range.fromPoints(pos, bracketPos); + if (!before) { + range.end.column++; + range.start.column--; + } + range.cursor = range.end; + } else { + var bracketPos = this.$findOpeningBracket(match[2], pos); + if (!bracketPos) + return null; + range = Range.fromPoints(bracketPos, pos); + if (!before) { + range.start.column++; + range.end.column--; + } + range.cursor = range.start; + } + + return range; + }; + + this.$brackets = { + ")": "(", + "(": ")", + "]": "[", + "[": "]", + "{": "}", + "}": "{" + }; + + this.$findOpeningBracket = function(bracket, position, typeRe) { + var openBracket = this.$brackets[bracket]; + var depth = 1; + + var iterator = new TokenIterator(this, position.row, position.column); + var token = iterator.getCurrentToken(); + if (!token) + token = iterator.stepForward(); + if (!token) + return; + + if (!typeRe){ + typeRe = new RegExp( + "(\\.?" + + token.type.replace(".", "\\.").replace("rparen", ".paren") + + ")+" + ); + } + var valueIndex = position.column - iterator.getCurrentTokenColumn() - 2; + var value = token.value; + + while (true) { + + while (valueIndex >= 0) { + var chr = value.charAt(valueIndex); + if (chr == openBracket) { + depth -= 1; + if (depth == 0) { + return {row: iterator.getCurrentTokenRow(), + column: valueIndex + iterator.getCurrentTokenColumn()}; + } + } + else if (chr == bracket) { + depth += 1; + } + valueIndex -= 1; + } + do { + token = iterator.stepBackward(); + } while (token && !typeRe.test(token.type)); + + if (token == null) + break; + + value = token.value; + valueIndex = value.length - 1; + } + + return null; + }; + + this.$findClosingBracket = function(bracket, position, typeRe) { + var closingBracket = this.$brackets[bracket]; + var depth = 1; + + var iterator = new TokenIterator(this, position.row, position.column); + var token = iterator.getCurrentToken(); + if (!token) + token = iterator.stepForward(); + if (!token) + return; + + if (!typeRe){ + typeRe = new RegExp( + "(\\.?" + + token.type.replace(".", "\\.").replace("lparen", ".paren") + + ")+" + ); + } + var valueIndex = position.column - iterator.getCurrentTokenColumn(); + + while (true) { + + var value = token.value; + var valueLength = value.length; + while (valueIndex < valueLength) { + var chr = value.charAt(valueIndex); + if (chr == closingBracket) { + depth -= 1; + if (depth == 0) { + return {row: iterator.getCurrentTokenRow(), + column: valueIndex + iterator.getCurrentTokenColumn()}; + } + } + else if (chr == bracket) { + depth += 1; + } + valueIndex += 1; + } + do { + token = iterator.stepForward(); + } while (token && !typeRe.test(token.type)); + + if (token == null) + break; + + valueIndex = 0; + } + + return null; + }; +} +exports.BracketMatch = BracketMatch; + +}); + +ace.define('ace/search', ['require', 'exports', 'module' , 'ace/lib/lang', 'ace/lib/oop', 'ace/range'], function(require, exports, module) { + + +var lang = require("./lib/lang"); +var oop = require("./lib/oop"); +var Range = require("./range").Range; + +var Search = function() { + this.$options = {}; +}; + +(function() { + this.set = function(options) { + oop.mixin(this.$options, options); + return this; + }; + this.getOptions = function() { + return lang.copyObject(this.$options); + }; + this.setOptions = function(options) { + this.$options = options; + }; + this.find = function(session) { + var iterator = this.$matchIterator(session, this.$options); + + if (!iterator) + return false; + + var firstRange = null; + iterator.forEach(function(range, row, offset) { + if (!range.start) { + var column = range.offset + (offset || 0); + firstRange = new Range(row, column, row, column+range.length); + } else + firstRange = range; + return true; + }); + + return firstRange; + }; + this.findAll = function(session) { + var options = this.$options; + if (!options.needle) + return []; + this.$assembleRegExp(options); + + var range = options.range; + var lines = range + ? session.getLines(range.start.row, range.end.row) + : session.doc.getAllLines(); + + var ranges = []; + var re = options.re; + if (options.$isMultiLine) { + var len = re.length; + var maxRow = lines.length - len; + for (var row = re.offset || 0; row <= maxRow; row++) { + for (var j = 0; j < len; j++) + if (lines[row + j].search(re[j]) == -1) + break; + + var startLine = lines[row]; + var line = lines[row + len - 1]; + var startIndex = startLine.match(re[0])[0].length; + var endIndex = line.match(re[len - 1])[0].length; + + ranges.push(new Range( + row, startLine.length - startIndex, + row + len - 1, endIndex + )); + } + } else { + for (var i = 0; i < lines.length; i++) { + var matches = lang.getMatchOffsets(lines[i], re); + for (var j = 0; j < matches.length; j++) { + var match = matches[j]; + ranges.push(new Range(i, match.offset, i, match.offset + match.length)); + } + } + } + + if (range) { + var startColumn = range.start.column; + var endColumn = range.start.column; + var i = 0, j = ranges.length - 1; + while (i < j && ranges[i].start.column < startColumn && ranges[i].start.row == range.start.row) + i++; + + while (i < j && ranges[j].end.column > endColumn && ranges[j].end.row == range.end.row) + j--; + + ranges = ranges.slice(i, j + 1); + for (i = 0, j = ranges.length; i < j; i++) { + ranges[i].start.row += range.start.row; + ranges[i].end.row += range.start.row; + } + } + + return ranges; + }; + this.replace = function(input, replacement) { + var options = this.$options; + + var re = this.$assembleRegExp(options); + if (options.$isMultiLine) + return replacement; + + if (!re) + return; + + var match = re.exec(input); + if (!match || match[0].length != input.length) + return null; + + replacement = input.replace(re, replacement); + if (options.preserveCase) { + replacement = replacement.split(""); + for (var i = Math.min(input.length, input.length); i--; ) { + var ch = input[i]; + if (ch && ch.toLowerCase() != ch) + replacement[i] = replacement[i].toUpperCase(); + else + replacement[i] = replacement[i].toLowerCase(); + } + replacement = replacement.join(""); + } + + return replacement; + }; + + this.$matchIterator = function(session, options) { + var re = this.$assembleRegExp(options); + if (!re) + return false; + + var self = this, callback, backwards = options.backwards; + + if (options.$isMultiLine) { + var len = re.length; + var matchIterator = function(line, row, offset) { + var startIndex = line.search(re[0]); + if (startIndex == -1) + return; + for (var i = 1; i < len; i++) { + line = session.getLine(row + i); + if (line.search(re[i]) == -1) + return; + } + + var endIndex = line.match(re[len - 1])[0].length; + + var range = new Range(row, startIndex, row + len - 1, endIndex); + if (re.offset == 1) { + range.start.row--; + range.start.column = Number.MAX_VALUE; + } else if (offset) + range.start.column += offset; + + if (callback(range)) + return true; + }; + } else if (backwards) { + var matchIterator = function(line, row, startIndex) { + var matches = lang.getMatchOffsets(line, re); + for (var i = matches.length-1; i >= 0; i--) + if (callback(matches[i], row, startIndex)) + return true; + }; + } else { + var matchIterator = function(line, row, startIndex) { + var matches = lang.getMatchOffsets(line, re); + for (var i = 0; i < matches.length; i++) + if (callback(matches[i], row, startIndex)) + return true; + }; + } + + return { + forEach: function(_callback) { + callback = _callback; + self.$lineIterator(session, options).forEach(matchIterator); + } + }; + }; + + this.$assembleRegExp = function(options, $disableFakeMultiline) { + if (options.needle instanceof RegExp) + return options.re = options.needle; + + var needle = options.needle; + + if (!options.needle) + return options.re = false; + + if (!options.regExp) + needle = lang.escapeRegExp(needle); + + if (options.wholeWord) + needle = "\\b" + needle + "\\b"; + + var modifier = options.caseSensitive ? "g" : "gi"; + + options.$isMultiLine = !$disableFakeMultiline && /[\n\r]/.test(needle); + if (options.$isMultiLine) + return options.re = this.$assembleMultilineRegExp(needle, modifier); + + try { + var re = new RegExp(needle, modifier); + } catch(e) { + re = false; + } + return options.re = re; + }; + + this.$assembleMultilineRegExp = function(needle, modifier) { + var parts = needle.replace(/\r\n|\r|\n/g, "$\n^").split("\n"); + var re = []; + for (var i = 0; i < parts.length; i++) try { + re.push(new RegExp(parts[i], modifier)); + } catch(e) { + return false; + } + if (parts[0] == "") { + re.shift(); + re.offset = 1; + } else { + re.offset = 0; + } + return re; + }; + + this.$lineIterator = function(session, options) { + var backwards = options.backwards == true; + var skipCurrent = options.skipCurrent != false; + + var range = options.range; + var start = options.start; + if (!start) + start = range ? range[backwards ? "end" : "start"] : session.selection.getRange(); + + if (start.start) + start = start[skipCurrent != backwards ? "end" : "start"]; + + var firstRow = range ? range.start.row : 0; + var lastRow = range ? range.end.row : session.getLength() - 1; + + var forEach = backwards ? function(callback) { + var row = start.row; + + var line = session.getLine(row).substring(0, start.column); + if (callback(line, row)) + return; + + for (row--; row >= firstRow; row--) + if (callback(session.getLine(row), row)) + return; + + if (options.wrap == false) + return; + + for (row = lastRow, firstRow = start.row; row >= firstRow; row--) + if (callback(session.getLine(row), row)) + return; + } : function(callback) { + var row = start.row; + + var line = session.getLine(row).substr(start.column); + if (callback(line, row, start.column)) + return; + + for (row = row+1; row <= lastRow; row++) + if (callback(session.getLine(row), row)) + return; + + if (options.wrap == false) + return; + + for (row = firstRow, lastRow = start.row; row <= lastRow; row++) + if (callback(session.getLine(row), row)) + return; + }; + + return {forEach: forEach}; + }; + +}).call(Search.prototype); + +exports.Search = Search; +}); +ace.define('ace/commands/command_manager', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/keyboard/hash_handler', 'ace/lib/event_emitter'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var HashHandler = require("../keyboard/hash_handler").HashHandler; +var EventEmitter = require("../lib/event_emitter").EventEmitter; + +var CommandManager = function(platform, commands) { + this.platform = platform; + this.commands = this.byName = {}; + this.commmandKeyBinding = {}; + + this.addCommands(commands); + + this.setDefaultHandler("exec", function(e) { + return e.command.exec(e.editor, e.args || {}); + }); +}; + +oop.inherits(CommandManager, HashHandler); + +(function() { + + oop.implement(this, EventEmitter); + + this.exec = function(command, editor, args) { + if (typeof command === 'string') + command = this.commands[command]; + + if (!command) + return false; + + if (editor && editor.$readOnly && !command.readOnly) + return false; + + var e = {editor: editor, command: command, args: args}; + var retvalue = this._emit("exec", e); + this._signal("afterExec", e); + + return retvalue === false ? false : true; + }; + + this.toggleRecording = function(editor) { + if (this.$inReplay) + return; + + editor && editor._emit("changeStatus"); + if (this.recording) { + this.macro.pop(); + this.removeEventListener("exec", this.$addCommandToMacro); + + if (!this.macro.length) + this.macro = this.oldMacro; + + return this.recording = false; + } + if (!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); + return this.recording = true; + }; + + this.replay = function(editor) { + if (this.$inReplay || !this.macro) + return; + + if (this.recording) + return this.toggleRecording(editor); + + try { + this.$inReplay = true; + this.macro.forEach(function(x) { + if (typeof x == "string") + this.exec(x, editor); + else + this.exec(x[0], editor, x[1]); + }, this); + } finally { + this.$inReplay = false; + } + }; + + this.trimMacro = function(m) { + return m.map(function(x){ + if (typeof x[0] != "string") + x[0] = x[0].name; + if (!x[1]) + x = x[0]; + return x; + }); + }; + +}).call(CommandManager.prototype); + +exports.CommandManager = CommandManager; + +}); + +ace.define('ace/keyboard/hash_handler', ['require', 'exports', 'module' , 'ace/lib/keys', 'ace/lib/useragent'], function(require, exports, module) { + + +var keyUtil = require("../lib/keys"); +var useragent = require("../lib/useragent"); + +function HashHandler(config, platform) { + this.platform = platform || (useragent.isMac ? "mac" : "win"); + this.commands = {}; + this.commmandKeyBinding = {}; + + this.addCommands(config); +}; + +(function() { + + this.addCommand = function(command) { + if (this.commands[command.name]) + this.removeCommand(command); + + this.commands[command.name] = command; + + if (command.bindKey) + this._buildKeyHash(command); + }; + + this.removeCommand = function(command) { + var name = (typeof command === 'string' ? command : command.name); + command = this.commands[name]; + delete this.commands[name]; + var ckb = this.commmandKeyBinding; + for (var hashId in ckb) { + for (var key in ckb[hashId]) { + if (ckb[hashId][key] == command) + delete ckb[hashId][key]; + } + } + }; + + this.bindKey = function(key, command) { + if(!key) + return; + if (typeof command == "function") { + this.addCommand({exec: command, bindKey: key, name: command.name || key}); + return; + } + + var ckb = this.commmandKeyBinding; + key.split("|").forEach(function(keyPart) { + var binding = this.parseKeys(keyPart, command); + var hashId = binding.hashId; + (ckb[hashId] || (ckb[hashId] = {}))[binding.key] = command; + }, this); + }; + + this.addCommands = function(commands) { + commands && Object.keys(commands).forEach(function(name) { + var command = commands[name]; + if (typeof command === "string") + return this.bindKey(command, name); + + if (typeof command === "function") + command = { exec: command }; + + if (!command.name) + command.name = name; + + this.addCommand(command); + }, this); + }; + + this.removeCommands = function(commands) { + Object.keys(commands).forEach(function(name) { + this.removeCommand(commands[name]); + }, this); + }; + + this.bindKeys = function(keyList) { + Object.keys(keyList).forEach(function(key) { + this.bindKey(key, keyList[key]); + }, this); + }; + + this._buildKeyHash = function(command) { + var binding = command.bindKey; + if (!binding) + return; + + var key = typeof binding == "string" ? binding: binding[this.platform]; + this.bindKey(key, command); + }; + this.parseKeys = function(keys) { + if (keys.indexOf(" ") != -1) + keys = keys.split(/\s+/).pop(); + + var parts = keys.toLowerCase().split(/[\-\+]([\-\+])?/).filter(function(x){return x}); + var key = parts.pop(); + + var keyCode = keyUtil[key]; + if (keyUtil.FUNCTION_KEYS[keyCode]) + key = keyUtil.FUNCTION_KEYS[keyCode].toLowerCase(); + else if (!parts.length) + return {key: key, hashId: -1}; + else if (parts.length == 1 && parts[0] == "shift") + return {key: key.toUpperCase(), hashId: -1}; + + var hashId = 0; + for (var i = parts.length; i--;) { + var modifier = keyUtil.KEY_MODS[parts[i]]; + if (modifier == null) { + if (typeof console != "undefined") + console.error("invalid modifier " + parts[i] + " in " + keys); + return false; + } + hashId |= modifier; + } + return {key: key, hashId: hashId}; + }; + + this.findKeyCommand = function findKeyCommand(hashId, keyString) { + var ckbr = this.commmandKeyBinding; + return ckbr[hashId] && ckbr[hashId][keyString]; + }; + + this.handleKeyboard = function(data, hashId, keyString, keyCode) { + return { + command: this.findKeyCommand(hashId, keyString) + }; + }; + +}).call(HashHandler.prototype) + +exports.HashHandler = HashHandler; +}); + +ace.define('ace/commands/default_commands', ['require', 'exports', 'module' , 'ace/lib/lang', 'ace/config'], function(require, exports, module) { + + +var lang = require("../lib/lang"); +var config = require("../config"); + +function bindKey(win, mac) { + return { + win: win, + mac: mac + }; +} + +exports.commands = [{ + name: "showSettingsMenu", + bindKey: bindKey("Ctrl-,", "Command-,"), + exec: function(editor) { + config.loadModule("ace/ext/settings_menu", function(module) { + module.init(editor); + editor.showSettingsMenu(); + }); + }, + readOnly: true +}, { + name: "selectall", + bindKey: bindKey("Ctrl-A", "Command-A"), + exec: function(editor) { editor.selectAll(); }, + readOnly: true +}, { + name: "centerselection", + bindKey: bindKey(null, "Ctrl-L"), + exec: function(editor) { editor.centerSelection(); }, + readOnly: true +}, { + name: "gotoline", + bindKey: bindKey("Ctrl-L", "Command-L"), + exec: function(editor) { + var line = parseInt(prompt("Enter line number:"), 10); + if (!isNaN(line)) { + editor.gotoLine(line); + } + }, + readOnly: true +}, { + name: "fold", + bindKey: bindKey("Alt-L|Ctrl-F1", "Command-Alt-L|Command-F1"), + exec: function(editor) { editor.session.toggleFold(false); }, + readOnly: true +}, { + name: "unfold", + bindKey: bindKey("Alt-Shift-L|Ctrl-Shift-F1", "Command-Alt-Shift-L|Command-Shift-F1"), + exec: function(editor) { editor.session.toggleFold(true); }, + readOnly: true +}, { + name: "foldall", + bindKey: bindKey("Alt-0", "Command-Option-0"), + exec: function(editor) { editor.session.foldAll(); }, + readOnly: true +}, { + name: "unfoldall", + bindKey: bindKey("Alt-Shift-0", "Command-Option-Shift-0"), + exec: function(editor) { editor.session.unfold(); }, + readOnly: true +}, { + name: "findnext", + bindKey: bindKey("Ctrl-K", "Command-G"), + exec: function(editor) { editor.findNext(); }, + readOnly: true +}, { + name: "findprevious", + bindKey: bindKey("Ctrl-Shift-K", "Command-Shift-G"), + exec: function(editor) { editor.findPrevious(); }, + readOnly: true +}, { + name: "find", + bindKey: bindKey("Ctrl-F", "Command-F"), + exec: function(editor) { + config.loadModule("ace/ext/searchbox", function(e) {e.Search(editor)}); + }, + readOnly: true +}, { + name: "overwrite", + bindKey: "Insert", + exec: function(editor) { editor.toggleOverwrite(); }, + readOnly: true +}, { + name: "selecttostart", + bindKey: bindKey("Ctrl-Shift-Home", "Command-Shift-Up"), + exec: function(editor) { editor.getSelection().selectFileStart(); }, + multiSelectAction: "forEach", + readOnly: true +}, { + name: "gotostart", + bindKey: bindKey("Ctrl-Home", "Command-Home|Command-Up"), + exec: function(editor) { editor.navigateFileStart(); }, + multiSelectAction: "forEach", + readOnly: true +}, { + name: "selectup", + bindKey: bindKey("Shift-Up", "Shift-Up"), + exec: function(editor) { editor.getSelection().selectUp(); }, + multiSelectAction: "forEach", + readOnly: true +}, { + name: "golineup", + bindKey: bindKey("Up", "Up|Ctrl-P"), + exec: function(editor, args) { editor.navigateUp(args.times); }, + multiSelectAction: "forEach", + readOnly: true +}, { + name: "selecttoend", + bindKey: bindKey("Ctrl-Shift-End", "Command-Shift-Down"), + exec: function(editor) { editor.getSelection().selectFileEnd(); }, + multiSelectAction: "forEach", + readOnly: true +}, { + name: "gotoend", + bindKey: bindKey("Ctrl-End", "Command-End|Command-Down"), + exec: function(editor) { editor.navigateFileEnd(); }, + multiSelectAction: "forEach", + readOnly: true +}, { + name: "selectdown", + bindKey: bindKey("Shift-Down", "Shift-Down"), + exec: function(editor) { editor.getSelection().selectDown(); }, + multiSelectAction: "forEach", + readOnly: true +}, { + name: "golinedown", + bindKey: bindKey("Down", "Down|Ctrl-N"), + exec: function(editor, args) { editor.navigateDown(args.times); }, + multiSelectAction: "forEach", + readOnly: true +}, { + name: "selectwordleft", + bindKey: bindKey("Ctrl-Shift-Left", "Option-Shift-Left"), + exec: function(editor) { editor.getSelection().selectWordLeft(); }, + multiSelectAction: "forEach", + readOnly: true +}, { + name: "gotowordleft", + bindKey: bindKey("Ctrl-Left", "Option-Left"), + exec: function(editor) { editor.navigateWordLeft(); }, + multiSelectAction: "forEach", + readOnly: true +}, { + name: "selecttolinestart", + bindKey: bindKey("Alt-Shift-Left", "Command-Shift-Left"), + exec: function(editor) { editor.getSelection().selectLineStart(); }, + multiSelectAction: "forEach", + readOnly: true +}, { + name: "gotolinestart", + bindKey: bindKey("Alt-Left|Home", "Command-Left|Home|Ctrl-A"), + exec: function(editor) { editor.navigateLineStart(); }, + multiSelectAction: "forEach", + readOnly: true +}, { + name: "selectleft", + bindKey: bindKey("Shift-Left", "Shift-Left"), + exec: function(editor) { editor.getSelection().selectLeft(); }, + multiSelectAction: "forEach", + readOnly: true +}, { + name: "gotoleft", + bindKey: bindKey("Left", "Left|Ctrl-B"), + exec: function(editor, args) { editor.navigateLeft(args.times); }, + multiSelectAction: "forEach", + readOnly: true +}, { + name: "selectwordright", + bindKey: bindKey("Ctrl-Shift-Right", "Option-Shift-Right"), + exec: function(editor) { editor.getSelection().selectWordRight(); }, + multiSelectAction: "forEach", + readOnly: true +}, { + name: "gotowordright", + bindKey: bindKey("Ctrl-Right", "Option-Right"), + exec: function(editor) { editor.navigateWordRight(); }, + multiSelectAction: "forEach", + readOnly: true +}, { + name: "selecttolineend", + bindKey: bindKey("Alt-Shift-Right", "Command-Shift-Right"), + exec: function(editor) { editor.getSelection().selectLineEnd(); }, + multiSelectAction: "forEach", + readOnly: true +}, { + name: "gotolineend", + bindKey: bindKey("Alt-Right|End", "Command-Right|End|Ctrl-E"), + exec: function(editor) { editor.navigateLineEnd(); }, + multiSelectAction: "forEach", + readOnly: true +}, { + name: "selectright", + bindKey: bindKey("Shift-Right", "Shift-Right"), + exec: function(editor) { editor.getSelection().selectRight(); }, + multiSelectAction: "forEach", + readOnly: true +}, { + name: "gotoright", + bindKey: bindKey("Right", "Right|Ctrl-F"), + exec: function(editor, args) { editor.navigateRight(args.times); }, + multiSelectAction: "forEach", + readOnly: true +}, { + name: "selectpagedown", + bindKey: "Shift-PageDown", + exec: function(editor) { editor.selectPageDown(); }, + readOnly: true +}, { + name: "pagedown", + bindKey: bindKey(null, "Option-PageDown"), + exec: function(editor) { editor.scrollPageDown(); }, + readOnly: true +}, { + name: "gotopagedown", + bindKey: bindKey("PageDown", "PageDown|Ctrl-V"), + exec: function(editor) { editor.gotoPageDown(); }, + readOnly: true +}, { + name: "selectpageup", + bindKey: "Shift-PageUp", + exec: function(editor) { editor.selectPageUp(); }, + readOnly: true +}, { + name: "pageup", + bindKey: bindKey(null, "Option-PageUp"), + exec: function(editor) { editor.scrollPageUp(); }, + readOnly: true +}, { + name: "gotopageup", + bindKey: "PageUp", + exec: function(editor) { editor.gotoPageUp(); }, + readOnly: true +}, { + name: "scrollup", + bindKey: bindKey("Ctrl-Up", null), + exec: function(e) { e.renderer.scrollBy(0, -2 * e.renderer.layerConfig.lineHeight); }, + readOnly: true +}, { + name: "scrolldown", + bindKey: bindKey("Ctrl-Down", null), + exec: function(e) { e.renderer.scrollBy(0, 2 * e.renderer.layerConfig.lineHeight); }, + readOnly: true +}, { + name: "selectlinestart", + bindKey: "Shift-Home", + exec: function(editor) { editor.getSelection().selectLineStart(); }, + multiSelectAction: "forEach", + readOnly: true +}, { + name: "selectlineend", + bindKey: "Shift-End", + exec: function(editor) { editor.getSelection().selectLineEnd(); }, + multiSelectAction: "forEach", + readOnly: true +}, { + name: "togglerecording", + bindKey: bindKey("Ctrl-Alt-E", "Command-Option-E"), + exec: function(editor) { editor.commands.toggleRecording(editor); }, + readOnly: true +}, { + name: "replaymacro", + bindKey: bindKey("Ctrl-Shift-E", "Command-Shift-E"), + exec: function(editor) { editor.commands.replay(editor); }, + readOnly: true +}, { + name: "jumptomatching", + bindKey: bindKey("Ctrl-P", "Ctrl-Shift-P"), + exec: function(editor) { editor.jumpToMatching(); }, + multiSelectAction: "forEach", + readOnly: true +}, { + name: "selecttomatching", + bindKey: bindKey("Ctrl-Shift-P", null), + exec: function(editor) { editor.jumpToMatching(true); }, + multiSelectAction: "forEach", + readOnly: true +}, +{ + name: "cut", + exec: function(editor) { + var range = editor.getSelectionRange(); + editor._emit("cut", range); + + if (!editor.selection.isEmpty()) { + editor.session.remove(range); + editor.clearSelection(); + } + }, + multiSelectAction: "forEach" +}, { + name: "removeline", + bindKey: bindKey("Ctrl-D", "Command-D"), + exec: function(editor) { editor.removeLines(); }, + multiSelectAction: "forEachLine" +}, { + name: "duplicateSelection", + bindKey: bindKey("Ctrl-Shift-D", "Command-Shift-D"), + exec: function(editor) { editor.duplicateSelection(); }, + multiSelectAction: "forEach" +}, { + name: "sortlines", + bindKey: bindKey("Ctrl-Alt-S", "Command-Alt-S"), + exec: function(editor) { editor.sortLines(); }, + multiSelectAction: "forEachLine" +}, { + name: "togglecomment", + bindKey: bindKey("Ctrl-/", "Command-/"), + exec: function(editor) { editor.toggleCommentLines(); }, + multiSelectAction: "forEachLine" +}, { + name: "toggleBlockComment", + bindKey: bindKey("Ctrl-Shift-/", "Command-Shift-/"), + exec: function(editor) { editor.toggleBlockComment(); }, + multiSelectAction: "forEach" +}, { + name: "modifyNumberUp", + bindKey: bindKey("Ctrl-Shift-Up", "Alt-Shift-Up"), + exec: function(editor) { editor.modifyNumber(1); }, + multiSelectAction: "forEach" +}, { + name: "modifyNumberDown", + bindKey: bindKey("Ctrl-Shift-Down", "Alt-Shift-Down"), + exec: function(editor) { editor.modifyNumber(-1); }, + multiSelectAction: "forEach" +}, { + name: "replace", + bindKey: bindKey("Ctrl-H", "Command-Option-F"), + exec: function(editor) { + config.loadModule("ace/ext/searchbox", function(e) {e.Search(editor, true)}); + } +}, { + name: "undo", + bindKey: bindKey("Ctrl-Z", "Command-Z"), + exec: function(editor) { editor.undo(); } +}, { + name: "redo", + bindKey: bindKey("Ctrl-Shift-Z|Ctrl-Y", "Command-Shift-Z|Command-Y"), + exec: function(editor) { editor.redo(); } +}, { + name: "copylinesup", + bindKey: bindKey("Alt-Shift-Up", "Command-Option-Up"), + exec: function(editor) { editor.copyLinesUp(); } +}, { + name: "movelinesup", + bindKey: bindKey("Alt-Up", "Option-Up"), + exec: function(editor) { editor.moveLinesUp(); } +}, { + name: "copylinesdown", + bindKey: bindKey("Alt-Shift-Down", "Command-Option-Down"), + exec: function(editor) { editor.copyLinesDown(); } +}, { + name: "movelinesdown", + bindKey: bindKey("Alt-Down", "Option-Down"), + exec: function(editor) { editor.moveLinesDown(); } +}, { + name: "del", + bindKey: bindKey("Delete", "Delete|Ctrl-D"), + exec: function(editor) { editor.remove("right"); }, + multiSelectAction: "forEach" +}, { + name: "backspace", + bindKey: bindKey( + "Command-Backspace|Option-Backspace|Shift-Backspace|Backspace", + "Ctrl-Backspace|Command-Backspace|Shift-Backspace|Backspace|Ctrl-H" + ), + exec: function(editor) { editor.remove("left"); }, + multiSelectAction: "forEach" +}, { + name: "removetolinestart", + bindKey: bindKey("Alt-Backspace", "Command-Backspace"), + exec: function(editor) { editor.removeToLineStart(); }, + multiSelectAction: "forEach" +}, { + name: "removetolineend", + bindKey: bindKey("Alt-Delete", "Ctrl-K"), + exec: function(editor) { editor.removeToLineEnd(); }, + multiSelectAction: "forEach" +}, { + name: "removewordleft", + bindKey: bindKey("Ctrl-Backspace", "Alt-Backspace|Ctrl-Alt-Backspace"), + exec: function(editor) { editor.removeWordLeft(); }, + multiSelectAction: "forEach" +}, { + name: "removewordright", + bindKey: bindKey("Ctrl-Delete", "Alt-Delete"), + exec: function(editor) { editor.removeWordRight(); }, + multiSelectAction: "forEach" +}, { + name: "outdent", + bindKey: bindKey("Shift-Tab", "Shift-Tab"), + exec: function(editor) { editor.blockOutdent(); }, + multiSelectAction: "forEach" +}, { + name: "indent", + bindKey: bindKey("Tab", "Tab"), + exec: function(editor) { editor.indent(); }, + multiSelectAction: "forEach" +},{ + name: "blockoutdent", + bindKey: bindKey("Ctrl-[", "Ctrl-["), + exec: function(editor) { editor.blockOutdent(); }, + multiSelectAction: "forEachLine" +},{ + name: "blockindent", + bindKey: bindKey("Ctrl-]", "Ctrl-]"), + exec: function(editor) { editor.blockIndent(); }, + multiSelectAction: "forEachLine" +}, { + name: "insertstring", + exec: function(editor, str) { editor.insert(str); }, + multiSelectAction: "forEach" +}, { + name: "inserttext", + exec: function(editor, args) { + editor.insert(lang.stringRepeat(args.text || "", args.times || 1)); + }, + multiSelectAction: "forEach" +}, { + name: "splitline", + bindKey: bindKey(null, "Ctrl-O"), + exec: function(editor) { editor.splitLine(); }, + multiSelectAction: "forEach" +}, { + name: "transposeletters", + bindKey: bindKey("Ctrl-T", "Ctrl-T"), + exec: function(editor) { editor.transposeLetters(); }, + multiSelectAction: function(editor) {editor.transposeSelections(1); } +}, { + name: "touppercase", + bindKey: bindKey("Ctrl-U", "Ctrl-U"), + exec: function(editor) { editor.toUpperCase(); }, + multiSelectAction: "forEach" +}, { + name: "tolowercase", + bindKey: bindKey("Ctrl-Shift-U", "Ctrl-Shift-U"), + exec: function(editor) { editor.toLowerCase(); }, + multiSelectAction: "forEach" +}]; + +}); + +ace.define('ace/undomanager', ['require', 'exports', 'module' ], function(require, exports, module) { +var UndoManager = function() { + this.reset(); +}; + +(function() { + this.execute = function(options) { + var deltas = options.args[0]; + this.$doc = options.args[1]; + this.$undoStack.push(deltas); + this.$redoStack = []; + + if (this.dirtyCounter < 0) { + this.dirtyCounter = NaN; + } + this.dirtyCounter++; + }; + this.undo = function(dontSelect) { + var deltas = this.$undoStack.pop(); + var undoSelectionRange = null; + if (deltas) { + undoSelectionRange = + this.$doc.undoChanges(deltas, dontSelect); + this.$redoStack.push(deltas); + this.dirtyCounter--; + } + + return undoSelectionRange; + }; + this.redo = function(dontSelect) { + var deltas = this.$redoStack.pop(); + var redoSelectionRange = null; + if (deltas) { + redoSelectionRange = + this.$doc.redoChanges(deltas, dontSelect); + this.$undoStack.push(deltas); + this.dirtyCounter++; + } + + return redoSelectionRange; + }; + this.reset = function() { + this.$undoStack = []; + this.$redoStack = []; + this.dirtyCounter = 0; + }; + this.hasUndo = function() { + return this.$undoStack.length > 0; + }; + this.hasRedo = function() { + return this.$redoStack.length > 0; + }; + this.markClean = function() { + this.dirtyCounter = 0; + }; + this.isClean = function() { + return this.dirtyCounter === 0; + }; + +}).call(UndoManager.prototype); + +exports.UndoManager = UndoManager; +}); + +ace.define('ace/virtual_renderer', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/dom', 'ace/lib/event', 'ace/lib/useragent', 'ace/config', 'ace/layer/gutter', 'ace/layer/marker', 'ace/layer/text', 'ace/layer/cursor', 'ace/scrollbar', 'ace/renderloop', 'ace/lib/event_emitter'], function(require, exports, module) { + + +var oop = require("./lib/oop"); +var dom = require("./lib/dom"); +var event = require("./lib/event"); +var useragent = require("./lib/useragent"); +var config = require("./config"); +var GutterLayer = require("./layer/gutter").Gutter; +var MarkerLayer = require("./layer/marker").Marker; +var TextLayer = require("./layer/text").Text; +var CursorLayer = require("./layer/cursor").Cursor; +var ScrollBar = require("./scrollbar").ScrollBar; +var RenderLoop = require("./renderloop").RenderLoop; +var EventEmitter = require("./lib/event_emitter").EventEmitter; +var editorCss = ".ace_editor {\ +position: relative;\ +overflow: hidden;\ +font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', 'source-code-pro', monospace;\ +font-size: 12px;\ +line-height: normal;\ +color: black;\ +}\ +.ace_scroller {\ +position: absolute;\ +overflow: hidden;\ +top: 0;\ +bottom: 0;\ +background-color: inherit;\ +}\ +.ace_content {\ +position: absolute;\ +-moz-box-sizing: border-box;\ +-webkit-box-sizing: border-box;\ +box-sizing: border-box;\ +cursor: text;\ +}\ +.ace_gutter {\ +position: absolute;\ +overflow : hidden;\ +width: auto;\ +top: 0;\ +bottom: 0;\ +left: 0;\ +cursor: default;\ +z-index: 4;\ +}\ +.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,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QUM2OEZDQTQ4RTU0MTFFMUEzM0VFRTM2RUY1M0RBMjYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QUM2OEZDQTU4RTU0MTFFMUEzM0VFRTM2RUY1M0RBMjYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpBQzY4RkNBMjhFNTQxMUUxQTMzRUVFMzZFRjUzREEyNiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpBQzY4RkNBMzhFNTQxMUUxQTMzRUVFMzZFRjUzREEyNiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PkgXxbAAAAJbSURBVHjapFNNaBNBFH4zs5vdZLP5sQmNpT82QY209heh1ioWisaDRcSKF0WKJ0GQnrzrxasHsR6EnlrwD0TagxJabaVEpFYxLWlLSS822tr87m66ccfd2GKyVhA6MMybgfe97/vmPUQphd0sZjto9XIn9OOsvlu2nkqRzVU+6vvlzPf8W6bk8dxQ0NPbxAALgCgg2JkaQuhzQau/El0zbmUA7U0Es8v2CiYmKQJHGO1QICCLoqilMhkmurDAyapKgqItezi/USRdJqEYY4D5jCy03ht2yMkkvL91jTTX10qzyyu2hruPRN7jgbH+EOsXcMLgYiThEgAMhABW85oqy1DXdRIdvP1AHJ2acQXvDIrVHcdQNrEKNYSVMSZGMjEzIIAwDXIo+6G/FxcGnzkC3T2oMhLjre49sBB+RRcHLqdafK6sYdE/GGBwU1VpFNj0aN8pJbe+BkZyevUrvLl6Xmm0W9IuTc0DxrDNAJd5oEvI/KRsNC3bQyNjPO9yQ1YHcfj2QvfQc/5TUhJTBc2iM0U7AWDQtc1nJHvD/cfO2s7jaGkiTEfa/Ep8coLu7zmNmh8+dc5lZDuUeFAGUNA/OY6JVaypQ0vjr7XYjUvJM37vt+j1vuTK5DgVfVUoTjVe+y3/LxMxY2GgU+CSLy4cpfsYorRXuXIOi0Vt40h67uZFTdIo6nLaZcwUJWAzwNS0tBnqqKzQDnjdG/iPyZxo46HaKUpbvYkj8qYRTZsBhge+JHhZyh0x9b95JqjVJkT084kZIPwu/mPWqPgfQ5jXh2+92Ay7HedfAgwA6KDWafb4w3cAAAAASUVORK5CYII=\");\ +background-repeat: no-repeat;\ +background-position: 2px center;\ +}\ +.ace_gutter-cell.ace_warning {\ +background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QUM2OEZDQTg4RTU0MTFFMUEzM0VFRTM2RUY1M0RBMjYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QUM2OEZDQTk4RTU0MTFFMUEzM0VFRTM2RUY1M0RBMjYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpBQzY4RkNBNjhFNTQxMUUxQTMzRUVFMzZFRjUzREEyNiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpBQzY4RkNBNzhFNTQxMUUxQTMzRUVFMzZFRjUzREEyNiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pgd7PfIAAAGmSURBVHjaYvr//z8DJZiJgUIANoCRkREb9gLiSVAaQx4OQM7AAkwd7XU2/v++/rOttdYGEB9dASEvOMydGKfH8Gv/p4XTkvRBfLxeQAP+1cUhXopyvzhP7P/IoSj7g7Mw09cNKO6J1QQ0L4gICPIv/veg/8W+JdFvQNLHVsW9/nmn9zk7B+cCkDwhL7gt6knSZnx9/LuCEOcvkIAMP+cvto9nfqyZmmUAksfnBUtbM60gX/3/kgyv3/xSFOL5DZT+L8vP+Yfh5cvfPvp/xUHyQHXGyAYwgpwBjZYFT3Y1OEl/OfCH4ffv3wzc4iwMvNIsDJ+f/mH4+vIPAxsb631WW0Yln6ZpQLXdMK/DXGDflh+sIv37EivD5x//Gb7+YWT4y86sl7BCCkSD+Z++/1dkvsFRl+HnD1Rvje4F8whjMXmGj58YGf5zsDMwcnAwfPvKcml62DsQDeaDxN+/Y0qwlpEHqrdB94IRNIDUgfgfKJChGK4OikEW3gTiXUB950ASLFAF54AC94A0G9QAfOnmF9DCDzABFqS08IHYDIScdijOjQABBgC+/9awBH96jwAAAABJRU5ErkJggg==\");\ +background-position: 2px center;\ +}\ +.ace_gutter-cell.ace_info {\ +background-image: url(\"data:image/gif;base64,R0lGODlhEAAQAMQAAAAAAEFBQVJSUl5eXmRkZGtra39/f4WFhYmJiZGRkaampry8vMPDw8zMzNXV1dzc3OTk5Orq6vDw8P///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAkAABQALAAAAAAQABAAAAUuICWOZGmeaBml5XGwFCQSBGyXRSAwtqQIiRuiwIM5BoYVbEFIyGCQoeJGrVptIQA7\");\ +background-position: 2px center;\ +}\ +.ace_dark .ace_gutter-cell.ace_info {\ +background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpGRTk5MTVGREIxNDkxMUUxOTc5Q0FFREQyMTNGMjBFQyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpGRTk5MTVGRUIxNDkxMUUxOTc5Q0FFREQyMTNGMjBFQyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkZFOTkxNUZCQjE0OTExRTE5NzlDQUVERDIxM0YyMEVDIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkZFOTkxNUZDQjE0OTExRTE5NzlDQUVERDIxM0YyMEVDIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+SIDkjAAAAJ1JREFUeNpi/P//PwMlgImBQkB7A6qrq/+DMC55FkIGKCoq4pVnpFkgTp069f/+/fv/r1u37r+tre1/kg0A+ptn9uzZYLaRkRHpLvjw4cNXWVlZhufPnzOcO3eOdAO0tbVPAjHDmzdvGA4fPsxIsgGSkpJmv379Ynj37h2DjIyMCMkG3LhxQ/T27dsMampqDHZ2dq/pH41DxwCAAAMAFdc68dUsFZgAAAAASUVORK5CYII=\");\ +}\ +.ace_scrollbar {\ +position: absolute;\ +overflow-x: hidden;\ +overflow-y: scroll;\ +right: 0;\ +top: 0;\ +bottom: 0;\ +}\ +.ace_scrollbar-inner {\ +position: absolute;\ +width: 1px;\ +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;\ +}\ +.ace_text-input.ace_composition {\ +background: #f8f8f8;\ +color: #111;\ +z-index: 1000;\ +opacity: 1;\ +}\ +.ace_layer {\ +z-index: 1;\ +position: absolute;\ +overflow: hidden;\ +white-space: nowrap;\ +height: 100%;\ +width: 100%;\ +-moz-box-sizing: border-box;\ +-webkit-box-sizing: border-box;\ +box-sizing: border-box;\ +/* setting pointer-events: auto; on node under the mouse, which changes\ +during scroll, will break mouse wheel scrolling in Safari */\ +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;\ +}\ +.ace_hidden-cursors .ace_cursor {\ +opacity: 0.2;\ +}\ +.ace_smooth-blinking .ace_cursor {\ +-moz-transition: opacity 0.18s;\ +-webkit-transition: opacity 0.18s;\ +-o-transition: opacity 0.18s;\ +-ms-transition: opacity 0.18s;\ +transition: opacity 0.18s;\ +}\ +.ace_cursor[style*=\"opacity: 0\"]{\ +-ms-filter: \"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)\";\ +}\ +.ace_editor.ace_multiselect .ace_cursor {\ +border-left-width: 1px;\ +}\ +.ace_line {\ +white-space: nowrap;\ +}\ +.ace_marker-layer .ace_step {\ +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,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%11%00%00%00%09%08%06%00%00%00%D4%E8%C7%0C%00%00%03%1EiCCPICC%20Profile%00%00x%01%85T%DFk%D3P%14%FE%DAe%9D%B0%E1%8B%3Ag%11%09%3Eh%91ndStC%9C%B6kW%BA%CDZ%EA6%B7!H%9B%A6m%5C%9A%C6%24%ED~%B0%07%D9%8Bo%3A%C5w%F1%07%3E%F9%07%0C%D9%83o%7B%92%0D%C6%14a%F8%AC%88%22L%F6%22%B3%9E%9B4M'S%03%B9%F7%BB%DF%F9%EE9'%E7%E4%5E%A0%F9qZ%D3%14%2F%0F%14USO%C5%C2%FC%C4%E4%14%DF%F2%01%5E%1CC%2B%FChM%8B%86%16J%26G%40%0F%D3%B2y%EF%B3%F3%0E%1E%C6lt%EEo%DF%AB%FEc%D5%9A%95%0C%11%F0%1C%20%BE%945%C4%22%E1Y%A0i%5C%D4t%13%E0%D6%89%EF%9D15%C2%CDLsX%A7%04%09%1Fg8oc%81%E1%8C%8D%23%96f45%40%9A%09%C2%07%C5B%3AK%B8%408%98i%E0%F3%0D%D8%CE%81%14%E4'%26%A9%92.%8B%3C%ABER%2F%E5dE%B2%0C%F6%F0%1Fs%83%F2_%B0%A8%94%E9%9B%AD%E7%10%8Dm%9A%19N%D1%7C%8A%DE%1F9%7Dp%8C%E6%00%D5%C1%3F_%18%BDA%B8%9DpX6%E3%A35~B%CD%24%AE%11%26%BD%E7%EEti%98%EDe%9A%97Y)%12%25%1C%24%BCbT%AE3li%E6%0B%03%89%9A%E6%D3%ED%F4P%92%B0%9F4%BF43Y%F3%E3%EDP%95%04%EB1%C5%F5%F6KF%F4%BA%BD%D7%DB%91%93%07%E35%3E%A7)%D6%7F%40%FE%BD%F7%F5r%8A%E5y%92%F0%EB%B4%1E%8D%D5%F4%5B%92%3AV%DB%DB%E4%CD%A6%23%C3%C4wQ%3F%03HB%82%8E%1Cd(%E0%91B%0Ca%9Ac%C4%AA%F8L%16%19%22J%A4%D2itTy%B28%D6%3B(%93%96%ED%1CGx%C9_%0E%B8%5E%16%F5%5B%B2%B8%F6%E0%FB%9E%DD%25%D7%8E%BC%15%85%C5%B7%A3%D8Q%ED%B5%81%E9%BA%B2%13%9A%1B%7Fua%A5%A3n%E17%B9%E5%9B%1Bm%AB%0B%08Q%FE%8A%E5%B1H%5Ee%CAO%82Q%D7u6%E6%90S%97%FCu%0B%CF2%94%EE%25v%12X%0C%BA%AC%F0%5E%F8*l%0AO%85%17%C2%97%BF%D4%C8%CE%DE%AD%11%CB%80q%2C%3E%AB%9ES%CD%C6%EC%25%D2L%D2%EBd%B8%BF%8A%F5B%C6%18%F9%901CZ%9D%BE%24M%9C%8A9%F2%DAP%0B'%06w%82%EB%E6%E2%5C%2F%D7%07%9E%BB%CC%5D%E1%FA%B9%08%AD.r%23%8E%C2%17%F5E%7C!%F0%BE3%BE%3E_%B7o%88a%A7%DB%BE%D3d%EB%A31Z%EB%BB%D3%91%BA%A2%B1z%94%8F%DB'%F6%3D%8E%AA%13%19%B2%B1%BE%B1~V%08%2B%B4%A2cjJ%B3tO%00%03%25mN%97%F3%05%93%EF%11%84%0B%7C%88%AE-%89%8F%ABbW%90O%2B%0Ao%99%0C%5E%97%0CI%AFH%D9.%B0%3B%8F%ED%03%B6S%D6%5D%E6i_s9%F3*p%E9%1B%FD%C3%EB.7U%06%5E%19%C0%D1s.%17%A03u%E4%09%B0%7C%5E%2C%EB%15%DB%1F%3C%9E%B7%80%91%3B%DBc%AD%3Dma%BA%8B%3EV%AB%DBt.%5B%1E%01%BB%0F%AB%D5%9F%CF%AA%D5%DD%E7%E4%7F%0Bx%A3%FC%06%A9%23%0A%D6%C2%A1_2%00%00%00%09pHYs%00%00%0B%13%00%00%0B%13%01%00%9A%9C%18%00%00%00%B5IDAT(%15%A5%91%3D%0E%02!%10%85ac%E1%05%D6%CE%D6%C6%CE%D2%E8%ED%CD%DE%C0%C6%D6N.%E0V%F8%3D%9Ca%891XH%C2%BE%D9y%3F%90!%E6%9C%C3%BFk%E5%011%C6-%F5%C8N%04%DF%BD%FF%89%DFt%83DN%60%3E%F3%AB%A0%DE%1A%5Dg%BE%10Q%97%1B%40%9C%A8o%10%8F%5E%828%B4%1B%60%87%F6%02%26%85%1Ch%1E%C1%2B%5Bk%FF%86%EE%B7j%09%9A%DA%9B%ACe%A3%F9%EC%DA!9%B4%D5%A6%81%86%86%98%CC%3C%5B%40%FA%81%B3%E9%CB%23%94%C16Azo%05%D4%E1%C1%95a%3B%8A'%A0%E8%CC%17%22%85%1D%BA%00%A2%FA%DC%0A%94%D1%D1%8D%8B%3A%84%17B%C7%60%1A%25Z%FC%8D%00%00%00%00IEND%AEB%60%82\"),\ +url(\"data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%05%00%00%007%08%06%00%00%00%C4%DD%80C%00%00%03%1EiCCPICC%20Profile%00%00x%01%85T%DFk%D3P%14%FE%DAe%9D%B0%E1%8B%3Ag%11%09%3Eh%91ndStC%9C%B6kW%BA%CDZ%EA6%B7!H%9B%A6m%5C%9A%C6%24%ED~%B0%07%D9%8Bo%3A%C5w%F1%07%3E%F9%07%0C%D9%83o%7B%92%0D%C6%14a%F8%AC%88%22L%F6%22%B3%9E%9B4M'S%03%B9%F7%BB%DF%F9%EE9'%E7%E4%5E%A0%F9qZ%D3%14%2F%0F%14USO%C5%C2%FC%C4%E4%14%DF%F2%01%5E%1CC%2B%FChM%8B%86%16J%26G%40%0F%D3%B2y%EF%B3%F3%0E%1E%C6lt%EEo%DF%AB%FEc%D5%9A%95%0C%11%F0%1C%20%BE%945%C4%22%E1Y%A0i%5C%D4t%13%E0%D6%89%EF%9D15%C2%CDLsX%A7%04%09%1Fg8oc%81%E1%8C%8D%23%96f45%40%9A%09%C2%07%C5B%3AK%B8%408%98i%E0%F3%0D%D8%CE%81%14%E4'%26%A9%92.%8B%3C%ABER%2F%E5dE%B2%0C%F6%F0%1Fs%83%F2_%B0%A8%94%E9%9B%AD%E7%10%8Dm%9A%19N%D1%7C%8A%DE%1F9%7Dp%8C%E6%00%D5%C1%3F_%18%BDA%B8%9DpX6%E3%A35~B%CD%24%AE%11%26%BD%E7%EEti%98%EDe%9A%97Y)%12%25%1C%24%BCbT%AE3li%E6%0B%03%89%9A%E6%D3%ED%F4P%92%B0%9F4%BF43Y%F3%E3%EDP%95%04%EB1%C5%F5%F6KF%F4%BA%BD%D7%DB%91%93%07%E35%3E%A7)%D6%7F%40%FE%BD%F7%F5r%8A%E5y%92%F0%EB%B4%1E%8D%D5%F4%5B%92%3AV%DB%DB%E4%CD%A6%23%C3%C4wQ%3F%03HB%82%8E%1Cd(%E0%91B%0Ca%9Ac%C4%AA%F8L%16%19%22J%A4%D2itTy%B28%D6%3B(%93%96%ED%1CGx%C9_%0E%B8%5E%16%F5%5B%B2%B8%F6%E0%FB%9E%DD%25%D7%8E%BC%15%85%C5%B7%A3%D8Q%ED%B5%81%E9%BA%B2%13%9A%1B%7Fua%A5%A3n%E17%B9%E5%9B%1Bm%AB%0B%08Q%FE%8A%E5%B1H%5Ee%CAO%82Q%D7u6%E6%90S%97%FCu%0B%CF2%94%EE%25v%12X%0C%BA%AC%F0%5E%F8*l%0AO%85%17%C2%97%BF%D4%C8%CE%DE%AD%11%CB%80q%2C%3E%AB%9ES%CD%C6%EC%25%D2L%D2%EBd%B8%BF%8A%F5B%C6%18%F9%901CZ%9D%BE%24M%9C%8A9%F2%DAP%0B'%06w%82%EB%E6%E2%5C%2F%D7%07%9E%BB%CC%5D%E1%FA%B9%08%AD.r%23%8E%C2%17%F5E%7C!%F0%BE3%BE%3E_%B7o%88a%A7%DB%BE%D3d%EB%A31Z%EB%BB%D3%91%BA%A2%B1z%94%8F%DB'%F6%3D%8E%AA%13%19%B2%B1%BE%B1~V%08%2B%B4%A2cjJ%B3tO%00%03%25mN%97%F3%05%93%EF%11%84%0B%7C%88%AE-%89%8F%ABbW%90O%2B%0Ao%99%0C%5E%97%0CI%AFH%D9.%B0%3B%8F%ED%03%B6S%D6%5D%E6i_s9%F3*p%E9%1B%FD%C3%EB.7U%06%5E%19%C0%D1s.%17%A03u%E4%09%B0%7C%5E%2C%EB%15%DB%1F%3C%9E%B7%80%91%3B%DBc%AD%3Dma%BA%8B%3EV%AB%DBt.%5B%1E%01%BB%0F%AB%D5%9F%CF%AA%D5%DD%E7%E4%7F%0Bx%A3%FC%06%A9%23%0A%D6%C2%A1_2%00%00%00%09pHYs%00%00%0B%13%00%00%0B%13%01%00%9A%9C%18%00%00%00%3AIDAT8%11c%FC%FF%FF%7F%18%03%1A%60%01%F2%3F%A0%891%80%04%FF%11-%F8%17%9BJ%E2%05%B1ZD%81v%26t%E7%80%F8%A3%82h%A12%1A%20%A3%01%02%0F%01%BA%25%06%00%19%C0%0D%AEF%D5%3ES%00%00%00%00IEND%AEB%60%82\");\ +background-repeat: no-repeat, repeat-x;\ +background-position: center center, top left;\ +color: transparent;\ +border: 1px solid black;\ +-moz-border-radius: 2px;\ +-webkit-border-radius: 2px;\ +border-radius: 2px;\ +cursor: pointer;\ +pointer-events: auto;\ +}\ +.ace_dark .ace_fold {\ +}\ +.ace_fold:hover{\ +background-image:\ +url(\"data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%11%00%00%00%09%08%06%00%00%00%D4%E8%C7%0C%00%00%03%1EiCCPICC%20Profile%00%00x%01%85T%DFk%D3P%14%FE%DAe%9D%B0%E1%8B%3Ag%11%09%3Eh%91ndStC%9C%B6kW%BA%CDZ%EA6%B7!H%9B%A6m%5C%9A%C6%24%ED~%B0%07%D9%8Bo%3A%C5w%F1%07%3E%F9%07%0C%D9%83o%7B%92%0D%C6%14a%F8%AC%88%22L%F6%22%B3%9E%9B4M'S%03%B9%F7%BB%DF%F9%EE9'%E7%E4%5E%A0%F9qZ%D3%14%2F%0F%14USO%C5%C2%FC%C4%E4%14%DF%F2%01%5E%1CC%2B%FChM%8B%86%16J%26G%40%0F%D3%B2y%EF%B3%F3%0E%1E%C6lt%EEo%DF%AB%FEc%D5%9A%95%0C%11%F0%1C%20%BE%945%C4%22%E1Y%A0i%5C%D4t%13%E0%D6%89%EF%9D15%C2%CDLsX%A7%04%09%1Fg8oc%81%E1%8C%8D%23%96f45%40%9A%09%C2%07%C5B%3AK%B8%408%98i%E0%F3%0D%D8%CE%81%14%E4'%26%A9%92.%8B%3C%ABER%2F%E5dE%B2%0C%F6%F0%1Fs%83%F2_%B0%A8%94%E9%9B%AD%E7%10%8Dm%9A%19N%D1%7C%8A%DE%1F9%7Dp%8C%E6%00%D5%C1%3F_%18%BDA%B8%9DpX6%E3%A35~B%CD%24%AE%11%26%BD%E7%EEti%98%EDe%9A%97Y)%12%25%1C%24%BCbT%AE3li%E6%0B%03%89%9A%E6%D3%ED%F4P%92%B0%9F4%BF43Y%F3%E3%EDP%95%04%EB1%C5%F5%F6KF%F4%BA%BD%D7%DB%91%93%07%E35%3E%A7)%D6%7F%40%FE%BD%F7%F5r%8A%E5y%92%F0%EB%B4%1E%8D%D5%F4%5B%92%3AV%DB%DB%E4%CD%A6%23%C3%C4wQ%3F%03HB%82%8E%1Cd(%E0%91B%0Ca%9Ac%C4%AA%F8L%16%19%22J%A4%D2itTy%B28%D6%3B(%93%96%ED%1CGx%C9_%0E%B8%5E%16%F5%5B%B2%B8%F6%E0%FB%9E%DD%25%D7%8E%BC%15%85%C5%B7%A3%D8Q%ED%B5%81%E9%BA%B2%13%9A%1B%7Fua%A5%A3n%E17%B9%E5%9B%1Bm%AB%0B%08Q%FE%8A%E5%B1H%5Ee%CAO%82Q%D7u6%E6%90S%97%FCu%0B%CF2%94%EE%25v%12X%0C%BA%AC%F0%5E%F8*l%0AO%85%17%C2%97%BF%D4%C8%CE%DE%AD%11%CB%80q%2C%3E%AB%9ES%CD%C6%EC%25%D2L%D2%EBd%B8%BF%8A%F5B%C6%18%F9%901CZ%9D%BE%24M%9C%8A9%F2%DAP%0B'%06w%82%EB%E6%E2%5C%2F%D7%07%9E%BB%CC%5D%E1%FA%B9%08%AD.r%23%8E%C2%17%F5E%7C!%F0%BE3%BE%3E_%B7o%88a%A7%DB%BE%D3d%EB%A31Z%EB%BB%D3%91%BA%A2%B1z%94%8F%DB'%F6%3D%8E%AA%13%19%B2%B1%BE%B1~V%08%2B%B4%A2cjJ%B3tO%00%03%25mN%97%F3%05%93%EF%11%84%0B%7C%88%AE-%89%8F%ABbW%90O%2B%0Ao%99%0C%5E%97%0CI%AFH%D9.%B0%3B%8F%ED%03%B6S%D6%5D%E6i_s9%F3*p%E9%1B%FD%C3%EB.7U%06%5E%19%C0%D1s.%17%A03u%E4%09%B0%7C%5E%2C%EB%15%DB%1F%3C%9E%B7%80%91%3B%DBc%AD%3Dma%BA%8B%3EV%AB%DBt.%5B%1E%01%BB%0F%AB%D5%9F%CF%AA%D5%DD%E7%E4%7F%0Bx%A3%FC%06%A9%23%0A%D6%C2%A1_2%00%00%00%09pHYs%00%00%0B%13%00%00%0B%13%01%00%9A%9C%18%00%00%00%B5IDAT(%15%A5%91%3D%0E%02!%10%85ac%E1%05%D6%CE%D6%C6%CE%D2%E8%ED%CD%DE%C0%C6%D6N.%E0V%F8%3D%9Ca%891XH%C2%BE%D9y%3F%90!%E6%9C%C3%BFk%E5%011%C6-%F5%C8N%04%DF%BD%FF%89%DFt%83DN%60%3E%F3%AB%A0%DE%1A%5Dg%BE%10Q%97%1B%40%9C%A8o%10%8F%5E%828%B4%1B%60%87%F6%02%26%85%1Ch%1E%C1%2B%5Bk%FF%86%EE%B7j%09%9A%DA%9B%ACe%A3%F9%EC%DA!9%B4%D5%A6%81%86%86%98%CC%3C%5B%40%FA%81%B3%E9%CB%23%94%C16Azo%05%D4%E1%C1%95a%3B%8A'%A0%E8%CC%17%22%85%1D%BA%00%A2%FA%DC%0A%94%D1%D1%8D%8B%3A%84%17B%C7%60%1A%25Z%FC%8D%00%00%00%00IEND%AEB%60%82\"),\ +url(\"data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%05%00%00%007%08%06%00%00%00%C4%DD%80C%00%00%03%1EiCCPICC%20Profile%00%00x%01%85T%DFk%D3P%14%FE%DAe%9D%B0%E1%8B%3Ag%11%09%3Eh%91ndStC%9C%B6kW%BA%CDZ%EA6%B7!H%9B%A6m%5C%9A%C6%24%ED~%B0%07%D9%8Bo%3A%C5w%F1%07%3E%F9%07%0C%D9%83o%7B%92%0D%C6%14a%F8%AC%88%22L%F6%22%B3%9E%9B4M'S%03%B9%F7%BB%DF%F9%EE9'%E7%E4%5E%A0%F9qZ%D3%14%2F%0F%14USO%C5%C2%FC%C4%E4%14%DF%F2%01%5E%1CC%2B%FChM%8B%86%16J%26G%40%0F%D3%B2y%EF%B3%F3%0E%1E%C6lt%EEo%DF%AB%FEc%D5%9A%95%0C%11%F0%1C%20%BE%945%C4%22%E1Y%A0i%5C%D4t%13%E0%D6%89%EF%9D15%C2%CDLsX%A7%04%09%1Fg8oc%81%E1%8C%8D%23%96f45%40%9A%09%C2%07%C5B%3AK%B8%408%98i%E0%F3%0D%D8%CE%81%14%E4'%26%A9%92.%8B%3C%ABER%2F%E5dE%B2%0C%F6%F0%1Fs%83%F2_%B0%A8%94%E9%9B%AD%E7%10%8Dm%9A%19N%D1%7C%8A%DE%1F9%7Dp%8C%E6%00%D5%C1%3F_%18%BDA%B8%9DpX6%E3%A35~B%CD%24%AE%11%26%BD%E7%EEti%98%EDe%9A%97Y)%12%25%1C%24%BCbT%AE3li%E6%0B%03%89%9A%E6%D3%ED%F4P%92%B0%9F4%BF43Y%F3%E3%EDP%95%04%EB1%C5%F5%F6KF%F4%BA%BD%D7%DB%91%93%07%E35%3E%A7)%D6%7F%40%FE%BD%F7%F5r%8A%E5y%92%F0%EB%B4%1E%8D%D5%F4%5B%92%3AV%DB%DB%E4%CD%A6%23%C3%C4wQ%3F%03HB%82%8E%1Cd(%E0%91B%0Ca%9Ac%C4%AA%F8L%16%19%22J%A4%D2itTy%B28%D6%3B(%93%96%ED%1CGx%C9_%0E%B8%5E%16%F5%5B%B2%B8%F6%E0%FB%9E%DD%25%D7%8E%BC%15%85%C5%B7%A3%D8Q%ED%B5%81%E9%BA%B2%13%9A%1B%7Fua%A5%A3n%E17%B9%E5%9B%1Bm%AB%0B%08Q%FE%8A%E5%B1H%5Ee%CAO%82Q%D7u6%E6%90S%97%FCu%0B%CF2%94%EE%25v%12X%0C%BA%AC%F0%5E%F8*l%0AO%85%17%C2%97%BF%D4%C8%CE%DE%AD%11%CB%80q%2C%3E%AB%9ES%CD%C6%EC%25%D2L%D2%EBd%B8%BF%8A%F5B%C6%18%F9%901CZ%9D%BE%24M%9C%8A9%F2%DAP%0B'%06w%82%EB%E6%E2%5C%2F%D7%07%9E%BB%CC%5D%E1%FA%B9%08%AD.r%23%8E%C2%17%F5E%7C!%F0%BE3%BE%3E_%B7o%88a%A7%DB%BE%D3d%EB%A31Z%EB%BB%D3%91%BA%A2%B1z%94%8F%DB'%F6%3D%8E%AA%13%19%B2%B1%BE%B1~V%08%2B%B4%A2cjJ%B3tO%00%03%25mN%97%F3%05%93%EF%11%84%0B%7C%88%AE-%89%8F%ABbW%90O%2B%0Ao%99%0C%5E%97%0CI%AFH%D9.%B0%3B%8F%ED%03%B6S%D6%5D%E6i_s9%F3*p%E9%1B%FD%C3%EB.7U%06%5E%19%C0%D1s.%17%A03u%E4%09%B0%7C%5E%2C%EB%15%DB%1F%3C%9E%B7%80%91%3B%DBc%AD%3Dma%BA%8B%3EV%AB%DBt.%5B%1E%01%BB%0F%AB%D5%9F%CF%AA%D5%DD%E7%E4%7F%0Bx%A3%FC%06%A9%23%0A%D6%C2%A1_2%00%00%00%09pHYs%00%00%0B%13%00%00%0B%13%01%00%9A%9C%18%00%00%003IDAT8%11c%FC%FF%FF%7F%3E%03%1A%60%01%F2%3F%A3%891%80%04%FFQ%26%F8w%C0%B43%A1%DB%0C%E2%8F%0A%A2%85%CAh%80%8C%06%08%3C%04%E8%96%18%00%A3S%0D%CD%CF%D8%C1%9D%00%00%00%00IEND%AEB%60%82\");\ +background-repeat: no-repeat, repeat-x;\ +background-position: center center, top left;\ +}\ +.ace_editor.ace_dragging .ace_content {\ +cursor: move;\ +}\ +.ace_gutter-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;\ +display: inline-block;\ +max-width: 500px;\ +padding: 4px;\ +position: fixed;\ +z-index: 300;\ +-moz-box-sizing: border-box;\ +-webkit-box-sizing: border-box;\ +box-sizing: border-box;\ +cursor: default;\ +white-space: pre-line;\ +word-wrap: break-word;\ +line-height: normal;\ +font-style: normal;\ +font-weight: normal;\ +letter-spacing: normal;\ +}\ +.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,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%05%00%00%00%05%08%06%00%00%00%8Do%26%E5%00%00%004IDATx%DAe%8A%B1%0D%000%0C%C2%F2%2CK%96%BC%D0%8F9%81%88H%E9%D0%0E%96%C0%10%92%3E%02%80%5E%82%E4%A9*-%EEsw%C8%CC%11%EE%96w%D8%DC%E9*Eh%0C%151(%00%00%00%00IEND%AEB%60%82\");\ +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,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%05%00%00%00%05%08%06%00%00%00%8Do%26%E5%00%00%004IDATx%DAm%C7%C1%09%000%08C%D1%8C%ECE%C8E(%8E%EC%02)%1EZJ%F1%C1'%04%07I%E1%E5%EE%CAL%F5%A2%99%99%22%E2%D6%1FU%B5%FE0%D9x%A7%26Wz5%0E%D5%00%00%00%00IEND%AEB%60%82\");\ +}\ +.ace_fold-widget.ace_closed {\ +background-image: url(\"data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%03%00%00%00%06%08%06%00%00%00%06%E5%24%0C%00%00%009IDATx%DA5%CA%C1%09%000%08%03%C0%AC*(%3E%04%C1%0D%BA%B1%23%A4Uh%E0%20%81%C0%CC%F8%82%81%AA%A2%AArGfr%88%08%11%11%1C%DD%7D%E0%EE%5B%F6%F6%CB%B8%05Q%2F%E9tai%D9%00%00%00%00IEND%AEB%60%82\");\ +}\ +.ace_fold-widget:hover {\ +border: 1px solid rgba(0, 0, 0, 0.3);\ +background-color: rgba(255, 255, 255, 0.2);\ +-moz-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);\ +-webkit-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);\ +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);\ +-moz-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);\ +-webkit-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);\ +box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);\ +}\ +/**\ +* Dark version for fold widgets\ +*/\ +.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 {\ +-moz-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\ +-webkit-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\ +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 {\ +-moz-transition: opacity 0.4s ease 0.05s;\ +-webkit-transition: opacity 0.4s ease 0.05s;\ +-o-transition: opacity 0.4s ease 0.05s;\ +-ms-transition: opacity 0.4s ease 0.05s;\ +transition: opacity 0.4s ease 0.05s;\ +opacity: 0;\ +}\ +.ace_fade-fold-widgets:hover .ace_fold-widget {\ +-moz-transition: opacity 0.05s ease 0.05s;\ +-webkit-transition: opacity 0.05s ease 0.05s;\ +-o-transition: opacity 0.05s ease 0.05s;\ +-ms-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;\ +}\ +"; + +dom.importCssString(editorCss, "ace_editor"); + +var VirtualRenderer = function(container, theme) { + var _self = this; + + this.container = container || dom.createElement("div"); + this.$keepTextAreaAtCursor = !useragent.isIE; + + dom.addCssClass(this.container, "ace_editor"); + + this.setTheme(theme); + + this.$gutter = dom.createElement("div"); + this.$gutter.className = "ace_gutter"; + this.container.appendChild(this.$gutter); + + this.scroller = dom.createElement("div"); + this.scroller.className = "ace_scroller"; + this.container.appendChild(this.scroller); + + this.content = dom.createElement("div"); + this.content.className = "ace_content"; + this.scroller.appendChild(this.content); + + this.$gutterLayer = new GutterLayer(this.$gutter); + this.$gutterLayer.on("changeGutterWidth", this.onGutterResize.bind(this)); + + this.$markerBack = new MarkerLayer(this.content); + + var textLayer = this.$textLayer = new TextLayer(this.content); + this.canvas = textLayer.element; + + this.$markerFront = new MarkerLayer(this.content); + + this.$cursorLayer = new CursorLayer(this.content); + this.$horizScroll = false; + + this.scrollBar = new ScrollBar(this.container); + this.scrollBar.addEventListener("scroll", function(e) { + if (!_self.$scrollAnimation) + _self.session.setScrollTop(e.data); + }); + + this.scrollTop = 0; + this.scrollLeft = 0; + + event.addListener(this.scroller, "scroll", function() { + var scrollLeft = _self.scroller.scrollLeft; + _self.scrollLeft = scrollLeft; + _self.session.setScrollLeft(scrollLeft); + }); + + this.cursorPos = { + row : 0, + column : 0 + }; + + this.$textLayer.addEventListener("changeCharacterSize", function() { + _self.updateCharacterSize(); + _self.onResize(true); + }); + + this.$size = { + width: 0, + height: 0, + scrollerHeight: 0, + scrollerWidth: 0 + }; + + this.layerConfig = { + width : 1, + padding : 0, + firstRow : 0, + firstRowScreen: 0, + lastRow : 0, + lineHeight : 1, + characterWidth : 1, + minHeight : 1, + maxHeight : 1, + offset : 0, + height : 1 + }; + + this.$loop = new RenderLoop( + this.$renderChanges.bind(this), + this.container.ownerDocument.defaultView + ); + this.$loop.schedule(this.CHANGE_FULL); + + this.updateCharacterSize(); + this.setPadding(4); + config.resetOptions(this); + config._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; + + oop.implement(this, EventEmitter); + + this.updateCharacterSize = function() { + if (this.$textLayer.allowBoldFonts != this.$allowBoldFonts) { + this.$allowBoldFonts = this.$textLayer.allowBoldFonts; + this.setStyle("ace_nobold", !this.$allowBoldFonts); + } + + this.characterWidth = this.$textLayer.getCharacterWidth(); + this.lineHeight = this.$textLayer.getLineHeight(); + this.$updatePrintMargin(); + }; + this.setSession = function(session) { + this.session = session; + + this.scroller.className = "ace_scroller"; + + this.$cursorLayer.setSession(session); + this.$markerBack.setSession(session); + this.$markerFront.setSession(session); + this.$gutterLayer.setSession(session); + this.$textLayer.setSession(session); + this.$loop.schedule(this.CHANGE_FULL); + + }; + this.updateLines = function(firstRow, lastRow) { + if (lastRow === undefined) + lastRow = Infinity; + + if (!this.$changedLines) { + this.$changedLines = { + firstRow: firstRow, + lastRow: lastRow + }; + } + else { + if (this.$changedLines.firstRow > firstRow) + this.$changedLines.firstRow = firstRow; + + if (this.$changedLines.lastRow < lastRow) + this.$changedLines.lastRow = lastRow; + } + + if (this.$changedLines.firstRow > this.layerConfig.lastRow || + this.$changedLines.lastRow < this.layerConfig.firstRow) + return; + this.$loop.schedule(this.CHANGE_LINES); + }; + + 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(force) { + if (force) + this.$renderChanges(this.CHANGE_FULL, true); + else + this.$loop.schedule(this.CHANGE_FULL); + }; + this.updateFontSize = function() { + this.$textLayer.checkForSizeChanges(); + }; + this.onResize = function(force, gutterWidth, width, height) { + var changes = 0; + var size = this.$size; + + if (this.resizing > 2) + return; + else if (this.resizing > 1) + this.resizing++; + else + this.resizing = force ? 1 : 0; + if (!height) + height = dom.getInnerHeight(this.container); + + if (height && (force || size.height != height)) { + size.height = height; + changes = this.CHANGE_SIZE; + + size.scrollerHeight = this.scroller.clientHeight; + if (force || !size.scrollerHeight) { + size.scrollerHeight = size.height; + if (this.$horizScroll) + size.scrollerHeight -= this.scrollBar.getWidth(); + } + this.scrollBar.setHeight(size.scrollerHeight); + + if (this.session) { + this.session.setScrollTop(this.getScrollTop()); + changes = changes | this.CHANGE_FULL; + } + } + + if (!width) + width = dom.getInnerWidth(this.container); + + if (width && (force || this.resizing > 1 || size.width != width)) { + changes = this.CHANGE_SIZE; + size.width = width; + + var gutterWidth = this.$showGutter ? this.$gutter.offsetWidth : 0; + this.scroller.style.left = gutterWidth + "px"; + size.scrollerWidth = Math.max(0, width - gutterWidth - this.scrollBar.getWidth()); + this.scroller.style.right = this.scrollBar.getWidth() + "px"; + + if (this.session && this.session.getUseWrapMode() && this.adjustWrapLimit() || force) + changes = changes | this.CHANGE_FULL; + } + + if (!this.$size.scrollerHeight) + return; + + if (force) + this.$renderChanges(changes, true); + else + this.$loop.schedule(changes); + + if (force) + this.$gutterLayer.$padding = null; + + if (force) + delete this.resizing; + }; + + this.onGutterResize = function() { + var width = this.$size.width; + var gutterWidth = this.$showGutter ? this.$gutter.offsetWidth : 0; + this.scroller.style.left = gutterWidth + "px"; + this.$size.scrollerWidth = Math.max(0, width - gutterWidth - this.scrollBar.getWidth()); + + if (this.session.getUseWrapMode() && this.adjustWrapLimit()) + this.$loop.schedule(this.CHANGE_FULL); + else + this.$loop.schedule(this.CHANGE_MARKER); + }; + this.adjustWrapLimit = function() { + var availableWidth = this.$size.scrollerWidth - this.$padding * 2; + var limit = Math.floor(availableWidth / this.characterWidth); + return this.session.adjustWrapLimit(limit, this.$showPrintMargin && this.$printMarginColumn); + }; + this.setAnimatedScroll = function(shouldAnimate){ + this.setOption("animatedScroll", shouldAnimate); + }; + this.getAnimatedScroll = function() { + return this.$animatedScroll; + }; + this.setShowInvisibles = function(showInvisibles) { + this.setOption("showInvisibles", showInvisibles); + }; + this.getShowInvisibles = function() { + return this.getOption("showInvisibles"); + }; + this.getDisplayIndentGuides = function() { + return this.getOption("displayIndentGuides"); + }; + + this.setDisplayIndentGuides = function(display) { + this.setOption("displayIndentGuides", display); + }; + this.setShowPrintMargin = function(showPrintMargin) { + this.setOption("showPrintMargin", showPrintMargin); + }; + this.getShowPrintMargin = function() { + return this.getOption("showPrintMargin"); + }; + this.setPrintMarginColumn = function(showPrintMargin) { + this.setOption("printMarginColumn", showPrintMargin); + }; + this.getPrintMarginColumn = function() { + return this.getOption("printMarginColumn"); + }; + this.getShowGutter = function(){ + return this.getOption("showGutter"); + }; + this.setShowGutter = function(show){ + return this.setOption("showGutter", show); + }; + + this.getFadeFoldWidgets = function(){ + return this.getOption("fadeFoldWidgets") + }; + + this.setFadeFoldWidgets = function(show) { + this.setOption("fadeFoldWidgets", show); + }; + + this.setHighlightGutterLine = function(shouldHighlight) { + this.setOption("highlightGutterLine", shouldHighlight); + }; + + this.getHighlightGutterLine = function() { + return this.getOption("highlightGutterLine"); + }; + + this.$updateGutterLineHighlight = function() { + var pos = this.$cursorLayer.$pixelPos; + var height = this.layerConfig.lineHeight; + if (this.session.getUseWrapMode()) { + var cursor = this.session.selection.getCursor(); + cursor.column = 0; + pos = this.$cursorLayer.getPixelPosition(cursor, true); + height *= this.session.getRowLength(cursor.row); + } + this.$gutterLineHighlight.style.top = pos.top - this.layerConfig.offset + "px"; + this.$gutterLineHighlight.style.height = height + "px"; + }; + + this.$updatePrintMargin = function() { + if (!this.$showPrintMargin && !this.$printMarginEl) + return; + + if (!this.$printMarginEl) { + var containerEl = dom.createElement("div"); + containerEl.className = "ace_layer ace_print-margin-layer"; + this.$printMarginEl = dom.createElement("div"); + this.$printMarginEl.className = "ace_print-margin"; + containerEl.appendChild(this.$printMarginEl); + this.content.insertBefore(containerEl, this.content.firstChild); + } + + var style = this.$printMarginEl.style; + style.left = ((this.characterWidth * this.$printMarginColumn) + this.$padding) + "px"; + style.visibility = this.$showPrintMargin ? "visible" : "hidden"; + + if (this.session && this.session.$wrap == -1) + this.adjustWrapLimit(); + }; + this.getContainerElement = function() { + return this.container; + }; + this.getMouseEventTarget = function() { + return this.content; + }; + this.getTextAreaContainer = function() { + return this.container; + }; + this.$moveTextAreaToCursor = function() { + if (!this.$keepTextAreaAtCursor) + return; + var config = this.layerConfig; + var posTop = this.$cursorLayer.$pixelPos.top; + var posLeft = this.$cursorLayer.$pixelPos.left; + posTop -= config.offset; + + var h = this.lineHeight; + if (posTop < 0 || posTop > config.height - h) + return; + + var w = this.characterWidth; + if (this.$composition) { + var val = this.textarea.value.replace(/^\x01+/, ""); + w *= (this.session.$getStringScreenWidth(val)[0]+2); + h += 2; + posTop -= 1; + } + posLeft -= this.scrollLeft; + if (posLeft > this.$size.scrollerWidth - w) + posLeft = this.$size.scrollerWidth - w; + + posLeft -= this.scrollBar.width; + + this.textarea.style.height = h + "px"; + this.textarea.style.width = w + "px"; + this.textarea.style.right = Math.max(0, this.$size.scrollerWidth - posLeft - w) + "px"; + this.textarea.style.bottom = Math.max(0, this.$size.height - posTop - h) + "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 flint = Math.floor((this.layerConfig.height + this.layerConfig.offset) / this.layerConfig.lineHeight); + return this.layerConfig.firstRow - 1 + flint; + }; + this.getLastVisibleRow = function() { + return this.layerConfig.lastRow; + }; + + this.$padding = null; + this.setPadding = function(padding) { + this.$padding = padding; + this.$textLayer.setPadding(padding); + this.$cursorLayer.setPadding(padding); + this.$markerFront.setPadding(padding); + this.$markerBack.setPadding(padding); + this.$loop.schedule(this.CHANGE_FULL); + this.$updatePrintMargin(); + }; + this.getHScrollBarAlwaysVisible = function() { + return this.$hScrollBarAlwaysVisible; + }; + this.setHScrollBarAlwaysVisible = function(alwaysVisible) { + this.setOption("hScrollBarAlwaysVisible", alwaysVisible); + }; + + this.$updateScrollBar = function() { + this.scrollBar.setInnerHeight(this.layerConfig.maxHeight); + this.scrollBar.setScrollTop(this.scrollTop); + }; + + this.$renderChanges = function(changes, force) { + if (!force && (!changes || !this.session || !this.container.offsetWidth)) + return; + + this._signal("beforeRender"); + if (changes & this.CHANGE_FULL || + changes & this.CHANGE_SIZE || + changes & this.CHANGE_TEXT || + changes & this.CHANGE_LINES || + changes & this.CHANGE_SCROLL + ) + this.$computeLayerConfig(); + if (changes & this.CHANGE_H_SCROLL) { + this.scroller.scrollLeft = this.scrollLeft; + var scrollLeft = this.scroller.scrollLeft; + this.scrollLeft = scrollLeft; + this.session.setScrollLeft(scrollLeft); + + this.scroller.className = this.scrollLeft == 0 ? "ace_scroller" : "ace_scroller ace_scroll-left"; + } + if (changes & this.CHANGE_FULL) { + this.$textLayer.checkForSizeChanges(); + this.$updateScrollBar(); + this.$textLayer.update(this.layerConfig); + if (this.$showGutter) + this.$gutterLayer.update(this.layerConfig); + this.$markerBack.update(this.layerConfig); + this.$markerFront.update(this.layerConfig); + this.$cursorLayer.update(this.layerConfig); + this.$moveTextAreaToCursor(); + this.$highlightGutterLine && this.$updateGutterLineHighlight(); + this._signal("afterRender"); + return; + } + if (changes & this.CHANGE_SCROLL) { + if (changes & this.CHANGE_TEXT || changes & this.CHANGE_LINES) + this.$textLayer.update(this.layerConfig); + else + this.$textLayer.scrollLines(this.layerConfig); + + if (this.$showGutter) + this.$gutterLayer.update(this.layerConfig); + this.$markerBack.update(this.layerConfig); + this.$markerFront.update(this.layerConfig); + this.$cursorLayer.update(this.layerConfig); + this.$highlightGutterLine && this.$updateGutterLineHighlight(); + this.$moveTextAreaToCursor(); + this.$updateScrollBar(); + this._signal("afterRender"); + return; + } + + if (changes & this.CHANGE_TEXT) { + this.$textLayer.update(this.layerConfig); + if (this.$showGutter) + this.$gutterLayer.update(this.layerConfig); + } + else if (changes & this.CHANGE_LINES) { + if (this.$updateLines() || (changes & this.CHANGE_GUTTER) && this.$showGutter) + this.$gutterLayer.update(this.layerConfig); + } + else if (changes & this.CHANGE_TEXT || changes & this.CHANGE_GUTTER) { + if (this.$showGutter) + this.$gutterLayer.update(this.layerConfig); + } + + if (changes & this.CHANGE_CURSOR) { + this.$cursorLayer.update(this.layerConfig); + this.$moveTextAreaToCursor(); + this.$highlightGutterLine && this.$updateGutterLineHighlight(); + } + + if (changes & (this.CHANGE_MARKER | this.CHANGE_MARKER_FRONT)) { + this.$markerFront.update(this.layerConfig); + } + + if (changes & (this.CHANGE_MARKER | this.CHANGE_MARKER_BACK)) { + this.$markerBack.update(this.layerConfig); + } + + if (changes & this.CHANGE_SIZE) + this.$updateScrollBar(); + + this._signal("afterRender"); + }; + + this.$computeLayerConfig = function() { + if (!this.$size.scrollerHeight) + return this.onResize(true); + + var session = this.session; + + var offset = this.scrollTop % this.lineHeight; + var minHeight = this.$size.scrollerHeight + this.lineHeight; + + var longestLine = this.$getLongestLine(); + + var horizScroll = this.$hScrollBarAlwaysVisible || this.$size.scrollerWidth - longestLine < 0; + var horizScrollChanged = this.$horizScroll !== horizScroll; + this.$horizScroll = horizScroll; + if (horizScrollChanged) { + this.scroller.style.overflowX = horizScroll ? "scroll" : "hidden"; + if (!horizScroll) + this.session.setScrollLeft(0); + } + var maxHeight = this.session.getScreenLength() * this.lineHeight; + this.session.setScrollTop(Math.max(0, Math.min(this.scrollTop, maxHeight - this.$size.scrollerHeight))); + + var lineCount = Math.ceil(minHeight / this.lineHeight) - 1; + var firstRow = Math.max(0, Math.round((this.scrollTop - offset) / this.lineHeight)); + var lastRow = firstRow + lineCount; + var firstRowScreen, firstRowHeight; + var lineHeight = this.lineHeight; + firstRow = session.screenToDocumentRow(firstRow, 0); + var foldLine = session.getFoldLine(firstRow); + if (foldLine) { + firstRow = foldLine.start.row; + } + + firstRowScreen = session.documentToScreenRow(firstRow, 0); + firstRowHeight = session.getRowLength(firstRow) * lineHeight; + + lastRow = Math.min(session.screenToDocumentRow(lastRow, 0), session.getLength() - 1); + minHeight = this.$size.scrollerHeight + session.getRowLength(lastRow) * lineHeight + + firstRowHeight; + + offset = this.scrollTop - firstRowScreen * lineHeight; + + this.layerConfig = { + width : longestLine, + padding : this.$padding, + firstRow : firstRow, + firstRowScreen: firstRowScreen, + lastRow : lastRow, + lineHeight : lineHeight, + characterWidth : this.characterWidth, + minHeight : minHeight, + maxHeight : maxHeight, + offset : offset, + height : this.$size.scrollerHeight + }; + + this.$gutterLayer.element.style.marginTop = (-offset) + "px"; + this.content.style.marginTop = (-offset) + "px"; + this.content.style.width = longestLine + 2 * this.$padding + "px"; + this.content.style.height = minHeight + "px"; + if (horizScrollChanged) + this.onResize(true); + }; + + this.$updateLines = function() { + var firstRow = this.$changedLines.firstRow; + var lastRow = this.$changedLines.lastRow; + this.$changedLines = null; + + var layerConfig = this.layerConfig; + + if (firstRow > layerConfig.lastRow + 1) { return; } + if (lastRow < layerConfig.firstRow) { return; } + if (lastRow === Infinity) { + if (this.$showGutter) + this.$gutterLayer.update(layerConfig); + this.$textLayer.update(layerConfig); + return; + } + this.$textLayer.updateLines(layerConfig, firstRow, lastRow); + return true; + }; + + this.$getLongestLine = function() { + var charCount = this.session.getScreenWidth(); + if (this.$textLayer.showInvisibles) + charCount += 1; + + return Math.max(this.$size.scrollerWidth - 2 * this.$padding, Math.round(charCount * this.characterWidth)); + }; + this.updateFrontMarkers = function() { + this.$markerFront.setMarkers(this.session.getMarkers(true)); + 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(row, className){ + this.$gutterLayer.addGutterDecoration(row, className); + }; + this.removeGutterDecoration = function(row, className){ + this.$gutterLayer.removeGutterDecoration(row, className); + }; + this.updateBreakpoints = function(rows) { + this.$loop.schedule(this.CHANGE_GUTTER); + }; + this.setAnnotations = function(annotations) { + this.$gutterLayer.setAnnotations(annotations); + 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(anchor, lead, offset) { + this.scrollCursorIntoView(anchor, offset); + this.scrollCursorIntoView(lead, offset); + }; + this.scrollCursorIntoView = function(cursor, offset) { + if (this.$size.scrollerHeight === 0) + return; + + var pos = this.$cursorLayer.getPixelPosition(cursor); + + var left = pos.left; + var top = pos.top; + + if (this.scrollTop > top) { + if (offset) + top -= offset * this.$size.scrollerHeight; + this.session.setScrollTop(top); + } else if (this.scrollTop + this.$size.scrollerHeight < top + this.lineHeight) { + if (offset) + top += offset * this.$size.scrollerHeight; + this.session.setScrollTop(top + this.lineHeight - this.$size.scrollerHeight); + } + + var scrollLeft = this.scrollLeft; + + if (scrollLeft > left) { + if (left < this.$padding + 2 * this.layerConfig.characterWidth) + left = 0; + this.session.setScrollLeft(left); + } else if (scrollLeft + this.$size.scrollerWidth < left + this.characterWidth) { + this.session.setScrollLeft(Math.round(left + this.characterWidth - this.$size.scrollerWidth)); + } + }; + this.getScrollTop = function() { + return this.session.getScrollTop(); + }; + this.getScrollLeft = function() { + return this.session.getScrollLeft(); + }; + this.getScrollTopRow = function() { + return this.scrollTop / this.lineHeight; + }; + this.getScrollBottomRow = function() { + return Math.max(0, Math.floor((this.scrollTop + this.$size.scrollerHeight) / this.lineHeight) - 1); + }; + this.scrollToRow = function(row) { + this.session.setScrollTop(row * this.lineHeight); + }; + + this.alignCursor = function(cursor, alignment) { + if (typeof cursor == "number") + cursor = {row: cursor, column: 0}; + + var pos = this.$cursorLayer.getPixelPosition(cursor); + var h = this.$size.scrollerHeight - this.lineHeight; + var offset = pos.top - h * (alignment || 0); + + this.session.setScrollTop(offset); + return offset; + }; + + this.STEPS = 8; + this.$calcSteps = function(fromValue, toValue){ + var i = 0; + var l = this.STEPS; + var steps = []; + + var func = function(t, x_min, dx) { + return dx * (Math.pow(t - 1, 3) + 1) + x_min; + }; + + for (i = 0; i < l; ++i) + steps.push(func(i / this.STEPS, fromValue, toValue - fromValue)); + + return steps; + }; + this.scrollToLine = function(line, center, animate, callback) { + var pos = this.$cursorLayer.getPixelPosition({row: line, column: 0}); + var offset = pos.top; + if (center) + offset -= this.$size.scrollerHeight / 2; + + var initialScroll = this.scrollTop; + this.session.setScrollTop(offset); + if (animate !== false) + this.animateScrolling(initialScroll, callback); + }; + + this.animateScrolling = function(fromValue, callback) { + var toValue = this.scrollTop; + if (this.$animatedScroll) { + var _self = this; + var steps = _self.$calcSteps(fromValue, toValue); + this.$scrollAnimation = {from: fromValue, to: toValue}; + + clearInterval(this.$timer); + + _self.session.setScrollTop(steps.shift()); + this.$timer = setInterval(function() { + if (steps.length) { + _self.session.setScrollTop(steps.shift()); + _self.session.$scrollTop = toValue; + } else if (toValue != null) { + _self.session.$scrollTop = -1; + _self.session.setScrollTop(toValue); + toValue = null; + } else { + _self.$timer = clearInterval(_self.$timer); + _self.$scrollAnimation = null; + callback && callback(); + } + }, 10); + } + }; + this.scrollToY = function(scrollTop) { + if (this.scrollTop !== scrollTop) { + this.$loop.schedule(this.CHANGE_SCROLL); + this.scrollTop = scrollTop; + } + }; + this.scrollToX = function(scrollLeft) { + if (scrollLeft < 0) + scrollLeft = 0; + + if (this.scrollLeft !== scrollLeft) + this.scrollLeft = scrollLeft; + this.$loop.schedule(this.CHANGE_H_SCROLL); + }; + this.scrollBy = function(deltaX, deltaY) { + deltaY && this.session.setScrollTop(this.session.getScrollTop() + deltaY); + deltaX && this.session.setScrollLeft(this.session.getScrollLeft() + deltaX); + }; + this.isScrollableBy = function(deltaX, deltaY) { + if (deltaY < 0 && this.session.getScrollTop() >= 1) + return true; + if (deltaY > 0 && this.session.getScrollTop() + this.$size.scrollerHeight - this.layerConfig.maxHeight < -1) + return true; + }; + + this.pixelToScreenCoordinates = function(x, y) { + var canvasPos = this.scroller.getBoundingClientRect(); + + var offset = (x + this.scrollLeft - canvasPos.left - this.$padding) / this.characterWidth; + var row = Math.floor((y + this.scrollTop - canvasPos.top) / this.lineHeight); + var col = Math.round(offset); + + return {row: row, column: col, side: offset - col > 0 ? 1 : -1}; + }; + + this.screenToTextCoordinates = function(x, y) { + var canvasPos = this.scroller.getBoundingClientRect(); + + var col = Math.round( + (x + this.scrollLeft - canvasPos.left - this.$padding) / this.characterWidth + ); + var row = Math.floor( + (y + this.scrollTop - canvasPos.top) / this.lineHeight + ); + + return this.session.screenToDocumentPosition(row, Math.max(col, 0)); + }; + this.textToScreenCoordinates = function(row, column) { + var canvasPos = this.scroller.getBoundingClientRect(); + var pos = this.session.documentToScreenPosition(row, column); + + var x = this.$padding + Math.round(pos.column * this.characterWidth); + var y = pos.row * this.lineHeight; + + return { + pageX: canvasPos.left + x - this.scrollLeft, + pageY: canvasPos.top + y - this.scrollTop + }; + }; + this.visualizeFocus = function() { + dom.addCssClass(this.container, "ace_focus"); + }; + this.visualizeBlur = function() { + dom.removeCssClass(this.container, "ace_focus"); + }; + this.showComposition = function(position) { + if (!this.$composition) + this.$composition = { + keepTextAreaAtCursor: this.$keepTextAreaAtCursor, + cssText: this.textarea.style.cssText + }; + + this.$keepTextAreaAtCursor = true; + dom.addCssClass(this.textarea, "ace_composition"); + this.textarea.style.cssText = ""; + this.$moveTextAreaToCursor(); + }; + this.setCompositionText = function(text) { + this.$moveTextAreaToCursor(); + }; + this.hideComposition = function() { + if (!this.$composition) + return; + + dom.removeCssClass(this.textarea, "ace_composition"); + this.$keepTextAreaAtCursor = this.$composition.keepTextAreaAtCursor; + this.textarea.style.cssText = this.$composition.cssText; + this.$composition = null; + }; + this.setTheme = function(theme) { + var _self = this; + this.$themeValue = theme; + _self._dispatchEvent('themeChange',{theme:theme}); + + if (!theme || typeof theme == "string") { + var moduleName = theme || "ace/theme/textmate"; + config.loadModule(["theme", moduleName], afterLoad); + } else { + afterLoad(theme); + } + + function afterLoad(module) { + if (_self.$themeValue != theme) + return; + if (!module.cssClass) + return; + dom.importCssString( + module.cssText, + module.cssClass, + _self.container.ownerDocument + ); + + if (_self.theme) + dom.removeCssClass(_self.container, _self.theme.cssClass); + _self.$theme = module.cssClass; + + _self.theme = module; + dom.addCssClass(_self.container, module.cssClass); + dom.setCssClass(_self.container, "ace_dark", module.isDark); + + var padding = module.padding || 4; + if (_self.$padding && padding != _self.$padding) + _self.setPadding(padding); + if (_self.$size) { + _self.$size.width = 0; + _self.onResize(); + } + + _self._dispatchEvent('themeLoaded',{theme:module}); + } + }; + this.getTheme = function() { + return this.$themeValue; + }; + this.setStyle = function setStyle(style, include) { + dom.setCssClass(this.container, style, include != false); + }; + this.unsetStyle = function unsetStyle(style) { + dom.removeCssClass(this.container, style); + }; + this.destroy = function() { + this.$textLayer.destroy(); + this.$cursorLayer.destroy(); + }; + +}).call(VirtualRenderer.prototype); + + +config.defineOptions(VirtualRenderer.prototype, "renderer", { + animatedScroll: {initialValue: false}, + showInvisibles: { + set: function(value) { + if (this.$textLayer.setShowInvisibles(value)) + this.$loop.schedule(this.CHANGE_TEXT); + }, + initialValue: false + }, + showPrintMargin: { + set: function() { this.$updatePrintMargin(); }, + initialValue: true + }, + printMarginColumn: { + set: function() { this.$updatePrintMargin(); }, + initialValue: 80 + }, + printMargin: { + set: function(val) { + if (typeof val == "number") + this.$printMarginColumn = val; + this.$showPrintMargin = !!val; + this.$updatePrintMargin(); + }, + get: function() { + return this.$showPrintMargin && this.$printMarginColumn; + } + }, + showGutter: { + set: function(show){ + this.$gutter.style.display = show ? "block" : "none"; + this.onGutterResize(); + }, + initialValue: true + }, + fadeFoldWidgets: { + set: function(show) { + dom.setCssClass(this.$gutter, "ace_fade-fold-widgets", show); + }, + initialValue: false + }, + showFoldWidgets: { + set: function(show) {this.$gutterLayer.setShowFoldWidgets(show)}, + initialValue: true + }, + displayIndentGuides: { + set: function(show) { + if (this.$textLayer.setDisplayIndentGuides(show)) + this.$loop.schedule(this.CHANGE_TEXT); + }, + initialValue: true + }, + highlightGutterLine: { + set: function(shouldHighlight) { + if (!this.$gutterLineHighlight) { + this.$gutterLineHighlight = dom.createElement("div"); + this.$gutterLineHighlight.className = "ace_gutter-active-line"; + this.$gutter.appendChild(this.$gutterLineHighlight); + return; + } + + this.$gutterLineHighlight.style.display = shouldHighlight ? "" : "none"; + if (this.$cursorLayer.$pixelPos) + this.$updateGutterLineHighlight(); + }, + initialValue: false, + value: true + }, + hScrollBarAlwaysVisible: { + set: function(alwaysVisible) { + this.$hScrollBarAlwaysVisible = alwaysVisible; + if (!this.$hScrollBarAlwaysVisible || !this.$horizScroll) + this.$loop.schedule(this.CHANGE_SCROLL); + }, + initialValue: false + }, + fontSize: { + set: function(size) { + if (typeof size == "number") + size = size + "px"; + this.container.style.fontSize = size; + this.updateFontSize(); + }, + initialValue: 12 + }, + fontFamily: { + set: function(name) { + this.container.style.fontFamily = name; + this.updateFontSize(); + } + } +}); + +exports.VirtualRenderer = VirtualRenderer; +}); + +ace.define('ace/layer/gutter', ['require', 'exports', 'module' , 'ace/lib/dom', 'ace/lib/oop', 'ace/lib/lang', 'ace/lib/event_emitter'], function(require, exports, module) { + + +var dom = require("../lib/dom"); +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var EventEmitter = require("../lib/event_emitter").EventEmitter; + +var Gutter = function(parentEl) { + this.element = dom.createElement("div"); + this.element.className = "ace_layer ace_gutter-layer"; + parentEl.appendChild(this.element); + this.setShowFoldWidgets(this.$showFoldWidgets); + + this.gutterWidth = 0; + + this.$annotations = []; + this.$updateAnnotations = this.$updateAnnotations.bind(this); +}; + +(function() { + + oop.implement(this, EventEmitter); + + this.setSession = function(session) { + if (this.session) + this.session.removeEventListener("change", this.$updateAnnotations); + this.session = session; + session.on("change", this.$updateAnnotations); + }; + + this.addGutterDecoration = function(row, className){ + if (window.console) + console.warn && console.warn("deprecated use session.addGutterDecoration"); + this.session.addGutterDecoration(row, className); + }; + + this.removeGutterDecoration = function(row, className){ + if (window.console) + console.warn && console.warn("deprecated use session.removeGutterDecoration"); + this.session.removeGutterDecoration(row, className); + }; + + this.setAnnotations = function(annotations) { + this.$annotations = [] + var rowInfo, row; + for (var i = 0; i < annotations.length; i++) { + var annotation = annotations[i]; + var row = annotation.row; + var rowInfo = this.$annotations[row]; + if (!rowInfo) + rowInfo = this.$annotations[row] = {text: []}; + + var annoText = annotation.text; + annoText = annoText ? lang.escapeHTML(annoText) : annotation.html || ""; + + if (rowInfo.text.indexOf(annoText) === -1) + rowInfo.text.push(annoText); + + var type = annotation.type; + if (type == "error") + rowInfo.className = " ace_error"; + else if (type == "warning" && rowInfo.className != " ace_error") + rowInfo.className = " ace_warning"; + else if (type == "info" && (!rowInfo.className)) + rowInfo.className = " ace_info"; + } + }; + + this.$updateAnnotations = function (e) { + if (!this.$annotations.length) + return; + var delta = e.data; + var range = delta.range; + var firstRow = range.start.row; + var len = range.end.row - firstRow; + if (len === 0) { + } else if (delta.action == "removeText" || delta.action == "removeLines") { + this.$annotations.splice(firstRow, len + 1, null); + } else { + var args = Array(len + 1); + args.unshift(firstRow, 1); + this.$annotations.splice.apply(this.$annotations, args); + } + }; + + this.update = function(config) { + var emptyAnno = {className: ""}; + var html = []; + var i = config.firstRow; + var lastRow = config.lastRow; + var fold = this.session.getNextFoldLine(i); + var foldStart = fold ? fold.start.row : Infinity; + var foldWidgets = this.$showFoldWidgets && this.session.foldWidgets; + var breakpoints = this.session.$breakpoints; + var decorations = this.session.$decorations; + var firstLineNumber = this.session.$firstLineNumber; + var lastLineNumber = 0; + + while (true) { + if(i > foldStart) { + i = fold.end.row + 1; + fold = this.session.getNextFoldLine(i, fold); + foldStart = fold ?fold.start.row :Infinity; + } + if(i > lastRow) + break; + + var annotation = this.$annotations[i] || emptyAnno; + html.push( + "

"); + + i++; + } + + this.element = dom.setInnerHtml(this.element, html.join("")); + this.element.style.height = config.minHeight + "px"; + + if (this.session.$useWrapMode) + lastLineNumber = this.session.getLength(); + + var gutterWidth = ("" + lastLineNumber).length * config.characterWidth; + var padding = this.$padding || this.$computePadding(); + gutterWidth += padding.left + padding.right; + if (gutterWidth !== this.gutterWidth) { + this.gutterWidth = gutterWidth; + this.element.style.width = Math.ceil(this.gutterWidth) + "px"; + this._emit("changeGutterWidth", gutterWidth); + } + }; + + this.$showFoldWidgets = true; + this.setShowFoldWidgets = function(show) { + if (show) + dom.addCssClass(this.element, "ace_folding-enabled"); + else + dom.removeCssClass(this.element, "ace_folding-enabled"); + + this.$showFoldWidgets = show; + this.$padding = null; + }; + + this.getShowFoldWidgets = function() { + return this.$showFoldWidgets; + }; + + this.$computePadding = function() { + if (!this.element.firstChild) + return {left: 0, right: 0}; + var style = dom.computedStyle(this.element.firstChild); + this.$padding = {} + this.$padding.left = parseInt(style.paddingLeft) + 1; + this.$padding.right = parseInt(style.paddingRight); + return this.$padding; + }; + + this.getRegion = function(point) { + var padding = this.$padding || this.$computePadding(); + var rect = this.element.getBoundingClientRect(); + if (point.x < padding.left + rect.left) + return "markers"; + if (this.$showFoldWidgets && point.x > rect.right - padding.right) + return "foldWidgets"; + }; + +}).call(Gutter.prototype); + +exports.Gutter = Gutter; + +}); + +ace.define('ace/layer/marker', ['require', 'exports', 'module' , 'ace/range', 'ace/lib/dom'], function(require, exports, module) { + + +var Range = require("../range").Range; +var dom = require("../lib/dom"); + +var Marker = function(parentEl) { + this.element = dom.createElement("div"); + this.element.className = "ace_layer ace_marker-layer"; + parentEl.appendChild(this.element); +}; + +(function() { + + this.$padding = 0; + + this.setPadding = function(padding) { + this.$padding = padding; + }; + this.setSession = function(session) { + this.session = session; + }; + + this.setMarkers = function(markers) { + this.markers = markers; + }; + + this.update = function(config) { + var config = config || this.config; + if (!config) + return; + + this.config = config; + + + var html = []; + for (var key in this.markers) { + var marker = this.markers[key]; + + if (!marker.range) { + marker.update(html, this, this.session, config); + continue; + } + + var range = marker.range.clipRows(config.firstRow, config.lastRow); + if (range.isEmpty()) continue; + + range = range.toScreenRange(this.session); + if (marker.renderer) { + var top = this.$getTop(range.start.row, config); + var left = this.$padding + range.start.column * config.characterWidth; + marker.renderer(html, range, left, top, config); + } else if (marker.type == "fullLine") { + this.drawFullLineMarker(html, range, marker.clazz, config); + } else if (marker.type == "screenLine") { + this.drawScreenLineMarker(html, range, marker.clazz, config); + } else if (range.isMultiLine()) { + if (marker.type == "text") + this.drawTextMarker(html, range, marker.clazz, config); + else + this.drawMultiLineMarker(html, range, marker.clazz, config); + } else { + this.drawSingleLineMarker(html, range, marker.clazz + " ace_start", config); + } + } + this.element = dom.setInnerHtml(this.element, html.join("")); + }; + + this.$getTop = function(row, layerConfig) { + return (row - layerConfig.firstRowScreen) * layerConfig.lineHeight; + }; + this.drawTextMarker = function(stringBuilder, range, clazz, layerConfig, extraStyle) { + var row = range.start.row; + + var lineRange = new Range( + row, range.start.column, + row, this.session.getScreenLastRowColumn(row) + ); + this.drawSingleLineMarker(stringBuilder, lineRange, clazz + " ace_start", layerConfig, 1, extraStyle); + row = range.end.row; + lineRange = new Range(row, 0, row, range.end.column); + this.drawSingleLineMarker(stringBuilder, lineRange, clazz, layerConfig, 0, extraStyle); + + for (row = range.start.row + 1; row < range.end.row; row++) { + lineRange.start.row = row; + lineRange.end.row = row; + lineRange.end.column = this.session.getScreenLastRowColumn(row); + this.drawSingleLineMarker(stringBuilder, lineRange, clazz, layerConfig, 1, extraStyle); + } + }; + this.drawMultiLineMarker = function(stringBuilder, range, clazz, config, extraStyle) { + var padding = this.$padding; + var height = config.lineHeight; + var top = this.$getTop(range.start.row, config); + var left = padding + range.start.column * config.characterWidth; + extraStyle = extraStyle || ""; + + stringBuilder.push( + "
" + ); + top = this.$getTop(range.end.row, config); + var width = range.end.column * config.characterWidth; + + stringBuilder.push( + "
" + ); + height = (range.end.row - range.start.row - 1) * config.lineHeight; + if (height < 0) + return; + top = this.$getTop(range.start.row + 1, config); + + stringBuilder.push( + "
" + ); + }; + this.drawSingleLineMarker = function(stringBuilder, range, clazz, config, extraLength, extraStyle) { + var height = config.lineHeight; + var width = (range.end.column + (extraLength || 0) - range.start.column) * config.characterWidth; + + var top = this.$getTop(range.start.row, config); + var left = this.$padding + range.start.column * config.characterWidth; + + stringBuilder.push( + "
" + ); + }; + + this.drawFullLineMarker = function(stringBuilder, range, clazz, config, extraStyle) { + var top = this.$getTop(range.start.row, config); + var height = config.lineHeight; + if (range.start.row != range.end.row) + height += this.$getTop(range.end.row, config) - top; + + stringBuilder.push( + "
" + ); + }; + + this.drawScreenLineMarker = function(stringBuilder, range, clazz, config, extraStyle) { + var top = this.$getTop(range.start.row, config); + var height = config.lineHeight; + + stringBuilder.push( + "
" + ); + }; + +}).call(Marker.prototype); + +exports.Marker = Marker; + +}); + +ace.define('ace/layer/text', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/dom', 'ace/lib/lang', 'ace/lib/useragent', 'ace/lib/event_emitter'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var dom = require("../lib/dom"); +var lang = require("../lib/lang"); +var useragent = require("../lib/useragent"); +var EventEmitter = require("../lib/event_emitter").EventEmitter; + +var Text = function(parentEl) { + this.element = dom.createElement("div"); + this.element.className = "ace_layer ace_text-layer"; + parentEl.appendChild(this.element); + + this.$characterSize = {width: 0, height: 0}; + this.checkForSizeChanges(); + this.$pollSizeChanges(); +}; + +(function() { + + oop.implement(this, EventEmitter); + + this.EOF_CHAR = "\xB6"; //"¶"; + this.EOL_CHAR = "\xAC"; //"¬"; + this.TAB_CHAR = "\u2192"; //"→" "\u21E5"; + this.SPACE_CHAR = "\xB7"; //"·"; + this.$padding = 0; + + this.setPadding = function(padding) { + this.$padding = padding; + this.element.style.padding = "0 " + padding + "px"; + }; + + this.getLineHeight = function() { + return this.$characterSize.height || 1; + }; + + this.getCharacterWidth = function() { + return this.$characterSize.width || 1; + }; + + this.checkForSizeChanges = function() { + var size = this.$measureSizes(); + if (size && (this.$characterSize.width !== size.width || this.$characterSize.height !== size.height)) { + this.$measureNode.style.fontWeight = "bold"; + var boldSize = this.$measureSizes(); + this.$measureNode.style.fontWeight = ""; + this.$characterSize = size; + this.allowBoldFonts = boldSize && boldSize.width === size.width && boldSize.height === size.height; + this._emit("changeCharacterSize", {data: size}); + } + }; + + this.$pollSizeChanges = function() { + var self = this; + this.$pollSizeChangesTimer = setInterval(function() { + self.checkForSizeChanges(); + }, 500); + }; + + this.$fontStyles = { + fontFamily : 1, + fontSize : 1, + fontWeight : 1, + fontStyle : 1, + lineHeight : 1 + }; + + this.$measureSizes = useragent.isIE || useragent.isOldGecko ? function() { + var n = 1000; + if (!this.$measureNode) { + var measureNode = this.$measureNode = dom.createElement("div"); + var style = measureNode.style; + + style.width = style.height = "auto"; + style.left = style.top = (-n * 40) + "px"; + + style.visibility = "hidden"; + style.position = "fixed"; + style.overflow = "visible"; + style.whiteSpace = "nowrap"; + measureNode.innerHTML = lang.stringRepeat("Xy", n); + + if (this.element.ownerDocument.body) { + this.element.ownerDocument.body.appendChild(measureNode); + } else { + var container = this.element.parentNode; + while (!dom.hasCssClass(container, "ace_editor")) + container = container.parentNode; + container.appendChild(measureNode); + } + } + if (!this.element.offsetWidth) + return null; + + var style = this.$measureNode.style; + var computedStyle = dom.computedStyle(this.element); + for (var prop in this.$fontStyles) + style[prop] = computedStyle[prop]; + + var size = { + height: this.$measureNode.offsetHeight, + width: this.$measureNode.offsetWidth / (n * 2) + }; + if (size.width == 0 || size.height == 0) + return null; + + return size; + } + : function() { + if (!this.$measureNode) { + var measureNode = this.$measureNode = dom.createElement("div"); + var style = measureNode.style; + + style.width = style.height = "auto"; + style.left = style.top = -100 + "px"; + + style.visibility = "hidden"; + style.position = "fixed"; + style.overflow = "visible"; + style.whiteSpace = "nowrap"; + + measureNode.innerHTML = "X"; + + var container = this.element.parentNode; + while (container && !dom.hasCssClass(container, "ace_editor")) + container = container.parentNode; + + if (!container) + return this.$measureNode = null; + + container.appendChild(measureNode); + } + + var rect = this.$measureNode.getBoundingClientRect(); + + var size = { + height: rect.height, + width: rect.width + }; + if (size.width == 0 || size.height == 0) + return null; + + return size; + }; + + this.setSession = function(session) { + this.session = session; + this.$computeTabString(); + }; + + this.showInvisibles = false; + this.setShowInvisibles = function(showInvisibles) { + if (this.showInvisibles == showInvisibles) + return false; + + this.showInvisibles = showInvisibles; + this.$computeTabString(); + return true; + }; + + this.displayIndentGuides = true; + this.setDisplayIndentGuides = function(display) { + if (this.displayIndentGuides == display) + return false; + + this.displayIndentGuides = display; + this.$computeTabString(); + return true; + }; + + this.$tabStrings = []; + this.onChangeTabSize = + this.$computeTabString = function() { + var tabSize = this.session.getTabSize(); + this.tabSize = tabSize; + var tabStr = this.$tabStrings = [0]; + for (var i = 1; i < tabSize + 1; i++) { + if (this.showInvisibles) { + tabStr.push("" + + this.TAB_CHAR + + lang.stringRepeat("\xa0", i - 1) + + ""); + } else { + tabStr.push(lang.stringRepeat("\xa0", i)); + } + } + if (this.displayIndentGuides) { + this.$indentGuideRe = /\s\S| \t|\t |\s$/; + var className = "ace_indent-guide"; + if (this.showInvisibles) { + className += " ace_invisible"; + var spaceContent = lang.stringRepeat(this.SPACE_CHAR, this.tabSize); + var tabContent = this.TAB_CHAR + lang.stringRepeat("\xa0", this.tabSize - 1); + } else{ + var spaceContent = lang.stringRepeat("\xa0", this.tabSize); + var tabContent = spaceContent; + } + + this.$tabStrings[" "] = "" + spaceContent + ""; + this.$tabStrings["\t"] = "" + tabContent + ""; + } + }; + + this.updateLines = function(config, firstRow, lastRow) { + if (this.config.lastRow != config.lastRow || + this.config.firstRow != config.firstRow) { + this.scrollLines(config); + } + this.config = config; + + var first = Math.max(firstRow, config.firstRow); + var last = Math.min(lastRow, config.lastRow); + + var lineElements = this.element.childNodes; + var lineElementsIdx = 0; + + for (var row = config.firstRow; row < first; row++) { + var foldLine = this.session.getFoldLine(row); + if (foldLine) { + if (foldLine.containsRow(first)) { + first = foldLine.start.row; + break; + } else { + row = foldLine.end.row; + } + } + lineElementsIdx ++; + } + + var row = first; + var foldLine = this.session.getNextFoldLine(row); + var foldStart = foldLine ? foldLine.start.row : Infinity; + + while (true) { + if (row > foldStart) { + row = foldLine.end.row+1; + foldLine = this.session.getNextFoldLine(row, foldLine); + foldStart = foldLine ? foldLine.start.row :Infinity; + } + if (row > last) + break; + + var lineElement = lineElements[lineElementsIdx++]; + if (lineElement) { + var html = []; + this.$renderLine( + html, row, !this.$useLineGroups(), row == foldStart ? foldLine : false + ); + dom.setInnerHtml(lineElement, html.join("")); + } + row++; + } + }; + + this.scrollLines = function(config) { + var oldConfig = this.config; + this.config = config; + + if (!oldConfig || oldConfig.lastRow < config.firstRow) + return this.update(config); + + if (config.lastRow < oldConfig.firstRow) + return this.update(config); + + var el = this.element; + if (oldConfig.firstRow < config.firstRow) + for (var row=this.session.getFoldedRowCount(oldConfig.firstRow, config.firstRow - 1); row>0; row--) + el.removeChild(el.firstChild); + + if (oldConfig.lastRow > config.lastRow) + for (var row=this.session.getFoldedRowCount(config.lastRow + 1, oldConfig.lastRow); row>0; row--) + el.removeChild(el.lastChild); + + if (config.firstRow < oldConfig.firstRow) { + var fragment = this.$renderLinesFragment(config, config.firstRow, oldConfig.firstRow - 1); + if (el.firstChild) + el.insertBefore(fragment, el.firstChild); + else + el.appendChild(fragment); + } + + if (config.lastRow > oldConfig.lastRow) { + var fragment = this.$renderLinesFragment(config, oldConfig.lastRow + 1, config.lastRow); + el.appendChild(fragment); + } + }; + + this.$renderLinesFragment = function(config, firstRow, lastRow) { + var fragment = this.element.ownerDocument.createDocumentFragment(); + var row = firstRow; + var foldLine = this.session.getNextFoldLine(row); + var foldStart = foldLine ? foldLine.start.row : Infinity; + + while (true) { + if (row > foldStart) { + row = foldLine.end.row+1; + foldLine = this.session.getNextFoldLine(row, foldLine); + foldStart = foldLine ? foldLine.start.row : Infinity; + } + if (row > lastRow) + break; + + var container = dom.createElement("div"); + + var html = []; + this.$renderLine(html, row, false, row == foldStart ? foldLine : false); + container.innerHTML = html.join(""); + if (this.$useLineGroups()) { + container.className = 'ace_line_group'; + fragment.appendChild(container); + } else { + var lines = container.childNodes + while(lines.length) + fragment.appendChild(lines[0]); + } + + row++; + } + return fragment; + }; + + this.update = function(config) { + this.config = config; + + var html = []; + var firstRow = config.firstRow, lastRow = config.lastRow; + + var row = firstRow; + var foldLine = this.session.getNextFoldLine(row); + var foldStart = foldLine ? foldLine.start.row : Infinity; + + while (true) { + if (row > foldStart) { + row = foldLine.end.row+1; + foldLine = this.session.getNextFoldLine(row, foldLine); + foldStart = foldLine ? foldLine.start.row :Infinity; + } + if (row > lastRow) + break; + + if (this.$useLineGroups()) + html.push("
") + + this.$renderLine(html, row, false, row == foldStart ? foldLine : false); + + if (this.$useLineGroups()) + html.push("
"); // end the line group + + row++; + } + this.element = dom.setInnerHtml(this.element, html.join("")); + }; + + this.$textToken = { + "text": true, + "rparen": true, + "lparen": true + }; + + this.$renderToken = function(stringBuilder, screenColumn, token, value) { + var self = this; + var replaceReg = /\t|&|<|( +)|([\x00-\x1f\x80-\xa0\u1680\u180E\u2000-\u200f\u2028\u2029\u202F\u205F\u3000\uFEFF])|[\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; + var replaceFunc = function(c, a, b, tabIdx, idx4) { + if (a) { + return self.showInvisibles ? + "" + lang.stringRepeat(self.SPACE_CHAR, c.length) + "" : + lang.stringRepeat("\xa0", c.length); + } else if (c == "&") { + return "&"; + } else if (c == "<") { + return "<"; + } else if (c == "\t") { + var tabSize = self.session.getScreenTabSize(screenColumn + tabIdx); + screenColumn += tabSize - 1; + return self.$tabStrings[tabSize]; + } else if (c == "\u3000") { + var classToUse = self.showInvisibles ? "ace_cjk ace_invisible" : "ace_cjk"; + var space = self.showInvisibles ? self.SPACE_CHAR : ""; + screenColumn += 1; + return "" + space + ""; + } else if (b) { + return "" + self.SPACE_CHAR + ""; + } else { + screenColumn += 1; + return "" + c + ""; + } + }; + + var output = value.replace(replaceReg, replaceFunc); + + if (!this.$textToken[token.type]) { + var classes = "ace_" + token.type.replace(/\./g, " ace_"); + var style = ""; + if (token.type == "fold") + style = " style='width:" + (token.value.length * this.config.characterWidth) + "px;' "; + stringBuilder.push("", output, ""); + } + else { + stringBuilder.push(output); + } + return screenColumn + value.length; + }; + + this.renderIndentGuide = function(stringBuilder, value) { + var cols = value.search(this.$indentGuideRe); + if (cols <= 0) + return value; + if (value[0] == " ") { + cols -= cols % this.tabSize; + stringBuilder.push(lang.stringRepeat(this.$tabStrings[" "], cols/this.tabSize)); + return value.substr(cols); + } else if (value[0] == "\t") { + stringBuilder.push(lang.stringRepeat(this.$tabStrings["\t"], cols)); + return value.substr(cols); + } + return value; + }; + + this.$renderWrappedLine = function(stringBuilder, tokens, splits, onlyContents) { + var chars = 0; + var split = 0; + var splitChars = splits[0]; + var screenColumn = 0; + + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i]; + var value = token.value; + if (i == 0 && this.displayIndentGuides) { + chars = value.length; + value = this.renderIndentGuide(stringBuilder, value); + if (!value) + continue; + chars -= value.length; + } + + if (chars + value.length < splitChars) { + screenColumn = this.$renderToken(stringBuilder, screenColumn, token, value); + chars += value.length; + } else { + while (chars + value.length >= splitChars) { + screenColumn = this.$renderToken( + stringBuilder, screenColumn, + token, value.substring(0, splitChars - chars) + ); + value = value.substring(splitChars - chars); + chars = splitChars; + + if (!onlyContents) { + stringBuilder.push("", + "
" + ); + } + + split ++; + screenColumn = 0; + splitChars = splits[split] || Number.MAX_VALUE; + } + if (value.length != 0) { + chars += value.length; + screenColumn = this.$renderToken( + stringBuilder, screenColumn, token, value + ); + } + } + } + }; + + this.$renderSimpleLine = function(stringBuilder, tokens) { + var screenColumn = 0; + var token = tokens[0]; + var value = token.value; + if (this.displayIndentGuides) + value = this.renderIndentGuide(stringBuilder, value); + if (value) + screenColumn = this.$renderToken(stringBuilder, screenColumn, token, value); + for (var i = 1; i < tokens.length; i++) { + token = tokens[i]; + value = token.value; + screenColumn = this.$renderToken(stringBuilder, screenColumn, token, value); + } + }; + this.$renderLine = function(stringBuilder, row, onlyContents, foldLine) { + if (!foldLine && foldLine != false) + foldLine = this.session.getFoldLine(row); + + if (foldLine) + var tokens = this.$getFoldLineTokens(row, foldLine); + else + var tokens = this.session.getTokens(row); + + + if (!onlyContents) { + stringBuilder.push( + "
" + ); + } + + if (tokens.length) { + var splits = this.session.getRowSplitData(row); + if (splits && splits.length) + this.$renderWrappedLine(stringBuilder, tokens, splits, onlyContents); + else + this.$renderSimpleLine(stringBuilder, tokens); + } + + if (this.showInvisibles) { + if (foldLine) + row = foldLine.end.row + + stringBuilder.push( + "", + row == this.session.getLength() - 1 ? this.EOF_CHAR : this.EOL_CHAR, + "" + ); + } + if (!onlyContents) + stringBuilder.push("
"); + }; + + this.$getFoldLineTokens = function(row, foldLine) { + var session = this.session; + var renderTokens = []; + + function addTokens(tokens, from, to) { + var idx = 0, col = 0; + while ((col + tokens[idx].value.length) < from) { + col += tokens[idx].value.length; + idx++; + + if (idx == tokens.length) + return; + } + if (col != from) { + var value = tokens[idx].value.substring(from - col); + if (value.length > (to - from)) + value = value.substring(0, to - from); + + renderTokens.push({ + type: tokens[idx].type, + value: value + }); + + col = from + value.length; + idx += 1; + } + + while (col < to && idx < tokens.length) { + var value = tokens[idx].value; + if (value.length + col > to) { + renderTokens.push({ + type: tokens[idx].type, + value: value.substring(0, to - col) + }); + } else + renderTokens.push(tokens[idx]); + col += value.length; + idx += 1; + } + } + + var tokens = session.getTokens(row); + foldLine.walk(function(placeholder, row, column, lastColumn, isNewRow) { + if (placeholder != null) { + renderTokens.push({ + type: "fold", + value: placeholder + }); + } else { + if (isNewRow) + tokens = session.getTokens(row); + + if (tokens.length) + addTokens(tokens, lastColumn, column); + } + }, foldLine.end.row, this.session.getLine(foldLine.end.row).length); + + return renderTokens; + }; + + this.$useLineGroups = function() { + return this.session.getUseWrapMode(); + }; + + this.destroy = function() { + clearInterval(this.$pollSizeChangesTimer); + if (this.$measureNode) + this.$measureNode.parentNode.removeChild(this.$measureNode); + delete this.$measureNode; + }; + +}).call(Text.prototype); + +exports.Text = Text; + +}); + +ace.define('ace/layer/cursor', ['require', 'exports', 'module' , 'ace/lib/dom'], function(require, exports, module) { + + +var dom = require("../lib/dom"); + +var Cursor = function(parentEl) { + this.element = dom.createElement("div"); + this.element.className = "ace_layer ace_cursor-layer"; + parentEl.appendChild(this.element); + + this.isVisible = false; + this.isBlinking = true; + this.blinkInterval = 1000; + this.smoothBlinking = false; + + this.cursors = []; + this.cursor = this.addCursor(); + dom.addCssClass(this.element, "ace_hidden-cursors"); +}; + +(function() { + + this.$padding = 0; + this.setPadding = function(padding) { + this.$padding = padding; + }; + + this.setSession = function(session) { + this.session = session; + }; + + this.setBlinking = function(blinking) { + if (blinking != this.isBlinking){ + this.isBlinking = blinking; + this.restartTimer(); + } + }; + + this.setBlinkInterval = function(blinkInterval) { + if (blinkInterval != this.blinkInterval){ + this.blinkInterval = blinkInterval; + this.restartTimer(); + } + }; + + this.setSmoothBlinking = function(smoothBlinking) { + if (smoothBlinking != this.smoothBlinking) { + this.smoothBlinking = smoothBlinking; + if (smoothBlinking) + dom.addCssClass(this.element, "ace_smooth-blinking"); + else + dom.removeCssClass(this.element, "ace_smooth-blinking"); + this.restartTimer(); + } + }; + + this.addCursor = function() { + var el = dom.createElement("div"); + el.className = "ace_cursor"; + this.element.appendChild(el); + this.cursors.push(el); + return el; + }; + + this.removeCursor = function() { + if (this.cursors.length > 1) { + var el = this.cursors.pop(); + el.parentNode.removeChild(el); + return el; + } + }; + + this.hideCursor = function() { + this.isVisible = false; + dom.addCssClass(this.element, "ace_hidden-cursors"); + this.restartTimer(); + }; + + this.showCursor = function() { + this.isVisible = true; + dom.removeCssClass(this.element, "ace_hidden-cursors"); + this.restartTimer(); + }; + + this.restartTimer = function() { + clearInterval(this.intervalId); + clearTimeout(this.timeoutId); + if (this.smoothBlinking) + dom.removeCssClass(this.element, "ace_smooth-blinking"); + for (var i = this.cursors.length; i--; ) + this.cursors[i].style.opacity = ""; + + if (!this.isBlinking || !this.blinkInterval || !this.isVisible) + return; + + if (this.smoothBlinking) + setTimeout(function(){ + dom.addCssClass(this.element, "ace_smooth-blinking"); + }.bind(this)); + + var blink = function(){ + this.timeoutId = setTimeout(function() { + for (var i = this.cursors.length; i--; ) { + this.cursors[i].style.opacity = 0; + } + }.bind(this), 0.6 * this.blinkInterval); + }.bind(this); + + this.intervalId = setInterval(function() { + for (var i = this.cursors.length; i--; ) { + this.cursors[i].style.opacity = ""; + } + blink(); + }.bind(this), this.blinkInterval); + + blink(); + }; + + this.getPixelPosition = function(position, onScreen) { + if (!this.config || !this.session) + return {left : 0, top : 0}; + + if (!position) + position = this.session.selection.getCursor(); + var pos = this.session.documentToScreenPosition(position); + var cursorLeft = this.$padding + pos.column * this.config.characterWidth; + var cursorTop = (pos.row - (onScreen ? this.config.firstRowScreen : 0)) * + this.config.lineHeight; + + return {left : cursorLeft, top : cursorTop}; + }; + + this.update = function(config) { + this.config = config; + + var selections = this.session.$selectionMarkers; + var i = 0, cursorIndex = 0; + + if (selections === undefined || selections.length === 0){ + selections = [{cursor: null}]; + } + + for (var i = 0, n = selections.length; i < n; i++) { + var pixelPos = this.getPixelPosition(selections[i].cursor, true); + if ((pixelPos.top > config.height + config.offset || + pixelPos.top < -config.offset) && i > 1) { + continue; + } + + var style = (this.cursors[cursorIndex++] || this.addCursor()).style; + + style.left = pixelPos.left + "px"; + style.top = pixelPos.top + "px"; + style.width = config.characterWidth + "px"; + style.height = config.lineHeight + "px"; + } + while (this.cursors.length > cursorIndex) + this.removeCursor(); + + var overwrite = this.session.getOverwrite(); + this.$setOverwrite(overwrite); + this.$pixelPos = pixelPos; + this.restartTimer(); + }; + + this.$setOverwrite = function(overwrite) { + if (overwrite != this.overwrite) { + this.overwrite = overwrite; + if (overwrite) + dom.addCssClass(this.element, "ace_overwrite-cursors"); + else + dom.removeCssClass(this.element, "ace_overwrite-cursors"); + } + }; + + this.destroy = function() { + clearInterval(this.intervalId); + clearTimeout(this.timeoutId); + }; + +}).call(Cursor.prototype); + +exports.Cursor = Cursor; + +}); + +ace.define('ace/scrollbar', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/dom', 'ace/lib/event', 'ace/lib/event_emitter'], function(require, exports, module) { + + +var oop = require("./lib/oop"); +var dom = require("./lib/dom"); +var event = require("./lib/event"); +var EventEmitter = require("./lib/event_emitter").EventEmitter; +var ScrollBar = function(parent) { + this.element = dom.createElement("div"); + this.element.className = "ace_scrollbar"; + + this.inner = dom.createElement("div"); + this.inner.className = "ace_scrollbar-inner"; + this.element.appendChild(this.inner); + + parent.appendChild(this.element); + this.width = dom.scrollbarWidth(parent.ownerDocument); + this.element.style.width = (this.width || 15) + 5 + "px"; + + event.addListener(this.element, "scroll", this.onScroll.bind(this)); +}; + +(function() { + oop.implement(this, EventEmitter); + this.onScroll = function() { + if (!this.skipEvent) { + this.scrollTop = this.element.scrollTop; + this._emit("scroll", {data: this.scrollTop}); + } + this.skipEvent = false; + }; + this.getWidth = function() { + return this.width; + }; + this.setHeight = function(height) { + this.element.style.height = height + "px"; + }; + this.setInnerHeight = function(height) { + this.inner.style.height = height + "px"; + }; + this.setScrollTop = function(scrollTop) { + if (this.scrollTop != scrollTop) { + this.skipEvent = true; + this.scrollTop = this.element.scrollTop = scrollTop; + } + }; + +}).call(ScrollBar.prototype); + +exports.ScrollBar = ScrollBar; +}); + +ace.define('ace/renderloop', ['require', 'exports', 'module' , 'ace/lib/event'], function(require, exports, module) { + + +var event = require("./lib/event"); + + +var RenderLoop = function(onRender, win) { + this.onRender = onRender; + this.pending = false; + this.changes = 0; + this.window = win || window; +}; + +(function() { + + + this.schedule = function(change) { + this.changes = this.changes | change; + if (!this.pending) { + this.pending = true; + var _self = this; + event.nextFrame(function() { + _self.pending = false; + var changes; + while (changes = _self.changes) { + _self.changes = 0; + _self.onRender(changes); + } + }, this.window); + } + }; + +}).call(RenderLoop.prototype); + +exports.RenderLoop = RenderLoop; +}); + +ace.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'], function(require, exports, module) { + +var RangeList = require("./range_list").RangeList; +var Range = require("./range").Range; +var Selection = require("./selection").Selection; +var onMouseDown = require("./mouse/multi_select_handler").onMouseDown; +var event = require("./lib/event"); +var lang = require("./lib/lang"); +var commands = require("./commands/multi_select_commands"); +exports.commands = commands.defaultCommands.concat(commands.multiSelectCommands); +var Search = require("./search").Search; +var search = new Search(); + +function find(session, needle, dir) { + search.$options.wrap = true; + search.$options.needle = needle; + search.$options.backwards = dir == -1; + return search.find(session); +} +var EditSession = require("./edit_session").EditSession; +(function() { + this.getSelectionMarkers = function() { + return this.$selectionMarkers; + }; +}).call(EditSession.prototype); +(function() { + this.ranges = null; + this.rangeList = null; + this.addRange = function(range, $blockChangeEvents) { + if (!range) + return; + + if (!this.inMultiSelectMode && this.rangeCount == 0) { + var oldRange = this.toOrientedRange(); + this.rangeList.add(oldRange); + this.rangeList.add(range); + if (this.rangeList.ranges.length != 2) { + this.rangeList.removeAll(); + return $blockChangeEvents || this.fromOrientedRange(range); + } + this.rangeList.removeAll(); + this.rangeList.add(oldRange); + this.$onAddRange(oldRange); + } + + if (!range.cursor) + range.cursor = range.end; + + var removed = this.rangeList.add(range); + + this.$onAddRange(range); + + if (removed.length) + this.$onRemoveRange(removed); + + if (this.rangeCount > 1 && !this.inMultiSelectMode) { + this._emit("multiSelect"); + this.inMultiSelectMode = true; + this.session.$undoSelect = false; + this.rangeList.attach(this.session); + } + + return $blockChangeEvents || this.fromOrientedRange(range); + }; + + this.toSingleRange = function(range) { + range = range || this.ranges[0]; + var removed = this.rangeList.removeAll(); + if (removed.length) + this.$onRemoveRange(removed); + + range && this.fromOrientedRange(range); + }; + this.substractPoint = function(pos) { + var removed = this.rangeList.substractPoint(pos); + if (removed) { + this.$onRemoveRange(removed); + return removed[0]; + } + }; + this.mergeOverlappingRanges = function() { + var removed = this.rangeList.merge(); + if (removed.length) + this.$onRemoveRange(removed); + else if(this.ranges[0]) + this.fromOrientedRange(this.ranges[0]); + }; + + this.$onAddRange = function(range) { + this.rangeCount = this.rangeList.ranges.length; + this.ranges.unshift(range); + this._emit("addRange", {range: range}); + }; + + this.$onRemoveRange = function(removed) { + this.rangeCount = this.rangeList.ranges.length; + if (this.rangeCount == 1 && this.inMultiSelectMode) { + var lastRange = this.rangeList.ranges.pop(); + removed.push(lastRange); + this.rangeCount = 0; + } + + for (var i = removed.length; i--; ) { + var index = this.ranges.indexOf(removed[i]); + this.ranges.splice(index, 1); + } + + this._emit("removeRange", {ranges: removed}); + + if (this.rangeCount == 0 && this.inMultiSelectMode) { + this.inMultiSelectMode = false; + this._emit("singleSelect"); + this.session.$undoSelect = true; + this.rangeList.detach(this.session); + } + + lastRange = lastRange || this.ranges[0]; + if (lastRange && !lastRange.isEqual(this.getRange())) + this.fromOrientedRange(lastRange); + }; + this.$initRangeList = function() { + if (this.rangeList) + return; + + this.rangeList = new RangeList(); + this.ranges = []; + this.rangeCount = 0; + }; + this.getAllRanges = function() { + return this.rangeList.ranges.concat(); + }; + + this.splitIntoLines = function () { + if (this.rangeCount > 1) { + var ranges = this.rangeList.ranges; + var lastRange = ranges[ranges.length - 1]; + var range = Range.fromPoints(ranges[0].start, lastRange.end); + + this.toSingleRange(); + this.setSelectionRange(range, lastRange.cursor == lastRange.start); + } else { + var range = this.getRange(); + var isBackwards = this.isBackwards(); + var startRow = range.start.row; + var endRow = range.end.row; + if (startRow == endRow) { + if (isBackwards) + var start = range.end, end = range.start; + else + var start = range.start, end = range.end; + + this.addRange(Range.fromPoints(end, end)); + this.addRange(Range.fromPoints(start, start)); + return; + } + + var rectSel = []; + var r = this.getLineRange(startRow, true); + r.start.column = range.start.column; + rectSel.push(r); + + for (var i = startRow + 1; i < endRow; i++) + rectSel.push(this.getLineRange(i, true)); + + r = this.getLineRange(endRow, true); + r.end.column = range.end.column; + rectSel.push(r); + + rectSel.forEach(this.addRange, this); + } + }; + this.toggleBlockSelection = function () { + if (this.rangeCount > 1) { + var ranges = this.rangeList.ranges; + var lastRange = ranges[ranges.length - 1]; + var range = Range.fromPoints(ranges[0].start, lastRange.end); + + this.toSingleRange(); + this.setSelectionRange(range, lastRange.cursor == lastRange.start); + } else { + var cursor = this.session.documentToScreenPosition(this.selectionLead); + var anchor = this.session.documentToScreenPosition(this.selectionAnchor); + + var rectSel = this.rectangularRangeBlock(cursor, anchor); + rectSel.forEach(this.addRange, this); + } + }; + this.rectangularRangeBlock = function(screenCursor, screenAnchor, includeEmptyLines) { + var rectSel = []; + + var xBackwards = screenCursor.column < screenAnchor.column; + if (xBackwards) { + var startColumn = screenCursor.column; + var endColumn = screenAnchor.column; + } else { + var startColumn = screenAnchor.column; + var endColumn = screenCursor.column; + } + + var yBackwards = screenCursor.row < screenAnchor.row; + if (yBackwards) { + var startRow = screenCursor.row; + var endRow = screenAnchor.row; + } else { + var startRow = screenAnchor.row; + var endRow = screenCursor.row; + } + + if (startColumn < 0) + startColumn = 0; + if (startRow < 0) + startRow = 0; + + if (startRow == endRow) + includeEmptyLines = true; + + for (var row = startRow; row <= endRow; row++) { + var range = Range.fromPoints( + this.session.screenToDocumentPosition(row, startColumn), + this.session.screenToDocumentPosition(row, endColumn) + ); + if (range.isEmpty()) { + if (docEnd && isSamePoint(range.end, docEnd)) + break; + var docEnd = range.end; + } + range.cursor = xBackwards ? range.start : range.end; + rectSel.push(range); + } + + if (yBackwards) + rectSel.reverse(); + + if (!includeEmptyLines) { + var end = rectSel.length - 1; + while (rectSel[end].isEmpty() && end > 0) + end--; + if (end > 0) { + var start = 0; + while (rectSel[start].isEmpty()) + start++; + } + for (var i = end; i >= start; i--) { + if (rectSel[i].isEmpty()) + rectSel.splice(i, 1); + } + } + + return rectSel; + }; +}).call(Selection.prototype); +var Editor = require("./editor").Editor; +(function() { + this.updateSelectionMarkers = function() { + this.renderer.updateCursor(); + this.renderer.updateBackMarkers(); + }; + this.addSelectionMarker = function(orientedRange) { + if (!orientedRange.cursor) + orientedRange.cursor = orientedRange.end; + + var style = this.getSelectionStyle(); + orientedRange.marker = this.session.addMarker(orientedRange, "ace_selection", style); + + this.session.$selectionMarkers.push(orientedRange); + this.session.selectionMarkerCount = this.session.$selectionMarkers.length; + return orientedRange; + }; + this.removeSelectionMarker = function(range) { + if (!range.marker) + return; + this.session.removeMarker(range.marker); + var index = this.session.$selectionMarkers.indexOf(range); + if (index != -1) + this.session.$selectionMarkers.splice(index, 1); + this.session.selectionMarkerCount = this.session.$selectionMarkers.length; + }; + + this.removeSelectionMarkers = function(ranges) { + var markerList = this.session.$selectionMarkers; + for (var i = ranges.length; i--; ) { + var range = ranges[i]; + if (!range.marker) + continue; + this.session.removeMarker(range.marker); + var index = markerList.indexOf(range); + if (index != -1) + markerList.splice(index, 1); + } + this.session.selectionMarkerCount = markerList.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 = true; + + this.setStyle("ace_multiselect"); + this.keyBinding.addKeyboardHandler(commands.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 = false; + + this.unsetStyle("ace_multiselect"); + this.keyBinding.removeKeyboardHandler(commands.keyboardHandler); + + this.commands.removeDefaultHandler("exec", this.$onMultiSelectExec); + this.renderer.updateCursor(); + this.renderer.updateBackMarkers(); + }; + + this.$onMultiSelectExec = function(e) { + var command = e.command; + var editor = e.editor; + if (!editor.multiSelect) + return; + if (!command.multiSelectAction) { + var result = command.exec(editor, e.args || {}); + editor.multiSelect.addRange(editor.multiSelect.toOrientedRange()); + editor.multiSelect.mergeOverlappingRanges(); + } else if (command.multiSelectAction == "forEach") { + result = editor.forEachSelection(command, e.args); + } else if (command.multiSelectAction == "forEachLine") { + result = editor.forEachSelection(command, e.args, true); + } else if (command.multiSelectAction == "single") { + editor.exitMultiSelectMode(); + result = command.exec(editor, e.args || {}); + } else { + result = command.multiSelectAction(editor, e.args || {}); + } + return result; + }; + this.forEachSelection = function(cmd, args, $byLines) { + if (this.inVirtualSelectionMode) + return; + + var session = this.session; + var selection = this.selection; + var rangeList = selection.rangeList; + var result; + + var reg = selection._eventRegistry; + selection._eventRegistry = {}; + + var tmpSel = new Selection(session); + this.inVirtualSelectionMode = true; + for (var i = rangeList.ranges.length; i--;) { + if ($byLines) { + while (i > 0 && rangeList.ranges[i].start.row == rangeList.ranges[i - 1].end.row) + i--; + } + tmpSel.fromOrientedRange(rangeList.ranges[i]); + this.selection = session.selection = tmpSel; + var cmdResult = cmd.exec(this, args || {}); + if (!result == undefined) + result = cmdResult; + tmpSel.toOrientedRange(rangeList.ranges[i]); + } + tmpSel.detach(); + + this.selection = session.selection = selection; + this.inVirtualSelectionMode = false; + selection._eventRegistry = reg; + selection.mergeOverlappingRanges(); + + var anim = this.renderer.$scrollAnimation; + this.onCursorChange(); + this.onSelectionChange(); + if (anim && anim.from == anim.to) + this.renderer.animateScrolling(anim.from); + + return result; + }; + this.exitMultiSelectMode = function() { + if (!this.inMultiSelectMode || this.inVirtualSelectionMode) + return; + this.multiSelect.toSingleRange(); + }; + + this.getCopyText = function() { + var text = ""; + if (this.inMultiSelectMode && !this.inVirtualSelectionMode) { + var ranges = this.multiSelect.rangeList.ranges; + var buf = []; + for (var i = 0; i < ranges.length; i++) { + buf.push(this.session.getTextRange(ranges[i])); + } + var nl = this.session.getDocument().getNewLineCharacter(); + text = buf.join(nl); + if (text.length == (buf.length - 1) * nl.length) + text = ""; + } else if (!this.selection.isEmpty()) { + text = this.session.getTextRange(this.getSelectionRange()); + } + this._signal("copy", text); + return text; + }; + this.onPaste = function(text) { + if (this.$readOnly) + return; + + this._signal("paste", text); + if (!this.inMultiSelectMode || this.inVirtualSelectionMode) + return this.insert(text); + + var lines = text.split(/\r\n|\r|\n/); + var ranges = this.selection.rangeList.ranges; + + if (lines.length > ranges.length || lines.length < 2 || !lines[1]) + return this.commands.exec("insertstring", this, text); + + for (var i = ranges.length; i--;) { + var range = ranges[i]; + if (!range.isEmpty()) + this.session.remove(range); + + this.session.insert(range.start, lines[i]); + } + }; + this.findAll = function(needle, options, additive) { + options = options || {}; + options.needle = needle || options.needle; + this.$search.set(options); + + var ranges = this.$search.findAll(this.session); + if (!ranges.length) + return 0; + + this.$blockScrolling += 1; + var selection = this.multiSelect; + + if (!additive) + selection.toSingleRange(ranges[0]); + + for (var i = ranges.length; i--; ) + selection.addRange(ranges[i], true); + + this.$blockScrolling -= 1; + + return ranges.length; + }; + this.selectMoreLines = function(dir, skip) { + var range = this.selection.toOrientedRange(); + var isBackwards = range.cursor == range.end; + + var screenLead = this.session.documentToScreenPosition(range.cursor); + if (this.selection.$desiredColumn) + screenLead.column = this.selection.$desiredColumn; + + var lead = this.session.screenToDocumentPosition(screenLead.row + dir, screenLead.column); + + if (!range.isEmpty()) { + var screenAnchor = this.session.documentToScreenPosition(isBackwards ? range.end : range.start); + var anchor = this.session.screenToDocumentPosition(screenAnchor.row + dir, screenAnchor.column); + } else { + var anchor = lead; + } + + if (isBackwards) { + var newRange = Range.fromPoints(lead, anchor); + newRange.cursor = newRange.start; + } else { + var newRange = Range.fromPoints(anchor, lead); + newRange.cursor = newRange.end; + } + + newRange.desiredColumn = screenLead.column; + if (!this.selection.inMultiSelectMode) { + this.selection.addRange(range); + } else { + if (skip) + var toRemove = range.cursor; + } + + this.selection.addRange(newRange); + if (toRemove) + this.selection.substractPoint(toRemove); + }; + this.transposeSelections = function(dir) { + var session = this.session; + var sel = session.multiSelect; + var all = sel.ranges; + + for (var i = all.length; i--; ) { + var range = all[i]; + if (range.isEmpty()) { + var tmp = session.getWordRange(range.start.row, range.start.column); + range.start.row = tmp.start.row; + range.start.column = tmp.start.column; + range.end.row = tmp.end.row; + range.end.column = tmp.end.column; + } + } + sel.mergeOverlappingRanges(); + + var words = []; + for (var i = all.length; i--; ) { + var range = all[i]; + words.unshift(session.getTextRange(range)); + } + + if (dir < 0) + words.unshift(words.pop()); + else + words.push(words.shift()); + + for (var i = all.length; i--; ) { + var range = all[i]; + var tmp = range.clone(); + session.replace(range, words[i]); + range.start.row = tmp.start.row; + range.start.column = tmp.start.column; + } + }; + this.selectMore = function(dir, skip) { + var session = this.session; + var sel = session.multiSelect; + + var range = sel.toOrientedRange(); + if (range.isEmpty()) { + var range = session.getWordRange(range.start.row, range.start.column); + range.cursor = range.end; + this.multiSelect.addRange(range); + } + var needle = session.getTextRange(range); + + var newRange = find(session, needle, dir); + if (newRange) { + newRange.cursor = dir == -1 ? newRange.start : newRange.end; + this.multiSelect.addRange(newRange); + } + if (skip) + this.multiSelect.substractPoint(range.cursor); + }; + this.alignCursors = function() { + var session = this.session; + var sel = session.multiSelect; + var ranges = sel.ranges; + + if (!ranges.length) { + var range = this.selection.getRange(); + var fr = range.start.row, lr = range.end.row; + var lines = this.session.doc.removeLines(fr, lr); + lines = this.$reAlignText(lines); + this.session.doc.insertLines(fr, lines); + range.start.column = 0; + range.end.column = lines[lines.length - 1].length; + this.selection.setRange(range); + } else { + var row = -1; + var sameRowRanges = ranges.filter(function(r) { + if (r.cursor.row == row) + return true; + row = r.cursor.row; + }); + sel.$onRemoveRange(sameRowRanges); + + var maxCol = 0; + var minSpace = Infinity; + var spaceOffsets = ranges.map(function(r) { + var p = r.cursor; + var line = session.getLine(p.row); + var spaceOffset = line.substr(p.column).search(/\S/g); + if (spaceOffset == -1) + spaceOffset = 0; + + if (p.column > maxCol) + maxCol = p.column; + if (spaceOffset < minSpace) + minSpace = spaceOffset; + return spaceOffset; + }); + ranges.forEach(function(r, i) { + var p = r.cursor; + var l = maxCol - p.column; + var d = spaceOffsets[i] - minSpace; + if (l > d) + session.insert(p, lang.stringRepeat(" ", l - d)); + else + session.remove(new Range(p.row, p.column, p.row, p.column - l + d)); + + r.start.column = r.end.column = maxCol; + r.start.row = r.end.row = p.row; + r.cursor = r.end; + }); + sel.fromOrientedRange(ranges[0]); + this.renderer.updateCursor(); + this.renderer.updateBackMarkers(); + } + }; + + this.$reAlignText = function(lines) { + var isLeftAligned = true, isRightAligned = true; + var startW, textW, endW; + + return lines.map(function(line) { + var m = line.match(/(\s*)(.*?)(\s*)([=:].*)/); + if (!m) + return [line]; + + if (startW == null) { + startW = m[1].length; + textW = m[2].length; + endW = m[3].length; + return m; + } + + if (startW + textW + endW != m[1].length + m[2].length + m[3].length) + isRightAligned = false; + if (startW != m[1].length) + isLeftAligned = false; + + if (startW > m[1].length) + startW = m[1].length; + if (textW < m[2].length) + textW = m[2].length; + if (endW > m[3].length) + endW = m[3].length; + + return m; + }).map(isLeftAligned ? isRightAligned ? alignRight : alignLeft : unAlign); + + function spaces(n) { + return lang.stringRepeat(" ", n); + } + + function alignLeft(m) { + return !m[2] ? m[0] : spaces(startW) + m[2] + + spaces(textW - m[2].length + endW) + + m[4].replace(/^([=:])\s+/, "$1 ") + } + function alignRight(m) { + return !m[2] ? m[0] : spaces(startW + textW - m[2].length) + m[2] + + spaces(endW, " ") + + m[4].replace(/^([=:])\s+/, "$1 ") + } + function unAlign(m) { + return !m[2] ? m[0] : spaces(startW) + m[2] + + spaces(endW) + + m[4].replace(/^([=:])\s+/, "$1 ") + } + } +}).call(Editor.prototype); + + +function isSamePoint(p1, p2) { + return p1.row == p2.row && p1.column == p2.column; +} +exports.onSessionChange = function(e) { + var session = e.session; + if (!session.multiSelect) { + session.$selectionMarkers = []; + session.selection.$initRangeList(); + session.multiSelect = session.selection; + } + this.multiSelect = session.multiSelect; + + var oldSession = e.oldSession; + if (oldSession) { + oldSession.multiSelect.removeEventListener("addRange", this.$onAddRange); + oldSession.multiSelect.removeEventListener("removeRange", this.$onRemoveRange); + oldSession.multiSelect.removeEventListener("multiSelect", this.$onMultiSelect); + oldSession.multiSelect.removeEventListener("singleSelect", this.$onSingleSelect); + } + + session.multiSelect.on("addRange", this.$onAddRange); + session.multiSelect.on("removeRange", this.$onRemoveRange); + session.multiSelect.on("multiSelect", this.$onMultiSelect); + session.multiSelect.on("singleSelect", this.$onSingleSelect); + + if (this.inMultiSelectMode != session.selection.inMultiSelectMode) { + if (session.selection.inMultiSelectMode) + this.$onMultiSelect(); + else + this.$onSingleSelect(); + } +}; +function MultiSelect(editor) { + editor.$onAddRange = editor.$onAddRange.bind(editor); + editor.$onRemoveRange = editor.$onRemoveRange.bind(editor); + editor.$onMultiSelect = editor.$onMultiSelect.bind(editor); + editor.$onSingleSelect = editor.$onSingleSelect.bind(editor); + + exports.onSessionChange.call(editor, editor); + editor.on("changeSession", exports.onSessionChange.bind(editor)); + + editor.on("mousedown", onMouseDown); + editor.commands.addCommands(commands.defaultCommands); + + addAltCursorListeners(editor); +} + +function addAltCursorListeners(editor){ + var el = editor.textInput.getElement(); + var altCursor = false; + var contentEl = editor.renderer.content; + event.addListener(el, "keydown", function(e) { + if (e.keyCode == 18 && !(e.ctrlKey || e.shiftKey || e.metaKey)) { + if (!altCursor) { + contentEl.style.cursor = "crosshair"; + altCursor = true; + } + } else if (altCursor) { + contentEl.style.cursor = ""; + } + }); + + event.addListener(el, "keyup", reset); + event.addListener(el, "blur", reset); + function reset() { + if (altCursor) { + contentEl.style.cursor = ""; + altCursor = false; + } + } +} + +exports.MultiSelect = MultiSelect; + +}); + +ace.define('ace/mouse/multi_select_handler', ['require', 'exports', 'module' , 'ace/lib/event'], function(require, exports, module) { + +var event = require("../lib/event"); +function isSamePoint(p1, p2) { + return p1.row == p2.row && p1.column == p2.column; +} + +function onMouseDown(e) { + var ev = e.domEvent; + var alt = ev.altKey; + var shift = ev.shiftKey; + var ctrl = e.getAccelKey(); + var button = e.getButton(); + + if (e.editor.inMultiSelectMode && button == 2) { + e.editor.textInput.onContextMenu(e.domEvent); + return; + } + + if (!ctrl && !alt) { + if (button == 0 && e.editor.inMultiSelectMode) + e.editor.exitMultiSelectMode(); + return; + } + + var editor = e.editor; + var selection = editor.selection; + var isMultiSelect = editor.inMultiSelectMode; + var pos = e.getDocumentPosition(); + var cursor = selection.getCursor(); + var inSelection = e.inSelection() || (selection.isEmpty() && isSamePoint(pos, cursor)); + + + var mouseX = e.x, mouseY = e.y; + var onMouseSelection = function(e) { + mouseX = e.clientX; + mouseY = e.clientY; + }; + + var blockSelect = function() { + var newCursor = editor.renderer.pixelToScreenCoordinates(mouseX, mouseY); + var cursor = session.screenToDocumentPosition(newCursor.row, newCursor.column); + + if (isSamePoint(screenCursor, newCursor) + && isSamePoint(cursor, selection.selectionLead)) + return; + screenCursor = newCursor; + + editor.selection.moveCursorToPosition(cursor); + editor.selection.clearSelection(); + editor.renderer.scrollCursorIntoView(); + + editor.removeSelectionMarkers(rectSel); + rectSel = selection.rectangularRangeBlock(screenCursor, screenAnchor); + rectSel.forEach(editor.addSelectionMarker, editor); + editor.updateSelectionMarkers(); + }; + + var session = editor.session; + var screenAnchor = editor.renderer.pixelToScreenCoordinates(mouseX, mouseY); + var screenCursor = screenAnchor; + + + + if (ctrl && !shift && !alt && button == 0) { + if (!isMultiSelect && inSelection) + return; // dragging + + if (!isMultiSelect) { + var range = selection.toOrientedRange(); + editor.addSelectionMarker(range); + } + + var oldRange = selection.rangeList.rangeAtPoint(pos); + + editor.once("mouseup", function() { + var tmpSel = selection.toOrientedRange(); + + if (oldRange && tmpSel.isEmpty() && isSamePoint(oldRange.cursor, tmpSel.cursor)) + selection.substractPoint(tmpSel.cursor); + else { + if (range) { + editor.removeSelectionMarker(range); + selection.addRange(range); + } + selection.addRange(tmpSel); + } + }); + + } else if (alt && button == 0) { + e.stop(); + + if (isMultiSelect && !ctrl) + selection.toSingleRange(); + else if (!isMultiSelect && ctrl) + selection.addRange(); + + var rectSel = []; + if (shift) { + screenAnchor = session.documentToScreenPosition(selection.lead); + blockSelect(); + } else { + selection.moveCursorToPosition(pos); + selection.clearSelection(); + } + + + var onMouseSelectionEnd = function(e) { + clearInterval(timerId); + editor.removeSelectionMarkers(rectSel); + for (var i = 0; i < rectSel.length; i++) + selection.addRange(rectSel[i]); + }; + + var onSelectionInterval = blockSelect; + + event.capture(editor.container, onMouseSelection, onMouseSelectionEnd); + var timerId = setInterval(function() {onSelectionInterval();}, 20); + + return e.preventDefault(); + } +} + + +exports.onMouseDown = onMouseDown; + +}); + +ace.define('ace/commands/multi_select_commands', ['require', 'exports', 'module' , 'ace/keyboard/hash_handler'], function(require, exports, module) { +exports.defaultCommands = [{ + name: "addCursorAbove", + exec: function(editor) { editor.selectMoreLines(-1); }, + bindKey: {win: "Ctrl-Alt-Up", mac: "Ctrl-Alt-Up"}, + readonly: true +}, { + name: "addCursorBelow", + exec: function(editor) { editor.selectMoreLines(1); }, + bindKey: {win: "Ctrl-Alt-Down", mac: "Ctrl-Alt-Down"}, + readonly: true +}, { + name: "addCursorAboveSkipCurrent", + exec: function(editor) { editor.selectMoreLines(-1, true); }, + bindKey: {win: "Ctrl-Alt-Shift-Up", mac: "Ctrl-Alt-Shift-Up"}, + readonly: true +}, { + name: "addCursorBelowSkipCurrent", + exec: function(editor) { editor.selectMoreLines(1, true); }, + bindKey: {win: "Ctrl-Alt-Shift-Down", mac: "Ctrl-Alt-Shift-Down"}, + readonly: true +}, { + name: "selectMoreBefore", + exec: function(editor) { editor.selectMore(-1); }, + bindKey: {win: "Ctrl-Alt-Left", mac: "Ctrl-Alt-Left"}, + readonly: true +}, { + name: "selectMoreAfter", + exec: function(editor) { editor.selectMore(1); }, + bindKey: {win: "Ctrl-Alt-Right", mac: "Ctrl-Alt-Right"}, + readonly: true +}, { + name: "selectNextBefore", + exec: function(editor) { editor.selectMore(-1, true); }, + bindKey: {win: "Ctrl-Alt-Shift-Left", mac: "Ctrl-Alt-Shift-Left"}, + readonly: true +}, { + name: "selectNextAfter", + exec: function(editor) { editor.selectMore(1, true); }, + bindKey: {win: "Ctrl-Alt-Shift-Right", mac: "Ctrl-Alt-Shift-Right"}, + readonly: true +}, { + name: "splitIntoLines", + exec: function(editor) { editor.multiSelect.splitIntoLines(); }, + bindKey: {win: "Ctrl-Alt-L", mac: "Ctrl-Alt-L"}, + readonly: true +}, { + name: "alignCursors", + exec: function(editor) { editor.alignCursors(); }, + bindKey: {win: "Ctrl-Alt-A", mac: "Ctrl-Alt-A"} +}]; +exports.multiSelectCommands = [{ + name: "singleSelection", + bindKey: "esc", + exec: function(editor) { editor.exitMultiSelectMode(); }, + readonly: true, + isAvailable: function(editor) {return editor && editor.inMultiSelectMode} +}]; + +var HashHandler = require("../keyboard/hash_handler").HashHandler; +exports.keyboardHandler = new HashHandler(exports.multiSelectCommands); + +}); + +ace.define('ace/worker/worker_client', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/event_emitter', 'ace/config'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var EventEmitter = require("../lib/event_emitter").EventEmitter; +var config = require("../config"); + +var WorkerClient = function(topLevelNamespaces, mod, classname) { + this.$sendDeltaQueue = this.$sendDeltaQueue.bind(this); + this.changeListener = this.changeListener.bind(this); + this.onMessage = this.onMessage.bind(this); + this.onError = this.onError.bind(this); + if (require.nameToUrl && !require.toUrl) + require.toUrl = require.nameToUrl; + + var workerUrl; + if (config.get("packaged") || !require.toUrl) { + workerUrl = config.moduleUrl(mod, "worker"); + } else { + var normalizePath = this.$normalizePath; + workerUrl = normalizePath(require.toUrl("ace/worker/worker.js", null, "_")); + + var tlns = {}; + topLevelNamespaces.forEach(function(ns) { + tlns[ns] = normalizePath(require.toUrl(ns, null, "_").replace(/(\.js)?(\?.*)?$/, "")); + }); + } + + this.$worker = new Worker(workerUrl); + this.$worker.postMessage({ + init : true, + tlns: tlns, + module: mod, + classname: classname + }); + + this.callbackId = 1; + this.callbacks = {}; + + this.$worker.onerror = this.onError; + this.$worker.onmessage = this.onMessage; +}; + +(function(){ + + oop.implement(this, EventEmitter); + + this.onError = function(e) { + window.console && console.log && console.log(e); + throw e; + }; + + this.onMessage = function(e) { + var msg = e.data; + switch(msg.type) { + case "log": + window.console && console.log && console.log.apply(console, msg.data); + break; + + case "event": + this._emit(msg.name, {data: msg.data}); + break; + + case "call": + var callback = this.callbacks[msg.id]; + if (callback) { + callback(msg.data); + delete this.callbacks[msg.id]; + } + break; + } + }; + + this.$normalizePath = function(path) { + if (!location.host) // needed for file:// protocol + return path; + path = path.replace(/^[a-z]+:\/\/[^\/]+/, ""); // Remove domain name and rebuild it + path = location.protocol + "//" + location.host + + (path.charAt(0) == "/" ? "" : location.pathname.replace(/\/[^\/]*$/, "")) + + "/" + path.replace(/^[\/]+/, ""); + return path; + }; + + this.terminate = function() { + this._emit("terminate", {}); + this.$worker.terminate(); + this.$worker = null; + this.$doc.removeEventListener("change", this.changeListener); + this.$doc = null; + }; + + this.send = function(cmd, args) { + this.$worker.postMessage({command: cmd, args: args}); + }; + + this.call = function(cmd, args, callback) { + if (callback) { + var id = this.callbackId++; + this.callbacks[id] = callback; + args.push(id); + } + this.send(cmd, args); + }; + + this.emit = function(event, data) { + try { + this.$worker.postMessage({event: event, data: {data: data.data}}); + } + catch(ex) {} + }; + + this.attachToDocument = function(doc) { + if(this.$doc) + this.terminate(); + + this.$doc = doc; + this.call("setValue", [doc.getValue()]); + doc.on("change", this.changeListener); + }; + + this.changeListener = function(e) { + if (!this.deltaQueue) { + this.deltaQueue = [e.data]; + setTimeout(this.$sendDeltaQueue, 1); + } else + this.deltaQueue.push(e.data); + }; + + this.$sendDeltaQueue = function() { + var q = this.deltaQueue; + if (!q) return; + this.deltaQueue = null; + if (q.length > 20 && q.length > this.$doc.getLength() >> 1) { + this.call("setValue", [this.$doc.getValue()]); + } else + this.emit("change", {data: q}); + } + +}).call(WorkerClient.prototype); + + +var UIWorkerClient = function(topLevelNamespaces, mod, classname) { + this.$sendDeltaQueue = this.$sendDeltaQueue.bind(this); + this.changeListener = this.changeListener.bind(this); + this.callbackId = 1; + this.callbacks = {}; + this.messageBuffer = []; + + var main = null; + var sender = Object.create(EventEmitter); + var _self = this; + + this.$worker = {}; + this.$worker.terminate = function() {}; + this.$worker.postMessage = function(e) { + _self.messageBuffer.push(e); + main && setTimeout(processNext); + }; + + var processNext = function() { + var msg = _self.messageBuffer.shift(); + if (msg.command) + main[msg.command].apply(main, msg.args); + else if (msg.event) + sender._emit(msg.event, msg.data); + }; + + sender.postMessage = function(msg) { + _self.onMessage({data: msg}); + }; + sender.callback = function(data, callbackId) { + this.postMessage({type: "call", id: callbackId, data: data}); + }; + sender.emit = function(name, data) { + this.postMessage({type: "event", name: name, data: data}); + }; + + config.loadModule(["worker", mod], function(Main) { + main = new Main[classname](sender); + while (_self.messageBuffer.length) + processNext(); + }); +}; + +UIWorkerClient.prototype = WorkerClient.prototype; + +exports.UIWorkerClient = UIWorkerClient; +exports.WorkerClient = WorkerClient; + +}); +ace.define('ace/placeholder', ['require', 'exports', 'module' , 'ace/range', 'ace/lib/event_emitter', 'ace/lib/oop'], function(require, exports, module) { + + +var Range = require("./range").Range; +var EventEmitter = require("./lib/event_emitter").EventEmitter; +var oop = require("./lib/oop"); + +var PlaceHolder = function(session, length, pos, others, mainClass, othersClass) { + var _self = this; + this.length = length; + this.session = session; + this.doc = session.getDocument(); + this.mainClass = mainClass; + this.othersClass = othersClass; + this.$onUpdate = this.onUpdate.bind(this); + this.doc.on("change", this.$onUpdate); + this.$others = others; + + this.$onCursorChange = function() { + setTimeout(function() { + _self.onCursorChange(); + }); + }; + + this.$pos = pos; + var undoStack = session.getUndoManager().$undoStack || session.getUndoManager().$undostack || {length: -1}; + this.$undoStackDepth = undoStack.length; + this.setup(); + + session.selection.on("changeCursor", this.$onCursorChange); +}; + +(function() { + + oop.implement(this, EventEmitter); + this.setup = function() { + var _self = this; + var doc = this.doc; + var session = this.session; + var pos = this.$pos; + + this.pos = doc.createAnchor(pos.row, pos.column); + this.markerId = session.addMarker(new Range(pos.row, pos.column, pos.row, pos.column + this.length), this.mainClass, null, false); + this.pos.on("change", function(event) { + session.removeMarker(_self.markerId); + _self.markerId = session.addMarker(new Range(event.value.row, event.value.column, event.value.row, event.value.column+_self.length), _self.mainClass, null, false); + }); + this.others = []; + this.$others.forEach(function(other) { + var anchor = doc.createAnchor(other.row, other.column); + _self.others.push(anchor); + }); + session.setUndoSelect(false); + }; + this.showOtherMarkers = function() { + if(this.othersActive) return; + var session = this.session; + var _self = this; + this.othersActive = true; + this.others.forEach(function(anchor) { + anchor.markerId = session.addMarker(new Range(anchor.row, anchor.column, anchor.row, anchor.column+_self.length), _self.othersClass, null, false); + anchor.on("change", function(event) { + session.removeMarker(anchor.markerId); + anchor.markerId = session.addMarker(new Range(event.value.row, event.value.column, event.value.row, event.value.column+_self.length), _self.othersClass, null, false); + }); + }); + }; + this.hideOtherMarkers = function() { + if(!this.othersActive) return; + this.othersActive = false; + for (var i = 0; i < this.others.length; i++) { + this.session.removeMarker(this.others[i].markerId); + } + }; + this.onUpdate = function(event) { + var delta = event.data; + var range = delta.range; + if(range.start.row !== range.end.row) return; + if(range.start.row !== this.pos.row) return; + if (this.$updating) return; + this.$updating = true; + var lengthDiff = delta.action === "insertText" ? range.end.column - range.start.column : range.start.column - range.end.column; + + if(range.start.column >= this.pos.column && range.start.column <= this.pos.column + this.length + 1) { + var distanceFromStart = range.start.column - this.pos.column; + this.length += lengthDiff; + if(!this.session.$fromUndo) { + if(delta.action === "insertText") { + for (var i = this.others.length - 1; i >= 0; i--) { + var otherPos = this.others[i]; + var newPos = {row: otherPos.row, column: otherPos.column + distanceFromStart}; + if(otherPos.row === range.start.row && range.start.column < otherPos.column) + newPos.column += lengthDiff; + this.doc.insert(newPos, delta.text); + } + } else if(delta.action === "removeText") { + for (var i = this.others.length - 1; i >= 0; i--) { + var otherPos = this.others[i]; + var newPos = {row: otherPos.row, column: otherPos.column + distanceFromStart}; + if(otherPos.row === range.start.row && range.start.column < otherPos.column) + newPos.column += lengthDiff; + this.doc.remove(new Range(newPos.row, newPos.column, newPos.row, newPos.column - lengthDiff)); + } + } + if(range.start.column === this.pos.column && delta.action === "insertText") { + setTimeout(function() { + this.pos.setPosition(this.pos.row, this.pos.column - lengthDiff); + for (var i = 0; i < this.others.length; i++) { + var other = this.others[i]; + var newPos = {row: other.row, column: other.column - lengthDiff}; + if(other.row === range.start.row && range.start.column < other.column) + newPos.column += lengthDiff; + other.setPosition(newPos.row, newPos.column); + } + }.bind(this), 0); + } + else if(range.start.column === this.pos.column && delta.action === "removeText") { + setTimeout(function() { + for (var i = 0; i < this.others.length; i++) { + var other = this.others[i]; + if(other.row === range.start.row && range.start.column < other.column) { + other.setPosition(other.row, other.column - lengthDiff); + } + } + }.bind(this), 0); + } + } + this.pos._emit("change", {value: this.pos}); + for (var i = 0; i < this.others.length; i++) { + this.others[i]._emit("change", {value: this.others[i]}); + } + } + this.$updating = false; + }; + + this.onCursorChange = function(event) { + if (this.$updating) return; + var pos = this.session.selection.getCursor(); + if(pos.row === this.pos.row && pos.column >= this.pos.column && pos.column <= this.pos.column + this.length) { + this.showOtherMarkers(); + this._emit("cursorEnter", event); + } else { + this.hideOtherMarkers(); + this._emit("cursorLeave", event); + } + }; + this.detach = function() { + this.session.removeMarker(this.markerId); + this.hideOtherMarkers(); + this.doc.removeEventListener("change", this.$onUpdate); + this.session.selection.removeEventListener("changeCursor", this.$onCursorChange); + this.pos.detach(); + for (var i = 0; i < this.others.length; i++) { + this.others[i].detach(); + } + this.session.setUndoSelect(true); + }; + this.cancel = function() { + if(this.$undoStackDepth === -1) + throw Error("Canceling placeholders only supported with undo manager attached to session."); + var undoManager = this.session.getUndoManager(); + var undosRequired = (undoManager.$undoStack || undoManager.$undostack).length - this.$undoStackDepth; + for (var i = 0; i < undosRequired; i++) { + undoManager.undo(true); + } + }; +}).call(PlaceHolder.prototype); + + +exports.PlaceHolder = PlaceHolder; +}); + +ace.define('ace/mode/folding/fold_mode', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) { + + +var Range = require("../../range").Range; + +var FoldMode = exports.FoldMode = function() {}; + +(function() { + + this.foldingStartMarker = null; + this.foldingStopMarker = null; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + if (this.foldingStartMarker.test(line)) + return "start"; + if (foldStyle == "markbeginend" + && this.foldingStopMarker + && this.foldingStopMarker.test(line)) + return "end"; + return ""; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + return null; + }; + + this.indentationBlock = function(session, row, column) { + var re = /\S/; + var line = session.getLine(row); + var startLevel = line.search(re); + if (startLevel == -1) + return; + + var startColumn = column || line.length; + var maxRow = session.getLength(); + var startRow = row; + var endRow = row; + + while (++row < maxRow) { + var level = session.getLine(row).search(re); + + if (level == -1) + continue; + + if (level <= startLevel) + break; + + endRow = row; + } + + if (endRow > startRow) { + var endColumn = session.getLine(endRow).length; + return new Range(startRow, startColumn, endRow, endColumn); + } + }; + + this.openingBracketBlock = function(session, bracket, row, column, typeRe) { + var start = {row: row, column: column + 1}; + var end = session.$findClosingBracket(bracket, start, typeRe); + if (!end) + return; + + var fw = session.foldWidgets[end.row]; + if (fw == null) + fw = this.getFoldWidget(session, end.row); + + if (fw == "start" && end.row > start.row) { + end.row --; + end.column = session.getLine(end.row).length; + } + return Range.fromPoints(start, end); + }; + + this.closingBracketBlock = function(session, bracket, row, column, typeRe) { + var end = {row: row, column: column}; + var start = session.$findOpeningBracket(bracket, end); + + if (!start) + return; + + start.column++; + end.column--; + + return Range.fromPoints(start, end); + }; +}).call(FoldMode.prototype); + +}); + +ace.define('ace/theme/textmate', ['require', 'exports', 'module' , 'ace/lib/dom'], function(require, exports, module) { + + +exports.isDark = false; +exports.cssClass = "ace-tm"; +exports.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;\ +}\ +.ace-tm .ace_cursor {\ +border-left: 2px solid black;\ +}\ +.ace-tm .ace_overwrite-cursors .ace_cursor {\ +border-left: 0px;\ +border-bottom: 1px solid 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_markup.ace_heading {\ +color: rgb(12, 7, 255);\ +}\ +.ace-tm .ace_markup.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;\ +border-radius: 2px;\ +}\ +.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 dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); +; + (function() { + ace.require(["ace/ace"], function(a) { + a && a.config.init(); + if (!window.ace) + window.ace = {}; + for (var key in a) if (a.hasOwnProperty(key)) + ace[key] = a[key]; + }); + })(); + \ No newline at end of file diff --git a/0.0.3_0/ace/ext-elastic_tabstops_lite.js b/0.0.3_0/ace/ext-elastic_tabstops_lite.js new file mode 100644 index 0000000..bbdb2d3 --- /dev/null +++ b/0.0.3_0/ace/ext-elastic_tabstops_lite.js @@ -0,0 +1,301 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2012, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/ext/elastic_tabstops_lite', ['require', 'exports', 'module' , 'ace/editor', 'ace/config'], function(require, exports, module) { + + +var ElasticTabstopsLite = function(editor) { + this.$editor = editor; + var self = this; + var changedRows = []; + var recordChanges = false; + this.onAfterExec = function() { + recordChanges = false; + self.processRows(changedRows); + changedRows = []; + }; + this.onExec = function() { + recordChanges = true; + }; + this.onChange = function(e) { + var range = e.data.range + if (recordChanges) { + if (changedRows.indexOf(range.start.row) == -1) + changedRows.push(range.start.row); + if (range.end.row != range.start.row) + changedRows.push(range.end.row); + } + }; +}; + +(function() { + this.processRows = function(rows) { + this.$inChange = true; + var checkedRows = []; + + for (var r = 0, rowCount = rows.length; r < rowCount; r++) { + var row = rows[r]; + + if (checkedRows.indexOf(row) > -1) + continue; + + var cellWidthObj = this.$findCellWidthsForBlock(row); + var cellWidths = this.$setBlockCellWidthsToMax(cellWidthObj.cellWidths); + var rowIndex = cellWidthObj.firstRow; + + for (var w = 0, l = cellWidths.length; w < l; w++) { + var widths = cellWidths[w]; + checkedRows.push(rowIndex); + this.$adjustRow(rowIndex, widths); + rowIndex++; + } + } + this.$inChange = false; + }; + + this.$findCellWidthsForBlock = function(row) { + var cellWidths = [], widths; + var rowIter = row; + while (rowIter >= 0) { + widths = this.$cellWidthsForRow(rowIter); + if (widths.length == 0) + break; + + cellWidths.unshift(widths); + rowIter--; + } + var firstRow = rowIter + 1; + rowIter = row; + var numRows = this.$editor.session.getLength(); + + while (rowIter < numRows - 1) { + rowIter++; + + widths = this.$cellWidthsForRow(rowIter); + if (widths.length == 0) + break; + + cellWidths.push(widths); + } + + return { cellWidths: cellWidths, firstRow: firstRow }; + }; + + this.$cellWidthsForRow = function(row) { + var selectionColumns = this.$selectionColumnsForRow(row); + + var tabs = [-1].concat(this.$tabsForRow(row)); + var widths = tabs.map(function(el) { return 0; } ).slice(1); + var line = this.$editor.session.getLine(row); + + for (var i = 0, len = tabs.length - 1; i < len; i++) { + var leftEdge = tabs[i]+1; + var rightEdge = tabs[i+1]; + + var rightmostSelection = this.$rightmostSelectionInCell(selectionColumns, rightEdge); + var cell = line.substring(leftEdge, rightEdge); + widths[i] = Math.max(cell.replace(/\s+$/g,'').length, rightmostSelection - leftEdge); + } + + return widths; + }; + + this.$selectionColumnsForRow = function(row) { + var selections = [], cursor = this.$editor.getCursorPosition(); + if (this.$editor.session.getSelection().isEmpty()) { + if (row == cursor.row) + selections.push(cursor.column); + } + + return selections; + }; + + this.$setBlockCellWidthsToMax = function(cellWidths) { + var startingNewBlock = true, blockStartRow, blockEndRow, maxWidth; + var columnInfo = this.$izip_longest(cellWidths); + + for (var c = 0, l = columnInfo.length; c < l; c++) { + var column = columnInfo[c]; + if (!column.push) { + console.error(column); + continue; + } + column.push(NaN); + + for (var r = 0, s = column.length; r < s; r++) { + var width = column[r]; + if (startingNewBlock) { + blockStartRow = r; + maxWidth = 0; + startingNewBlock = false; + } + if (isNaN(width)) { + blockEndRow = r; + + for (var j = blockStartRow; j < blockEndRow; j++) { + cellWidths[j][c] = maxWidth; + } + startingNewBlock = true; + } + + maxWidth = Math.max(maxWidth, width); + } + } + + return cellWidths; + }; + + this.$rightmostSelectionInCell = function(selectionColumns, cellRightEdge) { + var rightmost = 0; + + if (selectionColumns.length) { + var lengths = []; + for (var s = 0, length = selectionColumns.length; s < length; s++) { + if (selectionColumns[s] <= cellRightEdge) + lengths.push(s); + else + lengths.push(0); + } + rightmost = Math.max.apply(Math, lengths); + } + + return rightmost; + }; + + this.$tabsForRow = function(row) { + var rowTabs = [], line = this.$editor.session.getLine(row), + re = /\t/g, match; + + while ((match = re.exec(line)) != null) { + rowTabs.push(match.index); + } + + return rowTabs; + }; + + this.$adjustRow = function(row, widths) { + var rowTabs = this.$tabsForRow(row); + + if (rowTabs.length == 0) + return; + + var bias = 0, location = -1; + var expandedSet = this.$izip(widths, rowTabs); + + for (var i = 0, l = expandedSet.length; i < l; i++) { + var w = expandedSet[i][0], it = expandedSet[i][1]; + location += 1 + w; + it += bias; + var difference = location - it; + + if (difference == 0) + continue; + + var partialLine = this.$editor.session.getLine(row).substr(0, it ); + var strippedPartialLine = partialLine.replace(/\s*$/g, ""); + var ispaces = partialLine.length - strippedPartialLine.length; + + if (difference > 0) { + this.$editor.session.getDocument().insertInLine({row: row, column: it + 1}, Array(difference + 1).join(" ") + "\t"); + this.$editor.session.getDocument().removeInLine(row, it, it + 1); + + bias += difference; + } + + if (difference < 0 && ispaces >= -difference) { + this.$editor.session.getDocument().removeInLine(row, it + difference, it); + bias += difference; + } + } + }; + this.$izip_longest = function(iterables) { + if (!iterables[0]) + return []; + var longest = iterables[0].length; + var iterablesLength = iterables.length; + + for (var i = 1; i < iterablesLength; i++) { + var iLength = iterables[i].length; + if (iLength > longest) + longest = iLength; + } + + var expandedSet = []; + + for (var l = 0; l < longest; l++) { + var set = []; + for (var i = 0; i < iterablesLength; i++) { + if (iterables[i][l] === "") + set.push(NaN); + else + set.push(iterables[i][l]); + } + + expandedSet.push(set); + } + + + return expandedSet; + }; + this.$izip = function(widths, tabs) { + var size = widths.length >= tabs.length ? tabs.length : widths.length; + + var expandedSet = []; + for (var i = 0; i < size; i++) { + var set = [ widths[i], tabs[i] ]; + expandedSet.push(set); + } + return expandedSet; + }; + +}).call(ElasticTabstopsLite.prototype); + +exports.ElasticTabstopsLite = ElasticTabstopsLite; + +var Editor = require("../editor").Editor; +require("../config").defineOptions(Editor.prototype, "editor", { + useElasticTabstops: { + set: function(val) { + if (val) { + if (!this.elasticTabstops) + this.elasticTabstops = new ElasticTabstopsLite(this); + this.commands.on("afterExec", this.elasticTabstops.onAfterExec); + this.commands.on("exec", this.elasticTabstops.onExec); + this.on("change", this.elasticTabstops.onChange); + } else if (this.elasticTabstops) { + this.commands.removeListener("afterExec", this.elasticTabstops.onAfterExec); + this.commands.removeListener("exec", this.elasticTabstops.onExec); + this.removeListener("change", this.elasticTabstops.onChange); + } + } + } +}); + +}); \ No newline at end of file diff --git a/0.0.3_0/ace/ext-emmet.js b/0.0.3_0/ace/ext-emmet.js new file mode 100644 index 0000000..8980338 --- /dev/null +++ b/0.0.3_0/ace/ext-emmet.js @@ -0,0 +1,270 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2010, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/ext/emmet', ['require', 'exports', 'module' , 'ace/keyboard/hash_handler', 'ace/editor', 'ace/config'], function(require, exports, module) { + +var HashHandler = require("ace/keyboard/hash_handler").HashHandler; +var Editor = require("ace/editor").Editor; +var emmet; + +Editor.prototype.indexToPosition = function(index) { + return this.session.doc.indexToPosition(index); +}; + +Editor.prototype.positionToIndex = function(pos) { + return this.session.doc.positionToIndex(pos); +}; +function AceEmmetEditor() {} + +AceEmmetEditor.prototype = { + setupContext: function(editor) { + this.ace = editor; + this.indentation = editor.session.getTabString(); + if (!emmet) + emmet = window.emmet; + emmet.require("resources").setVariable("indentation", this.indentation); + this.$syntax = null; + this.$syntax = this.getSyntax(); + }, + getSelectionRange: function() { + var range = this.ace.getSelectionRange(); + return { + start: this.ace.positionToIndex(range.start), + end: this.ace.positionToIndex(range.end) + }; + }, + createSelection: function(start, end) { + this.ace.selection.setRange({ + start: this.ace.indexToPosition(start), + end: this.ace.indexToPosition(end) + }); + }, + getCurrentLineRange: function() { + var row = this.ace.getCursorPosition().row; + var lineLength = this.ace.session.getLine(row).length; + var index = this.ace.positionToIndex({row: row, column: 0}); + return { + start: index, + end: index + lineLength + }; + }, + getCaretPos: function(){ + var pos = this.ace.getCursorPosition(); + return this.ace.positionToIndex(pos); + }, + setCaretPos: function(index){ + var pos = this.ace.indexToPosition(index); + this.ace.clearSelection(); + this.ace.selection.moveCursorToPosition(pos); + }, + getCurrentLine: function() { + var row = this.ace.getCursorPosition().row; + return this.ace.session.getLine(row); + }, + replaceContent: function(value, start, end, noIndent) { + if (end == null) + end = start == null ? this.getContent().length : start; + if (start == null) + start = 0; + var utils = emmet.require("utils"); + if (!noIndent) { + value = utils.padString(value, utils.getLinePaddingFromPosition(this.getContent(), start)); + } + var tabstopData = emmet.require("tabStops").extract(value, { + escape: function(ch) { + return ch; + } + }); + + value = tabstopData.text; + var firstTabStop = tabstopData.tabstops[0]; + + if (firstTabStop) { + firstTabStop.start += start; + firstTabStop.end += start; + } else { + firstTabStop = { + start: value.length + start, + end: value.length + start + }; + } + + var range = this.ace.getSelectionRange(); + range.start = this.ace.indexToPosition(start); + range.end = this.ace.indexToPosition(end); + + this.ace.session.replace(range, value); + + range.start = this.ace.indexToPosition(firstTabStop.start); + range.end = this.ace.indexToPosition(firstTabStop.end); + this.ace.selection.setRange(range); + }, + getContent: function(){ + return this.ace.getValue(); + }, + getSyntax: function() { + if (this.$syntax) + return this.$syntax; + var syntax = this.ace.session.$modeId.split("/").pop(); + if (syntax == "html" || syntax == "php") { + var cursor = this.ace.getCursorPosition(); + var state = this.ace.session.getState(cursor.row); + if (typeof state != "string") + state = state[0]; + if (state) { + state = state.split("-"); + if (state.length > 1) + syntax = state[0]; + else if (syntax == "php") + syntax = "html"; + } + } + return syntax; + }, + getProfileName: function() { + switch(this.getSyntax()) { + case "css": return "css"; + case "xml": + case "xsl": + return "xml"; + case "html": + var profile = emmet.require("resources").getVariable("profile"); + if (!profile) + profile = this.ace.session.getLines(0,2).join("").search(/]+XHTML/i) != -1 ? "xhtml": "html"; + return profile; + } + return "xhtml"; + }, + prompt: function(title) { + return prompt(title); + }, + getSelection: function() { + return this.ace.session.getTextRange(); + }, + getFilePath: function() { + return ""; + } +}; + + +var keymap = { + expand_abbreviation: {"mac": "ctrl+alt+e", "win": "alt+e"}, + match_pair_outward: {"mac": "ctrl+d", "win": "ctrl+,"}, + match_pair_inward: {"mac": "ctrl+j", "win": "ctrl+shift+0"}, + matching_pair: {"mac": "ctrl+alt+j", "win": "alt+j"}, + next_edit_point: "alt+right", + prev_edit_point: "alt+left", + toggle_comment: {"mac": "command+/", "win": "ctrl+/"}, + split_join_tag: {"mac": "shift+command+'", "win": "shift+ctrl+`"}, + remove_tag: {"mac": "command+'", "win": "shift+ctrl+;"}, + evaluate_math_expression: {"mac": "shift+command+y", "win": "shift+ctrl+y"}, + increment_number_by_1: "ctrl+up", + decrement_number_by_1: "ctrl+down", + increment_number_by_01: "alt+up", + decrement_number_by_01: "alt+down", + increment_number_by_10: {"mac": "alt+command+up", "win": "shift+alt+up"}, + decrement_number_by_10: {"mac": "alt+command+down", "win": "shift+alt+down"}, + select_next_item: {"mac": "shift+command+.", "win": "shift+ctrl+."}, + select_previous_item: {"mac": "shift+command+,", "win": "shift+ctrl+,"}, + reflect_css_value: {"mac": "shift+command+r", "win": "shift+ctrl+r"}, + + encode_decode_data_url: {"mac": "shift+ctrl+d", "win": "ctrl+'"}, + expand_abbreviation_with_tab: "Tab", + wrap_with_abbreviation: {"mac": "shift+ctrl+a", "win": "shift+ctrl+a"} +}; + +var editorProxy = new AceEmmetEditor(); +exports.commands = new HashHandler(); +exports.runEmmetCommand = function(editor) { + editorProxy.setupContext(editor); + if (editorProxy.getSyntax() == "php") + return false; + var actions = emmet.require("actions"); + + if (this.action == "expand_abbreviation_with_tab") { + if (!editor.selection.isEmpty()) + return false; + } + + if (this.action == "wrap_with_abbreviation") { + return setTimeout(function() { + actions.run("wrap_with_abbreviation", editorProxy); + }, 0); + } + + try { + var result = actions.run(this.action, editorProxy); + } catch(e) { + editor._signal("changeStatus", typeof e == "string" ? e : e.message); + console.log(e); + } + return result; +}; + +for (var command in keymap) { + exports.commands.addCommand({ + name: "emmet:" + command, + action: command, + bindKey: keymap[command], + exec: exports.runEmmetCommand, + multiSelectAction: "forEach" + }); +} + +var onChangeMode = function(e, target) { + var editor = target; + if (!editor) + return; + var modeId = editor.session.$modeId; + var enabled = modeId && /css|less|sass|html|php/.test(modeId); + if (e.enableEmmet === false) + enabled = false; + if (enabled) + editor.keyBinding.addKeyboardHandler(exports.commands); + else + editor.keyBinding.removeKeyboardHandler(exports.commands); +}; + + +exports.AceEmmetEditor = AceEmmetEditor; +require("ace/config").defineOptions(Editor.prototype, "editor", { + enableEmmet: { + set: function(val) { + this[val ? "on" : "removeListener"]("changeMode", onChangeMode); + onChangeMode({enableEmmet: !!val}, this); + }, + value: true + } +}); + + +exports.setCore = function(e) {emmet = e;}; +}); + diff --git a/0.0.3_0/ace/ext-keybinding_menu.js b/0.0.3_0/ace/ext-keybinding_menu.js new file mode 100644 index 0000000..b6aaec6 --- /dev/null +++ b/0.0.3_0/ace/ext-keybinding_menu.js @@ -0,0 +1,207 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2013 Matthew Christopher Kastor-Inare III, Atropa Inc. Intl + * All rights reserved. + * + * Contributed to Ajax.org under the BSD license. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/ext/keybinding_menu', ['require', 'exports', 'module' , 'ace/editor', 'ace/ext/menu_tools/overlay_page', 'ace/ext/menu_tools/get_editor_keyboard_shortcuts'], function(require, exports, module) { + + var Editor = require("ace/editor").Editor; + function showKeyboardShortcuts (editor) { + if(!document.getElementById('kbshortcutmenu')) { + var overlayPage = require('./menu_tools/overlay_page').overlayPage; + var getEditorKeybordShortcuts = require('./menu_tools/get_editor_keyboard_shortcuts').getEditorKeybordShortcuts; + var kb = getEditorKeybordShortcuts(editor); + var el = document.createElement('div'); + var commands = kb.reduce(function(previous, current) { + return previous + '
' + + current.command + ' : ' + + '' + current.key + '
'; + }, ''); + + el.id = 'kbshortcutmenu'; + el.innerHTML = '

Keyboard Shortcuts

' + commands + '
'; + overlayPage(editor, el, '0', '0', '0', null); + } + }; + module.exports.init = function(editor) { + Editor.prototype.showKeyboardShortcuts = function() { + showKeyboardShortcuts(this); + }; + editor.commands.addCommands([{ + name: "showKeyboardShortcuts", + bindKey: {win: "Ctrl-Alt-h", mac: "Command-Alt-h"}, + exec: function(editor, line) { + editor.showKeyboardShortcuts(); + } + }]); + }; + +}); + +ace.define('ace/ext/menu_tools/overlay_page', ['require', 'exports', 'module' , 'ace/lib/dom'], function(require, exports, module) { + +var dom = require("../../lib/dom"); +var cssText = "#ace_settingsmenu, #kbshortcutmenu {\ +background-color: #F7F7F7;\ +color: black;\ +box-shadow: -5px 4px 5px rgba(126, 126, 126, 0.55);\ +padding: 1em 0.5em 2em 1em;\ +overflow: auto;\ +position: absolute;\ +margin: 0;\ +bottom: 0;\ +right: 0;\ +top: 0;\ +z-index: 9991;\ +cursor: default;\ +}\ +.ace_dark #ace_settingsmenu, .ace_dark #kbshortcutmenu {\ +box-shadow: -20px 10px 25px rgba(126, 126, 126, 0.25);\ +background-color: rgba(255, 255, 255, 0.6);\ +color: black;\ +}\ +.ace_optionsMenuEntry:hover {\ +background-color: rgba(100, 100, 100, 0.1);\ +-webkit-transition: all 0.5s;\ +transition: all 0.3s\ +}\ +.ace_closeButton {\ +background: rgba(245, 146, 146, 0.5);\ +border: 1px solid #F48A8A;\ +border-radius: 50%;\ +padding: 7px;\ +position: absolute;\ +right: -8px;\ +top: -8px;\ +z-index: 1000;\ +}\ +.ace_closeButton{\ +background: rgba(245, 146, 146, 0.9);\ +}\ +.ace_optionsMenuKey {\ +color: darkslateblue;\ +font-weight: bold;\ +}\ +.ace_optionsMenuCommand {\ +color: darkcyan;\ +font-weight: normal;\ +}"; +dom.importCssString(cssText); +module.exports.overlayPage = function overlayPage(editor, contentElement, top, right, bottom, left) { + top = top ? 'top: ' + top + ';' : ''; + bottom = bottom ? 'bottom: ' + bottom + ';' : ''; + right = right ? 'right: ' + right + ';' : ''; + left = left ? 'left: ' + left + ';' : ''; + + var closer = document.createElement('div'); + var contentContainer = document.createElement('div'); + + function documentEscListener(e) { + if (e.keyCode === 27) { + closer.click(); + } + } + + closer.style.cssText = 'margin: 0; padding: 0; ' + + 'position: fixed; top:0; bottom:0; left:0; right:0;' + + 'z-index: 9990; ' + + 'background-color: rgba(0, 0, 0, 0.3);'; + closer.addEventListener('click', function() { + document.removeEventListener('keydown', documentEscListener); + closer.parentNode.removeChild(closer); + editor.focus(); + closer = null; + }); + document.addEventListener('keydown', documentEscListener); + + contentContainer.style.cssText = top + right + bottom + left; + contentContainer.addEventListener('click', function(e) { + e.stopPropagation(); + }); + + var wrapper = dom.createElement("div"); + wrapper.style.position = "relative"; + + var closeButton = dom.createElement("div"); + closeButton.className = "ace_closeButton"; + closeButton.addEventListener('click', function() { + closer.click(); + }); + + wrapper.appendChild(closeButton); + contentContainer.appendChild(wrapper); + + contentContainer.appendChild(contentElement); + closer.appendChild(contentContainer); + document.body.appendChild(closer); + editor.blur(); +}; + +}); + +ace.define('ace/ext/menu_tools/get_editor_keyboard_shortcuts', ['require', 'exports', 'module' , 'ace/lib/keys'], function(require, exports, module) { + +var keys = require("../../lib/keys"); +module.exports.getEditorKeybordShortcuts = function(editor) { + var KEY_MODS = keys.KEY_MODS; + var keybindings = []; + var commandMap = {}; + editor.keyBinding.$handlers.forEach(function(handler) { + var ckb = handler.commmandKeyBinding; + for (var i in ckb) { + var modifier = parseInt(i); + if (modifier == -1) { + modifier = ""; + } else if(isNaN(modifier)) { + modifier = i; + } else { + modifier = "" + + (modifier & KEY_MODS.command ? "Cmd-" : "") + + (modifier & KEY_MODS.ctrl ? "Ctrl-" : "") + + (modifier & KEY_MODS.alt ? "Alt-" : "") + + (modifier & KEY_MODS.shift ? "Shift-" : ""); + } + for (var key in ckb[i]) { + var command = ckb[i][key] + if (typeof command != "string") + command = command.name + if (commandMap[command]) { + commandMap[command].key += "|" + modifier + key; + } else { + commandMap[command] = {key: modifier+key, command: command}; + keybindings.push(commandMap[command]); + } + } + } + }); + return keybindings; +}; + +}); \ No newline at end of file diff --git a/0.0.3_0/ace/ext-modelist.js b/0.0.3_0/ace/ext-modelist.js new file mode 100644 index 0000000..d22d4bf --- /dev/null +++ b/0.0.3_0/ace/ext-modelist.js @@ -0,0 +1,157 @@ +ace.define('ace/ext/modelist', ['require', 'exports', 'module' ], function(require, exports, module) { + + +var modes = []; +function getModeForPath(path) { + var mode = modesByName.text; + var fileName = path.split(/[\/\\]/).pop(); + for (var i = 0; i < modes.length; i++) { + if (modes[i].supportsFile(fileName)) { + mode = modes[i]; + break; + } + } + return mode; +} + +var Mode = function(name, caption, extensions) { + this.name = name; + this.caption = caption; + this.mode = "ace/mode/" + name; + this.extensions = extensions; + if (/\^/.test(extensions)) { + var re = extensions.replace(/\|(\^)?/g, function(a, b){ + return "$|" + (b ? "^" : "^.*\\."); + }) + "$"; + } else { + var re = "^.*\\.(" + extensions + ")$"; + } + + this.extRe = new RegExp(re, "gi"); +}; + +Mode.prototype.supportsFile = function(filename) { + return filename.match(this.extRe); +}; +var supportedModes = { + ABAP: ["abap"], + ADA: ["ada|adb"], + ActionScript:["as"], + AsciiDoc: ["asciidoc"], + Assembly_x86:["asm"], + AutoHotKey: ["ahk"], + BatchFile: ["bat|cmd"], + C9Search: ["c9search_results"], + C_Cpp: ["c|cc|cpp|cxx|h|hh|hpp"], + Clojure: ["clj"], + Cobol: ["^CBL|COB"], + coffee: ["^Cakefile|coffee|cf|cson"], + ColdFusion: ["cfm"], + CSharp: ["cs"], + CSS: ["css"], + Curly: ["curly"], + D: ["d|di"], + Dart: ["dart"], + Diff: ["diff|patch"], + Dot: ["dot"], + Erlang: ["erl|hrl"], + EJS: ["ejs"], + Forth: ["frt|fs|ldr"], + FreeMarker: ["ftl"], + Glsl: ["glsl|frag|vert"], + golang: ["go"], + Groovy: ["groovy"], + HAML: ["haml"], + Haskell: ["hs"], + haXe: ["hx"], + HTML: ["htm|html|xhtml"], + HTML_Ruby: ["erb|rhtml|html.erb"], + Ini: ["Ini|conf"], + Jade: ["jade"], + Java: ["java"], + JavaScript: ["js"], + JSON: ["json"], + JSONiq: ["jq"], + JSP: ["jsp"], + JSX: ["jsx"], + Julia: ["jl"], + LaTeX: ["latex|tex|ltx|bib"], + LESS: ["less"], + Liquid: ["liquid"], + Lisp: ["lisp"], + LiveScript: ["ls"], + LogiQL: ["logic|lql"], + LSL: ["lsl"], + Lua: ["lua"], + LuaPage: ["lp"], + Lucene: ["lucene"], + Makefile: ["^GNUmakefile|^makefile|^Makefile|^OCamlMakefile|make"], + MATLAB: ["matlab"], + Markdown: ["md|markdown"], + MySQL: ["mysql"], + MUSHCode: ["mc|mush"], + ObjectiveC: ["m|mm"], + OCaml: ["ml|mli"], + Pascal: ["pas|p"], + Perl: ["pl|pm"], + pgSQL: ["pgsql"], + PHP: ["php|phtml"], + Powershell: ["ps1"], + Prolog: ["plg|prolog"], + Properties: ["properties"], + Python: ["py"], + R: ["r"], + RDoc: ["Rd"], + RHTML: ["Rhtml"], + Ruby: ["ru|gemspec|rake|rb"], + Rust: ["rs"], + SASS: ["sass"], + SCAD: ["scad"], + Scala: ["scala"], + Scheme: ["scm|rkt"], + SCSS: ["scss"], + SH: ["sh|bash"], + snippets: ["snippets"], + SQL: ["sql"], + Stylus: ["styl|stylus"], + SVG: ["svg"], + Tcl: ["tcl"], + Tex: ["tex"], + Text: ["txt"], + Textile: ["textile"], + Toml: ["toml"], + Twig: ["twig"], + Typescript: ["typescript|ts|str"], + VBScript: ["vbs"], + Velocity: ["vm"], + XML: ["xml|rdf|rss|wsdl|xslt|atom|mathml|mml|xul|xbl"], + XQuery: ["xq"], + YAML: ["yaml"] +}; + +var nameOverrides = { + ObjectiveC: "Objective-C", + CSharp: "C#", + golang: "Go", + C_Cpp: "C/C++", + coffee: "CoffeeScript", + HTML_Ruby: "HTML (Ruby)" +}; +var modesByName = {}; +for (var name in supportedModes) { + var data = supportedModes[name]; + var displayName = nameOverrides[name] || name; + var filename = name.toLowerCase(); + var mode = new Mode(filename, displayName, data[0]); + modesByName[filename] = mode; + modes.push(mode); +} + +module.exports = { + getModeForPath: getModeForPath, + modes: modes, + modesByName: modesByName +}; + +}); + diff --git a/0.0.3_0/ace/ext-options.js b/0.0.3_0/ace/ext-options.js new file mode 100644 index 0000000..5a807fa --- /dev/null +++ b/0.0.3_0/ace/ext-options.js @@ -0,0 +1,252 @@ +ace.define('ace/ext/options', ['require', 'exports', 'module' ], function(require, exports, module) { + + +var modesByName = modelist.modesByName; + +var options = [ + ["Document", function(name) { + doclist.loadDoc(name, function(session) { + if (!session) + return; + session = env.split.setSession(session); + updateUIEditorOptions(); + env.editor.focus(); + }); + }, doclist.all], + ["Mode", function(value) { + env.editor.session.setMode(modesByName[value].mode || modesByName.text.mode); + env.editor.session.modeName = value; + }, function(value) { + return env.editor.session.modeName || "text" + }, modelist.modes], + ["Split", function(value) { + var sp = env.split; + if (value == "none") { + if (sp.getSplits() == 2) { + env.secondSession = sp.getEditor(1).session; + } + sp.setSplits(1); + } else { + var newEditor = (sp.getSplits() == 1); + if (value == "below") { + sp.setOrientation(sp.BELOW); + } else { + sp.setOrientation(sp.BESIDE); + } + sp.setSplits(2); + + if (newEditor) { + var session = env.secondSession || sp.getEditor(0).session; + var newSession = sp.setSession(session, 1); + newSession.name = session.name; + } + } + }, ["None", "Beside", "Below"]], + ["Theme", function(value) { + if (!value) + return; + env.editor.setTheme("ace/theme/" + value); + themeEl.selectedValue = value; + }, function() { + return env.editor.getTheme(); + }, { + "Bright": { + chrome: "Chrome", + clouds: "Clouds", + crimson_editor: "Crimson Editor", + dawn: "Dawn", + dreamweaver: "Dreamweaver", + eclipse: "Eclipse", + github: "GitHub", + solarized_light: "Solarized Light", + textmate: "TextMate", + tomorrow: "Tomorrow", + xcode: "XCode" + }, + "Dark": { + ambiance: "Ambiance", + chaos: "Chaos", + clouds_midnight: "Clouds Midnight", + cobalt: "Cobalt", + idle_fingers: "idleFingers", + kr_theme: "krTheme", + merbivore: "Merbivore", + merbivore_soft: "Merbivore Soft", + mono_industrial: "Mono Industrial", + monokai: "Monokai", + pastel_on_dark: "Pastel on dark", + solarized_dark: "Solarized Dark", + twilight: "Twilight", + tomorrow_night: "Tomorrow Night", + tomorrow_night_blue: "Tomorrow Night Blue", + tomorrow_night_bright: "Tomorrow Night Bright", + tomorrow_night_eighties: "Tomorrow Night 80s", + vibrant_ink: "Vibrant Ink", + } + }], + ["Code Folding", function(value) { + env.editor.getSession().setFoldStyle(value); + env.editor.setShowFoldWidgets(value !== "manual"); + }, ["manual", "mark begin", "mark begin and end"]], + ["Soft Wrap", function(value) { + value = value.toLowerCase() + var session = env.editor.getSession(); + var renderer = env.editor.renderer; + session.setUseWrapMode(value == "off"); + var col = parseInt(value) || null; + renderer.setPrintMarginColumn(col || 80); + session.setWrapLimitRange(col, col); + }, ["Off", "40 Chars", "80 Chars", "Free"]], + ["Key Binding", function(value) { + env.editor.setKeyboardHandler(keybindings[value]); + }, ["Ace", "Vim", "Emacs", "Custom"]], + ["Font Size", function(value) { + env.split.setFontSize(value + "px"); + }, [10, 11, 12, 14, 16, 20, 24]], + ["Full Line Selection", function(checked) { + env.editor.setSelectionStyle(checked ? "line" : "text"); + }], + ["Highlight Active Line", function(checked) { + env.editor.setHighlightActiveLine(checked); + }], + ["Show Invisibles", function(checked) { + env.editor.setShowInvisibles(checked); + }], + ["Show Gutter", function(checked) { + env.editor.renderer.setShowGutter(checked); + }], + ["Show Indent Guides", function(checked) { + env.editor.renderer.setDisplayIndentGuides(checked); + }], + ["Show Print Margin", function(checked) { + env.editor.renderer.setShowPrintMargin(checked); + }], + ["Persistent HScroll", function(checked) { + env.editor.renderer.setHScrollBarAlwaysVisible(checked); + }], + ["Animate Scrolling", function(checked) { + env.editor.setAnimatedScroll(checked); + }], + ["Use Soft Tab", function(checked) { + env.editor.getSession().setUseSoftTabs(checked); + }], + ["Highlight Selected Word", function(checked) { + env.editor.setHighlightSelectedWord(checked); + }], + ["Enable Behaviours", function(checked) { + env.editor.setBehavioursEnabled(checked); + }], + ["Fade Fold Widgets", function(checked) { + env.editor.setFadeFoldWidgets(checked); + }], + ["Show Token info", function(checked) { + env.editor.setFadeFoldWidgets(checked); + }] +] + +var createOptionsPanel = function(options) { + var html = [] + var container = document.createElement("div"); + container.style.cssText = "position: absolute; overflow: hidden"; + var inner = document.createElement("div"); + inner.style.cssText = "width: 120%;height:100%;overflow: scroll"; + container.appendChild(inner); + html.push(""); + + options.forEach(function(o) { + + }); + + html.push( + '', + '', + '' + ) + html.push("
', + '', + '', + '', + '
"); + return container; +} + +function bindCheckbox(id, callback) { + var el = document.getElementById(id); + if (localStorage && localStorage.getItem(id)) + el.checked = localStorage.getItem(id) == "1"; + + var onCheck = function() { + callback(!!el.checked); + saveOption(el); + }; + el.onclick = onCheck; + onCheck(); +} + +function bindDropdown(id, callback) { + var el = document.getElementById(id); + if (localStorage && localStorage.getItem(id)) + el.value = localStorage.getItem(id); + + var onChange = function() { + callback(el.value); + saveOption(el); + }; + + el.onchange = onChange; + onChange(); +} + +function fillOptgroup(list, el) { + list.forEach(function(item) { + var option = document.createElement("option"); + option.setAttribute("value", item.name); + option.innerHTML = item.desc; + el.appendChild(option); + }); +} + +function fillDropdown(list, el) { + if (Array.isArray(list)) { + fillOptgroup(list, el); + return; + } + for(var i in list) { + var group = document.createElement("optgroup"); + group.setAttribute("label", i); + fillOptgroup(list[i], group); + el.appendChild(group); + } +} + +function createOptionControl(opt) { + if (opt.values) { + var el = dom.createElement("select"); + el.setAttribute("size", opt.visibleSize || 1); + fillDropdown(opt.values, el) + } else { + var el = dom.createElement("checkbox"); + } + el.setAttribute("name", "opt_" + opt.name) + return el; +} + +function createOptionCell(opt) { + if (opt.values) { + var el = dom.createElement("select"); + el.setAttribute("size", opt.visibleSize || 1); + fillDropdown(opt.values, el) + } else { + var el = dom.createElement("checkbox"); + } + el.setAttribute("name", "opt_" + opt.name) + return el; +} + + +createOptionsPanel(options) + + + +}); + diff --git a/0.0.3_0/ace/ext-searchbox.js b/0.0.3_0/ace/ext-searchbox.js new file mode 100644 index 0000000..360d51e --- /dev/null +++ b/0.0.3_0/ace/ext-searchbox.js @@ -0,0 +1,447 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2010, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/ext/searchbox', ['require', 'exports', 'module' , 'ace/lib/dom', 'ace/lib/lang', 'ace/lib/event', 'ace/keyboard/hash_handler', 'ace/lib/keys'], function(require, exports, module) { + + +var dom = require("../lib/dom"); +var lang = require("../lib/lang"); +var event = require("../lib/event"); +var searchboxCss = "\ +/* ------------------------------------------------------------------------------------------\ +* Editor Search Form\ +* --------------------------------------------------------------------------------------- */\ +.ace_search {\ +background-color: #ddd;\ +border: 1px solid #cbcbcb;\ +border-top: 0 none;\ +max-width: 297px;\ +overflow: hidden;\ +margin: 0;\ +padding: 4px;\ +padding-right: 6px;\ +padding-bottom: 0;\ +position: absolute;\ +top: 0px;\ +z-index: 99;\ +}\ +.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;\ +border-right: 1px solid #cbcbcb;\ +border: 0 none;\ +-webkit-box-sizing: border-box;\ +-moz-box-sizing: border-box;\ +box-sizing: border-box;\ +display: block;\ +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;\ +display: block;\ +float: left;\ +height: 22px;\ +margin: 0;\ +padding: 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;\ +display: block;\ +float: right;\ +font-family: Arial;\ +font-size: 16px;\ +height: 14px;\ +line-height: 16px;\ +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;\ +}"; +var HashHandler = require("../keyboard/hash_handler").HashHandler; +var keyUtil = require("../lib/keys"); + +dom.importCssString(searchboxCss, "ace_searchbox"); + +var html = ''.replace(/>\s+/g, ">"); + +var SearchBox = function(editor, range, showReplaceForm) { + var div = dom.createElement("div"); + div.innerHTML = html; + this.element = div.firstChild; + + this.$init(); + this.setEditor(editor); +}; + +(function() { + this.setEditor = function(editor) { + editor.searchBox = this; + editor.container.appendChild(this.element); + this.editor = editor; + }; + + this.$init = function() { + var sb = this.element; + + this.searchBox = sb.querySelector(".ace_search_form"); + this.replaceBox = sb.querySelector(".ace_replace_form"); + this.searchOptions = sb.querySelector(".ace_search_options"); + this.regExpOption = sb.querySelector("[action=toggleRegexpMode]"); + this.caseSensitiveOption = sb.querySelector("[action=toggleCaseSensitive]"); + this.wholeWordOption = sb.querySelector("[action=toggleWholeWords]"); + this.searchInput = this.searchBox.querySelector(".ace_search_field"); + this.replaceInput = this.replaceBox.querySelector(".ace_search_field"); + + var _this = this; + event.addListener(sb, "mousedown", function(e) { + setTimeout(function(){ + _this.activeInput.focus(); + }, 0); + event.stopPropagation(e); + }); + event.addListener(sb, "click", function(e) { + var t = e.target; + var action = t.getAttribute("action"); + if (action && _this[action]) + _this[action](); + else if (_this.$searchBarKb.commands[action]) + _this.$searchBarKb.commands[action].exec(_this); + event.stopPropagation(e); + }); + + event.addCommandKeyListener(sb, function(e, hashId, keyCode) { + var keyString = keyUtil.keyCodeToString(keyCode); + var command = _this.$searchBarKb.findKeyCommand(hashId, keyString); + if (command && command.exec) { + command.exec(_this); + event.stopEvent(e); + } + }); + + this.$onChange = lang.delayedCall(function() { + _this.find(false, false); + }); + + event.addListener(this.searchInput, "input", function() { + _this.$onChange.schedule(20); + }); + event.addListener(this.searchInput, "focus", function() { + _this.activeInput = _this.searchInput; + _this.searchInput.value && _this.highlight(); + }); + event.addListener(this.replaceInput, "focus", function() { + _this.activeInput = _this.replaceInput; + _this.searchInput.value && _this.highlight(); + }); + }; + this.$closeSearchBarKb = new HashHandler([{ + bindKey: "Esc", + name: "closeSearchBar", + exec: function(editor) { + editor.searchBox.hide(); + } + }]); + this.$searchBarKb = new HashHandler(); + this.$searchBarKb.bindKeys({ + "Ctrl-f|Command-f|Ctrl-H|Command-Option-F": function(sb) { + var isReplace = sb.isReplace = !sb.isReplace; + sb.replaceBox.style.display = isReplace ? "" : "none"; + sb[isReplace ? "replaceInput" : "searchInput"].focus(); + }, + "Ctrl-G|Command-G": function(sb) { + sb.findNext(); + }, + "Ctrl-Shift-G|Command-Shift-G": function(sb) { + sb.findPrev(); + }, + "esc": function(sb) { + setTimeout(function() { sb.hide();}); + }, + "Return": function(sb) { + if (sb.activeInput == sb.replaceInput) + sb.replace(); + sb.findNext(); + }, + "Shift-Return": function(sb) { + if (sb.activeInput == sb.replaceInput) + sb.replace(); + sb.findPrev(); + }, + "Tab": function(sb) { + (sb.activeInput == sb.replaceInput ? sb.searchInput : sb.replaceInput).focus(); + } + }); + + this.$searchBarKb.addCommands([{ + name: "toggleRegexpMode", + bindKey: {win: "Alt-R|Alt-/", mac: "Ctrl-Alt-R|Ctrl-Alt-/"}, + exec: function(sb) { + sb.regExpOption.checked = !sb.regExpOption.checked; + sb.$syncOptions(); + } + }, { + name: "toggleCaseSensitive", + bindKey: {win: "Alt-C|Alt-I", mac: "Ctrl-Alt-R|Ctrl-Alt-I"}, + exec: function(sb) { + sb.caseSensitiveOption.checked = !sb.caseSensitiveOption.checked; + sb.$syncOptions(); + } + }, { + name: "toggleWholeWords", + bindKey: {win: "Alt-B|Alt-W", mac: "Ctrl-Alt-B|Ctrl-Alt-W"}, + exec: function(sb) { + sb.wholeWordOption.checked = !sb.wholeWordOption.checked; + sb.$syncOptions(); + } + }]); + + this.$syncOptions = function() { + dom.setCssClass(this.regExpOption, "checked", this.regExpOption.checked); + dom.setCssClass(this.wholeWordOption, "checked", this.wholeWordOption.checked); + dom.setCssClass(this.caseSensitiveOption, "checked", this.caseSensitiveOption.checked); + this.find(false, false); + }; + + this.highlight = function(re) { + this.editor.session.highlight(re || this.editor.$search.$options.re); + this.editor.renderer.updateBackMarkers() + }; + this.find = function(skipCurrent, backwards) { + var range = this.editor.find(this.searchInput.value, { + skipCurrent: skipCurrent, + backwards: backwards, + wrap: true, + regExp: this.regExpOption.checked, + caseSensitive: this.caseSensitiveOption.checked, + wholeWord: this.wholeWordOption.checked + }); + dom.setCssClass(this.searchBox, "ace_nomatch", !range && this.searchInput.value); + this.highlight(); + }; + this.findNext = function() { + this.find(true, false); + }; + this.findPrev = function() { + this.find(true, true); + }; + this.replace = function() { + this.editor.replace(this.replaceInput.value); + }; + this.replaceAll = function() { + 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(value, isReplace) { + this.element.style.display = ""; + this.replaceBox.style.display = isReplace ? "" : "none"; + + this.isReplace = isReplace; + + if (value) + this.searchInput.value = value; + this.searchInput.focus(); + this.searchInput.select(); + + this.editor.keyBinding.addKeyboardHandler(this.$closeSearchBarKb); + }; + +}).call(SearchBox.prototype); + +exports.SearchBox = SearchBox; + +exports.Search = function(editor, isReplace) { + var sb = editor.searchBox || new SearchBox(editor); + sb.show(editor.session.getTextRange(), isReplace); +}; + + +exports.ISearch = function(session, options) { + this.$changeListener = this.$changeListener.bind(this); + this.startRange = session.selection.toOrientedRange(); + this.options = options || {}; +}; + +(function(){ + this.setSession = function(session) { + if (this.session) { + this.session.removeListener(this.$changeListener); + } + this.session = session; + this.session.addListener(this.$changeListener); + }; + this.setSearchString = function() { + + }; + this.getValue = function() { + if (this.value == null) + this.value = this.session.getValue(); + return this.value; + }; + this.$changeListener = function() { + this.value = null; + }; + this.find = function() { + + }; + this.$edgeBefore = function() { + this.cursor = this.startRange[this.options.backwards ? "start" : "end"]; + }; + this.$edgeAfter = function() { + + }; + this.next = function(dir) { + + }; +}).call(exports.ISearch.prototype); + + +}); diff --git a/0.0.3_0/ace/ext-settings_menu.js b/0.0.3_0/ace/ext-settings_menu.js new file mode 100644 index 0000000..4f5443d --- /dev/null +++ b/0.0.3_0/ace/ext-settings_menu.js @@ -0,0 +1,625 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2013 Matthew Christopher Kastor-Inare III, Atropa Inc. Intl + * All rights reserved. + * + * Contributed to Ajax.org under the BSD license. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/ext/settings_menu', ['require', 'exports', 'module' , 'ace/ext/menu_tools/generate_settings_menu', 'ace/ext/menu_tools/overlay_page', 'ace/editor'], function(require, exports, module) { + +var generateSettingsMenu = require('./menu_tools/generate_settings_menu').generateSettingsMenu; +var overlayPage = require('./menu_tools/overlay_page').overlayPage; +function showSettingsMenu(editor) { + var sm = document.getElementById('ace_settingsmenu'); + if (!sm) + overlayPage(editor, generateSettingsMenu(editor), '0', '0', '0'); +} +module.exports.init = function(editor) { + var Editor = require("ace/editor").Editor; + Editor.prototype.showSettingsMenu = function() { + showSettingsMenu(this); + }; +}; +}); + +ace.define('ace/ext/menu_tools/generate_settings_menu', ['require', 'exports', 'module' , 'ace/ext/menu_tools/element_generator', 'ace/ext/menu_tools/add_editor_menu_options', 'ace/ext/menu_tools/get_set_functions'], function(require, exports, module) { + +var egen = require('./element_generator'); +var addEditorMenuOptions = require('./add_editor_menu_options').addEditorMenuOptions; +var getSetFunctions = require('./get_set_functions').getSetFunctions; +module.exports.generateSettingsMenu = function generateSettingsMenu (editor) { + var elements = []; + function cleanupElementsList() { + elements.sort(function(a, b) { + var x = a.getAttribute('contains'); + var y = b.getAttribute('contains'); + return x.localeCompare(y); + }); + } + function wrapElements() { + var topmenu = document.createElement('div'); + topmenu.setAttribute('id', 'ace_settingsmenu'); + elements.forEach(function(element) { + topmenu.appendChild(element); + }); + return topmenu; + } + function createNewEntry(obj, clss, item, val) { + var el; + var div = document.createElement('div'); + div.setAttribute('contains', item); + div.setAttribute('class', 'ace_optionsMenuEntry'); + div.setAttribute('style', 'clear: both;'); + + div.appendChild(egen.createLabel( + item.replace(/^set/, '').replace(/([A-Z])/g, ' $1').trim(), + item + )); + + if (Array.isArray(val)) { + el = egen.createSelection(item, val, clss); + el.addEventListener('change', function(e) { + try{ + editor.menuOptions[e.target.id].forEach(function(x) { + if(x.textContent !== e.target.textContent) { + delete x.selected; + } + }); + obj[e.target.id](e.target.value); + } catch (err) { + throw new Error(err); + } + }); + } else if(typeof val === 'boolean') { + el = egen.createCheckbox(item, val, clss); + el.addEventListener('change', function(e) { + try{ + obj[e.target.id](!!e.target.checked); + } catch (err) { + throw new Error(err); + } + }); + } else { + el = egen.createInput(item, val, clss); + el.addEventListener('change', function(e) { + try{ + if(e.target.value === 'true') { + obj[e.target.id](true); + } else if(e.target.value === 'false') { + obj[e.target.id](false); + } else { + obj[e.target.id](e.target.value); + } + } catch (err) { + throw new Error(err); + } + }); + } + el.style.cssText = 'float:right;'; + div.appendChild(el); + return div; + } + function makeDropdown(item, esr, clss, fn) { + var val = editor.menuOptions[item]; + var currentVal = esr[fn](); + if (typeof currentVal == 'object') + currentVal = currentVal.$id; + val.forEach(function(valuex) { + if (valuex.value === currentVal) + valuex.selected = 'selected'; + }); + return createNewEntry(esr, clss, item, val); + } + function handleSet(setObj) { + var item = setObj.functionName; + var esr = setObj.parentObj; + var clss = setObj.parentName; + var val; + var fn = item.replace(/^set/, 'get'); + if(editor.menuOptions[item] !== undefined) { + elements.push(makeDropdown(item, esr, clss, fn)); + } else if(typeof esr[fn] === 'function') { + try { + val = esr[fn](); + if(typeof val === 'object') { + val = val.$id; + } + elements.push( + createNewEntry(esr, clss, item, val) + ); + } catch (e) { + } + } + } + addEditorMenuOptions(editor); + getSetFunctions(editor).forEach(function(setObj) { + handleSet(setObj); + }); + cleanupElementsList(); + return wrapElements(); +}; + +}); + +ace.define('ace/ext/menu_tools/element_generator', ['require', 'exports', 'module' ], function(require, exports, module) { +module.exports.createOption = function createOption (obj) { + var attribute; + var el = document.createElement('option'); + for(attribute in obj) { + if(obj.hasOwnProperty(attribute)) { + if(attribute === 'selected') { + el.setAttribute(attribute, obj[attribute]); + } else { + el[attribute] = obj[attribute]; + } + } + } + return el; +}; +module.exports.createCheckbox = function createCheckbox (id, checked, clss) { + var el = document.createElement('input'); + el.setAttribute('type', 'checkbox'); + el.setAttribute('id', id); + el.setAttribute('name', id); + el.setAttribute('value', checked); + el.setAttribute('class', clss); + if(checked) { + el.setAttribute('checked', 'checked'); + } + return el; +}; +module.exports.createInput = function createInput (id, value, clss) { + var el = document.createElement('input'); + el.setAttribute('type', 'text'); + el.setAttribute('id', id); + el.setAttribute('name', id); + el.setAttribute('value', value); + el.setAttribute('class', clss); + return el; +}; +module.exports.createLabel = function createLabel (text, labelFor) { + var el = document.createElement('label'); + el.setAttribute('for', labelFor); + el.textContent = text; + return el; +}; +module.exports.createSelection = function createSelection (id, values, clss) { + var el = document.createElement('select'); + el.setAttribute('id', id); + el.setAttribute('name', id); + el.setAttribute('class', clss); + values.forEach(function(item) { + el.appendChild(module.exports.createOption(item)); + }); + return el; +}; + +}); + +ace.define('ace/ext/menu_tools/add_editor_menu_options', ['require', 'exports', 'module' , 'ace/ext/modelist', 'ace/ext/themelist'], function(require, exports, module) { +module.exports.addEditorMenuOptions = function addEditorMenuOptions (editor) { + var modelist = require('../modelist'); + var themelist = require('../themelist'); + editor.menuOptions = { + "setNewLineMode" : [{ + "textContent" : "unix", + "value" : "unix" + }, { + "textContent" : "windows", + "value" : "windows" + }, { + "textContent" : "auto", + "value" : "auto" + }], + "setTheme" : [], + "setMode" : [], + "setKeyboardHandler": [{ + "textContent" : "ace", + "value" : "" + }, { + "textContent" : "vim", + "value" : "ace/keyboard/vim" + }, { + "textContent" : "emacs", + "value" : "ace/keyboard/emacs" + }] + }; + + editor.menuOptions.setTheme = themelist.themes.map(function(theme) { + return { + 'textContent' : theme.desc, + 'value' : theme.theme + }; + }); + + editor.menuOptions.setMode = modelist.modes.map(function(mode) { + return { + 'textContent' : mode.name, + 'value' : mode.mode + }; + }); +}; + + +});ace.define('ace/ext/modelist', ['require', 'exports', 'module' ], function(require, exports, module) { + + +var modes = []; +function getModeForPath(path) { + var mode = modesByName.text; + var fileName = path.split(/[\/\\]/).pop(); + for (var i = 0; i < modes.length; i++) { + if (modes[i].supportsFile(fileName)) { + mode = modes[i]; + break; + } + } + return mode; +} + +var Mode = function(name, caption, extensions) { + this.name = name; + this.caption = caption; + this.mode = "ace/mode/" + name; + this.extensions = extensions; + if (/\^/.test(extensions)) { + var re = extensions.replace(/\|(\^)?/g, function(a, b){ + return "$|" + (b ? "^" : "^.*\\."); + }) + "$"; + } else { + var re = "^.*\\.(" + extensions + ")$"; + } + + this.extRe = new RegExp(re, "gi"); +}; + +Mode.prototype.supportsFile = function(filename) { + return filename.match(this.extRe); +}; +var supportedModes = { + ABAP: ["abap"], + ADA: ["ada|adb"], + ActionScript:["as"], + AsciiDoc: ["asciidoc"], + Assembly_x86:["asm"], + AutoHotKey: ["ahk"], + BatchFile: ["bat|cmd"], + C9Search: ["c9search_results"], + C_Cpp: ["c|cc|cpp|cxx|h|hh|hpp"], + Clojure: ["clj"], + Cobol: ["^CBL|COB"], + coffee: ["^Cakefile|coffee|cf|cson"], + ColdFusion: ["cfm"], + CSharp: ["cs"], + CSS: ["css"], + Curly: ["curly"], + D: ["d|di"], + Dart: ["dart"], + Diff: ["diff|patch"], + Dot: ["dot"], + Erlang: ["erl|hrl"], + EJS: ["ejs"], + Forth: ["frt|fs|ldr"], + FreeMarker: ["ftl"], + Glsl: ["glsl|frag|vert"], + golang: ["go"], + Groovy: ["groovy"], + HAML: ["haml"], + Haskell: ["hs"], + haXe: ["hx"], + HTML: ["htm|html|xhtml"], + HTML_Ruby: ["erb|rhtml|html.erb"], + Ini: ["Ini|conf"], + Jade: ["jade"], + Java: ["java"], + JavaScript: ["js"], + JSON: ["json"], + JSONiq: ["jq"], + JSP: ["jsp"], + JSX: ["jsx"], + Julia: ["jl"], + LaTeX: ["latex|tex|ltx|bib"], + LESS: ["less"], + Liquid: ["liquid"], + Lisp: ["lisp"], + LiveScript: ["ls"], + LogiQL: ["logic|lql"], + LSL: ["lsl"], + Lua: ["lua"], + LuaPage: ["lp"], + Lucene: ["lucene"], + Makefile: ["^GNUmakefile|^makefile|^Makefile|^OCamlMakefile|make"], + MATLAB: ["matlab"], + Markdown: ["md|markdown"], + MySQL: ["mysql"], + MUSHCode: ["mc|mush"], + ObjectiveC: ["m|mm"], + OCaml: ["ml|mli"], + Pascal: ["pas|p"], + Perl: ["pl|pm"], + pgSQL: ["pgsql"], + PHP: ["php|phtml"], + Powershell: ["ps1"], + Prolog: ["plg|prolog"], + Properties: ["properties"], + Python: ["py"], + R: ["r"], + RDoc: ["Rd"], + RHTML: ["Rhtml"], + Ruby: ["ru|gemspec|rake|rb"], + Rust: ["rs"], + SASS: ["sass"], + SCAD: ["scad"], + Scala: ["scala"], + Scheme: ["scm|rkt"], + SCSS: ["scss"], + SH: ["sh|bash"], + snippets: ["snippets"], + SQL: ["sql"], + Stylus: ["styl|stylus"], + SVG: ["svg"], + Tcl: ["tcl"], + Tex: ["tex"], + Text: ["txt"], + Textile: ["textile"], + Toml: ["toml"], + Twig: ["twig"], + Typescript: ["typescript|ts|str"], + VBScript: ["vbs"], + Velocity: ["vm"], + XML: ["xml|rdf|rss|wsdl|xslt|atom|mathml|mml|xul|xbl"], + XQuery: ["xq"], + YAML: ["yaml"] +}; + +var nameOverrides = { + ObjectiveC: "Objective-C", + CSharp: "C#", + golang: "Go", + C_Cpp: "C/C++", + coffee: "CoffeeScript", + HTML_Ruby: "HTML (Ruby)" +}; +var modesByName = {}; +for (var name in supportedModes) { + var data = supportedModes[name]; + var displayName = nameOverrides[name] || name; + var filename = name.toLowerCase(); + var mode = new Mode(filename, displayName, data[0]); + modesByName[filename] = mode; + modes.push(mode); +} + +module.exports = { + getModeForPath: getModeForPath, + modes: modes, + modesByName: modesByName +}; + +}); + +ace.define('ace/ext/themelist', ['require', 'exports', 'module' , 'ace/ext/themelist_utils/themes'], function(require, exports, module) { +module.exports.themes = require('ace/ext/themelist_utils/themes').themes; +module.exports.ThemeDescription = function(name) { + this.name = name; + this.desc = name.split('_' + ).map( + function(namePart) { + return namePart[0].toUpperCase() + namePart.slice(1); + } + ).join(' '); + this.theme = "ace/theme/" + name; +}; + +module.exports.themesByName = {}; + +module.exports.themes = module.exports.themes.map(function(name) { + module.exports.themesByName[name] = new module.exports.ThemeDescription(name); + return module.exports.themesByName[name]; +}); + +}); + +ace.define('ace/ext/themelist_utils/themes', ['require', 'exports', 'module' ], function(require, exports, module) { + +module.exports.themes = [ + "ambiance", + "chaos", + "chrome", + "clouds", + "clouds_midnight", + "cobalt", + "crimson_editor", + "dawn", + "dreamweaver", + "eclipse", + "github", + "idle_fingers", + "kr_theme", + "merbivore", + "merbivore_soft", + "monokai", + "mono_industrial", + "pastel_on_dark", + "solarized_dark", + "solarized_light", + "terminal", + "textmate", + "tomorrow", + "tomorrow_night", + "tomorrow_night_blue", + "tomorrow_night_bright", + "tomorrow_night_eighties", + "twilight", + "vibrant_ink", + "xcode" +]; + +}); + +ace.define('ace/ext/menu_tools/get_set_functions', ['require', 'exports', 'module' ], function(require, exports, module) { +module.exports.getSetFunctions = function getSetFunctions (editor) { + var out = []; + var my = { + 'editor' : editor, + 'session' : editor.session, + 'renderer' : editor.renderer + }; + var opts = []; + var skip = [ + 'setOption', + 'setUndoManager', + 'setDocument', + 'setValue', + 'setBreakpoints', + 'setScrollTop', + 'setScrollLeft', + 'setSelectionStyle', + 'setWrapLimitRange' + ]; + ['renderer', 'session', 'editor'].forEach(function(esra) { + var esr = my[esra]; + var clss = esra; + for(var fn in esr) { + if(skip.indexOf(fn) === -1) { + if(/^set/.test(fn) && opts.indexOf(fn) === -1) { + opts.push(fn); + out.push({ + 'functionName' : fn, + 'parentObj' : esr, + 'parentName' : clss + }); + } + } + } + }); + return out; +}; + +}); + +ace.define('ace/ext/menu_tools/overlay_page', ['require', 'exports', 'module' , 'ace/lib/dom'], function(require, exports, module) { + +var dom = require("../../lib/dom"); +var cssText = "#ace_settingsmenu, #kbshortcutmenu {\ +background-color: #F7F7F7;\ +color: black;\ +box-shadow: -5px 4px 5px rgba(126, 126, 126, 0.55);\ +padding: 1em 0.5em 2em 1em;\ +overflow: auto;\ +position: absolute;\ +margin: 0;\ +bottom: 0;\ +right: 0;\ +top: 0;\ +z-index: 9991;\ +cursor: default;\ +}\ +.ace_dark #ace_settingsmenu, .ace_dark #kbshortcutmenu {\ +box-shadow: -20px 10px 25px rgba(126, 126, 126, 0.25);\ +background-color: rgba(255, 255, 255, 0.6);\ +color: black;\ +}\ +.ace_optionsMenuEntry:hover {\ +background-color: rgba(100, 100, 100, 0.1);\ +-webkit-transition: all 0.5s;\ +transition: all 0.3s\ +}\ +.ace_closeButton {\ +background: rgba(245, 146, 146, 0.5);\ +border: 1px solid #F48A8A;\ +border-radius: 50%;\ +padding: 7px;\ +position: absolute;\ +right: -8px;\ +top: -8px;\ +z-index: 1000;\ +}\ +.ace_closeButton{\ +background: rgba(245, 146, 146, 0.9);\ +}\ +.ace_optionsMenuKey {\ +color: darkslateblue;\ +font-weight: bold;\ +}\ +.ace_optionsMenuCommand {\ +color: darkcyan;\ +font-weight: normal;\ +}"; +dom.importCssString(cssText); +module.exports.overlayPage = function overlayPage(editor, contentElement, top, right, bottom, left) { + top = top ? 'top: ' + top + ';' : ''; + bottom = bottom ? 'bottom: ' + bottom + ';' : ''; + right = right ? 'right: ' + right + ';' : ''; + left = left ? 'left: ' + left + ';' : ''; + + var closer = document.createElement('div'); + var contentContainer = document.createElement('div'); + + function documentEscListener(e) { + if (e.keyCode === 27) { + closer.click(); + } + } + + closer.style.cssText = 'margin: 0; padding: 0; ' + + 'position: fixed; top:0; bottom:0; left:0; right:0;' + + 'z-index: 9990; ' + + 'background-color: rgba(0, 0, 0, 0.3);'; + closer.addEventListener('click', function() { + document.removeEventListener('keydown', documentEscListener); + closer.parentNode.removeChild(closer); + editor.focus(); + closer = null; + }); + document.addEventListener('keydown', documentEscListener); + + contentContainer.style.cssText = top + right + bottom + left; + contentContainer.addEventListener('click', function(e) { + e.stopPropagation(); + }); + + var wrapper = dom.createElement("div"); + wrapper.style.position = "relative"; + + var closeButton = dom.createElement("div"); + closeButton.className = "ace_closeButton"; + closeButton.addEventListener('click', function() { + closer.click(); + }); + + wrapper.appendChild(closeButton); + contentContainer.appendChild(wrapper); + + contentContainer.appendChild(contentElement); + closer.appendChild(contentContainer); + document.body.appendChild(closer); + editor.blur(); +}; + +}); \ No newline at end of file diff --git a/0.0.3_0/ace/ext-spellcheck.js b/0.0.3_0/ace/ext-spellcheck.js new file mode 100644 index 0000000..192c796 --- /dev/null +++ b/0.0.3_0/ace/ext-spellcheck.js @@ -0,0 +1,67 @@ +ace.define('ace/ext/spellcheck', ['require', 'exports', 'module' , 'ace/lib/event', 'ace/editor', 'ace/config'], function(require, exports, module) { + +var event = require("../lib/event"); + +exports.contextMenuHandler = function(e){ + var host = e.target; + var text = host.textInput.getElement(); + if (!host.selection.isEmpty()) + return; + var c = host.getCursorPosition(); + var r = host.session.getWordRange(c.row, c.column); + var w = host.session.getTextRange(r); + + host.session.tokenRe.lastIndex = 0; + if (!host.session.tokenRe.test(w)) + return; + var PLACEHOLDER = "\x01\x01"; + var value = w + " " + PLACEHOLDER; + text.value = value; + text.setSelectionRange(w.length + 1, w.length + 1); + text.setSelectionRange(0, 0); + + var afterKeydown = false; + event.addListener(text, "keydown", function onKeydown() { + event.removeListener(text, "keydown", onKeydown); + afterKeydown = true; + }); + + host.textInput.setInputHandler(function(newVal) { + console.log(newVal , value, text.selectionStart, text.selectionEnd) + if (newVal == value) + return ''; + if (newVal.lastIndexOf(value, 0) === 0) + return newVal.slice(value.length); + if (newVal.substr(text.selectionEnd) == value) + return newVal.slice(0, -value.length); + if (newVal.slice(-2) == PLACEHOLDER) { + var val = newVal.slice(0, -2); + if (val.slice(-1) == " ") { + if (afterKeydown) + return val.substring(0, text.selectionEnd); + val = val.slice(0, -1); + host.session.replace(r, val); + return ""; + } + } + + return newVal; + }); +}; +var Editor = require("../editor").Editor; +require("../config").defineOptions(Editor.prototype, "editor", { + spellcheck: { + set: function(val) { + var text = this.textInput.getElement(); + text.spellcheck = !!val; + if (!val) + this.removeListener("nativecontextmenu", exports.contextMenuHandler); + else + this.on("nativecontextmenu", exports.contextMenuHandler); + }, + value: true + } +}); + +}); + diff --git a/0.0.3_0/ace/ext-static_highlight.js b/0.0.3_0/ace/ext-static_highlight.js new file mode 100644 index 0000000..fed5748 --- /dev/null +++ b/0.0.3_0/ace/ext-static_highlight.js @@ -0,0 +1,121 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2010, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/ext/static_highlight', ['require', 'exports', 'module' , 'ace/edit_session', 'ace/layer/text', 'ace/config'], function(require, exports, module) { + + +var EditSession = require("../edit_session").EditSession; +var TextLayer = require("../layer/text").Text; +var baseStyles = ".ace_editor {\ +font-family: 'Monaco', 'Menlo', 'Droid Sans Mono', 'Courier New', monospace;\ +font-size: 12px;\ +}\ +.ace_editor .ace_gutter {\ +width: 25px !important;\ +display: block;\ +float: left;\ +text-align: right;\ +padding: 0 3px 0 0;\ +margin-right: 3px;\ +}\ +.ace_line { clear: both; }\ +*.ace_gutter-cell {\ +-moz-user-select: -moz-none;\ +-khtml-user-select: none;\ +-webkit-user-select: none;\ +user-select: none;\ +}"; +var config = require("../config"); + +exports.render = function(input, mode, theme, lineStart, disableGutter, callback) { + var waiting = 0 + if (typeof theme == "string") { + waiting++; + config.loadModule(['theme', theme], function(m) { + theme = m; + --waiting || done(); + }); + } + + if (typeof mode == "string") { + waiting++; + config.loadModule(['mode', mode], function(m) { + mode = new m.Mode() + --waiting || done(); + }); + } + function done() { + var result = exports.renderSync(input, mode, theme, lineStart, disableGutter); + return callback ? callback(result) : result; + } + return waiting || done(); +}; + +exports.renderSync = function(input, mode, theme, lineStart, disableGutter) { + lineStart = parseInt(lineStart || 1, 10); + + var session = new EditSession(""); + session.setUseWorker(false); + session.setMode(mode); + + var textLayer = new TextLayer(document.createElement("div")); + textLayer.setSession(session); + textLayer.config = { + characterWidth: 10, + lineHeight: 20 + }; + + session.setValue(input); + + var stringBuilder = []; + var length = session.getLength(); + + for(var ix = 0; ix < length; ix++) { + stringBuilder.push("
"); + if (!disableGutter) + stringBuilder.push("" + (ix + lineStart) + ""); + textLayer.$renderLine(stringBuilder, ix, true, false); + stringBuilder.push("
"); + } + var html = "
\ +
\ + :code\ +
\ +
".replace(/:cssClass/, theme.cssClass).replace(/:code/, stringBuilder.join("")); + + textLayer.destroy(); + + return { + css: baseStyles + theme.cssText, + html: html + }; +}; + +}); diff --git a/0.0.3_0/ace/ext-statusbar.js b/0.0.3_0/ace/ext-statusbar.js new file mode 100644 index 0000000..31cab37 --- /dev/null +++ b/0.0.3_0/ace/ext-statusbar.js @@ -0,0 +1,47 @@ +ace.define('ace/ext/statusbar', ['require', 'exports', 'module' , 'ace/lib/dom', 'ace/lib/lang'], function(require, exports, module) { +var dom = require("ace/lib/dom"); +var lang = require("ace/lib/lang"); + +var StatusBar = function(editor, parentNode) { + this.element = dom.createElement("div"); + this.element.className = "ace_status-indicator"; + this.element.style.cssText = "display: inline-block;"; + parentNode.appendChild(this.element); + + var statusUpdate = lang.delayedCall(function(){ + this.updateStatus(editor) + }.bind(this)); + editor.on("changeStatus", function() { + statusUpdate.schedule(100); + }); + editor.on("changeSelection", function() { + statusUpdate.schedule(100); + }); +}; + +(function(){ + this.updateStatus = function(editor) { + var status = []; + function add(str, separator) { + str && status.push(str, separator || "|"); + } + + if (editor.$vimModeHandler) + add(editor.$vimModeHandler.getStatusText()); + else if (editor.commands.recording) + add("REC"); + + var c = editor.selection.lead; + add(c.row + ":" + c.column, " "); + if (!editor.selection.isEmpty()) { + var r = editor.getSelectionRange(); + add("(" + (r.end.row - r.start.row) + ":" +(r.end.column - r.start.column) + ")"); + } + status.pop(); + this.element.textContent = status.join(""); + }; +}).call(StatusBar.prototype); + +exports.StatusBar = StatusBar; + +}); \ No newline at end of file diff --git a/0.0.3_0/ace/ext-textarea.js b/0.0.3_0/ace/ext-textarea.js new file mode 100644 index 0000000..abde227 --- /dev/null +++ b/0.0.3_0/ace/ext-textarea.js @@ -0,0 +1,492 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2010, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/ext/textarea', ['require', 'exports', 'module' , 'ace/lib/event', 'ace/lib/useragent', 'ace/lib/net', 'ace/ace', 'ace/theme/textmate', 'ace/mode/text'], function(require, exports, module) { + + +var event = require("../lib/event"); +var UA = require("../lib/useragent"); +var net = require("../lib/net"); +var ace = require("../ace"); + +require("../theme/textmate"); + +module.exports = exports = ace; +var getCSSProperty = function(element, container, property) { + var ret = element.style[property]; + + if (!ret) { + if (window.getComputedStyle) { + ret = window.getComputedStyle(element, '').getPropertyValue(property); + } else { + ret = element.currentStyle[property]; + } + } + + if (!ret || ret == 'auto' || ret == 'intrinsic') { + ret = container.style[property]; + } + return ret; +}; + +function applyStyles(elm, styles) { + for (var style in styles) { + elm.style[style] = styles[style]; + } +} + +function setupContainer(element, getValue) { + if (element.type != 'textarea') { + throw "Textarea required!"; + } + + var parentNode = element.parentNode; + var container = document.createElement('div'); + var resizeEvent = function() { + var style = 'position:relative;'; + [ + 'margin-top', 'margin-left', 'margin-right', 'margin-bottom' + ].forEach(function(item) { + style += item + ':' + + getCSSProperty(element, container, item) + ';'; + }); + var width = getCSSProperty(element, container, 'width') || (element.clientWidth + "px"); + var height = getCSSProperty(element, container, 'height') || (element.clientHeight + "px"); + style += 'height:' + height + ';width:' + width + ';'; + style += 'display:inline-block;'; + container.setAttribute('style', style); + }; + event.addListener(window, 'resize', resizeEvent); + resizeEvent(); + parentNode.insertBefore(container, element.nextSibling); + while (parentNode !== document) { + if (parentNode.tagName.toUpperCase() === 'FORM') { + var oldSumit = parentNode.onsubmit; + parentNode.onsubmit = function(evt) { + element.value = getValue(); + if (oldSumit) { + oldSumit.call(this, evt); + } + }; + break; + } + parentNode = parentNode.parentNode; + } + return container; +} + +exports.transformTextarea = function(element, loader) { + var session; + var container = setupContainer(element, function() { + return session.getValue(); + }); + element.style.display = 'none'; + container.style.background = 'white'; + var editorDiv = document.createElement("div"); + applyStyles(editorDiv, { + top: "0px", + left: "0px", + right: "0px", + bottom: "0px", + border: "1px solid gray", + position: "absolute" + }); + container.appendChild(editorDiv); + + var settingOpener = document.createElement("div"); + applyStyles(settingOpener, { + position: "absolute", + right: "0px", + bottom: "0px", + background: "red", + cursor: "nw-resize", + borderStyle: "solid", + borderWidth: "9px 8px 10px 9px", + width: "2px", + borderColor: "lightblue gray gray lightblue", + zIndex: 101 + }); + + var settingDiv = document.createElement("div"); + var settingDivStyles = { + top: "0px", + left: "20%", + right: "0px", + bottom: "0px", + position: "absolute", + padding: "5px", + zIndex: 100, + color: "white", + display: "none", + overflow: "auto", + fontSize: "14px", + boxShadow: "-5px 2px 3px gray" + }; + if (!UA.isOldIE) { + settingDivStyles.backgroundColor = "rgba(0, 0, 0, 0.6)"; + } else { + settingDivStyles.backgroundColor = "#333"; + } + + applyStyles(settingDiv, settingDivStyles); + container.appendChild(settingDiv); + var options = {}; + + var editor = ace.edit(editorDiv); + session = editor.getSession(); + + session.setValue(element.value || element.innerHTML); + editor.focus(); + container.appendChild(settingOpener); + setupApi(editor, editorDiv, settingDiv, ace, options, loader); + setupSettingPanel(settingDiv, settingOpener, editor, options); + + var state = ""; + event.addListener(settingOpener, "mousemove", function(e) { + var rect = this.getBoundingClientRect(); + var x = e.clientX - rect.left, y = e.clientY - rect.top; + if (x + y < (rect.width + rect.height)/2) { + this.style.cursor = "pointer"; + state = "toggle"; + } else { + state = "resize"; + this.style.cursor = "nw-resize"; + } + }); + + event.addListener(settingOpener, "mousedown", function(e) { + if (state == "toggle") { + editor.setDisplaySettings(); + return; + } + container.style.zIndex = 100000; + var rect = container.getBoundingClientRect(); + var startX = rect.width + rect.left - e.clientX; + var startY = rect.height + rect.top - e.clientY; + event.capture(settingOpener, function(e) { + container.style.width = e.clientX - rect.left + startX + "px"; + container.style.height = e.clientY - rect.top + startY + "px"; + editor.resize(); + }, function() {}); + }); + + return editor; +}; + +function load(url, module, callback) { + net.loadScript(url, function() { + require([module], callback); + }); +} + +function setupApi(editor, editorDiv, settingDiv, ace, options, loader) { + var session = editor.getSession(); + var renderer = editor.renderer; + loader = loader || load; + + function toBool(value) { + return value === "true" || value == true; + } + + editor.setDisplaySettings = function(display) { + if (display == null) + display = settingDiv.style.display == "none"; + if (display) { + settingDiv.style.display = "block"; + settingDiv.hideButton.focus(); + editor.on("focus", function onFocus() { + editor.removeListener("focus", onFocus); + settingDiv.style.display = "none" + }); + } else { + editor.focus(); + }; + }; + + editor.setOption = function(key, value) { + if (options[key] == value) return; + + switch (key) { + case "gutter": + renderer.setShowGutter(toBool(value)); + break; + + case "mode": + if (value != "text") { + loader("mode-" + value + ".js", "ace/mode/" + value, function() { + var aceMode = require("../mode/" + value).Mode; + session.setMode(new aceMode()); + }); + } else { + session.setMode(new (require("../mode/text").Mode)); + } + break; + + case "theme": + if (value != "textmate") { + loader("theme-" + value + ".js", "ace/theme/" + value, function() { + editor.setTheme("ace/theme/" + value); + }); + } else { + editor.setTheme("ace/theme/textmate"); + } + break; + + case "fontSize": + editorDiv.style.fontSize = value; + break; + + case "keybindings": + switch (value) { + case "vim": + editor.setKeyboardHandler("ace/keyboard/vim"); + break; + case "emacs": + editor.setKeyboardHandler("ace/keyboard/emacs"); + break; + default: + editor.setKeyboardHandler(null); + } + break; + + case "softWrap": + switch (value) { + case "off": + session.setUseWrapMode(false); + renderer.setPrintMarginColumn(80); + break; + case "40": + session.setUseWrapMode(true); + session.setWrapLimitRange(40, 40); + renderer.setPrintMarginColumn(40); + break; + case "80": + session.setUseWrapMode(true); + session.setWrapLimitRange(80, 80); + renderer.setPrintMarginColumn(80); + break; + case "free": + session.setUseWrapMode(true); + session.setWrapLimitRange(null, null); + renderer.setPrintMarginColumn(80); + break; + } + break; + + case "useSoftTabs": + session.setUseSoftTabs(toBool(value)); + break; + + case "showPrintMargin": + renderer.setShowPrintMargin(toBool(value)); + break; + + case "showInvisibles": + editor.setShowInvisibles(toBool(value)); + break; + } + + options[key] = value; + }; + + editor.getOption = function(key) { + return options[key]; + }; + + editor.getOptions = function() { + return options; + }; + + for (var option in exports.options) { + editor.setOption(option, exports.options[option]); + } + + return editor; +} + +function setupSettingPanel(settingDiv, settingOpener, editor, options) { + var BOOL = null; + + var desc = { + mode: "Mode:", + gutter: "Display Gutter:", + theme: "Theme:", + fontSize: "Font Size:", + softWrap: "Soft Wrap:", + keybindings: "Keyboard", + showPrintMargin: "Show Print Margin:", + useSoftTabs: "Use Soft Tabs:", + showInvisibles: "Show Invisibles" + }; + + var optionValues = { + mode: { + text: "Plain", + javascript: "JavaScript", + xml: "XML", + html: "HTML", + css: "CSS", + scss: "SCSS", + python: "Python", + php: "PHP", + java: "Java", + ruby: "Ruby", + c_cpp: "C/C++", + coffee: "CoffeeScript", + json: "json", + perl: "Perl", + clojure: "Clojure", + ocaml: "OCaml", + csharp: "C#", + haxe: "haXe", + svg: "SVG", + textile: "Textile", + groovy: "Groovy", + liquid: "Liquid", + Scala: "Scala" + }, + theme: { + clouds: "Clouds", + clouds_midnight: "Clouds Midnight", + cobalt: "Cobalt", + crimson_editor: "Crimson Editor", + dawn: "Dawn", + eclipse: "Eclipse", + idle_fingers: "Idle Fingers", + kr_theme: "Kr Theme", + merbivore: "Merbivore", + merbivore_soft: "Merbivore Soft", + mono_industrial: "Mono Industrial", + monokai: "Monokai", + pastel_on_dark: "Pastel On Dark", + solarized_dark: "Solarized Dark", + solarized_light: "Solarized Light", + textmate: "Textmate", + twilight: "Twilight", + vibrant_ink: "Vibrant Ink" + }, + gutter: BOOL, + fontSize: { + "10px": "10px", + "11px": "11px", + "12px": "12px", + "14px": "14px", + "16px": "16px" + }, + softWrap: { + off: "Off", + 40: "40", + 80: "80", + free: "Free" + }, + keybindings: { + ace: "ace", + vim: "vim", + emacs: "emacs" + }, + showPrintMargin: BOOL, + useSoftTabs: BOOL, + showInvisibles: BOOL + }; + + var table = []; + table.push(""); + + function renderOption(builder, option, obj, cValue) { + if (!obj) { + builder.push( + "" + ); + return + } + builder.push(""); + } + + for (var option in options) { + table.push(""); + table.push(""); + } + table.push("
SettingValue
", desc[option], ""); + renderOption(table, option, optionValues[option], options[option]); + table.push("
"); + settingDiv.innerHTML = table.join(""); + + var onChange = function(e) { + var select = e.currentTarget; + editor.setOption(select.title, select.value); + }; + var onClick = function(e) { + var cb = e.currentTarget; + editor.setOption(cb.title, cb.checked); + }; + var selects = settingDiv.getElementsByTagName("select"); + for (var i = 0; i < selects.length; i++) + selects[i].onchange = onChange; + var cbs = settingDiv.getElementsByTagName("input"); + for (var i = 0; i < cbs.length; i++) + cbs[i].onclick = onClick; + + + var button = document.createElement("input"); + button.type = "button"; + button.value = "Hide"; + event.addListener(button, "click", function() { + editor.setDisplaySettings(false); + }); + settingDiv.appendChild(button); + settingDiv.hideButton = button; +} +exports.options = { + mode: "text", + theme: "textmate", + gutter: "false", + fontSize: "12px", + softWrap: "off", + keybindings: "ace", + showPrintMargin: "false", + useSoftTabs: "true", + showInvisibles: "false" +}; + +}); diff --git a/0.0.3_0/ace/ext-themelist.js b/0.0.3_0/ace/ext-themelist.js new file mode 100644 index 0000000..bd68156 --- /dev/null +++ b/0.0.3_0/ace/ext-themelist.js @@ -0,0 +1,90 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2013 Matthew Christopher Kastor-Inare III, Atropa Inc. Intl + * All rights reserved. + * + * Contributed to Ajax.org under the BSD license. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/ext/themelist', ['require', 'exports', 'module' , 'ace/ext/themelist_utils/themes'], function(require, exports, module) { +module.exports.themes = require('ace/ext/themelist_utils/themes').themes; +module.exports.ThemeDescription = function(name) { + this.name = name; + this.desc = name.split('_' + ).map( + function(namePart) { + return namePart[0].toUpperCase() + namePart.slice(1); + } + ).join(' '); + this.theme = "ace/theme/" + name; +}; + +module.exports.themesByName = {}; + +module.exports.themes = module.exports.themes.map(function(name) { + module.exports.themesByName[name] = new module.exports.ThemeDescription(name); + return module.exports.themesByName[name]; +}); + +}); + +ace.define('ace/ext/themelist_utils/themes', ['require', 'exports', 'module' ], function(require, exports, module) { + +module.exports.themes = [ + "ambiance", + "chaos", + "chrome", + "clouds", + "clouds_midnight", + "cobalt", + "crimson_editor", + "dawn", + "dreamweaver", + "eclipse", + "github", + "idle_fingers", + "kr_theme", + "merbivore", + "merbivore_soft", + "monokai", + "mono_industrial", + "pastel_on_dark", + "solarized_dark", + "solarized_light", + "terminal", + "textmate", + "tomorrow", + "tomorrow_night", + "tomorrow_night_blue", + "tomorrow_night_bright", + "tomorrow_night_eighties", + "twilight", + "vibrant_ink", + "xcode" +]; + +}); \ No newline at end of file diff --git a/0.0.3_0/ace/ext-whitespace.js b/0.0.3_0/ace/ext-whitespace.js new file mode 100644 index 0000000..3ca9dae --- /dev/null +++ b/0.0.3_0/ace/ext-whitespace.js @@ -0,0 +1,204 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2010, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/ext/whitespace', ['require', 'exports', 'module' , 'ace/lib/lang'], function(require, exports, module) { + + +var lang = require("../lib/lang"); +exports.$detectIndentation = function(lines, fallback) { + var stats = []; + var changes = []; + var tabIndents = 0; + var prevSpaces = 0; + var max = Math.min(lines.length, 1000); + for (var i = 0; i < max; i++) { + var line = lines[i]; + if (!/^\s*[^*+\-\s]/.test(line)) + continue; + + var tabs = line.match(/^\t*/)[0].length; + if (line[0] == "\t") + tabIndents++; + + var spaces = line.match(/^ */)[0].length; + if (spaces && line[spaces] != "\t") { + var diff = spaces - prevSpaces; + if (diff > 0 && !(prevSpaces%diff) && !(spaces%diff)) + changes[diff] = (changes[diff] || 0) + 1; + + stats[spaces] = (stats[spaces] || 0) + 1; + } + prevSpaces = spaces; + while (line[line.length - 1] == "\\") + line = lines[i++]; + }; + + function getScore(indent) { + var score = 0; + for (var i = indent; i < stats.length; i += indent) + score += stats[i] || 0; + return score; + } + + var changesTotal = changes.reduce(function(a,b){return a+b}, 0); + + var first = {score: 0, length: 0}; + var spaceIndents = 0; + for (var i = 1; i < 12; i++) { + if (i == 1) { + spaceIndents = getScore(i); + var score = 1; + } else + var score = getScore(i) / spaceIndents; + + if (changes[i]) { + score += changes[i] / changesTotal; + } + + if (score > first.score) + first = {score: score, length: i}; + } + + if (first.score && first.score > 1.4) + var tabLength = first.length; + + if (tabIndents > spaceIndents + 1) + return {ch: "\t", length: tabLength}; + + if (spaceIndents + 1 > tabIndents) + return {ch: " ", length: tabLength}; +}; + +exports.detectIndentation = function(session) { + var lines = session.getLines(0, 1000); + var indent = exports.$detectIndentation(lines) || {}; + + if (indent.ch) + session.setUseSoftTabs(indent.ch == " "); + + if (indent.length) + session.setTabSize(indent.length); + return indent; +}; + +exports.trimTrailingSpace = function(session) { + var doc = session.getDocument(); + var lines = doc.getAllLines(); + + for (var i = 0, l=lines.length; i < l; i++) { + var line = lines[i]; + var index = line.search(/\s+$/); + + if (index !== -1) + doc.removeInLine(i, index, line.length); + } +}; + +exports.convertIndentation = function(session, ch, len) { + var oldCh = session.getTabString()[0]; + var oldLen = session.getTabSize(); + if (!len) len = oldLen; + if (!ch) ch = oldCh; + + var tab = ch == "\t" ? ch: lang.stringRepeat(ch, len); + + var doc = session.doc; + var lines = doc.getAllLines(); + + var cache = {}; + var spaceCache = {}; + for (var i = 0, l=lines.length; i < l; i++) { + var line = lines[i]; + var match = line.match(/^\s*/)[0]; + if (match) { + var w = session.$getStringScreenWidth(match)[0]; + var tabCount = Math.floor(w/oldLen); + var reminder = w%oldLen; + var toInsert = cache[tabCount] || (cache[tabCount] = lang.stringRepeat(tab, tabCount)); + toInsert += spaceCache[reminder] || (spaceCache[reminder] = lang.stringRepeat(" ", reminder)); + + if (toInsert != match) { + doc.removeInLine(i, 0, match.length); + doc.insertInLine({row: i, column: 0}, toInsert); + } + } + } + session.setTabSize(len); + session.setUseSoftTabs(ch == " "); +}; + +exports.$parseStringArg = function(text) { + var indent = {} + if (/t/.test(text)) + indent.ch = "\t"; + else if (/s/.test(text)) + indent.ch = " "; + var m = text.match(/\d+/); + if (m) + indent.length = parseInt(m[0]); + return indent; +}; + +exports.$parseArg = function(arg) { + if (!arg) + return {}; + if (typeof arg == "string") + return exports.$parseStringArg(arg); + if (typeof arg.text == "string") + return exports.$parseStringArg(arg.text); + return arg; +} + +exports.commands = [{ + name: "detectIndentation", + exec: function(editor) { + exports.detectIndentation(editor.session); + } +}, { + name: "trimTrailingSpace", + exec: function(editor) { + exports.trimTrailingSpace(editor.session); + } +}, { + name: "convertIndentation", + exec: function(editor, arg) { + var indent = exports.$parseArg(arg); + exports.convertIndentation(editor.session, arg.ch, arg.length); + } +}, { + name: "setIndentation", + exec: function(editor, arg) { + var indent = exports.$parseArg(arg); + indent.length && editor.session.setTabSize(indent.length); + indent.ch && editor.session.setUseSoftTabs(indent.ch == " "); + } +}] + +}); diff --git a/0.0.3_0/ace/keybinding-emacs.js b/0.0.3_0/ace/keybinding-emacs.js new file mode 100644 index 0000000..5494e0f --- /dev/null +++ b/0.0.3_0/ace/keybinding-emacs.js @@ -0,0 +1,1058 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2010, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/keyboard/emacs', ['require', 'exports', 'module' , 'ace/lib/dom', 'ace/incremental_search', 'ace/commands/incremental_search_commands', 'ace/keyboard/hash_handler', 'ace/lib/keys'], function(require, exports, module) { + + +var dom = require("../lib/dom"); +require("../incremental_search"); +var iSearchCommandModule = require("../commands/incremental_search_commands"); + + +var screenToTextBlockCoordinates = function(x, y) { + var canvasPos = this.scroller.getBoundingClientRect(); + + var col = Math.floor( + (x + this.scrollLeft - canvasPos.left - this.$padding) / this.characterWidth + ); + var row = Math.floor( + (y + this.scrollTop - canvasPos.top) / this.lineHeight + ); + + return this.session.screenToDocumentPosition(row, col); +}; + +var HashHandler = require("./hash_handler").HashHandler; +exports.handler = new HashHandler(); + +exports.handler.isEmacs = true; +exports.handler.$id = "ace/keyboard/emacs"; + +var initialized = false; +var $formerLongWords; +var $formerLineStart; + +exports.handler.attach = function(editor) { + if (!initialized) { + initialized = true; + dom.importCssString('\ + .emacs-mode .ace_cursor{\ + border: 2px rgba(50,250,50,0.8) solid!important;\ + -moz-box-sizing: border-box!important;\ + -webkit-box-sizing: border-box!important;\ + box-sizing: border-box!important;\ + background-color: rgba(0,250,0,0.9);\ + opacity: 0.5;\ + }\ + .emacs-mode .ace_cursor.ace_hidden{\ + opacity: 1;\ + background-color: transparent;\ + }\ + .emacs-mode .ace_overwrite-cursors .ace_cursor {\ + opacity: 1;\ + background-color: transparent;\ + border-width: 0 0 2px 2px !important;\ + }\ + .emacs-mode .ace_text-layer {\ + z-index: 4\ + }\ + .emacs-mode .ace_cursor-layer {\ + z-index: 2\ + }', 'emacsMode' + ); + } + $formerLongWords = editor.session.$selectLongWords; + editor.session.$selectLongWords = true; + $formerLineStart = editor.session.$useEmacsStyleLineStart; + editor.session.$useEmacsStyleLineStart = true; + + editor.session.$emacsMark = null; // the active mark + editor.session.$emacsMarkRing = editor.session.$emacsMarkRing || []; + + editor.emacsMark = function() { + return this.session.$emacsMark; + } + + editor.setEmacsMark = function(p) { + this.session.$emacsMark = p; + } + + editor.pushEmacsMark = function(p, activate) { + var prevMark = this.session.$emacsMark; + if (prevMark) + this.session.$emacsMarkRing.push(prevMark); + if (!p || activate) this.setEmacsMark(p) + else this.session.$emacsMarkRing.push(p); + } + + editor.popEmacsMark = function() { + var mark = this.emacsMark(); + if (mark) { this.setEmacsMark(null); return mark; } + return this.session.$emacsMarkRing.pop(); + } + + editor.getLastEmacsMark = function(p) { + return this.session.$emacsMark || this.session.$emacsMarkRing.slice(-1)[0]; + } + + editor.on("click", $resetMarkMode); + editor.on("changeSession", $kbSessionChange); + editor.renderer.screenToTextCoordinates = screenToTextBlockCoordinates; + editor.setStyle("emacs-mode"); + editor.commands.addCommands(commands); + exports.handler.platform = editor.commands.platform; + editor.$emacsModeHandler = this; + editor.addEventListener('copy', this.onCopy); + editor.addEventListener('paste', this.onPaste); +}; + +exports.handler.detach = function(editor) { + delete editor.renderer.screenToTextCoordinates; + editor.session.$selectLongWords = $formerLongWords; + editor.session.$useEmacsStyleLineStart = $formerLineStart; + editor.removeEventListener("click", $resetMarkMode); + editor.removeEventListener("changeSession", $kbSessionChange); + editor.unsetStyle("emacs-mode"); + editor.commands.removeCommands(commands); + editor.removeEventListener('copy', this.onCopy); + editor.removeEventListener('paste', this.onPaste); +}; + +var $kbSessionChange = function(e) { + if (e.oldSession) { + e.oldSession.$selectLongWords = $formerLongWords; + e.oldSession.$useEmacsStyleLineStart = $formerLineStart; + } + + $formerLongWords = e.session.$selectLongWords; + e.session.$selectLongWords = true; + $formerLineStart = e.session.$useEmacsStyleLineStart; + e.session.$useEmacsStyleLineStart = true; + + if (!e.session.hasOwnProperty('$emacsMark')) + e.session.$emacsMark = null; + if (!e.session.hasOwnProperty('$emacsMarkRing')) + e.session.$emacsMarkRing = []; +} + +var $resetMarkMode = function(e) { + e.editor.session.$emacsMark = null; +} + +var keys = require("../lib/keys").KEY_MODS, + eMods = {C: "ctrl", S: "shift", M: "alt", CMD: "command"}, + combinations = ["C-S-M-CMD", + "S-M-CMD", "C-M-CMD", "C-S-CMD", "C-S-M", + "M-CMD", "S-CMD", "S-M", "C-CMD", "C-M", "C-S", + "CMD", "M", "S", "C"]; +combinations.forEach(function(c) { + var hashId = 0; + c.split("-").forEach(function(c) { + hashId = hashId | keys[eMods[c]]; + }); + eMods[hashId] = c.toLowerCase() + "-"; +}); + +exports.handler.onCopy = function(e, editor) { + if (editor.$handlesEmacsOnCopy) return; + editor.$handlesEmacsOnCopy = true; + exports.handler.commands.killRingSave.exec(editor); + delete editor.$handlesEmacsOnCopy; +} + +exports.handler.onPaste = function(e, editor) { + editor.pushEmacsMark(editor.getCursorPosition()); +} + +exports.handler.bindKey = function(key, command) { + if (!key) + return; + + var ckb = this.commmandKeyBinding; + key.split("|").forEach(function(keyPart) { + keyPart = keyPart.toLowerCase(); + ckb[keyPart] = command; + var keyParts = keyPart.split(" ").slice(0,-1); + keyParts.reduce(function(keyMapKeys, keyPart, i) { + var prefix = keyMapKeys[i-1] ? keyMapKeys[i-1] + ' ' : ''; + return keyMapKeys.concat([prefix + keyPart]); + }, []).forEach(function(keyPart) { + if (!ckb[keyPart]) ckb[keyPart] = "null"; + }); + }, this); +} + +exports.handler.handleKeyboard = function(data, hashId, key, keyCode) { + var editor = data.editor; + if (hashId == -1) { + editor.pushEmacsMark(); + if (data.count) { + var str = Array(data.count + 1).join(key); + data.count = null; + return {command: "insertstring", args: str}; + } + } + + if (key == "\x00") return undefined; + + var modifier = eMods[hashId]; + if (modifier == "c-" || data.universalArgument) { + var prevCount = String(data.count || 0); + var count = parseInt(key[key.length - 1]); + if (typeof count === 'number' && !isNaN(count)) { + data.count = parseInt(prevCount + count); + return {command: "null"}; + } else if (data.universalArgument) { + data.count = 4; + } + } + data.universalArgument = false; + if (modifier) key = modifier + key; + if (data.keyChain) key = data.keyChain += " " + key; + var command = this.commmandKeyBinding[key]; + data.keyChain = command == "null" ? key : ""; + if (!command) return undefined; + if (command === "null") return {command: "null"}; + + if (command === "universalArgument") { + data.universalArgument = true; + return {command: "null"}; + } + var args; + if (typeof command !== "string") { + args = command.args; + if (command.command) command = command.command; + if (command === "goorselect") { + command = editor.emacsMark() ? args[1] : args[0]; + args = null; + } + } + + if (typeof command === "string") { + if (command === "insertstring" || + command === "splitline" || + command === "togglecomment") { + editor.pushEmacsMark(); + } + command = this.commands[command] || editor.commands.commands[command]; + if (!command) return undefined; + } + + if (!command.readonly && !command.isYank) + data.lastCommand = null; + + if (data.count) { + var count = data.count; + data.count = 0; + if (!command || !command.handlesCount) { + return { + args: args, + command: { + exec: function(editor, args) { + for (var i = 0; i < count; i++) + command.exec(editor, args); + } + } + }; + } else { + if (!args) args = {} + if (typeof args === 'object') args.count = count; + } + } + + return {command: command, args: args}; +}; + +exports.emacsKeys = { + "Up|C-p" : {command: "goorselect", args: ["golineup","selectup"]}, + "Down|C-n" : {command: "goorselect", args: ["golinedown","selectdown"]}, + "Left|C-b" : {command: "goorselect", args: ["gotoleft","selectleft"]}, + "Right|C-f" : {command: "goorselect", args: ["gotoright","selectright"]}, + "C-Left|M-b" : {command: "goorselect", args: ["gotowordleft","selectwordleft"]}, + "C-Right|M-f" : {command: "goorselect", args: ["gotowordright","selectwordright"]}, + "Home|C-a" : {command: "goorselect", args: ["gotolinestart","selecttolinestart"]}, + "End|C-e" : {command: "goorselect", args: ["gotolineend","selecttolineend"]}, + "C-Home|S-M-,": {command: "goorselect", args: ["gotostart","selecttostart"]}, + "C-End|S-M-." : {command: "goorselect", args: ["gotoend","selecttoend"]}, + "S-Up|S-C-p" : "selectup", + "S-Down|S-C-n" : "selectdown", + "S-Left|S-C-b" : "selectleft", + "S-Right|S-C-f" : "selectright", + "S-C-Left|S-M-b" : "selectwordleft", + "S-C-Right|S-M-f" : "selectwordright", + "S-Home|S-C-a" : "selecttolinestart", + "S-End|S-C-e" : "selecttolineend", + "S-C-Home" : "selecttostart", + "S-C-End" : "selecttoend", + + "C-l" : "recenterTopBottom", + "M-s" : "centerselection", + "M-g": "gotoline", + "C-x C-p": "selectall", + "C-Down": {command: "goorselect", args: ["gotopagedown","selectpagedown"]}, + "C-Up": {command: "goorselect", args: ["gotopageup","selectpageup"]}, + "PageDown|C-v": {command: "goorselect", args: ["gotopagedown","selectpagedown"]}, + "PageUp|M-v": {command: "goorselect", args: ["gotopageup","selectpageup"]}, + "S-C-Down": "selectpagedown", + "S-C-Up": "selectpageup", + + "C-s": "iSearch", + "C-r": "iSearchBackwards", + + "M-C-s": "findnext", + "M-C-r": "findprevious", + "S-M-5": "replace", + "Backspace": "backspace", + "Delete|C-d": "del", + "Return|C-m": {command: "insertstring", args: "\n"}, // "newline" + "C-o": "splitline", + + "M-d|C-Delete": {command: "killWord", args: "right"}, + "C-Backspace|M-Backspace|M-Delete": {command: "killWord", args: "left"}, + "C-k": "killLine", + + "C-y|S-Delete": "yank", + "M-y": "yankRotate", + "C-g": "keyboardQuit", + + "C-w": "killRegion", + "M-w": "killRingSave", + "C-Space": "setMark", + "C-x C-x": "exchangePointAndMark", + + "C-t": "transposeletters", + "M-u": "touppercase", // Doesn't work + "M-l": "tolowercase", + "M-/": "autocomplete", // Doesn't work + "C-u": "universalArgument", + + "M-;": "togglecomment", + + "C-/|C-x u|S-C--|C-z": "undo", + "S-C-/|S-C-x u|C--|S-C-z": "redo", //infinite undo? + "C-x r": "selectRectangularRegion", + "M-x": {command: "focusCommandLine", args: "M-x "} +}; + + +exports.handler.bindKeys(exports.emacsKeys); + +exports.handler.addCommands({ + recenterTopBottom: function(editor) { + var renderer = editor.renderer; + var pos = renderer.$cursorLayer.getPixelPosition(); + var h = renderer.$size.scrollerHeight - renderer.lineHeight; + var scrollTop = renderer.scrollTop; + if (Math.abs(pos.top - scrollTop) < 2) { + scrollTop = pos.top - h; + } else if (Math.abs(pos.top - scrollTop - h * 0.5) < 2) { + scrollTop = pos.top; + } else { + scrollTop = pos.top - h * 0.5; + } + editor.session.setScrollTop(scrollTop); + }, + selectRectangularRegion: function(editor) { + editor.multiSelect.toggleBlockSelection(); + }, + setMark: { + exec: function(editor, args) { + if (args && args.count) { + var mark = editor.popEmacsMark(); + mark && editor.selection.moveCursorToPosition(mark); + return; + } + + var mark = editor.emacsMark(), + transientMarkModeActive = true; + if (transientMarkModeActive && (mark || !editor.selection.isEmpty())) { + editor.pushEmacsMark(); + editor.clearSelection(); + return; + } + + if (mark) { + var cp = editor.getCursorPosition(); + if (editor.selection.isEmpty() && + mark.row == cp.row && mark.column == cp.column) { + editor.pushEmacsMark(); + return; + } + } + mark = editor.getCursorPosition(); + editor.setEmacsMark(mark); + editor.selection.setSelectionAnchor(mark.row, mark.column); + }, + readonly: true, + handlesCount: true, + multiSelectAction: "forEach" + }, + exchangePointAndMark: { + exec: function(editor, args) { + var sel = editor.selection; + if (args.count) { + var pos = editor.getCursorPosition(); + sel.clearSelection(); + sel.moveCursorToPosition(editor.popEmacsMark()); + editor.pushEmacsMark(pos); + return; + } + var lastMark = editor.getLastEmacsMark(); + var range = sel.getRange(); + if (range.isEmpty()) { + sel.selectToPosition(lastMark); + return; + } + sel.setSelectionRange(range, !sel.isBackwards()); + }, + readonly: true, + handlesCount: true, + multiSelectAction: "forEach" + }, + killWord: { + exec: function(editor, dir) { + editor.clearSelection(); + if (dir == "left") + editor.selection.selectWordLeft(); + else + editor.selection.selectWordRight(); + + var range = editor.getSelectionRange(); + var text = editor.session.getTextRange(range); + exports.killRing.add(text); + + editor.session.remove(range); + editor.clearSelection(); + }, + multiSelectAction: "forEach" + }, + killLine: function(editor) { + editor.pushEmacsMark(null); + var pos = editor.getCursorPosition(); + if (pos.column == 0 && + editor.session.doc.getLine(pos.row).length == 0) { + editor.selection.selectLine(); + } else { + editor.clearSelection(); + editor.selection.selectLineEnd(); + } + var range = editor.getSelectionRange(); + var text = editor.session.getTextRange(range); + exports.killRing.add(text); + + editor.session.remove(range); + editor.clearSelection(); + }, + yank: function(editor) { + editor.onPaste(exports.killRing.get() || ''); + editor.keyBinding.$data.lastCommand = "yank"; + }, + yankRotate: function(editor) { + if (editor.keyBinding.$data.lastCommand != "yank") + return; + editor.undo(); + editor.onPaste(exports.killRing.rotate()); + editor.keyBinding.$data.lastCommand = "yank"; + }, + killRegion: { + exec: function(editor) { + exports.killRing.add(editor.getCopyText()); + editor.commands.byName.cut.exec(editor); + }, + readonly: true, + multiSelectAction: "forEach" + }, + killRingSave: { + exec: function(editor) { + exports.killRing.add(editor.getCopyText()); + setTimeout(function() { + var sel = editor.selection, + range = sel.getRange(); + editor.pushEmacsMark(sel.isBackwards() ? range.end : range.start); + sel.clearSelection(); + }, 0); + }, + readonly: true + }, + keyboardQuit: function(editor) { + editor.selection.clearSelection(); + editor.setEmacsMark(null); + }, + focusCommandLine: function(editor, arg) { + if (editor.showCommandLine) + editor.showCommandLine(arg); + } +}); + +exports.handler.addCommands(iSearchCommandModule.iSearchStartCommands); + +var commands = exports.handler.commands; +commands.yank.isYank = true; +commands.yankRotate.isYank = true; + +exports.killRing = { + $data: [], + add: function(str) { + str && this.$data.push(str); + if (this.$data.length > 30) + this.$data.shift(); + }, + get: function(n) { + n = n || 1; + return this.$data.slice(this.$data.length-n, this.$data.length).reverse().join('\n'); + }, + pop: function() { + if (this.$data.length > 1) + this.$data.pop(); + return this.get(); + }, + rotate: function() { + this.$data.unshift(this.$data.pop()); + return this.get(); + } +}; + +}); + +ace.define('ace/incremental_search', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/search', 'ace/search_highlight', 'ace/commands/incremental_search_commands', 'ace/lib/dom', 'ace/commands/command_manager', 'ace/editor', 'ace/config'], function(require, exports, module) { + + +var oop = require("./lib/oop"); +var Range = require("./range").Range; +var Search = require("./search").Search; +var SearchHighlight = require("./search_highlight").SearchHighlight; +var iSearchCommandModule = require("./commands/incremental_search_commands"); +var ISearchKbd = iSearchCommandModule.IncrementalSearchKeyboardHandler; +function IncrementalSearch() { + this.$options = {wrap: false, skipCurrent: false}; + this.$keyboardHandler = new ISearchKbd(this); +} + +oop.inherits(IncrementalSearch, Search); + +;(function() { + + this.activate = function(ed, backwards) { + this.$editor = ed; + this.$startPos = this.$currentPos = ed.getCursorPosition(); + this.$options.needle = ''; + this.$options.backwards = backwards; + ed.keyBinding.addKeyboardHandler(this.$keyboardHandler); + this.$mousedownHandler = ed.addEventListener('mousedown', this.onMouseDown.bind(this)); + this.selectionFix(ed); + this.statusMessage(true); + } + + this.deactivate = function(reset) { + this.cancelSearch(reset); + this.$editor.keyBinding.removeKeyboardHandler(this.$keyboardHandler); + if (this.$mousedownHandler) { + this.$editor.removeEventListener('mousedown', this.$mousedownHandler); + delete this.$mousedownHandler; + } + this.message(''); + } + + this.selectionFix = function(editor) { + if (editor.selection.isEmpty() && !editor.session.$emacsMark) { + editor.clearSelection(); + } + } + + this.highlight = function(regexp) { + var sess = this.$editor.session, + hl = sess.$isearchHighlight = sess.$isearchHighlight || sess.addDynamicMarker( + new SearchHighlight(null, "ace_isearch-result", "text")); + hl.setRegexp(regexp); + sess._emit("changeBackMarker"); // force highlight layer redraw + } + + this.cancelSearch = function(reset) { + var e = this.$editor; + this.$prevNeedle = this.$options.needle; + this.$options.needle = ''; + if (reset) { + e.moveCursorToPosition(this.$startPos); + this.$currentPos = this.$startPos; + } else { + e.pushEmacsMark && e.pushEmacsMark(this.$startPos, false); + } + this.highlight(null); + return Range.fromPoints(this.$currentPos, this.$currentPos); + } + + this.highlightAndFindWithNeedle = function(moveToNext, needleUpdateFunc) { + if (!this.$editor) return null; + var options = this.$options; + if (needleUpdateFunc) { + options.needle = needleUpdateFunc.call(this, options.needle || '') || ''; + } + if (options.needle.length === 0) { + this.statusMessage(true); + return this.cancelSearch(true); + }; + options.start = this.$currentPos; + var session = this.$editor.session, + found = this.find(session); + if (found) { + if (options.backwards) found = Range.fromPoints(found.end, found.start); + this.$editor.moveCursorToPosition(found.end); + if (moveToNext) this.$currentPos = found.end; + this.highlight(options.re) + } + + this.statusMessage(found); + + return found; + } + + this.addChar = function(c) { + return this.highlightAndFindWithNeedle(false, function(needle) { + return needle + c; + }); + } + + this.removeChar = function(c) { + return this.highlightAndFindWithNeedle(false, function(needle) { + return needle.length > 0 ? needle.substring(0, needle.length-1) : needle; + }); + } + + this.next = function(options) { + options = options || {}; + this.$options.backwards = !!options.backwards; + this.$currentPos = this.$editor.getCursorPosition(); + return this.highlightAndFindWithNeedle(true, function(needle) { + return options.useCurrentOrPrevSearch && needle.length === 0 ? + this.$prevNeedle || '' : needle; + }); + } + + this.onMouseDown = function(evt) { + this.deactivate(); + return true; + } + + this.statusMessage = function(found) { + var options = this.$options, msg = ''; + msg += options.backwards ? 'reverse-' : ''; + msg += 'isearch: ' + options.needle; + msg += found ? '' : ' (not found)'; + this.message(msg); + } + + this.message = function(msg) { + if (this.$editor.showCommandLine) { + this.$editor.showCommandLine(msg); + this.$editor.focus(); + } else { + console.log(msg); + } + } + +}).call(IncrementalSearch.prototype); + + +exports.IncrementalSearch = IncrementalSearch; + +var dom = require('./lib/dom'); +dom.importCssString && dom.importCssString("\ +.ace_marker-layer .ace_isearch-result {\ + position: absolute;\ + z-index: 6;\ + -moz-box-sizing: border-box;\ + -webkit-box-sizing: border-box;\ + box-sizing: border-box;\ +}\ +div.ace_isearch-result {\ + border-radius: 4px;\ + background-color: rgba(255, 200, 0, 0.5);\ + box-shadow: 0 0 4px rgb(255, 200, 0);\ +}\ +.ace_dark div.ace_isearch-result {\ + background-color: rgb(100, 110, 160);\ + box-shadow: 0 0 4px rgb(80, 90, 140);\ +}", "incremental-search-highlighting"); +var commands = require("./commands/command_manager"); +(function() { + this.setupIncrementalSearch = function(editor, val) { + if (this.usesIncrementalSearch == val) return; + this.usesIncrementalSearch = val; + var iSearchCommands = iSearchCommandModule.iSearchStartCommands; + var method = val ? 'addCommands' : 'removeCommands'; + this[method](iSearchCommands); + }; +}).call(commands.CommandManager.prototype); +var Editor = require("./editor").Editor; +require("./config").defineOptions(Editor.prototype, "editor", { + useIncrementalSearch: { + set: function(val) { + this.keyBinding.$handlers.forEach(function(handler) { + if (handler.setupIncrementalSearch) { + handler.setupIncrementalSearch(this, val); + } + }); + this._emit('incrementalSearchSettingChanged', {isEnabled: val}); + } + } +}); + +}); + +ace.define('ace/commands/incremental_search_commands', ['require', 'exports', 'module' , 'ace/config', 'ace/lib/oop', 'ace/keyboard/hash_handler', 'ace/commands/occur_commands'], function(require, exports, module) { + +var config = require("../config"); +var oop = require("../lib/oop"); +var HashHandler = require("../keyboard/hash_handler").HashHandler; +var occurStartCommand = require("./occur_commands").occurStartCommand; +exports.iSearchStartCommands = [{ + name: "iSearch", + bindKey: {win: "Ctrl-F", mac: "Command-F"}, + exec: function(editor, options) { + config.loadModule(["core", "ace/incremental_search"], function(e) { + var iSearch = e.iSearch = e.iSearch || new e.IncrementalSearch(); + iSearch.activate(editor, options.backwards); + if (options.jumpToFirstMatch) iSearch.next(options); + }); + }, + readOnly: true +}, { + name: "iSearchBackwards", + exec: function(editor, jumpToNext) { editor.execCommand('iSearch', {backwards: true}); }, + readOnly: true +}, { + name: "iSearchAndGo", + bindKey: {win: "Ctrl-K", mac: "Command-G"}, + exec: function(editor, jumpToNext) { editor.execCommand('iSearch', {jumpToFirstMatch: true, useCurrentOrPrevSearch: true}); }, + readOnly: true +}, { + name: "iSearchBackwardsAndGo", + bindKey: {win: "Ctrl-Shift-K", mac: "Command-Shift-G"}, + exec: function(editor) { editor.execCommand('iSearch', {jumpToFirstMatch: true, backwards: true, useCurrentOrPrevSearch: true}); }, + readOnly: true +}]; +exports.iSearchCommands = [{ + name: "restartSearch", + bindKey: {win: "Ctrl-F", mac: "Command-F"}, + exec: function(iSearch) { + iSearch.cancelSearch(true); + }, + readOnly: true, + isIncrementalSearchCommand: true +}, { + name: "searchForward", + bindKey: {win: "Ctrl-S|Ctrl-K", mac: "Ctrl-S|Command-G"}, + exec: function(iSearch, options) { + options.useCurrentOrPrevSearch = true; + iSearch.next(options); + }, + readOnly: true, + isIncrementalSearchCommand: true +}, { + name: "searchBackward", + bindKey: {win: "Ctrl-R|Ctrl-Shift-K", mac: "Ctrl-R|Command-Shift-G"}, + exec: function(iSearch, options) { + options.useCurrentOrPrevSearch = true; + options.backwards = true; + iSearch.next(options); + }, + readOnly: true, + isIncrementalSearchCommand: true +}, { + name: "extendSearchTerm", + exec: function(iSearch, string) { + iSearch.addChar(string); + }, + readOnly: true, + isIncrementalSearchCommand: true +}, { + name: "extendSearchTermSpace", + bindKey: "space", + exec: function(iSearch) { iSearch.addChar(' '); }, + readOnly: true, + isIncrementalSearchCommand: true +}, { + name: "shrinkSearchTerm", + bindKey: "backspace", + exec: function(iSearch) { + iSearch.removeChar(); + }, + readOnly: true, + isIncrementalSearchCommand: true +}, { + name: 'confirmSearch', + bindKey: 'return', + exec: function(iSearch) { iSearch.deactivate(); }, + readOnly: true, + isIncrementalSearchCommand: true +}, { + name: 'cancelSearch', + bindKey: 'esc|Ctrl-G', + exec: function(iSearch) { iSearch.deactivate(true); }, + readOnly: true, + isIncrementalSearchCommand: true +}, { + name: 'occurisearch', + bindKey: 'Ctrl-O', + exec: function(iSearch) { + var options = oop.mixin({}, iSearch.$options); + iSearch.deactivate(); + occurStartCommand.exec(iSearch.$editor, options); + }, + readOnly: true, + isIncrementalSearchCommand: true +}]; + +function IncrementalSearchKeyboardHandler(iSearch) { + this.$iSearch = iSearch; +} + +oop.inherits(IncrementalSearchKeyboardHandler, HashHandler); + +;(function() { + + this.attach = function(editor) { + var iSearch = this.$iSearch; + HashHandler.call(this, exports.iSearchCommands, editor.commands.platform); + this.$commandExecHandler = editor.commands.addEventListener('exec', function(e) { + if (!e.command.isIncrementalSearchCommand) return undefined; + e.stopPropagation(); + e.preventDefault(); + return e.command.exec(iSearch, e.args || {}); + }); + } + + this.detach = function(editor) { + if (!this.$commandExecHandler) return; + editor.commands.removeEventListener('exec', this.$commandExecHandler); + delete this.$commandExecHandler; + } + + var handleKeyboard$super = this.handleKeyboard; + this.handleKeyboard = function(data, hashId, key, keyCode) { + var cmd = handleKeyboard$super.call(this, data, hashId, key, keyCode); + if (cmd.command) { return cmd; } + if (hashId == -1) { + var extendCmd = this.commands.extendSearchTerm; + if (extendCmd) { return {command: extendCmd, args: key}; } + } + return {command: "null", passEvent: hashId == 0 || hashId == 4}; + } + +}).call(IncrementalSearchKeyboardHandler.prototype); + + +exports.IncrementalSearchKeyboardHandler = IncrementalSearchKeyboardHandler; + +}); + +ace.define('ace/commands/occur_commands', ['require', 'exports', 'module' , 'ace/config', 'ace/occur', 'ace/keyboard/hash_handler', 'ace/lib/oop'], function(require, exports, module) { + +var config = require("../config"), + Occur = require("../occur").Occur; +var occurStartCommand = { + name: "occur", + exec: function(editor, options) { + var alreadyInOccur = !!editor.session.$occur; + var occurSessionActive = new Occur().enter(editor, options); + if (occurSessionActive && !alreadyInOccur) + OccurKeyboardHandler.installIn(editor); + }, + readOnly: true +}; + +var occurCommands = [{ + name: "occurexit", + bindKey: 'esc|Ctrl-G', + exec: function(editor) { + var occur = editor.session.$occur; + if (!occur) return; + occur.exit(editor, {}); + if (!editor.session.$occur) OccurKeyboardHandler.uninstallFrom(editor); + }, + readOnly: true +}, { + name: "occuraccept", + bindKey: 'enter', + exec: function(editor) { + var occur = editor.session.$occur; + if (!occur) return; + occur.exit(editor, {translatePosition: true}); + if (!editor.session.$occur) OccurKeyboardHandler.uninstallFrom(editor); + }, + readOnly: true +}]; + +var HashHandler = require("../keyboard/hash_handler").HashHandler; +var oop = require("../lib/oop"); + + +function OccurKeyboardHandler() {} + +oop.inherits(OccurKeyboardHandler, HashHandler); + +;(function() { + + this.isOccurHandler = true; + + this.attach = function(editor) { + HashHandler.call(this, occurCommands, editor.commands.platform); + this.$editor = editor; + } + + var handleKeyboard$super = this.handleKeyboard; + this.handleKeyboard = function(data, hashId, key, keyCode) { + var cmd = handleKeyboard$super.call(this, data, hashId, key, keyCode); + return (cmd && cmd.command) ? cmd : undefined; + } + +}).call(OccurKeyboardHandler.prototype); + +OccurKeyboardHandler.installIn = function(editor) { + var handler = new this(); + editor.keyBinding.addKeyboardHandler(handler); + editor.commands.addCommands(occurCommands); +} + +OccurKeyboardHandler.uninstallFrom = function(editor) { + editor.commands.removeCommands(occurCommands); + var handler = editor.getKeyboardHandler(); + if (handler.isOccurHandler) + editor.keyBinding.removeKeyboardHandler(handler); +} + +exports.occurStartCommand = occurStartCommand; + +}); + +ace.define('ace/occur', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/search', 'ace/edit_session', 'ace/search_highlight', 'ace/lib/dom'], function(require, exports, module) { + + +var oop = require("./lib/oop"); +var Range = require("./range").Range; +var Search = require("./search").Search; +var EditSession = require("./edit_session").EditSession; +var SearchHighlight = require("./search_highlight").SearchHighlight; +function Occur() {} + +oop.inherits(Occur, Search); + +(function() { + this.enter = function(editor, options) { + if (!options.needle) return false; + var pos = editor.getCursorPosition(); + this.displayOccurContent(editor, options); + var translatedPos = this.originalToOccurPosition(editor.session, pos); + editor.moveCursorToPosition(translatedPos); + return true; + } + this.exit = function(editor, options) { + var pos = options.translatePosition && editor.getCursorPosition(); + var translatedPos = pos && this.occurToOriginalPosition(editor.session, pos); + this.displayOriginalContent(editor); + if (translatedPos) + editor.moveCursorToPosition(translatedPos); + return true; + } + + this.highlight = function(sess, regexp) { + var hl = sess.$occurHighlight = sess.$occurHighlight || sess.addDynamicMarker( + new SearchHighlight(null, "ace_occur-highlight", "text")); + hl.setRegexp(regexp); + sess._emit("changeBackMarker"); // force highlight layer redraw + } + + this.displayOccurContent = function(editor, options) { + this.$originalSession = editor.session; + var found = this.matchingLines(editor.session, options); + var lines = found.map(function(foundLine) { return foundLine.content; }); + var occurSession = new EditSession(lines.join('\n')); + occurSession.$occur = this; + occurSession.$occurMatchingLines = found; + editor.setSession(occurSession); + this.highlight(occurSession, options.re); + occurSession._emit('changeBackMarker'); + } + + this.displayOriginalContent = function(editor) { + editor.setSession(this.$originalSession); + } + this.originalToOccurPosition = function(session, pos) { + var lines = session.$occurMatchingLines; + var nullPos = {row: 0, column: 0}; + if (!lines) return nullPos; + for (var i = 0; i < lines.length; i++) { + if (lines[i].row === pos.row) + return {row: i, column: pos.column}; + } + return nullPos; + } + this.occurToOriginalPosition = function(session, pos) { + var lines = session.$occurMatchingLines; + if (!lines || !lines[pos.row]) + return pos; + return {row: lines[pos.row].row, column: pos.column}; + } + + this.matchingLines = function(session, options) { + options = oop.mixin({}, options); + if (!session || !options.needle) return []; + var search = new Search(); + search.set(options); + return search.findAll(session).reduce(function(lines, range) { + var row = range.start.row; + var last = lines[lines.length-1]; + return last && last.row === row ? + lines : + lines.concat({row: row, content: session.getLine(row)}); + }, []); + } + +}).call(Occur.prototype); + +var dom = require('./lib/dom'); +dom.importCssString(".ace_occur-highlight {\n\ + border-radius: 4px;\n\ + background-color: rgba(87, 255, 8, 0.25);\n\ + position: absolute;\n\ + z-index: 4;\n\ + -moz-box-sizing: border-box;\n\ + -webkit-box-sizing: border-box;\n\ + box-sizing: border-box;\n\ + box-shadow: 0 0 4px rgb(91, 255, 50);\n\ +}\n\ +.ace_dark .ace_occur-highlight {\n\ + background-color: rgb(80, 140, 85);\n\ + box-shadow: 0 0 4px rgb(60, 120, 70);\n\ +}\n", "incremental-occur-highlighting"); + +exports.Occur = Occur; + +}); diff --git a/0.0.3_0/ace/keybinding-vim.js b/0.0.3_0/ace/keybinding-vim.js new file mode 100644 index 0000000..fac31d1 --- /dev/null +++ b/0.0.3_0/ace/keybinding-vim.js @@ -0,0 +1,1712 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2010, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/keyboard/vim', ['require', 'exports', 'module' , 'ace/keyboard/vim/commands', 'ace/keyboard/vim/maps/util', 'ace/lib/useragent'], function(require, exports, module) { + + +var cmds = require("./vim/commands"); +var coreCommands = cmds.coreCommands; +var util = require("./vim/maps/util"); +var useragent = require("../lib/useragent"); + +var startCommands = { + "i": { + command: coreCommands.start + }, + "I": { + command: coreCommands.startBeginning + }, + "a": { + command: coreCommands.append + }, + "A": { + command: coreCommands.appendEnd + }, + "ctrl-f": { + command: "gotopagedown" + }, + "ctrl-b": { + command: "gotopageup" + } +}; + +exports.handler = { + $id: "ace/keyboard/vim", + handleMacRepeat: function(data, hashId, key) { + if (hashId == -1) { + data.inputChar = key; + data.lastEvent = "input"; + } else if (data.inputChar && data.$lastHash == hashId && data.$lastKey == key) { + if (data.lastEvent == "input") { + data.lastEvent = "input1"; + } else if (data.lastEvent == "input1") { + return true; + } + } else { + data.$lastHash = hashId; + data.$lastKey = key; + data.lastEvent = "keypress"; + } + }, + + handleKeyboard: function(data, hashId, key, keyCode, e) { + if (hashId != 0 && (key == "" || key == "\x00")) + return null; + + var editor = data.editor; + + if (hashId == 1) + key = "ctrl-" + key; + if (key == "ctrl-c") { + if (!useragent.isMac && editor.getCopyText()) { + editor.once("copy", function() { + if (data.state == "start") + coreCommands.stop.exec(editor); + else + editor.selection.clearSelection(); + }); + return {command: "null", passEvent: true}; + } + return {command: coreCommands.stop}; + } else if ((key == "esc" && hashId == 0) || key == "ctrl-[") { + return {command: coreCommands.stop}; + } else if (data.state == "start") { + if (useragent.isMac && this.handleMacRepeat(data, hashId, key)) { + hashId = -1; + key = data.inputChar; + } + + if (hashId == -1 || hashId == 1 || hashId == 0 && key.length > 1) { + if (cmds.inputBuffer.idle && startCommands[key]) + return startCommands[key]; + cmds.inputBuffer.push(editor, key); + return {command: "null", passEvent: false}; + } // if no modifier || shift: wait for input. + else if (key.length == 1 && (hashId == 0 || hashId == 4)) { + return {command: "null", passEvent: true}; + } else if (key == "esc" && hashId == 0) { + return {command: coreCommands.stop}; + } + } else { + if (key == "ctrl-w") { + return {command: "removewordleft"}; + } + } + }, + + attach: function(editor) { + editor.on("click", exports.onCursorMove); + if (util.currentMode !== "insert") + cmds.coreCommands.stop.exec(editor); + editor.$vimModeHandler = this; + }, + + detach: function(editor) { + editor.removeListener("click", exports.onCursorMove); + util.noMode(editor); + util.currentMode = "normal"; + }, + + actions: cmds.actions, + getStatusText: function() { + if (util.currentMode == "insert") + return "INSERT"; + if (util.onVisualMode) + return (util.onVisualLineMode ? "VISUAL LINE " : "VISUAL ") + cmds.inputBuffer.status; + return cmds.inputBuffer.status; + } +}; + + +exports.onCursorMove = function(e) { + cmds.onCursorMove(e.editor, e); + exports.onCursorMove.scheduled = false; +}; + +}); + +ace.define('ace/keyboard/vim/commands', ['require', 'exports', 'module' , 'ace/lib/lang', 'ace/keyboard/vim/maps/util', 'ace/keyboard/vim/maps/motions', 'ace/keyboard/vim/maps/operators', 'ace/keyboard/vim/maps/aliases', 'ace/keyboard/vim/registers'], function(require, exports, module) { + +"never use strict"; + +var lang = require("../../lib/lang"); +var util = require("./maps/util"); +var motions = require("./maps/motions"); +var operators = require("./maps/operators"); +var alias = require("./maps/aliases"); +var registers = require("./registers"); + +var NUMBER = 1; +var OPERATOR = 2; +var MOTION = 3; +var ACTION = 4; +var HMARGIN = 8; // Minimum amount of line separation between margins; + +var repeat = function repeat(fn, count, args) { + while (0 < count--) + fn.apply(this, args); +}; + +var ensureScrollMargin = function(editor) { + var renderer = editor.renderer; + var pos = renderer.$cursorLayer.getPixelPosition(); + + var top = pos.top; + + var margin = HMARGIN * renderer.layerConfig.lineHeight; + if (2 * margin > renderer.$size.scrollerHeight) + margin = renderer.$size.scrollerHeight / 2; + + if (renderer.scrollTop > top - margin) { + renderer.session.setScrollTop(top - margin); + } + + if (renderer.scrollTop + renderer.$size.scrollerHeight < top + margin + renderer.lineHeight) { + renderer.session.setScrollTop(top + margin + renderer.lineHeight - renderer.$size.scrollerHeight); + } +}; + +var actions = exports.actions = { + "z": { + param: true, + fn: function(editor, range, count, param) { + switch (param) { + case "z": + editor.renderer.alignCursor(null, 0.5); + break; + case "t": + editor.renderer.alignCursor(null, 0); + break; + case "b": + editor.renderer.alignCursor(null, 1); + break; + } + } + }, + "r": { + param: true, + fn: function(editor, range, count, param) { + if (param && param.length) { + if (param.length > 1) + param = param == "return" ? "\n" : param == "tab" ? "\t" : param; + repeat(function() { editor.insert(param); }, count || 1); + editor.navigateLeft(); + } + } + }, + "R": { + fn: function(editor, range, count, param) { + util.insertMode(editor); + editor.setOverwrite(true); + } + }, + "~": { + fn: function(editor, range, count) { + repeat(function() { + var range = editor.selection.getRange(); + if (range.isEmpty()) + range.end.column++; + var text = editor.session.getTextRange(range); + var toggled = text.toUpperCase(); + if (toggled == text) + editor.navigateRight(); + else + editor.session.replace(range, toggled); + }, count || 1); + } + }, + "*": { + fn: function(editor, range, count, param) { + editor.selection.selectWord(); + editor.findNext(); + ensureScrollMargin(editor); + var r = editor.selection.getRange(); + editor.selection.setSelectionRange(r, true); + } + }, + "#": { + fn: function(editor, range, count, param) { + editor.selection.selectWord(); + editor.findPrevious(); + ensureScrollMargin(editor); + var r = editor.selection.getRange(); + editor.selection.setSelectionRange(r, true); + } + }, + "m": { + param: true, + fn: function(editor, range, count, param) { + var s = editor.session; + var markers = s.vimMarkers || (s.vimMarkers = {}); + var c = editor.getCursorPosition(); + if (!markers[param]) { + markers[param] = editor.session.doc.createAnchor(c); + } + markers[param].setPosition(c.row, c.column, true); + } + }, + "n": { + fn: function(editor, range, count, param) { + var options = editor.getLastSearchOptions(); + options.backwards = false; + + editor.selection.moveCursorRight(); + editor.selection.clearSelection(); + editor.findNext(options); + + ensureScrollMargin(editor); + var r = editor.selection.getRange(); + r.end.row = r.start.row; + r.end.column = r.start.column; + editor.selection.setSelectionRange(r, true); + } + }, + "N": { + fn: function(editor, range, count, param) { + var options = editor.getLastSearchOptions(); + options.backwards = true; + + editor.findPrevious(options); + ensureScrollMargin(editor); + var r = editor.selection.getRange(); + r.end.row = r.start.row; + r.end.column = r.start.column; + editor.selection.setSelectionRange(r, true); + } + }, + "v": { + fn: function(editor, range, count, param) { + editor.selection.selectRight(); + util.visualMode(editor, false); + }, + acceptsMotion: true + }, + "V": { + fn: function(editor, range, count, param) { + var row = editor.getCursorPosition().row; + editor.selection.clearSelection(); + editor.selection.moveCursorTo(row, 0); + editor.selection.selectLineEnd(); + editor.selection.visualLineStart = row; + + util.visualMode(editor, true); + }, + acceptsMotion: true + }, + "Y": { + fn: function(editor, range, count, param) { + util.copyLine(editor); + } + }, + "p": { + fn: function(editor, range, count, param) { + var defaultReg = registers._default; + + editor.setOverwrite(false); + if (defaultReg.isLine) { + var pos = editor.getCursorPosition(); + pos.column = editor.session.getLine(pos.row).length; + var text = lang.stringRepeat("\n" + defaultReg.text, count || 1); + editor.session.insert(pos, text); + editor.moveCursorTo(pos.row + 1, 0); + } + else { + editor.navigateRight(); + editor.insert(lang.stringRepeat(defaultReg.text, count || 1)); + editor.navigateLeft(); + } + editor.setOverwrite(true); + editor.selection.clearSelection(); + } + }, + "P": { + fn: function(editor, range, count, param) { + var defaultReg = registers._default; + editor.setOverwrite(false); + + if (defaultReg.isLine) { + var pos = editor.getCursorPosition(); + pos.column = 0; + var text = lang.stringRepeat(defaultReg.text + "\n", count || 1); + editor.session.insert(pos, text); + editor.moveCursorToPosition(pos); + } + else { + editor.insert(lang.stringRepeat(defaultReg.text, count || 1)); + } + editor.setOverwrite(true); + editor.selection.clearSelection(); + } + }, + "J": { + fn: function(editor, range, count, param) { + var session = editor.session; + range = editor.getSelectionRange(); + var pos = {row: range.start.row, column: range.start.column}; + count = count || range.end.row - range.start.row; + var maxRow = Math.min(pos.row + (count || 1), session.getLength() - 1); + + range.start.column = session.getLine(pos.row).length; + range.end.column = session.getLine(maxRow).length; + range.end.row = maxRow; + + var text = ""; + for (var i = pos.row; i < maxRow; i++) { + var nextLine = session.getLine(i + 1); + text += " " + /^\s*(.*)$/.exec(nextLine)[1] || ""; + } + + session.replace(range, text); + editor.moveCursorTo(pos.row, pos.column); + } + }, + "u": { + fn: function(editor, range, count, param) { + count = parseInt(count || 1, 10); + for (var i = 0; i < count; i++) { + editor.undo(); + } + editor.selection.clearSelection(); + } + }, + "ctrl-r": { + fn: function(editor, range, count, param) { + count = parseInt(count || 1, 10); + for (var i = 0; i < count; i++) { + editor.redo(); + } + editor.selection.clearSelection(); + } + }, + ":": { + fn: function(editor, range, count, param) { + var val = ":"; + if (count > 1) + val = ".,.+" + count + val; + if (editor.showCommandLine) + editor.showCommandLine(val); + } + }, + "/": { + fn: function(editor, range, count, param) { + if (editor.showCommandLine) + editor.showCommandLine("/"); + } + }, + "?": { + fn: function(editor, range, count, param) { + if (editor.showCommandLine) + editor.showCommandLine("?"); + } + }, + ".": { + fn: function(editor, range, count, param) { + util.onInsertReplaySequence = inputBuffer.lastInsertCommands; + var previous = inputBuffer.previous; + if (previous) // If there is a previous action + inputBuffer.exec(editor, previous.action, previous.param); + } + }, + "ctrl-x": { + fn: function(editor, range, count, param) { + editor.modifyNumber(-(count || 1)); + } + }, + "ctrl-a": { + fn: function(editor, range, count, param) { + editor.modifyNumber(count || 1); + } + } +}; + +var inputBuffer = exports.inputBuffer = { + accepting: [NUMBER, OPERATOR, MOTION, ACTION], + currentCmd: null, + currentCount: "", + status: "", + operator: null, + motion: null, + + lastInsertCommands: [], + + push: function(editor, ch, keyId) { + var status = this.status; + var isKeyHandled = true; + this.idle = false; + var wObj = this.waitingForParam; + if (/^numpad\d+$/i.test(ch)) + ch = ch.substr(6); + + if (wObj) { + this.exec(editor, wObj, ch); + } + else if (!(ch === "0" && !this.currentCount.length) && + (/^\d+$/.test(ch) && this.isAccepting(NUMBER))) { + this.currentCount += ch; + this.currentCmd = NUMBER; + this.accepting = [NUMBER, OPERATOR, MOTION, ACTION]; + } + else if (!this.operator && this.isAccepting(OPERATOR) && operators[ch]) { + this.operator = { + ch: ch, + count: this.getCount() + }; + this.currentCmd = OPERATOR; + this.accepting = [NUMBER, MOTION, ACTION]; + this.exec(editor, { operator: this.operator }); + } + else if (motions[ch] && this.isAccepting(MOTION)) { + this.currentCmd = MOTION; + + var ctx = { + operator: this.operator, + motion: { + ch: ch, + count: this.getCount() + } + }; + + if (motions[ch].param) + this.waitForParam(ctx); + else + this.exec(editor, ctx); + } + else if (alias[ch] && this.isAccepting(MOTION)) { + alias[ch].operator.count = this.getCount(); + this.exec(editor, alias[ch]); + } + else if (actions[ch] && this.isAccepting(ACTION)) { + var actionObj = { + action: { + fn: actions[ch].fn, + count: this.getCount() + } + }; + + if (actions[ch].param) { + this.waitForParam(actionObj); + } + else { + this.exec(editor, actionObj); + } + + if (actions[ch].acceptsMotion) + this.idle = false; + } + else if (this.operator) { + this.operator.count = this.getCount(); + this.exec(editor, { operator: this.operator }, ch); + } + else { + isKeyHandled = ch.length == 1; + this.reset(); + } + + if (this.waitingForParam || this.motion || this.operator) { + this.status += ch; + } else if (this.currentCount) { + this.status = this.currentCount; + } else if (this.status) { + this.status = ""; + } + if (this.status != status) + editor._emit("changeStatus"); + return isKeyHandled; + }, + + waitForParam: function(cmd) { + this.waitingForParam = cmd; + }, + + getCount: function() { + var count = this.currentCount; + this.currentCount = ""; + return count && parseInt(count, 10); + }, + + exec: function(editor, action, param) { + var m = action.motion; + var o = action.operator; + var a = action.action; + + if (!param) + param = action.param; + + if (o) { + this.previous = { + action: action, + param: param + }; + } + + if (o && !editor.selection.isEmpty()) { + if (operators[o.ch].selFn) { + operators[o.ch].selFn(editor, editor.getSelectionRange(), o.count, param); + this.reset(); + } + return; + } + else if (!m && !a && o && param) { + operators[o.ch].fn(editor, null, o.count, param); + this.reset(); + } + else if (m) { + var run = function(fn) { + if (fn && typeof fn === "function") { // There should always be a motion + if (m.count && !motionObj.handlesCount) + repeat(fn, m.count, [editor, null, m.count, param]); + else + fn(editor, null, m.count, param); + } + }; + + var motionObj = motions[m.ch]; + var selectable = motionObj.sel; + + if (!o) { + if ((util.onVisualMode || util.onVisualLineMode) && selectable) + run(motionObj.sel); + else + run(motionObj.nav); + } + else if (selectable) { + repeat(function() { + run(motionObj.sel); + operators[o.ch].fn(editor, editor.getSelectionRange(), o.count, param); + }, o.count || 1); + } + this.reset(); + } + else if (a) { + a.fn(editor, editor.getSelectionRange(), a.count, param); + this.reset(); + } + handleCursorMove(editor); + }, + + isAccepting: function(type) { + return this.accepting.indexOf(type) !== -1; + }, + + reset: function() { + this.operator = null; + this.motion = null; + this.currentCount = ""; + this.status = ""; + this.accepting = [NUMBER, OPERATOR, MOTION, ACTION]; + this.idle = true; + this.waitingForParam = null; + } +}; + +function setPreviousCommand(fn) { + inputBuffer.previous = { action: { action: { fn: fn } } }; +} + +exports.coreCommands = { + start: { + exec: function start(editor) { + util.insertMode(editor); + setPreviousCommand(start); + } + }, + startBeginning: { + exec: function startBeginning(editor) { + editor.navigateLineStart(); + util.insertMode(editor); + setPreviousCommand(startBeginning); + } + }, + stop: { + exec: function stop(editor) { + inputBuffer.reset(); + util.onVisualMode = false; + util.onVisualLineMode = false; + inputBuffer.lastInsertCommands = util.normalMode(editor); + } + }, + append: { + exec: function append(editor) { + var pos = editor.getCursorPosition(); + var lineLen = editor.session.getLine(pos.row).length; + if (lineLen) + editor.navigateRight(); + util.insertMode(editor); + setPreviousCommand(append); + } + }, + appendEnd: { + exec: function appendEnd(editor) { + editor.navigateLineEnd(); + util.insertMode(editor); + setPreviousCommand(appendEnd); + } + } +}; + +var handleCursorMove = exports.onCursorMove = function(editor, e) { + if (util.currentMode === 'insert' || handleCursorMove.running) + return; + else if(!editor.selection.isEmpty()) { + handleCursorMove.running = true; + if (util.onVisualLineMode) { + var originRow = editor.selection.visualLineStart; + var cursorRow = editor.getCursorPosition().row; + if(originRow <= cursorRow) { + var endLine = editor.session.getLine(cursorRow); + editor.selection.clearSelection(); + editor.selection.moveCursorTo(originRow, 0); + editor.selection.selectTo(cursorRow, endLine.length); + } else { + var endLine = editor.session.getLine(originRow); + editor.selection.clearSelection(); + editor.selection.moveCursorTo(originRow, endLine.length); + editor.selection.selectTo(cursorRow, 0); + } + } + handleCursorMove.running = false; + return; + } + else { + if (e && (util.onVisualLineMode || util.onVisualMode)) { + editor.selection.clearSelection(); + util.normalMode(editor); + } + + handleCursorMove.running = true; + var pos = editor.getCursorPosition(); + var lineLen = editor.session.getLine(pos.row).length; + + if (lineLen && pos.column === lineLen) + editor.navigateLeft(); + handleCursorMove.running = false; + } +}; +}); +ace.define('ace/keyboard/vim/maps/util', ['require', 'exports', 'module' , 'ace/keyboard/vim/registers', 'ace/lib/dom'], function(require, exports, module) { +var registers = require("../registers"); + +var dom = require("../../../lib/dom"); +dom.importCssString('.insert-mode .ace_cursor{\ + border-left: 2px solid #333333;\ +}\ +.ace_dark.insert-mode .ace_cursor{\ + border-left: 2px solid #eeeeee;\ +}\ +.normal-mode .ace_cursor{\ + border: 0!important;\ + background-color: red;\ + opacity: 0.5;\ +}', 'vimMode'); + +module.exports = { + onVisualMode: false, + onVisualLineMode: false, + currentMode: 'normal', + noMode: function(editor) { + editor.unsetStyle('insert-mode'); + editor.unsetStyle('normal-mode'); + if (editor.commands.recording) + editor.commands.toggleRecording(editor); + editor.setOverwrite(false); + }, + insertMode: function(editor) { + this.currentMode = 'insert'; + editor.setStyle('insert-mode'); + editor.unsetStyle('normal-mode'); + + editor.setOverwrite(false); + editor.keyBinding.$data.buffer = ""; + editor.keyBinding.$data.state = "insertMode"; + this.onVisualMode = false; + this.onVisualLineMode = false; + if(this.onInsertReplaySequence) { + editor.commands.macro = this.onInsertReplaySequence; + editor.commands.replay(editor); + this.onInsertReplaySequence = null; + this.normalMode(editor); + } else { + editor._emit("changeStatus"); + if(!editor.commands.recording) + editor.commands.toggleRecording(editor); + } + }, + normalMode: function(editor) { + this.currentMode = 'normal'; + + editor.unsetStyle('insert-mode'); + editor.setStyle('normal-mode'); + editor.clearSelection(); + + var pos; + if (!editor.getOverwrite()) { + pos = editor.getCursorPosition(); + if (pos.column > 0) + editor.navigateLeft(); + } + + editor.setOverwrite(true); + editor.keyBinding.$data.buffer = ""; + editor.keyBinding.$data.state = "start"; + this.onVisualMode = false; + this.onVisualLineMode = false; + editor._emit("changeStatus"); + if (editor.commands.recording) { + editor.commands.toggleRecording(editor); + return editor.commands.macro; + } + else { + return []; + } + }, + visualMode: function(editor, lineMode) { + if ( + (this.onVisualLineMode && lineMode) + || (this.onVisualMode && !lineMode) + ) { + this.normalMode(editor); + return; + } + + editor.setStyle('insert-mode'); + editor.unsetStyle('normal-mode'); + + editor._emit("changeStatus"); + if (lineMode) { + this.onVisualLineMode = true; + } else { + this.onVisualMode = true; + this.onVisualLineMode = false; + } + }, + getRightNthChar: function(editor, cursor, ch, n) { + var line = editor.getSession().getLine(cursor.row); + var matches = line.substr(cursor.column + 1).split(ch); + + return n < matches.length ? matches.slice(0, n).join(ch).length : null; + }, + getLeftNthChar: function(editor, cursor, ch, n) { + var line = editor.getSession().getLine(cursor.row); + var matches = line.substr(0, cursor.column).split(ch); + + return n < matches.length ? matches.slice(-1 * n).join(ch).length : null; + }, + toRealChar: function(ch) { + if (ch.length === 1) + return ch; + + if (/^shift-./.test(ch)) + return ch[ch.length - 1].toUpperCase(); + else + return ""; + }, + copyLine: function(editor) { + var pos = editor.getCursorPosition(); + editor.selection.clearSelection(); + editor.moveCursorTo(pos.row, pos.column); + editor.selection.selectLine(); + registers._default.isLine = true; + registers._default.text = editor.getCopyText().replace(/\n$/, ""); + editor.selection.clearSelection(); + editor.moveCursorTo(pos.row, pos.column); + } +}; +}); + +ace.define('ace/keyboard/vim/registers', ['require', 'exports', 'module' ], function(require, exports, module) { + +"never use strict"; + +module.exports = { + _default: { + text: "", + isLine: false + } +}; + +}); + + +ace.define('ace/keyboard/vim/maps/motions', ['require', 'exports', 'module' , 'ace/keyboard/vim/maps/util', 'ace/search', 'ace/range'], function(require, exports, module) { + + +var util = require("./util"); + +var keepScrollPosition = function(editor, fn) { + var scrollTopRow = editor.renderer.getScrollTopRow(); + var initialRow = editor.getCursorPosition().row; + var diff = initialRow - scrollTopRow; + fn && fn.call(editor); + editor.renderer.scrollToRow(editor.getCursorPosition().row - diff); +}; + +function Motion(m) { + if (typeof m == "function") { + var getPos = m; + m = this; + } else { + var getPos = m.getPos; + } + m.nav = function(editor, range, count, param) { + var a = getPos(editor, range, count, param, false); + if (!a) + return; + editor.clearSelection(); + editor.moveCursorTo(a.row, a.column); + }; + m.sel = function(editor, range, count, param) { + var a = getPos(editor, range, count, param, true); + if (!a) + return; + editor.selection.selectTo(a.row, a.column); + }; + return m; +} + +var nonWordRe = /[\s.\/\\()\"'-:,.;<>~!@#$%^&*|+=\[\]{}`~?]/; +var wordSeparatorRe = /[.\/\\()\"'-:,.;<>~!@#$%^&*|+=\[\]{}`~?]/; +var whiteRe = /\s/; +var StringStream = function(editor, cursor) { + var sel = editor.selection; + this.range = sel.getRange(); + cursor = cursor || sel.selectionLead; + this.row = cursor.row; + this.col = cursor.column; + var line = editor.session.getLine(this.row); + var maxRow = editor.session.getLength(); + this.ch = line[this.col] || '\n'; + this.skippedLines = 0; + + this.next = function() { + this.ch = line[++this.col] || this.handleNewLine(1); + return this.ch; + }; + this.prev = function() { + this.ch = line[--this.col] || this.handleNewLine(-1); + return this.ch; + }; + this.peek = function(dir) { + var ch = line[this.col + dir]; + if (ch) + return ch; + if (dir == -1) + return '\n'; + if (this.col == line.length - 1) + return '\n'; + return editor.session.getLine(this.row + 1)[0] || '\n'; + }; + + this.handleNewLine = function(dir) { + if (dir == 1){ + if (this.col == line.length) + return '\n'; + if (this.row == maxRow - 1) + return ''; + this.col = 0; + this.row ++; + line = editor.session.getLine(this.row); + this.skippedLines++; + return line[0] || '\n'; + } + if (dir == -1) { + if (this.row === 0) + return ''; + this.row --; + line = editor.session.getLine(this.row); + this.col = line.length; + this.skippedLines--; + return '\n'; + } + }; + this.debug = function() { + console.log(line.substring(0, this.col)+'|'+this.ch+'\''+this.col+'\''+line.substr(this.col+1)); + }; +}; + +var Search = require("../../../search").Search; +var search = new Search(); + +function find(editor, needle, dir) { + search.$options.needle = needle; + search.$options.backwards = dir == -1; + return search.find(editor.session); +} + +var Range = require("../../../range").Range; + +var LAST_SEARCH_MOTION = {}; + +module.exports = { + "w": new Motion(function(editor) { + var str = new StringStream(editor); + + if (str.ch && wordSeparatorRe.test(str.ch)) { + while (str.ch && wordSeparatorRe.test(str.ch)) + str.next(); + } else { + while (str.ch && !nonWordRe.test(str.ch)) + str.next(); + } + while (str.ch && whiteRe.test(str.ch) && str.skippedLines < 2) + str.next(); + + str.skippedLines == 2 && str.prev(); + return {column: str.col, row: str.row}; + }), + "W": new Motion(function(editor) { + var str = new StringStream(editor); + while(str.ch && !(whiteRe.test(str.ch) && !whiteRe.test(str.peek(1))) && str.skippedLines < 2) + str.next(); + if (str.skippedLines == 2) + str.prev(); + else + str.next(); + + return {column: str.col, row: str.row}; + }), + "b": new Motion(function(editor) { + var str = new StringStream(editor); + + str.prev(); + while (str.ch && whiteRe.test(str.ch) && str.skippedLines > -2) + str.prev(); + + if (str.ch && wordSeparatorRe.test(str.ch)) { + while (str.ch && wordSeparatorRe.test(str.ch)) + str.prev(); + } else { + while (str.ch && !nonWordRe.test(str.ch)) + str.prev(); + } + str.ch && str.next(); + return {column: str.col, row: str.row}; + }), + "B": new Motion(function(editor) { + var str = new StringStream(editor); + str.prev(); + while(str.ch && !(!whiteRe.test(str.ch) && whiteRe.test(str.peek(-1))) && str.skippedLines > -2) + str.prev(); + + if (str.skippedLines == -2) + str.next(); + + return {column: str.col, row: str.row}; + }), + "e": new Motion(function(editor) { + var str = new StringStream(editor); + + str.next(); + while (str.ch && whiteRe.test(str.ch)) + str.next(); + + if (str.ch && wordSeparatorRe.test(str.ch)) { + while (str.ch && wordSeparatorRe.test(str.ch)) + str.next(); + } else { + while (str.ch && !nonWordRe.test(str.ch)) + str.next(); + } + str.ch && str.prev(); + return {column: str.col, row: str.row}; + }), + "E": new Motion(function(editor) { + var str = new StringStream(editor); + str.next(); + while(str.ch && !(!whiteRe.test(str.ch) && whiteRe.test(str.peek(1)))) + str.next(); + + return {column: str.col, row: str.row}; + }), + + "l": { + nav: function(editor) { + var pos = editor.getCursorPosition(); + var col = pos.column; + var lineLen = editor.session.getLine(pos.row).length; + if (lineLen && col !== lineLen) + editor.navigateRight(); + }, + sel: function(editor) { + var pos = editor.getCursorPosition(); + var col = pos.column; + var lineLen = editor.session.getLine(pos.row).length; + if (lineLen && col !== lineLen) //In selection mode you can select the newline + editor.selection.selectRight(); + } + }, + "h": { + nav: function(editor) { + var pos = editor.getCursorPosition(); + if (pos.column > 0) + editor.navigateLeft(); + }, + sel: function(editor) { + var pos = editor.getCursorPosition(); + if (pos.column > 0) + editor.selection.selectLeft(); + } + }, + "H": { + nav: function(editor) { + var row = editor.renderer.getScrollTopRow(); + editor.moveCursorTo(row); + }, + sel: function(editor) { + var row = editor.renderer.getScrollTopRow(); + editor.selection.selectTo(row); + } + }, + "M": { + nav: function(editor) { + var topRow = editor.renderer.getScrollTopRow(); + var bottomRow = editor.renderer.getScrollBottomRow(); + var row = topRow + ((bottomRow - topRow) / 2); + editor.moveCursorTo(row); + }, + sel: function(editor) { + var topRow = editor.renderer.getScrollTopRow(); + var bottomRow = editor.renderer.getScrollBottomRow(); + var row = topRow + ((bottomRow - topRow) / 2); + editor.selection.selectTo(row); + } + }, + "L": { + nav: function(editor) { + var row = editor.renderer.getScrollBottomRow(); + editor.moveCursorTo(row); + }, + sel: function(editor) { + var row = editor.renderer.getScrollBottomRow(); + editor.selection.selectTo(row); + } + }, + "k": { + nav: function(editor) { + editor.navigateUp(); + }, + sel: function(editor) { + editor.selection.selectUp(); + } + }, + "j": { + nav: function(editor) { + editor.navigateDown(); + }, + sel: function(editor) { + editor.selection.selectDown(); + } + }, + + "i": { + param: true, + sel: function(editor, range, count, param) { + switch (param) { + case "w": + editor.selection.selectWord(); + break; + case "W": + editor.selection.selectAWord(); + break; + case "(": + case "{": + case "[": + var cursor = editor.getCursorPosition(); + var end = editor.session.$findClosingBracket(param, cursor, /paren/); + if (!end) + return; + var start = editor.session.$findOpeningBracket(editor.session.$brackets[param], cursor, /paren/); + if (!start) + return; + start.column ++; + editor.selection.setSelectionRange(Range.fromPoints(start, end)); + break; + case "'": + case '"': + case "/": + var end = find(editor, param, 1); + if (!end) + return; + var start = find(editor, param, -1); + if (!start) + return; + editor.selection.setSelectionRange(Range.fromPoints(start.end, end.start)); + break; + } + } + }, + "a": { + param: true, + sel: function(editor, range, count, param) { + switch (param) { + case "w": + editor.selection.selectAWord(); + break; + case "W": + editor.selection.selectAWord(); + break; + case "(": + case "{": + case "[": + var cursor = editor.getCursorPosition(); + var end = editor.session.$findClosingBracket(param, cursor, /paren/); + if (!end) + return; + var start = editor.session.$findOpeningBracket(editor.session.$brackets[param], cursor, /paren/); + if (!start) + return; + end.column ++; + editor.selection.setSelectionRange(Range.fromPoints(start, end)); + break; + case "'": + case "\"": + case "/": + var end = find(editor, param, 1); + if (!end) + return; + var start = find(editor, param, -1); + if (!start) + return; + end.column ++; + editor.selection.setSelectionRange(Range.fromPoints(start.start, end.end)); + break; + } + } + }, + + "f": new Motion({ + param: true, + handlesCount: true, + getPos: function(editor, range, count, param, isSel, isRepeat) { + if (!isRepeat) + LAST_SEARCH_MOTION = {ch: "f", param: param}; + var cursor = editor.getCursorPosition(); + var column = util.getRightNthChar(editor, cursor, param, count || 1); + + if (typeof column === "number") { + cursor.column += column + (isSel ? 2 : 1); + return cursor; + } + } + }), + "F": new Motion({ + param: true, + handlesCount: true, + getPos: function(editor, range, count, param, isSel, isRepeat) { + if (!isRepeat) + LAST_SEARCH_MOTION = {ch: "F", param: param}; + var cursor = editor.getCursorPosition(); + var column = util.getLeftNthChar(editor, cursor, param, count || 1); + + if (typeof column === "number") { + cursor.column -= column + 1; + return cursor; + } + } + }), + "t": new Motion({ + param: true, + handlesCount: true, + getPos: function(editor, range, count, param, isSel, isRepeat) { + if (!isRepeat) + LAST_SEARCH_MOTION = {ch: "t", param: param}; + var cursor = editor.getCursorPosition(); + var column = util.getRightNthChar(editor, cursor, param, count || 1); + + if (isRepeat && column == 0 && !(count > 1)) + var column = util.getRightNthChar(editor, cursor, param, 2); + + if (typeof column === "number") { + cursor.column += column + (isSel ? 1 : 0); + return cursor; + } + } + }), + "T": new Motion({ + param: true, + handlesCount: true, + getPos: function(editor, range, count, param, isSel, isRepeat) { + if (!isRepeat) + LAST_SEARCH_MOTION = {ch: "T", param: param}; + var cursor = editor.getCursorPosition(); + var column = util.getLeftNthChar(editor, cursor, param, count || 1); + + if (isRepeat && column == 0 && !(count > 1)) + var column = util.getLeftNthChar(editor, cursor, param, 2); + + if (typeof column === "number") { + cursor.column -= column; + return cursor; + } + } + }), + ";": new Motion({ + handlesCount: true, + getPos: function(editor, range, count, param, isSel) { + var ch = LAST_SEARCH_MOTION.ch; + if (!ch) + return; + return module.exports[ch].getPos( + editor, range, count, LAST_SEARCH_MOTION.param, isSel, true + ); + } + }), + ",": new Motion({ + handlesCount: true, + getPos: function(editor, range, count, param, isSel) { + var ch = LAST_SEARCH_MOTION.ch; + if (!ch) + return; + var up = ch.toUpperCase(); + ch = ch === up ? ch.toLowerCase() : up; + + return module.exports[ch].getPos( + editor, range, count, LAST_SEARCH_MOTION.param, isSel, true + ); + } + }), + + "^": { + nav: function(editor) { + editor.navigateLineStart(); + }, + sel: function(editor) { + editor.selection.selectLineStart(); + } + }, + "$": { + nav: function(editor) { + editor.navigateLineEnd(); + }, + sel: function(editor) { + editor.selection.selectLineEnd(); + } + }, + "0": new Motion(function(ed) { + return {row: ed.selection.lead.row, column: 0}; + }), + "G": { + nav: function(editor, range, count, param) { + if (!count && count !== 0) { // Stupid JS + count = editor.session.getLength(); + } + editor.gotoLine(count); + }, + sel: function(editor, range, count, param) { + if (!count && count !== 0) { // Stupid JS + count = editor.session.getLength(); + } + editor.selection.selectTo(count, 0); + } + }, + "g": { + param: true, + nav: function(editor, range, count, param) { + switch(param) { + case "m": + console.log("Middle line"); + break; + case "e": + console.log("End of prev word"); + break; + case "g": + editor.gotoLine(count || 0); + case "u": + editor.gotoLine(count || 0); + case "U": + editor.gotoLine(count || 0); + } + }, + sel: function(editor, range, count, param) { + switch(param) { + case "m": + console.log("Middle line"); + break; + case "e": + console.log("End of prev word"); + break; + case "g": + editor.selection.selectTo(count || 0, 0); + } + } + }, + "o": { + nav: function(editor, range, count, param) { + count = count || 1; + var content = ""; + while (0 < count--) + content += "\n"; + + if (content.length) { + editor.navigateLineEnd() + editor.insert(content); + util.insertMode(editor); + } + } + }, + "O": { + nav: function(editor, range, count, param) { + var row = editor.getCursorPosition().row; + count = count || 1; + var content = ""; + while (0 < count--) + content += "\n"; + + if (content.length) { + if(row > 0) { + editor.navigateUp(); + editor.navigateLineEnd() + editor.insert(content); + } else { + editor.session.insert({row: 0, column: 0}, content); + editor.navigateUp(); + } + util.insertMode(editor); + } + } + }, + "%": new Motion(function(editor){ + var brRe = /[\[\]{}()]/g; + var cursor = editor.getCursorPosition(); + var ch = editor.session.getLine(cursor.row)[cursor.column]; + if (!brRe.test(ch)) { + var range = find(editor, brRe); + if (!range) + return; + cursor = range.start; + } + var match = editor.session.findMatchingBracket({ + row: cursor.row, + column: cursor.column + 1 + }); + + return match; + }), + "{": new Motion(function(ed) { + var session = ed.session; + var row = session.selection.lead.row; + while(row > 0 && !/\S/.test(session.getLine(row))) + row--; + while(/\S/.test(session.getLine(row))) + row--; + return {column: 0, row: row}; + }), + "}": new Motion(function(ed) { + var session = ed.session; + var l = session.getLength(); + var row = session.selection.lead.row; + while(row < l && !/\S/.test(session.getLine(row))) + row++; + while(/\S/.test(session.getLine(row))) + row++; + return {column: 0, row: row}; + }), + "ctrl-d": { + nav: function(editor, range, count, param) { + editor.selection.clearSelection(); + keepScrollPosition(editor, editor.gotoPageDown); + }, + sel: function(editor, range, count, param) { + keepScrollPosition(editor, editor.selectPageDown); + } + }, + "ctrl-u": { + nav: function(editor, range, count, param) { + editor.selection.clearSelection(); + keepScrollPosition(editor, editor.gotoPageUp); + }, + sel: function(editor, range, count, param) { + keepScrollPosition(editor, editor.selectPageUp); + } + }, + "`": new Motion({ + param: true, + handlesCount: true, + getPos: function(editor, range, count, param, isSel) { + var s = editor.session; + var marker = s.vimMarkers && s.vimMarkers[param]; + if (marker) { + return marker.getPosition(); + } + } + }), + "'": new Motion({ + param: true, + handlesCount: true, + getPos: function(editor, range, count, param, isSel) { + var s = editor.session; + var marker = s.vimMarkers && s.vimMarkers[param]; + if (marker) { + var pos = marker.getPosition(); + var line = editor.session.getLine(pos.row); + pos.column = line.search(/\S/); + if (pos.column == -1) + pos.column = line.length; + return pos; + } + } + }) +}; + +module.exports.backspace = module.exports.left = module.exports.h; +module.exports.space = module.exports['return'] = module.exports.right = module.exports.l; +module.exports.up = module.exports.k; +module.exports.down = module.exports.j; +module.exports.pagedown = module.exports["ctrl-d"]; +module.exports.pageup = module.exports["ctrl-u"]; + +}); + +ace.define('ace/keyboard/vim/maps/operators', ['require', 'exports', 'module' , 'ace/keyboard/vim/maps/util', 'ace/keyboard/vim/registers'], function(require, exports, module) { + + + +var util = require("./util"); +var registers = require("../registers"); + +module.exports = { + "d": { + selFn: function(editor, range, count, param) { + registers._default.text = editor.getCopyText(); + registers._default.isLine = util.onVisualLineMode; + if(util.onVisualLineMode) + editor.removeLines(); + else + editor.session.remove(range); + util.normalMode(editor); + }, + fn: function(editor, range, count, param) { + count = count || 1; + switch (param) { + case "d": + registers._default.text = ""; + registers._default.isLine = true; + for (var i = 0; i < count; i++) { + editor.selection.selectLine(); + registers._default.text += editor.getCopyText(); + var selRange = editor.getSelectionRange(); + if (!selRange.isMultiLine()) { + var row = selRange.start.row - 1; + var col = editor.session.getLine(row).length + selRange.setStart(row, col); + editor.session.remove(selRange); + editor.selection.clearSelection(); + break; + } + editor.session.remove(selRange); + editor.selection.clearSelection(); + } + registers._default.text = registers._default.text.replace(/\n$/, ""); + break; + default: + if (range) { + editor.selection.setSelectionRange(range); + registers._default.text = editor.getCopyText(); + registers._default.isLine = false; + editor.session.remove(range); + editor.selection.clearSelection(); + } + } + } + }, + "c": { + selFn: function(editor, range, count, param) { + editor.session.remove(range); + util.insertMode(editor); + }, + fn: function(editor, range, count, param) { + count = count || 1; + switch (param) { + case "c": + for (var i = 0; i < count; i++) { + editor.removeLines(); + util.insertMode(editor); + } + + break; + default: + if (range) { + editor.session.remove(range); + util.insertMode(editor); + } + } + } + }, + "y": { + selFn: function(editor, range, count, param) { + registers._default.text = editor.getCopyText(); + registers._default.isLine = util.onVisualLineMode; + editor.selection.clearSelection(); + util.normalMode(editor); + }, + fn: function(editor, range, count, param) { + count = count || 1; + switch (param) { + case "y": + var pos = editor.getCursorPosition(); + editor.selection.selectLine(); + for (var i = 0; i < count - 1; i++) { + editor.selection.moveCursorDown(); + } + registers._default.text = editor.getCopyText().replace(/\n$/, ""); + editor.selection.clearSelection(); + registers._default.isLine = true; + editor.moveCursorToPosition(pos); + break; + default: + if (range) { + var pos = editor.getCursorPosition(); + editor.selection.setSelectionRange(range); + registers._default.text = editor.getCopyText(); + registers._default.isLine = false; + editor.selection.clearSelection(); + editor.moveCursorTo(pos.row, pos.column); + } + } + } + }, + ">": { + selFn: function(editor, range, count, param) { + count = count || 1; + for (var i = 0; i < count; i++) { + editor.indent(); + } + util.normalMode(editor); + }, + fn: function(editor, range, count, param) { + count = parseInt(count || 1, 10); + switch (param) { + case ">": + var pos = editor.getCursorPosition(); + editor.selection.selectLine(); + for (var i = 0; i < count - 1; i++) { + editor.selection.moveCursorDown(); + } + editor.indent(); + editor.selection.clearSelection(); + editor.moveCursorToPosition(pos); + editor.navigateLineEnd(); + editor.navigateLineStart(); + break; + } + } + }, + "<": { + selFn: function(editor, range, count, param) { + count = count || 1; + for (var i = 0; i < count; i++) { + editor.blockOutdent(); + } + util.normalMode(editor); + }, + fn: function(editor, range, count, param) { + count = count || 1; + switch (param) { + case "<": + var pos = editor.getCursorPosition(); + editor.selection.selectLine(); + for (var i = 0; i < count - 1; i++) { + editor.selection.moveCursorDown(); + } + editor.blockOutdent(); + editor.selection.clearSelection(); + editor.moveCursorToPosition(pos); + editor.navigateLineEnd(); + editor.navigateLineStart(); + break; + } + } + } +}; +}); + +"use strict" + +ace.define('ace/keyboard/vim/maps/aliases', ['require', 'exports', 'module' ], function(require, exports, module) { +module.exports = { + "x": { + operator: { + ch: "d", + count: 1 + }, + motion: { + ch: "l", + count: 1 + } + }, + "X": { + operator: { + ch: "d", + count: 1 + }, + motion: { + ch: "h", + count: 1 + } + }, + "D": { + operator: { + ch: "d", + count: 1 + }, + motion: { + ch: "$", + count: 1 + } + }, + "C": { + operator: { + ch: "c", + count: 1 + }, + motion: { + ch: "$", + count: 1 + } + }, + "s": { + operator: { + ch: "c", + count: 1 + }, + motion: { + ch: "l", + count: 1 + } + }, + "S": { + operator: { + ch: "c", + count: 1 + }, + param: "c" + } +}; +}); + diff --git a/0.0.3_0/ace/mode-abap.js b/0.0.3_0/ace/mode-abap.js new file mode 100644 index 0000000..271a359 --- /dev/null +++ b/0.0.3_0/ace/mode-abap.js @@ -0,0 +1,260 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2010, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/mode/abap', ['require', 'exports', 'module' , 'ace/tokenizer', 'ace/mode/abap_highlight_rules', 'ace/mode/folding/coffee', 'ace/range', 'ace/mode/text', 'ace/lib/oop'], function(require, exports, module) { + + +var Tokenizer = require("../tokenizer").Tokenizer; +var Rules = require("./abap_highlight_rules").AbapHighlightRules; +var FoldMode = require("./folding/coffee").FoldMode; +var Range = require("../range").Range; +var TextMode = require("./text").Mode; +var oop = require("../lib/oop"); + +function Mode() { + this.$tokenizer = new Tokenizer(new Rules().getRules()); + this.foldingRules = new FoldMode(); +} + +oop.inherits(Mode, TextMode); + +(function() { + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + return indent; + }; + + this.toggleCommentLines = function(state, doc, startRow, endRow){ + var range = new Range(0, 0, 0, 0); + for (var i = startRow; i <= endRow; ++i) { + var line = doc.getLine(i); + if (hereComment.test(line)) + continue; + + if (commentLine.test(line)) + line = line.replace(commentLine, '$1'); + else + line = line.replace(indentation, '$&#'); + + range.end.row = range.start.row = i; + range.end.column = line.length + 1; + doc.replace(range, line); + } + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; + +}); + +ace.define('ace/mode/abap_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var AbapHighlightRules = function() { + + var keywordMapper = this.createKeywordMapper({ + "variable.language": "this", + "keyword": + "ADD ALIAS ALIASES ASSERT ASSIGN ASSIGNING AT BACK" + + " CALL CASE CATCH CHECK CLASS CLEAR CLOSE CNT COLLECT COMMIT COMMUNICATION COMPUTE CONCATENATE CONDENSE CONSTANTS CONTINUE CONTROLS CONVERT CREATE CURRENCY" + + " DATA DEFINE DEFINITION DEFERRED DELETE DESCRIBE DETAIL DIVIDE DO" + + " ELSE ELSEIF ENDAT ENDCASE ENDCLASS ENDDO ENDEXEC ENDFORM ENDFUNCTION ENDIF ENDIFEND ENDINTERFACE ENDLOOP ENDMETHOD ENDMODULE ENDON ENDPROVIDE ENDSELECT ENDTRY ENDWHILE EVENT EVENTS EXEC EXIT EXPORT EXPORTING EXTRACT" + + " FETCH FIELDS FORM FORMAT FREE FROM FUNCTION" + + " GENERATE GET" + + " HIDE" + + " IF IMPORT IMPORTING INDEX INFOTYPES INITIALIZATION INTERFACE INTERFACES INPUT INSERT IMPLEMENTATION" + + " LEAVE LIKE LINE LOAD LOCAL LOOP" + + " MESSAGE METHOD METHODS MODIFY MODULE MOVE MULTIPLY" + + " ON OVERLAY OPTIONAL OTHERS" + + " PACK PARAMETERS PERFORM POSITION PROGRAM PROVIDE PUT" + + " RAISE RANGES READ RECEIVE RECEIVING REDEFINITION REFERENCE REFRESH REJECT REPLACE REPORT RESERVE RESTORE RETURNING ROLLBACK" + + " SCAN SCROLL SEARCH SELECT SET SHIFT SKIP SORT SORTED SPLIT STANDARD STATICS STEP STOP SUBMIT SUBTRACT SUM SUMMARY SUPPRESS" + + " TABLES TIMES TRANSFER TRANSLATE TRY TYPE TYPES" + + " UNASSIGN ULINE UNPACK UPDATE" + + " WHEN WHILE WINDOW WRITE" + + " OCCURS STRUCTURE OBJECT PROPERTY" + + " CASTING APPEND RAISING VALUE COLOR" + + " CHANGING EXCEPTION EXCEPTIONS DEFAULT CHECKBOX COMMENT" + + " ID NUMBER FOR TITLE OUTPUT" + + " WITH EXIT USING" + + " INTO WHERE GROUP BY HAVING ORDER BY SINGLE" + + " APPENDING CORRESPONDING FIELDS OF TABLE" + + " LEFT RIGHT OUTER INNER JOIN AS CLIENT SPECIFIED BYPASSING BUFFER UP TO ROWS CONNECTING" + + " EQ NE LT LE GT GE NOT AND OR XOR IN LIKE BETWEEN", + "constant.language": + "TRUE FALSE NULL SPACE", + "support.type": + "c n i p f d t x string xstring decfloat16 decfloat34", + "keyword.operator": + "abs sign ceil floor trunc frac acos asin atan cos sin tan" + + " abapOperator cosh sinh tanh exp log log10 sqrt" + + " strlen xstrlen charlen numofchar dbmaxlen lines" + }, "text", true, " "); + + var compoundKeywords = "WITH\\W+(?:HEADER\\W+LINE|FRAME|KEY)|NO\\W+STANDARD\\W+PAGE\\W+HEADING|"+ + "EXIT\\W+FROM\\W+STEP\\W+LOOP|BEGIN\\W+OF\\W+(?:BLOCK|LINE)|BEGIN\\W+OF|"+ + "END\\W+OF\\W+(?:BLOCK|LINE)|END\\W+OF|NO\\W+INTERVALS|"+ + "RESPECTING\\W+BLANKS|SEPARATED\\W+BY|USING\\W+(?:EDIT\\W+MASK)|"+ + "WHERE\\W+(?:LINE)|RADIOBUTTON\\W+GROUP|REF\\W+TO|"+ + "(?:PUBLIC|PRIVATE|PROTECTED)(?:\\W+SECTION)?|DELETING\\W+(?:TRAILING|LEADING)"+ + "(?:ALL\\W+OCCURRENCES)|(?:FIRST|LAST)\\W+OCCURRENCE|INHERITING\\W+FROM|"+ + "LINE-COUNT|ADD-CORRESPONDING|AUTHORITY-CHECK|BREAK-POINT|CLASS-DATA|CLASS-METHODS|"+ + "CLASS-METHOD|DIVIDE-CORRESPONDING|EDITOR-CALL|END-OF-DEFINITION|END-OF-PAGE|END-OF-SELECTION|"+ + "FIELD-GROUPS|FIELD-SYMBOLS|FUNCTION-POOL|MOVE-CORRESPONDING|MULTIPLY-CORRESPONDING|NEW-LINE|"+ + "NEW-PAGE|NEW-SECTION|PRINT-CONTROL|RP-PROVIDE-FROM-LAST|SELECT-OPTIONS|SELECTION-SCREEN|"+ + "START-OF-SELECTION|SUBTRACT-CORRESPONDING|SYNTAX-CHECK|SYNTAX-TRACE|TOP-OF-PAGE|TYPE-POOL|"+ + "TYPE-POOLS|LINE-SIZE|LINE-COUNT|MESSAGE-ID|DISPLAY-MODE|READ(?:-ONLY)?|"+ + "IS\\W+(?:NOT\\W+)?(?:ASSIGNED|BOUND|INITIAL|SUPPLIED)"; + + this.$rules = { + "start" : [ + {token : "string", regex : "`", next : "string"}, + {token : "string", regex : "'", next : "qstring"}, + {token : "doc.comment", regex : /^\*.+/}, + {token : "comment", regex : /".+$/}, + {token : "invalid", regex: "\\.{2,}"}, + {token : "keyword.operator", regex: /\W[\-+\%=<>*]\W|\*\*|[~:,\.&$]|->*?|=>/}, + {token : "paren.lparen", regex : "[\\[({]"}, + {token : "paren.rparen", regex : "[\\])}]"}, + {token : "constant.numeric", regex: "[+-]?\\d+\\b"}, + {token : "variable.parameter", regex : /sy|pa?\d\d\d\d\|t\d\d\d\.|innnn/}, + {token : "keyword", regex : compoundKeywords}, + {token : "variable.parameter", regex : /\w+-\w+(?:-\w+)*/}, + {token : keywordMapper, regex : "\\b\\w+\\b"}, + {caseInsensitive: true} + ], + "qstring" : [ + {token : "constant.language.escape", regex : "''"}, + {token : "string", regex : "'", next : "start"}, + {defaultToken : "string"} + ], + "string" : [ + {token : "constant.language.escape", regex : "``"}, + {token : "string", regex : "`", next : "start"}, + {defaultToken : "string"} + ] + } +}; +oop.inherits(AbapHighlightRules, TextHighlightRules); + +exports.AbapHighlightRules = AbapHighlightRules; +}); + +ace.define('ace/mode/folding/coffee', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/folding/fold_mode', 'ace/range'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var BaseFoldMode = require("./fold_mode").FoldMode; +var Range = require("../../range").Range; + +var FoldMode = exports.FoldMode = function() {}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var range = this.indentationBlock(session, row); + if (range) + return range; + + var re = /\S/; + var line = session.getLine(row); + var startLevel = line.search(re); + if (startLevel == -1 || line[startLevel] != "#") + return; + + var startColumn = line.length; + var maxRow = session.getLength(); + var startRow = row; + var endRow = row; + + while (++row < maxRow) { + line = session.getLine(row); + var level = line.search(re); + + if (level == -1) + continue; + + if (line[level] != "#") + break; + + endRow = row; + } + + if (endRow > startRow) { + var endColumn = session.getLine(endRow).length; + return new Range(startRow, startColumn, endRow, endColumn); + } + }; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + var indent = line.search(/\S/); + var next = session.getLine(row + 1); + var prev = session.getLine(row - 1); + var prevIndent = prev.search(/\S/); + var nextIndent = next.search(/\S/); + + if (indent == -1) { + session.foldWidgets[row - 1] = prevIndent!= -1 && prevIndent < nextIndent ? "start" : ""; + return ""; + } + if (prevIndent == -1) { + if (indent == nextIndent && line[indent] == "#" && next[indent] == "#") { + session.foldWidgets[row - 1] = ""; + session.foldWidgets[row + 1] = ""; + return "start"; + } + } else if (prevIndent == indent && line[indent] == "#" && prev[indent] == "#") { + if (session.getLine(row - 2).search(/\S/) == -1) { + session.foldWidgets[row - 1] = "start"; + session.foldWidgets[row + 1] = ""; + return ""; + } + } + + if (prevIndent!= -1 && prevIndent < indent) + session.foldWidgets[row - 1] = "start"; + else + session.foldWidgets[row - 1] = ""; + + if (indent < nextIndent) + return "start"; + else + return ""; + }; + +}).call(FoldMode.prototype); + +}); diff --git a/0.0.3_0/ace/mode-actionscript.js b/0.0.3_0/ace/mode-actionscript.js new file mode 100644 index 0000000..68ff42e --- /dev/null +++ b/0.0.3_0/ace/mode-actionscript.js @@ -0,0 +1,216 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2012, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * + * Contributor(s): + * + * + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/mode/actionscript', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/actionscript_highlight_rules', 'ace/mode/folding/cstyle'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var ActionScriptHighlightRules = require("./actionscript_highlight_rules").ActionScriptHighlightRules; +var FoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + var highlighter = new ActionScriptHighlightRules(); + this.foldingRules = new FoldMode(); + this.$tokenizer = new Tokenizer(highlighter.getRules()); +}; +oop.inherits(Mode, TextMode); + +(function() { + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/actionscript_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var ActionScriptHighlightRules = function() { + + this.$rules = { start: + [ { token: 'support.class.actionscript.2', + regex: '\\b(?:R(?:ecordset|DBMSResolver|adioButton(?:Group)?)|X(?:ML(?:Socket|Node|Connector)?|UpdateResolverDataHolder)|M(?:M(?:Save|Execute)|icrophoneMicrophone|o(?:use|vieClip(?:Loader)?)|e(?:nu(?:Bar)?|dia(?:Controller|Display|Playback))|ath)|B(?:yName|inding|utton)|S(?:haredObject|ystem|crollPane|t(?:yleSheet|age|ream)|ound|e(?:ndEvent|rviceObject)|OAPCall|lide)|N(?:umericStepper|et(?:stream|S(?:tream|ervices)|Connection|Debug(?:Config)?))|C(?:heckBox|o(?:ntextMenu(?:Item)?|okie|lor|m(?:ponentMixins|boBox))|ustomActions|lient|amera)|T(?:ypedValue|ext(?:Snapshot|Input|F(?:ield|ormat)|Area)|ree|AB)|Object|D(?:ownload|elta(?:Item|Packet)?|at(?:e(?:Chooser|Field)?|a(?:G(?:lue|rid)|Set|Type)))|U(?:RL|TC|IScrollBar)|P(?:opUpManager|endingCall|r(?:intJob|o(?:duct|gressBar)))|E(?:ndPoint|rror)|Video|Key|F(?:RadioButton|GridColumn|MessageBox|BarChart|S(?:croll(?:Bar|Pane)|tyleFormat|plitView)|orm|C(?:heckbox|omboBox|alendar)|unction|T(?:icker|ooltip(?:Lite)?|ree(?:Node)?)|IconButton|D(?:ataGrid|raggablePane)|P(?:ieChart|ushButton|ro(?:gressBar|mptBox))|L(?:i(?:stBox|neChart)|oadingBox)|AdvancedMessageBox)|W(?:indow|SDLURL|ebService(?:Connector)?)|L(?:ist|o(?:calConnection|ad(?:er|Vars)|g)|a(?:unch|bel))|A(?:sBroadcaster|cc(?:ordion|essibility)|S(?:Set(?:Native|PropFlags)|N(?:ew|ative)|C(?:onstructor|lamp(?:2)?)|InstanceOf)|pplication|lert|rray))\\b' }, + { token: 'support.function.actionscript.2', + regex: '\\b(?:s(?:h(?:ift|ow(?:GridLines|Menu|Border|Settings|Headers|ColumnHeaders|Today|Preferences)?|ad(?:ow|ePane))|c(?:hema|ale(?:X|Mode|Y|Content)|r(?:oll(?:Track|Drag)?|een(?:Resolution|Color|DPI)))|t(?:yleSheet|op(?:Drag|A(?:nimation|llSounds|gent))?|epSize|a(?:tus|rt(?:Drag|A(?:nimation|gent))?))|i(?:n|ze|lence(?:TimeOut|Level))|o(?:ngname|urce|rt(?:Items(?:By)?|On(?:HeaderRelease)?|able(?:Columns)?)?)|u(?:ppressInvalidCalls|bstr(?:ing)?)|p(?:li(?:ce|t)|aceCol(?:umnsEqually|lumnsEqually))|e(?:nd(?:DefaultPushButtonEvent|AndLoad)?|curity|t(?:R(?:GB|o(?:otNode|w(?:Height|Count))|esizable(?:Columns)?|a(?:nge|te))|G(?:ain|roupName)|X(?:AxisTitle)?|M(?:i(?:n(?:imum|utes)|lliseconds)|o(?:nth(?:Names)?|tionLevel|de)|ultilineMode|e(?:ssage|nu(?:ItemEnabled(?:At)?|EnabledAt)|dia)|a(?:sk|ximum))|B(?:u(?:tton(?:s|Width)|fferTime)|a(?:seTabIndex|ndwidthLimit|ckground))|S(?:howAsDisabled|croll(?:ing|Speed|Content|Target|P(?:osition|roperties)|barState|Location)|t(?:yle(?:Property)?|opOnFocus|at(?:us|e))|i(?:ze|lenceLevel)|ort(?:able(?:Columns)?|Function)|p(?:litterBarPosition|acing)|e(?:conds|lect(?:Multiple|ion(?:Required|Type)?|Style|Color|ed(?:Node(?:s)?|Cell|I(?:nd(?:ices|ex)|tem(?:s)?))?|able))|kin|m(?:oothness|allScroll))|H(?:ighlight(?:s|Color)|Scroll|o(?:urs|rizontal)|eader(?:Symbol|Height|Text|Property|Format|Width|Location)?|as(?:Shader|CloseBox))|Y(?:ear|AxisTitle)?|N(?:ode(?:Properties|ExpansionHandler)|ewTextFormat)|C(?:h(?:ildNodes|a(?:ngeHandler|rt(?:Title|EventHandler)))|o(?:ntent(?:Size)?|okie|lumns)|ell(?:Symbol|Data)|l(?:i(?:ckHandler|pboard)|oseHandler)|redentials)|T(?:ype(?:dVaule)?|i(?:tle(?:barHeight)?|p(?:Target|Offset)?|me(?:out(?:Handler)?)?)|oggle|extFormat|ransform)|I(?:s(?:Branch|Open)|n(?:terval|putProperty)|con(?:SymbolName)?|te(?:rator|m(?:ByKey|Symbol)))|Orientation|D(?:i(?:splay(?:Range|Graphics|Mode|Clip|Text|edMonth)|rection)|uration|e(?:pth(?:Below|To|Above)|fault(?:GatewayURL|Mappings|NodeIconSymbolName)|l(?:iveryMode|ay)|bug(?:ID)?)|a(?:yOfWeekNames|t(?:e(?:Filter)?|a(?:Mapping(?:s)?|Item(?:Text|Property|Format)|Provider|All(?:Height|Property|Format|Width))?))|ra(?:wConnectors|gContent))|U(?:se(?:Shadow|HandCursor|EchoSuppression|rInput|Fade)|TC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear))|P(?:osition|ercentComplete|an(?:e(?:M(?:inimumSize|aximumSize)|Size|Title))?|ro(?:pert(?:y(?:Data)?|iesAt)|gress))|E(?:nabled|dit(?:Handler|able)|xpand(?:NodeTrigger|erSymbolName))|V(?:Scroll|olume|alue(?:Source)?)|KeyFrameInterval|Quality|F(?:i(?:eld|rst(?:DayOfWeek|VisibleNode))|ocus|ullYear|ps|ade(?:InLength|OutLength)|rame(?:Color|Width))|Width|L(?:ine(?:Color|Weight)|o(?:opback|adTarget)|a(?:rgeScroll|bel(?:Source|Placement)?))|A(?:s(?:Boolean|String|Number)|n(?:yTypedValue|imation)|ctiv(?:e(?:State(?:Handler)?|Handler)|ateHandler)|utoH(?:ideScrollBar|eight)))?|paratorBefore|ek|lect(?:ion(?:Disabled|Unfocused)?|ed(?:Node(?:s)?|Child|I(?:nd(?:ices|ex)|tem(?:s)?)|Dat(?:e|a))?|able(?:Ranges)?)|rver(?:String)?)|kip|qrt|wapDepths|lice|aveToSharedObj|moothing)|h(?:scroll(?:Policy)?|tml(?:Text)?|i(?:t(?:Test(?:TextNearPos)?|Area)|de(?:BuiltInItems|Child)?|ghlight(?:2D|3D)?)|orizontal|e(?:ight|ader(?:Re(?:nderer|lease)|Height|Text))|P(?:osition|ageScrollSize)|a(?:s(?:childNodes|MP3|S(?:creen(?:Broadcast|Playback)|treaming(?:Video|Audio)|ort)|Next|OwnProperty|Pr(?:inting|evious)|EmbeddedVideo|VideoEncoder|A(?:ccesibility|udio(?:Encoder)?))|ndlerName)|LineScrollSize)|ye(?:sLabel|ar)|n(?:o(?:t|de(?:Name|Close|Type|Open|Value)|Label)|u(?:llValue|mChild(?:S(?:creens|lides)|ren|Forms))|e(?:w(?:Item|line|Value|LocationDialog)|xt(?:S(?:cene|ibling|lide)|TabIndex|Value|Frame)?)?|ame(?:s)?)|c(?:h(?:ildNodes|eck|a(?:nge(?:sPending)?|r(?:CodeAt|At))|r)|o(?:s|n(?:st(?:ant|ructor)|nect|c(?:urrency|at)|t(?:ent(?:Type|Path)?|ains|rol(?:Placement|lerPolicy))|denseWhite|version)|py|l(?:or|umn(?:Stretch|Name(?:s)?|Count))|m(?:p(?:onent|lete)|ment))|u(?:stomItems|ePoint(?:s)?|r(?:veTo|Value|rent(?:Slide|ChildSlide|Item|F(?:ocused(?:S(?:creen|lide)|Form)|ps))))|e(?:il|ll(?:Renderer|Press|Edit|Focus(?:In|Out)))|l(?:i(?:ck|ents)|o(?:se(?:Button|Pane)?|ne(?:Node)?)|ear(?:S(?:haredObjects|treams)|Timeout|Interval)?)|a(?:ncelLabel|tch|p(?:tion|abilities)|l(?:cFields|l(?:e(?:e|r))?))|reate(?:GatewayConnection|Menu|Se(?:rver|gment)|C(?:hild(?:AtDepth)?|l(?:ient|ass(?:ChildAtDepth|Object(?:AtDepth)?))|all)|Text(?:Node|Field)|Item|Object(?:AtDepth)?|PopUp|E(?:lement|mptyMovieClip)))|t(?:h(?:is|row)|ype(?:of|Name)?|i(?:tle(?:StyleDeclaration)?|me(?:out)?)|o(?:talTime|String|olTipText|p|UpperCase|ggle(?:HighQuality)?|Lo(?:caleString|werCase))|e(?:st|llTarget|xt(?:RightMargin|Bold|S(?:ize|elected)|Height|Color|I(?:ndent|talic)|Disabled|Underline|F(?:ield|ont)|Width|LeftMargin|Align)?)|a(?:n|rget(?:Path)?|b(?:Stops|Children|Index|Enabled|leName))|r(?:y|igger|ac(?:e|k(?:AsMenu)?)))|i(?:s(?:Running|Branch|NaN|Con(?:soleOpen|nected)|Toggled|Installed|Open|D(?:own|ebugger)|P(?:urchased|ro(?:totypeOf|pertyEnumerable))|Empty|F(?:inite|ullyPopulated)|Local|Active)|n(?:s(?:tall|ertBefore)|cludeDeltaPacketInfo|t|it(?:ialize|Component|Pod|A(?:pplication|gent))?|de(?:nt|terminate|x(?:InParent(?:Slide|Form)?|Of)?)|put|validate|finity|LocalInternetCache)?|con(?:F(?:ield|unction))?|t(?:e(?:ratorScrolled|m(?:s|RollO(?:ut|ver)|ClassName))|alic)|d3|p|fFrameLoaded|gnore(?:Case|White))|o(?:s|n(?:R(?:ollO(?:ut|ver)|e(?:s(?:ize|ult)|l(?:ease(?:Outside)?|aseOutside)))|XML|Mouse(?:Move|Down|Up|Wheel)|S(?:ync|croller|tatus|oundComplete|e(?:tFocus|lect(?:edItem)?))|N(?:oticeEvent|etworkChange)|C(?:hanged|onnect|l(?:ipEvent|ose))|ID3|D(?:isconnect|eactivate|ata|ragO(?:ut|ver))|Un(?:install|load)|P(?:aymentResult|ress)|EnterFrame|K(?:illFocus|ey(?:Down|Up))|Fault|Lo(?:ad|g)|A(?:ctiv(?:ity|ate)|ppSt(?:op|art)))?|pe(?:n|ration)|verLayChildren|kLabel|ldValue|r(?:d)?)|d(?:i(?:s(?:connect|play(?:Normal|ed(?:Month|Year)|Full)|able(?:Shader|d(?:Ranges|Days)|CloseBox|Events))|rection)|o(?:cTypeDecl|tall|Decoding|main|LazyDecoding)|u(?:plicateMovieClip|ration)|e(?:stroy(?:ChildAt|Object)|code|fault(?:PushButton(?:Enabled)?|KeydownHandler)?|l(?:ta(?:Packet(?:Changed)?)?|ete(?:PopUp|All)?)|blocking)|a(?:shBoardSave|yNames|ta(?:Provider)?|rkshadow)|r(?:opdown(?:Width)?|a(?:w|gO(?:ut|ver))))|u(?:se(?:Sort|HandCursor|Codepage|EchoSuppression)|n(?:shift|install|derline|escape|format|watch|lo(?:ck|ad(?:Movie(?:Num)?)?))|pdate(?:Results|Mode|I(?:nputProperties|tem(?:ByIndex)?)|P(?:acket|roperties)|View|AfterEvent)|rl)|join|p(?:ixelAspectRatio|o(?:sition|p|w)|u(?:sh|rge|blish)|ercen(?:tComplete|Loaded)|lay(?:head(?:Change|Time)|ing|Hidden|erType)?|a(?:ssword|use|r(?:se(?:XML|CSS|Int|Float)|ent(?:Node|Is(?:S(?:creen|lide)|Form))|ams))|r(?:int(?:Num|AsBitmap(?:Num)?)?|o(?:to(?:type)?|pert(?:y|ies)|gress)|e(?:ss|v(?:ious(?:S(?:ibling|lide)|Value)?|Scene|Frame)|ferred(?:Height|Width))))|e(?:scape|n(?:code(?:r)?|ter(?:Frame)?|dFill|able(?:Shader|d|CloseBox|Events))|dit(?:able|Field|LocationDialog)|v(?:ent|al(?:uate)?)|q|x(?:tended|p|ec(?:ute)?|actSettings)|m(?:phasized(?:StyleDeclaration)?|bedFonts))|v(?:i(?:sible|ewPod)|ScrollPolicy|o(?:id|lume)|ersion|P(?:osition|ageScrollSize)|a(?:l(?:idat(?:ionError|e(?:Property|ActivationKey)?)|ue(?:Of)?)|riable)|LineScrollSize)|k(?:ind|ey(?:Down|Up|Press|FrameInterval))|q(?:sort|uality)|f(?:scommand|i(?:n(?:d(?:Text|First|Last)?|ally)|eldInfo|lter(?:ed|Func)?|rst(?:Slide|Child|DayOfWeek|VisibleNode)?)|o(?:nt|cus(?:In|edCell|Out|Enabled)|r(?:egroundDisabled|mat(?:ter)?))|unctionName|ps|l(?:oor|ush)|ace|romCharCode)|w(?:i(?:th|dth)|ordWrap|atch|riteAccess)|l(?:t|i(?:st(?:Owner)?|ne(?:Style|To))|o(?:c(?:k|a(?:t(?:ion|eByld)|l(?:ToGlobal|FileReadDisable)))|opback|ad(?:Movie(?:Num)?|S(?:crollContent|ound)|ed|Variables(?:Num)?|Application)?|g(?:Changes)?)|e(?:ngth|ft(?:Margin)?|ading)?|a(?:st(?:Slide|Child|Index(?:Of)?)?|nguage|b(?:el(?:Placement|F(?:ield|unction))?|leField)))|a(?:s(?:scociate(?:Controller|Display)|in|pectRatio|function)|nd|c(?:ceptConnection|tiv(?:ityLevel|ePlayControl)|os)|t(?:t(?:ach(?:Movie|Sound|Video|Audio)|ributes)|an(?:2)?)|dd(?:header|RequestHeader|Menu(?:Item(?:At)?|At)?|Sort|Header|No(?:tice|de(?:At)?)|C(?:olumn(?:At)?|uePoint)|T(?:oLocalInternetCache|reeNode(?:At)?)|I(?:con|tem(?:s(?:At)?|At)?)|DeltaItem|P(?:od|age|roperty)|EventListener|View|FieldInfo|Listener|Animation)?|uto(?:Size|Play|KeyNav|Load)|pp(?:endChild|ly(?:Changes|Updates)?)|vHardwareDisable|fterLoaded|l(?:ternateRowColors|ign|l(?:ow(?:InsecureDomain|Domain)|Transitions(?:InDone|OutDone))|bum)|r(?:tist|row|g(?:uments|List))|gent|bs)|r(?:ight(?:Margin)?|o(?:ot(?:S(?:creen|lide)|Form)|und|w(?:Height|Count)|llO(?:ut|ver))|e(?:s(?:yncDepth|t(?:orePane|artAnimation|rict)|iz(?:e|able(?:Columns)?)|olveDelta|ult(?:s)?|ponse)|c(?:o(?:ncile(?:Results|Updates)|rd)|eive(?:Video|Audio))|draw|jectConnection|place(?:Sel|ItemAt|AllItems)?|ve(?:al(?:Child)?|rse)|quest(?:SizeChange|Payment)?|f(?:errer|resh(?:ScrollContent|Destinations|Pane|FromSources)?)|lease(?:Outside)?|ad(?:Only|Access)|gister(?:SkinElement|C(?:olor(?:Style|Name)|lass)|InheritingStyle|Proxy)|move(?:Range|M(?:ovieClip|enu(?:Item(?:At)?|At))|Background|Sort|No(?:tice|de(?:sAt|At)?)|C(?:olum(?:nAt|At)|uePoints)|T(?:extField|reeNode(?:At)?)|Item(?:At)?|Pod|EventListener|FromLocalInternetCache|Listener|All(?:C(?:olumns|uePoints)|Items)?))|a(?:ndom|te|dioDot))|g(?:t|oto(?:Slide|NextSlide|PreviousSlide|FirstSlide|LastSlide|And(?:Stop|Play))|e(?:nre|t(?:R(?:GB|o(?:otNode|wCount)|e(?:sizable|mote))|X(?:AxisTitle)?|M(?:i(?:n(?:imum(?:Size)?|utes)|lliseconds)|onth(?:Names)?|ultilineMode|e(?:ssage|nu(?:ItemAt|EnabledAt|At))|aximum(?:Size)?)|B(?:ytes(?:Total|Loaded)|ounds|utton(?:s|Width)|eginIndex|a(?:ndwidthLimit|ckground))|S(?:howAsDisabled|croll(?:ing|Speed|Content|Position|barState|Location)|t(?:yle(?:Names)?|opOnFocus|ate)|ize|o(?:urce|rtState)|p(?:litterBarPosition|acing)|e(?:conds|lect(?:Multiple|ion(?:Required|Type)|Style|ed(?:Node(?:s)?|Cell|Text|I(?:nd(?:ices|ex)|tem(?:s)?))?)|rvice)|moothness|WFVersion)|H(?:ighlight(?:s|Color)|ours|e(?:ight|ader(?:Height|Text|Property|Format|Width|Location)?)|as(?:Shader|CloseBox))|Y(?:ear|AxisTitle)?|N(?:o(?:tices|de(?:DisplayedAt|At))|um(?:Children|berAvailable)|e(?:wTextFormat|xtHighestDepth))|C(?:h(?:ild(?:S(?:creen|lide)|Nodes|Form|At)|artTitle)|o(?:n(?:tent|figInfo)|okie|de|unt|lumn(?:Names|Count|Index|At))|uePoint|ellIndex|loseHandler|a(?:ll|retIndex))|T(?:ypedValue|i(?:tle(?:barHeight)?|p(?:Target|Offset)?|me(?:stamp|zoneOffset|out(?:State|Handler)|r)?)|oggle|ext(?:Extent|Format)?|r(?:ee(?:NodeAt|Length)|ans(?:form|actionId)))|I(?:s(?:Branch|Open)|n(?:stanceAtDepth|d(?:icesByKey|exByKey))|con(?:SymbolName)?|te(?:rator|m(?:sByKey|By(?:Name|Key)|id|ID|At))|d)|O(?:utput(?:Parameter(?:s|ByName)?|Value(?:s)?)|peration|ri(?:entation|ginalCellData))|D(?:i(?:s(?:play(?:Range|Mode|Clip|Index|edMonth)|kUsage)|rection)|uration|e(?:pth|faultNodeIconSymbolName|l(?:taPacket|ay)|bug(?:Config|ID)?)|a(?:y(?:OfWeekNames)?|t(?:e|a(?:Mapping(?:s)?|Item(?:Text|Property|Format)|Label|All(?:Height|Property|Format|Width))?))|rawConnectors)|U(?:se(?:Shadow|HandCursor|rInput|Fade)|RL|TC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear))|P(?:o(?:sition|ds)|ercentComplete|a(?:n(?:e(?:M(?:inimums|aximums)|Height|Title|Width))?|rentNode)|r(?:operty(?:Name|Data)?|efer(?:ences|red(?:Height|Width))))|E(?:n(?:dIndex|abled)|ditingData|x(?:panderSymbolName|andNodeTrigger))|V(?:iewed(?:Pods|Applications)|olume|ersion|alue(?:Source)?)|F(?:i(?:eld|rst(?:DayOfWeek|VisibleNode))|o(?:ntList|cus)|ullYear|ade(?:InLength|OutLength)|rame(?:Color|Width))|Width|L(?:ine(?:Color|Weight)|o(?:cal|adTarget)|ength|a(?:stTabIndex|bel(?:Source)?))|A(?:s(?:cii|Boolean|String|Number)|n(?:yTypedValue|imation)|ctiv(?:eState(?:Handler)?|ateHandler)|utoH(?:ideScrollBar|eight)|llItems|gent))?)?|lobal(?:StyleFormat|ToLocal)?|ain|roupName)|x(?:updatePackety|mlDecl)?|m(?:y(?:MethodName|Call)|in(?:imum)?|o(?:nthNames|tion(?:TimeOut|Level)|de(?:lChanged)?|use(?:Move|O(?:ut|ver)|Down(?:Somewhere|Outside)?|Up(?:Somewhere)?|WheelEnabled)|ve(?:To)?)|u(?:ted|lti(?:pleS(?:imultaneousAllowed|elections)|line))|e(?:ssage|nu(?:Show|Hide)?|th(?:od)?|diaType)|a(?:nufacturer|tch|x(?:scroll|hscroll|imum|HPosition|Chars|VPosition)?)|b(?:substring|chr|ord|length))|b(?:ytes(?:Total|Loaded)|indFormat(?:Strings|Function)|o(?:ttom(?:Scroll)?|ld|rder(?:Color)?)|u(?:tton(?:Height|Width)|iltInItems|ffer(?:Time|Length)|llet)|e(?:foreApplyUpdates|gin(?:GradientFill|Fill))|lockIndent|a(?:ndwidth|ckground(?:Style|Color|Disabled)?)|roadcastMessage)|onHTTPStatus)\\b' }, + { token: 'support.constant.actionscript.2', + regex: '\\b(?:__proto__|__resolve|_accProps|_alpha|_changed|_currentframe|_droptarget|_flash|_focusrect|_framesloaded|_global|_height|_highquality|_level|_listeners|_lockroot|_name|_parent|_quality|_root|_rotation|_soundbuftime|_target|_totalframes|_url|_visible|_width|_x|_xmouse|_xscale|_y|_ymouse|_yscale)\\b' }, + { token: 'keyword.control.actionscript.2', + regex: '\\b(?:dynamic|extends|import|implements|interface|public|private|new|static|super|var|for|in|break|continue|while|do|return|if|else|case|switch)\\b' }, + { token: 'storage.type.actionscript.2', + regex: '\\b(?:Boolean|Number|String|Void)\\b' }, + { token: 'constant.language.actionscript.2', + regex: '\\b(?:null|undefined|true|false)\\b' }, + { token: 'constant.numeric.actionscript.2', + regex: '\\b(?:0(?:x|X)[0-9a-fA-F]*|(?:[0-9]+\\.?[0-9]*|\\.[0-9]+)(?:(?:e|E)(?:\\+|-)?[0-9]+)?)(?:L|l|UL|ul|u|U|F|f)?\\b' }, + { token: 'punctuation.definition.string.begin.actionscript.2', + regex: '"', + push: + [ { token: 'punctuation.definition.string.end.actionscript.2', + regex: '"', + next: 'pop' }, + { token: 'constant.character.escape.actionscript.2', + regex: '\\\\.' }, + { defaultToken: 'string.quoted.double.actionscript.2' } ] }, + { token: 'punctuation.definition.string.begin.actionscript.2', + regex: '\'', + push: + [ { token: 'punctuation.definition.string.end.actionscript.2', + regex: '\'', + next: 'pop' }, + { token: 'constant.character.escape.actionscript.2', + regex: '\\\\.' }, + { defaultToken: 'string.quoted.single.actionscript.2' } ] }, + { token: 'support.constant.actionscript.2', + regex: '\\b(?:BACKSPACE|CAPSLOCK|CONTROL|DELETEKEY|DOWN|END|ENTER|HOME|INSERT|LEFT|LN10|LN2|LOG10E|LOG2E|MAX_VALUE|MIN_VALUE|NEGATIVE_INFINITY|NaN|PGDN|PGUP|PI|POSITIVE_INFINITY|RIGHT|SPACE|SQRT1_2|SQRT2|UP)\\b' }, + { token: 'punctuation.definition.comment.actionscript.2', + regex: '/\\*', + push: + [ { token: 'punctuation.definition.comment.actionscript.2', + regex: '\\*/', + next: 'pop' }, + { defaultToken: 'comment.block.actionscript.2' } ] }, + { token: 'punctuation.definition.comment.actionscript.2', + regex: '//.*$', + push_: + [ { token: 'comment.line.double-slash.actionscript.2', + regex: '$', + next: 'pop' }, + { defaultToken: 'comment.line.double-slash.actionscript.2' } ] }, + { token: 'keyword.operator.actionscript.2', + regex: '\\binstanceof\\b' }, + { token: 'keyword.operator.symbolic.actionscript.2', + regex: '[-!%&*+=/?:]' }, + { token: + [ 'meta.preprocessor.actionscript.2', + 'punctuation.definition.preprocessor.actionscript.2', + 'meta.preprocessor.actionscript.2' ], + regex: '^([ \\t]*)(#)([a-zA-Z]+)' }, + { token: + [ 'storage.type.function.actionscript.2', + 'meta.function.actionscript.2', + 'entity.name.function.actionscript.2', + 'meta.function.actionscript.2', + 'punctuation.definition.parameters.begin.actionscript.2' ], + regex: '\\b(function)(\\s+)([a-zA-Z_]\\w*)(\\s*)(\\()', + push: + [ { token: 'punctuation.definition.parameters.end.actionscript.2', + regex: '\\)', + next: 'pop' }, + { token: 'variable.parameter.function.actionscript.2', + regex: '[^,)$]+' }, + { defaultToken: 'meta.function.actionscript.2' } ] }, + { token: + [ 'storage.type.class.actionscript.2', + 'meta.class.actionscript.2', + 'entity.name.type.class.actionscript.2', + 'meta.class.actionscript.2', + 'storage.modifier.extends.actionscript.2', + 'meta.class.actionscript.2', + 'entity.other.inherited-class.actionscript.2' ], + regex: '\\b(class)(\\s+)([a-zA-Z_](?:\\w|\\.)*)(?:(\\s+)(extends)(\\s+)([a-zA-Z_](?:\\w|\\.)*))?' } ] } + + this.normalizeRules(); +}; + +ActionScriptHighlightRules.metaData = { fileTypes: [ 'as' ], + keyEquivalent: '^~A', + name: 'ActionScript', + scopeName: 'source.actionscript.2' } + + +oop.inherits(ActionScriptHighlightRules, TextHighlightRules); + +exports.ActionScriptHighlightRules = ActionScriptHighlightRules; +}); + +ace.define('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var line = session.getLine(row); + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i + match[0].length, 1); + } + + if (foldStyle !== "markbeginend") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + +}).call(FoldMode.prototype); + +}); diff --git a/0.0.3_0/ace/mode-ada.js b/0.0.3_0/ace/mode-ada.js new file mode 100644 index 0000000..510e813 --- /dev/null +++ b/0.0.3_0/ace/mode-ada.js @@ -0,0 +1,117 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2010, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/mode/ada', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/ada_highlight_rules', 'ace/range'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var AdaHighlightRules = require("./ada_highlight_rules").AdaHighlightRules; +var Range = require("../range").Range; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new AdaHighlightRules().getRules()); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "--"; + +}).call(Mode.prototype); + +exports.Mode = Mode; + +}); + +ace.define('ace/mode/ada_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var AdaHighlightRules = function() { +var keywords = "abort|else|new|return|abs|elsif|not|reverse|abstract|end|null|accept|entry|select|" + +"access|exception|of|separate|aliased|exit|or|some|all|others|subtype|and|for|out|synchronized|" + +"array|function|overriding|at|tagged|generic|package|task|begin|goto|pragma|terminate|" + +"body|private|then|if|procedure|type|case|in|protected|constant|interface|until|" + +"|is|raise|use|declare|range|delay|limited|record|when|delta|loop|rem|while|digits|renames|with|do|mod|requeue|xor"; + + var builtinConstants = ( + "true|false|null" + ); + + var builtinFunctions = ( + "count|min|max|avg|sum|rank|now|coalesce|main" + ); + + var keywordMapper = this.createKeywordMapper({ + "support.function": builtinFunctions, + "keyword": keywords, + "constant.language": builtinConstants + }, "identifier", true); + + this.$rules = { + "start" : [ { + token : "comment", + regex : "--.*$" + }, { + token : "string", // " string + regex : '".*?"' + }, { + token : "string", // ' string + regex : "'.*?'" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "keyword.operator", + regex : "\\+|\\-|\\/|\\/\\/|%|<@>|@>|<@|&|\\^|~|<|>|<=|=>|==|!=|<>|=" + }, { + token : "paren.lparen", + regex : "[\\(]" + }, { + token : "paren.rparen", + regex : "[\\)]" + }, { + token : "text", + regex : "\\s+" + } ] + }; +}; + +oop.inherits(AdaHighlightRules, TextHighlightRules); + +exports.AdaHighlightRules = AdaHighlightRules; +}); \ No newline at end of file diff --git a/0.0.3_0/ace/mode-asciidoc.js b/0.0.3_0/ace/mode-asciidoc.js new file mode 100644 index 0000000..c303320 --- /dev/null +++ b/0.0.3_0/ace/mode-asciidoc.js @@ -0,0 +1,372 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2010, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/mode/asciidoc', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/asciidoc_highlight_rules', 'ace/mode/folding/asciidoc'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var AsciidocHighlightRules = require("./asciidoc_highlight_rules").AsciidocHighlightRules; +var AsciidocFoldMode = require("./folding/asciidoc").FoldMode; + +var Mode = function() { + var highlighter = new AsciidocHighlightRules(); + + this.$tokenizer = new Tokenizer(highlighter.getRules()); + this.foldingRules = new AsciidocFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + this.getNextLineIndent = function(state, line, tab) { + if (state == "listblock") { + var match = /^((?:.+)?)([-+*][ ]+)/.exec(line); + if (match) { + return new Array(match[1].length + 1).join(" ") + match[2]; + } else { + return ""; + } + } else { + return this.$getIndent(line); + } + }; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/asciidoc_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var AsciidocHighlightRules = function() { + var identifierRe = "[a-zA-Z\u00a1-\uffff]+\\b"; + + this.$rules = { + "start": [ + {token: "empty", regex: /$/}, + {token: "literal", regex: /^\.{4,}\s*$/, next: "listingBlock"}, + {token: "literal", regex: /^-{4,}\s*$/, next: "literalBlock"}, + {token: "string", regex: /^\+{4,}\s*$/, next: "passthroughBlock"}, + {token: "keyword", regex: /^={4,}\s*$/}, + {token: "text", regex: /^\s*$/}, + {token: "empty", regex: "", next: "dissallowDelimitedBlock"} + ], + + "dissallowDelimitedBlock": [ + {include: "paragraphEnd"}, + {token: "comment", regex: '^//.+$'}, + {token: "keyword", regex: "^(?:NOTE|TIP|IMPORTANT|WARNING|CAUTION):"}, + + {include: "listStart"}, + {token: "literal", regex: /^\s+.+$/, next: "indentedBlock"}, + {token: "empty", regex: "", next: "text"} + ], + + "paragraphEnd": [ + {token: "doc.comment", regex: /^\/{4,}\s*$/, next: "commentBlock"}, + {token: "tableBlock", regex: /^\s*[|!]=+\s*$/, next: "tableBlock"}, + {token: "keyword", regex: /^(?:--|''')\s*$/, next: "start"}, + {token: "option", regex: /^\[.*\]\s*$/, next: "start"}, + {token: "pageBreak", regex: /^>{3,}$/, next: "start"}, + {token: "literal", regex: /^\.{4,}\s*$/, next: "listingBlock"}, + {token: "titleUnderline", regex: /^(?:={2,}|-{2,}|~{2,}|\^{2,}|\+{2,})\s*$/, next: "start"}, + {token: "singleLineTitle", regex: /^={1,5}\s+\S.*$/, next: "start"}, + + {token: "otherBlock", regex: /^(?:\*{2,}|_{2,})\s*$/, next: "start"}, + {token: "optionalTitle", regex: /^\.[^.\s].+$/, next: "start"} + ], + + "listStart": [ + {token: "keyword", regex: /^\s*(?:\d+\.|[a-zA-Z]\.|[ixvmIXVM]+\)|\*{1,5}|-|\.{1,5})\s/, next: "listText"}, + {token: "meta.tag", regex: /^.+(?::{2,4}|;;)(?: |$)/, next: "listText"}, + {token: "support.function.list.callout", regex: /^(?:<\d+>|\d+>|>) /, next: "text"}, + {token: "keyword", regex: /^\+\s*$/, next: "start"} + ], + + "text": [ + {token: ["link", "variable.language"], regex: /((?:https?:\/\/|ftp:\/\/|file:\/\/|mailto:|callto:)[^\s\[]+)(\[.*?\])/}, + {token: "link", regex: /(?:https?:\/\/|ftp:\/\/|file:\/\/|mailto:|callto:)[^\s\[]+/}, + {token: "link", regex: /\b[\w\.\/\-]+@[\w\.\/\-]+\b/}, + {include: "macros"}, + {include: "paragraphEnd"}, + {token: "literal", regex:/\+{3,}/, next:"smallPassthrough"}, + {token: "escape", regex: /\((?:C|TM|R)\)|\.{3}|->|<-|=>|<=|&#(?:\d+|x[a-fA-F\d]+);|(?: |^)--(?=\s+\S)/}, + {token: "escape", regex: /\\[_*'`+#]|\\{2}[_*'`+#]{2}/}, + {token: "keyword", regex: /\s\+$/}, + {token: "text", regex: identifierRe}, + {token: ["keyword", "string", "keyword"], + regex: /(<<[\w\d\-$]+,)(.*?)(>>|$)/}, + {token: "keyword", regex: /<<[\w\d\-$]+,?|>>/}, + {token: "constant.character", regex: /\({2,3}.*?\){2,3}/}, + {token: "keyword", regex: /\[\[.+?\]\]/}, + {token: "support", regex: /^\[{3}[\w\d =\-]+\]{3}/}, + + {include: "quotes"}, + {token: "empty", regex: /^\s*$/, next: "start"} + ], + + "listText": [ + {include: "listStart"}, + {include: "text"} + ], + + "indentedBlock": [ + {token: "literal", regex: /^[\s\w].+$/, next: "indentedBlock"}, + {token: "literal", regex: "", next: "start"} + ], + + "listingBlock": [ + {token: "literal", regex: /^\.{4,}\s*$/, next: "dissallowDelimitedBlock"}, + {token: "constant.numeric", regex: '<\\d+>'}, + {token: "literal", regex: '[^<]+'}, + {token: "literal", regex: '<'} + ], + "literalBlock": [ + {token: "literal", regex: /^-{4,}\s*$/, next: "dissallowDelimitedBlock"}, + {token: "constant.numeric", regex: '<\\d+>'}, + {token: "literal", regex: '[^<]+'}, + {token: "literal", regex: '<'} + ], + "passthroughBlock": [ + {token: "literal", regex: /^\+{4,}\s*$/, next: "dissallowDelimitedBlock"}, + {token: "literal", regex: identifierRe + "|\\d+"}, + {include: "macros"}, + {token: "literal", regex: "."} + ], + + "smallPassthrough": [ + {token: "literal", regex: /[+]{3,}/, next: "dissallowDelimitedBlock"}, + {token: "literal", regex: /^\s*$/, next: "dissallowDelimitedBlock"}, + {token: "literal", regex: identifierRe + "|\\d+"}, + {include: "macros"} + ], + + "commentBlock": [ + {token: "doc.comment", regex: /^\/{4,}\s*$/, next: "dissallowDelimitedBlock"}, + {token: "doc.comment", regex: '^.*$'} + ], + "tableBlock": [ + {token: "tableBlock", regex: /^\s*\|={3,}\s*$/, next: "dissallowDelimitedBlock"}, + {token: "tableBlock", regex: /^\s*!={3,}\s*$/, next: "innerTableBlock"}, + {token: "tableBlock", regex: /\|/}, + {include: "text", noEscape: true} + ], + "innerTableBlock": [ + {token: "tableBlock", regex: /^\s*!={3,}\s*$/, next: "tableBlock"}, + {token: "tableBlock", regex: /^\s*|={3,}\s*$/, next: "dissallowDelimitedBlock"}, + {token: "tableBlock", regex: /\!/} + ], + "macros": [ + {token: "macro", regex: /{[\w\-$]+}/}, + {token: ["text", "string", "text", "constant.character", "text"], regex: /({)([\w\-$]+)(:)?(.+)?(})/}, + {token: ["text", "markup.list.macro", "keyword", "string"], regex: /(\w+)(footnote(?:ref)?::?)([^\s\[]+)?(\[.*?\])?/}, + {token: ["markup.list.macro", "keyword", "string"], regex: /([a-zA-Z\-][\w\.\/\-]*::?)([^\s\[]+)(\[.*?\])?/}, + {token: ["markup.list.macro", "keyword"], regex: /([a-zA-Z\-][\w\.\/\-]+::?)(\[.*?\])/}, + {token: "keyword", regex: /^:.+?:(?= |$)/} + ], + + "quotes": [ + {token: "string.italic", regex: /__[^_\s].*?__/}, + {token: "string.italic", regex: quoteRule("_")}, + + {token: "keyword.bold", regex: /\*\*[^*\s].*?\*\*/}, + {token: "keyword.bold", regex: quoteRule("\\*")}, + + {token: "literal", regex: quoteRule("\\+")}, + {token: "literal", regex: /\+\+[^+\s].*?\+\+/}, + {token: "literal", regex: /\$\$.+?\$\$/}, + {token: "literal", regex: quoteRule("`")}, + + {token: "keyword", regex: quoteRule("^")}, + {token: "keyword", regex: quoteRule("~")}, + {token: "keyword", regex: /##?/}, + {token: "keyword", regex: /(?:\B|^)``|\b''/} + ] + + }; + + function quoteRule(ch) { + var prefix = /\w/.test(ch) ? "\\b" : "(?:\\B|^)"; + return prefix + ch + "[^" + ch + "].*?" + ch + "(?![\\w*])"; + } + + var tokenMap = { + macro: "constant.character", + tableBlock: "doc.comment", + titleUnderline: "markup.heading", + singleLineTitle: "markup.heading", + pageBreak: "string", + option: "string.regexp", + otherBlock: "markup.list", + literal: "support.function", + optionalTitle: "constant.numeric", + escape: "constant.language.escape", + link: "markup.underline.list" + }; + + for (var state in this.$rules) { + var stateRules = this.$rules[state]; + for (var i = stateRules.length; i--; ) { + var rule = stateRules[i]; + if (rule.include || typeof rule == "string") { + var args = [i, 1].concat(this.$rules[rule.include || rule]); + if (rule.noEscape) { + args = args.filter(function(x) { + return !x.next; + }); + } + stateRules.splice.apply(stateRules, args); + } else if (rule.token in tokenMap) { + rule.token = tokenMap[rule.token]; + } + } + } +}; +oop.inherits(AsciidocHighlightRules, TextHighlightRules); + +exports.AsciidocHighlightRules = AsciidocHighlightRules; +}); + +ace.define('ace/mode/folding/asciidoc', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/folding/fold_mode', 'ace/range'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var BaseFoldMode = require("./fold_mode").FoldMode; +var Range = require("../../range").Range; + +var FoldMode = exports.FoldMode = function() {}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + this.foldingStartMarker = /^(?:\|={10,}|[\.\/=\-~^+]{4,}\s*$|={1,5} )/; + this.singleLineHeadingRe = /^={1,5}(?=\s+\S)/; + + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + if (!this.foldingStartMarker.test(line)) + return "" + + if (line[0] == "=") { + if (this.singleLineHeadingRe.test(line)) + return "start"; + if (session.getLine(row - 1).length != session.getLine(row).length) + return ""; + return "start"; + } + if (session.bgTokenizer.getState(row) == "dissallowDelimitedBlock") + return "end"; + return "start"; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var line = session.getLine(row); + var startColumn = line.length; + var maxRow = session.getLength(); + var startRow = row; + var endRow = row; + if (!line.match(this.foldingStartMarker)) + return; + + var token; + function getTokenType(row) { + token = session.getTokens(row)[0]; + return token && token.type; + } + + var levels = ["=","-","~","^","+"]; + var heading = "markup.heading"; + var singleLineHeadingRe = this.singleLineHeadingRe; + function getLevel() { + var match = token.value.match(singleLineHeadingRe); + if (match) + return match[0].length; + var level = levels.indexOf(token.value[0]) + 1; + if (level == 1) { + if (session.getLine(row - 1).length != session.getLine(row).length) + return Infinity; + } + return level; + } + + if (getTokenType(row) == heading) { + var startHeadingLevel = getLevel(); + while (++row < maxRow) { + if (getTokenType(row) != heading) + continue; + var level = getLevel(); + if (level <= startHeadingLevel) + break; + } + + var isSingleLineHeading = token && token.value.match(this.singleLineHeadingRe); + endRow = isSingleLineHeading ? row - 1 : row - 2; + + if (endRow > startRow) { + while (endRow > startRow && (!getTokenType(endRow) || token.value[0] == "[")) + endRow--; + } + + if (endRow > startRow) { + var endColumn = session.getLine(endRow).length; + return new Range(startRow, startColumn, endRow, endColumn); + } + } else { + var state = session.bgTokenizer.getState(row); + if (state == "dissallowDelimitedBlock") { + while (row -- > 0) { + if (session.bgTokenizer.getState(row).lastIndexOf("Block") == -1) + break; + } + endRow = row + 1; + if (endRow < startRow) { + var endColumn = session.getLine(row).length; + return new Range(endRow, 5, startRow, startColumn - 5); + } + } else { + while (++row < maxRow) { + if (session.bgTokenizer.getState(row) == "dissallowDelimitedBlock") + break; + } + endRow = row; + if (endRow > startRow) { + var endColumn = session.getLine(row).length; + return new Range(startRow, 5, endRow, endColumn - 5); + } + } + } + }; + +}).call(FoldMode.prototype); + +}); diff --git a/0.0.3_0/ace/mode-assembly_x86.js b/0.0.3_0/ace/mode-assembly_x86.js new file mode 100644 index 0000000..2965beb --- /dev/null +++ b/0.0.3_0/ace/mode-assembly_x86.js @@ -0,0 +1,217 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2012, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/mode/assembly_x86', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/assembly_x86_highlight_rules', 'ace/mode/folding/coffee'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var AssemblyX86HighlightRules = require("./assembly_x86_highlight_rules").AssemblyX86HighlightRules; +var FoldMode = require("./folding/coffee").FoldMode; + +var Mode = function() { + var highlighter = new AssemblyX86HighlightRules(); + this.foldingRules = new FoldMode(); + this.$tokenizer = new Tokenizer(highlighter.getRules()); +}; +oop.inherits(Mode, TextMode); + +(function() { + this.lineCommentStart = ";"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/assembly_x86_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var AssemblyX86HighlightRules = function() { + + this.$rules = { start: + [ { token: 'keyword.control.assembly', + regex: '\\b(?:aaa|aad|aam|aas|adc|add|addpd|addps|addsd|addss|addsubpd|addsubps|aesdec|aesdeclast|aesenc|aesenclast|aesimc|aeskeygenassist|and|andpd|andps|andnpd|andnps|arpl|blendpd|blendps|blendvpd|blendvps|bound|bsf|bsr|bswap|bt|btc|btr|bts|cbw|cwde|cdqe|clc|cld|cflush|clts|cmc|cmov(?:n?e|ge?|ae?|le?|be?|n?o|n?z)|cmp|cmppd|cmpps|cmps|cnpsb|cmpsw|cmpsd|cmpsq|cmpss|cmpxchg|cmpxchg8b|cmpxchg16b|comisd|comiss|cpuid|crc32|cvtdq2pd|cvtdq2ps|cvtpd2dq|cvtpd2pi|cvtpd2ps|cvtpi2pd|cvtpi2ps|cvtps2dq|cvtps2pd|cvtps2pi|cvtsd2si|cvtsd2ss|cvts2sd|cvtsi2ss|cvtss2sd|cvtss2si|cvttpd2dq|cvtpd2pi|cvttps2dq|cvttps2pi|cvttps2dq|cvttps2pi|cvttsd2si|cvttss2si|cwd|cdq|cqo|daa|das|dec|div|divpd|divps|divsd|divss|dppd|dpps|emms|enter|extractps|f2xm1|fabs|fadd|faddp|fiadd|fbld|fbstp|fchs|fclex|fnclex|fcmov(?:n?e|ge?|ae?|le?|be?|n?o|n?z)|fcom|fcmop|fcompp|fcomi|fcomip|fucomi|fucomip|fcos|fdecstp|fdiv|fdivp|fidiv|fdivr|fdivrp|fidivr|ffree|ficom|ficomp|fild|fincstp|finit|fnint|fist|fistp|fisttp|fld|fld1|fldl2t|fldl2e|fldpi|fldlg2|fldln2|fldz|fldcw|fldenv|fmul|fmulp|fimul|fnop|fpatan|fprem|fprem1|fptan|frndint|frstor|fsave|fnsave|fscale|fsin|fsincos|fsqrt|fst|fstp|fstcw|fnstcw|fstenv|fnstenv|fsts|fnstsw|fsub|fsubp|fisub|fsubr|fsubrp|fisubr|ftst|fucom|fucomp|fucompp|fxam|fxch|fxrstor|fxsave|fxtract|fyl2x|fyl2xp1|haddpd|haddps|husbpd|hsubps|idiv|imul|in|inc|ins|insb|insw|insd|insertps|int|into|invd|invplg|invpcid|iret|iretd|iretq|lahf|lar|lddqu|ldmxcsr|lds|les|lfs|lgs|lss|lea|leave|lfence|lgdt|lidt|llgdt|lmsw|lock|lods|lodsb|lodsw|lodsd|lodsq|lsl|ltr|maskmovdqu|maskmovq|maxpd|maxps|maxsd|maxss|mfence|minpd|minps|minsd|minss|monitor|mov|movapd|movaps|movbe|movd|movq|movddup|movdqa|movdqu|movq2q|movhlps|movhpd|movhps|movlhps|movlpd|movlps|movmskpd|movmskps|movntdqa|movntdq|movnti|movntpd|movntps|movntq|movq|movq2dq|movs|movsb|movsw|movsd|movsq|movsd|movshdup|movsldup|movss|movsx|movsxd|movupd|movups|movzx|mpsadbw|mul|mulpd|mulps|mulsd|mulss|mwait|neg|not|or|orpd|orps|out|outs|outsb|outsw|outsd|pabsb|pabsw|pabsd|packsswb|packssdw|packusdw|packuswbpaddb|paddw|paddd|paddq|paddsb|paddsw|paddusb|paddusw|palignr|pand|pandn|pause|pavgb|pavgw|pblendvb|pblendw|pclmulqdq|pcmpeqb|pcmpeqw|pcmpeqd|pcmpeqq|pcmpestri|pcmpestrm|pcmptb|pcmptgw|pcmpgtd|pcmpgtq|pcmpistri|pcmpisrm|pextrb|pextrd|pextrq|pextrw|phaddw|phaddd|phaddsw|phinposuw|phsubw|phsubd|phsubsw|pinsrb|pinsrd|pinsrq|pinsrw|pmaddubsw|pmadddwd|pmaxsb|pmaxsd|pmaxsw|pmaxsw|pmaxub|pmaxud|pmaxuw|pminsb|pminsd|pminsw|pminub|pminud|pminuw|pmovmskb|pmovsx|pmovzx|pmuldq|pmulhrsw|pmulhuw|pmulhw|pmulld|pmullw|pmuludw|pop|popa|popad|popcnt|popf|popfd|popfq|por|prefetch|psadbw|pshufb|pshufd|pshufhw|pshuflw|pshufw|psignb|psignw|psignd|pslldq|psllw|pslld|psllq|psraw|psrad|psrldq|psrlw|psrld|psrlq|psubb|psubw|psubd|psubq|psubsb|psubsw|psubusb|psubusw|test|ptest|punpckhbw|punpckhwd|punpckhdq|punpckhddq|punpcklbw|punpcklwd|punpckldq|punpckldqd|push|pusha|pushad|pushf|pushfd|pxor|prcl|rcr|rol|ror|rcpps|rcpss|rdfsbase|rdgsbase|rdmsr|rdpmc|rdrand|rdtsc|rdtscp|rep|repe|repz|repne|repnz|roundpd|roundps|roundsd|roundss|rsm|rsqrps|rsqrtss|sahf|sal|sar|shl|shr|sbb|scas|scasb|scasw|scasd|set(?:n?e|ge?|ae?|le?|be?|n?o|n?z)|sfence|sgdt|shld|shrd|shufpd|shufps|sidt|sldt|smsw|sqrtpd|sqrtps|sqrtsd|sqrtss|stc|std|stmxcsr|stos|stosb|stosw|stosd|stosq|str|sub|subpd|subps|subsd|subss|swapgs|syscall|sysenter|sysexit|sysret|teset|ucomisd|ucomiss|ud2|unpckhpd|unpckhps|unpcklpd|unpcklps|vbroadcast|vcvtph2ps|vcvtp2sph|verr|verw|vextractf128|vinsertf128|vmaskmov|vpermilpd|vpermilps|vperm2f128|vtestpd|vtestps|vzeroall|vzeroupper|wait|fwait|wbinvd|wrfsbase|wrgsbase|wrmsr|xadd|xchg|xgetbv|xlat|xlatb|xor|xorpd|xorps|xrstor|xsave|xsaveopt|xsetbv|lzcnt|extrq|insertq|movntsd|movntss|vfmaddpd|vfmaddps|vfmaddsd|vfmaddss|vfmaddsubbpd|vfmaddsubps|vfmsubaddpd|vfmsubaddps|vfmsubpd|vfmsubps|vfmsubsd|vfnmaddpd|vfnmaddps|vfnmaddsd|vfnmaddss|vfnmsubpd|vfnmusbps|vfnmusbsd|vfnmusbss|cvt|xor|cli|sti|hlt|nop|lock|wait|enter|leave|ret|loop(?:n?e|n?z)?|call|j(?:mp|n?e|ge?|ae?|le?|be?|n?o|n?z))\\b', + caseInsensitive: true }, + { token: 'variable.parameter.register.assembly', + regex: '\\b(?:CS|DS|ES|FS|GS|SS|RAX|EAX|RBX|EBX|RCX|ECX|RDX|EDX|RCX|RIP|EIP|IP|RSP|ESP|SP|RSI|ESI|SI|RDI|EDI|DI|RFLAGS|EFLAGS|FLAGS|R8-15|(?:Y|X)MM(?:[0-9]|10|11|12|13|14|15)|(?:A|B|C|D)(?:X|H|L)|CR(?:[0-4]|DR(?:[0-7]|TR6|TR7|EFER)))\\b', + caseInsensitive: true }, + { token: 'constant.character.decimal.assembly', + regex: '\\b[0-9]+\\b' }, + { token: 'constant.character.hexadecimal.assembly', + regex: '\\b0x[A-F0-9]+\\b', + caseInsensitive: true }, + { token: 'constant.character.hexadecimal.assembly', + regex: '\\b[A-F0-9]+h\\b', + caseInsensitive: true }, + { token: 'string.assembly', regex: /'([^\\']|\\.)*'/ }, + { token: 'string.assembly', regex: /"([^\\"]|\\.)*"/ }, + { token: 'support.function.directive.assembly', + regex: '^\\[', + push: + [ { token: 'support.function.directive.assembly', + regex: '\\]$', + next: 'pop' }, + { defaultToken: 'support.function.directive.assembly' } ] }, + { token: + [ 'support.function.directive.assembly', + 'support.function.directive.assembly', + 'entity.name.function.assembly' ], + regex: '(^struc)( )([_a-zA-Z][_a-zA-Z0-9]*)' }, + { token: 'support.function.directive.assembly', + regex: '^endstruc\\b' }, + { token: + [ 'support.function.directive.assembly', + 'entity.name.function.assembly', + 'support.function.directive.assembly', + 'constant.character.assembly' ], + regex: '^(%macro )([_a-zA-Z][_a-zA-Z0-9]*)( )([0-9]+)' }, + { token: 'support.function.directive.assembly', + regex: '^%endmacro' }, + { token: + [ 'text', + 'support.function.directive.assembly', + 'text', + 'entity.name.function.assembly' ], + regex: '(\\s*)(%define|%xdefine|%idefine|%undef|%assign|%defstr|%strcat|%strlen|%substr|%00|%0|%rotate|%rep|%endrep|%include|\\$\\$|\\$|%unmacro|%if|%elif|%else|%endif|%(?:el)?ifdef|%(?:el)?ifmacro|%(?:el)?ifctx|%(?:el)?ifidn|%(?:el)?ifidni|%(?:el)?ifid|%(?:el)?ifnum|%(?:el)?ifstr|%(?:el)?iftoken|%(?:el)?ifempty|%(?:el)?ifenv|%pathsearch|%depend|%use|%push|%pop|%repl|%arg|%stacksize|%local|%error|%warning|%fatal|%line|%!|%comment|%endcomment|__NASM_VERSION_ID__|__NASM_VER__|__FILE__|__LINE__|__BITS__|__OUTPUT_FORMAT__|__DATE__|__TIME__|__DATE_NUM__|_TIME__NUM__|__UTC_DATE__|__UTC_TIME__|__UTC_DATE_NUM__|__UTC_TIME_NUM__|__POSIX_TIME__|__PASS__|ISTRUC|AT|IEND|BITS 16|BITS 32|BITS 64|USE16|USE32|__SECT__|ABSOLUTE|EXTERN|GLOBAL|COMMON|CPU|FLOAT)\\b( ?)((?:[_a-zA-Z][_a-zA-Z0-9]*)?)', + caseInsensitive: true }, + { token: 'support.function.directive.assembly', + regex: '\\b(?:d[bwdqtoy]|res[bwdqto]|equ|times|align|alignb|sectalign|section|ptr|byte|word|dword|qword|incbin)\\b', + caseInsensitive: true }, + { token: 'entity.name.function.assembly', regex: '^\\s*%%[\\w.]+?:$' }, + { token: 'entity.name.function.assembly', regex: '^\\s*%\\$[\\w.]+?:$' }, + { token: 'entity.name.function.assembly', regex: '^[\\w.]+?:' }, + { token: 'entity.name.function.assembly', regex: '^[\\w.]+?\\b' }, + { token: 'comment.assembly', regex: ';.*$' } ] + } + + this.normalizeRules(); +}; + +AssemblyX86HighlightRules.metaData = { fileTypes: [ 'asm' ], + name: 'Assembly x86', + scopeName: 'source.assembly' } + + +oop.inherits(AssemblyX86HighlightRules, TextHighlightRules); + +exports.AssemblyX86HighlightRules = AssemblyX86HighlightRules; +}); + +ace.define('ace/mode/folding/coffee', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/folding/fold_mode', 'ace/range'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var BaseFoldMode = require("./fold_mode").FoldMode; +var Range = require("../../range").Range; + +var FoldMode = exports.FoldMode = function() {}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var range = this.indentationBlock(session, row); + if (range) + return range; + + var re = /\S/; + var line = session.getLine(row); + var startLevel = line.search(re); + if (startLevel == -1 || line[startLevel] != "#") + return; + + var startColumn = line.length; + var maxRow = session.getLength(); + var startRow = row; + var endRow = row; + + while (++row < maxRow) { + line = session.getLine(row); + var level = line.search(re); + + if (level == -1) + continue; + + if (line[level] != "#") + break; + + endRow = row; + } + + if (endRow > startRow) { + var endColumn = session.getLine(endRow).length; + return new Range(startRow, startColumn, endRow, endColumn); + } + }; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + var indent = line.search(/\S/); + var next = session.getLine(row + 1); + var prev = session.getLine(row - 1); + var prevIndent = prev.search(/\S/); + var nextIndent = next.search(/\S/); + + if (indent == -1) { + session.foldWidgets[row - 1] = prevIndent!= -1 && prevIndent < nextIndent ? "start" : ""; + return ""; + } + if (prevIndent == -1) { + if (indent == nextIndent && line[indent] == "#" && next[indent] == "#") { + session.foldWidgets[row - 1] = ""; + session.foldWidgets[row + 1] = ""; + return "start"; + } + } else if (prevIndent == indent && line[indent] == "#" && prev[indent] == "#") { + if (session.getLine(row - 2).search(/\S/) == -1) { + session.foldWidgets[row - 1] = "start"; + session.foldWidgets[row + 1] = ""; + return ""; + } + } + + if (prevIndent!= -1 && prevIndent < indent) + session.foldWidgets[row - 1] = "start"; + else + session.foldWidgets[row - 1] = ""; + + if (indent < nextIndent) + return "start"; + else + return ""; + }; + +}).call(FoldMode.prototype); + +}); diff --git a/0.0.3_0/ace/mode-autohotkey.js b/0.0.3_0/ace/mode-autohotkey.js new file mode 100644 index 0000000..6443a1a --- /dev/null +++ b/0.0.3_0/ace/mode-autohotkey.js @@ -0,0 +1,184 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2012, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * + * Contributor(s): + * + * + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/mode/autohotkey', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/autohotkey_highlight_rules', 'ace/mode/folding/cstyle'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var AutoHotKeyHighlightRules = require("./autohotkey_highlight_rules").AutoHotKeyHighlightRules; +var FoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + var highlighter = new AutoHotKeyHighlightRules(); + this.foldingRules = new FoldMode(); + this.$tokenizer = new Tokenizer(highlighter.getRules()); +}; +oop.inherits(Mode, TextMode); + +(function() { + this.lineCommentStart = "/\\*"; + this.blockComment = {start: "/*", end: "*/"}; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/autohotkey_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var AutoHotKeyHighlightRules = function() { + var autoItKeywords = 'And|ByRef|Case|Const|ContinueCase|ContinueLoop|Default|Dim|Do|Else|ElseIf|EndFunc|EndIf|EndSelect|EndSwitch|EndWith|Enum|Exit|ExitLoop|False|For|Func|Global|If|In|Local|Next|Not|Or|ReDim|Return|Select|Step|Switch|Then|To|True|Until|WEnd|While|With|' + + 'Abs|ACos|AdlibDisable|AdlibEnable|Asc|AscW|ASin|Assign|ATan|AutoItSetOption|AutoItWinGetTitle|AutoItWinSetTitle|Beep|Binary|BinaryLen|BinaryMid|BinaryToString|BitAND|BitNOT|BitOR|BitRotate|BitShift|BitXOR|BlockInput|Break|Call|CDTray|Ceiling|Chr|ChrW|ClipGet|ClipPut|ConsoleRead|ConsoleWrite|ConsoleWriteError|ControlClick|ControlCommand|ControlDisable|ControlEnable|ControlFocus|ControlGetFocus|ControlGetHandle|ControlGetPos|ControlGetText|ControlHide|ControlListView|ControlMove|ControlSend|ControlSetText|ControlShow|ControlTreeView|Cos|Dec|DirCopy|DirCreate|DirGetSize|DirMove|DirRemove|DllCall|DllCallbackFree|DllCallbackGetPtr|DllCallbackRegister|DllClose|DllOpen|DllStructCreate|DllStructGetData|DllStructGetPtr|DllStructGetSize|DllStructSetData|DriveGetDrive|DriveGetFileSystem|DriveGetLabel|DriveGetSerial|DriveGetType|DriveMapAdd|DriveMapDel|DriveMapGet|DriveSetLabel|DriveSpaceFree|DriveSpaceTotal|DriveStatus|EnvGet|EnvSet|EnvUpdate|Eval|Execute|Exp|FileChangeDir|FileClose|FileCopy|FileCreateNTFSLink|FileCreateShortcut|FileDelete|FileExists|FileFindFirstFile|FileFindNextFile|FileGetAttrib|FileGetLongName|FileGetShortcut|FileGetShortName|FileGetSize|FileGetTime|FileGetVersion|FileInstall|FileMove|FileOpen|FileOpenDialog|FileRead|FileReadLine|FileRecycle|FileRecycleEmpty|FileSaveDialog|FileSelectFolder|FileSetAttrib|FileSetTime|FileWrite|FileWriteLine|Floor|FtpSetProxy|GUICreate|GUICtrlCreateAvi|GUICtrlCreateButton|GUICtrlCreateCheckbox|GUICtrlCreateCombo|GUICtrlCreateContextMenu|GUICtrlCreateDate|GUICtrlCreateDummy|GUICtrlCreateEdit|GUICtrlCreateGraphic|GUICtrlCreateGroup|GUICtrlCreateIcon|GUICtrlCreateInput|GUICtrlCreateLabel|GUICtrlCreateList|GUICtrlCreateListView|GUICtrlCreateListViewItem|GUICtrlCreateMenu|GUICtrlCreateMenuItem|GUICtrlCreateMonthCal|GUICtrlCreateObj|GUICtrlCreatePic|GUICtrlCreateProgress|GUICtrlCreateRadio|GUICtrlCreateSlider|GUICtrlCreateTab|GUICtrlCreateTabItem|GUICtrlCreateTreeView|GUICtrlCreateTreeViewItem|GUICtrlCreateUpdown|GUICtrlDelete|GUICtrlGetHandle|GUICtrlGetState|GUICtrlRead|GUICtrlRecvMsg|GUICtrlRegisterListViewSort|GUICtrlSendMsg|GUICtrlSendToDummy|GUICtrlSetBkColor|GUICtrlSetColor|GUICtrlSetCursor|GUICtrlSetData|GUICtrlSetFont|GUICtrlSetDefColor|GUICtrlSetDefBkColor|GUICtrlSetGraphic|GUICtrlSetImage|GUICtrlSetLimit|GUICtrlSetOnEvent|GUICtrlSetPos|GUICtrlSetResizing|GUICtrlSetState|GUICtrlSetStyle|GUICtrlSetTip|GUIDelete|GUIGetCursorInfo|GUIGetMsg|GUIGetStyle|GUIRegisterMsg|GUISetAccelerators()|GUISetBkColor|GUISetCoord|GUISetCursor|GUISetFont|GUISetHelp|GUISetIcon|GUISetOnEvent|GUISetState|GUISetStyle|GUIStartGroup|GUISwitch|Hex|HotKeySet|HttpSetProxy|HWnd|InetGet|InetGetSize|IniDelete|IniRead|IniReadSection|IniReadSectionNames|IniRenameSection|IniWrite|IniWriteSection|InputBox|Int|IsAdmin|IsArray|IsBinary|IsBool|IsDeclared|IsDllStruct|IsFloat|IsHWnd|IsInt|IsKeyword|IsNumber|IsObj|IsPtr|IsString|Log|MemGetStats|Mod|MouseClick|MouseClickDrag|MouseDown|MouseGetCursor|MouseGetPos|MouseMove|MouseUp|MouseWheel|MsgBox|Number|ObjCreate|ObjEvent|ObjGet|ObjName|Opt|Ping|PixelChecksum|PixelGetColor|PixelSearch|PluginClose|PluginOpen|ProcessClose|ProcessExists|ProcessGetStats|ProcessList|ProcessSetPriority|ProcessWait|ProcessWaitClose|ProgressOff|ProgressOn|ProgressSet|Ptr|Random|RegDelete|RegEnumKey|RegEnumVal|RegRead|RegWrite|Round|Run|RunAs|RunAsWait|RunWait|Send|SendKeepActive|SetError|SetExtended|ShellExecute|ShellExecuteWait|Shutdown|Sin|Sleep|SoundPlay|SoundSetWaveVolume|SplashImageOn|SplashOff|SplashTextOn|Sqrt|SRandom|StatusbarGetText|StderrRead|StdinWrite|StdioClose|StdoutRead|String|StringAddCR|StringCompare|StringFormat|StringInStr|StringIsAlNum|StringIsAlpha|StringIsASCII|StringIsDigit|StringIsFloat|StringIsInt|StringIsLower|StringIsSpace|StringIsUpper|StringIsXDigit|StringLeft|StringLen|StringLower|StringMid|StringRegExp|StringRegExpReplace|StringReplace|StringRight|StringSplit|StringStripCR|StringStripWS|StringToBinary|StringTrimLeft|StringTrimRight|StringUpper|Tan|TCPAccept|TCPCloseSocket|TCPConnect|TCPListen|TCPNameToIP|TCPRecv|TCPSend|TCPShutdown|TCPStartup|TimerDiff|TimerInit|ToolTip|TrayCreateItem|TrayCreateMenu|TrayGetMsg|TrayItemDelete|TrayItemGetHandle|TrayItemGetState|TrayItemGetText|TrayItemSetOnEvent|TrayItemSetState|TrayItemSetText|TraySetClick|TraySetIcon|TraySetOnEvent|TraySetPauseIcon|TraySetState|TraySetToolTip|TrayTip|UBound|UDPBind|UDPCloseSocket|UDPOpen|UDPRecv|UDPSend|UDPShutdown|UDPStartup|VarGetType|WinActivate|WinActive|WinClose|WinExists|WinFlash|WinGetCaretPos|WinGetClassList|WinGetClientSize|WinGetHandle|WinGetPos|WinGetProcess|WinGetState|WinGetText|WinGetTitle|WinKill|WinList|WinMenuSelectItem|WinMinimizeAll|WinMinimizeAllUndo|WinMove|WinSetOnTop|WinSetState|WinSetTitle|WinSetTrans|WinWait|WinWaitActive|WinWaitClose|WinWaitNotActive|' + + 'ArrayAdd|ArrayBinarySearch|ArrayConcatenate|ArrayDelete|ArrayDisplay|ArrayFindAll|ArrayInsert|ArrayMax|ArrayMaxIndex|ArrayMin|ArrayMinIndex|ArrayPop|ArrayPush|ArrayReverse|ArraySearch|ArraySort|ArraySwap|ArrayToClip|ArrayToString|ArrayTrim|ChooseColor|ChooseFont|ClipBoard_ChangeChain|ClipBoard_Close|ClipBoard_CountFormats|ClipBoard_Empty|ClipBoard_EnumFormats|ClipBoard_FormatStr|ClipBoard_GetData|ClipBoard_GetDataEx|ClipBoard_GetFormatName|ClipBoard_GetOpenWindow|ClipBoard_GetOwner|ClipBoard_GetPriorityFormat|ClipBoard_GetSequenceNumber|ClipBoard_GetViewer|ClipBoard_IsFormatAvailable|ClipBoard_Open|ClipBoard_RegisterFormat|ClipBoard_SetData|ClipBoard_SetDataEx|ClipBoard_SetViewer|ClipPutFile|ColorConvertHSLtoRGB|ColorConvertRGBtoHSL|ColorGetBlue|ColorGetGreen|ColorGetRed|Date_Time_CompareFileTime|Date_Time_DOSDateTimeToArray|Date_Time_DOSDateTimeToFileTime|Date_Time_DOSDateTimeToStr|Date_Time_DOSDateToArray|Date_Time_DOSDateToStr|Date_Time_DOSTimeToArray|Date_Time_DOSTimeToStr|Date_Time_EncodeFileTime|Date_Time_EncodeSystemTime|Date_Time_FileTimeToArray|Date_Time_FileTimeToDOSDateTime|Date_Time_FileTimeToLocalFileTime|Date_Time_FileTimeToStr|Date_Time_FileTimeToSystemTime|Date_Time_GetFileTime|Date_Time_GetLocalTime|Date_Time_GetSystemTime|Date_Time_GetSystemTimeAdjustment|Date_Time_GetSystemTimeAsFileTime|Date_Time_GetSystemTimes|Date_Time_GetTickCount|Date_Time_GetTimeZoneInformation|Date_Time_LocalFileTimeToFileTime|Date_Time_SetFileTime|Date_Time_SetLocalTime|Date_Time_SetSystemTime|Date_Time_SetSystemTimeAdjustment|Date_Time_SetTimeZoneInformation|Date_Time_SystemTimeToArray|Date_Time_SystemTimeToDateStr|Date_Time_SystemTimeToDateTimeStr|Date_Time_SystemTimeToFileTime|Date_Time_SystemTimeToTimeStr|Date_Time_SystemTimeToTzSpecificLocalTime|Date_Time_TzSpecificLocalTimeToSystemTime|DateAdd|DateDayOfWeek|DateDaysInMonth|DateDiff|DateIsLeapYear|DateIsValid|DateTimeFormat|DateTimeSplit|DateToDayOfWeek|DateToDayOfWeekISO|DateToDayValue|DateToMonth|DayValueToDate|DebugBugReportEnv|DebugOut|DebugSetup|Degree|EventLog__Backup|EventLog__Clear|EventLog__Close|EventLog__Count|EventLog__DeregisterSource|EventLog__Full|EventLog__Notify|EventLog__Oldest|EventLog__Open|EventLog__OpenBackup|EventLog__Read|EventLog__RegisterSource|EventLog__Report|FileCountLines|FileCreate|FileListToArray|FilePrint|FileReadToArray|FileWriteFromArray|FileWriteLog|FileWriteToLine|GDIPlus_ArrowCapCreate|GDIPlus_ArrowCapDispose|GDIPlus_ArrowCapGetFillState|GDIPlus_ArrowCapGetHeight|GDIPlus_ArrowCapGetMiddleInset|GDIPlus_ArrowCapGetWidth|GDIPlus_ArrowCapSetFillState|GDIPlus_ArrowCapSetHeight|GDIPlus_ArrowCapSetMiddleInset|GDIPlus_ArrowCapSetWidth|GDIPlus_BitmapCloneArea|GDIPlus_BitmapCreateFromFile|GDIPlus_BitmapCreateFromGraphics|GDIPlus_BitmapCreateFromHBITMAP|GDIPlus_BitmapCreateHBITMAPFromBitmap|GDIPlus_BitmapDispose|GDIPlus_BitmapLockBits|GDIPlus_BitmapUnlockBits|GDIPlus_BrushClone|GDIPlus_BrushCreateSolid|GDIPlus_BrushDispose|GDIPlus_BrushGetType|GDIPlus_CustomLineCapDispose|GDIPlus_Decoders|GDIPlus_DecodersGetCount|GDIPlus_DecodersGetSize|GDIPlus_Encoders|GDIPlus_EncodersGetCLSID|GDIPlus_EncodersGetCount|GDIPlus_EncodersGetParamList|GDIPlus_EncodersGetParamListSize|GDIPlus_EncodersGetSize|GDIPlus_FontCreate|GDIPlus_FontDispose|GDIPlus_FontFamilyCreate|GDIPlus_FontFamilyDispose|GDIPlus_GraphicsClear|GDIPlus_GraphicsCreateFromHDC|GDIPlus_GraphicsCreateFromHWND|GDIPlus_GraphicsDispose|GDIPlus_GraphicsDrawArc|GDIPlus_GraphicsDrawBezier|GDIPlus_GraphicsDrawClosedCurve|GDIPlus_GraphicsDrawCurve|GDIPlus_GraphicsDrawEllipse|GDIPlus_GraphicsDrawImage|GDIPlus_GraphicsDrawImageRect|GDIPlus_GraphicsDrawImageRectRect|GDIPlus_GraphicsDrawLine|GDIPlus_GraphicsDrawPie|GDIPlus_GraphicsDrawPolygon|GDIPlus_GraphicsDrawRect|GDIPlus_GraphicsDrawString|GDIPlus_GraphicsDrawStringEx|GDIPlus_GraphicsFillClosedCurve|GDIPlus_GraphicsFillEllipse|GDIPlus_GraphicsFillPie|GDIPlus_GraphicsFillRect|GDIPlus_GraphicsGetDC|GDIPlus_GraphicsGetSmoothingMode|GDIPlus_GraphicsMeasureString|GDIPlus_GraphicsReleaseDC|GDIPlus_GraphicsSetSmoothingMode|GDIPlus_GraphicsSetTransform|GDIPlus_ImageDispose|GDIPlus_ImageGetGraphicsContext|GDIPlus_ImageGetHeight|GDIPlus_ImageGetWidth|GDIPlus_ImageLoadFromFile|GDIPlus_ImageSaveToFile|GDIPlus_ImageSaveToFileEx|GDIPlus_MatrixCreate|GDIPlus_MatrixDispose|GDIPlus_MatrixRotate|GDIPlus_ParamAdd|GDIPlus_ParamInit|GDIPlus_PenCreate|GDIPlus_PenDispose|GDIPlus_PenGetAlignment|GDIPlus_PenGetColor|GDIPlus_PenGetCustomEndCap|GDIPlus_PenGetDashCap|GDIPlus_PenGetDashStyle|GDIPlus_PenGetEndCap|GDIPlus_PenGetWidth|GDIPlus_PenSetAlignment|GDIPlus_PenSetColor|GDIPlus_PenSetCustomEndCap|GDIPlus_PenSetDashCap|GDIPlus_PenSetDashStyle|GDIPlus_PenSetEndCap|GDIPlus_PenSetWidth|GDIPlus_RectFCreate|GDIPlus_Shutdown|GDIPlus_Startup|GDIPlus_StringFormatCreate|GDIPlus_StringFormatDispose|GetIP|GUICtrlAVI_Close|GUICtrlAVI_Create|GUICtrlAVI_Destroy|GUICtrlAVI_Open|GUICtrlAVI_OpenEx|GUICtrlAVI_Play|GUICtrlAVI_Seek|GUICtrlAVI_Show|GUICtrlAVI_Stop|GUICtrlButton_Click|GUICtrlButton_Create|GUICtrlButton_Destroy|GUICtrlButton_Enable|GUICtrlButton_GetCheck|GUICtrlButton_GetFocus|GUICtrlButton_GetIdealSize|GUICtrlButton_GetImage|GUICtrlButton_GetImageList|GUICtrlButton_GetState|GUICtrlButton_GetText|GUICtrlButton_GetTextMargin|GUICtrlButton_SetCheck|GUICtrlButton_SetFocus|GUICtrlButton_SetImage|GUICtrlButton_SetImageList|GUICtrlButton_SetSize|GUICtrlButton_SetState|GUICtrlButton_SetStyle|GUICtrlButton_SetText|GUICtrlButton_SetTextMargin|GUICtrlButton_Show|GUICtrlComboBox_AddDir|GUICtrlComboBox_AddString|GUICtrlComboBox_AutoComplete|GUICtrlComboBox_BeginUpdate|GUICtrlComboBox_Create|GUICtrlComboBox_DeleteString|GUICtrlComboBox_Destroy|GUICtrlComboBox_EndUpdate|GUICtrlComboBox_FindString|GUICtrlComboBox_FindStringExact|GUICtrlComboBox_GetComboBoxInfo|GUICtrlComboBox_GetCount|GUICtrlComboBox_GetCurSel|GUICtrlComboBox_GetDroppedControlRect|GUICtrlComboBox_GetDroppedControlRectEx|GUICtrlComboBox_GetDroppedState|GUICtrlComboBox_GetDroppedWidth|GUICtrlComboBox_GetEditSel|GUICtrlComboBox_GetEditText|GUICtrlComboBox_GetExtendedUI|GUICtrlComboBox_GetHorizontalExtent|GUICtrlComboBox_GetItemHeight|GUICtrlComboBox_GetLBText|GUICtrlComboBox_GetLBTextLen|GUICtrlComboBox_GetList|GUICtrlComboBox_GetListArray|GUICtrlComboBox_GetLocale|GUICtrlComboBox_GetLocaleCountry|GUICtrlComboBox_GetLocaleLang|GUICtrlComboBox_GetLocalePrimLang|GUICtrlComboBox_GetLocaleSubLang|GUICtrlComboBox_GetMinVisible|GUICtrlComboBox_GetTopIndex|GUICtrlComboBox_InitStorage|GUICtrlComboBox_InsertString|GUICtrlComboBox_LimitText|GUICtrlComboBox_ReplaceEditSel|GUICtrlComboBox_ResetContent|GUICtrlComboBox_SelectString|GUICtrlComboBox_SetCurSel|GUICtrlComboBox_SetDroppedWidth|GUICtrlComboBox_SetEditSel|GUICtrlComboBox_SetEditText|GUICtrlComboBox_SetExtendedUI|GUICtrlComboBox_SetHorizontalExtent|GUICtrlComboBox_SetItemHeight|GUICtrlComboBox_SetMinVisible|GUICtrlComboBox_SetTopIndex|GUICtrlComboBox_ShowDropDown|GUICtrlComboBoxEx_AddDir|GUICtrlComboBoxEx_AddString|GUICtrlComboBoxEx_BeginUpdate|GUICtrlComboBoxEx_Create|GUICtrlComboBoxEx_CreateSolidBitMap|GUICtrlComboBoxEx_DeleteString|GUICtrlComboBoxEx_Destroy|GUICtrlComboBoxEx_EndUpdate|GUICtrlComboBoxEx_FindStringExact|GUICtrlComboBoxEx_GetComboBoxInfo|GUICtrlComboBoxEx_GetComboControl|GUICtrlComboBoxEx_GetCount|GUICtrlComboBoxEx_GetCurSel|GUICtrlComboBoxEx_GetDroppedControlRect|GUICtrlComboBoxEx_GetDroppedControlRectEx|GUICtrlComboBoxEx_GetDroppedState|GUICtrlComboBoxEx_GetDroppedWidth|GUICtrlComboBoxEx_GetEditControl|GUICtrlComboBoxEx_GetEditSel|GUICtrlComboBoxEx_GetEditText|GUICtrlComboBoxEx_GetExtendedStyle|GUICtrlComboBoxEx_GetExtendedUI|GUICtrlComboBoxEx_GetImageList|GUICtrlComboBoxEx_GetItem|GUICtrlComboBoxEx_GetItemEx|GUICtrlComboBoxEx_GetItemHeight|GUICtrlComboBoxEx_GetItemImage|GUICtrlComboBoxEx_GetItemIndent|GUICtrlComboBoxEx_GetItemOverlayImage|GUICtrlComboBoxEx_GetItemParam|GUICtrlComboBoxEx_GetItemSelectedImage|GUICtrlComboBoxEx_GetItemText|GUICtrlComboBoxEx_GetItemTextLen|GUICtrlComboBoxEx_GetList|GUICtrlComboBoxEx_GetListArray|GUICtrlComboBoxEx_GetLocale|GUICtrlComboBoxEx_GetLocaleCountry|GUICtrlComboBoxEx_GetLocaleLang|GUICtrlComboBoxEx_GetLocalePrimLang|GUICtrlComboBoxEx_GetLocaleSubLang|GUICtrlComboBoxEx_GetMinVisible|GUICtrlComboBoxEx_GetTopIndex|GUICtrlComboBoxEx_InitStorage|GUICtrlComboBoxEx_InsertString|GUICtrlComboBoxEx_LimitText|GUICtrlComboBoxEx_ReplaceEditSel|GUICtrlComboBoxEx_ResetContent|GUICtrlComboBoxEx_SetCurSel|GUICtrlComboBoxEx_SetDroppedWidth|GUICtrlComboBoxEx_SetEditSel|GUICtrlComboBoxEx_SetEditText|GUICtrlComboBoxEx_SetExtendedStyle|GUICtrlComboBoxEx_SetExtendedUI|GUICtrlComboBoxEx_SetImageList|GUICtrlComboBoxEx_SetItem|GUICtrlComboBoxEx_SetItemEx|GUICtrlComboBoxEx_SetItemHeight|GUICtrlComboBoxEx_SetItemImage|GUICtrlComboBoxEx_SetItemIndent|GUICtrlComboBoxEx_SetItemOverlayImage|GUICtrlComboBoxEx_SetItemParam|GUICtrlComboBoxEx_SetItemSelectedImage|GUICtrlComboBoxEx_SetMinVisible|GUICtrlComboBoxEx_SetTopIndex|GUICtrlComboBoxEx_ShowDropDown|GUICtrlDTP_Create|GUICtrlDTP_Destroy|GUICtrlDTP_GetMCColor|GUICtrlDTP_GetMCFont|GUICtrlDTP_GetMonthCal|GUICtrlDTP_GetRange|GUICtrlDTP_GetRangeEx|GUICtrlDTP_GetSystemTime|GUICtrlDTP_GetSystemTimeEx|GUICtrlDTP_SetFormat|GUICtrlDTP_SetMCColor|GUICtrlDTP_SetMCFont|GUICtrlDTP_SetRange|GUICtrlDTP_SetRangeEx|GUICtrlDTP_SetSystemTime|GUICtrlDTP_SetSystemTimeEx|GUICtrlEdit_AppendText|GUICtrlEdit_BeginUpdate|GUICtrlEdit_CanUndo|GUICtrlEdit_CharFromPos|GUICtrlEdit_Create|GUICtrlEdit_Destroy|GUICtrlEdit_EmptyUndoBuffer|GUICtrlEdit_EndUpdate|GUICtrlEdit_Find|GUICtrlEdit_FmtLines|GUICtrlEdit_GetFirstVisibleLine|GUICtrlEdit_GetLimitText|GUICtrlEdit_GetLine|GUICtrlEdit_GetLineCount|GUICtrlEdit_GetMargins|GUICtrlEdit_GetModify|GUICtrlEdit_GetPasswordChar|GUICtrlEdit_GetRECT|GUICtrlEdit_GetRECTEx|GUICtrlEdit_GetSel|GUICtrlEdit_GetText|GUICtrlEdit_GetTextLen|GUICtrlEdit_HideBalloonTip|GUICtrlEdit_InsertText|GUICtrlEdit_LineFromChar|GUICtrlEdit_LineIndex|GUICtrlEdit_LineLength|GUICtrlEdit_LineScroll|GUICtrlEdit_PosFromChar|GUICtrlEdit_ReplaceSel|GUICtrlEdit_Scroll|GUICtrlEdit_SetLimitText|GUICtrlEdit_SetMargins|GUICtrlEdit_SetModify|GUICtrlEdit_SetPasswordChar|GUICtrlEdit_SetReadOnly|GUICtrlEdit_SetRECT|GUICtrlEdit_SetRECTEx|GUICtrlEdit_SetRECTNP|GUICtrlEdit_SetRectNPEx|GUICtrlEdit_SetSel|GUICtrlEdit_SetTabStops|GUICtrlEdit_SetText|GUICtrlEdit_ShowBalloonTip|GUICtrlEdit_Undo|GUICtrlHeader_AddItem|GUICtrlHeader_ClearFilter|GUICtrlHeader_ClearFilterAll|GUICtrlHeader_Create|GUICtrlHeader_CreateDragImage|GUICtrlHeader_DeleteItem|GUICtrlHeader_Destroy|GUICtrlHeader_EditFilter|GUICtrlHeader_GetBitmapMargin|GUICtrlHeader_GetImageList|GUICtrlHeader_GetItem|GUICtrlHeader_GetItemAlign|GUICtrlHeader_GetItemBitmap|GUICtrlHeader_GetItemCount|GUICtrlHeader_GetItemDisplay|GUICtrlHeader_GetItemFlags|GUICtrlHeader_GetItemFormat|GUICtrlHeader_GetItemImage|GUICtrlHeader_GetItemOrder|GUICtrlHeader_GetItemParam|GUICtrlHeader_GetItemRect|GUICtrlHeader_GetItemRectEx|GUICtrlHeader_GetItemText|GUICtrlHeader_GetItemWidth|GUICtrlHeader_GetOrderArray|GUICtrlHeader_GetUnicodeFormat|GUICtrlHeader_HitTest|GUICtrlHeader_InsertItem|GUICtrlHeader_Layout|GUICtrlHeader_OrderToIndex|GUICtrlHeader_SetBitmapMargin|GUICtrlHeader_SetFilterChangeTimeout|GUICtrlHeader_SetHotDivider|GUICtrlHeader_SetImageList|GUICtrlHeader_SetItem|GUICtrlHeader_SetItemAlign|GUICtrlHeader_SetItemBitmap|GUICtrlHeader_SetItemDisplay|GUICtrlHeader_SetItemFlags|GUICtrlHeader_SetItemFormat|GUICtrlHeader_SetItemImage|GUICtrlHeader_SetItemOrder|GUICtrlHeader_SetItemParam|GUICtrlHeader_SetItemText|GUICtrlHeader_SetItemWidth|GUICtrlHeader_SetOrderArray|GUICtrlHeader_SetUnicodeFormat|GUICtrlIpAddress_ClearAddress|GUICtrlIpAddress_Create|GUICtrlIpAddress_Destroy|GUICtrlIpAddress_Get|GUICtrlIpAddress_GetArray|GUICtrlIpAddress_GetEx|GUICtrlIpAddress_IsBlank|GUICtrlIpAddress_Set|GUICtrlIpAddress_SetArray|GUICtrlIpAddress_SetEx|GUICtrlIpAddress_SetFocus|GUICtrlIpAddress_SetFont|GUICtrlIpAddress_SetRange|GUICtrlIpAddress_ShowHide|GUICtrlListBox_AddFile|GUICtrlListBox_AddString|GUICtrlListBox_BeginUpdate|GUICtrlListBox_Create|GUICtrlListBox_DeleteString|GUICtrlListBox_Destroy|GUICtrlListBox_Dir|GUICtrlListBox_EndUpdate|GUICtrlListBox_FindInText|GUICtrlListBox_FindString|GUICtrlListBox_GetAnchorIndex|GUICtrlListBox_GetCaretIndex|GUICtrlListBox_GetCount|GUICtrlListBox_GetCurSel|GUICtrlListBox_GetHorizontalExtent|GUICtrlListBox_GetItemData|GUICtrlListBox_GetItemHeight|GUICtrlListBox_GetItemRect|GUICtrlListBox_GetItemRectEx|GUICtrlListBox_GetListBoxInfo|GUICtrlListBox_GetLocale|GUICtrlListBox_GetLocaleCountry|GUICtrlListBox_GetLocaleLang|GUICtrlListBox_GetLocalePrimLang|GUICtrlListBox_GetLocaleSubLang|GUICtrlListBox_GetSel|GUICtrlListBox_GetSelCount|GUICtrlListBox_GetSelItems|GUICtrlListBox_GetSelItemsText|GUICtrlListBox_GetText|GUICtrlListBox_GetTextLen|GUICtrlListBox_GetTopIndex|GUICtrlListBox_InitStorage|GUICtrlListBox_InsertString|GUICtrlListBox_ItemFromPoint|GUICtrlListBox_ReplaceString|GUICtrlListBox_ResetContent|GUICtrlListBox_SelectString|GUICtrlListBox_SelItemRange|GUICtrlListBox_SelItemRangeEx|GUICtrlListBox_SetAnchorIndex|GUICtrlListBox_SetCaretIndex|GUICtrlListBox_SetColumnWidth|GUICtrlListBox_SetCurSel|GUICtrlListBox_SetHorizontalExtent|GUICtrlListBox_SetItemData|GUICtrlListBox_SetItemHeight|GUICtrlListBox_SetLocale|GUICtrlListBox_SetSel|GUICtrlListBox_SetTabStops|GUICtrlListBox_SetTopIndex|GUICtrlListBox_Sort|GUICtrlListBox_SwapString|GUICtrlListBox_UpdateHScroll|GUICtrlListView_AddArray|GUICtrlListView_AddColumn|GUICtrlListView_AddItem|GUICtrlListView_AddSubItem|GUICtrlListView_ApproximateViewHeight|GUICtrlListView_ApproximateViewRect|GUICtrlListView_ApproximateViewWidth|GUICtrlListView_Arrange|GUICtrlListView_BeginUpdate|GUICtrlListView_CancelEditLabel|GUICtrlListView_ClickItem|GUICtrlListView_CopyItems|GUICtrlListView_Create|GUICtrlListView_CreateDragImage|GUICtrlListView_CreateSolidBitMap|GUICtrlListView_DeleteAllItems|GUICtrlListView_DeleteColumn|GUICtrlListView_DeleteItem|GUICtrlListView_DeleteItemsSelected|GUICtrlListView_Destroy|GUICtrlListView_DrawDragImage|GUICtrlListView_EditLabel|GUICtrlListView_EnableGroupView|GUICtrlListView_EndUpdate|GUICtrlListView_EnsureVisible|GUICtrlListView_FindInText|GUICtrlListView_FindItem|GUICtrlListView_FindNearest|GUICtrlListView_FindParam|GUICtrlListView_FindText|GUICtrlListView_GetBkColor|GUICtrlListView_GetBkImage|GUICtrlListView_GetCallbackMask|GUICtrlListView_GetColumn|GUICtrlListView_GetColumnCount|GUICtrlListView_GetColumnOrder|GUICtrlListView_GetColumnOrderArray|GUICtrlListView_GetColumnWidth|GUICtrlListView_GetCounterPage|GUICtrlListView_GetEditControl|GUICtrlListView_GetExtendedListViewStyle|GUICtrlListView_GetGroupInfo|GUICtrlListView_GetGroupViewEnabled|GUICtrlListView_GetHeader|GUICtrlListView_GetHotCursor|GUICtrlListView_GetHotItem|GUICtrlListView_GetHoverTime|GUICtrlListView_GetImageList|GUICtrlListView_GetISearchString|GUICtrlListView_GetItem|GUICtrlListView_GetItemChecked|GUICtrlListView_GetItemCount|GUICtrlListView_GetItemCut|GUICtrlListView_GetItemDropHilited|GUICtrlListView_GetItemEx|GUICtrlListView_GetItemFocused|GUICtrlListView_GetItemGroupID|GUICtrlListView_GetItemImage|GUICtrlListView_GetItemIndent|GUICtrlListView_GetItemParam|GUICtrlListView_GetItemPosition|GUICtrlListView_GetItemPositionX|GUICtrlListView_GetItemPositionY|GUICtrlListView_GetItemRect|GUICtrlListView_GetItemRectEx|GUICtrlListView_GetItemSelected|GUICtrlListView_GetItemSpacing|GUICtrlListView_GetItemSpacingX|GUICtrlListView_GetItemSpacingY|GUICtrlListView_GetItemState|GUICtrlListView_GetItemStateImage|GUICtrlListView_GetItemText|GUICtrlListView_GetItemTextArray|GUICtrlListView_GetItemTextString|GUICtrlListView_GetNextItem|GUICtrlListView_GetNumberOfWorkAreas|GUICtrlListView_GetOrigin|GUICtrlListView_GetOriginX|GUICtrlListView_GetOriginY|GUICtrlListView_GetOutlineColor|GUICtrlListView_GetSelectedColumn|GUICtrlListView_GetSelectedCount|GUICtrlListView_GetSelectedIndices|GUICtrlListView_GetSelectionMark|GUICtrlListView_GetStringWidth|GUICtrlListView_GetSubItemRect|GUICtrlListView_GetTextBkColor|GUICtrlListView_GetTextColor|GUICtrlListView_GetToolTips|GUICtrlListView_GetTopIndex|GUICtrlListView_GetUnicodeFormat|GUICtrlListView_GetView|GUICtrlListView_GetViewDetails|GUICtrlListView_GetViewLarge|GUICtrlListView_GetViewList|GUICtrlListView_GetViewRect|GUICtrlListView_GetViewSmall|GUICtrlListView_GetViewTile|GUICtrlListView_HideColumn|GUICtrlListView_HitTest|GUICtrlListView_InsertColumn|GUICtrlListView_InsertGroup|GUICtrlListView_InsertItem|GUICtrlListView_JustifyColumn|GUICtrlListView_MapIDToIndex|GUICtrlListView_MapIndexToID|GUICtrlListView_RedrawItems|GUICtrlListView_RegisterSortCallBack|GUICtrlListView_RemoveAllGroups|GUICtrlListView_RemoveGroup|GUICtrlListView_Scroll|GUICtrlListView_SetBkColor|GUICtrlListView_SetBkImage|GUICtrlListView_SetCallBackMask|GUICtrlListView_SetColumn|GUICtrlListView_SetColumnOrder|GUICtrlListView_SetColumnOrderArray|GUICtrlListView_SetColumnWidth|GUICtrlListView_SetExtendedListViewStyle|GUICtrlListView_SetGroupInfo|GUICtrlListView_SetHotItem|GUICtrlListView_SetHoverTime|GUICtrlListView_SetIconSpacing|GUICtrlListView_SetImageList|GUICtrlListView_SetItem|GUICtrlListView_SetItemChecked|GUICtrlListView_SetItemCount|GUICtrlListView_SetItemCut|GUICtrlListView_SetItemDropHilited|GUICtrlListView_SetItemEx|GUICtrlListView_SetItemFocused|GUICtrlListView_SetItemGroupID|GUICtrlListView_SetItemImage|GUICtrlListView_SetItemIndent|GUICtrlListView_SetItemParam|GUICtrlListView_SetItemPosition|GUICtrlListView_SetItemPosition32|GUICtrlListView_SetItemSelected|GUICtrlListView_SetItemState|GUICtrlListView_SetItemStateImage|GUICtrlListView_SetItemText|GUICtrlListView_SetOutlineColor|GUICtrlListView_SetSelectedColumn|GUICtrlListView_SetSelectionMark|GUICtrlListView_SetTextBkColor|GUICtrlListView_SetTextColor|GUICtrlListView_SetToolTips|GUICtrlListView_SetUnicodeFormat|GUICtrlListView_SetView|GUICtrlListView_SetWorkAreas|GUICtrlListView_SimpleSort|GUICtrlListView_SortItems|GUICtrlListView_SubItemHitTest|GUICtrlListView_UnRegisterSortCallBack|GUICtrlMenu_AddMenuItem|GUICtrlMenu_AppendMenu|GUICtrlMenu_CheckMenuItem|GUICtrlMenu_CheckRadioItem|GUICtrlMenu_CreateMenu|GUICtrlMenu_CreatePopup|GUICtrlMenu_DeleteMenu|GUICtrlMenu_DestroyMenu|GUICtrlMenu_DrawMenuBar|GUICtrlMenu_EnableMenuItem|GUICtrlMenu_FindItem|GUICtrlMenu_FindParent|GUICtrlMenu_GetItemBmp|GUICtrlMenu_GetItemBmpChecked|GUICtrlMenu_GetItemBmpUnchecked|GUICtrlMenu_GetItemChecked|GUICtrlMenu_GetItemCount|GUICtrlMenu_GetItemData|GUICtrlMenu_GetItemDefault|GUICtrlMenu_GetItemDisabled|GUICtrlMenu_GetItemEnabled|GUICtrlMenu_GetItemGrayed|GUICtrlMenu_GetItemHighlighted|GUICtrlMenu_GetItemID|GUICtrlMenu_GetItemInfo|GUICtrlMenu_GetItemRect|GUICtrlMenu_GetItemRectEx|GUICtrlMenu_GetItemState|GUICtrlMenu_GetItemStateEx|GUICtrlMenu_GetItemSubMenu|GUICtrlMenu_GetItemText|GUICtrlMenu_GetItemType|GUICtrlMenu_GetMenu|GUICtrlMenu_GetMenuBackground|GUICtrlMenu_GetMenuBarInfo|GUICtrlMenu_GetMenuContextHelpID|GUICtrlMenu_GetMenuData|GUICtrlMenu_GetMenuDefaultItem|GUICtrlMenu_GetMenuHeight|GUICtrlMenu_GetMenuInfo|GUICtrlMenu_GetMenuStyle|GUICtrlMenu_GetSystemMenu|GUICtrlMenu_InsertMenuItem|GUICtrlMenu_InsertMenuItemEx|GUICtrlMenu_IsMenu|GUICtrlMenu_LoadMenu|GUICtrlMenu_MapAccelerator|GUICtrlMenu_MenuItemFromPoint|GUICtrlMenu_RemoveMenu|GUICtrlMenu_SetItemBitmaps|GUICtrlMenu_SetItemBmp|GUICtrlMenu_SetItemBmpChecked|GUICtrlMenu_SetItemBmpUnchecked|GUICtrlMenu_SetItemChecked|GUICtrlMenu_SetItemData|GUICtrlMenu_SetItemDefault|GUICtrlMenu_SetItemDisabled|GUICtrlMenu_SetItemEnabled|GUICtrlMenu_SetItemGrayed|GUICtrlMenu_SetItemHighlighted|GUICtrlMenu_SetItemID|GUICtrlMenu_SetItemInfo|GUICtrlMenu_SetItemState|GUICtrlMenu_SetItemSubMenu|GUICtrlMenu_SetItemText|GUICtrlMenu_SetItemType|GUICtrlMenu_SetMenu|GUICtrlMenu_SetMenuBackground|GUICtrlMenu_SetMenuContextHelpID|GUICtrlMenu_SetMenuData|GUICtrlMenu_SetMenuDefaultItem|GUICtrlMenu_SetMenuHeight|GUICtrlMenu_SetMenuInfo|GUICtrlMenu_SetMenuStyle|GUICtrlMenu_TrackPopupMenu|GUICtrlMonthCal_Create|GUICtrlMonthCal_Destroy|GUICtrlMonthCal_GetColor|GUICtrlMonthCal_GetColorArray|GUICtrlMonthCal_GetCurSel|GUICtrlMonthCal_GetCurSelStr|GUICtrlMonthCal_GetFirstDOW|GUICtrlMonthCal_GetFirstDOWStr|GUICtrlMonthCal_GetMaxSelCount|GUICtrlMonthCal_GetMaxTodayWidth|GUICtrlMonthCal_GetMinReqHeight|GUICtrlMonthCal_GetMinReqRect|GUICtrlMonthCal_GetMinReqRectArray|GUICtrlMonthCal_GetMinReqWidth|GUICtrlMonthCal_GetMonthDelta|GUICtrlMonthCal_GetMonthRange|GUICtrlMonthCal_GetMonthRangeMax|GUICtrlMonthCal_GetMonthRangeMaxStr|GUICtrlMonthCal_GetMonthRangeMin|GUICtrlMonthCal_GetMonthRangeMinStr|GUICtrlMonthCal_GetMonthRangeSpan|GUICtrlMonthCal_GetRange|GUICtrlMonthCal_GetRangeMax|GUICtrlMonthCal_GetRangeMaxStr|GUICtrlMonthCal_GetRangeMin|GUICtrlMonthCal_GetRangeMinStr|GUICtrlMonthCal_GetSelRange|GUICtrlMonthCal_GetSelRangeMax|GUICtrlMonthCal_GetSelRangeMaxStr|GUICtrlMonthCal_GetSelRangeMin|GUICtrlMonthCal_GetSelRangeMinStr|GUICtrlMonthCal_GetToday|GUICtrlMonthCal_GetTodayStr|GUICtrlMonthCal_GetUnicodeFormat|GUICtrlMonthCal_HitTest|GUICtrlMonthCal_SetColor|GUICtrlMonthCal_SetCurSel|GUICtrlMonthCal_SetDayState|GUICtrlMonthCal_SetFirstDOW|GUICtrlMonthCal_SetMaxSelCount|GUICtrlMonthCal_SetMonthDelta|GUICtrlMonthCal_SetRange|GUICtrlMonthCal_SetSelRange|GUICtrlMonthCal_SetToday|GUICtrlMonthCal_SetUnicodeFormat|GUICtrlRebar_AddBand|GUICtrlRebar_AddToolBarBand|GUICtrlRebar_BeginDrag|GUICtrlRebar_Create|GUICtrlRebar_DeleteBand|GUICtrlRebar_Destroy|GUICtrlRebar_DragMove|GUICtrlRebar_EndDrag|GUICtrlRebar_GetBandBackColor|GUICtrlRebar_GetBandBorders|GUICtrlRebar_GetBandBordersEx|GUICtrlRebar_GetBandChildHandle|GUICtrlRebar_GetBandChildSize|GUICtrlRebar_GetBandCount|GUICtrlRebar_GetBandForeColor|GUICtrlRebar_GetBandHeaderSize|GUICtrlRebar_GetBandID|GUICtrlRebar_GetBandIdealSize|GUICtrlRebar_GetBandLength|GUICtrlRebar_GetBandLParam|GUICtrlRebar_GetBandMargins|GUICtrlRebar_GetBandMarginsEx|GUICtrlRebar_GetBandRect|GUICtrlRebar_GetBandRectEx|GUICtrlRebar_GetBandStyle|GUICtrlRebar_GetBandStyleBreak|GUICtrlRebar_GetBandStyleChildEdge|GUICtrlRebar_GetBandStyleFixedBMP|GUICtrlRebar_GetBandStyleFixedSize|GUICtrlRebar_GetBandStyleGripperAlways|GUICtrlRebar_GetBandStyleHidden|GUICtrlRebar_GetBandStyleHideTitle|GUICtrlRebar_GetBandStyleNoGripper|GUICtrlRebar_GetBandStyleTopAlign|GUICtrlRebar_GetBandStyleUseChevron|GUICtrlRebar_GetBandStyleVariableHeight|GUICtrlRebar_GetBandText|GUICtrlRebar_GetBarHeight|GUICtrlRebar_GetBKColor|GUICtrlRebar_GetColorScheme|GUICtrlRebar_GetRowCount|GUICtrlRebar_GetRowHeight|GUICtrlRebar_GetTextColor|GUICtrlRebar_GetToolTips|GUICtrlRebar_GetUnicodeFormat|GUICtrlRebar_HitTest|GUICtrlRebar_IDToIndex|GUICtrlRebar_MaximizeBand|GUICtrlRebar_MinimizeBand|GUICtrlRebar_MoveBand|GUICtrlRebar_SetBandBackColor|GUICtrlRebar_SetBandForeColor|GUICtrlRebar_SetBandHeaderSize|GUICtrlRebar_SetBandID|GUICtrlRebar_SetBandIdealSize|GUICtrlRebar_SetBandLength|GUICtrlRebar_SetBandLParam|GUICtrlRebar_SetBandStyle|GUICtrlRebar_SetBandStyleBreak|GUICtrlRebar_SetBandStyleChildEdge|GUICtrlRebar_SetBandStyleFixedBMP|GUICtrlRebar_SetBandStyleFixedSize|GUICtrlRebar_SetBandStyleGripperAlways|GUICtrlRebar_SetBandStyleHidden|GUICtrlRebar_SetBandStyleHideTitle|GUICtrlRebar_SetBandStyleNoGripper|GUICtrlRebar_SetBandStyleTopAlign|GUICtrlRebar_SetBandStyleUseChevron|GUICtrlRebar_SetBandStyleVariableHeight|GUICtrlRebar_SetBandText|GUICtrlRebar_SetBKColor|GUICtrlRebar_SetColorScheme|GUICtrlRebar_SetTextColor|GUICtrlRebar_SetToolTips|GUICtrlRebar_SetUnicodeFormat|GUICtrlRebar_ShowBand|GUICtrlSlider_ClearSel|GUICtrlSlider_ClearTics|GUICtrlSlider_Create|GUICtrlSlider_Destroy|GUICtrlSlider_GetBuddy|GUICtrlSlider_GetChannelRect|GUICtrlSlider_GetLineSize|GUICtrlSlider_GetNumTics|GUICtrlSlider_GetPageSize|GUICtrlSlider_GetPos|GUICtrlSlider_GetPTics|GUICtrlSlider_GetRange|GUICtrlSlider_GetRangeMax|GUICtrlSlider_GetRangeMin|GUICtrlSlider_GetSel|GUICtrlSlider_GetSelEnd|GUICtrlSlider_GetSelStart|GUICtrlSlider_GetThumbLength|GUICtrlSlider_GetThumbRect|GUICtrlSlider_GetThumbRectEx|GUICtrlSlider_GetTic|GUICtrlSlider_GetTicPos|GUICtrlSlider_GetToolTips|GUICtrlSlider_GetUnicodeFormat|GUICtrlSlider_SetBuddy|GUICtrlSlider_SetLineSize|GUICtrlSlider_SetPageSize|GUICtrlSlider_SetPos|GUICtrlSlider_SetRange|GUICtrlSlider_SetRangeMax|GUICtrlSlider_SetRangeMin|GUICtrlSlider_SetSel|GUICtrlSlider_SetSelEnd|GUICtrlSlider_SetSelStart|GUICtrlSlider_SetThumbLength|GUICtrlSlider_SetTic|GUICtrlSlider_SetTicFreq|GUICtrlSlider_SetTipSide|GUICtrlSlider_SetToolTips|GUICtrlSlider_SetUnicodeFormat|GUICtrlStatusBar_Create|GUICtrlStatusBar_Destroy|GUICtrlStatusBar_EmbedControl|GUICtrlStatusBar_GetBorders|GUICtrlStatusBar_GetBordersHorz|GUICtrlStatusBar_GetBordersRect|GUICtrlStatusBar_GetBordersVert|GUICtrlStatusBar_GetCount|GUICtrlStatusBar_GetHeight|GUICtrlStatusBar_GetIcon|GUICtrlStatusBar_GetParts|GUICtrlStatusBar_GetRect|GUICtrlStatusBar_GetRectEx|GUICtrlStatusBar_GetText|GUICtrlStatusBar_GetTextFlags|GUICtrlStatusBar_GetTextLength|GUICtrlStatusBar_GetTextLengthEx|GUICtrlStatusBar_GetTipText|GUICtrlStatusBar_GetUnicodeFormat|GUICtrlStatusBar_GetWidth|GUICtrlStatusBar_IsSimple|GUICtrlStatusBar_Resize|GUICtrlStatusBar_SetBkColor|GUICtrlStatusBar_SetIcon|GUICtrlStatusBar_SetMinHeight|GUICtrlStatusBar_SetParts|GUICtrlStatusBar_SetSimple|GUICtrlStatusBar_SetText|GUICtrlStatusBar_SetTipText|GUICtrlStatusBar_SetUnicodeFormat|GUICtrlStatusBar_ShowHide|GUICtrlTab_Create|GUICtrlTab_DeleteAllItems|GUICtrlTab_DeleteItem|GUICtrlTab_DeselectAll|GUICtrlTab_Destroy|GUICtrlTab_FindTab|GUICtrlTab_GetCurFocus|GUICtrlTab_GetCurSel|GUICtrlTab_GetDisplayRect|GUICtrlTab_GetDisplayRectEx|GUICtrlTab_GetExtendedStyle|GUICtrlTab_GetImageList|GUICtrlTab_GetItem|GUICtrlTab_GetItemCount|GUICtrlTab_GetItemImage|GUICtrlTab_GetItemParam|GUICtrlTab_GetItemRect|GUICtrlTab_GetItemRectEx|GUICtrlTab_GetItemState|GUICtrlTab_GetItemText|GUICtrlTab_GetRowCount|GUICtrlTab_GetToolTips|GUICtrlTab_GetUnicodeFormat|GUICtrlTab_HighlightItem|GUICtrlTab_HitTest|GUICtrlTab_InsertItem|GUICtrlTab_RemoveImage|GUICtrlTab_SetCurFocus|GUICtrlTab_SetCurSel|GUICtrlTab_SetExtendedStyle|GUICtrlTab_SetImageList|GUICtrlTab_SetItem|GUICtrlTab_SetItemImage|GUICtrlTab_SetItemParam|GUICtrlTab_SetItemSize|GUICtrlTab_SetItemState|GUICtrlTab_SetItemText|GUICtrlTab_SetMinTabWidth|GUICtrlTab_SetPadding|GUICtrlTab_SetToolTips|GUICtrlTab_SetUnicodeFormat|GUICtrlToolbar_AddBitmap|GUICtrlToolbar_AddButton|GUICtrlToolbar_AddButtonSep|GUICtrlToolbar_AddString|GUICtrlToolbar_ButtonCount|GUICtrlToolbar_CheckButton|GUICtrlToolbar_ClickAccel|GUICtrlToolbar_ClickButton|GUICtrlToolbar_ClickIndex|GUICtrlToolbar_CommandToIndex|GUICtrlToolbar_Create|GUICtrlToolbar_Customize|GUICtrlToolbar_DeleteButton|GUICtrlToolbar_Destroy|GUICtrlToolbar_EnableButton|GUICtrlToolbar_FindToolbar|GUICtrlToolbar_GetAnchorHighlight|GUICtrlToolbar_GetBitmapFlags|GUICtrlToolbar_GetButtonBitmap|GUICtrlToolbar_GetButtonInfo|GUICtrlToolbar_GetButtonInfoEx|GUICtrlToolbar_GetButtonParam|GUICtrlToolbar_GetButtonRect|GUICtrlToolbar_GetButtonRectEx|GUICtrlToolbar_GetButtonSize|GUICtrlToolbar_GetButtonState|GUICtrlToolbar_GetButtonStyle|GUICtrlToolbar_GetButtonText|GUICtrlToolbar_GetColorScheme|GUICtrlToolbar_GetDisabledImageList|GUICtrlToolbar_GetExtendedStyle|GUICtrlToolbar_GetHotImageList|GUICtrlToolbar_GetHotItem|GUICtrlToolbar_GetImageList|GUICtrlToolbar_GetInsertMark|GUICtrlToolbar_GetInsertMarkColor|GUICtrlToolbar_GetMaxSize|GUICtrlToolbar_GetMetrics|GUICtrlToolbar_GetPadding|GUICtrlToolbar_GetRows|GUICtrlToolbar_GetString|GUICtrlToolbar_GetStyle|GUICtrlToolbar_GetStyleAltDrag|GUICtrlToolbar_GetStyleCustomErase|GUICtrlToolbar_GetStyleFlat|GUICtrlToolbar_GetStyleList|GUICtrlToolbar_GetStyleRegisterDrop|GUICtrlToolbar_GetStyleToolTips|GUICtrlToolbar_GetStyleTransparent|GUICtrlToolbar_GetStyleWrapable|GUICtrlToolbar_GetTextRows|GUICtrlToolbar_GetToolTips|GUICtrlToolbar_GetUnicodeFormat|GUICtrlToolbar_HideButton|GUICtrlToolbar_HighlightButton|GUICtrlToolbar_HitTest|GUICtrlToolbar_IndexToCommand|GUICtrlToolbar_InsertButton|GUICtrlToolbar_InsertMarkHitTest|GUICtrlToolbar_IsButtonChecked|GUICtrlToolbar_IsButtonEnabled|GUICtrlToolbar_IsButtonHidden|GUICtrlToolbar_IsButtonHighlighted|GUICtrlToolbar_IsButtonIndeterminate|GUICtrlToolbar_IsButtonPressed|GUICtrlToolbar_LoadBitmap|GUICtrlToolbar_LoadImages|GUICtrlToolbar_MapAccelerator|GUICtrlToolbar_MoveButton|GUICtrlToolbar_PressButton|GUICtrlToolbar_SetAnchorHighlight|GUICtrlToolbar_SetBitmapSize|GUICtrlToolbar_SetButtonBitMap|GUICtrlToolbar_SetButtonInfo|GUICtrlToolbar_SetButtonInfoEx|GUICtrlToolbar_SetButtonParam|GUICtrlToolbar_SetButtonSize|GUICtrlToolbar_SetButtonState|GUICtrlToolbar_SetButtonStyle|GUICtrlToolbar_SetButtonText|GUICtrlToolbar_SetButtonWidth|GUICtrlToolbar_SetCmdID|GUICtrlToolbar_SetColorScheme|GUICtrlToolbar_SetDisabledImageList|GUICtrlToolbar_SetDrawTextFlags|GUICtrlToolbar_SetExtendedStyle|GUICtrlToolbar_SetHotImageList|GUICtrlToolbar_SetHotItem|GUICtrlToolbar_SetImageList|GUICtrlToolbar_SetIndent|GUICtrlToolbar_SetIndeterminate|GUICtrlToolbar_SetInsertMark|GUICtrlToolbar_SetInsertMarkColor|GUICtrlToolbar_SetMaxTextRows|GUICtrlToolbar_SetMetrics|GUICtrlToolbar_SetPadding|GUICtrlToolbar_SetParent|GUICtrlToolbar_SetRows|GUICtrlToolbar_SetStyle|GUICtrlToolbar_SetStyleAltDrag|GUICtrlToolbar_SetStyleCustomErase|GUICtrlToolbar_SetStyleFlat|GUICtrlToolbar_SetStyleList|GUICtrlToolbar_SetStyleRegisterDrop|GUICtrlToolbar_SetStyleToolTips|GUICtrlToolbar_SetStyleTransparent|GUICtrlToolbar_SetStyleWrapable|GUICtrlToolbar_SetToolTips|GUICtrlToolbar_SetUnicodeFormat|GUICtrlToolbar_SetWindowTheme|GUICtrlTreeView_Add|GUICtrlTreeView_AddChild|GUICtrlTreeView_AddChildFirst|GUICtrlTreeView_AddFirst|GUICtrlTreeView_BeginUpdate|GUICtrlTreeView_ClickItem|GUICtrlTreeView_Create|GUICtrlTreeView_CreateDragImage|GUICtrlTreeView_CreateSolidBitMap|GUICtrlTreeView_Delete|GUICtrlTreeView_DeleteAll|GUICtrlTreeView_DeleteChildren|GUICtrlTreeView_Destroy|GUICtrlTreeView_DisplayRect|GUICtrlTreeView_DisplayRectEx|GUICtrlTreeView_EditText|GUICtrlTreeView_EndEdit|GUICtrlTreeView_EndUpdate|GUICtrlTreeView_EnsureVisible|GUICtrlTreeView_Expand|GUICtrlTreeView_ExpandedOnce|GUICtrlTreeView_FindItem|GUICtrlTreeView_FindItemEx|GUICtrlTreeView_GetBkColor|GUICtrlTreeView_GetBold|GUICtrlTreeView_GetChecked|GUICtrlTreeView_GetChildCount|GUICtrlTreeView_GetChildren|GUICtrlTreeView_GetCount|GUICtrlTreeView_GetCut|GUICtrlTreeView_GetDropTarget|GUICtrlTreeView_GetEditControl|GUICtrlTreeView_GetExpanded|GUICtrlTreeView_GetFirstChild|GUICtrlTreeView_GetFirstItem|GUICtrlTreeView_GetFirstVisible|GUICtrlTreeView_GetFocused|GUICtrlTreeView_GetHeight|GUICtrlTreeView_GetImageIndex|GUICtrlTreeView_GetImageListIconHandle|GUICtrlTreeView_GetIndent|GUICtrlTreeView_GetInsertMarkColor|GUICtrlTreeView_GetISearchString|GUICtrlTreeView_GetItemByIndex|GUICtrlTreeView_GetItemHandle|GUICtrlTreeView_GetItemParam|GUICtrlTreeView_GetLastChild|GUICtrlTreeView_GetLineColor|GUICtrlTreeView_GetNext|GUICtrlTreeView_GetNextChild|GUICtrlTreeView_GetNextSibling|GUICtrlTreeView_GetNextVisible|GUICtrlTreeView_GetNormalImageList|GUICtrlTreeView_GetParentHandle|GUICtrlTreeView_GetParentParam|GUICtrlTreeView_GetPrev|GUICtrlTreeView_GetPrevChild|GUICtrlTreeView_GetPrevSibling|GUICtrlTreeView_GetPrevVisible|GUICtrlTreeView_GetScrollTime|GUICtrlTreeView_GetSelected|GUICtrlTreeView_GetSelectedImageIndex|GUICtrlTreeView_GetSelection|GUICtrlTreeView_GetSiblingCount|GUICtrlTreeView_GetState|GUICtrlTreeView_GetStateImageIndex|GUICtrlTreeView_GetStateImageList|GUICtrlTreeView_GetText|GUICtrlTreeView_GetTextColor|GUICtrlTreeView_GetToolTips|GUICtrlTreeView_GetTree|GUICtrlTreeView_GetUnicodeFormat|GUICtrlTreeView_GetVisible|GUICtrlTreeView_GetVisibleCount|GUICtrlTreeView_HitTest|GUICtrlTreeView_HitTestEx|GUICtrlTreeView_HitTestItem|GUICtrlTreeView_Index|GUICtrlTreeView_InsertItem|GUICtrlTreeView_IsFirstItem|GUICtrlTreeView_IsParent|GUICtrlTreeView_Level|GUICtrlTreeView_SelectItem|GUICtrlTreeView_SelectItemByIndex|GUICtrlTreeView_SetBkColor|GUICtrlTreeView_SetBold|GUICtrlTreeView_SetChecked|GUICtrlTreeView_SetCheckedByIndex|GUICtrlTreeView_SetChildren|GUICtrlTreeView_SetCut|GUICtrlTreeView_SetDropTarget|GUICtrlTreeView_SetFocused|GUICtrlTreeView_SetHeight|GUICtrlTreeView_SetIcon|GUICtrlTreeView_SetImageIndex|GUICtrlTreeView_SetIndent|GUICtrlTreeView_SetInsertMark|GUICtrlTreeView_SetInsertMarkColor|GUICtrlTreeView_SetItemHeight|GUICtrlTreeView_SetItemParam|GUICtrlTreeView_SetLineColor|GUICtrlTreeView_SetNormalImageList|GUICtrlTreeView_SetScrollTime|GUICtrlTreeView_SetSelected|GUICtrlTreeView_SetSelectedImageIndex|GUICtrlTreeView_SetState|GUICtrlTreeView_SetStateImageIndex|GUICtrlTreeView_SetStateImageList|GUICtrlTreeView_SetText|GUICtrlTreeView_SetTextColor|GUICtrlTreeView_SetToolTips|GUICtrlTreeView_SetUnicodeFormat|GUICtrlTreeView_Sort|GUIImageList_Add|GUIImageList_AddBitmap|GUIImageList_AddIcon|GUIImageList_AddMasked|GUIImageList_BeginDrag|GUIImageList_Copy|GUIImageList_Create|GUIImageList_Destroy|GUIImageList_DestroyIcon|GUIImageList_DragEnter|GUIImageList_DragLeave|GUIImageList_DragMove|GUIImageList_Draw|GUIImageList_DrawEx|GUIImageList_Duplicate|GUIImageList_EndDrag|GUIImageList_GetBkColor|GUIImageList_GetIcon|GUIImageList_GetIconHeight|GUIImageList_GetIconSize|GUIImageList_GetIconSizeEx|GUIImageList_GetIconWidth|GUIImageList_GetImageCount|GUIImageList_GetImageInfoEx|GUIImageList_Remove|GUIImageList_ReplaceIcon|GUIImageList_SetBkColor|GUIImageList_SetIconSize|GUIImageList_SetImageCount|GUIImageList_Swap|GUIScrollBars_EnableScrollBar|GUIScrollBars_GetScrollBarInfoEx|GUIScrollBars_GetScrollBarRect|GUIScrollBars_GetScrollBarRGState|GUIScrollBars_GetScrollBarXYLineButton|GUIScrollBars_GetScrollBarXYThumbBottom|GUIScrollBars_GetScrollBarXYThumbTop|GUIScrollBars_GetScrollInfo|GUIScrollBars_GetScrollInfoEx|GUIScrollBars_GetScrollInfoMax|GUIScrollBars_GetScrollInfoMin|GUIScrollBars_GetScrollInfoPage|GUIScrollBars_GetScrollInfoPos|GUIScrollBars_GetScrollInfoTrackPos|GUIScrollBars_GetScrollPos|GUIScrollBars_GetScrollRange|GUIScrollBars_Init|GUIScrollBars_ScrollWindow|GUIScrollBars_SetScrollInfo|GUIScrollBars_SetScrollInfoMax|GUIScrollBars_SetScrollInfoMin|GUIScrollBars_SetScrollInfoPage|GUIScrollBars_SetScrollInfoPos|GUIScrollBars_SetScrollRange|GUIScrollBars_ShowScrollBar|GUIToolTip_Activate|GUIToolTip_AddTool|GUIToolTip_AdjustRect|GUIToolTip_BitsToTTF|GUIToolTip_Create|GUIToolTip_DelTool|GUIToolTip_Destroy|GUIToolTip_EnumTools|GUIToolTip_GetBubbleHeight|GUIToolTip_GetBubbleSize|GUIToolTip_GetBubbleWidth|GUIToolTip_GetCurrentTool|GUIToolTip_GetDelayTime|GUIToolTip_GetMargin|GUIToolTip_GetMarginEx|GUIToolTip_GetMaxTipWidth|GUIToolTip_GetText|GUIToolTip_GetTipBkColor|GUIToolTip_GetTipTextColor|GUIToolTip_GetTitleBitMap|GUIToolTip_GetTitleText|GUIToolTip_GetToolCount|GUIToolTip_GetToolInfo|GUIToolTip_HitTest|GUIToolTip_NewToolRect|GUIToolTip_Pop|GUIToolTip_PopUp|GUIToolTip_SetDelayTime|GUIToolTip_SetMargin|GUIToolTip_SetMaxTipWidth|GUIToolTip_SetTipBkColor|GUIToolTip_SetTipTextColor|GUIToolTip_SetTitle|GUIToolTip_SetToolInfo|GUIToolTip_SetWindowTheme|GUIToolTip_ToolExists|GUIToolTip_ToolToArray|GUIToolTip_TrackActivate|GUIToolTip_TrackPosition|GUIToolTip_TTFToBits|GUIToolTip_Update|GUIToolTip_UpdateTipText|HexToString|IE_Example|IE_Introduction|IE_VersionInfo|IEAction|IEAttach|IEBodyReadHTML|IEBodyReadText|IEBodyWriteHTML|IECreate|IECreateEmbedded|IEDocGetObj|IEDocInsertHTML|IEDocInsertText|IEDocReadHTML|IEDocWriteHTML|IEErrorHandlerDeRegister|IEErrorHandlerRegister|IEErrorNotify|IEFormElementCheckBoxSelect|IEFormElementGetCollection|IEFormElementGetObjByName|IEFormElementGetValue|IEFormElementOptionSelect|IEFormElementRadioSelect|IEFormElementSetValue|IEFormGetCollection|IEFormGetObjByName|IEFormImageClick|IEFormReset|IEFormSubmit|IEFrameGetCollection|IEFrameGetObjByName|IEGetObjById|IEGetObjByName|IEHeadInsertEventScript|IEImgClick|IEImgGetCollection|IEIsFrameSet|IELinkClickByIndex|IELinkClickByText|IELinkGetCollection|IELoadWait|IELoadWaitTimeout|IENavigate|IEPropertyGet|IEPropertySet|IEQuit|IETableGetCollection|IETableWriteToArray|IETagNameAllGetCollection|IETagNameGetCollection|Iif|INetExplorerCapable|INetGetSource|INetMail|INetSmtpMail|IsPressed|MathCheckDiv|Max|MemGlobalAlloc|MemGlobalFree|MemGlobalLock|MemGlobalSize|MemGlobalUnlock|MemMoveMemory|MemMsgBox|MemShowError|MemVirtualAlloc|MemVirtualAllocEx|MemVirtualFree|MemVirtualFreeEx|Min|MouseTrap|NamedPipes_CallNamedPipe|NamedPipes_ConnectNamedPipe|NamedPipes_CreateNamedPipe|NamedPipes_CreatePipe|NamedPipes_DisconnectNamedPipe|NamedPipes_GetNamedPipeHandleState|NamedPipes_GetNamedPipeInfo|NamedPipes_PeekNamedPipe|NamedPipes_SetNamedPipeHandleState|NamedPipes_TransactNamedPipe|NamedPipes_WaitNamedPipe|Net_Share_ConnectionEnum|Net_Share_FileClose|Net_Share_FileEnum|Net_Share_FileGetInfo|Net_Share_PermStr|Net_Share_ResourceStr|Net_Share_SessionDel|Net_Share_SessionEnum|Net_Share_SessionGetInfo|Net_Share_ShareAdd|Net_Share_ShareCheck|Net_Share_ShareDel|Net_Share_ShareEnum|Net_Share_ShareGetInfo|Net_Share_ShareSetInfo|Net_Share_StatisticsGetSvr|Net_Share_StatisticsGetWrk|Now|NowCalc|NowCalcDate|NowDate|NowTime|PathFull|PathMake|PathSplit|ProcessGetName|ProcessGetPriority|Radian|ReplaceStringInFile|RunDOS|ScreenCapture_Capture|ScreenCapture_CaptureWnd|ScreenCapture_SaveImage|ScreenCapture_SetBMPFormat|ScreenCapture_SetJPGQuality|ScreenCapture_SetTIFColorDepth|ScreenCapture_SetTIFCompression|Security__AdjustTokenPrivileges|Security__GetAccountSid|Security__GetLengthSid|Security__GetTokenInformation|Security__ImpersonateSelf|Security__IsValidSid|Security__LookupAccountName|Security__LookupAccountSid|Security__LookupPrivilegeValue|Security__OpenProcessToken|Security__OpenThreadToken|Security__OpenThreadTokenEx|Security__SetPrivilege|Security__SidToStringSid|Security__SidTypeStr|Security__StringSidToSid|SendMessage|SendMessageA|SetDate|SetTime|Singleton|SoundClose|SoundLength|SoundOpen|SoundPause|SoundPlay|SoundPos|SoundResume|SoundSeek|SoundStatus|SoundStop|SQLite_Changes|SQLite_Close|SQLite_Display2DResult|SQLite_Encode|SQLite_ErrCode|SQLite_ErrMsg|SQLite_Escape|SQLite_Exec|SQLite_FetchData|SQLite_FetchNames|SQLite_GetTable|SQLite_GetTable2d|SQLite_LastInsertRowID|SQLite_LibVersion|SQLite_Open|SQLite_Query|SQLite_QueryFinalize|SQLite_QueryReset|SQLite_QuerySingleRow|SQLite_SaveMode|SQLite_SetTimeout|SQLite_Shutdown|SQLite_SQLiteExe|SQLite_Startup|SQLite_TotalChanges|StringAddComma|StringBetween|StringEncrypt|StringInsert|StringProper|StringRepeat|StringReverse|StringSplit|StringToHex|TCPIpToName|TempFile|TicksToTime|Timer_Diff|Timer_GetTimerID|Timer_Init|Timer_KillAllTimers|Timer_KillTimer|Timer_SetTimer|TimeToTicks|VersionCompare|viClose|viExecCommand|viFindGpib|viGpibBusReset|viGTL|viOpen|viSetAttribute|viSetTimeout|WeekNumberISO|WinAPI_AttachConsole|WinAPI_AttachThreadInput|WinAPI_Beep|WinAPI_BitBlt|WinAPI_CallNextHookEx|WinAPI_Check|WinAPI_ClientToScreen|WinAPI_CloseHandle|WinAPI_CommDlgExtendedError|WinAPI_CopyIcon|WinAPI_CreateBitmap|WinAPI_CreateCompatibleBitmap|WinAPI_CreateCompatibleDC|WinAPI_CreateEvent|WinAPI_CreateFile|WinAPI_CreateFont|WinAPI_CreateFontIndirect|WinAPI_CreateProcess|WinAPI_CreateSolidBitmap|WinAPI_CreateSolidBrush|WinAPI_CreateWindowEx|WinAPI_DefWindowProc|WinAPI_DeleteDC|WinAPI_DeleteObject|WinAPI_DestroyIcon|WinAPI_DestroyWindow|WinAPI_DrawEdge|WinAPI_DrawFrameControl|WinAPI_DrawIcon|WinAPI_DrawIconEx|WinAPI_DrawText|WinAPI_EnableWindow|WinAPI_EnumDisplayDevices|WinAPI_EnumWindows|WinAPI_EnumWindowsPopup|WinAPI_EnumWindowsTop|WinAPI_ExpandEnvironmentStrings|WinAPI_ExtractIconEx|WinAPI_FatalAppExit|WinAPI_FillRect|WinAPI_FindExecutable|WinAPI_FindWindow|WinAPI_FlashWindow|WinAPI_FlashWindowEx|WinAPI_FloatToInt|WinAPI_FlushFileBuffers|WinAPI_FormatMessage|WinAPI_FrameRect|WinAPI_FreeLibrary|WinAPI_GetAncestor|WinAPI_GetAsyncKeyState|WinAPI_GetClassName|WinAPI_GetClientHeight|WinAPI_GetClientRect|WinAPI_GetClientWidth|WinAPI_GetCurrentProcess|WinAPI_GetCurrentProcessID|WinAPI_GetCurrentThread|WinAPI_GetCurrentThreadId|WinAPI_GetCursorInfo|WinAPI_GetDC|WinAPI_GetDesktopWindow|WinAPI_GetDeviceCaps|WinAPI_GetDIBits|WinAPI_GetDlgCtrlID|WinAPI_GetDlgItem|WinAPI_GetFileSizeEx|WinAPI_GetFocus|WinAPI_GetForegroundWindow|WinAPI_GetIconInfo|WinAPI_GetLastError|WinAPI_GetLastErrorMessage|WinAPI_GetModuleHandle|WinAPI_GetMousePos|WinAPI_GetMousePosX|WinAPI_GetMousePosY|WinAPI_GetObject|WinAPI_GetOpenFileName|WinAPI_GetOverlappedResult|WinAPI_GetParent|WinAPI_GetProcessAffinityMask|WinAPI_GetSaveFileName|WinAPI_GetStdHandle|WinAPI_GetStockObject|WinAPI_GetSysColor|WinAPI_GetSysColorBrush|WinAPI_GetSystemMetrics|WinAPI_GetTextExtentPoint32|WinAPI_GetWindow|WinAPI_GetWindowDC|WinAPI_GetWindowHeight|WinAPI_GetWindowLong|WinAPI_GetWindowRect|WinAPI_GetWindowText|WinAPI_GetWindowThreadProcessId|WinAPI_GetWindowWidth|WinAPI_GetXYFromPoint|WinAPI_GlobalMemStatus|WinAPI_GUIDFromString|WinAPI_GUIDFromStringEx|WinAPI_HiWord|WinAPI_InProcess|WinAPI_IntToFloat|WinAPI_InvalidateRect|WinAPI_IsClassName|WinAPI_IsWindow|WinAPI_IsWindowVisible|WinAPI_LoadBitmap|WinAPI_LoadImage|WinAPI_LoadLibrary|WinAPI_LoadLibraryEx|WinAPI_LoadShell32Icon|WinAPI_LoadString|WinAPI_LocalFree|WinAPI_LoWord|WinAPI_MakeDWord|WinAPI_MAKELANGID|WinAPI_MAKELCID|WinAPI_MakeLong|WinAPI_MessageBeep|WinAPI_Mouse_Event|WinAPI_MoveWindow|WinAPI_MsgBox|WinAPI_MulDiv|WinAPI_MultiByteToWideChar|WinAPI_MultiByteToWideCharEx|WinAPI_OpenProcess|WinAPI_PointFromRect|WinAPI_PostMessage|WinAPI_PrimaryLangId|WinAPI_PtInRect|WinAPI_ReadFile|WinAPI_ReadProcessMemory|WinAPI_RectIsEmpty|WinAPI_RedrawWindow|WinAPI_RegisterWindowMessage|WinAPI_ReleaseCapture|WinAPI_ReleaseDC|WinAPI_ScreenToClient|WinAPI_SelectObject|WinAPI_SetBkColor|WinAPI_SetCapture|WinAPI_SetCursor|WinAPI_SetDefaultPrinter|WinAPI_SetDIBits|WinAPI_SetEvent|WinAPI_SetFocus|WinAPI_SetFont|WinAPI_SetHandleInformation|WinAPI_SetLastError|WinAPI_SetParent|WinAPI_SetProcessAffinityMask|WinAPI_SetSysColors|WinAPI_SetTextColor|WinAPI_SetWindowLong|WinAPI_SetWindowPos|WinAPI_SetWindowsHookEx|WinAPI_SetWindowText|WinAPI_ShowCursor|WinAPI_ShowError|WinAPI_ShowMsg|WinAPI_ShowWindow|WinAPI_StringFromGUID|WinAPI_SubLangId|WinAPI_SystemParametersInfo|WinAPI_TwipsPerPixelX|WinAPI_TwipsPerPixelY|WinAPI_UnhookWindowsHookEx|WinAPI_UpdateLayeredWindow|WinAPI_UpdateWindow|WinAPI_ValidateClassName|WinAPI_WaitForInputIdle|WinAPI_WaitForMultipleObjects|WinAPI_WaitForSingleObject|WinAPI_WideCharToMultiByte|WinAPI_WindowFromPoint|WinAPI_WriteConsole|WinAPI_WriteFile|WinAPI_WriteProcessMemory|WinNet_AddConnection|WinNet_AddConnection2|WinNet_AddConnection3|WinNet_CancelConnection|WinNet_CancelConnection2|WinNet_CloseEnum|WinNet_ConnectionDialog|WinNet_ConnectionDialog1|WinNet_DisconnectDialog|WinNet_DisconnectDialog1|WinNet_EnumResource|WinNet_GetConnection|WinNet_GetConnectionPerformance|WinNet_GetLastError|WinNet_GetNetworkInformation|WinNet_GetProviderName|WinNet_GetResourceInformation|WinNet_GetResourceParent|WinNet_GetUniversalName|WinNet_GetUser|WinNet_OpenEnum|WinNet_RestoreConnection|WinNet_UseConnection|Word_VersionInfo|WordAttach|WordCreate|WordDocAdd|WordDocAddLink|WordDocAddPicture|WordDocClose|WordDocFindReplace|WordDocGetCollection|WordDocLinkGetCollection|WordDocOpen|WordDocPrint|WordDocPropertyGet|WordDocPropertySet|WordDocSave|WordDocSaveAs|WordErrorHandlerDeRegister|WordErrorHandlerRegister|WordErrorNotify|WordMacroRun|WordPropertyGet|WordPropertySet|WordQuit|' + + 'ce|comments-end|comments-start|cs|include|include-once|NoTrayIcon|RequireAdmin|' + + 'AutoIt3Wrapper_Au3Check_Parameters|AutoIt3Wrapper_Au3Check_Stop_OnWarning|AutoIt3Wrapper_Change2CUI|AutoIt3Wrapper_Compression|AutoIt3Wrapper_cvsWrapper_Parameters|AutoIt3Wrapper_Icon|AutoIt3Wrapper_Outfile|AutoIt3Wrapper_Outfile_Type|AutoIt3Wrapper_Plugin_Funcs|AutoIt3Wrapper_Res_Comment|AutoIt3Wrapper_Res_Description|AutoIt3Wrapper_Res_Field|AutoIt3Wrapper_Res_File_Add|AutoIt3Wrapper_Res_Fileversion|AutoIt3Wrapper_Res_FileVersion_AutoIncrement|AutoIt3Wrapper_Res_Icon_Add|AutoIt3Wrapper_Res_Language|AutoIt3Wrapper_Res_LegalCopyright|AutoIt3Wrapper_res_requestedExecutionLevel|AutoIt3Wrapper_Res_SaveSource|AutoIt3Wrapper_Run_After|AutoIt3Wrapper_Run_Au3check|AutoIt3Wrapper_Run_Before|AutoIt3Wrapper_Run_cvsWrapper|AutoIt3Wrapper_Run_Debug_Mode|AutoIt3Wrapper_Run_Obfuscator|AutoIt3Wrapper_Run_Tidy|AutoIt3Wrapper_Tidy_Stop_OnError|AutoIt3Wrapper_UseAnsi|AutoIt3Wrapper_UseUpx|AutoIt3Wrapper_UseX64|AutoIt3Wrapper_Version|EndRegion|forceref|Obfuscator_Ignore_Funcs|Obfuscator_Ignore_Variables|Obfuscator_Parameters|Region|Tidy_Parameters' + var atKeywords = 'AppDataCommonDir|AppDataDir|AutoItExe|AutoItPID|AutoItUnicode|AutoItVersion|AutoItX64|COM_EventObj|CommonFilesDir|Compiled|ComputerName|ComSpec|CR|CRLF|DesktopCommonDir|DesktopDepth|DesktopDir|DesktopHeight|DesktopRefresh|DesktopWidth|DocumentsCommonDir|error|exitCode|exitMethod|extended|FavoritesCommonDir|FavoritesDir|GUI_CtrlHandle|GUI_CtrlId|GUI_DragFile|GUI_DragId|GUI_DropId|GUI_WinHandle|HomeDrive|HomePath|HomeShare|HotKeyPressed|HOUR|InetGetActive|InetGetBytesRead|IPAddress1|IPAddress2|IPAddress3|IPAddress4|KBLayout|LF|LogonDNSDomain|LogonDomain|LogonServer|MDAY|MIN|MON|MyDocumentsDir|NumParams|OSBuild|OSLang|OSServicePack|OSTYPE|OSVersion|ProcessorArch|ProgramFilesDir|ProgramsCommonDir|ProgramsDir|ScriptDir|ScriptFullPath|ScriptLineNumber|ScriptName|SEC|StartMenuCommonDir|StartMenuDir|StartupCommonDir|StartupDir|SW_DISABLE|SW_ENABLE|SW_HIDE|SW_LOCK|SW_MAXIMIZE|SW_MINIMIZE|SW_RESTORE|SW_SHOW|SW_SHOWDEFAULT|SW_SHOWMAXIMIZED|SW_SHOWMINIMIZED|SW_SHOWMINNOACTIVE|SW_SHOWNA|SW_SHOWNOACTIVATE|SW_SHOWNORMAL|SW_UNLOCK|SystemDir|TAB|TempDir|TRAY_ID|TrayIconFlashing|TrayIconVisible|UserName|UserProfileDir|WDAY|WindowsDir|WorkingDir|YDAY|YEAR' + + this.$rules = { start: + [ { token: 'comment.line.ahk', regex: '(?:^| );.*$' }, + { token: 'comment.block.ahk', + regex: '/\\*', push: + [ { token: 'comment.block.ahk', regex: '\\*/', next: 'pop' }, + { defaultToken: 'comment.block.ahk' } ] }, + { token: 'doc.comment.ahk', + regex: '#cs', push: + [ { token: 'doc.comment.ahk', regex: '#ce', next: 'pop' }, + { defaultToken: 'doc.comment.ahk' } ] }, + { token: 'keyword.command.ahk', + regex: '(?:\\b|^)(?:allowsamelinecomments|clipboardtimeout|commentflag|errorstdout|escapechar|hotkeyinterval|hotkeymodifiertimeout|hotstring|include|includeagain|installkeybdhook|installmousehook|keyhistory|ltrim|maxhotkeysperinterval|maxmem|maxthreads|maxthreadsbuffer|maxthreadsperhotkey|noenv|notrayicon|persistent|singleinstance|usehook|winactivateforce|autotrim|blockinput|click|clipwait|continue|control|controlclick|controlfocus|controlget|controlgetfocus|controlgetpos|controlgettext|controlmove|controlsend|controlsendraw|controlsettext|coordmode|critical|detecthiddentext|detecthiddenwindows|drive|driveget|drivespacefree|edit|endrepeat|envadd|envdiv|envget|envmult|envset|envsub|envupdate|exit|exitapp|fileappend|filecopy|filecopydir|filecreatedir|filecreateshortcut|filedelete|filegetattrib|filegetshortcut|filegetsize|filegettime|filegetversion|fileinstall|filemove|filemovedir|fileread|filereadline|filerecycle|filerecycleempty|fileremovedir|fileselectfile|fileselectfolder|filesetattrib|filesettime|formattime|getkeystate|gosub|goto|groupactivate|groupadd|groupclose|groupdeactivate|gui|guicontrol|guicontrolget|hideautoitwin|hotkey|ifequal|ifexist|ifgreater|ifgreaterorequal|ifinstring|ifless|iflessorequal|ifmsgbox|ifnotequal|ifnotexist|ifnotinstring|ifwinactive|ifwinexist|ifwinnotactive|ifwinnotexist|imagesearch|inidelete|iniread|iniwrite|input|inputbox|keyhistory|keywait|listhotkeys|listlines|listvars|menu|mouseclick|mouseclickdrag|mousegetpos|mousemove|msgbox|onexit|outputdebug|pause|pixelgetcolor|pixelsearch|postmessage|process|progress|random|regdelete|regread|regwrite|reload|repeat|run|runas|runwait|send|sendevent|sendinput|sendmode|sendplay|sendmessage|sendraw|setbatchlines|setcapslockstate|setcontroldelay|setdefaultmousespeed|setenv|setformat|setkeydelay|setmousedelay|setnumlockstate|setscrolllockstate|setstorecapslockmode|settimer|settitlematchmode|setwindelay|setworkingdir|shutdown|sleep|sort|soundbeep|soundget|soundgetwavevolume|soundplay|soundset|soundsetwavevolume|splashimage|splashtextoff|splashtexton|splitpath|statusbargettext|statusbarwait|stringcasesense|stringgetpos|stringleft|stringlen|stringlower|stringmid|stringreplace|stringright|stringsplit|stringtrimleft|stringtrimright|stringupper|suspend|sysget|thread|tooltip|transform|traytip|urldownloadtofile|while|winactivate|winactivatebottom|winclose|winget|wingetactivestats|wingetactivetitle|wingetclass|wingetpos|wingettext|wingettitle|winhide|winkill|winmaximize|winmenuselectitem|winminimize|winminimizeall|winminimizeallundo|winmove|winrestore|winset|winsettitle|winshow|winwait|winwaitactive|winwaitclose|winwaitnotactive)\\b', + caseInsensitive: true }, + { token: 'keyword.control.ahk', + regex: '(?:\\b|^)(?:if|else|return|loop|break|for|while|global|local|byref)\\b', + caseInsensitive: true }, + { token: 'support.function.ahk', + regex: '(?:\\b|^)(?:abs|acos|asc|asin|atan|ceil|chr|cos|dllcall|exp|fileexist|floor|getkeystate|il_add|il_create|il_destroy|instr|substr|isfunc|islabel|ln|log|lv_add|lv_delete|lv_deletecol|lv_getcount|lv_getnext|lv_gettext|lv_insert|lv_insertcol|lv_modify|lv_modifycol|lv_setimagelist|mod|onmessage|numget|numput|registercallback|regexmatch|regexreplace|round|sin|tan|sqrt|strlen|sb_seticon|sb_setparts|sb_settext|tv_add|tv_delete|tv_getchild|tv_getcount|tv_getnext|tv_get|tv_getparent|tv_getprev|tv_getselection|tv_gettext|tv_modify|varsetcapacity|winactive|winexist)\\b', + caseInsensitive: true }, + { token: 'variable.predefined.ahk', + regex: '(?:\\b|^)(?:a_ahkpath|a_ahkversion|a_appdata|a_appdatacommon|a_autotrim|a_batchlines|a_caretx|a_carety|a_computername|a_controldelay|a_cursor|a_dd|a_ddd|a_dddd|a_defaultmousespeed|a_desktop|a_desktopcommon|a_detecthiddentext|a_detecthiddenwindows|a_endchar|a_eventinfo|a_exitreason|a_formatfloat|a_formatinteger|a_gui|a_guievent|a_guicontrol|a_guicontrolevent|a_guiheight|a_guiwidth|a_guix|a_guiy|a_hour|a_iconfile|a_iconhidden|a_iconnumber|a_icontip|a_index|a_ipaddress1|a_ipaddress2|a_ipaddress3|a_ipaddress4|a_isadmin|a_iscompiled|a_iscritical|a_ispaused|a_issuspended|a_keydelay|a_language|a_lasterror|a_linefile|a_linenumber|a_loopfield|a_loopfileattrib|a_loopfiledir|a_loopfileext|a_loopfilefullpath|a_loopfilelongpath|a_loopfilename|a_loopfileshortname|a_loopfileshortpath|a_loopfilesize|a_loopfilesizekb|a_loopfilesizemb|a_loopfiletimeaccessed|a_loopfiletimecreated|a_loopfiletimemodified|a_loopreadline|a_loopregkey|a_loopregname|a_loopregsubkey|a_loopregtimemodified|a_loopregtype|a_mday|a_min|a_mm|a_mmm|a_mmmm|a_mon|a_mousedelay|a_msec|a_mydocuments|a_now|a_nowutc|a_numbatchlines|a_ostype|a_osversion|a_priorhotkey|programfiles|a_programfiles|a_programs|a_programscommon|a_screenheight|a_screenwidth|a_scriptdir|a_scriptfullpath|a_scriptname|a_sec|a_space|a_startmenu|a_startmenucommon|a_startup|a_startupcommon|a_stringcasesense|a_tab|a_temp|a_thisfunc|a_thishotkey|a_thislabel|a_thismenu|a_thismenuitem|a_thismenuitempos|a_tickcount|a_timeidle|a_timeidlephysical|a_timesincepriorhotkey|a_timesincethishotkey|a_titlematchmode|a_titlematchmodespeed|a_username|a_wday|a_windelay|a_windir|a_workingdir|a_yday|a_year|a_yweek|a_yyyy|clipboard|clipboardall|comspec|errorlevel)\\b', + caseInsensitive: true }, + { token: 'support.constant.ahk', + regex: '(?:\\b|^)(?:shift|lshift|rshift|alt|lalt|ralt|control|lcontrol|rcontrol|ctrl|lctrl|rctrl|lwin|rwin|appskey|altdown|altup|shiftdown|shiftup|ctrldown|ctrlup|lwindown|lwinup|rwindown|rwinup|lbutton|rbutton|mbutton|wheelup|wheelleft|wheelright|wheeldown|xbutton1|xbutton2|joy1|joy2|joy3|joy4|joy5|joy6|joy7|joy8|joy9|joy10|joy11|joy12|joy13|joy14|joy15|joy16|joy17|joy18|joy19|joy20|joy21|joy22|joy23|joy24|joy25|joy26|joy27|joy28|joy29|joy30|joy31|joy32|joyx|joyy|joyz|joyr|joyu|joyv|joypov|joyname|joybuttons|joyaxes|joyinfo|space|tab|enter|escape|esc|backspace|bs|delete|del|insert|ins|pgup|pgdn|home|end|up|down|left|right|printscreen|ctrlbreak|pause|scrolllock|capslock|numlock|numpad0|numpad1|numpad2|numpad3|numpad4|numpad5|numpad6|numpad7|numpad8|numpad9|numpadmult|numpadadd|numpadsub|numpaddiv|numpaddot|numpaddel|numpadins|numpadclear|numpadup|numpaddown|numpadleft|numpadright|numpadhome|numpadend|numpadpgup|numpadpgdn|numpadenter|f1|f2|f3|f4|f5|f6|f7|f8|f9|f10|f11|f12|f13|f14|f15|f16|f17|f18|f19|f20|f21|f22|f23|f24|browser_back|browser_forward|browser_refresh|browser_stop|browser_search|browser_favorites|browser_home|volume_mute|volume_down|volume_up|media_next|media_prev|media_stop|media_play_pause|launch_mail|launch_media|launch_app1|launch_app2)\\b', + caseInsensitive: true }, + { token: 'variable.parameter', + regex: '(?:\\b|^)(?:pixel|mouse|screen|relative|rgb|ltrim|rtrim|join|low|belownormal|normal|abovenormal|high|realtime|ahk_id|ahk_pid|ahk_class|ahk_group|between|contains|in|is|integer|float|integerfast|floatfast|number|digit|xdigit|alpha|upper|lower|alnum|time|date|not|or|and|alwaysontop|topmost|top|bottom|transparent|transcolor|redraw|region|id|idlast|processname|minmax|controllist|count|list|capacity|statuscd|eject|lock|unlock|label|filesystem|label|setlabel|serial|type|status|static|seconds|minutes|hours|days|read|parse|logoff|close|error|single|tray|add|rename|check|uncheck|togglecheck|enable|disable|toggleenable|default|nodefault|standard|nostandard|color|delete|deleteall|icon|noicon|tip|click|show|mainwindow|nomainwindow|useerrorlevel|text|picture|pic|groupbox|button|checkbox|radio|dropdownlist|ddl|combobox|listbox|listview|datetime|monthcal|updown|slider|tab|tab2|statusbar|treeview|iconsmall|tile|report|sortdesc|nosort|nosorthdr|grid|hdr|autosize|range|xm|ym|ys|xs|xp|yp|font|resize|owner|submit|nohide|minimize|maximize|restore|noactivate|na|cancel|destroy|center|margin|maxsize|minsize|owndialogs|guiescape|guiclose|guisize|guicontextmenu|guidropfiles|tabstop|section|altsubmit|wrap|hscroll|vscroll|border|top|bottom|buttons|expand|first|imagelist|lines|wantctrla|wantf2|vis|visfirst|number|uppercase|lowercase|limit|password|multi|wantreturn|group|background|bold|italic|strike|underline|norm|backgroundtrans|theme|caption|delimiter|minimizebox|maximizebox|sysmenu|toolwindow|flash|style|exstyle|check3|checked|checkedgray|readonly|password|hidden|left|right|center|notab|section|move|focus|hide|choose|choosestring|text|pos|enabled|disabled|visible|lastfound|lastfoundexist|alttab|shiftalttab|alttabmenu|alttabandmenu|alttabmenudismiss|notimers|interrupt|priority|waitclose|blind|raw|unicode|deref|pow|bitnot|bitand|bitor|bitxor|bitshiftleft|bitshiftright|yes|no|ok|cancel|abort|retry|ignore|tryagain|on|off|all|hkey_local_machine|hkey_users|hkey_current_user|hkey_classes_root|hkey_current_config|hklm|hku|hkcu|hkcr|hkcc|reg_sz|reg_expand_sz|reg_multi_sz|reg_dword|reg_qword|reg_binary|reg_link|reg_resource_list|reg_full_resource_descriptor|reg_resource_requirements_list|reg_dword_big_endian)\\b', + caseInsensitive: true }, + { keywordMap: {"constant.language": autoItKeywords}, regex: '\\w+\\b'}, + { keywordMap: {"variable.function": atKeywords}, regex: '@\\w+\\b'}, + { token : "constant.numeric", regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b"}, + { token: 'keyword.operator.ahk', + regex: '=|==|<>|:=|<|>|\\*|\\/|\\+|:|\\?|\\-' }, + { token: 'punctuation.ahk', + regex: '#|`|::|,|\\{|\\}|\\(|\\)|\\%' }, + { token: + [ 'punctuation.quote.double', + 'string.quoted.ahk', + 'punctuation.quote.double' ], + regex: '(")((?:[^"]|"")*)(")' }, + { token: [ 'label.ahk', 'punctuation.definition.label.ahk' ], + regex: '^([^: ]+)(:)(?!:)' } ] } + + this.normalizeRules(); +}; + +AutoHotKeyHighlightRules.metaData = { name: 'AutoHotKey', + scopeName: 'source.ahk', + fileTypes: [ 'ahk' ], + foldingStartMarker: '^\\s*/\\*|^(?![^{]*?;|[^{]*?/\\*(?!.*?\\*/.*?\\{)).*?\\{\\s*($|;|/\\*(?!.*?\\*/.*\\S))', + foldingStopMarker: '^\\s*\\*/|^\\s*\\}' } + + +oop.inherits(AutoHotKeyHighlightRules, TextHighlightRules); + +exports.AutoHotKeyHighlightRules = AutoHotKeyHighlightRules; +}); + +ace.define('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var line = session.getLine(row); + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i + match[0].length, 1); + } + + if (foldStyle !== "markbeginend") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + +}).call(FoldMode.prototype); + +}); diff --git a/0.0.3_0/ace/mode-batchfile.js b/0.0.3_0/ace/mode-batchfile.js new file mode 100644 index 0000000..d95a4aa --- /dev/null +++ b/0.0.3_0/ace/mode-batchfile.js @@ -0,0 +1,171 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2012, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * + * Contributor(s): + * + * + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/mode/batchfile', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/batchfile_highlight_rules', 'ace/mode/folding/cstyle'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var BatchFileHighlightRules = require("./batchfile_highlight_rules").BatchFileHighlightRules; +var FoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + var highlighter = new BatchFileHighlightRules(); + this.foldingRules = new FoldMode(); + this.$tokenizer = new Tokenizer(highlighter.getRules()); +}; +oop.inherits(Mode, TextMode); + +(function() { + this.lineCommentStart = "::"; + this.blockComment = ""; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/batchfile_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var BatchFileHighlightRules = function() { + + this.$rules = { start: + [ { token: 'keyword.command.dosbatch', + regex: '\\b(?:append|assoc|at|attrib|break|cacls|cd|chcp|chdir|chkdsk|chkntfs|cls|cmd|color|comp|compact|convert|copy|date|del|dir|diskcomp|diskcopy|doskey|echo|endlocal|erase|fc|find|findstr|format|ftype|graftabl|help|keyb|label|md|mkdir|mode|more|move|path|pause|popd|print|prompt|pushd|rd|recover|ren|rename|replace|restore|rmdir|set|setlocal|shift|sort|start|subst|time|title|tree|type|ver|verify|vol|xcopy)\\b', + caseInsensitive: true }, + { token: 'keyword.control.statement.dosbatch', + regex: '\\b(?:goto|call|exit)\\b', + caseInsensitive: true }, + { token: 'keyword.control.conditional.if.dosbatch', + regex: '\\bif\\s+not\\s+(?:exist|defined|errorlevel|cmdextversion)\\b', + caseInsensitive: true }, + { token: 'keyword.control.conditional.dosbatch', + regex: '\\b(?:if|else)\\b', + caseInsensitive: true }, + { token: 'keyword.control.repeat.dosbatch', + regex: '\\bfor\\b', + caseInsensitive: true }, + { token: 'keyword.operator.dosbatch', + regex: '\\b(?:EQU|NEQ|LSS|LEQ|GTR|GEQ)\\b' }, + { token: ['doc.comment', 'comment'], + regex: '(?:^|\\b)(rem)($|\\s.*$)', + caseInsensitive: true }, + { token: 'comment.line.colons.dosbatch', + regex: '::.*$' }, + { include: 'variable' }, + { token: 'punctuation.definition.string.begin.shell', + regex: '"', + push: [ + { token: 'punctuation.definition.string.end.shell', regex: '"', next: 'pop' }, + { include: 'variable' }, + { defaultToken: 'string.quoted.double.dosbatch' } ] }, + { token: 'keyword.operator.pipe.dosbatch', regex: '[|]' }, + { token: 'keyword.operator.redirect.shell', + regex: '&>|\\d*>&\\d*|\\d*(?:>>|>|<)|\\d*<&|\\d*<>' } ], + variable: [ + { token: 'constant.numeric', regex: '%%\\w+'}, + { token: ['markup.list', 'constant.other', 'markup.list'], + regex: '(%)(\\w+)(%?)' }]} + + this.normalizeRules(); +}; + +BatchFileHighlightRules.metaData = { name: 'Batch File', + scopeName: 'source.dosbatch', + fileTypes: [ 'bat' ] } + + +oop.inherits(BatchFileHighlightRules, TextHighlightRules); + +exports.BatchFileHighlightRules = BatchFileHighlightRules; +}); + +ace.define('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var line = session.getLine(row); + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i + match[0].length, 1); + } + + if (foldStyle !== "markbeginend") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + +}).call(FoldMode.prototype); + +}); diff --git a/0.0.3_0/ace/mode-c9search.js b/0.0.3_0/ace/mode-c9search.js new file mode 100644 index 0000000..e63dd42 --- /dev/null +++ b/0.0.3_0/ace/mode-c9search.js @@ -0,0 +1,182 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2010, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/mode/c9search', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/c9search_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/mode/folding/c9search'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var C9SearchHighlightRules = require("./c9search_highlight_rules").C9SearchHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var C9StyleFoldMode = require("./folding/c9search").FoldMode; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new C9SearchHighlightRules().getRules()); + this.$outdent = new MatchingBraceOutdent(); + this.foldingRules = new C9StyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; + +}); + +ace.define('ace/mode/c9search_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var C9SearchHighlightRules = function() { + this.$rules = { + "start" : [ + { + token : ["c9searchresults.constant.numeric", "c9searchresults.text", "c9searchresults.text"], + regex : "(^\\s+[0-9]+)(:\\s*)(.+)" + }, + { + token : ["string", "text"], // single line + regex : "(.+)(:$)" + } + ] + }; +}; + +oop.inherits(C9SearchHighlightRules, TextHighlightRules); + +exports.C9SearchHighlightRules = C9SearchHighlightRules; + +}); + +ace.define('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) { + + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + + +ace.define('ace/mode/folding/c9search', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function() {}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /^(\S.*\:|Searching for.*)$/; + this.foldingStopMarker = /^(\s+|Found.*)$/; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var lines = session.doc.getAllLines(row); + var line = lines[row]; + var level1 = /^(Found.*|Searching for.*)$/; + var level2 = /^(\S.*\:|\s*)$/; + var re = level1.test(line) ? level1 : level2; + + if (this.foldingStartMarker.test(line)) { + for (var i = row + 1, l = session.getLength(); i < l; i++) { + if (re.test(lines[i])) + break; + } + + return new Range(row, line.length, i, 0); + } + + if (this.foldingStopMarker.test(line)) { + for (var i = row - 1; i >= 0; i--) { + line = lines[i]; + if (re.test(line)) + break; + } + + return new Range(i, line.length, row, 0); + } + }; + +}).call(FoldMode.prototype); + +}); + diff --git a/0.0.3_0/ace/mode-c_cpp.js b/0.0.3_0/ace/mode-c_cpp.js new file mode 100644 index 0000000..54e7e0b --- /dev/null +++ b/0.0.3_0/ace/mode-c_cpp.js @@ -0,0 +1,737 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2010, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/mode/c_cpp', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/c_cpp_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/range', 'ace/mode/behaviour/cstyle', 'ace/mode/folding/cstyle'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var c_cppHighlightRules = require("./c_cpp_highlight_rules").c_cppHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var Range = require("../range").Range; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new c_cppHighlightRules().getRules()); + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.$tokenizer.getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start") { + var match = line.match(/^.*[\{\(\[]\s*$/); + if (match) { + indent += tab; + } + } else if (state == "doc-start") { + if (endState == "start") { + return ""; + } + var match = line.match(/^\s*(\/?)\*/); + if (match) { + if (match[1]) { + indent += " "; + } + indent += "* "; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); +ace.define('ace/mode/c_cpp_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/doc_comment_highlight_rules', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var cFunctions = exports.cFunctions = "\\s*\\bhypot(?:f|l)?|s(?:scanf|ystem|nprintf|ca(?:nf|lb(?:n(?:f|l)?|ln(?:f|l)?))|i(?:n(?:h(?:f|l)?|f|l)?|gn(?:al|bit))|tr(?:s(?:tr|pn)|nc(?:py|at|mp)|c(?:spn|hr|oll|py|at|mp)|to(?:imax|d|u(?:l(?:l)?|max)|k|f|l(?:d|l)?)|error|pbrk|ftime|len|rchr|xfrm)|printf|et(?:jmp|vbuf|locale|buf)|qrt(?:f|l)?|w(?:scanf|printf)|rand)|n(?:e(?:arbyint(?:f|l)?|xt(?:toward(?:f|l)?|after(?:f|l)?))|an(?:f|l)?)|c(?:s(?:in(?:h(?:f|l)?|f|l)?|qrt(?:f|l)?)|cos(?:h(?:f)?|f|l)?|imag(?:f|l)?|t(?:ime|an(?:h(?:f|l)?|f|l)?)|o(?:s(?:h(?:f|l)?|f|l)?|nj(?:f|l)?|pysign(?:f|l)?)|p(?:ow(?:f|l)?|roj(?:f|l)?)|e(?:il(?:f|l)?|xp(?:f|l)?)|l(?:o(?:ck|g(?:f|l)?)|earerr)|a(?:sin(?:h(?:f|l)?|f|l)?|cos(?:h(?:f|l)?|f|l)?|tan(?:h(?:f|l)?|f|l)?|lloc|rg(?:f|l)?|bs(?:f|l)?)|real(?:f|l)?|brt(?:f|l)?)|t(?:ime|o(?:upper|lower)|an(?:h(?:f|l)?|f|l)?|runc(?:f|l)?|gamma(?:f|l)?|mp(?:nam|file))|i(?:s(?:space|n(?:ormal|an)|cntrl|inf|digit|u(?:nordered|pper)|p(?:unct|rint)|finite|w(?:space|c(?:ntrl|type)|digit|upper|p(?:unct|rint)|lower|al(?:num|pha)|graph|xdigit|blank)|l(?:ower|ess(?:equal|greater)?)|al(?:num|pha)|gr(?:eater(?:equal)?|aph)|xdigit|blank)|logb(?:f|l)?|max(?:div|abs))|di(?:v|fftime)|_Exit|unget(?:c|wc)|p(?:ow(?:f|l)?|ut(?:s|c(?:har)?|wc(?:har)?)|error|rintf)|e(?:rf(?:c(?:f|l)?|f|l)?|x(?:it|p(?:2(?:f|l)?|f|l|m1(?:f|l)?)?))|v(?:s(?:scanf|nprintf|canf|printf|w(?:scanf|printf))|printf|f(?:scanf|printf|w(?:scanf|printf))|w(?:scanf|printf)|a_(?:start|copy|end|arg))|qsort|f(?:s(?:canf|e(?:tpos|ek))|close|tell|open|dim(?:f|l)?|p(?:classify|ut(?:s|c|w(?:s|c))|rintf)|e(?:holdexcept|set(?:e(?:nv|xceptflag)|round)|clearexcept|testexcept|of|updateenv|r(?:aiseexcept|ror)|get(?:e(?:nv|xceptflag)|round))|flush|w(?:scanf|ide|printf|rite)|loor(?:f|l)?|abs(?:f|l)?|get(?:s|c|pos|w(?:s|c))|re(?:open|e|ad|xp(?:f|l)?)|m(?:in(?:f|l)?|od(?:f|l)?|a(?:f|l|x(?:f|l)?)?))|l(?:d(?:iv|exp(?:f|l)?)|o(?:ngjmp|cal(?:time|econv)|g(?:1(?:p(?:f|l)?|0(?:f|l)?)|2(?:f|l)?|f|l|b(?:f|l)?)?)|abs|l(?:div|abs|r(?:int(?:f|l)?|ound(?:f|l)?))|r(?:int(?:f|l)?|ound(?:f|l)?)|gamma(?:f|l)?)|w(?:scanf|c(?:s(?:s(?:tr|pn)|nc(?:py|at|mp)|c(?:spn|hr|oll|py|at|mp)|to(?:imax|d|u(?:l(?:l)?|max)|k|f|l(?:d|l)?|mbs)|pbrk|ftime|len|r(?:chr|tombs)|xfrm)|to(?:b|mb)|rtomb)|printf|mem(?:set|c(?:hr|py|mp)|move))|a(?:s(?:sert|ctime|in(?:h(?:f|l)?|f|l)?)|cos(?:h(?:f|l)?|f|l)?|t(?:o(?:i|f|l(?:l)?)|exit|an(?:h(?:f|l)?|2(?:f|l)?|f|l)?)|b(?:s|ort))|g(?:et(?:s|c(?:har)?|env|wc(?:har)?)|mtime)|r(?:int(?:f|l)?|ound(?:f|l)?|e(?:name|alloc|wind|m(?:ove|quo(?:f|l)?|ainder(?:f|l)?))|a(?:nd|ise))|b(?:search|towc)|m(?:odf(?:f|l)?|em(?:set|c(?:hr|py|mp)|move)|ktime|alloc|b(?:s(?:init|towcs|rtowcs)|towc|len|r(?:towc|len)))\\b" + +var c_cppHighlightRules = function() { + + var keywordControls = ( + "break|case|continue|default|do|else|for|goto|if|_Pragma|" + + "return|switch|while|catch|operator|try|throw|using" + ); + + var storageType = ( + "asm|__asm__|auto|bool|_Bool|char|_Complex|double|enum|float|" + + "_Imaginary|int|long|short|signed|struct|typedef|union|unsigned|void|" + + "class|wchar_t|template" + ); + + var storageModifiers = ( + "const|extern|register|restrict|static|volatile|inline|private:|" + + "protected:|public:|friend|explicit|virtual|export|mutable|typename" + ); + + var keywordOperators = ( + "and|and_eq|bitand|bitor|compl|not|not_eq|or|or_eq|typeid|xor|xor_eq" + + "const_cast|dynamic_cast|reinterpret_cast|static_cast|sizeof|namespace" + ); + + var builtinConstants = ( + "NULL|true|false|TRUE|FALSE" + ); + + var keywordMapper = this.$keywords = this.createKeywordMapper({ + "keyword.control" : keywordControls, + "storage.type" : storageType, + "storage.modifier" : storageModifiers, + "keyword.operator" : keywordOperators, + "variable.language": "this", + "constant.language": builtinConstants + }, "identifier"); + + var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\d\\$_\u00a1-\uffff]*\\b"; + + this.$rules = { + "start" : [ + { + token : "comment", + regex : "\\/\\/.*$" + }, + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment" + }, { + token : "string", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' + }, { + token : "string", // multi line string start + regex : '["].*\\\\$', + next : "qqstring" + }, { + token : "string", // single line + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" + }, { + token : "string", // multi line string start + regex : "['].*\\\\$", + next : "qstring" + }, { + token : "constant.numeric", // hex + regex : "0[xX][0-9a-fA-F]+(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\b" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\b" + }, { + token : "keyword", // pre-compiler directives + regex : "#\\s*(?:include|import|pragma|line|define|undef|if|ifdef|else|elif|ifndef)\\b", + next : "directive" + }, { + token : "keyword", // special case pre-compiler directive + regex : "(?:#\\s*endif)\\b" + }, { + token : "support.function.C99.c", + regex : cFunctions + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "keyword.operator", + regex : "!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|==|=|!=|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|new|delete|typeof|void)" + }, { + token : "punctuation.operator", + regex : "\\?|\\:|\\,|\\;|\\." + }, { + token : "paren.lparen", + regex : "[[({]" + }, { + token : "paren.rparen", + regex : "[\\])}]" + }, { + token : "text", + regex : "\\s+" + } + ], + "comment" : [ + { + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "start" + }, { + token : "comment", // comment spanning whole line + regex : ".+" + } + ], + "qqstring" : [ + { + token : "string", + regex : '(?:(?:\\\\.)|(?:[^"\\\\]))*?"', + next : "start" + }, { + token : "string", + regex : '.+' + } + ], + "qstring" : [ + { + token : "string", + regex : "(?:(?:\\\\.)|(?:[^'\\\\]))*?'", + next : "start" + }, { + token : "string", + regex : '.+' + } + ], + "directive" : [ + { + token : "constant.other.multiline", + regex : /\\/ + }, + { + token : "constant.other.multiline", + regex : /.*\\/ + }, + { + token : "constant.other", + regex : "\\s*<.+?>", + next : "start" + }, + { + token : "constant.other", // single line + regex : '\\s*["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]', + next : "start" + }, + { + token : "constant.other", // single line + regex : "\\s*['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']", + next : "start" + }, + { + token : "constant.other", + regex : /[^\\\/]+/, + next : "start" + } + ] + }; + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("start") ]); +}; + +oop.inherits(c_cppHighlightRules, TextHighlightRules); + +exports.c_cppHighlightRules = c_cppHighlightRules; +}); + +ace.define('ace/mode/doc_comment_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, { + token : "comment.doc.tag", + regex : "\\bTODO\\b" + }, { + defaultToken : "comment.doc" + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) { + + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define('ace/mode/behaviour/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/token_iterator', 'ace/lib/lang'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; +var lang = require("../../lib/lang"); + +var SAFE_INSERT_IN_TOKENS = + ["text", "paren.rparen", "punctuation.operator"]; +var SAFE_INSERT_BEFORE_TOKENS = + ["text", "paren.rparen", "punctuation.operator", "comment"]; + + +var autoInsertedBrackets = 0; +var autoInsertedRow = -1; +var autoInsertedLineEnd = ""; +var maybeInsertedBrackets = 0; +var maybeInsertedRow = -1; +var maybeInsertedLineStart = ""; +var maybeInsertedLineEnd = ""; + +var CstyleBehaviour = function () { + + CstyleBehaviour.isSaneInsertion = function(editor, session) { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + if (!this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) { + var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1); + if (!this.$matchTokenType(iterator2.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) + return false; + } + iterator.stepForward(); + return iterator.getCurrentTokenRow() !== cursor.row || + this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_BEFORE_TOKENS); + }; + + CstyleBehaviour.$matchTokenType = function(token, types) { + return types.indexOf(token.type || token) > -1; + }; + + CstyleBehaviour.recordAutoInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isAutoInsertedClosing(cursor, line, autoInsertedLineEnd[0])) + autoInsertedBrackets = 0; + autoInsertedRow = cursor.row; + autoInsertedLineEnd = bracket + line.substr(cursor.column); + autoInsertedBrackets++; + }; + + CstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isMaybeInsertedClosing(cursor, line)) + maybeInsertedBrackets = 0; + maybeInsertedRow = cursor.row; + maybeInsertedLineStart = line.substr(0, cursor.column) + bracket; + maybeInsertedLineEnd = line.substr(cursor.column); + maybeInsertedBrackets++; + }; + + CstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) { + return autoInsertedBrackets > 0 && + cursor.row === autoInsertedRow && + bracket === autoInsertedLineEnd[0] && + line.substr(cursor.column) === autoInsertedLineEnd; + }; + + CstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) { + return maybeInsertedBrackets > 0 && + cursor.row === maybeInsertedRow && + line.substr(cursor.column) === maybeInsertedLineEnd && + line.substr(0, cursor.column) == maybeInsertedLineStart; + }; + + CstyleBehaviour.popAutoInsertedClosing = function() { + autoInsertedLineEnd = autoInsertedLineEnd.substr(1); + autoInsertedBrackets--; + }; + + CstyleBehaviour.clearMaybeInsertedClosing = function() { + maybeInsertedBrackets = 0; + maybeInsertedRow = -1; + }; + + this.add("braces", "insertion", function (state, action, editor, session, text) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (text == '{') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "{" && editor.getWrapBehavioursEnabled()) { + return { + text: '{' + selected + '}', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + if (/[\]\}\)]/.test(line[cursor.column])) { + CstyleBehaviour.recordAutoInsert(editor, session, "}"); + return { + text: '{}', + selection: [1, 1] + }; + } else { + CstyleBehaviour.recordMaybeInsert(editor, session, "{"); + return { + text: '{', + selection: [1, 1] + }; + } + } + } else if (text == '}') { + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}') { + var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } else if (text == "\n" || text == "\r\n") { + var closing = ""; + if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) { + closing = lang.stringRepeat("}", maybeInsertedBrackets); + CstyleBehaviour.clearMaybeInsertedClosing(); + } + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}' || closing !== "") { + var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column}, '}'); + if (!openBracePos) + return null; + + var indent = this.getNextLineIndent(state, line.substring(0, cursor.column), session.getTabString()); + var next_indent = this.$getIndent(line); + + return { + text: '\n' + indent + '\n' + next_indent + closing, + selection: [1, indent.length, 1, indent.length] + }; + } + } + }); + + this.add("braces", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '{') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar == '}') { + range.end.column++; + return range; + } else { + maybeInsertedBrackets--; + } + } + }); + + this.add("parens", "insertion", function (state, action, editor, session, text) { + if (text == '(') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return { + text: '(' + selected + ')', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, ")"); + return { + text: '()', + selection: [1, 1] + }; + } + } else if (text == ')') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ')') { + var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("parens", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '(') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ')') { + range.end.column++; + return range; + } + } + }); + + this.add("brackets", "insertion", function (state, action, editor, session, text) { + if (text == '[') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return { + text: '[' + selected + ']', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, "]"); + return { + text: '[]', + selection: [1, 1] + }; + } + } else if (text == ']') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ']') { + var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("brackets", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '[') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ']') { + range.end.column++; + return range; + } + } + }); + + this.add("string_dquotes", "insertion", function (state, action, editor, session, text) { + if (text == '"' || text == "'") { + var quote = text; + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "'" && selected != '"' && editor.getWrapBehavioursEnabled()) { + return { + text: quote + selected + quote, + selection: false + }; + } else { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var leftChar = line.substring(cursor.column-1, cursor.column); + if (leftChar == '\\') { + return null; + } + var tokens = session.getTokens(selection.start.row); + var col = 0, token; + var quotepos = -1; // Track whether we're inside an open quote. + + for (var x = 0; x < tokens.length; x++) { + token = tokens[x]; + if (token.type == "string") { + quotepos = -1; + } else if (quotepos < 0) { + quotepos = token.value.indexOf(quote); + } + if ((token.value.length + col) > selection.start.column) { + break; + } + col += tokens[x].value.length; + } + if (!token || (quotepos < 0 && token.type !== "comment" && (token.type !== "string" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) { + if (!CstyleBehaviour.isSaneInsertion(editor, session)) + return; + return { + text: quote + quote, + selection: [1,1] + }; + } else if (token && token.type === "string") { + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == quote) { + return { + text: '', + selection: [1, 1] + }; + } + } + } + } + }); + + this.add("string_dquotes", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && (selected == '"' || selected == "'")) { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == selected) { + range.end.column++; + return range; + } + } + }); + +}; + +oop.inherits(CstyleBehaviour, Behaviour); + +exports.CstyleBehaviour = CstyleBehaviour; +}); + +ace.define('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var line = session.getLine(row); + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i + match[0].length, 1); + } + + if (foldStyle !== "markbeginend") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + +}).call(FoldMode.prototype); + +}); diff --git a/0.0.3_0/ace/mode-clojure.js b/0.0.3_0/ace/mode-clojure.js new file mode 100644 index 0000000..24a2dfc --- /dev/null +++ b/0.0.3_0/ace/mode-clojure.js @@ -0,0 +1,299 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2010, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/mode/clojure', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/clojure_highlight_rules', 'ace/mode/matching_parens_outdent', 'ace/range'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var ClojureHighlightRules = require("./clojure_highlight_rules").ClojureHighlightRules; +var MatchingParensOutdent = require("./matching_parens_outdent").MatchingParensOutdent; +var Range = require("../range").Range; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new ClojureHighlightRules().getRules()); + this.$outdent = new MatchingParensOutdent(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = ";"; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.$tokenizer.getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start") { + var match = line.match(/[\(\[]/); + if (match) { + indent += " "; + } + match = line.match(/[\)]/); + if (match) { + indent = ""; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/clojure_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + + + +var ClojureHighlightRules = function() { + + var builtinFunctions = ( + '* *1 *2 *3 *agent* *allow-unresolved-vars* *assert* *clojure-version* ' + + '*command-line-args* *compile-files* *compile-path* *e *err* *file* ' + + '*flush-on-newline* *in* *macro-meta* *math-context* *ns* *out* ' + + '*print-dup* *print-length* *print-level* *print-meta* *print-readably* ' + + '*read-eval* *source-path* *use-context-classloader* ' + + '*warn-on-reflection* + - -> ->> .. / < <= = ' + + '== > > >= >= accessor aclone ' + + 'add-classpath add-watch agent agent-errors aget alength alias all-ns ' + + 'alter alter-meta! alter-var-root amap ancestors and apply areduce ' + + 'array-map aset aset-boolean aset-byte aset-char aset-double aset-float ' + + 'aset-int aset-long aset-short assert assoc assoc! assoc-in associative? ' + + 'atom await await-for await1 bases bean bigdec bigint binding bit-and ' + + 'bit-and-not bit-clear bit-flip bit-not bit-or bit-set bit-shift-left ' + + 'bit-shift-right bit-test bit-xor boolean boolean-array booleans ' + + 'bound-fn bound-fn* butlast byte byte-array bytes cast char char-array ' + + 'char-escape-string char-name-string char? chars chunk chunk-append ' + + 'chunk-buffer chunk-cons chunk-first chunk-next chunk-rest chunked-seq? ' + + 'class class? clear-agent-errors clojure-version coll? comment commute ' + + 'comp comparator compare compare-and-set! compile complement concat cond ' + + 'condp conj conj! cons constantly construct-proxy contains? count ' + + 'counted? create-ns create-struct cycle dec decimal? declare definline ' + + 'defmacro defmethod defmulti defn defn- defonce defstruct delay delay? ' + + 'deliver deref derive descendants destructure disj disj! dissoc dissoc! ' + + 'distinct distinct? doall doc dorun doseq dosync dotimes doto double ' + + 'double-array doubles drop drop-last drop-while empty empty? ensure ' + + 'enumeration-seq eval even? every? false? ffirst file-seq filter find ' + + 'find-doc find-ns find-var first float float-array float? floats flush ' + + 'fn fn? fnext for force format future future-call future-cancel ' + + 'future-cancelled? future-done? future? gen-class gen-interface gensym ' + + 'get get-in get-method get-proxy-class get-thread-bindings get-validator ' + + 'hash hash-map hash-set identical? identity if-let if-not ifn? import ' + + 'in-ns inc init-proxy instance? int int-array integer? interleave intern ' + + 'interpose into into-array ints io! isa? iterate iterator-seq juxt key ' + + 'keys keyword keyword? last lazy-cat lazy-seq let letfn line-seq list ' + + 'list* list? load load-file load-reader load-string loaded-libs locking ' + + 'long long-array longs loop macroexpand macroexpand-1 make-array ' + + 'make-hierarchy map map? mapcat max max-key memfn memoize merge ' + + 'merge-with meta method-sig methods min min-key mod name namespace neg? ' + + 'newline next nfirst nil? nnext not not-any? not-empty not-every? not= ' + + 'ns ns-aliases ns-imports ns-interns ns-map ns-name ns-publics ' + + 'ns-refers ns-resolve ns-unalias ns-unmap nth nthnext num number? odd? ' + + 'or parents partial partition pcalls peek persistent! pmap pop pop! ' + + 'pop-thread-bindings pos? pr pr-str prefer-method prefers ' + + 'primitives-classnames print print-ctor print-doc print-dup print-method ' + + 'print-namespace-doc print-simple print-special-doc print-str printf ' + + 'println println-str prn prn-str promise proxy proxy-call-with-super ' + + 'proxy-mappings proxy-name proxy-super push-thread-bindings pvalues quot ' + + 'rand rand-int range ratio? rational? rationalize re-find re-groups ' + + 're-matcher re-matches re-pattern re-seq read read-line read-string ' + + 'reduce ref ref-history-count ref-max-history ref-min-history ref-set ' + + 'refer refer-clojure release-pending-sends rem remove remove-method ' + + 'remove-ns remove-watch repeat repeatedly replace replicate require ' + + 'reset! reset-meta! resolve rest resultset-seq reverse reversible? rseq ' + + 'rsubseq second select-keys send send-off seq seq? seque sequence ' + + 'sequential? set set-validator! set? short short-array shorts ' + + 'shutdown-agents slurp some sort sort-by sorted-map sorted-map-by ' + + 'sorted-set sorted-set-by sorted? special-form-anchor special-symbol? ' + + 'split-at split-with str stream? string? struct struct-map subs subseq ' + + 'subvec supers swap! symbol symbol? sync syntax-symbol-anchor take ' + + 'take-last take-nth take-while test the-ns time to-array to-array-2d ' + + 'trampoline transient tree-seq true? type unchecked-add unchecked-dec ' + + 'unchecked-divide unchecked-inc unchecked-multiply unchecked-negate ' + + 'unchecked-remainder unchecked-subtract underive unquote ' + + 'unquote-splicing update-in update-proxy use val vals var-get var-set ' + + 'var? vary-meta vec vector vector? when when-first when-let when-not ' + + 'while with-bindings with-bindings* with-in-str with-loading-context ' + + 'with-local-vars with-meta with-open with-out-str with-precision xml-seq ' + + 'zero? zipmap' + ); + + var keywords = ('throw try var ' + + 'def do fn if let loop monitor-enter monitor-exit new quote recur set!' + ); + + var buildinConstants = ("true false nil"); + + var keywordMapper = this.createKeywordMapper({ + "keyword": keywords, + "constant.language": buildinConstants, + "support.function": builtinFunctions + }, "identifier", false, " "); + + this.$rules = { + "start" : [ + { + token : "comment", + regex : ";.*$" + }, { + token : "keyword", //parens + regex : "[\\(|\\)]" + }, { + token : "keyword", //lists + regex : "[\\'\\(]" + }, { + token : "keyword", //vectors + regex : "[\\[|\\]]" + }, { + token : "keyword", //sets and maps + regex : "[\\{|\\}|\\#\\{|\\#\\}]" + }, { + token : "keyword", // ampersands + regex : '[\\&]' + }, { + token : "keyword", // metadata + regex : '[\\#\\^\\{]' + }, { + token : "keyword", // anonymous fn syntactic sugar + regex : '[\\%]' + }, { + token : "keyword", // deref reader macro + regex : '[@]' + }, { + token : "constant.numeric", // hex + regex : "0[xX][0-9a-fA-F]+\\b" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : "constant.language", + regex : '[!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+||=|!=|<=|>=|<>|<|>|!|&&]' + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$\\-]*\\b" + }, { + token : "string", // single line + regex : '"', + next: "string" + }, { + token : "constant", // symbol + regex : /:[^()\[\]{}'"\^%`,;\s]+/ + }, { + token : "string.regexp", //Regular Expressions + regex : '/#"(?:\\.|(?:\\\")|[^\""\n])*"/g' + } + + ], + "string" : [ + { + token : "constant.language.escape", + regex : "\\\\.|\\\\$" + }, { + token : "string", + regex : '[^"\\\\]+' + }, { + token : "string", + regex : '"', + next : "start" + } + ] + }; +}; + +oop.inherits(ClojureHighlightRules, TextHighlightRules); + +exports.ClojureHighlightRules = ClojureHighlightRules; +}); + +ace.define('ace/mode/matching_parens_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) { + + +var Range = require("../range").Range; + +var MatchingParensOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\)/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\))/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + var match = line.match(/^(\s+)/); + if (match) { + return match[1]; + } + + return ""; + }; + +}).call(MatchingParensOutdent.prototype); + +exports.MatchingParensOutdent = MatchingParensOutdent; +}); diff --git a/0.0.3_0/ace/mode-cobol.js b/0.0.3_0/ace/mode-cobol.js new file mode 100644 index 0000000..ae85e64 --- /dev/null +++ b/0.0.3_0/ace/mode-cobol.js @@ -0,0 +1,124 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2010, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/mode/cobol', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/cobol_highlight_rules', 'ace/range'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var CobolHighlightRules = require("./cobol_highlight_rules").CobolHighlightRules; +var Range = require("../range").Range; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new CobolHighlightRules().getRules()); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "*"; + +}).call(Mode.prototype); + +exports.Mode = Mode; + +}); + +ace.define('ace/mode/cobol_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var CobolHighlightRules = function() { +var keywords = "ACCEPT|MERGE|SUM|ADD||MESSAGE|TABLE|ADVANCING|MODE|TAPE|" + +"AFTER|MULTIPLY|TEST|ALL|NEGATIVE|TEXT|ALPHABET|NEXT|THAN|" + +"ALSO|NO|THEN|ALTERNATE|NOT|THROUGH|AND|NUMBER|THRU|ANY|OCCURS|" + +"TIME|ARE|OF|TO|AREA|OFF|TOP||ASCENDING|OMITTED|TRUE|ASSIGN|ON|TYPE|AT|OPEN|" + +"UNIT|AUTHOR|OR|UNTIL|BEFORE|OTHER|UP|BLANK|OUTPUT|USE|BLOCK|PAGE|USING|BOTTOM|" + +"PERFORM|VALUE|BY|PIC|VALUES|CALL|PICTURE|WHEN|CANCEL|PLUS|WITH|CD|POINTER|WRITE|" + +"CHARACTER|POSITION||ZERO|CLOSE|POSITIVE|ZEROS|COLUMN|PROCEDURE|ZEROES|COMMA|PROGRAM|" + +"COMMON|PROGRAM-ID|COMMUNICATION|QUOTE|COMP|RANDOM|COMPUTE|READ|CONTAINS|RECEIVE|CONFIGURATION|" + +"RECORD|CONTINUE|REDEFINES|CONTROL|REFERENCE|COPY|REMAINDER|COUNT|REPLACE|DATA|REPORT|DATE|RESERVE|" + +"DAY|RESET|DELETE|RETURN|DESTINATION|REWIND|DISABLE|REWRITE|DISPLAY|RIGHT|DIVIDE|RUN|DOWN|SAME|" + +"ELSE|SEARCH|ENABLE|SECTION|END|SELECT|ENVIRONMENT|SENTENCE|EQUAL|SET|ERROR|SIGN|EXIT|SEQUENTIAL|" + +"EXTERNAL|SIZE|FLASE|SORT|FILE|SOURCE|LENGTH|SPACE|LESS|STANDARD|LIMIT|START|LINE|STOP|LOCK|STRING|LOW-VALUE|SUBTRACT"; + + var builtinConstants = ( + "true|false|null" + ); + + var builtinFunctions = ( + "count|min|max|avg|sum|rank|now|coalesce|main" + ); + + var keywordMapper = this.createKeywordMapper({ + "support.function": builtinFunctions, + "keyword": keywords, + "constant.language": builtinConstants + }, "identifier", true); + + this.$rules = { + "start" : [ { + token : "comment", + regex : "\\*.*$" + }, { + token : "string", // " string + regex : '".*?"' + }, { + token : "string", // ' string + regex : "'.*?'" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "keyword.operator", + regex : "\\+|\\-|\\/|\\/\\/|%|<@>|@>|<@|&|\\^|~|<|>|<=|=>|==|!=|<>|=" + }, { + token : "paren.lparen", + regex : "[\\(]" + }, { + token : "paren.rparen", + regex : "[\\)]" + }, { + token : "text", + regex : "\\s+" + } ] + }; +}; + +oop.inherits(CobolHighlightRules, TextHighlightRules); + +exports.CobolHighlightRules = CobolHighlightRules; +}); \ No newline at end of file diff --git a/0.0.3_0/ace/mode-coffee.js b/0.0.3_0/ace/mode-coffee.js new file mode 100644 index 0000000..aa39322 --- /dev/null +++ b/0.0.3_0/ace/mode-coffee.js @@ -0,0 +1,443 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2010, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/mode/coffee', ['require', 'exports', 'module' , 'ace/tokenizer', 'ace/mode/coffee_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/mode/folding/coffee', 'ace/range', 'ace/mode/text', 'ace/worker/worker_client', 'ace/lib/oop'], function(require, exports, module) { + + +var Tokenizer = require("../tokenizer").Tokenizer; +var Rules = require("./coffee_highlight_rules").CoffeeHighlightRules; +var Outdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var FoldMode = require("./folding/coffee").FoldMode; +var Range = require("../range").Range; +var TextMode = require("./text").Mode; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var oop = require("../lib/oop"); + +function Mode() { + this.$tokenizer = new Tokenizer(new Rules().getRules()); + this.$outdent = new Outdent(); + this.foldingRules = new FoldMode(); +} + +oop.inherits(Mode, TextMode); + +(function() { + + var indenter = /(?:[({[=:]|[-=]>|\b(?:else|switch|try|catch(?:\s*[$A-Za-z_\x7f-\uffff][$\w\x7f-\uffff]*)?|finally))\s*$/; + var commentLine = /^(\s*)#/; + var hereComment = /^\s*###(?!#)/; + var indentation = /^\s*/; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + var tokens = this.$tokenizer.getLineTokens(line, state).tokens; + + if (!(tokens.length && tokens[tokens.length - 1].type === 'comment') && + state === 'start' && indenter.test(line)) + indent += tab; + return indent; + }; + + this.toggleCommentLines = function(state, doc, startRow, endRow){ + console.log("toggle"); + var range = new Range(0, 0, 0, 0); + for (var i = startRow; i <= endRow; ++i) { + var line = doc.getLine(i); + if (hereComment.test(line)) + continue; + + if (commentLine.test(line)) + line = line.replace(commentLine, '$1'); + else + line = line.replace(indentation, '$&#'); + + range.end.row = range.start.row = i; + range.end.column = line.length + 1; + doc.replace(range, line); + } + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/coffee_worker", "Worker"); + worker.attachToDocument(session.getDocument()); + + worker.on("error", function(e) { + session.setAnnotations([e.data]); + }); + + worker.on("ok", function(e) { + session.clearAnnotations(); + }); + + return worker; + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; + +}); + +ace.define('ace/mode/coffee_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + + var oop = require("../lib/oop"); + var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + + oop.inherits(CoffeeHighlightRules, TextHighlightRules); + + function CoffeeHighlightRules() { + var identifier = "[$A-Za-z_\\x7f-\\uffff][$\\w\\x7f-\\uffff]*"; + + var keywords = ( + "this|throw|then|try|typeof|super|switch|return|break|by|continue|" + + "catch|class|in|instanceof|is|isnt|if|else|extends|for|forown|" + + "finally|function|while|when|new|no|not|delete|debugger|do|loop|of|off|" + + "or|on|unless|until|and|yes" + ); + + var langConstant = ( + "true|false|null|undefined|NaN|Infinity" + ); + + var illegal = ( + "case|const|default|function|var|void|with|enum|export|implements|" + + "interface|let|package|private|protected|public|static|yield|" + + "__hasProp|slice|bind|indexOf" + ); + + var supportClass = ( + "Array|Boolean|Date|Function|Number|Object|RegExp|ReferenceError|String|" + + "Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|" + + "SyntaxError|TypeError|URIError|" + + "ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|" + + "Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray" + ); + + var supportFunction = ( + "Math|JSON|isNaN|isFinite|parseInt|parseFloat|encodeURI|" + + "encodeURIComponent|decodeURI|decodeURIComponent|String|" + ); + + var variableLanguage = ( + "window|arguments|prototype|document" + ); + + var keywordMapper = this.createKeywordMapper({ + "keyword": keywords, + "constant.language": langConstant, + "invalid.illegal": illegal, + "language.support.class": supportClass, + "language.support.function": supportFunction, + "variable.language": variableLanguage + }, "identifier"); + + var functionRule = { + token: ["paren.lparen", "variable.parameter", "paren.rparen", "text", "storage.type"], + regex: /(?:(\()((?:"[^")]*?"|'[^')]*?'|\/[^\/)]*?\/|[^()\"'\/])*?)(\))(\s*))?([\-=]>)/.source + }; + + var stringEscape = /\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|[0-2][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.)/; + + this.$rules = { + start : [ + { + token : "constant.numeric", + regex : "(?:0x[\\da-fA-F]+|(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:[eE][+-]?\\d+)?)" + }, { + stateName: "qdoc", + token : "string", regex : "'''", next : [ + {token : "string", regex : "'''", next : "start"}, + {token : "constant.language.escape", regex : stringEscape}, + {defaultToken: "string"} + ] + }, { + stateName: "qqdoc", + token : "string", + regex : '"""', + next : [ + {token : "string", regex : '"""', next : "start"}, + {token : "paren.string", regex : '#{', push : "start"}, + {token : "constant.language.escape", regex : stringEscape}, + {defaultToken: "string"} + ] + }, { + stateName: "qstring", + token : "string", regex : "'", next : [ + {token : "string", regex : "'", next : "start"}, + {token : "constant.language.escape", regex : stringEscape}, + {defaultToken: "string"} + ] + }, { + stateName: "qqstring", + token : "string.start", regex : '"', next : [ + {token : "string.end", regex : '"', next : "start"}, + {token : "paren.string", regex : '#{', push : "start"}, + {token : "constant.language.escape", regex : stringEscape}, + {defaultToken: "string"} + ] + }, { + stateName: "js", + token : "string", regex : "`", next : [ + {token : "string", regex : "`", next : "start"}, + {token : "constant.language.escape", regex : stringEscape}, + {defaultToken: "string"} + ] + }, { + regex: "[{}]", onMatch: function(val, state, stack) { + this.next = ""; + if (val == "{" && stack.length) { + stack.unshift("start", state); + return "paren"; + } + if (val == "}" && stack.length) { + stack.shift(); + this.next = stack.shift(); + if (this.next.indexOf("string") != -1) + return "paren.string"; + } + return "paren"; + } + }, { + token : "string.regex", + regex : "///", + next : "heregex" + }, { + token : "string.regex", + regex : /(?:\/(?![\s=])[^[\/\n\\]*(?:(?:\\[\s\S]|\[[^\]\n\\]*(?:\\[\s\S][^\]\n\\]*)*])[^[\/\n\\]*)*\/)(?:[imgy]{0,4})(?!\w)/ + }, { + token : "comment", + regex : "###(?!#)", + next : "comment" + }, { + token : "comment", + regex : "#.*" + }, { + token : ["punctuation.operator", "text", "identifier"], + regex : "(\\.)(\\s*)(" + illegal + ")" + }, { + token : "punctuation.operator", + regex : "\\." + }, { + token : ["keyword", "text", "language.support.class", + "text", "keyword", "text", "language.support.class"], + regex : "(class)(\\s+)(" + identifier + ")(?:(\\s+)(extends)(\\s+)(" + identifier + "))?" + }, { + token : ["entity.name.function", "text", "keyword.operator", "text"].concat(functionRule.token), + regex : "(" + identifier + ")(\\s*)([=:])(\\s*)" + functionRule.regex + }, + functionRule, + { + token : "variable", + regex : "@(?:" + identifier + ")?" + }, { + token: keywordMapper, + regex : identifier + }, { + token : "punctuation.operator", + regex : "\\,|\\." + }, { + token : "storage.type", + regex : "[\\-=]>" + }, { + token : "keyword.operator", + regex : "(?:[-+*/%<>&|^!?=]=|>>>=?|\\-\\-|\\+\\+|::|&&=|\\|\\|=|<<=|>>=|\\?\\.|\\.{2,3}|[!*+-=><])" + }, { + token : "paren.lparen", + regex : "[({[]" + }, { + token : "paren.rparen", + regex : "[\\]})]" + }, { + token : "text", + regex : "\\s+" + }], + + + heregex : [{ + token : "string.regex", + regex : '.*?///[imgy]{0,4}', + next : "start" + }, { + token : "comment.regex", + regex : "\\s+(?:#.*)?" + }, { + token : "string.regex", + regex : "\\S+" + }], + + comment : [{ + token : "comment", + regex : '###', + next : "start" + }, { + defaultToken : "comment" + }] + }; + this.normalizeRules(); + } + + exports.CoffeeHighlightRules = CoffeeHighlightRules; +}); + +ace.define('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) { + + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define('ace/mode/folding/coffee', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/folding/fold_mode', 'ace/range'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var BaseFoldMode = require("./fold_mode").FoldMode; +var Range = require("../../range").Range; + +var FoldMode = exports.FoldMode = function() {}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var range = this.indentationBlock(session, row); + if (range) + return range; + + var re = /\S/; + var line = session.getLine(row); + var startLevel = line.search(re); + if (startLevel == -1 || line[startLevel] != "#") + return; + + var startColumn = line.length; + var maxRow = session.getLength(); + var startRow = row; + var endRow = row; + + while (++row < maxRow) { + line = session.getLine(row); + var level = line.search(re); + + if (level == -1) + continue; + + if (line[level] != "#") + break; + + endRow = row; + } + + if (endRow > startRow) { + var endColumn = session.getLine(endRow).length; + return new Range(startRow, startColumn, endRow, endColumn); + } + }; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + var indent = line.search(/\S/); + var next = session.getLine(row + 1); + var prev = session.getLine(row - 1); + var prevIndent = prev.search(/\S/); + var nextIndent = next.search(/\S/); + + if (indent == -1) { + session.foldWidgets[row - 1] = prevIndent!= -1 && prevIndent < nextIndent ? "start" : ""; + return ""; + } + if (prevIndent == -1) { + if (indent == nextIndent && line[indent] == "#" && next[indent] == "#") { + session.foldWidgets[row - 1] = ""; + session.foldWidgets[row + 1] = ""; + return "start"; + } + } else if (prevIndent == indent && line[indent] == "#" && prev[indent] == "#") { + if (session.getLine(row - 2).search(/\S/) == -1) { + session.foldWidgets[row - 1] = "start"; + session.foldWidgets[row + 1] = ""; + return ""; + } + } + + if (prevIndent!= -1 && prevIndent < indent) + session.foldWidgets[row - 1] = "start"; + else + session.foldWidgets[row - 1] = ""; + + if (indent < nextIndent) + return "start"; + else + return ""; + }; + +}).call(FoldMode.prototype); + +}); diff --git a/0.0.3_0/ace/mode-coldfusion.js b/0.0.3_0/ace/mode-coldfusion.js new file mode 100644 index 0000000..bc1deab --- /dev/null +++ b/0.0.3_0/ace/mode-coldfusion.js @@ -0,0 +1,1765 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2010, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/mode/coldfusion', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/xml', 'ace/mode/javascript', 'ace/mode/css', 'ace/tokenizer', 'ace/mode/coldfusion_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var XmlMode = require("./xml").Mode; +var JavaScriptMode = require("./javascript").Mode; +var CssMode = require("./css").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var ColdfusionHighlightRules = require("./coldfusion_highlight_rules").ColdfusionHighlightRules; + +var Mode = function() { + XmlMode.call(this); + + var highlighter = new ColdfusionHighlightRules(); + this.$tokenizer = new Tokenizer(highlighter.getRules()); + + this.$embeds = highlighter.getEmbeds(); + this.createModeDelegates({ + "js-": JavaScriptMode, + "css-": CssMode + }); +}; +oop.inherits(Mode, XmlMode); + +(function() { + + this.getNextLineIndent = function(state, line, tab) { + return this.$getIndent(line); + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/xml', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/xml_highlight_rules', 'ace/mode/behaviour/xml', 'ace/mode/folding/xml'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var XmlHighlightRules = require("./xml_highlight_rules").XmlHighlightRules; +var XmlBehaviour = require("./behaviour/xml").XmlBehaviour; +var XmlFoldMode = require("./folding/xml").FoldMode; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new XmlHighlightRules().getRules()); + this.$behaviour = new XmlBehaviour(); + this.foldingRules = new XmlFoldMode(); +}; + +oop.inherits(Mode, TextMode); + +(function() { + + this.blockComment = {start: ""}; + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/xml_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/xml_util', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var xmlUtil = require("./xml_util"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var XmlHighlightRules = function() { + this.$rules = { + start : [ + {token : "text", regex : "<\\!\\[CDATA\\[", next : "cdata"}, + {token : "xml-pe", regex : "<\\?.*?\\?>"}, + {token : "comment", regex : "<\\!--", next : "comment"}, + {token : "xml-pe", regex : "<\\!.*?>"}, + {token : "meta.tag", regex : "<\\/?", next : "tag"}, + {token : "text", regex : "\\s+"}, + { + token : "constant.character.entity", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + } + ], + + cdata : [ + {token : "text", regex : "\\]\\]>", next : "start"}, + {token : "text", regex : "\\s+"}, + {token : "text", regex : "(?:[^\\]]|\\](?!\\]>))+"} + ], + + comment : [ + {token : "comment", regex : ".*?-->", next : "start"}, + {token : "comment", regex : ".+"} + ] + }; + + xmlUtil.tag(this.$rules, "tag", "start"); +}; + +oop.inherits(XmlHighlightRules, TextHighlightRules); + +exports.XmlHighlightRules = XmlHighlightRules; +}); + +ace.define('ace/mode/xml_util', ['require', 'exports', 'module' ], function(require, exports, module) { + + +function string(state) { + return [{ + token : "string", + regex : '"', + next : state + "_qqstring" + }, { + token : "string", + regex : "'", + next : state + "_qstring" + }]; +} + +function multiLineString(quote, state) { + return [ + {token : "string", regex : quote, next : state}, + { + token : "constant.language.escape", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }, + {defaultToken : "string"} + ]; +} + +exports.tag = function(states, name, nextState, tagMap) { + states[name] = [{ + token : "text", + regex : "\\s+" + }, { + + token : !tagMap ? "meta.tag.tag-name" : function(value) { + if (tagMap[value]) + return "meta.tag.tag-name." + tagMap[value]; + else + return "meta.tag.tag-name"; + }, + regex : "[-_a-zA-Z0-9:]+", + next : name + "_embed_attribute_list" + }, { + token: "empty", + regex: "", + next : name + "_embed_attribute_list" + }]; + + states[name + "_qstring"] = multiLineString("'", name + "_embed_attribute_list"); + states[name + "_qqstring"] = multiLineString("\"", name + "_embed_attribute_list"); + + states[name + "_embed_attribute_list"] = [{ + token : "meta.tag.r", + regex : "/?>", + next : nextState + }, { + token : "keyword.operator", + regex : "=" + }, { + token : "entity.other.attribute-name", + regex : "[-_a-zA-Z0-9:]+" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : "text", + regex : "\\s+" + }].concat(string(name)); +}; + +}); + +ace.define('ace/mode/behaviour/xml', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/mode/behaviour/cstyle', 'ace/token_iterator'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var CstyleBehaviour = require("./cstyle").CstyleBehaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; + +function hasType(token, type) { + var hasType = true; + var typeList = token.type.split('.'); + var needleList = type.split('.'); + needleList.forEach(function(needle){ + if (typeList.indexOf(needle) == -1) { + hasType = false; + return false; + } + }); + return hasType; +} + +var XmlBehaviour = function () { + + this.inherit(CstyleBehaviour, ["string_dquotes"]); // Get string behaviour + + this.add("autoclosing", "insertion", function (state, action, editor, session, text) { + if (text == '>') { + var position = editor.getCursorPosition(); + var iterator = new TokenIterator(session, position.row, position.column); + var token = iterator.getCurrentToken(); + var atCursor = false; + if (!token || !hasType(token, 'meta.tag') && !(hasType(token, 'text') && token.value.match('/'))){ + do { + token = iterator.stepBackward(); + } while (token && (hasType(token, 'string') || hasType(token, 'keyword.operator') || hasType(token, 'entity.attribute-name') || hasType(token, 'text'))); + } else { + atCursor = true; + } + if (!token || !hasType(token, 'meta.tag-name') || iterator.stepBackward().value.match('/')) { + return + } + var tag = token.value; + if (atCursor){ + var tag = tag.substring(0, position.column - token.start); + } + + return { + text: '>' + '', + selection: [1, 1] + } + } + }); + + this.add('autoindent', 'insertion', function (state, action, editor, session, text) { + if (text == "\n") { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChars = line.substring(cursor.column, cursor.column + 2); + if (rightChars == ' -1; + }; + + CstyleBehaviour.recordAutoInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isAutoInsertedClosing(cursor, line, autoInsertedLineEnd[0])) + autoInsertedBrackets = 0; + autoInsertedRow = cursor.row; + autoInsertedLineEnd = bracket + line.substr(cursor.column); + autoInsertedBrackets++; + }; + + CstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isMaybeInsertedClosing(cursor, line)) + maybeInsertedBrackets = 0; + maybeInsertedRow = cursor.row; + maybeInsertedLineStart = line.substr(0, cursor.column) + bracket; + maybeInsertedLineEnd = line.substr(cursor.column); + maybeInsertedBrackets++; + }; + + CstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) { + return autoInsertedBrackets > 0 && + cursor.row === autoInsertedRow && + bracket === autoInsertedLineEnd[0] && + line.substr(cursor.column) === autoInsertedLineEnd; + }; + + CstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) { + return maybeInsertedBrackets > 0 && + cursor.row === maybeInsertedRow && + line.substr(cursor.column) === maybeInsertedLineEnd && + line.substr(0, cursor.column) == maybeInsertedLineStart; + }; + + CstyleBehaviour.popAutoInsertedClosing = function() { + autoInsertedLineEnd = autoInsertedLineEnd.substr(1); + autoInsertedBrackets--; + }; + + CstyleBehaviour.clearMaybeInsertedClosing = function() { + maybeInsertedBrackets = 0; + maybeInsertedRow = -1; + }; + + this.add("braces", "insertion", function (state, action, editor, session, text) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (text == '{') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "{" && editor.getWrapBehavioursEnabled()) { + return { + text: '{' + selected + '}', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + if (/[\]\}\)]/.test(line[cursor.column])) { + CstyleBehaviour.recordAutoInsert(editor, session, "}"); + return { + text: '{}', + selection: [1, 1] + }; + } else { + CstyleBehaviour.recordMaybeInsert(editor, session, "{"); + return { + text: '{', + selection: [1, 1] + }; + } + } + } else if (text == '}') { + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}') { + var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } else if (text == "\n" || text == "\r\n") { + var closing = ""; + if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) { + closing = lang.stringRepeat("}", maybeInsertedBrackets); + CstyleBehaviour.clearMaybeInsertedClosing(); + } + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}' || closing !== "") { + var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column}, '}'); + if (!openBracePos) + return null; + + var indent = this.getNextLineIndent(state, line.substring(0, cursor.column), session.getTabString()); + var next_indent = this.$getIndent(line); + + return { + text: '\n' + indent + '\n' + next_indent + closing, + selection: [1, indent.length, 1, indent.length] + }; + } + } + }); + + this.add("braces", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '{') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar == '}') { + range.end.column++; + return range; + } else { + maybeInsertedBrackets--; + } + } + }); + + this.add("parens", "insertion", function (state, action, editor, session, text) { + if (text == '(') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return { + text: '(' + selected + ')', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, ")"); + return { + text: '()', + selection: [1, 1] + }; + } + } else if (text == ')') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ')') { + var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("parens", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '(') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ')') { + range.end.column++; + return range; + } + } + }); + + this.add("brackets", "insertion", function (state, action, editor, session, text) { + if (text == '[') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return { + text: '[' + selected + ']', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, "]"); + return { + text: '[]', + selection: [1, 1] + }; + } + } else if (text == ']') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ']') { + var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("brackets", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '[') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ']') { + range.end.column++; + return range; + } + } + }); + + this.add("string_dquotes", "insertion", function (state, action, editor, session, text) { + if (text == '"' || text == "'") { + var quote = text; + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "'" && selected != '"' && editor.getWrapBehavioursEnabled()) { + return { + text: quote + selected + quote, + selection: false + }; + } else { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var leftChar = line.substring(cursor.column-1, cursor.column); + if (leftChar == '\\') { + return null; + } + var tokens = session.getTokens(selection.start.row); + var col = 0, token; + var quotepos = -1; // Track whether we're inside an open quote. + + for (var x = 0; x < tokens.length; x++) { + token = tokens[x]; + if (token.type == "string") { + quotepos = -1; + } else if (quotepos < 0) { + quotepos = token.value.indexOf(quote); + } + if ((token.value.length + col) > selection.start.column) { + break; + } + col += tokens[x].value.length; + } + if (!token || (quotepos < 0 && token.type !== "comment" && (token.type !== "string" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) { + if (!CstyleBehaviour.isSaneInsertion(editor, session)) + return; + return { + text: quote + quote, + selection: [1,1] + }; + } else if (token && token.type === "string") { + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == quote) { + return { + text: '', + selection: [1, 1] + }; + } + } + } + } + }); + + this.add("string_dquotes", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && (selected == '"' || selected == "'")) { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == selected) { + range.end.column++; + return range; + } + } + }); + +}; + +oop.inherits(CstyleBehaviour, Behaviour); + +exports.CstyleBehaviour = CstyleBehaviour; +}); + +ace.define('ace/mode/folding/xml', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/range', 'ace/mode/folding/fold_mode', 'ace/token_iterator'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var lang = require("../../lib/lang"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; +var TokenIterator = require("../../token_iterator").TokenIterator; + +var FoldMode = exports.FoldMode = function(voidElements) { + BaseFoldMode.call(this); + this.voidElements = voidElements || {}; +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.getFoldWidget = function(session, foldStyle, row) { + var tag = this._getFirstTagInLine(session, row); + + if (tag.closing) + return foldStyle == "markbeginend" ? "end" : ""; + + if (!tag.tagName || this.voidElements[tag.tagName.toLowerCase()]) + return ""; + + if (tag.selfClosing) + return ""; + + if (tag.value.indexOf("/" + tag.tagName) !== -1) + return ""; + + return "start"; + }; + + this._getFirstTagInLine = function(session, row) { + var tokens = session.getTokens(row); + var value = ""; + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i]; + if (token.type.indexOf("meta.tag") === 0) + value += token.value; + else + value += lang.stringRepeat(" ", token.value.length); + } + + return this._parseTag(value); + }; + + this.tagRe = /^(\s*)(?)/; + this._parseTag = function(tag) { + + var match = tag.match(this.tagRe); + var column = 0; + + return { + value: tag, + match: match ? match[2] : "", + closing: match ? !!match[3] : false, + selfClosing: match ? !!match[5] || match[2] == "/>" : false, + tagName: match ? match[4] : "", + column: match[1] ? column + match[1].length : column + }; + }; + this._readTagForward = function(iterator) { + var token = iterator.getCurrentToken(); + if (!token) + return null; + + var value = ""; + var start; + + do { + if (token.type.indexOf("meta.tag") === 0) { + if (!start) { + var start = { + row: iterator.getCurrentTokenRow(), + column: iterator.getCurrentTokenColumn() + }; + } + value += token.value; + if (value.indexOf(">") !== -1) { + var tag = this._parseTag(value); + tag.start = start; + tag.end = { + row: iterator.getCurrentTokenRow(), + column: iterator.getCurrentTokenColumn() + token.value.length + }; + iterator.stepForward(); + return tag; + } + } + } while(token = iterator.stepForward()); + + return null; + }; + + this._readTagBackward = function(iterator) { + var token = iterator.getCurrentToken(); + if (!token) + return null; + + var value = ""; + var end; + + do { + if (token.type.indexOf("meta.tag") === 0) { + if (!end) { + end = { + row: iterator.getCurrentTokenRow(), + column: iterator.getCurrentTokenColumn() + token.value.length + }; + } + value = token.value + value; + if (value.indexOf("<") !== -1) { + var tag = this._parseTag(value); + tag.end = end; + tag.start = { + row: iterator.getCurrentTokenRow(), + column: iterator.getCurrentTokenColumn() + }; + iterator.stepBackward(); + return tag; + } + } + } while(token = iterator.stepBackward()); + + return null; + }; + + this._pop = function(stack, tag) { + while (stack.length) { + + var top = stack[stack.length-1]; + if (!tag || top.tagName == tag.tagName) { + return stack.pop(); + } + else if (this.voidElements[tag.tagName]) { + return; + } + else if (this.voidElements[top.tagName]) { + stack.pop(); + continue; + } else { + return null; + } + } + }; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var firstTag = this._getFirstTagInLine(session, row); + + if (!firstTag.match) + return null; + + var isBackward = firstTag.closing || firstTag.selfClosing; + var stack = []; + var tag; + + if (!isBackward) { + var iterator = new TokenIterator(session, row, firstTag.column); + var start = { + row: row, + column: firstTag.column + firstTag.tagName.length + 2 + }; + while (tag = this._readTagForward(iterator)) { + if (tag.selfClosing) { + if (!stack.length) { + tag.start.column += tag.tagName.length + 2; + tag.end.column -= 2; + return Range.fromPoints(tag.start, tag.end); + } else + continue; + } + + if (tag.closing) { + this._pop(stack, tag); + if (stack.length == 0) + return Range.fromPoints(start, tag.start); + } + else { + stack.push(tag) + } + } + } + else { + var iterator = new TokenIterator(session, row, firstTag.column + firstTag.match.length); + var end = { + row: row, + column: firstTag.column + }; + + while (tag = this._readTagBackward(iterator)) { + if (tag.selfClosing) { + if (!stack.length) { + tag.start.column += tag.tagName.length + 2; + tag.end.column -= 2; + return Range.fromPoints(tag.start, tag.end); + } else + continue; + } + + if (!tag.closing) { + this._pop(stack, tag); + if (stack.length == 0) { + tag.start.column += tag.tagName.length + 2; + return Range.fromPoints(tag.start, end); + } + } + else { + stack.push(tag) + } + } + } + + }; + +}).call(FoldMode.prototype); + +}); + +ace.define('ace/mode/javascript', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/javascript_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/range', 'ace/worker/worker_client', 'ace/mode/behaviour/cstyle', 'ace/mode/folding/cstyle'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var Range = require("../range").Range; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new JavaScriptHighlightRules().getRules()); + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.$tokenizer.getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start" || state == "no_regex") { + var match = line.match(/^.*(?:\bcase\b.*\:|[\{\(\[])\s*$/); + if (match) { + indent += tab; + } + } else if (state == "doc-start") { + if (endState == "start" || endState == "no_regex") { + return ""; + } + var match = line.match(/^\s*(\/?)\*/); + if (match) { + if (match[1]) { + indent += " "; + } + indent += "* "; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/javascript_worker", "JavaScriptWorker"); + worker.attachToDocument(session.getDocument()); + + worker.on("jslint", function(results) { + session.setAnnotations(results.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +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(require, exports, module) { + + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var JavaScriptHighlightRules = function() { + var keywordMapper = this.createKeywordMapper({ + "variable.language": + "Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|" + // Constructors + "Namespace|QName|XML|XMLList|" + // E4X + "ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|" + + "Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|" + + "Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|" + // Errors + "SyntaxError|TypeError|URIError|" + + "decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|" + // Non-constructor functions + "isNaN|parseFloat|parseInt|" + + "JSON|Math|" + // Other + "this|arguments|prototype|window|document" , // Pseudo + "keyword": + "const|yield|import|get|set|" + + "break|case|catch|continue|default|delete|do|else|finally|for|function|" + + "if|in|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"); + var kwBeforeRe = "case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void"; + var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*\\b"; + + var escapedRe = "\\\\(?:x[0-9a-fA-F]{2}|" + // hex + "u[0-9a-fA-F]{4}|" + // unicode + "[0-2][0-7]{0,2}|" + // oct + "3[0-6][0-7]?|" + // oct + "37[0-7]?|" + // oct + "[4-7][0-7]?|" + //oct + ".)"; + + this.$rules = { + "no_regex" : [ + { + token : "comment", + regex : /\/\/.*$/ + }, + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : /\/\*/, + next : "comment" + }, { + token : "string", + regex : "'(?=.)", + next : "qstring" + }, { + token : "string", + regex : '"(?=.)', + next : "qqstring" + }, { + token : "constant.numeric", // hex + regex : /0[xX][0-9a-fA-F]+\b/ + }, { + token : "constant.numeric", // float + regex : /[+-]?\d+(?:(?:\.\d*)?(?:[eE][+-]?\d+)?)?\b/ + }, { + token : [ + "storage.type", "punctuation.operator", "support.function", + "punctuation.operator", "entity.name.function", "text","keyword.operator" + ], + regex : "(" + identifierRe + ")(\\.)(prototype)(\\.)(" + identifierRe +")(\\s*)(=)", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "keyword.operator", "text", "storage.type", + "text", "paren.lparen" + ], + regex : "(" + identifierRe +")(\\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 : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(function)(\\s+)(" + identifierRe + ")(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "punctuation.operator", + "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\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 : "(?:" + kwBeforeRe + ")\\b", + next : "start" + }, { + token : ["punctuation.operator", "support.function"], + regex : /(\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:opzzzz|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 : ["punctuation.operator", "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)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/ + }, { + token : ["punctuation.operator", "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 : ["storage.type", "punctuation.operator", "support.function.firebug"], + regex : /(console)(\.)(warn|info|log|error|time|timeEnd|assert)\b/ + }, { + token : keywordMapper, + regex : identifierRe + }, { + token : "keyword.operator", + regex : /--|\+\+|[!$%&*+\-~]|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\|\||\?\:|\*=|%=|\+=|\-=|&=|\^=/, + next : "start" + }, { + token : "punctuation.operator", + regex : /\?|\:|\,|\;|\./, + next : "start" + }, { + token : "paren.lparen", + regex : /[\[({]/, + next : "start" + }, { + token : "paren.rparen", + regex : /[\])}]/ + }, { + token : "keyword.operator", + regex : /\/=?/, + next : "start" + }, { + token: "comment", + regex: /^#!.*$/ + } + ], + "start": [ + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment_regex_allowed" + }, { + token : "comment", + regex : "\\/\\/.*$", + next : "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: "/\\w*", + 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.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: identifierRe + }, { + token: "punctuation.operator", + regex: "[, ]+" + }, { + token: "punctuation.operator", + regex: "$" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "comment_regex_allowed" : [ + {token : "comment", regex : "\\*\\/", next : "start"}, + {defaultToken : "comment"} + ], + "comment" : [ + {token : "comment", regex : "\\*\\/", next : "no_regex"}, + {defaultToken : "comment"} + ], + "qqstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + next : "qqstring" + }, { + token : "string", + regex : '"|$', + next : "no_regex" + }, { + defaultToken: "string" + } + ], + "qstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + next : "qstring" + }, { + token : "string", + regex : "'|$", + next : "no_regex" + }, { + defaultToken: "string" + } + ] + }; + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("no_regex") ]); +}; + +oop.inherits(JavaScriptHighlightRules, TextHighlightRules); + +exports.JavaScriptHighlightRules = JavaScriptHighlightRules; +}); + +ace.define('ace/mode/doc_comment_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, { + token : "comment.doc.tag", + regex : "\\bTODO\\b" + }, { + defaultToken : "comment.doc" + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) { + + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var line = session.getLine(row); + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i + match[0].length, 1); + } + + if (foldStyle !== "markbeginend") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define('ace/mode/css', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/css_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/worker/worker_client', 'ace/mode/behaviour/css', 'ace/mode/folding/cstyle'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CssBehaviour = require("./behaviour/css").CssBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new CssHighlightRules().getRules()); + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CssBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.foldingRules = "cStyle"; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + var tokens = this.$tokenizer.getLineTokens(line, state).tokens; + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + var match = line.match(/^.*\{\s*$/); + if (match) { + indent += tab; + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/css_worker", "Worker"); + worker.attachToDocument(session.getDocument()); + + worker.on("csslint", function(e) { + session.setAnnotations(e.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; + +}); + +ace.define('ace/mode/css_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var supportType = exports.supportType = "animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|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|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|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|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index"; +var supportFunction = exports.supportFunction = "rgb|rgba|url|attr|counter|counters"; +var supportConstant = exports.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"; +var supportConstantColor = exports.supportConstantColor = "aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow"; +var supportConstantFonts = exports.supportConstantFonts = "arial|century|comic|courier|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace"; + +var numRe = exports.numRe = "\\-?(?:(?:[0-9]+)|(?:[0-9]*\\.[0-9]+))"; +var pseudoElements = exports.pseudoElements = "(\\:+)\\b(after|before|first-letter|first-line|moz-selection|selection)\\b"; +var pseudoClasses = exports.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"; + +var CssHighlightRules = function() { + + var keywordMapper = this.createKeywordMapper({ + "support.function": supportFunction, + "support.constant": supportConstant, + "support.type": supportType, + "support.constant.color": supportConstantColor, + "support.constant.fonts": supportConstantFonts + }, "text", true); + + var base_ruleset = [ + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "ruleset_comment" + }, { + token : "string", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' + }, { + token : "string", // single line + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" + }, { + token : ["constant.numeric", "keyword"], + regex : "(" + numRe + ")(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 : numRe + }, { + token : "constant.numeric", // hex6 color + regex : "#[a-f0-9]{6}" + }, { + token : "constant.numeric", // hex3 color + regex : "#[a-f0-9]{3}" + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"], + regex : pseudoElements + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"], + regex : pseudoClasses + }, { + token : ["support.function", "string", "support.function"], + regex : "(url\\()(.*)(\\))" + }, { + token : keywordMapper, + regex : "\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*" + }, { + caseInsensitive: true + } + ]; + + var ruleset = lang.copyArray(base_ruleset); + ruleset.unshift({ + token : "paren.rparen", + regex : "\\}", + next: "start" + }); + + var media_ruleset = lang.copyArray( base_ruleset ); + media_ruleset.unshift({ + token : "paren.rparen", + regex : "\\}", + next: "media" + }); + + var base_comment = [{ + token : "comment", // comment spanning whole line + regex : ".+" + }]; + + var comment = lang.copyArray(base_comment); + comment.unshift({ + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "start" + }); + + var media_comment = lang.copyArray(base_comment); + media_comment.unshift({ + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "media" + }); + + var ruleset_comment = lang.copyArray(base_comment); + ruleset_comment.unshift({ + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "ruleset" + }); + + this.$rules = { + "start" : [{ + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment" + }, { + token: "paren.lparen", + regex: "\\{", + next: "ruleset" + }, { + token: "string", + regex: "@.*?{", + next: "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: true + }], + + "media" : [ { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "media_comment" + }, { + token: "paren.lparen", + regex: "\\{", + next: "media_ruleset" + },{ + token: "string", + regex: "\\}", + next: "start" + },{ + 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: true + }], + + "comment" : comment, + + "ruleset" : ruleset, + "ruleset_comment" : ruleset_comment, + + "media_ruleset" : media_ruleset, + "media_comment" : media_comment + }; +}; + +oop.inherits(CssHighlightRules, TextHighlightRules); + +exports.CssHighlightRules = CssHighlightRules; + +}); + +ace.define('ace/mode/behaviour/css', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/mode/behaviour/cstyle', 'ace/token_iterator'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var CstyleBehaviour = require("./cstyle").CstyleBehaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; + +var CssBehaviour = function () { + + this.inherit(CstyleBehaviour); + + this.add("colon", "insertion", function (state, action, editor, session, text) { + if (text === ':') { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + if (token && token.value.match(/\s+/)) { + token = iterator.stepBackward(); + } + if (token && token.type === 'support.type') { + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar === ':') { + return { + text: '', + selection: [1, 1] + } + } + if (!line.substring(cursor.column).match(/^\s*;/)) { + return { + text: ':;', + selection: [1, 1] + } + } + } + } + }); + + this.add("colon", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected === ':') { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + if (token && token.value.match(/\s+/)) { + token = iterator.stepBackward(); + } + if (token && token.type === 'support.type') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar === ';') { + range.end.column ++; + return range; + } + } + } + }); + + this.add("semicolon", "insertion", function (state, action, editor, session, text) { + if (text === ';') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar === ';') { + return { + text: '', + selection: [1, 1] + } + } + } + }); + +} +oop.inherits(CssBehaviour, CstyleBehaviour); + +exports.CssBehaviour = CssBehaviour; +}); + +ace.define('ace/mode/coldfusion_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/css_highlight_rules', 'ace/mode/javascript_highlight_rules', 'ace/mode/text_highlight_rules', 'ace/mode/xml_util'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var xml_util = require("./xml_util"); + +var ColdfusionHighlightRules = function() { + + this.$rules = { + start : [ { + token : "text", + regex : "<\\!\\[CDATA\\[", + next : "cdata" + }, { + token : "xml-pe", + regex : "<\\?.*?\\?>" + }, { + token : "comment", + regex : "<\\!--", + next : "comment" + }, { + token : "meta.tag", + regex : "<(?=script)", + next : "script" + }, { + token : "meta.tag", + regex : "<(?=cfscript)", + next : "cfscript" + }, { + token : "meta.tag", + regex : "<(?=style)", + next : "style" + }, { + token : "meta.tag", // opening tag + regex : "<\\/?", + next : "tag" + } ], + + cdata : [ { + token : "text", + regex : "\\]\\]>", + next : "start" + } ], + + comment : [ { + token : "comment", + regex : ".*?-->", + next : "start" + }, { + defaultToken : "comment" + } ] + }; + + xml_util.tag(this.$rules, "tag", "start"); + xml_util.tag(this.$rules, "style", "css-start"); + xml_util.tag(this.$rules, "script", "js-start"); + xml_util.tag(this.$rules, "cfscript", "js-start"); + + this.embedRules(JavaScriptHighlightRules, "js-", [{ + token: "comment", + regex: "\\/\\/.*(?=<\\/script>)", + next: "tag" + }, { + token: "meta.tag", + regex: "<\\/(?=script)", + next: "tag" + }, { + token: "comment", + regex: "\\/\\/.*(?=<\\/cfscript>)", + next: "tag" + }, { + token: "meta.tag", + regex: "<\\/(?=cfscript)", + next: "tag" + }]); + + this.embedRules(CssHighlightRules, "css-", [{ + token: "meta.tag", + regex: "<\\/(?=style)", + next: "tag" + }]); +}; + +oop.inherits(ColdfusionHighlightRules, TextHighlightRules); + +exports.ColdfusionHighlightRules = ColdfusionHighlightRules; +}); diff --git a/0.0.3_0/ace/mode-csharp.js b/0.0.3_0/ace/mode-csharp.js new file mode 100644 index 0000000..2af1893 --- /dev/null +++ b/0.0.3_0/ace/mode-csharp.js @@ -0,0 +1,612 @@ +ace.define('ace/mode/csharp', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/csharp_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/mode/behaviour/cstyle', 'ace/mode/folding/cstyle'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var CSharpHighlightRules = require("./csharp_highlight_rules").CSharpHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new CSharpHighlightRules().getRules()); + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.$tokenizer.getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start") { + var match = line.match(/^.*[\{\(\[]\s*$/); + if (match) { + indent += tab; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + + this.createWorker = function(session) { + return null; + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); +ace.define('ace/mode/csharp_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/doc_comment_highlight_rules', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var CSharpHighlightRules = function() { + var keywordMapper = this.createKeywordMapper({ + "variable.language": "this", + "keyword": "abstract|event|new|struct|as|explicit|null|switch|base|extern|object|this|bool|false|operator|throw|break|finally|out|true|byte|fixed|override|try|case|float|params|typeof|catch|for|private|uint|char|foreach|protected|ulong|checked|goto|public|unchecked|class|if|readonly|unsafe|const|implicit|ref|ushort|continue|in|return|using|decimal|int|sbyte|virtual|default|interface|sealed|volatile|delegate|internal|short|void|do|is|sizeof|while|double|lock|stackalloc|else|long|static|enum|namespace|string|var|dynamic", + "constant.language": "null|true|false" + }, "identifier"); + + this.$rules = { + "start" : [ + { + token : "comment", + regex : "\\/\\/.*$" + }, + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment" + }, { + token : "string.regexp", + regex : "[/](?:(?:\\[(?:\\\\]|[^\\]])+\\])|(?:\\\\/|[^\\]/]))*[/]\\w*\\s*(?=[).,;]|$)" + }, { + token : "string", // character + regex : /'(?:.|\\(:?u[\da-fA-F]+|x[\da-fA-F]+|[tbrf'"n]))'/ + }, { + token : "string", start : '"', end : '"|$', next: [ + {token: "constant.language.escape", regex: /\\(:?u[\da-fA-F]+|x[\da-fA-F]+|[tbrf'"n])/}, + {token: "invalid", regex: /\\./} + ] + }, { + token : "string", start : '@"', end : '"', next:[ + {token: "constant.language.escape", regex: '""'} + ] + }, { + token : "constant.numeric", // hex + regex : "0[xX][0-9a-fA-F]+\\b" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : "constant.language.boolean", + regex : "(?:true|false)\\b" + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "keyword.operator", + regex : "!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)" + }, { + token : "punctuation.operator", + regex : "\\?|\\:|\\,|\\;|\\." + }, { + token : "paren.lparen", + regex : "[[({]" + }, { + token : "paren.rparen", + regex : "[\\])}]" + }, { + token : "text", + regex : "\\s+" + } + ], + "comment" : [ + { + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "start" + }, { + token : "comment", // comment spanning whole line + regex : ".+" + } + ] + }; + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("start") ]); + this.normalizeRules(); +}; + +oop.inherits(CSharpHighlightRules, TextHighlightRules); + +exports.CSharpHighlightRules = CSharpHighlightRules; +}); + +ace.define('ace/mode/doc_comment_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, { + token : "comment.doc.tag", + regex : "\\bTODO\\b" + }, { + defaultToken : "comment.doc" + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) { + + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define('ace/mode/behaviour/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/token_iterator', 'ace/lib/lang'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; +var lang = require("../../lib/lang"); + +var SAFE_INSERT_IN_TOKENS = + ["text", "paren.rparen", "punctuation.operator"]; +var SAFE_INSERT_BEFORE_TOKENS = + ["text", "paren.rparen", "punctuation.operator", "comment"]; + + +var autoInsertedBrackets = 0; +var autoInsertedRow = -1; +var autoInsertedLineEnd = ""; +var maybeInsertedBrackets = 0; +var maybeInsertedRow = -1; +var maybeInsertedLineStart = ""; +var maybeInsertedLineEnd = ""; + +var CstyleBehaviour = function () { + + CstyleBehaviour.isSaneInsertion = function(editor, session) { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + if (!this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) { + var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1); + if (!this.$matchTokenType(iterator2.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) + return false; + } + iterator.stepForward(); + return iterator.getCurrentTokenRow() !== cursor.row || + this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_BEFORE_TOKENS); + }; + + CstyleBehaviour.$matchTokenType = function(token, types) { + return types.indexOf(token.type || token) > -1; + }; + + CstyleBehaviour.recordAutoInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isAutoInsertedClosing(cursor, line, autoInsertedLineEnd[0])) + autoInsertedBrackets = 0; + autoInsertedRow = cursor.row; + autoInsertedLineEnd = bracket + line.substr(cursor.column); + autoInsertedBrackets++; + }; + + CstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isMaybeInsertedClosing(cursor, line)) + maybeInsertedBrackets = 0; + maybeInsertedRow = cursor.row; + maybeInsertedLineStart = line.substr(0, cursor.column) + bracket; + maybeInsertedLineEnd = line.substr(cursor.column); + maybeInsertedBrackets++; + }; + + CstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) { + return autoInsertedBrackets > 0 && + cursor.row === autoInsertedRow && + bracket === autoInsertedLineEnd[0] && + line.substr(cursor.column) === autoInsertedLineEnd; + }; + + CstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) { + return maybeInsertedBrackets > 0 && + cursor.row === maybeInsertedRow && + line.substr(cursor.column) === maybeInsertedLineEnd && + line.substr(0, cursor.column) == maybeInsertedLineStart; + }; + + CstyleBehaviour.popAutoInsertedClosing = function() { + autoInsertedLineEnd = autoInsertedLineEnd.substr(1); + autoInsertedBrackets--; + }; + + CstyleBehaviour.clearMaybeInsertedClosing = function() { + maybeInsertedBrackets = 0; + maybeInsertedRow = -1; + }; + + this.add("braces", "insertion", function (state, action, editor, session, text) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (text == '{') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "{" && editor.getWrapBehavioursEnabled()) { + return { + text: '{' + selected + '}', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + if (/[\]\}\)]/.test(line[cursor.column])) { + CstyleBehaviour.recordAutoInsert(editor, session, "}"); + return { + text: '{}', + selection: [1, 1] + }; + } else { + CstyleBehaviour.recordMaybeInsert(editor, session, "{"); + return { + text: '{', + selection: [1, 1] + }; + } + } + } else if (text == '}') { + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}') { + var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } else if (text == "\n" || text == "\r\n") { + var closing = ""; + if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) { + closing = lang.stringRepeat("}", maybeInsertedBrackets); + CstyleBehaviour.clearMaybeInsertedClosing(); + } + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}' || closing !== "") { + var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column}, '}'); + if (!openBracePos) + return null; + + var indent = this.getNextLineIndent(state, line.substring(0, cursor.column), session.getTabString()); + var next_indent = this.$getIndent(line); + + return { + text: '\n' + indent + '\n' + next_indent + closing, + selection: [1, indent.length, 1, indent.length] + }; + } + } + }); + + this.add("braces", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '{') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar == '}') { + range.end.column++; + return range; + } else { + maybeInsertedBrackets--; + } + } + }); + + this.add("parens", "insertion", function (state, action, editor, session, text) { + if (text == '(') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return { + text: '(' + selected + ')', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, ")"); + return { + text: '()', + selection: [1, 1] + }; + } + } else if (text == ')') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ')') { + var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("parens", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '(') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ')') { + range.end.column++; + return range; + } + } + }); + + this.add("brackets", "insertion", function (state, action, editor, session, text) { + if (text == '[') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return { + text: '[' + selected + ']', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, "]"); + return { + text: '[]', + selection: [1, 1] + }; + } + } else if (text == ']') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ']') { + var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("brackets", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '[') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ']') { + range.end.column++; + return range; + } + } + }); + + this.add("string_dquotes", "insertion", function (state, action, editor, session, text) { + if (text == '"' || text == "'") { + var quote = text; + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "'" && selected != '"' && editor.getWrapBehavioursEnabled()) { + return { + text: quote + selected + quote, + selection: false + }; + } else { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var leftChar = line.substring(cursor.column-1, cursor.column); + if (leftChar == '\\') { + return null; + } + var tokens = session.getTokens(selection.start.row); + var col = 0, token; + var quotepos = -1; // Track whether we're inside an open quote. + + for (var x = 0; x < tokens.length; x++) { + token = tokens[x]; + if (token.type == "string") { + quotepos = -1; + } else if (quotepos < 0) { + quotepos = token.value.indexOf(quote); + } + if ((token.value.length + col) > selection.start.column) { + break; + } + col += tokens[x].value.length; + } + if (!token || (quotepos < 0 && token.type !== "comment" && (token.type !== "string" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) { + if (!CstyleBehaviour.isSaneInsertion(editor, session)) + return; + return { + text: quote + quote, + selection: [1,1] + }; + } else if (token && token.type === "string") { + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == quote) { + return { + text: '', + selection: [1, 1] + }; + } + } + } + } + }); + + this.add("string_dquotes", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && (selected == '"' || selected == "'")) { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == selected) { + range.end.column++; + return range; + } + } + }); + +}; + +oop.inherits(CstyleBehaviour, Behaviour); + +exports.CstyleBehaviour = CstyleBehaviour; +}); + +ace.define('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var line = session.getLine(row); + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i + match[0].length, 1); + } + + if (foldStyle !== "markbeginend") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + +}).call(FoldMode.prototype); + +}); diff --git a/0.0.3_0/ace/mode-css.js b/0.0.3_0/ace/mode-css.js new file mode 100644 index 0000000..013638e --- /dev/null +++ b/0.0.3_0/ace/mode-css.js @@ -0,0 +1,773 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2010, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/mode/css', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/css_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/worker/worker_client', 'ace/mode/behaviour/css', 'ace/mode/folding/cstyle'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CssBehaviour = require("./behaviour/css").CssBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new CssHighlightRules().getRules()); + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CssBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.foldingRules = "cStyle"; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + var tokens = this.$tokenizer.getLineTokens(line, state).tokens; + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + var match = line.match(/^.*\{\s*$/); + if (match) { + indent += tab; + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/css_worker", "Worker"); + worker.attachToDocument(session.getDocument()); + + worker.on("csslint", function(e) { + session.setAnnotations(e.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; + +}); + +ace.define('ace/mode/css_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var supportType = exports.supportType = "animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|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|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|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|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index"; +var supportFunction = exports.supportFunction = "rgb|rgba|url|attr|counter|counters"; +var supportConstant = exports.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"; +var supportConstantColor = exports.supportConstantColor = "aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow"; +var supportConstantFonts = exports.supportConstantFonts = "arial|century|comic|courier|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace"; + +var numRe = exports.numRe = "\\-?(?:(?:[0-9]+)|(?:[0-9]*\\.[0-9]+))"; +var pseudoElements = exports.pseudoElements = "(\\:+)\\b(after|before|first-letter|first-line|moz-selection|selection)\\b"; +var pseudoClasses = exports.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"; + +var CssHighlightRules = function() { + + var keywordMapper = this.createKeywordMapper({ + "support.function": supportFunction, + "support.constant": supportConstant, + "support.type": supportType, + "support.constant.color": supportConstantColor, + "support.constant.fonts": supportConstantFonts + }, "text", true); + + var base_ruleset = [ + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "ruleset_comment" + }, { + token : "string", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' + }, { + token : "string", // single line + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" + }, { + token : ["constant.numeric", "keyword"], + regex : "(" + numRe + ")(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 : numRe + }, { + token : "constant.numeric", // hex6 color + regex : "#[a-f0-9]{6}" + }, { + token : "constant.numeric", // hex3 color + regex : "#[a-f0-9]{3}" + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"], + regex : pseudoElements + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"], + regex : pseudoClasses + }, { + token : ["support.function", "string", "support.function"], + regex : "(url\\()(.*)(\\))" + }, { + token : keywordMapper, + regex : "\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*" + }, { + caseInsensitive: true + } + ]; + + var ruleset = lang.copyArray(base_ruleset); + ruleset.unshift({ + token : "paren.rparen", + regex : "\\}", + next: "start" + }); + + var media_ruleset = lang.copyArray( base_ruleset ); + media_ruleset.unshift({ + token : "paren.rparen", + regex : "\\}", + next: "media" + }); + + var base_comment = [{ + token : "comment", // comment spanning whole line + regex : ".+" + }]; + + var comment = lang.copyArray(base_comment); + comment.unshift({ + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "start" + }); + + var media_comment = lang.copyArray(base_comment); + media_comment.unshift({ + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "media" + }); + + var ruleset_comment = lang.copyArray(base_comment); + ruleset_comment.unshift({ + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "ruleset" + }); + + this.$rules = { + "start" : [{ + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment" + }, { + token: "paren.lparen", + regex: "\\{", + next: "ruleset" + }, { + token: "string", + regex: "@.*?{", + next: "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: true + }], + + "media" : [ { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "media_comment" + }, { + token: "paren.lparen", + regex: "\\{", + next: "media_ruleset" + },{ + token: "string", + regex: "\\}", + next: "start" + },{ + 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: true + }], + + "comment" : comment, + + "ruleset" : ruleset, + "ruleset_comment" : ruleset_comment, + + "media_ruleset" : media_ruleset, + "media_comment" : media_comment + }; +}; + +oop.inherits(CssHighlightRules, TextHighlightRules); + +exports.CssHighlightRules = CssHighlightRules; + +}); + +ace.define('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) { + + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define('ace/mode/behaviour/css', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/mode/behaviour/cstyle', 'ace/token_iterator'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var CstyleBehaviour = require("./cstyle").CstyleBehaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; + +var CssBehaviour = function () { + + this.inherit(CstyleBehaviour); + + this.add("colon", "insertion", function (state, action, editor, session, text) { + if (text === ':') { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + if (token && token.value.match(/\s+/)) { + token = iterator.stepBackward(); + } + if (token && token.type === 'support.type') { + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar === ':') { + return { + text: '', + selection: [1, 1] + } + } + if (!line.substring(cursor.column).match(/^\s*;/)) { + return { + text: ':;', + selection: [1, 1] + } + } + } + } + }); + + this.add("colon", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected === ':') { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + if (token && token.value.match(/\s+/)) { + token = iterator.stepBackward(); + } + if (token && token.type === 'support.type') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar === ';') { + range.end.column ++; + return range; + } + } + } + }); + + this.add("semicolon", "insertion", function (state, action, editor, session, text) { + if (text === ';') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar === ';') { + return { + text: '', + selection: [1, 1] + } + } + } + }); + +} +oop.inherits(CssBehaviour, CstyleBehaviour); + +exports.CssBehaviour = CssBehaviour; +}); + +ace.define('ace/mode/behaviour/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/token_iterator', 'ace/lib/lang'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; +var lang = require("../../lib/lang"); + +var SAFE_INSERT_IN_TOKENS = + ["text", "paren.rparen", "punctuation.operator"]; +var SAFE_INSERT_BEFORE_TOKENS = + ["text", "paren.rparen", "punctuation.operator", "comment"]; + + +var autoInsertedBrackets = 0; +var autoInsertedRow = -1; +var autoInsertedLineEnd = ""; +var maybeInsertedBrackets = 0; +var maybeInsertedRow = -1; +var maybeInsertedLineStart = ""; +var maybeInsertedLineEnd = ""; + +var CstyleBehaviour = function () { + + CstyleBehaviour.isSaneInsertion = function(editor, session) { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + if (!this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) { + var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1); + if (!this.$matchTokenType(iterator2.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) + return false; + } + iterator.stepForward(); + return iterator.getCurrentTokenRow() !== cursor.row || + this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_BEFORE_TOKENS); + }; + + CstyleBehaviour.$matchTokenType = function(token, types) { + return types.indexOf(token.type || token) > -1; + }; + + CstyleBehaviour.recordAutoInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isAutoInsertedClosing(cursor, line, autoInsertedLineEnd[0])) + autoInsertedBrackets = 0; + autoInsertedRow = cursor.row; + autoInsertedLineEnd = bracket + line.substr(cursor.column); + autoInsertedBrackets++; + }; + + CstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isMaybeInsertedClosing(cursor, line)) + maybeInsertedBrackets = 0; + maybeInsertedRow = cursor.row; + maybeInsertedLineStart = line.substr(0, cursor.column) + bracket; + maybeInsertedLineEnd = line.substr(cursor.column); + maybeInsertedBrackets++; + }; + + CstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) { + return autoInsertedBrackets > 0 && + cursor.row === autoInsertedRow && + bracket === autoInsertedLineEnd[0] && + line.substr(cursor.column) === autoInsertedLineEnd; + }; + + CstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) { + return maybeInsertedBrackets > 0 && + cursor.row === maybeInsertedRow && + line.substr(cursor.column) === maybeInsertedLineEnd && + line.substr(0, cursor.column) == maybeInsertedLineStart; + }; + + CstyleBehaviour.popAutoInsertedClosing = function() { + autoInsertedLineEnd = autoInsertedLineEnd.substr(1); + autoInsertedBrackets--; + }; + + CstyleBehaviour.clearMaybeInsertedClosing = function() { + maybeInsertedBrackets = 0; + maybeInsertedRow = -1; + }; + + this.add("braces", "insertion", function (state, action, editor, session, text) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (text == '{') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "{" && editor.getWrapBehavioursEnabled()) { + return { + text: '{' + selected + '}', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + if (/[\]\}\)]/.test(line[cursor.column])) { + CstyleBehaviour.recordAutoInsert(editor, session, "}"); + return { + text: '{}', + selection: [1, 1] + }; + } else { + CstyleBehaviour.recordMaybeInsert(editor, session, "{"); + return { + text: '{', + selection: [1, 1] + }; + } + } + } else if (text == '}') { + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}') { + var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } else if (text == "\n" || text == "\r\n") { + var closing = ""; + if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) { + closing = lang.stringRepeat("}", maybeInsertedBrackets); + CstyleBehaviour.clearMaybeInsertedClosing(); + } + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}' || closing !== "") { + var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column}, '}'); + if (!openBracePos) + return null; + + var indent = this.getNextLineIndent(state, line.substring(0, cursor.column), session.getTabString()); + var next_indent = this.$getIndent(line); + + return { + text: '\n' + indent + '\n' + next_indent + closing, + selection: [1, indent.length, 1, indent.length] + }; + } + } + }); + + this.add("braces", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '{') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar == '}') { + range.end.column++; + return range; + } else { + maybeInsertedBrackets--; + } + } + }); + + this.add("parens", "insertion", function (state, action, editor, session, text) { + if (text == '(') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return { + text: '(' + selected + ')', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, ")"); + return { + text: '()', + selection: [1, 1] + }; + } + } else if (text == ')') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ')') { + var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("parens", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '(') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ')') { + range.end.column++; + return range; + } + } + }); + + this.add("brackets", "insertion", function (state, action, editor, session, text) { + if (text == '[') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return { + text: '[' + selected + ']', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, "]"); + return { + text: '[]', + selection: [1, 1] + }; + } + } else if (text == ']') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ']') { + var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("brackets", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '[') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ']') { + range.end.column++; + return range; + } + } + }); + + this.add("string_dquotes", "insertion", function (state, action, editor, session, text) { + if (text == '"' || text == "'") { + var quote = text; + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "'" && selected != '"' && editor.getWrapBehavioursEnabled()) { + return { + text: quote + selected + quote, + selection: false + }; + } else { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var leftChar = line.substring(cursor.column-1, cursor.column); + if (leftChar == '\\') { + return null; + } + var tokens = session.getTokens(selection.start.row); + var col = 0, token; + var quotepos = -1; // Track whether we're inside an open quote. + + for (var x = 0; x < tokens.length; x++) { + token = tokens[x]; + if (token.type == "string") { + quotepos = -1; + } else if (quotepos < 0) { + quotepos = token.value.indexOf(quote); + } + if ((token.value.length + col) > selection.start.column) { + break; + } + col += tokens[x].value.length; + } + if (!token || (quotepos < 0 && token.type !== "comment" && (token.type !== "string" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) { + if (!CstyleBehaviour.isSaneInsertion(editor, session)) + return; + return { + text: quote + quote, + selection: [1,1] + }; + } else if (token && token.type === "string") { + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == quote) { + return { + text: '', + selection: [1, 1] + }; + } + } + } + } + }); + + this.add("string_dquotes", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && (selected == '"' || selected == "'")) { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == selected) { + range.end.column++; + return range; + } + } + }); + +}; + +oop.inherits(CstyleBehaviour, Behaviour); + +exports.CstyleBehaviour = CstyleBehaviour; +}); + +ace.define('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var line = session.getLine(row); + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i + match[0].length, 1); + } + + if (foldStyle !== "markbeginend") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + +}).call(FoldMode.prototype); + +}); diff --git a/0.0.3_0/ace/mode-curly.js b/0.0.3_0/ace/mode-curly.js new file mode 100644 index 0000000..62f0d58 --- /dev/null +++ b/0.0.3_0/ace/mode-curly.js @@ -0,0 +1,1952 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2012, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * + * Contributor(s): + * + * Libo Cannici + * + * + * + * ***** END LICENSE BLOCK ***** */ +ace.define('ace/mode/curly', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/html', 'ace/tokenizer', 'ace/mode/matching_brace_outdent', 'ace/mode/html_highlight_rules', 'ace/mode/folding/html', 'ace/mode/curly_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var HtmlMode = require("./html").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules; +var HtmlFoldMode = require("./folding/html").FoldMode; +var CurlyHighlightRules = require("./curly_highlight_rules").CurlyHighlightRules; + +var Mode = function() { + var highlighter = new CurlyHighlightRules(); + this.$outdent = new MatchingBraceOutdent(); + this.foldingRules = new HtmlFoldMode(); + + this.$tokenizer = new Tokenizer(highlighter.getRules()); +}; +oop.inherits(Mode, HtmlMode); + +(function() { +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/html', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/mode/javascript', 'ace/mode/css', 'ace/tokenizer', 'ace/mode/html_highlight_rules', 'ace/mode/behaviour/html', 'ace/mode/folding/html'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var JavaScriptMode = require("./javascript").Mode; +var CssMode = require("./css").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules; +var HtmlBehaviour = require("./behaviour/html").HtmlBehaviour; +var HtmlFoldMode = require("./folding/html").FoldMode; + +var Mode = function() { + var highlighter = new HtmlHighlightRules(); + this.$tokenizer = new Tokenizer(highlighter.getRules()); + this.$behaviour = new HtmlBehaviour(); + + this.$embeds = highlighter.getEmbeds(); + this.createModeDelegates({ + "js-": JavaScriptMode, + "css-": CssMode + }); + + this.foldingRules = new HtmlFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.blockComment = {start: ""}; + + this.getNextLineIndent = function(state, line, tab) { + return this.$getIndent(line); + }; + + this.checkOutdent = function(state, line, input) { + return false; + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/javascript', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/javascript_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/range', 'ace/worker/worker_client', 'ace/mode/behaviour/cstyle', 'ace/mode/folding/cstyle'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var Range = require("../range").Range; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new JavaScriptHighlightRules().getRules()); + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.$tokenizer.getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start" || state == "no_regex") { + var match = line.match(/^.*(?:\bcase\b.*\:|[\{\(\[])\s*$/); + if (match) { + indent += tab; + } + } else if (state == "doc-start") { + if (endState == "start" || endState == "no_regex") { + return ""; + } + var match = line.match(/^\s*(\/?)\*/); + if (match) { + if (match[1]) { + indent += " "; + } + indent += "* "; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/javascript_worker", "JavaScriptWorker"); + worker.attachToDocument(session.getDocument()); + + worker.on("jslint", function(results) { + session.setAnnotations(results.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +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(require, exports, module) { + + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var JavaScriptHighlightRules = function() { + var keywordMapper = this.createKeywordMapper({ + "variable.language": + "Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|" + // Constructors + "Namespace|QName|XML|XMLList|" + // E4X + "ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|" + + "Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|" + + "Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|" + // Errors + "SyntaxError|TypeError|URIError|" + + "decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|" + // Non-constructor functions + "isNaN|parseFloat|parseInt|" + + "JSON|Math|" + // Other + "this|arguments|prototype|window|document" , // Pseudo + "keyword": + "const|yield|import|get|set|" + + "break|case|catch|continue|default|delete|do|else|finally|for|function|" + + "if|in|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"); + var kwBeforeRe = "case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void"; + var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*\\b"; + + var escapedRe = "\\\\(?:x[0-9a-fA-F]{2}|" + // hex + "u[0-9a-fA-F]{4}|" + // unicode + "[0-2][0-7]{0,2}|" + // oct + "3[0-6][0-7]?|" + // oct + "37[0-7]?|" + // oct + "[4-7][0-7]?|" + //oct + ".)"; + + this.$rules = { + "no_regex" : [ + { + token : "comment", + regex : /\/\/.*$/ + }, + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : /\/\*/, + next : "comment" + }, { + token : "string", + regex : "'(?=.)", + next : "qstring" + }, { + token : "string", + regex : '"(?=.)', + next : "qqstring" + }, { + token : "constant.numeric", // hex + regex : /0[xX][0-9a-fA-F]+\b/ + }, { + token : "constant.numeric", // float + regex : /[+-]?\d+(?:(?:\.\d*)?(?:[eE][+-]?\d+)?)?\b/ + }, { + token : [ + "storage.type", "punctuation.operator", "support.function", + "punctuation.operator", "entity.name.function", "text","keyword.operator" + ], + regex : "(" + identifierRe + ")(\\.)(prototype)(\\.)(" + identifierRe +")(\\s*)(=)", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "keyword.operator", "text", "storage.type", + "text", "paren.lparen" + ], + regex : "(" + identifierRe +")(\\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 : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(function)(\\s+)(" + identifierRe + ")(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "punctuation.operator", + "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\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 : "(?:" + kwBeforeRe + ")\\b", + next : "start" + }, { + token : ["punctuation.operator", "support.function"], + regex : /(\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:opzzzz|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 : ["punctuation.operator", "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)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/ + }, { + token : ["punctuation.operator", "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 : ["storage.type", "punctuation.operator", "support.function.firebug"], + regex : /(console)(\.)(warn|info|log|error|time|timeEnd|assert)\b/ + }, { + token : keywordMapper, + regex : identifierRe + }, { + token : "keyword.operator", + regex : /--|\+\+|[!$%&*+\-~]|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\|\||\?\:|\*=|%=|\+=|\-=|&=|\^=/, + next : "start" + }, { + token : "punctuation.operator", + regex : /\?|\:|\,|\;|\./, + next : "start" + }, { + token : "paren.lparen", + regex : /[\[({]/, + next : "start" + }, { + token : "paren.rparen", + regex : /[\])}]/ + }, { + token : "keyword.operator", + regex : /\/=?/, + next : "start" + }, { + token: "comment", + regex: /^#!.*$/ + } + ], + "start": [ + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment_regex_allowed" + }, { + token : "comment", + regex : "\\/\\/.*$", + next : "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: "/\\w*", + 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.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: identifierRe + }, { + token: "punctuation.operator", + regex: "[, ]+" + }, { + token: "punctuation.operator", + regex: "$" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "comment_regex_allowed" : [ + {token : "comment", regex : "\\*\\/", next : "start"}, + {defaultToken : "comment"} + ], + "comment" : [ + {token : "comment", regex : "\\*\\/", next : "no_regex"}, + {defaultToken : "comment"} + ], + "qqstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + next : "qqstring" + }, { + token : "string", + regex : '"|$', + next : "no_regex" + }, { + defaultToken: "string" + } + ], + "qstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + next : "qstring" + }, { + token : "string", + regex : "'|$", + next : "no_regex" + }, { + defaultToken: "string" + } + ] + }; + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("no_regex") ]); +}; + +oop.inherits(JavaScriptHighlightRules, TextHighlightRules); + +exports.JavaScriptHighlightRules = JavaScriptHighlightRules; +}); + +ace.define('ace/mode/doc_comment_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, { + token : "comment.doc.tag", + regex : "\\bTODO\\b" + }, { + defaultToken : "comment.doc" + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) { + + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define('ace/mode/behaviour/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/token_iterator', 'ace/lib/lang'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; +var lang = require("../../lib/lang"); + +var SAFE_INSERT_IN_TOKENS = + ["text", "paren.rparen", "punctuation.operator"]; +var SAFE_INSERT_BEFORE_TOKENS = + ["text", "paren.rparen", "punctuation.operator", "comment"]; + + +var autoInsertedBrackets = 0; +var autoInsertedRow = -1; +var autoInsertedLineEnd = ""; +var maybeInsertedBrackets = 0; +var maybeInsertedRow = -1; +var maybeInsertedLineStart = ""; +var maybeInsertedLineEnd = ""; + +var CstyleBehaviour = function () { + + CstyleBehaviour.isSaneInsertion = function(editor, session) { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + if (!this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) { + var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1); + if (!this.$matchTokenType(iterator2.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) + return false; + } + iterator.stepForward(); + return iterator.getCurrentTokenRow() !== cursor.row || + this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_BEFORE_TOKENS); + }; + + CstyleBehaviour.$matchTokenType = function(token, types) { + return types.indexOf(token.type || token) > -1; + }; + + CstyleBehaviour.recordAutoInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isAutoInsertedClosing(cursor, line, autoInsertedLineEnd[0])) + autoInsertedBrackets = 0; + autoInsertedRow = cursor.row; + autoInsertedLineEnd = bracket + line.substr(cursor.column); + autoInsertedBrackets++; + }; + + CstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isMaybeInsertedClosing(cursor, line)) + maybeInsertedBrackets = 0; + maybeInsertedRow = cursor.row; + maybeInsertedLineStart = line.substr(0, cursor.column) + bracket; + maybeInsertedLineEnd = line.substr(cursor.column); + maybeInsertedBrackets++; + }; + + CstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) { + return autoInsertedBrackets > 0 && + cursor.row === autoInsertedRow && + bracket === autoInsertedLineEnd[0] && + line.substr(cursor.column) === autoInsertedLineEnd; + }; + + CstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) { + return maybeInsertedBrackets > 0 && + cursor.row === maybeInsertedRow && + line.substr(cursor.column) === maybeInsertedLineEnd && + line.substr(0, cursor.column) == maybeInsertedLineStart; + }; + + CstyleBehaviour.popAutoInsertedClosing = function() { + autoInsertedLineEnd = autoInsertedLineEnd.substr(1); + autoInsertedBrackets--; + }; + + CstyleBehaviour.clearMaybeInsertedClosing = function() { + maybeInsertedBrackets = 0; + maybeInsertedRow = -1; + }; + + this.add("braces", "insertion", function (state, action, editor, session, text) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (text == '{') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "{" && editor.getWrapBehavioursEnabled()) { + return { + text: '{' + selected + '}', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + if (/[\]\}\)]/.test(line[cursor.column])) { + CstyleBehaviour.recordAutoInsert(editor, session, "}"); + return { + text: '{}', + selection: [1, 1] + }; + } else { + CstyleBehaviour.recordMaybeInsert(editor, session, "{"); + return { + text: '{', + selection: [1, 1] + }; + } + } + } else if (text == '}') { + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}') { + var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } else if (text == "\n" || text == "\r\n") { + var closing = ""; + if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) { + closing = lang.stringRepeat("}", maybeInsertedBrackets); + CstyleBehaviour.clearMaybeInsertedClosing(); + } + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}' || closing !== "") { + var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column}, '}'); + if (!openBracePos) + return null; + + var indent = this.getNextLineIndent(state, line.substring(0, cursor.column), session.getTabString()); + var next_indent = this.$getIndent(line); + + return { + text: '\n' + indent + '\n' + next_indent + closing, + selection: [1, indent.length, 1, indent.length] + }; + } + } + }); + + this.add("braces", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '{') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar == '}') { + range.end.column++; + return range; + } else { + maybeInsertedBrackets--; + } + } + }); + + this.add("parens", "insertion", function (state, action, editor, session, text) { + if (text == '(') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return { + text: '(' + selected + ')', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, ")"); + return { + text: '()', + selection: [1, 1] + }; + } + } else if (text == ')') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ')') { + var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("parens", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '(') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ')') { + range.end.column++; + return range; + } + } + }); + + this.add("brackets", "insertion", function (state, action, editor, session, text) { + if (text == '[') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return { + text: '[' + selected + ']', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, "]"); + return { + text: '[]', + selection: [1, 1] + }; + } + } else if (text == ']') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ']') { + var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("brackets", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '[') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ']') { + range.end.column++; + return range; + } + } + }); + + this.add("string_dquotes", "insertion", function (state, action, editor, session, text) { + if (text == '"' || text == "'") { + var quote = text; + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "'" && selected != '"' && editor.getWrapBehavioursEnabled()) { + return { + text: quote + selected + quote, + selection: false + }; + } else { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var leftChar = line.substring(cursor.column-1, cursor.column); + if (leftChar == '\\') { + return null; + } + var tokens = session.getTokens(selection.start.row); + var col = 0, token; + var quotepos = -1; // Track whether we're inside an open quote. + + for (var x = 0; x < tokens.length; x++) { + token = tokens[x]; + if (token.type == "string") { + quotepos = -1; + } else if (quotepos < 0) { + quotepos = token.value.indexOf(quote); + } + if ((token.value.length + col) > selection.start.column) { + break; + } + col += tokens[x].value.length; + } + if (!token || (quotepos < 0 && token.type !== "comment" && (token.type !== "string" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) { + if (!CstyleBehaviour.isSaneInsertion(editor, session)) + return; + return { + text: quote + quote, + selection: [1,1] + }; + } else if (token && token.type === "string") { + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == quote) { + return { + text: '', + selection: [1, 1] + }; + } + } + } + } + }); + + this.add("string_dquotes", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && (selected == '"' || selected == "'")) { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == selected) { + range.end.column++; + return range; + } + } + }); + +}; + +oop.inherits(CstyleBehaviour, Behaviour); + +exports.CstyleBehaviour = CstyleBehaviour; +}); + +ace.define('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var line = session.getLine(row); + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i + match[0].length, 1); + } + + if (foldStyle !== "markbeginend") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define('ace/mode/css', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/css_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/worker/worker_client', 'ace/mode/behaviour/css', 'ace/mode/folding/cstyle'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CssBehaviour = require("./behaviour/css").CssBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new CssHighlightRules().getRules()); + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CssBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.foldingRules = "cStyle"; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + var tokens = this.$tokenizer.getLineTokens(line, state).tokens; + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + var match = line.match(/^.*\{\s*$/); + if (match) { + indent += tab; + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/css_worker", "Worker"); + worker.attachToDocument(session.getDocument()); + + worker.on("csslint", function(e) { + session.setAnnotations(e.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; + +}); + +ace.define('ace/mode/css_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var supportType = exports.supportType = "animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|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|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|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|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index"; +var supportFunction = exports.supportFunction = "rgb|rgba|url|attr|counter|counters"; +var supportConstant = exports.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"; +var supportConstantColor = exports.supportConstantColor = "aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow"; +var supportConstantFonts = exports.supportConstantFonts = "arial|century|comic|courier|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace"; + +var numRe = exports.numRe = "\\-?(?:(?:[0-9]+)|(?:[0-9]*\\.[0-9]+))"; +var pseudoElements = exports.pseudoElements = "(\\:+)\\b(after|before|first-letter|first-line|moz-selection|selection)\\b"; +var pseudoClasses = exports.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"; + +var CssHighlightRules = function() { + + var keywordMapper = this.createKeywordMapper({ + "support.function": supportFunction, + "support.constant": supportConstant, + "support.type": supportType, + "support.constant.color": supportConstantColor, + "support.constant.fonts": supportConstantFonts + }, "text", true); + + var base_ruleset = [ + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "ruleset_comment" + }, { + token : "string", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' + }, { + token : "string", // single line + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" + }, { + token : ["constant.numeric", "keyword"], + regex : "(" + numRe + ")(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 : numRe + }, { + token : "constant.numeric", // hex6 color + regex : "#[a-f0-9]{6}" + }, { + token : "constant.numeric", // hex3 color + regex : "#[a-f0-9]{3}" + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"], + regex : pseudoElements + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"], + regex : pseudoClasses + }, { + token : ["support.function", "string", "support.function"], + regex : "(url\\()(.*)(\\))" + }, { + token : keywordMapper, + regex : "\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*" + }, { + caseInsensitive: true + } + ]; + + var ruleset = lang.copyArray(base_ruleset); + ruleset.unshift({ + token : "paren.rparen", + regex : "\\}", + next: "start" + }); + + var media_ruleset = lang.copyArray( base_ruleset ); + media_ruleset.unshift({ + token : "paren.rparen", + regex : "\\}", + next: "media" + }); + + var base_comment = [{ + token : "comment", // comment spanning whole line + regex : ".+" + }]; + + var comment = lang.copyArray(base_comment); + comment.unshift({ + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "start" + }); + + var media_comment = lang.copyArray(base_comment); + media_comment.unshift({ + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "media" + }); + + var ruleset_comment = lang.copyArray(base_comment); + ruleset_comment.unshift({ + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "ruleset" + }); + + this.$rules = { + "start" : [{ + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment" + }, { + token: "paren.lparen", + regex: "\\{", + next: "ruleset" + }, { + token: "string", + regex: "@.*?{", + next: "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: true + }], + + "media" : [ { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "media_comment" + }, { + token: "paren.lparen", + regex: "\\{", + next: "media_ruleset" + },{ + token: "string", + regex: "\\}", + next: "start" + },{ + 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: true + }], + + "comment" : comment, + + "ruleset" : ruleset, + "ruleset_comment" : ruleset_comment, + + "media_ruleset" : media_ruleset, + "media_comment" : media_comment + }; +}; + +oop.inherits(CssHighlightRules, TextHighlightRules); + +exports.CssHighlightRules = CssHighlightRules; + +}); + +ace.define('ace/mode/behaviour/css', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/mode/behaviour/cstyle', 'ace/token_iterator'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var CstyleBehaviour = require("./cstyle").CstyleBehaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; + +var CssBehaviour = function () { + + this.inherit(CstyleBehaviour); + + this.add("colon", "insertion", function (state, action, editor, session, text) { + if (text === ':') { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + if (token && token.value.match(/\s+/)) { + token = iterator.stepBackward(); + } + if (token && token.type === 'support.type') { + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar === ':') { + return { + text: '', + selection: [1, 1] + } + } + if (!line.substring(cursor.column).match(/^\s*;/)) { + return { + text: ':;', + selection: [1, 1] + } + } + } + } + }); + + this.add("colon", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected === ':') { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + if (token && token.value.match(/\s+/)) { + token = iterator.stepBackward(); + } + if (token && token.type === 'support.type') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar === ';') { + range.end.column ++; + return range; + } + } + } + }); + + this.add("semicolon", "insertion", function (state, action, editor, session, text) { + if (text === ';') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar === ';') { + return { + text: '', + selection: [1, 1] + } + } + } + }); + +} +oop.inherits(CssBehaviour, CstyleBehaviour); + +exports.CssBehaviour = CssBehaviour; +}); + +ace.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_util', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var xmlUtil = require("./xml_util"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var tagMap = lang.createMap({ + a : 'anchor', + button : 'form', + form : 'form', + img : 'image', + input : 'form', + label : 'form', + script : 'script', + select : 'form', + textarea : 'form', + style : 'style', + table : 'table', + tbody : 'table', + td : 'table', + tfoot : 'table', + th : 'table', + tr : 'table' +}); + +var HtmlHighlightRules = function() { + this.$rules = { + start : [{ + token : "text", + regex : "<\\!\\[CDATA\\[", + next : "cdata" + }, { + token : "xml-pe", + regex : "<\\?.*?\\?>" + }, { + token : "comment", + regex : "<\\!--", + next : "comment" + }, { + token : "xml-pe", + regex : "<\\!.*?>" + }, { + token : "meta.tag", + regex : "<(?=script\\b)", + next : "script" + }, { + token : "meta.tag", + regex : "<(?=style\\b)", + next : "style" + }, { + token : "meta.tag", // opening tag + regex : "<\\/?(?=\\S)", + next : "tag" + }, { + token : "text", + regex : "\\s+" + }, { + token : "constant.character.entity", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }], + + cdata : [ { + token : "text", + regex : "\\]\\]>", + next : "start" + } ], + + comment : [ { + token : "comment", + regex : ".*?-->", + next : "start" + }, { + defaultToken : "comment" + } ] + }; + + xmlUtil.tag(this.$rules, "tag", "start", tagMap); + xmlUtil.tag(this.$rules, "style", "css-start", tagMap); + xmlUtil.tag(this.$rules, "script", "js-start", tagMap); + + this.embedRules(JavaScriptHighlightRules, "js-", [{ + token: "comment", + regex: "\\/\\/.*(?=<\\/script>)", + next: "tag" + }, { + token: "meta.tag", + regex: "<\\/(?=script)", + next: "tag" + }]); + + this.embedRules(CssHighlightRules, "css-", [{ + token: "meta.tag", + regex: "<\\/(?=style)", + next: "tag" + }]); +}; + +oop.inherits(HtmlHighlightRules, TextHighlightRules); + +exports.HtmlHighlightRules = HtmlHighlightRules; +}); + +ace.define('ace/mode/xml_util', ['require', 'exports', 'module' ], function(require, exports, module) { + + +function string(state) { + return [{ + token : "string", + regex : '"', + next : state + "_qqstring" + }, { + token : "string", + regex : "'", + next : state + "_qstring" + }]; +} + +function multiLineString(quote, state) { + return [ + {token : "string", regex : quote, next : state}, + { + token : "constant.language.escape", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }, + {defaultToken : "string"} + ]; +} + +exports.tag = function(states, name, nextState, tagMap) { + states[name] = [{ + token : "text", + regex : "\\s+" + }, { + + token : !tagMap ? "meta.tag.tag-name" : function(value) { + if (tagMap[value]) + return "meta.tag.tag-name." + tagMap[value]; + else + return "meta.tag.tag-name"; + }, + regex : "[-_a-zA-Z0-9:]+", + next : name + "_embed_attribute_list" + }, { + token: "empty", + regex: "", + next : name + "_embed_attribute_list" + }]; + + states[name + "_qstring"] = multiLineString("'", name + "_embed_attribute_list"); + states[name + "_qqstring"] = multiLineString("\"", name + "_embed_attribute_list"); + + states[name + "_embed_attribute_list"] = [{ + token : "meta.tag.r", + regex : "/?>", + next : nextState + }, { + token : "keyword.operator", + regex : "=" + }, { + token : "entity.other.attribute-name", + regex : "[-_a-zA-Z0-9:]+" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : "text", + regex : "\\s+" + }].concat(string(name)); +}; + +}); + +ace.define('ace/mode/behaviour/html', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour/xml', 'ace/mode/behaviour/cstyle', 'ace/token_iterator'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var XmlBehaviour = require("../behaviour/xml").XmlBehaviour; +var CstyleBehaviour = require("./cstyle").CstyleBehaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; +var voidElements = ['area', 'base', 'br', 'col', 'command', 'embed', 'hr', 'img', 'input', 'keygen', 'link', 'meta', 'param', 'source', 'track', 'wbr']; + +function hasType(token, type) { + var hasType = true; + var typeList = token.type.split('.'); + var needleList = type.split('.'); + needleList.forEach(function(needle){ + if (typeList.indexOf(needle) == -1) { + hasType = false; + return false; + } + }); + return hasType; +} + +var HtmlBehaviour = function () { + + this.inherit(XmlBehaviour); // Get xml behaviour + + this.add("autoclosing", "insertion", function (state, action, editor, session, text) { + if (text == '>') { + var position = editor.getCursorPosition(); + var iterator = new TokenIterator(session, position.row, position.column); + var token = iterator.getCurrentToken(); + + if (hasType(token, 'string') && iterator.getCurrentTokenColumn() + token.value.length > position.column) + return; + var atCursor = false; + if (!token || !hasType(token, 'meta.tag') && !(hasType(token, 'text') && token.value.match('/'))){ + do { + token = iterator.stepBackward(); + } while (token && (hasType(token, 'string') || hasType(token, 'keyword.operator') || hasType(token, 'entity.attribute-name') || hasType(token, 'text'))); + } else { + atCursor = true; + } + if (!token || !hasType(token, 'meta.tag-name') || iterator.stepBackward().value.match('/')) { + return + } + var element = token.value; + if (atCursor){ + var element = element.substring(0, position.column - token.start); + } + if (voidElements.indexOf(element) !== -1){ + return; + } + return { + text: '>' + '', + selection: [1, 1] + } + } + }); +} +oop.inherits(HtmlBehaviour, XmlBehaviour); + +exports.HtmlBehaviour = HtmlBehaviour; +}); + +ace.define('ace/mode/behaviour/xml', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/mode/behaviour/cstyle', 'ace/token_iterator'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var CstyleBehaviour = require("./cstyle").CstyleBehaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; + +function hasType(token, type) { + var hasType = true; + var typeList = token.type.split('.'); + var needleList = type.split('.'); + needleList.forEach(function(needle){ + if (typeList.indexOf(needle) == -1) { + hasType = false; + return false; + } + }); + return hasType; +} + +var XmlBehaviour = function () { + + this.inherit(CstyleBehaviour, ["string_dquotes"]); // Get string behaviour + + this.add("autoclosing", "insertion", function (state, action, editor, session, text) { + if (text == '>') { + var position = editor.getCursorPosition(); + var iterator = new TokenIterator(session, position.row, position.column); + var token = iterator.getCurrentToken(); + var atCursor = false; + if (!token || !hasType(token, 'meta.tag') && !(hasType(token, 'text') && token.value.match('/'))){ + do { + token = iterator.stepBackward(); + } while (token && (hasType(token, 'string') || hasType(token, 'keyword.operator') || hasType(token, 'entity.attribute-name') || hasType(token, 'text'))); + } else { + atCursor = true; + } + if (!token || !hasType(token, 'meta.tag-name') || iterator.stepBackward().value.match('/')) { + return + } + var tag = token.value; + if (atCursor){ + var tag = tag.substring(0, position.column - token.start); + } + + return { + text: '>' + '', + selection: [1, 1] + } + } + }); + + this.add('autoindent', 'insertion', function (state, action, editor, session, text) { + if (text == "\n") { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChars = line.substring(cursor.column, cursor.column + 2); + if (rightChars == '?)/; + this._parseTag = function(tag) { + + var match = tag.match(this.tagRe); + var column = 0; + + return { + value: tag, + match: match ? match[2] : "", + closing: match ? !!match[3] : false, + selfClosing: match ? !!match[5] || match[2] == "/>" : false, + tagName: match ? match[4] : "", + column: match[1] ? column + match[1].length : column + }; + }; + this._readTagForward = function(iterator) { + var token = iterator.getCurrentToken(); + if (!token) + return null; + + var value = ""; + var start; + + do { + if (token.type.indexOf("meta.tag") === 0) { + if (!start) { + var start = { + row: iterator.getCurrentTokenRow(), + column: iterator.getCurrentTokenColumn() + }; + } + value += token.value; + if (value.indexOf(">") !== -1) { + var tag = this._parseTag(value); + tag.start = start; + tag.end = { + row: iterator.getCurrentTokenRow(), + column: iterator.getCurrentTokenColumn() + token.value.length + }; + iterator.stepForward(); + return tag; + } + } + } while(token = iterator.stepForward()); + + return null; + }; + + this._readTagBackward = function(iterator) { + var token = iterator.getCurrentToken(); + if (!token) + return null; + + var value = ""; + var end; + + do { + if (token.type.indexOf("meta.tag") === 0) { + if (!end) { + end = { + row: iterator.getCurrentTokenRow(), + column: iterator.getCurrentTokenColumn() + token.value.length + }; + } + value = token.value + value; + if (value.indexOf("<") !== -1) { + var tag = this._parseTag(value); + tag.end = end; + tag.start = { + row: iterator.getCurrentTokenRow(), + column: iterator.getCurrentTokenColumn() + }; + iterator.stepBackward(); + return tag; + } + } + } while(token = iterator.stepBackward()); + + return null; + }; + + this._pop = function(stack, tag) { + while (stack.length) { + + var top = stack[stack.length-1]; + if (!tag || top.tagName == tag.tagName) { + return stack.pop(); + } + else if (this.voidElements[tag.tagName]) { + return; + } + else if (this.voidElements[top.tagName]) { + stack.pop(); + continue; + } else { + return null; + } + } + }; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var firstTag = this._getFirstTagInLine(session, row); + + if (!firstTag.match) + return null; + + var isBackward = firstTag.closing || firstTag.selfClosing; + var stack = []; + var tag; + + if (!isBackward) { + var iterator = new TokenIterator(session, row, firstTag.column); + var start = { + row: row, + column: firstTag.column + firstTag.tagName.length + 2 + }; + while (tag = this._readTagForward(iterator)) { + if (tag.selfClosing) { + if (!stack.length) { + tag.start.column += tag.tagName.length + 2; + tag.end.column -= 2; + return Range.fromPoints(tag.start, tag.end); + } else + continue; + } + + if (tag.closing) { + this._pop(stack, tag); + if (stack.length == 0) + return Range.fromPoints(start, tag.start); + } + else { + stack.push(tag) + } + } + } + else { + var iterator = new TokenIterator(session, row, firstTag.column + firstTag.match.length); + var end = { + row: row, + column: firstTag.column + }; + + while (tag = this._readTagBackward(iterator)) { + if (tag.selfClosing) { + if (!stack.length) { + tag.start.column += tag.tagName.length + 2; + tag.end.column -= 2; + return Range.fromPoints(tag.start, tag.end); + } else + continue; + } + + if (!tag.closing) { + this._pop(stack, tag); + if (stack.length == 0) { + tag.start.column += tag.tagName.length + 2; + return Range.fromPoints(tag.start, end); + } + } + else { + stack.push(tag) + } + } + } + + }; + +}).call(FoldMode.prototype); + +}); +ace.define('ace/mode/curly_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/html_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules; + + +var CurlyHighlightRules = function() { + var CurlyRules = { + "start" : [ + { + token: "variable", + regex: "{{", + next: "curly_mode" + } + ], + + "curly_mode" : [ + { + token: "variable", + regex: "}}", + next: "start" + } + ] + }; + + var htmlRules = new HtmlHighlightRules().getRules(); + htmlRules.start = CurlyRules.start.concat(htmlRules.start); + htmlRules.curly_mode = CurlyRules.curly_mode; + this.$rules = htmlRules; +}; + +oop.inherits(CurlyHighlightRules, HtmlHighlightRules); + +exports.CurlyHighlightRules = CurlyHighlightRules; + +}); diff --git a/0.0.3_0/ace/mode-d.js b/0.0.3_0/ace/mode-d.js new file mode 100644 index 0000000..11f95ee --- /dev/null +++ b/0.0.3_0/ace/mode-d.js @@ -0,0 +1,388 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2012, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/mode/d', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/d_highlight_rules', 'ace/mode/folding/cstyle'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var DHighlightRules = require("./d_highlight_rules").DHighlightRules; +var FoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + var highlighter = new DHighlightRules(); + this.foldingRules = new FoldMode(); + this.$tokenizer = new Tokenizer(highlighter.getRules()); +}; +oop.inherits(Mode, TextMode); + +(function() { + this.lineCommentStart = "/\\+"; + this.blockComment = {start: "/*", end: "*/"}; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/d_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DHighlightRules = function() { + + this.$rules = { start: + [ { token: 'punctuation.definition.comment.d', regex: '/\\*\\*/' }, + { include: 'text.html.javadoc' }, + { token: + [ 'meta.definition.class.d', + 'storage.modifier.d', + 'storage.type.structure.d', + 'meta.definition.class.d', + 'entity.name.type.class.d', + 'meta.definition.class.d', + 'meta.definition.class.d', + 'storage.type.template.d', + 'meta.definition.class.d', + 'meta.definition.class.d', + 'meta.definition.class.d', + 'punctuation.separator.inheritance.d', + 'meta.definition.class.d', + 'entity.other.inherited-class.d', + 'meta.definition.class.d', + 'entity.other.inherited-class.d', + 'meta.definition.class.d', + 'entity.other.inherited-class.d', + 'meta.definition.class.d', + 'entity.other.inherited-class.d', + 'meta.definition.class.d', + 'entity.other.inherited-class.d', + 'meta.definition.class.d', + 'entity.other.inherited-class.d', + 'meta.definition.class.d', + 'entity.other.inherited-class.d' ], + regex: '^(\\s*)((?:\\b(?:public|private|protected|static|final|native|synchronized|abstract|export)\\b\\s*)*)(class|interface)(\\s+)(\\w+)(\\s*)(?:(\\(\\s*)([^\\)]+)(\\s*\\))|)(\\s*)(?:(\\s*)(:)(\\s*)(\\w+)(?:(\\s*,\\s*)(\\w+))?(?:(\\s*,\\s*)(\\w+))?(?:(\\s*,\\s*)(\\w+))?(?:(\\s*,\\s*)(\\w+))?(?:(\\s*,\\s*)(\\w+))?(?:(\\s*,\\s*)(\\w+))?)?', + push: + [ { token: 'meta.definition.class.d', regex: '(?={)', next: 'pop' }, + { token: 'storage.modifier.d', + regex: '\\b(?:_|:)\\b', + push: + [ { token: [], regex: '(?={)', next: 'pop' }, + { include: '#all-types' }, + { defaultToken: 'meta.definition.class.extends.d' } ] }, + { defaultToken: 'meta.definition.class.d' } ] }, + { token: + [ 'meta.definition.struct.d', + 'storage.modifier.d', + 'storage.type.structure.d', + 'meta.definition.struct.d', + 'entity.name.type.struct.d', + 'meta.definition.struct.d', + 'meta.definition.struct.d', + 'storage.type.template.d', + 'meta.definition.struct.d', + 'meta.definition.struct.d' ], + regex: '^(\\s*)((?:\\b(?:public|private|protected|static|final|native|synchronized|abstract|export)\\b\\s*)*)(struct)(\\s+)(\\w+)(\\s*)(?:(\\(\\s*)([^\\)]+)(\\s*\\))|)(\\s*)', + push: + [ { token: 'meta.definition.struct.d', + regex: '(?={)', + next: 'pop' }, + { token: 'storage.modifier.d', + regex: '\\b(?:_|:)\\b', + push: + [ { token: [], regex: '(?={)', next: 'pop' }, + { include: '#all-types' }, + { defaultToken: 'meta.definition.class.extends.d' } ] }, + { defaultToken: 'meta.definition.struct.d' } ] }, + { token: + [ 'meta.definition.constructor.d', + 'storage.modifier.d', + 'entity.name.function.constructor.d', + 'meta.definition.constructor.d' ], + regex: '^(\\s*)((?:\\b(?:public|private|protected|static|final|native|synchronized|abstract|threadsafe|transient|export)\\b\\s*)*)(\\bthis)(\\s*)(?!.*;)(?=\\()' }, + { token: + [ 'storage.modifier.d', + 'entity.name.function.destructor.d', + 'meta.definition.destructor.d', + 'meta.definition.destructor.d' ], + regex: '(?:^|)((?:\\b(?:public|private|protected|static|final|native|synchronized|abstract|threadsafe|transient|export)\\b\\s*)*)(~this)(\\s*)(\\()', + TODO: '(?|(?:\\[\\s*\\])*)?)(\\s*)(\\w+)(\\s*)(?!.*;)(?=\\()' }, + { token: 'constant.other.d', regex: '\\b[A-Z][A-Z0-9_]+\\b' }, + { include: '#comments' }, + { include: '#all-types' }, + { token: 'storage.modifier.access-control.d', + regex: '\\b(?:private|protected|public|export)\\b' }, + { token: 'storage.modifier.d', + regex: '\\b(?:auto|static|override|final|const|abstract|volatile|synchronized|lazy)\\b' }, + { token: 'storage.type.structure.d', + regex: '\\b(?:template|interface|class|enum|struct|union)\\b' }, + { token: 'storage.type.d', + regex: '\\b(?:ushort|int|uint|long|ulong|float|void|byte|ubyte|double|bit|char|wchar|ucent|cent|short|bool|dchar|real|ireal|ifloat|idouble|creal|cfloat|cdouble|lazy)\\b' }, + { token: 'keyword.control.exception.d', + regex: '\\b(?:try|catch|finally|throw)\\b' }, + { token: 'keyword.control.d', + regex: '\\b(?:return|break|case|continue|default|do|while|for|switch|if|else)\\b' }, + { token: 'keyword.control.conditional.d', + regex: '\\b(?:if|else|switch|iftype)\\b' }, + { token: 'keyword.control.branch.d', + regex: '\\b(?:goto|break|continue)\\b' }, + { token: 'keyword.control.repeat.d', + regex: '\\b(?:while|for|do|foreach(?:_reverse)?)\\b' }, + { token: 'keyword.control.statement.d', + regex: '\\b(?:version|return|with|invariant|body|scope|in|out|inout|asm|mixin|function|delegate)\\b' }, + { token: 'keyword.control.pragma.d', regex: '\\bpragma\\b' }, + { token: 'keyword.control.alias.d', + regex: '\\b(?:alias|typedef)\\b' }, + { token: 'keyword.control.import.d', regex: '\\bimport\\b' }, + { token: + [ 'meta.module.d', + 'keyword.control.module.d', + 'meta.module.d', + 'entity.name.function.package.d', + 'meta.module.d' ], + regex: '^(\\s*)(module)(\\s+)([^ ;]+?)(;)' }, + { token: 'constant.language.boolean.d', + regex: '\\b(?:true|false)\\b' }, + { token: 'constant.language.d', + regex: '\\b(?:__FILE__|__LINE__|__DATE__|__TIME__|__TIMESTAMP__|null)\\b' }, + { token: 'variable.language.d', regex: '\\b(?:this|super)\\b' }, + { token: 'constant.numeric.d', + regex: '\\b(?:0(?:x|X)[0-9a-fA-F]*|(?:[0-9]+\\.?[0-9]*|\\.[0-9]+)(?:(?:e|E)(?:\\+|-)?[0-9]+)?)(?:[LlFfUuDd]|UL|ul)?\\b' }, + { include: '#string_escaped_char' }, + { include: '#strings' }, + { token: 'keyword.operator.comparison.d', + regex: '==|!=|<=|>=|<>|<|>' }, + { token: 'keyword.operator.increment-decrement.d', + regex: '\\-\\-|\\+\\+' }, + { token: 'keyword.operator.arithmetic.d', + regex: '\\-|\\+|\\*|\\/|~|%' }, + { token: 'keyword.operator.logical.d', regex: '!|&&|\\|\\|' }, + { token: 'keyword.operator.overload.d', + regex: '\\b(?:opNeg|opCom|opPostInc|opPostDec|opCast|opAdd|opSub|opSub_r|opMul|opDiv|opDiv_r|opMod|opMod_r|opAnd|opOr|opXor|opShl|opShl_r|opShr|opShr_r|opUShr|opUShr_r|opCat|opCat_r|opEquals|opEquals|opCmp|opCmp|opCmp|opCmp|opAddAssign|opSubAssign|opMulAssign|opDivAssign|opModAssign|opAndAssign|opOrAssign|opXorAssign|opShlAssign|opShrAssign|opUShrAssign|opCatAssign|opIndex|opIndexAssign|opCall|opSlice|opSliceAssign|opPos|opAdd_r|opMul_r|opAnd_r|opOr_r|opXor_r)\\b' }, + { token: 'keyword.operator.d', + regex: '\\b(?:new|delete|typeof|typeid|cast|align|is)\\b' }, + { token: 'keyword.other.class-fns.d', + regex: '\\b(?:new|throws)\\b' }, + { token: 'keyword.other.external.d', + regex: '\\b(?:package|extern)\\b' }, + { token: 'keyword.other.debug.d', + regex: '\\b(?:deprecated|unittest|debug)\\b' }, + { token: 'support.type.sys-types.c', + regex: '\\b(?:u_char|u_short|u_int|u_long|ushort|uint|u_quad_t|quad_t|qaddr_t|caddr_t|daddr_t|dev_t|fixpt_t|blkcnt_t|blksize_t|gid_t|in_addr_t|in_port_t|ino_t|key_t|mode_t|nlink_t|id_t|pid_t|off_t|segsz_t|swblk_t|uid_t|id_t|clock_t|size_t|ssize_t|time_t|useconds_t|suseconds_t)\\b' }, + { token: 'support.type.pthread.c', + regex: '\\b(?:pthread_attr_t|pthread_cond_t|pthread_condattr_t|pthread_mutex_t|pthread_mutexattr_t|pthread_once_t|pthread_rwlock_t|pthread_rwlockattr_t|pthread_t|pthread_key_t)\\b' }, + { token: 'support.type.stdint.c', + regex: '\\b(?:int8_t|int16_t|int32_t|int64_t|uint8_t|uint16_t|uint32_t|uint64_t|int_least8_t|int_least16_t|int_least32_t|int_least64_t|uint_least8_t|uint_least16_t|uint_least32_t|uint_least64_t|int_fast8_t|int_fast16_t|int_fast32_t|int_fast64_t|uint_fast8_t|uint_fast16_t|uint_fast32_t|uint_fast64_t|intptr_t|uintptr_t|intmax_t|intmax_t|uintmax_t|uintmax_t)\\b' } ], + '#all-types': + [ { include: '#support-type-built-ins-d' }, + { include: '#support-type-d' }, + { include: '#storage-type-d' } ], + '#comments': + [ { token: 'punctuation.definition.comment.d', + regex: '/\\*', + push: + [ { token: 'punctuation.definition.comment.d', + regex: '\\*/', + next: 'pop' }, + { defaultToken: 'comment.block.d' } ] }, + { token: 'punctuation.definition.comment.d', + regex: '/\\+', + push: + [ { token: 'punctuation.definition.comment.d', + regex: '\\+/', + next: 'pop' }, + { defaultToken: 'comment.block.nested.d' } ] }, + { token: + [ 'punctuation.definition.comment.d', + 'comment.line.double-slash.d' ], + regex: '(//)(.*$)' } ], + '#constant_placeholder': + [ { token: 'constant.other.placeholder.d', + regex: '%(?:\\([a-z_]+\\))?#?0?\\-?[ ]?\\+?(?:[0-9]*|\\*)(?:\\.(?:[0-9]*|\\*))?[hL]?[a-z%]', + caseInsensitive: true } ], + '#regular_expressions': [{token: "constant.character.escape", regex: "\\\\."}], //[ { include: 'source.regexp.python' } ], + '#statement-remainder': + [ { token: 'meta.definition.param-list.d', + regex: '\\(', + push: + [ { token: 'meta.definition.param-list.d', + regex: '(?=\\))', + next: 'pop' }, + { include: '#all-types' }, + { defaultToken: 'meta.definition.param-list.d' } ] }, + { token: 'keyword.other.class-fns.d', + regex: 'throws', + push: + [ { token: [], regex: '(?={)', next: 'pop' }, + { include: '#all-types' }, + { defaultToken: 'meta.definition.throws.d' } ] } ], + '#storage-type-d': + [ { token: 'storage.type.d', + regex: '\\b(?:void|byte|short|char|int|long|float|double|boolean|(?:[a-z]\\w+\\.)*[A-Z]\\w+)\\b' } ], + '#string_escaped_char': + [ { token: 'constant.character.escape.d', + regex: '\\\\(?:\\\\|[abefnprtv\'"?]|[0-3]\\d{,2}|x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|U[0-9a-fA-F]{8}|&\\w+;)' }, + { token: 'invalid.illegal.unknown-escape.d', regex: '\\\\.' } ], + '#strings': + [ { token: 'punctuation.definition.string.begin.d', + regex: '"', + push: + [ { include: '#string_escaped_char' }, + { token: 'punctuation.definition.string.end.d', + regex: '"', + next: 'pop' }, + { defaultToken: 'string.quoted.double.d' } ] }, + { token: + [ 'storage.type.string.d', + 'punctuation.definition.string.begin.d' ], + regex: '(r)(")', + push: + [ { token: 'punctuation.definition.string.end.d', + regex: '"', + next: 'pop' }, + { include: '#regular_expressions' }, + { defaultToken: 'string.quoted.double.raw.d' } ] }, + { token: 'punctuation.definition.string.begin.d', + regex: '`', + push: + [ { token: 'punctuation.definition.string.end.d', + regex: '`', + next: 'pop' }, + { defaultToken: 'string.quoted.double.raw.backtick.d' } ] }, + { token: 'punctuation.definition.string.begin.d', + regex: '\'', + push: + [ { include: '#string_escaped_char' }, + { token: 'punctuation.definition.string.end.d', + regex: '\'', + next: 'pop' }, + { defaultToken: 'string.quoted.single.d' } ] } ], + '#support-type-built-ins-classes-d': + [ { token: 'support.type.built-ins.classes.d', + regex: '\\b(?:AbstractServer|ArchiveMember|ArgParser|Barrier|BomSniffer|Buffer|BufferInput|BufferOutput|BufferSlice|BufferedFile|BufferedStream|BzipInput|BzipOutput|CFile|CacheInvalidatee|CacheInvalidator|CacheServer|CacheThread|Certificate|CertificateStore|CertificateStoreCtx|ChunkInput|ChunkOutput|ClassInfo|Cluster|ClusterCache|ClusterQueue|ClusterThread|CmdParser|ComObject|Compress|Condition|Conduit|Cookie|CookieParser|CookieStack|CounterInput|CounterOutput|DataFileInput|DataFileOutput|DataInput|DataOutput|Database|DatagramConduit|DeviceConduit|DigestInput|DigestOutput|DocPrinter|Document|DummyInputStream|DummyOutputStream|EndianInput|EndianOutput|EndianProtocol|EndianStream|EventSeekInputStream|EventSeekOutputStream|FTPConnection|Fiber|Field|File|FileConduit|FileFolder|FileGroup|FileInput|FileOutput|FilePath|FileScan|FilterStream|Foo|FormatOutput|GreedyInput|GreedyOutput|Gregorian|GrowBuffer|HeapCopy|HeapSlice|Hierarchy|HttpClient|HttpCookies|HttpCookiesView|HttpGet|HttpHeaders|HttpHeadersView|HttpParams|HttpPost|HttpStack|HttpTokens|HttpTriplet|IPv4Address|IUnknown|InputFilter|InternetAddress|InternetHost|Layout|LineInput|LineIterator|LinkedFolder|Log|MapInput|MapOutput|MappedBuffer|Md2|Md4|MemoryQueue|MemoryStream|MmFile|MmFileStream|ModuleInfo|MulticastConduit|Mutex|NativeProtocol|NetCall|NetHost|NetworkAlert|NetworkCache|NetworkCall|NetworkClient|NetworkCombo|NetworkMessage|NetworkQueue|NetworkRegistry|NetworkTask|NotImplemented|Object|Observer|OutBuffer|OutputFilter|PersistQueue|Pipe|PipeConduit|Print|PrivateKey|Process|Properties|Protocol|ProtocolReader|ProtocolWriter|PublicKey|PullParser|QueueFile|QueueServer|QueueThread|QueuedCache|QuoteIterator|Random|Range|ReadWriteMutex|Reader|Record|RegExp|RegExpT|RegexIterator|RollCall|SSLCtx|SSLServerSocket|SSLSocketConduit|SaxParser|SelectionKey|Semaphore|ServerSocket|ServerThread|Service|SimpleIterator|SliceInputStream|SliceSeekInputStream|SliceSeekOutputStream|SliceStream|SnoopInput|SnoopOutput|Socket|SocketConduit|SocketListener|SocketSet|SocketStream|Sprint|Stream|StreamIterator|TArrayStream|TaskServer|TaskThread|TcpSocket|Telnet|TempFile|Text|TextFileInput|TextFileOutput|TextView|Thread|ThreadGroup|ThreadLocal|ThreadPool|Token|TypeInfo|TypeInfo_AC|TypeInfo_Aa|TypeInfo_Ab|TypeInfo_Ac|TypeInfo_Ad|TypeInfo_Ae|TypeInfo_Af|TypeInfo_Ag|TypeInfo_Ah|TypeInfo_Ai|TypeInfo_Aj|TypeInfo_Ak|TypeInfo_Al|TypeInfo_Am|TypeInfo_Ao|TypeInfo_Ap|TypeInfo_Aq|TypeInfo_Ar|TypeInfo_Array|TypeInfo_As|TypeInfo_AssociativeArray|TypeInfo_At|TypeInfo_Au|TypeInfo_Av|TypeInfo_Aw|TypeInfo_C|TypeInfo_Class|TypeInfo_D|TypeInfo_Delegate|TypeInfo_Enum|TypeInfo_Function|TypeInfo_Interface|TypeInfo_P|TypeInfo_Pointer|TypeInfo_StaticArray|TypeInfo_Struct|TypeInfo_Tuple|TypeInfo_Typedef|TypeInfo_a|TypeInfo_b|TypeInfo_c|TypeInfo_d|TypeInfo_e|TypeInfo_f|TypeInfo_g|TypeInfo_h|TypeInfo_i|TypeInfo_j|TypeInfo_k|TypeInfo_l|TypeInfo_m|TypeInfo_o|TypeInfo_p|TypeInfo_q|TypeInfo_r|TypeInfo_s|TypeInfo_t|TypeInfo_u|TypeInfo_v|TypeInfo_w|TypedInput|TypedOutput|URIerror|UdpSocket|UnCompress|UniText|UnicodeBom|UnicodeFile|UnknownAddress|Uri|UtfInput|UtfOutput|VirtualFolder|WrapSeekInputStream|WrapSeekOutputStream|Writer|XmlPrinter|ZipArchive|ZipBlockReader|ZipBlockWriter|ZipEntry|ZipEntryVerifier|ZipFile|ZipFileGroup|ZipFolder|ZipSubFolder|ZipSubFolderEntry|ZipSubFolderGroup|ZlibInput|ZlibOutput)\\b' } ], + '#support-type-built-ins-d': + [ { include: '#support-type-built-ins-exceptions-d' }, + { include: '#support-type-built-ins-classes-d' }, + { include: '#support-type-built-ins-interfaces-d' }, + { include: '#support-type-built-ins-structs-d' } ], + '#support-type-built-ins-exceptions-d': + [ { token: 'support.type.built-ins.exceptions.d', + regex: '\\b(?:AddressException|ArrayBoundsError|ArrayBoundsException|AssertError|AssertException|Base64CharException|Base64Exception|BzipClosedException|BzipException|ClusterEmptyException|ClusterFullException|ConvError|ConvOverflowError|ConversionException|CorruptedIteratorException|DatabaseException|DateParseError|Exception|FTPException|FiberException|FileException|FinalizeException|FormatError|HostException|IOException|IllegalArgumentException|IllegalElementException|InvalidKeyException|InvalidTypeException|LocaleException|ModuleCtorError|NoSuchElementException|OpenException|OpenRJException|OutOfMemoryException|PlatformException|ProcessCreateException|ProcessException|ProcessForkException|ProcessKillException|ProcessWaitException|ReadException|RegExpException|RegexException|RegistryException|SeekException|SharedLibException|SocketAcceptException|SocketException|StdioException|StreamException|StreamFileException|StringException|SwitchError|SwitchException|SyncException|TextException|ThreadError|ThreadException|UnboxException|UnicodeException|UtfException|VariantTypeMismatchException|Win32Exception|WriteException|XmlException|ZipChecksumException|ZipException|ZipExhaustedException|ZipNotSupportedException|ZlibClosedException|ZlibException|OurUnwindException|SysError)\\b' } ], + '#support-type-built-ins-interfaces-d': + [ { token: 'support.type.built-ins.interfaces.d', + regex: '\\b(?:Buffered|HttpParamsView|ICache|IChannel|IClassFactory|ICluster|IConduit|IConsumer|IEvent|IHierarchy|ILevel|IListener|IMessage|IMessageLoader|IOStream|IReadable|ISelectable|ISelectionSet|ISelector|IServer|IUnknown|IWritable|IXmlPrinter|InputStream|OutputStream|PathView|VfsFile|VfsFiles|VfsFolder|VfsFolderEntry|VfsFolders|VfsHost|VfsSync|ZipReader|ZipWriter)\\b' } ], + '#support-type-built-ins-structs-d': + [ { token: 'support.type.built-ins.structs.d', + regex: '\\b(?:ABC|ABCFLOAT|ACCEL|ACCESSTIMEOUT|ACCESS_ALLOWED_ACE|ACCESS_DENIED_ACE|ACE_HEADER|ACL|ACL_REVISION_INFORMATION|ACL_SIZE_INFORMATION|ACTION_HEADER|ADAPTER_STATUS|ADDJOB_INFO_1|ANIMATIONINFO|APPBARDATA|Argument|Atomic|Attribute|BITMAP|BITMAPCOREHEADER|BITMAPCOREINFO|BITMAPINFO|BITMAPINFOHEADER|BITMAPV4HEADER|BLOB|BROWSEINFO|BY_HANDLE_FILE_INFORMATION|Bar|Baz|BitArray|Box|BracketResult|ByteSwap|CANDIDATEFORM|CANDIDATELIST|CBTACTIVATESTRUCT|CBT_CREATEWND|CHARFORMAT|CHARRANGE|CHARSET|CHARSETINFO|CHAR_INFO|CIDA|CIEXYZ|CIEXYZTRIPLE|CLIENTCREATESTRUCT|CMINVOKECOMMANDINFO|COLORADJUSTMENT|COLORMAP|COMMCONFIG|COMMPROP|COMMTIMEOUTS|COMPAREITEMSTRUCT|COMPCOLOR|COMPOSITIONFORM|COMSTAT|CONNECTDLGSTRUCT|CONSOLE_CURSOR_INFO|CONTEXT|CONVCONTEXT|CONVINFO|COORD|COPYDATASTRUCT|CPINFO|CPLINFO|CREATESTRUCT|CREATE_PROCESS_DEBUG_INFO|CREATE_THREAD_DEBUG_INFO|CRITICAL_SECTION|CRITICAL_SECTION_DEBUG|CURRENCYFMT|CURSORSHAPE|CWPRETSTRUCT|CWPSTRUCT|CharClass|CharRange|Clock|CodePage|Console|DATATYPES_INFO_1|DCB|DDEACK|DDEADVISE|DDEDATA|DDELN|DDEML_MSG_HOOK_DATA|DDEPOKE|DDEUP|DEBUGHOOKINFO|DEBUG_EVENT|DELETEITEMSTRUCT|DEVMODE|DEVNAMES|DEV_BROADCAST_HDR|DEV_BROADCAST_OEM|DEV_BROADCAST_PORT|DEV_BROADCAST_VOLUME|DIBSECTION|DIR|DISCDLGSTRUCT|DISK_GEOMETRY|DISK_PERFORMANCE|DOCINFO|DOC_INFO_1|DOC_INFO_2|DRAGLISTINFO|DRAWITEMSTRUCT|DRAWTEXTPARAMS|DRIVER_INFO_1|DRIVER_INFO_2|DRIVER_INFO_3|DRIVE_LAYOUT_INFORMATION|Date|DateParse|DateTime|DirEntry|DynArg|EDITSTREAM|EMPTYRECORD|EMR|EMRABORTPATH|EMRANGLEARC|EMRARC|EMRBITBLT|EMRCREATEBRUSHINDIRECT|EMRCREATECOLORSPACE|EMRCREATEDIBPATTERNBRUSHPT|EMRCREATEMONOBRUSH|EMRCREATEPALETTE|EMRCREATEPEN|EMRELLIPSE|EMREOF|EMREXCLUDECLIPRECT|EMREXTCREATEFONTINDIRECTW|EMREXTCREATEPEN|EMREXTFLOODFILL|EMREXTSELECTCLIPRGN|EMREXTTEXTOUTA|EMRFILLPATH|EMRFILLRGN|EMRFORMAT|EMRFRAMERGN|EMRGDICOMMENT|EMRINVERTRGN|EMRLINETO|EMRMASKBLT|EMRMODIFYWORLDTRANSFORM|EMROFFSETCLIPRGN|EMRPLGBLT|EMRPOLYDRAW|EMRPOLYDRAW16|EMRPOLYLINE|EMRPOLYLINE16|EMRPOLYPOLYLINE|EMRPOLYPOLYLINE16|EMRPOLYTEXTOUTA|EMRRESIZEPALETTE|EMRRESTOREDC|EMRROUNDRECT|EMRSCALEVIEWPORTEXTEX|EMRSELECTCLIPPATH|EMRSELECTCOLORSPACE|EMRSELECTOBJECT|EMRSELECTPALETTE|EMRSETARCDIRECTION|EMRSETBKCOLOR|EMRSETCOLORADJUSTMENT|EMRSETDIBITSTODEVICE|EMRSETMAPPERFLAGS|EMRSETMITERLIMIT|EMRSETPALETTEENTRIES|EMRSETPIXELV|EMRSETVIEWPORTEXTEX|EMRSETVIEWPORTORGEX|EMRSETWORLDTRANSFORM|EMRSTRETCHBLT|EMRSTRETCHDIBITS|EMRTEXT|ENCORRECTTEXT|ENDROPFILES|ENHMETAHEADER|ENHMETARECORD|ENOLEOPFAILED|ENPROTECTED|ENSAVECLIPBOARD|ENUMLOGFONT|ENUMLOGFONTEX|ENUM_SERVICE_STATUS|EVENTLOGRECORD|EVENTMSG|EXCEPTION_DEBUG_INFO|EXCEPTION_POINTERS|EXCEPTION_RECORD|EXIT_PROCESS_DEBUG_INFO|EXIT_THREAD_DEBUG_INFO|EXTLOGFONT|EXTLOGPEN|EXT_BUTTON|EmptySlot|EndOfCDRecord|Environment|FILETIME|FILTERKEYS|FINDREPLACE|FINDTEXTEX|FIND_NAME_BUFFER|FIND_NAME_HEADER|FIXED|FLOATING_SAVE_AREA|FMS_GETDRIVEINFO|FMS_GETFILESEL|FMS_LOAD|FMS_TOOLBARLOAD|FOCUS_EVENT_RECORD|FONTSIGNATURE|FORMATRANGE|FORMAT_PARAMETERS|FORM_INFO_1|FileConst|FileHeader|FileRoots|FileSystem|FoldingCaseData|Foo|FtpConnectionDetail|FtpFeature|FtpFileInfo|FtpResponse|GC|GCP_RESULTS|GCStats|GENERIC_MAPPING|GLYPHMETRICS|GLYPHMETRICSFLOAT|GROUP_INFO_2|GUID|HANDLETABLE|HD_HITTESTINFO|HD_ITEM|HD_LAYOUT|HD_NOTIFY|HELPINFO|HELPWININFO|HIGHCONTRAST|HSZPAIR|HeaderElement|HttpConst|HttpHeader|HttpHeaderName|HttpResponses|HttpStatus|HttpToken|ICONINFO|ICONMETRICS|IMAGEINFO|IMAGE_DOS_HEADER|INPUT_RECORD|ITEMIDLIST|IeeeFlags|Interface|JOB_INFO_1|JOB_INFO_2|KERNINGPAIR|LANA_ENUM|LAYERPLANEDESCRIPTOR|LDT_ENTRY|LIST_ENTRY|LOAD_DLL_DEBUG_INFO|LOCALESIGNATURE|LOCALGROUP_INFO_0|LOCALGROUP_MEMBERS_INFO_0|LOCALGROUP_MEMBERS_INFO_3|LOGBRUSH|LOGCOLORSPACE|LOGFONT|LOGFONTA|LOGFONTW|LOGPALETTE|LOGPEN|LUID_AND_ATTRIBUTES|LV_COLUMN|LV_DISPINFO|LV_FINDINFO|LV_HITTESTINFO|LV_ITEM|LV_KEYDOWN|LocalFileHeader|MAT2|MD5_CTX|MDICREATESTRUCT|MEASUREITEMSTRUCT|MEMORYSTATUS|MEMORY_BASIC_INFORMATION|MENUEX_TEMPLATE_HEADER|MENUEX_TEMPLATE_ITEM|MENUITEMINFO|MENUITEMTEMPLATE|MENUITEMTEMPLATEHEADER|MENUTEMPLATE|MENU_EVENT_RECORD|METAFILEPICT|METARECORD|MINIMIZEDMETRICS|MINMAXINFO|MODEMDEVCAPS|MODEMSETTINGS|MONCBSTRUCT|MONCONVSTRUCT|MONERRSTRUCT|MONHSZSTRUCT|MONITOR_INFO_1|MONITOR_INFO_2|MONLINKSTRUCT|MONMSGSTRUCT|MOUSEHOOKSTRUCT|MOUSEKEYS|MOUSE_EVENT_RECORD|MSG|MSGBOXPARAMS|MSGFILTER|MULTIKEYHELP|NAME_BUFFER|NCB|NCCALCSIZE_PARAMS|NDDESHAREINFO|NETCONNECTINFOSTRUCT|NETINFOSTRUCT|NETRESOURCE|NEWCPLINFO|NEWTEXTMETRIC|NEWTEXTMETRICEX|NMHDR|NM_LISTVIEW|NM_TREEVIEW|NM_UPDOWNW|NONCLIENTMETRICS|NS_SERVICE_INFO|NUMBERFMT|OFNOTIFY|OFSTRUCT|OPENFILENAME|OPENFILENAMEA|OPENFILENAMEW|OSVERSIONINFO|OUTLINETEXTMETRIC|OUTPUT_DEBUG_STRING_INFO|OVERLAPPED|OffsetTypeInfo|PAINTSTRUCT|PALETTEENTRY|PANOSE|PARAFORMAT|PARTITION_INFORMATION|PERF_COUNTER_BLOCK|PERF_COUNTER_DEFINITION|PERF_DATA_BLOCK|PERF_INSTANCE_DEFINITION|PERF_OBJECT_TYPE|PIXELFORMATDESCRIPTOR|POINT|POINTFLOAT|POINTFX|POINTL|POINTS|POLYTEXT|PORT_INFO_1|PORT_INFO_2|PREVENT_MEDIA_REMOVAL|PRINTER_DEFAULTS|PRINTER_INFO_1|PRINTER_INFO_2|PRINTER_INFO_3|PRINTER_INFO_4|PRINTER_INFO_5|PRINTER_NOTIFY_INFO|PRINTER_NOTIFY_INFO_DATA|PRINTER_NOTIFY_OPTIONS|PRINTER_NOTIFY_OPTIONS_TYPE|PRINTPROCESSOR_INFO_1|PRIVILEGE_SET|PROCESS_HEAPENTRY|PROCESS_INFORMATION|PROPSHEETHEADER|PROPSHEETHEADER_U1|PROPSHEETHEADER_U2|PROPSHEETHEADER_U3|PROPSHEETPAGE|PROPSHEETPAGE_U1|PROPSHEETPAGE_U2|PROTOCOL_INFO|PROVIDOR_INFO_1|PSHNOTIFY|PUNCTUATION|PassByCopy|PassByRef|Phase1Info|PropertyConfigurator|QUERY_SERVICE_CONFIG|QUERY_SERVICE_LOCK_STATUS|RASAMB|RASCONN|RASCONNSTATUS|RASDIALEXTENSIONS|RASDIALPARAMS|RASENTRYNAME|RASPPPIP|RASPPPIPX|RASPPPNBF|RASTERIZER_STATUS|REASSIGN_BLOCKS|RECT|RECTL|REMOTE_NAME_INFO|REPASTESPECIAL|REQRESIZE|RGBQUAD|RGBTRIPLE|RGNDATA|RGNDATAHEADER|RIP_INFO|Runtime|SCROLLINFO|SECURITY_ATTRIBUTES|SECURITY_DESCRIPTOR|SECURITY_QUALITY_OF_SERVICE|SELCHANGE|SERIALKEYS|SERVICE_ADDRESS|SERVICE_ADDRESSES|SERVICE_INFO|SERVICE_STATUS|SERVICE_TABLE_ENTRY|SERVICE_TYPE_INFO_ABS|SERVICE_TYPE_VALUE_ABS|SESSION_BUFFER|SESSION_HEADER|SET_PARTITION_INFORMATION|SHFILEINFO|SHFILEOPSTRUCT|SHITEMID|SHNAMEMAPPING|SID|SID_AND_ATTRIBUTES|SID_IDENTIFIER_AUTHORITY|SINGLE_LIST_ENTRY|SIZE|SMALL_RECT|SOUNDSENTRY|STARTUPINFO|STICKYKEYS|STRRET|STYLEBUF|STYLESTRUCT|SYSTEMTIME|SYSTEM_AUDIT_ACE|SYSTEM_INFO|SYSTEM_INFO_U|SYSTEM_POWER_STATUS|Signal|SjLj_Function_Context|SpecialCaseData|TAPE_ERASE|TAPE_GET_DRIVE_PARAMETERS|TAPE_GET_MEDIA_PARAMETERS|TAPE_GET_POSITION|TAPE_PREPARE|TAPE_SET_DRIVE_PARAMETERS|TAPE_SET_MEDIA_PARAMETERS|TAPE_SET_POSITION|TAPE_WRITE_MARKS|TBADDBITMAP|TBBUTTON|TBNOTIFY|TBSAVEPARAMS|TCHOOSECOLOR|TCHOOSEFONT|TC_HITTESTINFO|TC_ITEM|TC_ITEMHEADER|TC_KEYDOWN|TEXTMETRIC|TEXTMETRICA|TEXTRANGE|TFINDTEXT|TIME_ZONE_INFORMATION|TOGGLEKEYS|TOKEN_CONTROL|TOKEN_DEFAULT_DACL|TOKEN_GROUPS|TOKEN_OWNER|TOKEN_PRIMARY_GROUP|TOKEN_PRIVILEGES|TOKEN_SOURCE|TOKEN_STATISTICS|TOKEN_USER|TOOLINFO|TOOLTIPTEXT|TPAGESETUPDLG|TPMPARAMS|TRANSMIT_FILE_BUFFERS|TREEITEM|TSMALLPOINT|TTHITTESTINFO|TTPOLYCURVE|TTPOLYGONHEADER|TVARIANT|TV_DISPINFO|TV_HITTESTINFO|TV_INSERTSTRUCT|TV_ITEM|TV_KEYDOWN|TV_SORTCB|Time|TimeOfDay|TimeSpan|Tuple|UDACCEL|ULARGE_INTEGER|UNIVERSAL_NAME_INFO|UNLOAD_DLL_DEBUG_INFO|USEROBJECTFLAGS|USER_INFO_0|USER_INFO_2|USER_INFO_3|UnicodeData|VALENT|VA_LIST|VERIFY_INFORMATION|VS_FIXEDFILEINFO|Variant|VfsFilterInfo|WIN32_FILE_ATTRIBUTE_DATA|WIN32_FIND_DATA|WIN32_FIND_DATAW|WIN32_STREAM_ID|WINDOWINFO|WINDOWPLACEMENT|WINDOWPOS|WINDOW_BUFFER_SIZE_RECORD|WNDCLASS|WNDCLASSA|WNDCLASSEX|WNDCLASSEXA|WSADATA|WallClock|XFORM|ZipEntryInfo)\\b' } ], + '#support-type-d': + [ { token: 'support.type.d', + regex: '\\b(?:tango|std)\\.[\\w\\.]+\\b' } ] } + + this.normalizeRules(); +}; + +DHighlightRules.metaData = { comment: 'D language', + fileTypes: [ 'd', 'di' ], + firstLineMatch: '^#!.*\\bg?dmd\\b.', + foldingStartMarker: '(?x)/\\*\\*(?!\\*)|^(?![^{]*?//|[^{]*?/\\*(?!.*?\\*/.*?\\{)).*?\\{\\s*($|//|/\\*(?!.*?\\*/.*\\S))', + foldingStopMarker: '(?=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|new|delete|typeof|void)" + }, { + token : "punctuation.operator", + regex : "\\?|\\:|\\,|\\;|\\." + }, { + token : "paren.lparen", + regex : "[[({]" + }, { + token : "paren.rparen", + regex : "[\\])}]" + }, { + token : "text", + regex : "\\s+" + } + ], + "comment" : [ + { + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "start" + }, { + token : "comment", // comment spanning whole line + regex : ".+" + } + ], + "qqstring" : [ + { + token : "string", + regex : '(?:(?:\\\\.)|(?:[^"\\\\]))*?"', + next : "start" + }, { + token : "string", + regex : '.+' + } + ], + "qstring" : [ + { + token : "string", + regex : "(?:(?:\\\\.)|(?:[^'\\\\]))*?'", + next : "start" + }, { + token : "string", + regex : '.+' + } + ], + "directive" : [ + { + token : "constant.other.multiline", + regex : /\\/ + }, + { + token : "constant.other.multiline", + regex : /.*\\/ + }, + { + token : "constant.other", + regex : "\\s*<.+?>", + next : "start" + }, + { + token : "constant.other", // single line + regex : '\\s*["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]', + next : "start" + }, + { + token : "constant.other", // single line + regex : "\\s*['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']", + next : "start" + }, + { + token : "constant.other", + regex : /[^\\\/]+/, + next : "start" + } + ] + }; + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("start") ]); +}; + +oop.inherits(c_cppHighlightRules, TextHighlightRules); + +exports.c_cppHighlightRules = c_cppHighlightRules; +}); + +ace.define('ace/mode/doc_comment_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, { + token : "comment.doc.tag", + regex : "\\bTODO\\b" + }, { + defaultToken : "comment.doc" + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) { + + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define('ace/mode/behaviour/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/token_iterator', 'ace/lib/lang'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; +var lang = require("../../lib/lang"); + +var SAFE_INSERT_IN_TOKENS = + ["text", "paren.rparen", "punctuation.operator"]; +var SAFE_INSERT_BEFORE_TOKENS = + ["text", "paren.rparen", "punctuation.operator", "comment"]; + + +var autoInsertedBrackets = 0; +var autoInsertedRow = -1; +var autoInsertedLineEnd = ""; +var maybeInsertedBrackets = 0; +var maybeInsertedRow = -1; +var maybeInsertedLineStart = ""; +var maybeInsertedLineEnd = ""; + +var CstyleBehaviour = function () { + + CstyleBehaviour.isSaneInsertion = function(editor, session) { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + if (!this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) { + var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1); + if (!this.$matchTokenType(iterator2.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) + return false; + } + iterator.stepForward(); + return iterator.getCurrentTokenRow() !== cursor.row || + this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_BEFORE_TOKENS); + }; + + CstyleBehaviour.$matchTokenType = function(token, types) { + return types.indexOf(token.type || token) > -1; + }; + + CstyleBehaviour.recordAutoInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isAutoInsertedClosing(cursor, line, autoInsertedLineEnd[0])) + autoInsertedBrackets = 0; + autoInsertedRow = cursor.row; + autoInsertedLineEnd = bracket + line.substr(cursor.column); + autoInsertedBrackets++; + }; + + CstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isMaybeInsertedClosing(cursor, line)) + maybeInsertedBrackets = 0; + maybeInsertedRow = cursor.row; + maybeInsertedLineStart = line.substr(0, cursor.column) + bracket; + maybeInsertedLineEnd = line.substr(cursor.column); + maybeInsertedBrackets++; + }; + + CstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) { + return autoInsertedBrackets > 0 && + cursor.row === autoInsertedRow && + bracket === autoInsertedLineEnd[0] && + line.substr(cursor.column) === autoInsertedLineEnd; + }; + + CstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) { + return maybeInsertedBrackets > 0 && + cursor.row === maybeInsertedRow && + line.substr(cursor.column) === maybeInsertedLineEnd && + line.substr(0, cursor.column) == maybeInsertedLineStart; + }; + + CstyleBehaviour.popAutoInsertedClosing = function() { + autoInsertedLineEnd = autoInsertedLineEnd.substr(1); + autoInsertedBrackets--; + }; + + CstyleBehaviour.clearMaybeInsertedClosing = function() { + maybeInsertedBrackets = 0; + maybeInsertedRow = -1; + }; + + this.add("braces", "insertion", function (state, action, editor, session, text) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (text == '{') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "{" && editor.getWrapBehavioursEnabled()) { + return { + text: '{' + selected + '}', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + if (/[\]\}\)]/.test(line[cursor.column])) { + CstyleBehaviour.recordAutoInsert(editor, session, "}"); + return { + text: '{}', + selection: [1, 1] + }; + } else { + CstyleBehaviour.recordMaybeInsert(editor, session, "{"); + return { + text: '{', + selection: [1, 1] + }; + } + } + } else if (text == '}') { + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}') { + var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } else if (text == "\n" || text == "\r\n") { + var closing = ""; + if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) { + closing = lang.stringRepeat("}", maybeInsertedBrackets); + CstyleBehaviour.clearMaybeInsertedClosing(); + } + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}' || closing !== "") { + var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column}, '}'); + if (!openBracePos) + return null; + + var indent = this.getNextLineIndent(state, line.substring(0, cursor.column), session.getTabString()); + var next_indent = this.$getIndent(line); + + return { + text: '\n' + indent + '\n' + next_indent + closing, + selection: [1, indent.length, 1, indent.length] + }; + } + } + }); + + this.add("braces", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '{') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar == '}') { + range.end.column++; + return range; + } else { + maybeInsertedBrackets--; + } + } + }); + + this.add("parens", "insertion", function (state, action, editor, session, text) { + if (text == '(') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return { + text: '(' + selected + ')', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, ")"); + return { + text: '()', + selection: [1, 1] + }; + } + } else if (text == ')') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ')') { + var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("parens", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '(') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ')') { + range.end.column++; + return range; + } + } + }); + + this.add("brackets", "insertion", function (state, action, editor, session, text) { + if (text == '[') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return { + text: '[' + selected + ']', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, "]"); + return { + text: '[]', + selection: [1, 1] + }; + } + } else if (text == ']') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ']') { + var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("brackets", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '[') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ']') { + range.end.column++; + return range; + } + } + }); + + this.add("string_dquotes", "insertion", function (state, action, editor, session, text) { + if (text == '"' || text == "'") { + var quote = text; + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "'" && selected != '"' && editor.getWrapBehavioursEnabled()) { + return { + text: quote + selected + quote, + selection: false + }; + } else { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var leftChar = line.substring(cursor.column-1, cursor.column); + if (leftChar == '\\') { + return null; + } + var tokens = session.getTokens(selection.start.row); + var col = 0, token; + var quotepos = -1; // Track whether we're inside an open quote. + + for (var x = 0; x < tokens.length; x++) { + token = tokens[x]; + if (token.type == "string") { + quotepos = -1; + } else if (quotepos < 0) { + quotepos = token.value.indexOf(quote); + } + if ((token.value.length + col) > selection.start.column) { + break; + } + col += tokens[x].value.length; + } + if (!token || (quotepos < 0 && token.type !== "comment" && (token.type !== "string" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) { + if (!CstyleBehaviour.isSaneInsertion(editor, session)) + return; + return { + text: quote + quote, + selection: [1,1] + }; + } else if (token && token.type === "string") { + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == quote) { + return { + text: '', + selection: [1, 1] + }; + } + } + } + } + }); + + this.add("string_dquotes", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && (selected == '"' || selected == "'")) { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == selected) { + range.end.column++; + return range; + } + } + }); + +}; + +oop.inherits(CstyleBehaviour, Behaviour); + +exports.CstyleBehaviour = CstyleBehaviour; +}); + +ace.define('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var line = session.getLine(row); + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i + match[0].length, 1); + } + + if (foldStyle !== "markbeginend") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + +}).call(FoldMode.prototype); + +}); + + +ace.define('ace/mode/dart_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DartHighlightRules = function() { + + var constantLanguage = "true|false|null"; + var variableLanguage = "this|super"; + var keywordControl = "try|catch|finally|throw|break|case|continue|default|do|else|for|if|in|return|switch|while|new"; + var keywordDeclaration = "abstract|class|extends|external|factory|implements|get|native|operator|set|typedef"; + var storageModifier = "static|final|const"; + var storageType = "void|bool|num|int|double|Dynamic|var|String"; + + var keywordMapper = this.createKeywordMapper({ + "constant.language.dart": constantLanguage, + "variable.language.dart": variableLanguage, + "keyword.control.dart": keywordControl, + "keyword.declaration.dart": keywordDeclaration, + "storage.modifier.dart": storageModifier, + "storage.type.primitive.dart": storageType + }, "identifier"); + + var stringfill = { + token : "string", + regex : ".+" + }; + + this.$rules = + { + "start": [ + { + token : "comment", + regex : /\/\/.*$/ + }, + { + token : "comment", // multi line comment + regex : /\/\*/, + next : "comment" + }, + { + token: ["meta.preprocessor.script.dart"], + regex: "^(#!.*)$" + }, + { + token: "keyword.other.import.dart", + regex: "(?:\\b)(?:library|import|source|part|of)(?:\\b)" + }, + { + token : ["keyword.other.import.dart", "text"], + regex : "(?:\\b)(prefix)(\\s*:)" + }, + { + regex: "\\bas\\b", + token: "keyword.cast.dart" + }, + { + regex: "\\?|:", + token: "keyword.control.ternary.dart" + }, + { + regex: "(?:\\b)(is\\!?)(?:\\b)", + token: ["keyword.operator.dart"] + }, + { + regex: "(<<|>>>?|~|\\^|\\||&)", + token: ["keyword.operator.bitwise.dart"] + }, + { + regex: "((?:&|\\^|\\||<<|>>>?)=)", + token: ["keyword.operator.assignment.bitwise.dart"] + }, + { + regex: "(===?|!==?|<=?|>=?)", + token: ["keyword.operator.comparison.dart"] + }, + { + regex: "((?:[+*/%-]|\\~)=)", + token: ["keyword.operator.assignment.arithmetic.dart"] + }, + { + regex: "=", + token: "keyword.operator.assignment.dart" + }, + { + token : "string", + regex : "'''", + next : "qdoc" + }, + { + token : "string", + regex : '"""', + next : "qqdoc" + }, + { + token : "string", + regex : "'", + next : "qstring" + }, + { + token : "string", + regex : '"', + next : "qqstring" + }, + { + regex: "(\\-\\-|\\+\\+)", + token: ["keyword.operator.increment-decrement.dart"] + }, + { + regex: "(\\-|\\+|\\*|\\/|\\~\\/|%)", + token: ["keyword.operator.arithmetic.dart"] + }, + { + regex: "(!|&&|\\|\\|)", + token: ["keyword.operator.logical.dart"] + }, + { + token : "constant.numeric", // hex + regex : "0[xX][0-9a-fA-F]+\\b" + }, + { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, + { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + } + ], + "comment" : [ + { + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "start" + }, { + token : "comment", // comment spanning whole line + regex : ".+" + } + ], + "qdoc" : [ + { + token : "string", + regex : ".*?'''", + next : "start" + }, stringfill], + + "qqdoc" : [ + { + token : "string", + regex : '.*?"""', + next : "start" + }, stringfill], + + "qstring" : [ + { + token : "string", + regex : "[^\\\\']*(?:\\\\.[^\\\\']*)*'", + next : "start" + }, stringfill], + + "qqstring" : [ + { + token : "string", + regex : '[^\\\\"]*(?:\\\\.[^\\\\"]*)*"', + next : "start" + }, stringfill] +} + +}; + +oop.inherits(DartHighlightRules, TextHighlightRules); + +exports.DartHighlightRules = DartHighlightRules; +}); diff --git a/0.0.3_0/ace/mode-diff.js b/0.0.3_0/ace/mode-diff.js new file mode 100644 index 0000000..3754022 --- /dev/null +++ b/0.0.3_0/ace/mode-diff.js @@ -0,0 +1,166 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2010, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/mode/diff', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/diff_highlight_rules', 'ace/mode/folding/diff'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var HighlightRules = require("./diff_highlight_rules").DiffHighlightRules; +var FoldMode = require("./folding/diff").FoldMode; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new HighlightRules().getRules()); + this.foldingRules = new FoldMode(["diff", "index", "\\+{3}", "@@|\\*{5}"], "i"); +}; +oop.inherits(Mode, TextMode); + +(function() { + +}).call(Mode.prototype); + +exports.Mode = Mode; + +}); + +ace.define('ace/mode/diff_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DiffHighlightRules = function() { + + this.$rules = { + "start" : [{ + regex: "^(?:\\*{15}|={67}|-{3}|\\+{3})$", + token: "punctuation.definition.separator.diff", + "name": "keyword" + }, { //diff.range.unified + regex: "^(@@)(\\s*.+?\\s*)(@@)(.*)$", + token: [ + "constant", + "constant.numeric", + "constant", + "comment.doc.tag" + ] + }, { //diff.range.normal + regex: "^(\\d+)([,\\d]+)(a|d|c)(\\d+)([,\\d]+)(.*)$", + token: [ + "constant.numeric", + "punctuation.definition.range.diff", + "constant.function", + "constant.numeric", + "punctuation.definition.range.diff", + "invalid" + ], + "name": "meta." + }, { + regex: "^(\\-{3}|\\+{3}|\\*{3})( .+)$", + token: [ + "constant.numeric", + "meta.tag" + ] + }, { // added + regex: "^([!+>])(.*?)(\\s*)$", + token: [ + "support.constant", + "text", + "invalid" + ] + }, { // removed + regex: "^([<\\-])(.*?)(\\s*)$", + token: [ + "support.function", + "string", + "invalid" + ] + }, { + regex: "^(diff)(\\s+--\\w+)?(.+?)( .+)?$", + token: ["variable", "variable", "keyword", "variable"] + }, { + regex: "^Index.+$", + token: "variable" + }, { + regex: "\\s*$", + token: "invalid" + }, { + defaultToken: "invisible", + caseInsensitive: true + } + ] + }; +}; + +oop.inherits(DiffHighlightRules, TextHighlightRules); + +exports.DiffHighlightRules = DiffHighlightRules; +}); + +ace.define('ace/mode/folding/diff', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/folding/fold_mode', 'ace/range'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var BaseFoldMode = require("./fold_mode").FoldMode; +var Range = require("../../range").Range; + +var FoldMode = exports.FoldMode = function(levels, flag) { + this.regExpList = levels; + this.flag = flag; + this.foldingStartMarker = RegExp("^(" + levels.join("|") + ")", this.flag); +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + this.getFoldWidgetRange = function(session, foldStyle, row) { + var line = session.getLine(row); + var start = {row: row, column: line.length}; + + var regList = this.regExpList; + for (var i = 1; i <= regList.length; i++) { + var re = RegExp("^(" + regList.slice(0, i).join("|") + ")", this.flag); + if (re.test(line)) + break; + } + + for (var l = session.getLength(); ++row < l; ) { + line = session.getLine(row); + if (re.test(line)) + break; + } + if (row == start.row + 1) + return; + return Range.fromPoints(start, {row: row - 1, column: line.length}); + }; + +}).call(FoldMode.prototype); + +}); diff --git a/0.0.3_0/ace/mode-django.js b/0.0.3_0/ace/mode-django.js new file mode 100644 index 0000000..3904db3 --- /dev/null +++ b/0.0.3_0/ace/mode-django.js @@ -0,0 +1,1971 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2012, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/mode/django', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/html', 'ace/tokenizer', 'ace/mode/html_highlight_rules', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + +var oop = require("../lib/oop"); +var HtmlMode = require("./html").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DjangoHighlightRules = function(){ + this.$rules = { + 'start': [{ + token: "string", + regex: '".*?"' + }, { + token: "string", + regex: "'.*?'" + }, { + token: "constant", + regex: '[0-9]+' + }, { + token: "variable", + regex: "[-_a-zA-Z0-9:]+" + }], + 'comment': [{ + token : "comment.block", + merge: true, + regex : ".+?" + }], + 'tag': [{ + token: "entity.name.function", + regex: "[a-zA-Z][_a-zA-Z0-9]*", + next: "start" + }] + }; +}; + +oop.inherits(DjangoHighlightRules, TextHighlightRules) + +var DjangoHtmlHighlightRules = function() { + this.$rules = new HtmlHighlightRules().getRules(); + + for (var i in this.$rules) { + this.$rules[i].unshift({ + token: "comment.line", + regex: "\\{#.*?#\\}" + }, { + token: "comment.block", + regex: "\\{\\%\\s*comment\\s*\\%\\}", + merge: true, + next: "django-comment" + }, { + token: "constant.language", + regex: "\\{\\{", + next: "django-start" + }, { + token: "constant.language", + regex: "\\{\\%", + next: "django-tag" + }); + this.embedRules(DjangoHighlightRules, "django-", [{ + token: "comment.block", + regex: "\\{\\%\\s*endcomment\\s*\\%\\}", + merge: true, + next: "start" + }, { + token: "constant.language", + regex: "\\%\\}", + next: "start" + }, { + token: "constant.language", + regex: "\\}\\}", + next: "start" + }]); + } +}; + +oop.inherits(DjangoHtmlHighlightRules, HtmlHighlightRules); + +var Mode = function() { + var highlighter = new DjangoHtmlHighlightRules(); + this.$tokenizer = new Tokenizer(highlighter.getRules()); + this.$embeds = highlighter.getEmbeds(); +}; +oop.inherits(Mode, HtmlMode); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/html', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/mode/javascript', 'ace/mode/css', 'ace/tokenizer', 'ace/mode/html_highlight_rules', 'ace/mode/behaviour/html', 'ace/mode/folding/html'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var JavaScriptMode = require("./javascript").Mode; +var CssMode = require("./css").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules; +var HtmlBehaviour = require("./behaviour/html").HtmlBehaviour; +var HtmlFoldMode = require("./folding/html").FoldMode; + +var Mode = function() { + var highlighter = new HtmlHighlightRules(); + this.$tokenizer = new Tokenizer(highlighter.getRules()); + this.$behaviour = new HtmlBehaviour(); + + this.$embeds = highlighter.getEmbeds(); + this.createModeDelegates({ + "js-": JavaScriptMode, + "css-": CssMode + }); + + this.foldingRules = new HtmlFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.blockComment = {start: ""}; + + this.getNextLineIndent = function(state, line, tab) { + return this.$getIndent(line); + }; + + this.checkOutdent = function(state, line, input) { + return false; + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/javascript', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/javascript_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/range', 'ace/worker/worker_client', 'ace/mode/behaviour/cstyle', 'ace/mode/folding/cstyle'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var Range = require("../range").Range; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new JavaScriptHighlightRules().getRules()); + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.$tokenizer.getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start" || state == "no_regex") { + var match = line.match(/^.*(?:\bcase\b.*\:|[\{\(\[])\s*$/); + if (match) { + indent += tab; + } + } else if (state == "doc-start") { + if (endState == "start" || endState == "no_regex") { + return ""; + } + var match = line.match(/^\s*(\/?)\*/); + if (match) { + if (match[1]) { + indent += " "; + } + indent += "* "; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/javascript_worker", "JavaScriptWorker"); + worker.attachToDocument(session.getDocument()); + + worker.on("jslint", function(results) { + session.setAnnotations(results.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +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(require, exports, module) { + + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var JavaScriptHighlightRules = function() { + var keywordMapper = this.createKeywordMapper({ + "variable.language": + "Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|" + // Constructors + "Namespace|QName|XML|XMLList|" + // E4X + "ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|" + + "Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|" + + "Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|" + // Errors + "SyntaxError|TypeError|URIError|" + + "decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|" + // Non-constructor functions + "isNaN|parseFloat|parseInt|" + + "JSON|Math|" + // Other + "this|arguments|prototype|window|document" , // Pseudo + "keyword": + "const|yield|import|get|set|" + + "break|case|catch|continue|default|delete|do|else|finally|for|function|" + + "if|in|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"); + var kwBeforeRe = "case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void"; + var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*\\b"; + + var escapedRe = "\\\\(?:x[0-9a-fA-F]{2}|" + // hex + "u[0-9a-fA-F]{4}|" + // unicode + "[0-2][0-7]{0,2}|" + // oct + "3[0-6][0-7]?|" + // oct + "37[0-7]?|" + // oct + "[4-7][0-7]?|" + //oct + ".)"; + + this.$rules = { + "no_regex" : [ + { + token : "comment", + regex : /\/\/.*$/ + }, + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : /\/\*/, + next : "comment" + }, { + token : "string", + regex : "'(?=.)", + next : "qstring" + }, { + token : "string", + regex : '"(?=.)', + next : "qqstring" + }, { + token : "constant.numeric", // hex + regex : /0[xX][0-9a-fA-F]+\b/ + }, { + token : "constant.numeric", // float + regex : /[+-]?\d+(?:(?:\.\d*)?(?:[eE][+-]?\d+)?)?\b/ + }, { + token : [ + "storage.type", "punctuation.operator", "support.function", + "punctuation.operator", "entity.name.function", "text","keyword.operator" + ], + regex : "(" + identifierRe + ")(\\.)(prototype)(\\.)(" + identifierRe +")(\\s*)(=)", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "keyword.operator", "text", "storage.type", + "text", "paren.lparen" + ], + regex : "(" + identifierRe +")(\\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 : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(function)(\\s+)(" + identifierRe + ")(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "punctuation.operator", + "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\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 : "(?:" + kwBeforeRe + ")\\b", + next : "start" + }, { + token : ["punctuation.operator", "support.function"], + regex : /(\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:opzzzz|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 : ["punctuation.operator", "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)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/ + }, { + token : ["punctuation.operator", "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 : ["storage.type", "punctuation.operator", "support.function.firebug"], + regex : /(console)(\.)(warn|info|log|error|time|timeEnd|assert)\b/ + }, { + token : keywordMapper, + regex : identifierRe + }, { + token : "keyword.operator", + regex : /--|\+\+|[!$%&*+\-~]|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\|\||\?\:|\*=|%=|\+=|\-=|&=|\^=/, + next : "start" + }, { + token : "punctuation.operator", + regex : /\?|\:|\,|\;|\./, + next : "start" + }, { + token : "paren.lparen", + regex : /[\[({]/, + next : "start" + }, { + token : "paren.rparen", + regex : /[\])}]/ + }, { + token : "keyword.operator", + regex : /\/=?/, + next : "start" + }, { + token: "comment", + regex: /^#!.*$/ + } + ], + "start": [ + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment_regex_allowed" + }, { + token : "comment", + regex : "\\/\\/.*$", + next : "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: "/\\w*", + 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.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: identifierRe + }, { + token: "punctuation.operator", + regex: "[, ]+" + }, { + token: "punctuation.operator", + regex: "$" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "comment_regex_allowed" : [ + {token : "comment", regex : "\\*\\/", next : "start"}, + {defaultToken : "comment"} + ], + "comment" : [ + {token : "comment", regex : "\\*\\/", next : "no_regex"}, + {defaultToken : "comment"} + ], + "qqstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + next : "qqstring" + }, { + token : "string", + regex : '"|$', + next : "no_regex" + }, { + defaultToken: "string" + } + ], + "qstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + next : "qstring" + }, { + token : "string", + regex : "'|$", + next : "no_regex" + }, { + defaultToken: "string" + } + ] + }; + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("no_regex") ]); +}; + +oop.inherits(JavaScriptHighlightRules, TextHighlightRules); + +exports.JavaScriptHighlightRules = JavaScriptHighlightRules; +}); + +ace.define('ace/mode/doc_comment_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, { + token : "comment.doc.tag", + regex : "\\bTODO\\b" + }, { + defaultToken : "comment.doc" + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) { + + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define('ace/mode/behaviour/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/token_iterator', 'ace/lib/lang'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; +var lang = require("../../lib/lang"); + +var SAFE_INSERT_IN_TOKENS = + ["text", "paren.rparen", "punctuation.operator"]; +var SAFE_INSERT_BEFORE_TOKENS = + ["text", "paren.rparen", "punctuation.operator", "comment"]; + + +var autoInsertedBrackets = 0; +var autoInsertedRow = -1; +var autoInsertedLineEnd = ""; +var maybeInsertedBrackets = 0; +var maybeInsertedRow = -1; +var maybeInsertedLineStart = ""; +var maybeInsertedLineEnd = ""; + +var CstyleBehaviour = function () { + + CstyleBehaviour.isSaneInsertion = function(editor, session) { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + if (!this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) { + var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1); + if (!this.$matchTokenType(iterator2.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) + return false; + } + iterator.stepForward(); + return iterator.getCurrentTokenRow() !== cursor.row || + this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_BEFORE_TOKENS); + }; + + CstyleBehaviour.$matchTokenType = function(token, types) { + return types.indexOf(token.type || token) > -1; + }; + + CstyleBehaviour.recordAutoInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isAutoInsertedClosing(cursor, line, autoInsertedLineEnd[0])) + autoInsertedBrackets = 0; + autoInsertedRow = cursor.row; + autoInsertedLineEnd = bracket + line.substr(cursor.column); + autoInsertedBrackets++; + }; + + CstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isMaybeInsertedClosing(cursor, line)) + maybeInsertedBrackets = 0; + maybeInsertedRow = cursor.row; + maybeInsertedLineStart = line.substr(0, cursor.column) + bracket; + maybeInsertedLineEnd = line.substr(cursor.column); + maybeInsertedBrackets++; + }; + + CstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) { + return autoInsertedBrackets > 0 && + cursor.row === autoInsertedRow && + bracket === autoInsertedLineEnd[0] && + line.substr(cursor.column) === autoInsertedLineEnd; + }; + + CstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) { + return maybeInsertedBrackets > 0 && + cursor.row === maybeInsertedRow && + line.substr(cursor.column) === maybeInsertedLineEnd && + line.substr(0, cursor.column) == maybeInsertedLineStart; + }; + + CstyleBehaviour.popAutoInsertedClosing = function() { + autoInsertedLineEnd = autoInsertedLineEnd.substr(1); + autoInsertedBrackets--; + }; + + CstyleBehaviour.clearMaybeInsertedClosing = function() { + maybeInsertedBrackets = 0; + maybeInsertedRow = -1; + }; + + this.add("braces", "insertion", function (state, action, editor, session, text) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (text == '{') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "{" && editor.getWrapBehavioursEnabled()) { + return { + text: '{' + selected + '}', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + if (/[\]\}\)]/.test(line[cursor.column])) { + CstyleBehaviour.recordAutoInsert(editor, session, "}"); + return { + text: '{}', + selection: [1, 1] + }; + } else { + CstyleBehaviour.recordMaybeInsert(editor, session, "{"); + return { + text: '{', + selection: [1, 1] + }; + } + } + } else if (text == '}') { + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}') { + var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } else if (text == "\n" || text == "\r\n") { + var closing = ""; + if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) { + closing = lang.stringRepeat("}", maybeInsertedBrackets); + CstyleBehaviour.clearMaybeInsertedClosing(); + } + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}' || closing !== "") { + var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column}, '}'); + if (!openBracePos) + return null; + + var indent = this.getNextLineIndent(state, line.substring(0, cursor.column), session.getTabString()); + var next_indent = this.$getIndent(line); + + return { + text: '\n' + indent + '\n' + next_indent + closing, + selection: [1, indent.length, 1, indent.length] + }; + } + } + }); + + this.add("braces", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '{') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar == '}') { + range.end.column++; + return range; + } else { + maybeInsertedBrackets--; + } + } + }); + + this.add("parens", "insertion", function (state, action, editor, session, text) { + if (text == '(') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return { + text: '(' + selected + ')', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, ")"); + return { + text: '()', + selection: [1, 1] + }; + } + } else if (text == ')') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ')') { + var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("parens", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '(') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ')') { + range.end.column++; + return range; + } + } + }); + + this.add("brackets", "insertion", function (state, action, editor, session, text) { + if (text == '[') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return { + text: '[' + selected + ']', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, "]"); + return { + text: '[]', + selection: [1, 1] + }; + } + } else if (text == ']') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ']') { + var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("brackets", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '[') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ']') { + range.end.column++; + return range; + } + } + }); + + this.add("string_dquotes", "insertion", function (state, action, editor, session, text) { + if (text == '"' || text == "'") { + var quote = text; + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "'" && selected != '"' && editor.getWrapBehavioursEnabled()) { + return { + text: quote + selected + quote, + selection: false + }; + } else { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var leftChar = line.substring(cursor.column-1, cursor.column); + if (leftChar == '\\') { + return null; + } + var tokens = session.getTokens(selection.start.row); + var col = 0, token; + var quotepos = -1; // Track whether we're inside an open quote. + + for (var x = 0; x < tokens.length; x++) { + token = tokens[x]; + if (token.type == "string") { + quotepos = -1; + } else if (quotepos < 0) { + quotepos = token.value.indexOf(quote); + } + if ((token.value.length + col) > selection.start.column) { + break; + } + col += tokens[x].value.length; + } + if (!token || (quotepos < 0 && token.type !== "comment" && (token.type !== "string" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) { + if (!CstyleBehaviour.isSaneInsertion(editor, session)) + return; + return { + text: quote + quote, + selection: [1,1] + }; + } else if (token && token.type === "string") { + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == quote) { + return { + text: '', + selection: [1, 1] + }; + } + } + } + } + }); + + this.add("string_dquotes", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && (selected == '"' || selected == "'")) { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == selected) { + range.end.column++; + return range; + } + } + }); + +}; + +oop.inherits(CstyleBehaviour, Behaviour); + +exports.CstyleBehaviour = CstyleBehaviour; +}); + +ace.define('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var line = session.getLine(row); + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i + match[0].length, 1); + } + + if (foldStyle !== "markbeginend") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define('ace/mode/css', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/css_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/worker/worker_client', 'ace/mode/behaviour/css', 'ace/mode/folding/cstyle'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CssBehaviour = require("./behaviour/css").CssBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new CssHighlightRules().getRules()); + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CssBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.foldingRules = "cStyle"; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + var tokens = this.$tokenizer.getLineTokens(line, state).tokens; + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + var match = line.match(/^.*\{\s*$/); + if (match) { + indent += tab; + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/css_worker", "Worker"); + worker.attachToDocument(session.getDocument()); + + worker.on("csslint", function(e) { + session.setAnnotations(e.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; + +}); + +ace.define('ace/mode/css_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var supportType = exports.supportType = "animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|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|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|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|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index"; +var supportFunction = exports.supportFunction = "rgb|rgba|url|attr|counter|counters"; +var supportConstant = exports.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"; +var supportConstantColor = exports.supportConstantColor = "aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow"; +var supportConstantFonts = exports.supportConstantFonts = "arial|century|comic|courier|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace"; + +var numRe = exports.numRe = "\\-?(?:(?:[0-9]+)|(?:[0-9]*\\.[0-9]+))"; +var pseudoElements = exports.pseudoElements = "(\\:+)\\b(after|before|first-letter|first-line|moz-selection|selection)\\b"; +var pseudoClasses = exports.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"; + +var CssHighlightRules = function() { + + var keywordMapper = this.createKeywordMapper({ + "support.function": supportFunction, + "support.constant": supportConstant, + "support.type": supportType, + "support.constant.color": supportConstantColor, + "support.constant.fonts": supportConstantFonts + }, "text", true); + + var base_ruleset = [ + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "ruleset_comment" + }, { + token : "string", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' + }, { + token : "string", // single line + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" + }, { + token : ["constant.numeric", "keyword"], + regex : "(" + numRe + ")(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 : numRe + }, { + token : "constant.numeric", // hex6 color + regex : "#[a-f0-9]{6}" + }, { + token : "constant.numeric", // hex3 color + regex : "#[a-f0-9]{3}" + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"], + regex : pseudoElements + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"], + regex : pseudoClasses + }, { + token : ["support.function", "string", "support.function"], + regex : "(url\\()(.*)(\\))" + }, { + token : keywordMapper, + regex : "\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*" + }, { + caseInsensitive: true + } + ]; + + var ruleset = lang.copyArray(base_ruleset); + ruleset.unshift({ + token : "paren.rparen", + regex : "\\}", + next: "start" + }); + + var media_ruleset = lang.copyArray( base_ruleset ); + media_ruleset.unshift({ + token : "paren.rparen", + regex : "\\}", + next: "media" + }); + + var base_comment = [{ + token : "comment", // comment spanning whole line + regex : ".+" + }]; + + var comment = lang.copyArray(base_comment); + comment.unshift({ + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "start" + }); + + var media_comment = lang.copyArray(base_comment); + media_comment.unshift({ + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "media" + }); + + var ruleset_comment = lang.copyArray(base_comment); + ruleset_comment.unshift({ + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "ruleset" + }); + + this.$rules = { + "start" : [{ + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment" + }, { + token: "paren.lparen", + regex: "\\{", + next: "ruleset" + }, { + token: "string", + regex: "@.*?{", + next: "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: true + }], + + "media" : [ { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "media_comment" + }, { + token: "paren.lparen", + regex: "\\{", + next: "media_ruleset" + },{ + token: "string", + regex: "\\}", + next: "start" + },{ + 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: true + }], + + "comment" : comment, + + "ruleset" : ruleset, + "ruleset_comment" : ruleset_comment, + + "media_ruleset" : media_ruleset, + "media_comment" : media_comment + }; +}; + +oop.inherits(CssHighlightRules, TextHighlightRules); + +exports.CssHighlightRules = CssHighlightRules; + +}); + +ace.define('ace/mode/behaviour/css', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/mode/behaviour/cstyle', 'ace/token_iterator'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var CstyleBehaviour = require("./cstyle").CstyleBehaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; + +var CssBehaviour = function () { + + this.inherit(CstyleBehaviour); + + this.add("colon", "insertion", function (state, action, editor, session, text) { + if (text === ':') { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + if (token && token.value.match(/\s+/)) { + token = iterator.stepBackward(); + } + if (token && token.type === 'support.type') { + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar === ':') { + return { + text: '', + selection: [1, 1] + } + } + if (!line.substring(cursor.column).match(/^\s*;/)) { + return { + text: ':;', + selection: [1, 1] + } + } + } + } + }); + + this.add("colon", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected === ':') { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + if (token && token.value.match(/\s+/)) { + token = iterator.stepBackward(); + } + if (token && token.type === 'support.type') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar === ';') { + range.end.column ++; + return range; + } + } + } + }); + + this.add("semicolon", "insertion", function (state, action, editor, session, text) { + if (text === ';') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar === ';') { + return { + text: '', + selection: [1, 1] + } + } + } + }); + +} +oop.inherits(CssBehaviour, CstyleBehaviour); + +exports.CssBehaviour = CssBehaviour; +}); + +ace.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_util', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var xmlUtil = require("./xml_util"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var tagMap = lang.createMap({ + a : 'anchor', + button : 'form', + form : 'form', + img : 'image', + input : 'form', + label : 'form', + script : 'script', + select : 'form', + textarea : 'form', + style : 'style', + table : 'table', + tbody : 'table', + td : 'table', + tfoot : 'table', + th : 'table', + tr : 'table' +}); + +var HtmlHighlightRules = function() { + this.$rules = { + start : [{ + token : "text", + regex : "<\\!\\[CDATA\\[", + next : "cdata" + }, { + token : "xml-pe", + regex : "<\\?.*?\\?>" + }, { + token : "comment", + regex : "<\\!--", + next : "comment" + }, { + token : "xml-pe", + regex : "<\\!.*?>" + }, { + token : "meta.tag", + regex : "<(?=script\\b)", + next : "script" + }, { + token : "meta.tag", + regex : "<(?=style\\b)", + next : "style" + }, { + token : "meta.tag", // opening tag + regex : "<\\/?(?=\\S)", + next : "tag" + }, { + token : "text", + regex : "\\s+" + }, { + token : "constant.character.entity", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }], + + cdata : [ { + token : "text", + regex : "\\]\\]>", + next : "start" + } ], + + comment : [ { + token : "comment", + regex : ".*?-->", + next : "start" + }, { + defaultToken : "comment" + } ] + }; + + xmlUtil.tag(this.$rules, "tag", "start", tagMap); + xmlUtil.tag(this.$rules, "style", "css-start", tagMap); + xmlUtil.tag(this.$rules, "script", "js-start", tagMap); + + this.embedRules(JavaScriptHighlightRules, "js-", [{ + token: "comment", + regex: "\\/\\/.*(?=<\\/script>)", + next: "tag" + }, { + token: "meta.tag", + regex: "<\\/(?=script)", + next: "tag" + }]); + + this.embedRules(CssHighlightRules, "css-", [{ + token: "meta.tag", + regex: "<\\/(?=style)", + next: "tag" + }]); +}; + +oop.inherits(HtmlHighlightRules, TextHighlightRules); + +exports.HtmlHighlightRules = HtmlHighlightRules; +}); + +ace.define('ace/mode/xml_util', ['require', 'exports', 'module' ], function(require, exports, module) { + + +function string(state) { + return [{ + token : "string", + regex : '"', + next : state + "_qqstring" + }, { + token : "string", + regex : "'", + next : state + "_qstring" + }]; +} + +function multiLineString(quote, state) { + return [ + {token : "string", regex : quote, next : state}, + { + token : "constant.language.escape", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }, + {defaultToken : "string"} + ]; +} + +exports.tag = function(states, name, nextState, tagMap) { + states[name] = [{ + token : "text", + regex : "\\s+" + }, { + + token : !tagMap ? "meta.tag.tag-name" : function(value) { + if (tagMap[value]) + return "meta.tag.tag-name." + tagMap[value]; + else + return "meta.tag.tag-name"; + }, + regex : "[-_a-zA-Z0-9:]+", + next : name + "_embed_attribute_list" + }, { + token: "empty", + regex: "", + next : name + "_embed_attribute_list" + }]; + + states[name + "_qstring"] = multiLineString("'", name + "_embed_attribute_list"); + states[name + "_qqstring"] = multiLineString("\"", name + "_embed_attribute_list"); + + states[name + "_embed_attribute_list"] = [{ + token : "meta.tag.r", + regex : "/?>", + next : nextState + }, { + token : "keyword.operator", + regex : "=" + }, { + token : "entity.other.attribute-name", + regex : "[-_a-zA-Z0-9:]+" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : "text", + regex : "\\s+" + }].concat(string(name)); +}; + +}); + +ace.define('ace/mode/behaviour/html', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour/xml', 'ace/mode/behaviour/cstyle', 'ace/token_iterator'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var XmlBehaviour = require("../behaviour/xml").XmlBehaviour; +var CstyleBehaviour = require("./cstyle").CstyleBehaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; +var voidElements = ['area', 'base', 'br', 'col', 'command', 'embed', 'hr', 'img', 'input', 'keygen', 'link', 'meta', 'param', 'source', 'track', 'wbr']; + +function hasType(token, type) { + var hasType = true; + var typeList = token.type.split('.'); + var needleList = type.split('.'); + needleList.forEach(function(needle){ + if (typeList.indexOf(needle) == -1) { + hasType = false; + return false; + } + }); + return hasType; +} + +var HtmlBehaviour = function () { + + this.inherit(XmlBehaviour); // Get xml behaviour + + this.add("autoclosing", "insertion", function (state, action, editor, session, text) { + if (text == '>') { + var position = editor.getCursorPosition(); + var iterator = new TokenIterator(session, position.row, position.column); + var token = iterator.getCurrentToken(); + + if (hasType(token, 'string') && iterator.getCurrentTokenColumn() + token.value.length > position.column) + return; + var atCursor = false; + if (!token || !hasType(token, 'meta.tag') && !(hasType(token, 'text') && token.value.match('/'))){ + do { + token = iterator.stepBackward(); + } while (token && (hasType(token, 'string') || hasType(token, 'keyword.operator') || hasType(token, 'entity.attribute-name') || hasType(token, 'text'))); + } else { + atCursor = true; + } + if (!token || !hasType(token, 'meta.tag-name') || iterator.stepBackward().value.match('/')) { + return + } + var element = token.value; + if (atCursor){ + var element = element.substring(0, position.column - token.start); + } + if (voidElements.indexOf(element) !== -1){ + return; + } + return { + text: '>' + '', + selection: [1, 1] + } + } + }); +} +oop.inherits(HtmlBehaviour, XmlBehaviour); + +exports.HtmlBehaviour = HtmlBehaviour; +}); + +ace.define('ace/mode/behaviour/xml', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/mode/behaviour/cstyle', 'ace/token_iterator'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var CstyleBehaviour = require("./cstyle").CstyleBehaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; + +function hasType(token, type) { + var hasType = true; + var typeList = token.type.split('.'); + var needleList = type.split('.'); + needleList.forEach(function(needle){ + if (typeList.indexOf(needle) == -1) { + hasType = false; + return false; + } + }); + return hasType; +} + +var XmlBehaviour = function () { + + this.inherit(CstyleBehaviour, ["string_dquotes"]); // Get string behaviour + + this.add("autoclosing", "insertion", function (state, action, editor, session, text) { + if (text == '>') { + var position = editor.getCursorPosition(); + var iterator = new TokenIterator(session, position.row, position.column); + var token = iterator.getCurrentToken(); + var atCursor = false; + if (!token || !hasType(token, 'meta.tag') && !(hasType(token, 'text') && token.value.match('/'))){ + do { + token = iterator.stepBackward(); + } while (token && (hasType(token, 'string') || hasType(token, 'keyword.operator') || hasType(token, 'entity.attribute-name') || hasType(token, 'text'))); + } else { + atCursor = true; + } + if (!token || !hasType(token, 'meta.tag-name') || iterator.stepBackward().value.match('/')) { + return + } + var tag = token.value; + if (atCursor){ + var tag = tag.substring(0, position.column - token.start); + } + + return { + text: '>' + '', + selection: [1, 1] + } + } + }); + + this.add('autoindent', 'insertion', function (state, action, editor, session, text) { + if (text == "\n") { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChars = line.substring(cursor.column, cursor.column + 2); + if (rightChars == '?)/; + this._parseTag = function(tag) { + + var match = tag.match(this.tagRe); + var column = 0; + + return { + value: tag, + match: match ? match[2] : "", + closing: match ? !!match[3] : false, + selfClosing: match ? !!match[5] || match[2] == "/>" : false, + tagName: match ? match[4] : "", + column: match[1] ? column + match[1].length : column + }; + }; + this._readTagForward = function(iterator) { + var token = iterator.getCurrentToken(); + if (!token) + return null; + + var value = ""; + var start; + + do { + if (token.type.indexOf("meta.tag") === 0) { + if (!start) { + var start = { + row: iterator.getCurrentTokenRow(), + column: iterator.getCurrentTokenColumn() + }; + } + value += token.value; + if (value.indexOf(">") !== -1) { + var tag = this._parseTag(value); + tag.start = start; + tag.end = { + row: iterator.getCurrentTokenRow(), + column: iterator.getCurrentTokenColumn() + token.value.length + }; + iterator.stepForward(); + return tag; + } + } + } while(token = iterator.stepForward()); + + return null; + }; + + this._readTagBackward = function(iterator) { + var token = iterator.getCurrentToken(); + if (!token) + return null; + + var value = ""; + var end; + + do { + if (token.type.indexOf("meta.tag") === 0) { + if (!end) { + end = { + row: iterator.getCurrentTokenRow(), + column: iterator.getCurrentTokenColumn() + token.value.length + }; + } + value = token.value + value; + if (value.indexOf("<") !== -1) { + var tag = this._parseTag(value); + tag.end = end; + tag.start = { + row: iterator.getCurrentTokenRow(), + column: iterator.getCurrentTokenColumn() + }; + iterator.stepBackward(); + return tag; + } + } + } while(token = iterator.stepBackward()); + + return null; + }; + + this._pop = function(stack, tag) { + while (stack.length) { + + var top = stack[stack.length-1]; + if (!tag || top.tagName == tag.tagName) { + return stack.pop(); + } + else if (this.voidElements[tag.tagName]) { + return; + } + else if (this.voidElements[top.tagName]) { + stack.pop(); + continue; + } else { + return null; + } + } + }; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var firstTag = this._getFirstTagInLine(session, row); + + if (!firstTag.match) + return null; + + var isBackward = firstTag.closing || firstTag.selfClosing; + var stack = []; + var tag; + + if (!isBackward) { + var iterator = new TokenIterator(session, row, firstTag.column); + var start = { + row: row, + column: firstTag.column + firstTag.tagName.length + 2 + }; + while (tag = this._readTagForward(iterator)) { + if (tag.selfClosing) { + if (!stack.length) { + tag.start.column += tag.tagName.length + 2; + tag.end.column -= 2; + return Range.fromPoints(tag.start, tag.end); + } else + continue; + } + + if (tag.closing) { + this._pop(stack, tag); + if (stack.length == 0) + return Range.fromPoints(start, tag.start); + } + else { + stack.push(tag) + } + } + } + else { + var iterator = new TokenIterator(session, row, firstTag.column + firstTag.match.length); + var end = { + row: row, + column: firstTag.column + }; + + while (tag = this._readTagBackward(iterator)) { + if (tag.selfClosing) { + if (!stack.length) { + tag.start.column += tag.tagName.length + 2; + tag.end.column -= 2; + return Range.fromPoints(tag.start, tag.end); + } else + continue; + } + + if (!tag.closing) { + this._pop(stack, tag); + if (stack.length == 0) { + tag.start.column += tag.tagName.length + 2; + return Range.fromPoints(tag.start, end); + } + } + else { + stack.push(tag) + } + } + } + + }; + +}).call(FoldMode.prototype); + +}); diff --git a/0.0.3_0/ace/mode-dot.js b/0.0.3_0/ace/mode-dot.js new file mode 100644 index 0000000..f08a66f --- /dev/null +++ b/0.0.3_0/ace/mode-dot.js @@ -0,0 +1,320 @@ +ace.define('ace/mode/dot', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/matching_brace_outdent', 'ace/mode/dot_highlight_rules', 'ace/mode/folding/cstyle'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var DotHighlightRules = require("./dot_highlight_rules").DotHighlightRules; +var DotFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + var highlighter = new DotHighlightRules(); + this.$outdent = new MatchingBraceOutdent(); + this.foldingRules = new DotFoldMode(); + this.$tokenizer = new Tokenizer(highlighter.getRules()); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = ["//", "#"]; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.$tokenizer.getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start") { + var match = line.match(/^.*(?:\bcase\b.*\:|[\{\(\[])\s*$/); + if (match) { + indent += tab; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) { + + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); +ace.define('ace/mode/dot_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/text_highlight_rules', 'ace/mode/doc_comment_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; + +var DotHighlightRules = function() { + + var keywords = lang.arrayToMap( + ("strict|node|edge|graph|digraph|subgraph").split("|") + ); + + var attributes = lang.arrayToMap( + ("damping|k|url|area|arrowhead|arrowsize|arrowtail|aspect|bb|bgcolor|center|charset|clusterrank|color|colorscheme|comment|compound|concentrate|constraint|decorate|defaultdist|dim|dimen|dir|diredgeconstraints|distortion|dpi|edgeurl|edgehref|edgetarget|edgetooltip|epsilon|esep|fillcolor|fixedsize|fontcolor|fontname|fontnames|fontpath|fontsize|forcelabels|gradientangle|group|headurl|head_lp|headclip|headhref|headlabel|headport|headtarget|headtooltip|height|href|id|image|imagepath|imagescale|label|labelurl|label_scheme|labelangle|labeldistance|labelfloat|labelfontcolor|labelfontname|labelfontsize|labelhref|labeljust|labelloc|labeltarget|labeltooltip|landscape|layer|layerlistsep|layers|layerselect|layersep|layout|len|levels|levelsgap|lhead|lheight|lp|ltail|lwidth|margin|maxiter|mclimit|mindist|minlen|mode|model|mosek|nodesep|nojustify|normalize|nslimit|nslimit1|ordering|orientation|outputorder|overlap|overlap_scaling|pack|packmode|pad|page|pagedir|pencolor|penwidth|peripheries|pin|pos|quadtree|quantum|rank|rankdir|ranksep|ratio|rects|regular|remincross|repulsiveforce|resolution|root|rotate|rotation|samehead|sametail|samplepoints|scale|searchsize|sep|shape|shapefile|showboxes|sides|size|skew|smoothing|sortv|splines|start|style|stylesheet|tailurl|tail_lp|tailclip|tailhref|taillabel|tailport|tailtarget|tailtooltip|target|tooltip|truecolor|vertices|viewport|voro_margin|weight|width|xlabel|xlp|z").split("|") + ); + + this.$rules = { + "start" : [ + { + token : "comment", + regex : /\/\/.*$/ + }, { + token : "comment", + regex : /#.*$/ + }, { + token : "comment", // multi line comment + merge : true, + regex : /\/\*/, + next : "comment" + }, { + token : "string", + regex : "'(?=.)", + next : "qstring" + }, { + token : "string", + regex : '"(?=.)', + next : "qqstring" + }, { + token : "constant.numeric", + regex : /[+\-]?\d+(?:(?:\.\d*)?(?:[eE][+\-]?\d+)?)?\b/ + }, { + token : "keyword.operator", + regex : /\+|=|\->/ + }, { + token : "punctuation.operator", + regex : /,|;/ + }, { + token : "paren.lparen", + regex : /[\[{]/ + }, { + token : "paren.rparen", + regex : /[\]}]/ + }, { + token: "comment", + regex: /^#!.*$/ + }, { + token: function(value) { + if (keywords.hasOwnProperty(value.toLowerCase())) { + return "keyword"; + } + else if (attributes.hasOwnProperty(value.toLowerCase())) { + return "variable"; + } + else { + return "text"; + } + }, + regex: "\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*" + } + ], + "comment" : [ + { + token : "comment", // closing comment + regex : ".*?\\*\\/", + merge : true, + next : "start" + }, { + token : "comment", // comment spanning whole line + merge : true, + regex : ".+" + } + ], + "qqstring" : [ + { + token : "string", + regex : '[^"\\\\]+', + merge : true + }, { + token : "string", + regex : "\\\\$", + next : "qqstring", + merge : true + }, { + token : "string", + regex : '"|$', + next : "start", + merge : true + } + ], + "qstring" : [ + { + token : "string", + regex : "[^'\\\\]+", + merge : true + }, { + token : "string", + regex : "\\\\$", + next : "qstring", + merge : true + }, { + token : "string", + regex : "'|$", + next : "start", + merge : true + } + ] + }; +}; + +oop.inherits(DotHighlightRules, TextHighlightRules); + +exports.DotHighlightRules = DotHighlightRules; + +}); + +ace.define('ace/mode/doc_comment_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, { + token : "comment.doc.tag", + regex : "\\bTODO\\b" + }, { + defaultToken : "comment.doc" + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var line = session.getLine(row); + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i + match[0].length, 1); + } + + if (foldStyle !== "markbeginend") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + +}).call(FoldMode.prototype); + +}); diff --git a/0.0.3_0/ace/mode-ejs.js b/0.0.3_0/ace/mode-ejs.js new file mode 100644 index 0000000..a14713e --- /dev/null +++ b/0.0.3_0/ace/mode-ejs.js @@ -0,0 +1,2327 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2012, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ***** END LICENSE BLOCK ***** */ + + +ace.define('ace/mode/ejs', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/html_highlight_rules', 'ace/mode/javascript_highlight_rules', 'ace/tokenizer', 'ace/mode/html', 'ace/mode/javascript', 'ace/mode/css', 'ace/mode/ruby'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; + +var EjsHighlightRules = function(start, end) { + HtmlHighlightRules.call(this); + + if (!start) + start = "(?:<%|<\\?|{{)"; + if (!end) + end = "(?:%>|\\?>|}})"; + + for (var i in this.$rules) { + this.$rules[i].unshift({ + token : "markup.list.meta.tag", + regex : start + "(?![>}])[-=]?", + push : "ejs-start" + }); + } + + this.embedRules(JavaScriptHighlightRules, "ejs-"); + + this.$rules["ejs-start"].unshift({ + token : "markup.list.meta.tag", + regex : "-?" + end, + next : "pop" + }, { + token: "comment", + regex: "//.*?" + end, + next: "pop" + }); + + this.$rules["ejs-no_regex"].unshift({ + token : "markup.list.meta.tag", + regex : "-?" + end, + next : "pop" + }, { + token: "comment", + regex: "//.*?" + end, + next: "pop" + }); + + this.normalizeRules(); +}; + + +oop.inherits(EjsHighlightRules, HtmlHighlightRules); + +exports.EjsHighlightRules = EjsHighlightRules; + + +var oop = require("../lib/oop"); +var Tokenizer = require("../tokenizer").Tokenizer; +var HtmlMode = require("./html").Mode; +var JavaScriptMode = require("./javascript").Mode; +var CssMode = require("./css").Mode; +var RubyMode = require("./ruby").Mode; + +var Mode = function() { + HtmlMode.call(this); + var highlighter = new EjsHighlightRules(); + this.$tokenizer = new Tokenizer(highlighter.getRules()); + this.$embeds = highlighter.getEmbeds(); + this.createModeDelegates({ + "js-": JavaScriptMode, + "css-": CssMode, + "ejs-": JavaScriptMode + }); +}; +oop.inherits(Mode, HtmlMode); + +(function() { + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.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_util', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var xmlUtil = require("./xml_util"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var tagMap = lang.createMap({ + a : 'anchor', + button : 'form', + form : 'form', + img : 'image', + input : 'form', + label : 'form', + script : 'script', + select : 'form', + textarea : 'form', + style : 'style', + table : 'table', + tbody : 'table', + td : 'table', + tfoot : 'table', + th : 'table', + tr : 'table' +}); + +var HtmlHighlightRules = function() { + this.$rules = { + start : [{ + token : "text", + regex : "<\\!\\[CDATA\\[", + next : "cdata" + }, { + token : "xml-pe", + regex : "<\\?.*?\\?>" + }, { + token : "comment", + regex : "<\\!--", + next : "comment" + }, { + token : "xml-pe", + regex : "<\\!.*?>" + }, { + token : "meta.tag", + regex : "<(?=script\\b)", + next : "script" + }, { + token : "meta.tag", + regex : "<(?=style\\b)", + next : "style" + }, { + token : "meta.tag", // opening tag + regex : "<\\/?(?=\\S)", + next : "tag" + }, { + token : "text", + regex : "\\s+" + }, { + token : "constant.character.entity", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }], + + cdata : [ { + token : "text", + regex : "\\]\\]>", + next : "start" + } ], + + comment : [ { + token : "comment", + regex : ".*?-->", + next : "start" + }, { + defaultToken : "comment" + } ] + }; + + xmlUtil.tag(this.$rules, "tag", "start", tagMap); + xmlUtil.tag(this.$rules, "style", "css-start", tagMap); + xmlUtil.tag(this.$rules, "script", "js-start", tagMap); + + this.embedRules(JavaScriptHighlightRules, "js-", [{ + token: "comment", + regex: "\\/\\/.*(?=<\\/script>)", + next: "tag" + }, { + token: "meta.tag", + regex: "<\\/(?=script)", + next: "tag" + }]); + + this.embedRules(CssHighlightRules, "css-", [{ + token: "meta.tag", + regex: "<\\/(?=style)", + next: "tag" + }]); +}; + +oop.inherits(HtmlHighlightRules, TextHighlightRules); + +exports.HtmlHighlightRules = HtmlHighlightRules; +}); + +ace.define('ace/mode/css_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var supportType = exports.supportType = "animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|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|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|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|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index"; +var supportFunction = exports.supportFunction = "rgb|rgba|url|attr|counter|counters"; +var supportConstant = exports.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"; +var supportConstantColor = exports.supportConstantColor = "aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow"; +var supportConstantFonts = exports.supportConstantFonts = "arial|century|comic|courier|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace"; + +var numRe = exports.numRe = "\\-?(?:(?:[0-9]+)|(?:[0-9]*\\.[0-9]+))"; +var pseudoElements = exports.pseudoElements = "(\\:+)\\b(after|before|first-letter|first-line|moz-selection|selection)\\b"; +var pseudoClasses = exports.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"; + +var CssHighlightRules = function() { + + var keywordMapper = this.createKeywordMapper({ + "support.function": supportFunction, + "support.constant": supportConstant, + "support.type": supportType, + "support.constant.color": supportConstantColor, + "support.constant.fonts": supportConstantFonts + }, "text", true); + + var base_ruleset = [ + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "ruleset_comment" + }, { + token : "string", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' + }, { + token : "string", // single line + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" + }, { + token : ["constant.numeric", "keyword"], + regex : "(" + numRe + ")(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 : numRe + }, { + token : "constant.numeric", // hex6 color + regex : "#[a-f0-9]{6}" + }, { + token : "constant.numeric", // hex3 color + regex : "#[a-f0-9]{3}" + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"], + regex : pseudoElements + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"], + regex : pseudoClasses + }, { + token : ["support.function", "string", "support.function"], + regex : "(url\\()(.*)(\\))" + }, { + token : keywordMapper, + regex : "\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*" + }, { + caseInsensitive: true + } + ]; + + var ruleset = lang.copyArray(base_ruleset); + ruleset.unshift({ + token : "paren.rparen", + regex : "\\}", + next: "start" + }); + + var media_ruleset = lang.copyArray( base_ruleset ); + media_ruleset.unshift({ + token : "paren.rparen", + regex : "\\}", + next: "media" + }); + + var base_comment = [{ + token : "comment", // comment spanning whole line + regex : ".+" + }]; + + var comment = lang.copyArray(base_comment); + comment.unshift({ + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "start" + }); + + var media_comment = lang.copyArray(base_comment); + media_comment.unshift({ + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "media" + }); + + var ruleset_comment = lang.copyArray(base_comment); + ruleset_comment.unshift({ + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "ruleset" + }); + + this.$rules = { + "start" : [{ + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment" + }, { + token: "paren.lparen", + regex: "\\{", + next: "ruleset" + }, { + token: "string", + regex: "@.*?{", + next: "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: true + }], + + "media" : [ { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "media_comment" + }, { + token: "paren.lparen", + regex: "\\{", + next: "media_ruleset" + },{ + token: "string", + regex: "\\}", + next: "start" + },{ + 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: true + }], + + "comment" : comment, + + "ruleset" : ruleset, + "ruleset_comment" : ruleset_comment, + + "media_ruleset" : media_ruleset, + "media_comment" : media_comment + }; +}; + +oop.inherits(CssHighlightRules, TextHighlightRules); + +exports.CssHighlightRules = CssHighlightRules; + +}); + +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(require, exports, module) { + + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var JavaScriptHighlightRules = function() { + var keywordMapper = this.createKeywordMapper({ + "variable.language": + "Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|" + // Constructors + "Namespace|QName|XML|XMLList|" + // E4X + "ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|" + + "Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|" + + "Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|" + // Errors + "SyntaxError|TypeError|URIError|" + + "decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|" + // Non-constructor functions + "isNaN|parseFloat|parseInt|" + + "JSON|Math|" + // Other + "this|arguments|prototype|window|document" , // Pseudo + "keyword": + "const|yield|import|get|set|" + + "break|case|catch|continue|default|delete|do|else|finally|for|function|" + + "if|in|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"); + var kwBeforeRe = "case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void"; + var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*\\b"; + + var escapedRe = "\\\\(?:x[0-9a-fA-F]{2}|" + // hex + "u[0-9a-fA-F]{4}|" + // unicode + "[0-2][0-7]{0,2}|" + // oct + "3[0-6][0-7]?|" + // oct + "37[0-7]?|" + // oct + "[4-7][0-7]?|" + //oct + ".)"; + + this.$rules = { + "no_regex" : [ + { + token : "comment", + regex : /\/\/.*$/ + }, + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : /\/\*/, + next : "comment" + }, { + token : "string", + regex : "'(?=.)", + next : "qstring" + }, { + token : "string", + regex : '"(?=.)', + next : "qqstring" + }, { + token : "constant.numeric", // hex + regex : /0[xX][0-9a-fA-F]+\b/ + }, { + token : "constant.numeric", // float + regex : /[+-]?\d+(?:(?:\.\d*)?(?:[eE][+-]?\d+)?)?\b/ + }, { + token : [ + "storage.type", "punctuation.operator", "support.function", + "punctuation.operator", "entity.name.function", "text","keyword.operator" + ], + regex : "(" + identifierRe + ")(\\.)(prototype)(\\.)(" + identifierRe +")(\\s*)(=)", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "keyword.operator", "text", "storage.type", + "text", "paren.lparen" + ], + regex : "(" + identifierRe +")(\\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 : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(function)(\\s+)(" + identifierRe + ")(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "punctuation.operator", + "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\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 : "(?:" + kwBeforeRe + ")\\b", + next : "start" + }, { + token : ["punctuation.operator", "support.function"], + regex : /(\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:opzzzz|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 : ["punctuation.operator", "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)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/ + }, { + token : ["punctuation.operator", "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 : ["storage.type", "punctuation.operator", "support.function.firebug"], + regex : /(console)(\.)(warn|info|log|error|time|timeEnd|assert)\b/ + }, { + token : keywordMapper, + regex : identifierRe + }, { + token : "keyword.operator", + regex : /--|\+\+|[!$%&*+\-~]|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\|\||\?\:|\*=|%=|\+=|\-=|&=|\^=/, + next : "start" + }, { + token : "punctuation.operator", + regex : /\?|\:|\,|\;|\./, + next : "start" + }, { + token : "paren.lparen", + regex : /[\[({]/, + next : "start" + }, { + token : "paren.rparen", + regex : /[\])}]/ + }, { + token : "keyword.operator", + regex : /\/=?/, + next : "start" + }, { + token: "comment", + regex: /^#!.*$/ + } + ], + "start": [ + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment_regex_allowed" + }, { + token : "comment", + regex : "\\/\\/.*$", + next : "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: "/\\w*", + 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.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: identifierRe + }, { + token: "punctuation.operator", + regex: "[, ]+" + }, { + token: "punctuation.operator", + regex: "$" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "comment_regex_allowed" : [ + {token : "comment", regex : "\\*\\/", next : "start"}, + {defaultToken : "comment"} + ], + "comment" : [ + {token : "comment", regex : "\\*\\/", next : "no_regex"}, + {defaultToken : "comment"} + ], + "qqstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + next : "qqstring" + }, { + token : "string", + regex : '"|$', + next : "no_regex" + }, { + defaultToken: "string" + } + ], + "qstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + next : "qstring" + }, { + token : "string", + regex : "'|$", + next : "no_regex" + }, { + defaultToken: "string" + } + ] + }; + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("no_regex") ]); +}; + +oop.inherits(JavaScriptHighlightRules, TextHighlightRules); + +exports.JavaScriptHighlightRules = JavaScriptHighlightRules; +}); + +ace.define('ace/mode/doc_comment_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, { + token : "comment.doc.tag", + regex : "\\bTODO\\b" + }, { + defaultToken : "comment.doc" + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define('ace/mode/xml_util', ['require', 'exports', 'module' ], function(require, exports, module) { + + +function string(state) { + return [{ + token : "string", + regex : '"', + next : state + "_qqstring" + }, { + token : "string", + regex : "'", + next : state + "_qstring" + }]; +} + +function multiLineString(quote, state) { + return [ + {token : "string", regex : quote, next : state}, + { + token : "constant.language.escape", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }, + {defaultToken : "string"} + ]; +} + +exports.tag = function(states, name, nextState, tagMap) { + states[name] = [{ + token : "text", + regex : "\\s+" + }, { + + token : !tagMap ? "meta.tag.tag-name" : function(value) { + if (tagMap[value]) + return "meta.tag.tag-name." + tagMap[value]; + else + return "meta.tag.tag-name"; + }, + regex : "[-_a-zA-Z0-9:]+", + next : name + "_embed_attribute_list" + }, { + token: "empty", + regex: "", + next : name + "_embed_attribute_list" + }]; + + states[name + "_qstring"] = multiLineString("'", name + "_embed_attribute_list"); + states[name + "_qqstring"] = multiLineString("\"", name + "_embed_attribute_list"); + + states[name + "_embed_attribute_list"] = [{ + token : "meta.tag.r", + regex : "/?>", + next : nextState + }, { + token : "keyword.operator", + regex : "=" + }, { + token : "entity.other.attribute-name", + regex : "[-_a-zA-Z0-9:]+" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : "text", + regex : "\\s+" + }].concat(string(name)); +}; + +}); + +ace.define('ace/mode/html', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/mode/javascript', 'ace/mode/css', 'ace/tokenizer', 'ace/mode/html_highlight_rules', 'ace/mode/behaviour/html', 'ace/mode/folding/html'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var JavaScriptMode = require("./javascript").Mode; +var CssMode = require("./css").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules; +var HtmlBehaviour = require("./behaviour/html").HtmlBehaviour; +var HtmlFoldMode = require("./folding/html").FoldMode; + +var Mode = function() { + var highlighter = new HtmlHighlightRules(); + this.$tokenizer = new Tokenizer(highlighter.getRules()); + this.$behaviour = new HtmlBehaviour(); + + this.$embeds = highlighter.getEmbeds(); + this.createModeDelegates({ + "js-": JavaScriptMode, + "css-": CssMode + }); + + this.foldingRules = new HtmlFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.blockComment = {start: ""}; + + this.getNextLineIndent = function(state, line, tab) { + return this.$getIndent(line); + }; + + this.checkOutdent = function(state, line, input) { + return false; + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/javascript', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/javascript_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/range', 'ace/worker/worker_client', 'ace/mode/behaviour/cstyle', 'ace/mode/folding/cstyle'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var Range = require("../range").Range; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new JavaScriptHighlightRules().getRules()); + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.$tokenizer.getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start" || state == "no_regex") { + var match = line.match(/^.*(?:\bcase\b.*\:|[\{\(\[])\s*$/); + if (match) { + indent += tab; + } + } else if (state == "doc-start") { + if (endState == "start" || endState == "no_regex") { + return ""; + } + var match = line.match(/^\s*(\/?)\*/); + if (match) { + if (match[1]) { + indent += " "; + } + indent += "* "; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/javascript_worker", "JavaScriptWorker"); + worker.attachToDocument(session.getDocument()); + + worker.on("jslint", function(results) { + session.setAnnotations(results.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) { + + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define('ace/mode/behaviour/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/token_iterator', 'ace/lib/lang'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; +var lang = require("../../lib/lang"); + +var SAFE_INSERT_IN_TOKENS = + ["text", "paren.rparen", "punctuation.operator"]; +var SAFE_INSERT_BEFORE_TOKENS = + ["text", "paren.rparen", "punctuation.operator", "comment"]; + + +var autoInsertedBrackets = 0; +var autoInsertedRow = -1; +var autoInsertedLineEnd = ""; +var maybeInsertedBrackets = 0; +var maybeInsertedRow = -1; +var maybeInsertedLineStart = ""; +var maybeInsertedLineEnd = ""; + +var CstyleBehaviour = function () { + + CstyleBehaviour.isSaneInsertion = function(editor, session) { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + if (!this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) { + var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1); + if (!this.$matchTokenType(iterator2.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) + return false; + } + iterator.stepForward(); + return iterator.getCurrentTokenRow() !== cursor.row || + this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_BEFORE_TOKENS); + }; + + CstyleBehaviour.$matchTokenType = function(token, types) { + return types.indexOf(token.type || token) > -1; + }; + + CstyleBehaviour.recordAutoInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isAutoInsertedClosing(cursor, line, autoInsertedLineEnd[0])) + autoInsertedBrackets = 0; + autoInsertedRow = cursor.row; + autoInsertedLineEnd = bracket + line.substr(cursor.column); + autoInsertedBrackets++; + }; + + CstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isMaybeInsertedClosing(cursor, line)) + maybeInsertedBrackets = 0; + maybeInsertedRow = cursor.row; + maybeInsertedLineStart = line.substr(0, cursor.column) + bracket; + maybeInsertedLineEnd = line.substr(cursor.column); + maybeInsertedBrackets++; + }; + + CstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) { + return autoInsertedBrackets > 0 && + cursor.row === autoInsertedRow && + bracket === autoInsertedLineEnd[0] && + line.substr(cursor.column) === autoInsertedLineEnd; + }; + + CstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) { + return maybeInsertedBrackets > 0 && + cursor.row === maybeInsertedRow && + line.substr(cursor.column) === maybeInsertedLineEnd && + line.substr(0, cursor.column) == maybeInsertedLineStart; + }; + + CstyleBehaviour.popAutoInsertedClosing = function() { + autoInsertedLineEnd = autoInsertedLineEnd.substr(1); + autoInsertedBrackets--; + }; + + CstyleBehaviour.clearMaybeInsertedClosing = function() { + maybeInsertedBrackets = 0; + maybeInsertedRow = -1; + }; + + this.add("braces", "insertion", function (state, action, editor, session, text) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (text == '{') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "{" && editor.getWrapBehavioursEnabled()) { + return { + text: '{' + selected + '}', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + if (/[\]\}\)]/.test(line[cursor.column])) { + CstyleBehaviour.recordAutoInsert(editor, session, "}"); + return { + text: '{}', + selection: [1, 1] + }; + } else { + CstyleBehaviour.recordMaybeInsert(editor, session, "{"); + return { + text: '{', + selection: [1, 1] + }; + } + } + } else if (text == '}') { + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}') { + var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } else if (text == "\n" || text == "\r\n") { + var closing = ""; + if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) { + closing = lang.stringRepeat("}", maybeInsertedBrackets); + CstyleBehaviour.clearMaybeInsertedClosing(); + } + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}' || closing !== "") { + var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column}, '}'); + if (!openBracePos) + return null; + + var indent = this.getNextLineIndent(state, line.substring(0, cursor.column), session.getTabString()); + var next_indent = this.$getIndent(line); + + return { + text: '\n' + indent + '\n' + next_indent + closing, + selection: [1, indent.length, 1, indent.length] + }; + } + } + }); + + this.add("braces", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '{') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar == '}') { + range.end.column++; + return range; + } else { + maybeInsertedBrackets--; + } + } + }); + + this.add("parens", "insertion", function (state, action, editor, session, text) { + if (text == '(') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return { + text: '(' + selected + ')', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, ")"); + return { + text: '()', + selection: [1, 1] + }; + } + } else if (text == ')') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ')') { + var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("parens", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '(') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ')') { + range.end.column++; + return range; + } + } + }); + + this.add("brackets", "insertion", function (state, action, editor, session, text) { + if (text == '[') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return { + text: '[' + selected + ']', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, "]"); + return { + text: '[]', + selection: [1, 1] + }; + } + } else if (text == ']') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ']') { + var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("brackets", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '[') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ']') { + range.end.column++; + return range; + } + } + }); + + this.add("string_dquotes", "insertion", function (state, action, editor, session, text) { + if (text == '"' || text == "'") { + var quote = text; + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "'" && selected != '"' && editor.getWrapBehavioursEnabled()) { + return { + text: quote + selected + quote, + selection: false + }; + } else { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var leftChar = line.substring(cursor.column-1, cursor.column); + if (leftChar == '\\') { + return null; + } + var tokens = session.getTokens(selection.start.row); + var col = 0, token; + var quotepos = -1; // Track whether we're inside an open quote. + + for (var x = 0; x < tokens.length; x++) { + token = tokens[x]; + if (token.type == "string") { + quotepos = -1; + } else if (quotepos < 0) { + quotepos = token.value.indexOf(quote); + } + if ((token.value.length + col) > selection.start.column) { + break; + } + col += tokens[x].value.length; + } + if (!token || (quotepos < 0 && token.type !== "comment" && (token.type !== "string" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) { + if (!CstyleBehaviour.isSaneInsertion(editor, session)) + return; + return { + text: quote + quote, + selection: [1,1] + }; + } else if (token && token.type === "string") { + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == quote) { + return { + text: '', + selection: [1, 1] + }; + } + } + } + } + }); + + this.add("string_dquotes", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && (selected == '"' || selected == "'")) { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == selected) { + range.end.column++; + return range; + } + } + }); + +}; + +oop.inherits(CstyleBehaviour, Behaviour); + +exports.CstyleBehaviour = CstyleBehaviour; +}); + +ace.define('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var line = session.getLine(row); + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i + match[0].length, 1); + } + + if (foldStyle !== "markbeginend") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define('ace/mode/css', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/css_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/worker/worker_client', 'ace/mode/behaviour/css', 'ace/mode/folding/cstyle'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CssBehaviour = require("./behaviour/css").CssBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new CssHighlightRules().getRules()); + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CssBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.foldingRules = "cStyle"; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + var tokens = this.$tokenizer.getLineTokens(line, state).tokens; + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + var match = line.match(/^.*\{\s*$/); + if (match) { + indent += tab; + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/css_worker", "Worker"); + worker.attachToDocument(session.getDocument()); + + worker.on("csslint", function(e) { + session.setAnnotations(e.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; + +}); + +ace.define('ace/mode/behaviour/css', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/mode/behaviour/cstyle', 'ace/token_iterator'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var CstyleBehaviour = require("./cstyle").CstyleBehaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; + +var CssBehaviour = function () { + + this.inherit(CstyleBehaviour); + + this.add("colon", "insertion", function (state, action, editor, session, text) { + if (text === ':') { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + if (token && token.value.match(/\s+/)) { + token = iterator.stepBackward(); + } + if (token && token.type === 'support.type') { + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar === ':') { + return { + text: '', + selection: [1, 1] + } + } + if (!line.substring(cursor.column).match(/^\s*;/)) { + return { + text: ':;', + selection: [1, 1] + } + } + } + } + }); + + this.add("colon", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected === ':') { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + if (token && token.value.match(/\s+/)) { + token = iterator.stepBackward(); + } + if (token && token.type === 'support.type') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar === ';') { + range.end.column ++; + return range; + } + } + } + }); + + this.add("semicolon", "insertion", function (state, action, editor, session, text) { + if (text === ';') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar === ';') { + return { + text: '', + selection: [1, 1] + } + } + } + }); + +} +oop.inherits(CssBehaviour, CstyleBehaviour); + +exports.CssBehaviour = CssBehaviour; +}); + +ace.define('ace/mode/behaviour/html', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour/xml', 'ace/mode/behaviour/cstyle', 'ace/token_iterator'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var XmlBehaviour = require("../behaviour/xml").XmlBehaviour; +var CstyleBehaviour = require("./cstyle").CstyleBehaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; +var voidElements = ['area', 'base', 'br', 'col', 'command', 'embed', 'hr', 'img', 'input', 'keygen', 'link', 'meta', 'param', 'source', 'track', 'wbr']; + +function hasType(token, type) { + var hasType = true; + var typeList = token.type.split('.'); + var needleList = type.split('.'); + needleList.forEach(function(needle){ + if (typeList.indexOf(needle) == -1) { + hasType = false; + return false; + } + }); + return hasType; +} + +var HtmlBehaviour = function () { + + this.inherit(XmlBehaviour); // Get xml behaviour + + this.add("autoclosing", "insertion", function (state, action, editor, session, text) { + if (text == '>') { + var position = editor.getCursorPosition(); + var iterator = new TokenIterator(session, position.row, position.column); + var token = iterator.getCurrentToken(); + + if (hasType(token, 'string') && iterator.getCurrentTokenColumn() + token.value.length > position.column) + return; + var atCursor = false; + if (!token || !hasType(token, 'meta.tag') && !(hasType(token, 'text') && token.value.match('/'))){ + do { + token = iterator.stepBackward(); + } while (token && (hasType(token, 'string') || hasType(token, 'keyword.operator') || hasType(token, 'entity.attribute-name') || hasType(token, 'text'))); + } else { + atCursor = true; + } + if (!token || !hasType(token, 'meta.tag-name') || iterator.stepBackward().value.match('/')) { + return + } + var element = token.value; + if (atCursor){ + var element = element.substring(0, position.column - token.start); + } + if (voidElements.indexOf(element) !== -1){ + return; + } + return { + text: '>' + '', + selection: [1, 1] + } + } + }); +} +oop.inherits(HtmlBehaviour, XmlBehaviour); + +exports.HtmlBehaviour = HtmlBehaviour; +}); + +ace.define('ace/mode/behaviour/xml', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/mode/behaviour/cstyle', 'ace/token_iterator'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var CstyleBehaviour = require("./cstyle").CstyleBehaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; + +function hasType(token, type) { + var hasType = true; + var typeList = token.type.split('.'); + var needleList = type.split('.'); + needleList.forEach(function(needle){ + if (typeList.indexOf(needle) == -1) { + hasType = false; + return false; + } + }); + return hasType; +} + +var XmlBehaviour = function () { + + this.inherit(CstyleBehaviour, ["string_dquotes"]); // Get string behaviour + + this.add("autoclosing", "insertion", function (state, action, editor, session, text) { + if (text == '>') { + var position = editor.getCursorPosition(); + var iterator = new TokenIterator(session, position.row, position.column); + var token = iterator.getCurrentToken(); + var atCursor = false; + if (!token || !hasType(token, 'meta.tag') && !(hasType(token, 'text') && token.value.match('/'))){ + do { + token = iterator.stepBackward(); + } while (token && (hasType(token, 'string') || hasType(token, 'keyword.operator') || hasType(token, 'entity.attribute-name') || hasType(token, 'text'))); + } else { + atCursor = true; + } + if (!token || !hasType(token, 'meta.tag-name') || iterator.stepBackward().value.match('/')) { + return + } + var tag = token.value; + if (atCursor){ + var tag = tag.substring(0, position.column - token.start); + } + + return { + text: '>' + '', + selection: [1, 1] + } + } + }); + + this.add('autoindent', 'insertion', function (state, action, editor, session, text) { + if (text == "\n") { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChars = line.substring(cursor.column, cursor.column + 2); + if (rightChars == '?)/; + this._parseTag = function(tag) { + + var match = tag.match(this.tagRe); + var column = 0; + + return { + value: tag, + match: match ? match[2] : "", + closing: match ? !!match[3] : false, + selfClosing: match ? !!match[5] || match[2] == "/>" : false, + tagName: match ? match[4] : "", + column: match[1] ? column + match[1].length : column + }; + }; + this._readTagForward = function(iterator) { + var token = iterator.getCurrentToken(); + if (!token) + return null; + + var value = ""; + var start; + + do { + if (token.type.indexOf("meta.tag") === 0) { + if (!start) { + var start = { + row: iterator.getCurrentTokenRow(), + column: iterator.getCurrentTokenColumn() + }; + } + value += token.value; + if (value.indexOf(">") !== -1) { + var tag = this._parseTag(value); + tag.start = start; + tag.end = { + row: iterator.getCurrentTokenRow(), + column: iterator.getCurrentTokenColumn() + token.value.length + }; + iterator.stepForward(); + return tag; + } + } + } while(token = iterator.stepForward()); + + return null; + }; + + this._readTagBackward = function(iterator) { + var token = iterator.getCurrentToken(); + if (!token) + return null; + + var value = ""; + var end; + + do { + if (token.type.indexOf("meta.tag") === 0) { + if (!end) { + end = { + row: iterator.getCurrentTokenRow(), + column: iterator.getCurrentTokenColumn() + token.value.length + }; + } + value = token.value + value; + if (value.indexOf("<") !== -1) { + var tag = this._parseTag(value); + tag.end = end; + tag.start = { + row: iterator.getCurrentTokenRow(), + column: iterator.getCurrentTokenColumn() + }; + iterator.stepBackward(); + return tag; + } + } + } while(token = iterator.stepBackward()); + + return null; + }; + + this._pop = function(stack, tag) { + while (stack.length) { + + var top = stack[stack.length-1]; + if (!tag || top.tagName == tag.tagName) { + return stack.pop(); + } + else if (this.voidElements[tag.tagName]) { + return; + } + else if (this.voidElements[top.tagName]) { + stack.pop(); + continue; + } else { + return null; + } + } + }; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var firstTag = this._getFirstTagInLine(session, row); + + if (!firstTag.match) + return null; + + var isBackward = firstTag.closing || firstTag.selfClosing; + var stack = []; + var tag; + + if (!isBackward) { + var iterator = new TokenIterator(session, row, firstTag.column); + var start = { + row: row, + column: firstTag.column + firstTag.tagName.length + 2 + }; + while (tag = this._readTagForward(iterator)) { + if (tag.selfClosing) { + if (!stack.length) { + tag.start.column += tag.tagName.length + 2; + tag.end.column -= 2; + return Range.fromPoints(tag.start, tag.end); + } else + continue; + } + + if (tag.closing) { + this._pop(stack, tag); + if (stack.length == 0) + return Range.fromPoints(start, tag.start); + } + else { + stack.push(tag) + } + } + } + else { + var iterator = new TokenIterator(session, row, firstTag.column + firstTag.match.length); + var end = { + row: row, + column: firstTag.column + }; + + while (tag = this._readTagBackward(iterator)) { + if (tag.selfClosing) { + if (!stack.length) { + tag.start.column += tag.tagName.length + 2; + tag.end.column -= 2; + return Range.fromPoints(tag.start, tag.end); + } else + continue; + } + + if (!tag.closing) { + this._pop(stack, tag); + if (stack.length == 0) { + tag.start.column += tag.tagName.length + 2; + return Range.fromPoints(tag.start, end); + } + } + else { + stack.push(tag) + } + } + } + + }; + +}).call(FoldMode.prototype); + +}); + +ace.define('ace/mode/ruby', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/ruby_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/range', 'ace/mode/folding/coffee'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var RubyHighlightRules = require("./ruby_highlight_rules").RubyHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var Range = require("../range").Range; +var FoldMode = require("./folding/coffee").FoldMode; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new RubyHighlightRules().getRules()); + this.$outdent = new MatchingBraceOutdent(); + this.foldingRules = new FoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + + this.lineCommentStart = "#"; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.$tokenizer.getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start") { + var match = line.match(/^.*[\{\(\[]\s*$/); + var startingClassOrMethod = line.match(/^\s*(class|def)\s.*$/); + var startingDoBlock = line.match(/.*do(\s*|\s+\|.*\|\s*)$/); + var startingConditional = line.match(/^\s*(if|else)\s*/) + if (match || startingClassOrMethod || startingDoBlock || startingConditional) { + indent += tab; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return /^\s+end$/.test(line + input) || /^\s+}$/.test(line + input) || /^\s+else$/.test(line + input); + }; + + this.autoOutdent = function(state, doc, row) { + var indent = this.$getIndent(doc.getLine(row)); + var tab = doc.getTabString(); + if (indent.slice(-tab.length) == tab) + doc.remove(new Range(row, indent.length-tab.length, row, indent.length)); + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/ruby_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var constantOtherSymbol = exports.constantOtherSymbol = { + token : "constant.other.symbol.ruby", // symbol + regex : "[:](?:[A-Za-z_]|[@$](?=[a-zA-Z0-9_]))[a-zA-Z0-9_]*[!=?]?" +}; + +var qString = exports.qString = { + token : "string", // single line + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" +}; + +var qqString = exports.qqString = { + token : "string", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' +}; + +var tString = exports.tString = { + token : "string", // backtick string + regex : "[`](?:(?:\\\\.)|(?:[^'\\\\]))*?[`]" +}; + +var constantNumericHex = exports.constantNumericHex = { + token : "constant.numeric", // hex + regex : "0[xX][0-9a-fA-F](?:[0-9a-fA-F]|_(?=[0-9a-fA-F]))*\\b" +}; + +var constantNumericFloat = exports.constantNumericFloat = { + token : "constant.numeric", // float + regex : "[+-]?\\d(?:\\d|_(?=\\d))*(?:(?:\\.\\d(?:\\d|_(?=\\d))*)?(?:[eE][+-]?\\d+)?)?\\b" +}; + +var RubyHighlightRules = function() { + + var builtinFunctions = ( + "abort|Array|assert|assert_equal|assert_not_equal|assert_same|assert_not_same|" + + "assert_nil|assert_not_nil|assert_match|assert_no_match|assert_in_delta|assert_throws|" + + "assert_raise|assert_nothing_raised|assert_instance_of|assert_kind_of|assert_respond_to|" + + "assert_operator|assert_send|assert_difference|assert_no_difference|assert_recognizes|" + + "assert_generates|assert_response|assert_redirected_to|assert_template|assert_select|" + + "assert_select_email|assert_select_rjs|assert_select_encoded|css_select|at_exit|" + + "attr|attr_writer|attr_reader|attr_accessor|attr_accessible|autoload|binding|block_given?|callcc|" + + "caller|catch|chomp|chomp!|chop|chop!|defined?|delete_via_redirect|eval|exec|exit|" + + "exit!|fail|Float|flunk|follow_redirect!|fork|form_for|form_tag|format|gets|global_variables|gsub|" + + "gsub!|get_via_redirect|host!|https?|https!|include|Integer|lambda|link_to|" + + "link_to_unless_current|link_to_function|link_to_remote|load|local_variables|loop|open|open_session|" + + "p|print|printf|proc|putc|puts|post_via_redirect|put_via_redirect|raise|rand|" + + "raw|readline|readlines|redirect?|request_via_redirect|require|scan|select|" + + "set_trace_func|sleep|split|sprintf|srand|String|stylesheet_link_tag|syscall|system|sub|sub!|test|" + + "throw|trace_var|trap|untrace_var|atan2|cos|exp|frexp|ldexp|log|log10|sin|sqrt|tan|" + + "render|javascript_include_tag|csrf_meta_tag|label_tag|text_field_tag|submit_tag|check_box_tag|" + + "content_tag|radio_button_tag|text_area_tag|password_field_tag|hidden_field_tag|" + + "fields_for|select_tag|options_for_select|options_from_collection_for_select|collection_select|" + + "time_zone_select|select_date|select_time|select_datetime|date_select|time_select|datetime_select|" + + "select_year|select_month|select_day|select_hour|select_minute|select_second|file_field_tag|" + + "file_field|respond_to|skip_before_filter|around_filter|after_filter|verify|" + + "protect_from_forgery|rescue_from|helper_method|redirect_to|before_filter|" + + "send_data|send_file|validates_presence_of|validates_uniqueness_of|validates_length_of|" + + "validates_format_of|validates_acceptance_of|validates_associated|validates_exclusion_of|" + + "validates_inclusion_of|validates_numericality_of|validates_with|validates_each|" + + "authenticate_or_request_with_http_basic|authenticate_or_request_with_http_digest|" + + "filter_parameter_logging|match|get|post|resources|redirect|scope|assert_routing|" + + "translate|localize|extract_locale_from_tld|caches_page|expire_page|caches_action|expire_action|" + + "cache|expire_fragment|expire_cache_for|observe|cache_sweeper|" + + "has_many|has_one|belongs_to|has_and_belongs_to_many" + ); + + var keywords = ( + "alias|and|BEGIN|begin|break|case|class|def|defined|do|else|elsif|END|end|ensure|" + + "__FILE__|finally|for|gem|if|in|__LINE__|module|next|not|or|private|protected|public|" + + "redo|rescue|retry|return|super|then|undef|unless|until|when|while|yield" + ); + + var buildinConstants = ( + "true|TRUE|false|FALSE|nil|NIL|ARGF|ARGV|DATA|ENV|RUBY_PLATFORM|RUBY_RELEASE_DATE|" + + "RUBY_VERSION|STDERR|STDIN|STDOUT|TOPLEVEL_BINDING" + ); + + var builtinVariables = ( + "\$DEBUG|\$defout|\$FILENAME|\$LOAD_PATH|\$SAFE|\$stdin|\$stdout|\$stderr|\$VERBOSE|" + + "$!|root_url|flash|session|cookies|params|request|response|logger|self" + ); + + var keywordMapper = this.$keywords = this.createKeywordMapper({ + "keyword": keywords, + "constant.language": buildinConstants, + "variable.language": builtinVariables, + "support.function": builtinFunctions, + "invalid.deprecated": "debugger" // TODO is this a remnant from js mode? + }, "identifier"); + + this.$rules = { + "start" : [ + { + token : "comment", + regex : "#.*$" + }, { + token : "comment", // multi line comment + regex : "^=begin(?:$|\\s.*$)", + next : "comment" + }, { + token : "string.regexp", + regex : "[/](?:(?:\\[(?:\\\\]|[^\\]])+\\])|(?:\\\\/|[^\\]/]))*[/]\\w*\\s*(?=[).,;]|$)" + }, + + qString, + qqString, + tString, + + { + token : "text", // namespaces aren't symbols + regex : "::" + }, { + token : "variable.instance", // instance variable + regex : "@{1,2}[a-zA-Z_\\d]+" + }, { + token : "support.class", // class name + regex : "[A-Z][a-zA-Z_\\d]+" + }, + + constantOtherSymbol, + constantNumericHex, + constantNumericFloat, + + { + token : "constant.language.boolean", + regex : "(?:true|false)\\b" + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "punctuation.separator.key-value", + regex : "=>" + }, { + stateName: "heredoc", + onMatch : function(value, currentState, stack) { + var next = value[2] == '-' ? "indentedHeredoc" : "heredoc"; + var tokens = value.split(this.splitRegex); + stack.push(next, tokens[3]); + return [ + {type:"constant", value: tokens[1]}, + {type:"string", value: tokens[2]}, + {type:"support.class", value: tokens[3]}, + {type:"string", value: tokens[4]} + ]; + }, + regex : "(<<-?)(['\"`]?)([\\w]+)(['\"`]?)", + rules: { + heredoc: [{ + onMatch: function(value, currentState, stack) { + if (value == stack[1]) { + stack.shift(); + stack.shift(); + return "support.class"; + } + return "string"; + }, + regex: ".*$", + next: "start" + }], + indentedHeredoc: [{ + token: "string", + regex: "^ +" + }, { + onMatch: function(value, currentState, stack) { + if (value == stack[1]) { + stack.shift(); + stack.shift(); + return "support.class"; + } + return "string"; + }, + regex: ".*$", + next: "start" + }] + } + }, { + token : "keyword.operator", + regex : "!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)" + }, { + token : "paren.lparen", + regex : "[[({]" + }, { + token : "paren.rparen", + regex : "[\\])}]" + }, { + token : "text", + regex : "\\s+" + } + ], + "comment" : [ + { + token : "comment", // closing comment + regex : "^=end(?:$|\\s.*$)", + next : "start" + }, { + token : "comment", // comment spanning whole line + regex : ".+" + } + ] + }; + + this.normalizeRules(); +}; + +oop.inherits(RubyHighlightRules, TextHighlightRules); + +exports.RubyHighlightRules = RubyHighlightRules; +}); + +ace.define('ace/mode/folding/coffee', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/folding/fold_mode', 'ace/range'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var BaseFoldMode = require("./fold_mode").FoldMode; +var Range = require("../../range").Range; + +var FoldMode = exports.FoldMode = function() {}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var range = this.indentationBlock(session, row); + if (range) + return range; + + var re = /\S/; + var line = session.getLine(row); + var startLevel = line.search(re); + if (startLevel == -1 || line[startLevel] != "#") + return; + + var startColumn = line.length; + var maxRow = session.getLength(); + var startRow = row; + var endRow = row; + + while (++row < maxRow) { + line = session.getLine(row); + var level = line.search(re); + + if (level == -1) + continue; + + if (line[level] != "#") + break; + + endRow = row; + } + + if (endRow > startRow) { + var endColumn = session.getLine(endRow).length; + return new Range(startRow, startColumn, endRow, endColumn); + } + }; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + var indent = line.search(/\S/); + var next = session.getLine(row + 1); + var prev = session.getLine(row - 1); + var prevIndent = prev.search(/\S/); + var nextIndent = next.search(/\S/); + + if (indent == -1) { + session.foldWidgets[row - 1] = prevIndent!= -1 && prevIndent < nextIndent ? "start" : ""; + return ""; + } + if (prevIndent == -1) { + if (indent == nextIndent && line[indent] == "#" && next[indent] == "#") { + session.foldWidgets[row - 1] = ""; + session.foldWidgets[row + 1] = ""; + return "start"; + } + } else if (prevIndent == indent && line[indent] == "#" && prev[indent] == "#") { + if (session.getLine(row - 2).search(/\S/) == -1) { + session.foldWidgets[row - 1] = "start"; + session.foldWidgets[row + 1] = ""; + return ""; + } + } + + if (prevIndent!= -1 && prevIndent < indent) + session.foldWidgets[row - 1] = "start"; + else + session.foldWidgets[row - 1] = ""; + + if (indent < nextIndent) + return "start"; + else + return ""; + }; + +}).call(FoldMode.prototype); + +}); diff --git a/0.0.3_0/ace/mode-erlang.js b/0.0.3_0/ace/mode-erlang.js new file mode 100644 index 0000000..ddebb60 --- /dev/null +++ b/0.0.3_0/ace/mode-erlang.js @@ -0,0 +1,951 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2012, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * + * Contributor(s): + * + * + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/mode/erlang', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/erlang_highlight_rules', 'ace/mode/folding/cstyle'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var ErlangHighlightRules = require("./erlang_highlight_rules").ErlangHighlightRules; +var FoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + var highlighter = new ErlangHighlightRules(); + this.foldingRules = new FoldMode(); + this.$tokenizer = new Tokenizer(highlighter.getRules()); +}; +oop.inherits(Mode, TextMode); + +(function() { + this.lineCommentStart = "%"; + this.blockComment = {start: "/*", end: "*/"}; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/erlang_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var ErlangHighlightRules = function() { + + this.$rules = { start: + [ { include: '#module-directive' }, + { include: '#import-export-directive' }, + { include: '#behaviour-directive' }, + { include: '#record-directive' }, + { include: '#define-directive' }, + { include: '#macro-directive' }, + { include: '#directive' }, + { include: '#function' }, + { include: '#everything-else' } ], + '#atom': + [ { token: 'punctuation.definition.symbol.begin.erlang', + regex: '\'', + push: + [ { token: 'punctuation.definition.symbol.end.erlang', + regex: '\'', + next: 'pop' }, + { token: + [ 'punctuation.definition.escape.erlang', + 'constant.other.symbol.escape.erlang', + 'punctuation.definition.escape.erlang', + 'constant.other.symbol.escape.erlang', + 'constant.other.symbol.escape.erlang' ], + regex: '(\\\\)(?:([bdefnrstv\\\\\'"])|(\\^)([@-_])|([0-7]{1,3}))' }, + { token: 'invalid.illegal.atom.erlang', regex: '\\\\\\^?.?' }, + { defaultToken: 'constant.other.symbol.quoted.single.erlang' } ] }, + { token: 'constant.other.symbol.unquoted.erlang', + regex: '[a-z][a-zA-Z\\d@_]*' } ], + '#behaviour-directive': + [ { token: + [ 'meta.directive.behaviour.erlang', + 'punctuation.section.directive.begin.erlang', + 'meta.directive.behaviour.erlang', + 'keyword.control.directive.behaviour.erlang', + 'meta.directive.behaviour.erlang', + 'punctuation.definition.parameters.begin.erlang', + 'meta.directive.behaviour.erlang', + 'entity.name.type.class.behaviour.definition.erlang', + 'meta.directive.behaviour.erlang', + 'punctuation.definition.parameters.end.erlang', + 'meta.directive.behaviour.erlang', + 'punctuation.section.directive.end.erlang' ], + regex: '^(\\s*)(-)(\\s*)(behaviour)(\\s*)(\\()(\\s*)([a-z][a-zA-Z\\d@_]*)(\\s*)(\\))(\\s*)(\\.)' } ], + '#binary': + [ { token: 'punctuation.definition.binary.begin.erlang', + regex: '<<', + push: + [ { token: 'punctuation.definition.binary.end.erlang', + regex: '>>', + next: 'pop' }, + { token: + [ 'punctuation.separator.binary.erlang', + 'punctuation.separator.value-size.erlang' ], + regex: '(,)|(:)' }, + { include: '#internal-type-specifiers' }, + { include: '#everything-else' }, + { defaultToken: 'meta.structure.binary.erlang' } ] } ], + '#character': + [ { token: + [ 'punctuation.definition.character.erlang', + 'punctuation.definition.escape.erlang', + 'constant.character.escape.erlang', + 'punctuation.definition.escape.erlang', + 'constant.character.escape.erlang', + 'constant.character.escape.erlang' ], + regex: '(\\$)(\\\\)(?:([bdefnrstv\\\\\'"])|(\\^)([@-_])|([0-7]{1,3}))' }, + { token: 'invalid.illegal.character.erlang', + regex: '\\$\\\\\\^?.?' }, + { token: + [ 'punctuation.definition.character.erlang', + 'constant.character.erlang' ], + regex: '(\\$)(\\S)' }, + { token: 'invalid.illegal.character.erlang', regex: '\\$.?' } ], + '#comment': + [ { token: 'punctuation.definition.comment.erlang', + regex: '%.*$', + push_: + [ { token: 'comment.line.percentage.erlang', + regex: '$', + next: 'pop' }, + { defaultToken: 'comment.line.percentage.erlang' } ] } ], + '#define-directive': + [ { token: + [ 'meta.directive.define.erlang', + 'punctuation.section.directive.begin.erlang', + 'meta.directive.define.erlang', + 'keyword.control.directive.define.erlang', + 'meta.directive.define.erlang', + 'punctuation.definition.parameters.begin.erlang', + 'meta.directive.define.erlang', + 'entity.name.function.macro.definition.erlang', + 'meta.directive.define.erlang', + 'punctuation.separator.parameters.erlang' ], + regex: '^(\\s*)(-)(\\s*)(define)(\\s*)(\\()(\\s*)([a-zA-Z\\d@_]+)(\\s*)(,)', + push: + [ { token: + [ 'punctuation.definition.parameters.end.erlang', + 'meta.directive.define.erlang', + 'punctuation.section.directive.end.erlang' ], + regex: '(\\))(\\s*)(\\.)', + next: 'pop' }, + { include: '#everything-else' }, + { defaultToken: 'meta.directive.define.erlang' } ] }, + { token: 'meta.directive.define.erlang', + regex: '(?=^\\s*-\\s*define\\s*\\(\\s*[a-zA-Z\\d@_]+\\s*\\()', + push: + [ { token: + [ 'punctuation.definition.parameters.end.erlang', + 'meta.directive.define.erlang', + 'punctuation.section.directive.end.erlang' ], + regex: '(\\))(\\s*)(\\.)', + next: 'pop' }, + { token: + [ 'text', + 'punctuation.section.directive.begin.erlang', + 'text', + 'keyword.control.directive.define.erlang', + 'text', + 'punctuation.definition.parameters.begin.erlang', + 'text', + 'entity.name.function.macro.definition.erlang', + 'text', + 'punctuation.definition.parameters.begin.erlang' ], + regex: '^(\\s*)(-)(\\s*)(define)(\\s*)(\\()(\\s*)([a-zA-Z\\d@_]+)(\\s*)(\\()', + push: + [ { token: + [ 'punctuation.definition.parameters.end.erlang', + 'text', + 'punctuation.separator.parameters.erlang' ], + regex: '(\\))(\\s*)(,)', + next: 'pop' }, + { token: 'punctuation.separator.parameters.erlang', regex: ',' }, + { include: '#everything-else' } ] }, + { token: 'punctuation.separator.define.erlang', + regex: '\\|\\||\\||:|;|,|\\.|->' }, + { include: '#everything-else' }, + { defaultToken: 'meta.directive.define.erlang' } ] } ], + '#directive': + [ { token: + [ 'meta.directive.erlang', + 'punctuation.section.directive.begin.erlang', + 'meta.directive.erlang', + 'keyword.control.directive.erlang', + 'meta.directive.erlang', + 'punctuation.definition.parameters.begin.erlang' ], + regex: '^(\\s*)(-)(\\s*)([a-z][a-zA-Z\\d@_]*)(\\s*)(\\(?)', + push: + [ { token: + [ 'punctuation.definition.parameters.end.erlang', + 'meta.directive.erlang', + 'punctuation.section.directive.end.erlang' ], + regex: '(\\)?)(\\s*)(\\.)', + next: 'pop' }, + { include: '#everything-else' }, + { defaultToken: 'meta.directive.erlang' } ] }, + { token: + [ 'meta.directive.erlang', + 'punctuation.section.directive.begin.erlang', + 'meta.directive.erlang', + 'keyword.control.directive.erlang', + 'meta.directive.erlang', + 'punctuation.section.directive.end.erlang' ], + regex: '^(\\s*)(-)(\\s*)([a-z][a-zA-Z\\d@_]*)(\\s*)(\\.)' } ], + '#everything-else': + [ { include: '#comment' }, + { include: '#record-usage' }, + { include: '#macro-usage' }, + { include: '#expression' }, + { include: '#keyword' }, + { include: '#textual-operator' }, + { include: '#function-call' }, + { include: '#tuple' }, + { include: '#list' }, + { include: '#binary' }, + { include: '#parenthesized-expression' }, + { include: '#character' }, + { include: '#number' }, + { include: '#atom' }, + { include: '#string' }, + { include: '#symbolic-operator' }, + { include: '#variable' } ], + '#expression': + [ { token: 'keyword.control.if.erlang', + regex: '\\bif\\b', + push: + [ { token: 'keyword.control.end.erlang', + regex: '\\bend\\b', + next: 'pop' }, + { include: '#internal-expression-punctuation' }, + { include: '#everything-else' }, + { defaultToken: 'meta.expression.if.erlang' } ] }, + { token: 'keyword.control.case.erlang', + regex: '\\bcase\\b', + push: + [ { token: 'keyword.control.end.erlang', + regex: '\\bend\\b', + next: 'pop' }, + { include: '#internal-expression-punctuation' }, + { include: '#everything-else' }, + { defaultToken: 'meta.expression.case.erlang' } ] }, + { token: 'keyword.control.receive.erlang', + regex: '\\breceive\\b', + push: + [ { token: 'keyword.control.end.erlang', + regex: '\\bend\\b', + next: 'pop' }, + { include: '#internal-expression-punctuation' }, + { include: '#everything-else' }, + { defaultToken: 'meta.expression.receive.erlang' } ] }, + { token: + [ 'keyword.control.fun.erlang', + 'text', + 'entity.name.type.class.module.erlang', + 'text', + 'punctuation.separator.module-function.erlang', + 'text', + 'entity.name.function.erlang', + 'text', + 'punctuation.separator.function-arity.erlang' ], + regex: '\\b(fun)(\\s*)(?:([a-z][a-zA-Z\\d@_]*)(\\s*)(:)(\\s*))?([a-z][a-zA-Z\\d@_]*)(\\s*)(/)' }, + { token: 'keyword.control.fun.erlang', + regex: '\\bfun\\b', + push: + [ { token: 'keyword.control.end.erlang', + regex: '\\bend\\b', + next: 'pop' }, + { token: 'text', + regex: '(?=\\()', + push: + [ { token: 'punctuation.separator.clauses.erlang', + regex: ';|(?=\\bend\\b)', + next: 'pop' }, + { include: '#internal-function-parts' } ] }, + { include: '#everything-else' }, + { defaultToken: 'meta.expression.fun.erlang' } ] }, + { token: 'keyword.control.try.erlang', + regex: '\\btry\\b', + push: + [ { token: 'keyword.control.end.erlang', + regex: '\\bend\\b', + next: 'pop' }, + { include: '#internal-expression-punctuation' }, + { include: '#everything-else' }, + { defaultToken: 'meta.expression.try.erlang' } ] }, + { token: 'keyword.control.begin.erlang', + regex: '\\bbegin\\b', + push: + [ { token: 'keyword.control.end.erlang', + regex: '\\bend\\b', + next: 'pop' }, + { include: '#internal-expression-punctuation' }, + { include: '#everything-else' }, + { defaultToken: 'meta.expression.begin.erlang' } ] }, + { token: 'keyword.control.query.erlang', + regex: '\\bquery\\b', + push: + [ { token: 'keyword.control.end.erlang', + regex: '\\bend\\b', + next: 'pop' }, + { include: '#everything-else' }, + { defaultToken: 'meta.expression.query.erlang' } ] } ], + '#function': + [ { token: + [ 'meta.function.erlang', + 'entity.name.function.definition.erlang', + 'meta.function.erlang' ], + regex: '^(\\s*)([a-z][a-zA-Z\\d@_]*|\'[^\']*\')(\\s*)(?=\\()', + push: + [ { token: 'punctuation.terminator.function.erlang', + regex: '\\.', + next: 'pop' }, + { token: [ 'text', 'entity.name.function.erlang', 'text' ], + regex: '^(\\s*)([a-z][a-zA-Z\\d@_]*|\'[^\']*\')(\\s*)(?=\\()' }, + { token: 'text', + regex: '(?=\\()', + push: + [ { token: 'punctuation.separator.clauses.erlang', + regex: ';|(?=\\.)', + next: 'pop' }, + { include: '#parenthesized-expression' }, + { include: '#internal-function-parts' } ] }, + { include: '#everything-else' }, + { defaultToken: 'meta.function.erlang' } ] } ], + '#function-call': + [ { token: 'meta.function-call.erlang', + regex: '(?=(?:[a-z][a-zA-Z\\d@_]*|\'[^\']*\')\\s*(?:\\(|:\\s*(?:[a-z][a-zA-Z\\d@_]*|\'[^\']*\')\\s*\\())', + push: + [ { token: 'punctuation.definition.parameters.end.erlang', + regex: '\\)', + next: 'pop' }, + { token: + [ 'entity.name.type.class.module.erlang', + 'text', + 'punctuation.separator.module-function.erlang', + 'text', + 'entity.name.function.guard.erlang', + 'text', + 'punctuation.definition.parameters.begin.erlang' ], + regex: '(?:(erlang)(\\s*)(:)(\\s*))?(is_atom|is_binary|is_constant|is_float|is_function|is_integer|is_list|is_number|is_pid|is_port|is_reference|is_tuple|is_record|abs|element|hd|length|node|round|self|size|tl|trunc)(\\s*)(\\()', + push: + [ { token: 'text', regex: '(?=\\))', next: 'pop' }, + { token: 'punctuation.separator.parameters.erlang', regex: ',' }, + { include: '#everything-else' } ] }, + { token: + [ 'entity.name.type.class.module.erlang', + 'text', + 'punctuation.separator.module-function.erlang', + 'text', + 'entity.name.function.erlang', + 'text', + 'punctuation.definition.parameters.begin.erlang' ], + regex: '(?:([a-z][a-zA-Z\\d@_]*|\'[^\']*\')(\\s*)(:)(\\s*))?([a-z][a-zA-Z\\d@_]*|\'[^\']*\')(\\s*)(\\()', + push: + [ { token: 'text', regex: '(?=\\))', next: 'pop' }, + { token: 'punctuation.separator.parameters.erlang', regex: ',' }, + { include: '#everything-else' } ] }, + { defaultToken: 'meta.function-call.erlang' } ] } ], + '#import-export-directive': + [ { token: + [ 'meta.directive.import.erlang', + 'punctuation.section.directive.begin.erlang', + 'meta.directive.import.erlang', + 'keyword.control.directive.import.erlang', + 'meta.directive.import.erlang', + 'punctuation.definition.parameters.begin.erlang', + 'meta.directive.import.erlang', + 'entity.name.type.class.module.erlang', + 'meta.directive.import.erlang', + 'punctuation.separator.parameters.erlang' ], + regex: '^(\\s*)(-)(\\s*)(import)(\\s*)(\\()(\\s*)([a-z][a-zA-Z\\d@_]*|\'[^\']*\')(\\s*)(,)', + push: + [ { token: + [ 'punctuation.definition.parameters.end.erlang', + 'meta.directive.import.erlang', + 'punctuation.section.directive.end.erlang' ], + regex: '(\\))(\\s*)(\\.)', + next: 'pop' }, + { include: '#internal-function-list' }, + { defaultToken: 'meta.directive.import.erlang' } ] }, + { token: + [ 'meta.directive.export.erlang', + 'punctuation.section.directive.begin.erlang', + 'meta.directive.export.erlang', + 'keyword.control.directive.export.erlang', + 'meta.directive.export.erlang', + 'punctuation.definition.parameters.begin.erlang' ], + regex: '^(\\s*)(-)(\\s*)(export)(\\s*)(\\()', + push: + [ { token: + [ 'punctuation.definition.parameters.end.erlang', + 'meta.directive.export.erlang', + 'punctuation.section.directive.end.erlang' ], + regex: '(\\))(\\s*)(\\.)', + next: 'pop' }, + { include: '#internal-function-list' }, + { defaultToken: 'meta.directive.export.erlang' } ] } ], + '#internal-expression-punctuation': + [ { token: + [ 'punctuation.separator.clause-head-body.erlang', + 'punctuation.separator.clauses.erlang', + 'punctuation.separator.expressions.erlang' ], + regex: '(->)|(;)|(,)' } ], + '#internal-function-list': + [ { token: 'punctuation.definition.list.begin.erlang', + regex: '\\[', + push: + [ { token: 'punctuation.definition.list.end.erlang', + regex: '\\]', + next: 'pop' }, + { token: + [ 'entity.name.function.erlang', + 'text', + 'punctuation.separator.function-arity.erlang' ], + regex: '([a-z][a-zA-Z\\d@_]*|\'[^\']*\')(\\s*)(/)', + push: + [ { token: 'punctuation.separator.list.erlang', + regex: ',|(?=\\])', + next: 'pop' }, + { include: '#everything-else' } ] }, + { include: '#everything-else' }, + { defaultToken: 'meta.structure.list.function.erlang' } ] } ], + '#internal-function-parts': + [ { token: 'text', + regex: '(?=\\()', + push: + [ { token: 'punctuation.separator.clause-head-body.erlang', + regex: '->', + next: 'pop' }, + { token: 'punctuation.definition.parameters.begin.erlang', + regex: '\\(', + push: + [ { token: 'punctuation.definition.parameters.end.erlang', + regex: '\\)', + next: 'pop' }, + { token: 'punctuation.separator.parameters.erlang', regex: ',' }, + { include: '#everything-else' } ] }, + { token: 'punctuation.separator.guards.erlang', regex: ',|;' }, + { include: '#everything-else' } ] }, + { token: 'punctuation.separator.expressions.erlang', + regex: ',' }, + { include: '#everything-else' } ], + '#internal-record-body': + [ { token: 'punctuation.definition.class.record.begin.erlang', + regex: '\\{', + push: + [ { token: 'meta.structure.record.erlang', + regex: '(?=\\})', + next: 'pop' }, + { token: + [ 'variable.other.field.erlang', + 'variable.language.omitted.field.erlang', + 'text', + 'keyword.operator.assignment.erlang' ], + regex: '(?:([a-z][a-zA-Z\\d@_]*|\'[^\']*\')|(_))(\\s*)(=|::)', + push: + [ { token: 'punctuation.separator.class.record.erlang', + regex: ',|(?=\\})', + next: 'pop' }, + { include: '#everything-else' } ] }, + { token: + [ 'variable.other.field.erlang', + 'text', + 'punctuation.separator.class.record.erlang' ], + regex: '([a-z][a-zA-Z\\d@_]*|\'[^\']*\')(\\s*)((?:,)?)' }, + { include: '#everything-else' }, + { defaultToken: 'meta.structure.record.erlang' } ] } ], + '#internal-type-specifiers': + [ { token: 'punctuation.separator.value-type.erlang', + regex: '/', + push: + [ { token: 'text', regex: '(?=,|:|>>)', next: 'pop' }, + { token: + [ 'storage.type.erlang', + 'storage.modifier.signedness.erlang', + 'storage.modifier.endianness.erlang', + 'storage.modifier.unit.erlang', + 'punctuation.separator.type-specifiers.erlang' ], + regex: '(integer|float|binary|bytes|bitstring|bits)|(signed|unsigned)|(big|little|native)|(unit)|(-)' } ] } ], + '#keyword': + [ { token: 'keyword.control.erlang', + regex: '\\b(?:after|begin|case|catch|cond|end|fun|if|let|of|query|try|receive|when)\\b' } ], + '#list': + [ { token: 'punctuation.definition.list.begin.erlang', + regex: '\\[', + push: + [ { token: 'punctuation.definition.list.end.erlang', + regex: '\\]', + next: 'pop' }, + { token: 'punctuation.separator.list.erlang', + regex: '\\||\\|\\||,' }, + { include: '#everything-else' }, + { defaultToken: 'meta.structure.list.erlang' } ] } ], + '#macro-directive': + [ { token: + [ 'meta.directive.ifdef.erlang', + 'punctuation.section.directive.begin.erlang', + 'meta.directive.ifdef.erlang', + 'keyword.control.directive.ifdef.erlang', + 'meta.directive.ifdef.erlang', + 'punctuation.definition.parameters.begin.erlang', + 'meta.directive.ifdef.erlang', + 'entity.name.function.macro.erlang', + 'meta.directive.ifdef.erlang', + 'punctuation.definition.parameters.end.erlang', + 'meta.directive.ifdef.erlang', + 'punctuation.section.directive.end.erlang' ], + regex: '^(\\s*)(-)(\\s*)(ifdef)(\\s*)(\\()(\\s*)([a-zA-z\\d@_]+)(\\s*)(\\))(\\s*)(\\.)' }, + { token: + [ 'meta.directive.ifndef.erlang', + 'punctuation.section.directive.begin.erlang', + 'meta.directive.ifndef.erlang', + 'keyword.control.directive.ifndef.erlang', + 'meta.directive.ifndef.erlang', + 'punctuation.definition.parameters.begin.erlang', + 'meta.directive.ifndef.erlang', + 'entity.name.function.macro.erlang', + 'meta.directive.ifndef.erlang', + 'punctuation.definition.parameters.end.erlang', + 'meta.directive.ifndef.erlang', + 'punctuation.section.directive.end.erlang' ], + regex: '^(\\s*)(-)(\\s*)(ifndef)(\\s*)(\\()(\\s*)([a-zA-z\\d@_]+)(\\s*)(\\))(\\s*)(\\.)' }, + { token: + [ 'meta.directive.undef.erlang', + 'punctuation.section.directive.begin.erlang', + 'meta.directive.undef.erlang', + 'keyword.control.directive.undef.erlang', + 'meta.directive.undef.erlang', + 'punctuation.definition.parameters.begin.erlang', + 'meta.directive.undef.erlang', + 'entity.name.function.macro.erlang', + 'meta.directive.undef.erlang', + 'punctuation.definition.parameters.end.erlang', + 'meta.directive.undef.erlang', + 'punctuation.section.directive.end.erlang' ], + regex: '^(\\s*)(-)(\\s*)(undef)(\\s*)(\\()(\\s*)([a-zA-z\\d@_]+)(\\s*)(\\))(\\s*)(\\.)' } ], + '#macro-usage': + [ { token: + [ 'keyword.operator.macro.erlang', + 'meta.macro-usage.erlang', + 'entity.name.function.macro.erlang' ], + regex: '(\\?\\??)(\\s*)([a-zA-Z\\d@_]+)' } ], + '#module-directive': + [ { token: + [ 'meta.directive.module.erlang', + 'punctuation.section.directive.begin.erlang', + 'meta.directive.module.erlang', + 'keyword.control.directive.module.erlang', + 'meta.directive.module.erlang', + 'punctuation.definition.parameters.begin.erlang', + 'meta.directive.module.erlang', + 'entity.name.type.class.module.definition.erlang', + 'meta.directive.module.erlang', + 'punctuation.definition.parameters.end.erlang', + 'meta.directive.module.erlang', + 'punctuation.section.directive.end.erlang' ], + regex: '^(\\s*)(-)(\\s*)(module)(\\s*)(\\()(\\s*)([a-z][a-zA-Z\\d@_]*)(\\s*)(\\))(\\s*)(\\.)' } ], + '#number': + [ { token: 'text', + regex: '(?=\\d)', + push: + [ { token: 'text', regex: '(?!\\d)', next: 'pop' }, + { token: + [ 'constant.numeric.float.erlang', + 'punctuation.separator.integer-float.erlang', + 'constant.numeric.float.erlang', + 'punctuation.separator.float-exponent.erlang' ], + regex: '(\\d+)(\\.)(\\d+)((?:[eE][\\+\\-]?\\d+)?)' }, + { token: + [ 'constant.numeric.integer.binary.erlang', + 'punctuation.separator.base-integer.erlang', + 'constant.numeric.integer.binary.erlang' ], + regex: '(2)(#)([0-1]+)' }, + { token: + [ 'constant.numeric.integer.base-3.erlang', + 'punctuation.separator.base-integer.erlang', + 'constant.numeric.integer.base-3.erlang' ], + regex: '(3)(#)([0-2]+)' }, + { token: + [ 'constant.numeric.integer.base-4.erlang', + 'punctuation.separator.base-integer.erlang', + 'constant.numeric.integer.base-4.erlang' ], + regex: '(4)(#)([0-3]+)' }, + { token: + [ 'constant.numeric.integer.base-5.erlang', + 'punctuation.separator.base-integer.erlang', + 'constant.numeric.integer.base-5.erlang' ], + regex: '(5)(#)([0-4]+)' }, + { token: + [ 'constant.numeric.integer.base-6.erlang', + 'punctuation.separator.base-integer.erlang', + 'constant.numeric.integer.base-6.erlang' ], + regex: '(6)(#)([0-5]+)' }, + { token: + [ 'constant.numeric.integer.base-7.erlang', + 'punctuation.separator.base-integer.erlang', + 'constant.numeric.integer.base-7.erlang' ], + regex: '(7)(#)([0-6]+)' }, + { token: + [ 'constant.numeric.integer.octal.erlang', + 'punctuation.separator.base-integer.erlang', + 'constant.numeric.integer.octal.erlang' ], + regex: '(8)(#)([0-7]+)' }, + { token: + [ 'constant.numeric.integer.base-9.erlang', + 'punctuation.separator.base-integer.erlang', + 'constant.numeric.integer.base-9.erlang' ], + regex: '(9)(#)([0-8]+)' }, + { token: + [ 'constant.numeric.integer.decimal.erlang', + 'punctuation.separator.base-integer.erlang', + 'constant.numeric.integer.decimal.erlang' ], + regex: '(10)(#)(\\d+)' }, + { token: + [ 'constant.numeric.integer.base-11.erlang', + 'punctuation.separator.base-integer.erlang', + 'constant.numeric.integer.base-11.erlang' ], + regex: '(11)(#)([\\daA]+)' }, + { token: + [ 'constant.numeric.integer.base-12.erlang', + 'punctuation.separator.base-integer.erlang', + 'constant.numeric.integer.base-12.erlang' ], + regex: '(12)(#)([\\da-bA-B]+)' }, + { token: + [ 'constant.numeric.integer.base-13.erlang', + 'punctuation.separator.base-integer.erlang', + 'constant.numeric.integer.base-13.erlang' ], + regex: '(13)(#)([\\da-cA-C]+)' }, + { token: + [ 'constant.numeric.integer.base-14.erlang', + 'punctuation.separator.base-integer.erlang', + 'constant.numeric.integer.base-14.erlang' ], + regex: '(14)(#)([\\da-dA-D]+)' }, + { token: + [ 'constant.numeric.integer.base-15.erlang', + 'punctuation.separator.base-integer.erlang', + 'constant.numeric.integer.base-15.erlang' ], + regex: '(15)(#)([\\da-eA-E]+)' }, + { token: + [ 'constant.numeric.integer.hexadecimal.erlang', + 'punctuation.separator.base-integer.erlang', + 'constant.numeric.integer.hexadecimal.erlang' ], + regex: '(16)(#)([\\da-fA-F]+)' }, + { token: + [ 'constant.numeric.integer.base-17.erlang', + 'punctuation.separator.base-integer.erlang', + 'constant.numeric.integer.base-17.erlang' ], + regex: '(17)(#)([\\da-gA-G]+)' }, + { token: + [ 'constant.numeric.integer.base-18.erlang', + 'punctuation.separator.base-integer.erlang', + 'constant.numeric.integer.base-18.erlang' ], + regex: '(18)(#)([\\da-hA-H]+)' }, + { token: + [ 'constant.numeric.integer.base-19.erlang', + 'punctuation.separator.base-integer.erlang', + 'constant.numeric.integer.base-19.erlang' ], + regex: '(19)(#)([\\da-iA-I]+)' }, + { token: + [ 'constant.numeric.integer.base-20.erlang', + 'punctuation.separator.base-integer.erlang', + 'constant.numeric.integer.base-20.erlang' ], + regex: '(20)(#)([\\da-jA-J]+)' }, + { token: + [ 'constant.numeric.integer.base-21.erlang', + 'punctuation.separator.base-integer.erlang', + 'constant.numeric.integer.base-21.erlang' ], + regex: '(21)(#)([\\da-kA-K]+)' }, + { token: + [ 'constant.numeric.integer.base-22.erlang', + 'punctuation.separator.base-integer.erlang', + 'constant.numeric.integer.base-22.erlang' ], + regex: '(22)(#)([\\da-lA-L]+)' }, + { token: + [ 'constant.numeric.integer.base-23.erlang', + 'punctuation.separator.base-integer.erlang', + 'constant.numeric.integer.base-23.erlang' ], + regex: '(23)(#)([\\da-mA-M]+)' }, + { token: + [ 'constant.numeric.integer.base-24.erlang', + 'punctuation.separator.base-integer.erlang', + 'constant.numeric.integer.base-24.erlang' ], + regex: '(24)(#)([\\da-nA-N]+)' }, + { token: + [ 'constant.numeric.integer.base-25.erlang', + 'punctuation.separator.base-integer.erlang', + 'constant.numeric.integer.base-25.erlang' ], + regex: '(25)(#)([\\da-oA-O]+)' }, + { token: + [ 'constant.numeric.integer.base-26.erlang', + 'punctuation.separator.base-integer.erlang', + 'constant.numeric.integer.base-26.erlang' ], + regex: '(26)(#)([\\da-pA-P]+)' }, + { token: + [ 'constant.numeric.integer.base-27.erlang', + 'punctuation.separator.base-integer.erlang', + 'constant.numeric.integer.base-27.erlang' ], + regex: '(27)(#)([\\da-qA-Q]+)' }, + { token: + [ 'constant.numeric.integer.base-28.erlang', + 'punctuation.separator.base-integer.erlang', + 'constant.numeric.integer.base-28.erlang' ], + regex: '(28)(#)([\\da-rA-R]+)' }, + { token: + [ 'constant.numeric.integer.base-29.erlang', + 'punctuation.separator.base-integer.erlang', + 'constant.numeric.integer.base-29.erlang' ], + regex: '(29)(#)([\\da-sA-S]+)' }, + { token: + [ 'constant.numeric.integer.base-30.erlang', + 'punctuation.separator.base-integer.erlang', + 'constant.numeric.integer.base-30.erlang' ], + regex: '(30)(#)([\\da-tA-T]+)' }, + { token: + [ 'constant.numeric.integer.base-31.erlang', + 'punctuation.separator.base-integer.erlang', + 'constant.numeric.integer.base-31.erlang' ], + regex: '(31)(#)([\\da-uA-U]+)' }, + { token: + [ 'constant.numeric.integer.base-32.erlang', + 'punctuation.separator.base-integer.erlang', + 'constant.numeric.integer.base-32.erlang' ], + regex: '(32)(#)([\\da-vA-V]+)' }, + { token: + [ 'constant.numeric.integer.base-33.erlang', + 'punctuation.separator.base-integer.erlang', + 'constant.numeric.integer.base-33.erlang' ], + regex: '(33)(#)([\\da-wA-W]+)' }, + { token: + [ 'constant.numeric.integer.base-34.erlang', + 'punctuation.separator.base-integer.erlang', + 'constant.numeric.integer.base-34.erlang' ], + regex: '(34)(#)([\\da-xA-X]+)' }, + { token: + [ 'constant.numeric.integer.base-35.erlang', + 'punctuation.separator.base-integer.erlang', + 'constant.numeric.integer.base-35.erlang' ], + regex: '(35)(#)([\\da-yA-Y]+)' }, + { token: + [ 'constant.numeric.integer.base-36.erlang', + 'punctuation.separator.base-integer.erlang', + 'constant.numeric.integer.base-36.erlang' ], + regex: '(36)(#)([\\da-zA-Z]+)' }, + { token: 'invalid.illegal.integer.erlang', + regex: '\\d+#[\\da-zA-Z]+' }, + { token: 'constant.numeric.integer.decimal.erlang', + regex: '\\d+' } ] } ], + '#parenthesized-expression': + [ { token: 'punctuation.section.expression.begin.erlang', + regex: '\\(', + push: + [ { token: 'punctuation.section.expression.end.erlang', + regex: '\\)', + next: 'pop' }, + { include: '#everything-else' }, + { defaultToken: 'meta.expression.parenthesized' } ] } ], + '#record-directive': + [ { token: + [ 'meta.directive.record.erlang', + 'punctuation.section.directive.begin.erlang', + 'meta.directive.record.erlang', + 'keyword.control.directive.import.erlang', + 'meta.directive.record.erlang', + 'punctuation.definition.parameters.begin.erlang', + 'meta.directive.record.erlang', + 'entity.name.type.class.record.definition.erlang', + 'meta.directive.record.erlang', + 'punctuation.separator.parameters.erlang' ], + regex: '^(\\s*)(-)(\\s*)(record)(\\s*)(\\()(\\s*)([a-z][a-zA-Z\\d@_]*|\'[^\']*\')(\\s*)(,)', + push: + [ { token: + [ 'punctuation.definition.class.record.end.erlang', + 'meta.directive.record.erlang', + 'punctuation.definition.parameters.end.erlang', + 'meta.directive.record.erlang', + 'punctuation.section.directive.end.erlang' ], + regex: '(\\})(\\s*)(\\))(\\s*)(\\.)', + next: 'pop' }, + { include: '#internal-record-body' }, + { defaultToken: 'meta.directive.record.erlang' } ] } ], + '#record-usage': + [ { token: + [ 'keyword.operator.record.erlang', + 'meta.record-usage.erlang', + 'entity.name.type.class.record.erlang', + 'meta.record-usage.erlang', + 'punctuation.separator.record-field.erlang', + 'meta.record-usage.erlang', + 'variable.other.field.erlang' ], + regex: '(#)(\\s*)([a-z][a-zA-Z\\d@_]*|\'[^\']*\')(\\s*)(\\.)(\\s*)([a-z][a-zA-Z\\d@_]*|\'[^\']*\')' }, + { token: + [ 'keyword.operator.record.erlang', + 'meta.record-usage.erlang', + 'entity.name.type.class.record.erlang' ], + regex: '(#)(\\s*)([a-z][a-zA-Z\\d@_]*|\'[^\']*\')', + push: + [ { token: 'punctuation.definition.class.record.end.erlang', + regex: '\\}', + next: 'pop' }, + { include: '#internal-record-body' }, + { defaultToken: 'meta.record-usage.erlang' } ] } ], + '#string': + [ { token: 'punctuation.definition.string.begin.erlang', + regex: '"', + push: + [ { token: 'punctuation.definition.string.end.erlang', + regex: '"', + next: 'pop' }, + { token: + [ 'punctuation.definition.escape.erlang', + 'constant.character.escape.erlang', + 'punctuation.definition.escape.erlang', + 'constant.character.escape.erlang', + 'constant.character.escape.erlang' ], + regex: '(\\\\)(?:([bdefnrstv\\\\\'"])|(\\^)([@-_])|([0-7]{1,3}))' }, + { token: 'invalid.illegal.string.erlang', regex: '\\\\\\^?.?' }, + { token: + [ 'punctuation.definition.placeholder.erlang', + 'punctuation.separator.placeholder-parts.erlang', + 'constant.other.placeholder.erlang', + 'punctuation.separator.placeholder-parts.erlang', + 'punctuation.separator.placeholder-parts.erlang', + 'constant.other.placeholder.erlang', + 'punctuation.separator.placeholder-parts.erlang', + 'punctuation.separator.placeholder-parts.erlang', + 'punctuation.separator.placeholder-parts.erlang', + 'constant.other.placeholder.erlang', + 'constant.other.placeholder.erlang' ], + regex: '(~)(?:((?:\\-)?)(\\d+)|(\\*))?(?:(\\.)(?:(\\d+)|(\\*)))?(?:(\\.)(?:(\\*)|(.)))?([~cfegswpWPBX#bx\\+ni])' }, + { token: + [ 'punctuation.definition.placeholder.erlang', + 'punctuation.separator.placeholder-parts.erlang', + 'constant.other.placeholder.erlang', + 'constant.other.placeholder.erlang' ], + regex: '(~)((?:\\*)?)((?:\\d+)?)([~du\\-#fsacl])' }, + { token: 'invalid.illegal.string.erlang', regex: '~.?' }, + { defaultToken: 'string.quoted.double.erlang' } ] } ], + '#symbolic-operator': + [ { token: 'keyword.operator.symbolic.erlang', + regex: '\\+\\+|\\+|--|-|\\*|/=|/|=/=|=:=|==|=<|=|<-|<|>=|>|!|::' } ], + '#textual-operator': + [ { token: 'keyword.operator.textual.erlang', + regex: '\\b(?:andalso|band|and|bxor|xor|bor|orelse|or|bnot|not|bsl|bsr|div|rem)\\b' } ], + '#tuple': + [ { token: 'punctuation.definition.tuple.begin.erlang', + regex: '\\{', + push: + [ { token: 'punctuation.definition.tuple.end.erlang', + regex: '\\}', + next: 'pop' }, + { token: 'punctuation.separator.tuple.erlang', regex: ',' }, + { include: '#everything-else' }, + { defaultToken: 'meta.structure.tuple.erlang' } ] } ], + '#variable': + [ { token: [ 'variable.other.erlang', 'variable.language.omitted.erlang' ], + regex: '(_[a-zA-Z\\d@_]+|[A-Z][a-zA-Z\\d@_]*)|(_)' } ] } + + this.normalizeRules(); +}; + +ErlangHighlightRules.metaData = { comment: 'The recognition of function definitions and compiler directives (such as module, record and macro definitions) requires that each of the aforementioned constructs must be the first string inside a line (except for whitespace). Also, the function/module/record/macro names must be given unquoted. -- desp', + fileTypes: [ 'erl', 'hrl' ], + keyEquivalent: '^~E', + name: 'Erlang', + scopeName: 'source.erlang' } + + +oop.inherits(ErlangHighlightRules, TextHighlightRules); + +exports.ErlangHighlightRules = ErlangHighlightRules; +}); + +ace.define('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var line = session.getLine(row); + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i + match[0].length, 1); + } + + if (foldStyle !== "markbeginend") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + +}).call(FoldMode.prototype); + +}); diff --git a/0.0.3_0/ace/mode-forth.js b/0.0.3_0/ace/mode-forth.js new file mode 100644 index 0000000..c0ee36e --- /dev/null +++ b/0.0.3_0/ace/mode-forth.js @@ -0,0 +1,239 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2012, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * + * Contributor(s): + * + * + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/mode/forth', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/forth_highlight_rules', 'ace/mode/folding/cstyle'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var ForthHighlightRules = require("./forth_highlight_rules").ForthHighlightRules; +var FoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + var highlighter = new ForthHighlightRules(); + this.foldingRules = new FoldMode(); + this.$tokenizer = new Tokenizer(highlighter.getRules()); +}; +oop.inherits(Mode, TextMode); + +(function() { + this.lineCommentStart = "(?<=^|\\s)\\.?\\( [^)]*\\)"; + this.blockComment = {start: "/*", end: "*/"}; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/forth_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var ForthHighlightRules = function() { + + this.$rules = { start: [ { include: '#forth' } ], + '#comment': + [ { token: 'comment.line.double-dash.forth', + regex: '(?:^|\\s)--\\s.*$', + comment: 'line comments for iForth' }, + { token: 'comment.line.backslash.forth', + regex: '(?:^|\\s)\\\\[\\s\\S]*$', + comment: 'ANSI line comment' }, + { token: 'comment.line.backslash-g.forth', + regex: '(?:^|\\s)\\\\[Gg] .*$', + comment: 'gForth line comment' }, + { token: 'comment.block.forth', + regex: '(?:^|\\s)\\(\\*(?=\\s|$)', + push: + [ { token: 'comment.block.forth', + regex: '(?:^|\\s)\\*\\)(?=\\s|$)', + next: 'pop' }, + { defaultToken: 'comment.block.forth' } ], + comment: 'multiline comments for iForth' }, + { token: 'comment.block.documentation.forth', + regex: '\\bDOC\\b', + caseInsensitive: true, + push: + [ { token: 'comment.block.documentation.forth', + regex: '\\bENDDOC\\b', + caseInsensitive: true, + next: 'pop' }, + { defaultToken: 'comment.block.documentation.forth' } ], + comment: 'documentation comments for iForth' }, + { token: 'comment.line.parentheses.forth', + regex: '(?:^|\\s)\\.?\\( [^)]*\\)', + comment: 'ANSI line comment' } ], + '#constant': + [ { token: 'constant.language.forth', + regex: '(?:^|\\s)(?:TRUE|FALSE|BL|PI|CELL|C/L|R/O|W/O|R/W)(?=\\s|$)', + caseInsensitive: true}, + { token: 'constant.numeric.forth', + regex: '(?:^|\\s)[$#%]?[-+]?[0-9]+(?:\\.[0-9]*e-?[0-9]+|\\.?[0-9a-fA-F]*)(?=\\s|$)'}, + { token: 'constant.character.forth', + regex: '(?:^|\\s)(?:[&^]\\S|(?:"|\')\\S(?:"|\'))(?=\\s|$)'}], + '#forth': + [ { include: '#constant' }, + { include: '#comment' }, + { include: '#string' }, + { include: '#word' }, + { include: '#variable' }, + { include: '#storage' }, + { include: '#word-def' } ], + '#storage': + [ { token: 'storage.type.forth', + regex: '(?:^|\\s)(?:2CONSTANT|2VARIABLE|ALIAS|CONSTANT|CREATE-INTERPRET/COMPILE[:]?|CREATE|DEFER|FCONSTANT|FIELD|FVARIABLE|USER|VALUE|VARIABLE|VOCABULARY)(?=\\s|$)', + caseInsensitive: true}], + '#string': + [ { token: 'string.quoted.double.forth', + regex: '(ABORT" |BREAK" |\\." |C" |0"|S\\\\?" )([^"]+")', + caseInsensitive: true}, + { token: 'string.unquoted.forth', + regex: '(?:INCLUDE|NEEDS|REQUIRE|USE)[ ]\\S+(?=\\s|$)', + caseInsensitive: true}], + '#variable': + [ { token: 'variable.language.forth', + regex: '\\b(?:I|J)\\b', + caseInsensitive: true } ], + '#word': + [ { token: 'keyword.control.immediate.forth', + regex: '(?:^|\\s)\\[(?:\\?DO|\\+LOOP|AGAIN|BEGIN|DEFINED|DO|ELSE|ENDIF|FOR|IF|IFDEF|IFUNDEF|LOOP|NEXT|REPEAT|THEN|UNTIL|WHILE)\\](?=\\s|$)', + caseInsensitive: true}, + { token: 'keyword.other.immediate.forth', + regex: '(?:^|\\s)(?:COMPILE-ONLY|IMMEDIATE|IS|RESTRICT|TO|WHAT\'S|])(?=\\s|$)', + caseInsensitive: true}, + { token: 'keyword.control.compile-only.forth', + regex: '(?:^|\\s)(?:-DO|\\-LOOP|\\?DO|\\?LEAVE|\\+DO|\\+LOOP|ABORT\\"|AGAIN|AHEAD|BEGIN|CASE|DO|ELSE|ENDCASE|ENDIF|ENDOF|ENDTRY\\-IFERROR|ENDTRY|FOR|IF|IFERROR|LEAVE|LOOP|NEXT|RECOVER|REPEAT|RESTORE|THEN|TRY|U\\-DO|U\\+DO|UNTIL|WHILE)(?=\\s|$)', + caseInsensitive: true}, + { token: 'keyword.other.compile-only.forth', + regex: '(?:^|\\s)(?:\\?DUP-0=-IF|\\?DUP-IF|\\)|\\[|\\[\'\\]|\\[CHAR\\]|\\[COMPILE\\]|\\[IS\\]|\\[TO\\]||DEFERS|DOES>|INTERPRETATION>|OF|POSTPONE)(?=\\s|$)', + caseInsensitive: true}, + { token: 'keyword.other.non-immediate.forth', + regex: '(?:^|\\s)(?:\'|||CHAR|END-STRUCT|INCLUDE[D]?|LOAD|NEEDS|REQUIRE[D]?|REVISION|SEE|STRUCT|THRU|USE)(?=\\s|$)', + caseInsensitive: true}, + { token: 'keyword.other.warning.forth', + regex: '(?:^|\\s)(?:~~|BREAK:|BREAK"|DBG)(?=\\s|$)', + caseInsensitive: true}], + '#word-def': + [ { token: + [ 'keyword.other.compile-only.forth', + 'keyword.other.compile-only.forth', + 'meta.block.forth', + 'entity.name.function.forth' ], + regex: '(:NONAME)|(^:|\\s:)(\\s)(\\S+)(?=\\s|$)', + caseInsensitive: true, + push: + [ { token: 'keyword.other.compile-only.forth', + regex: ';(?:CODE)?', + caseInsensitive: true, + next: 'pop' }, + { include: '#constant' }, + { include: '#comment' }, + { include: '#string' }, + { include: '#word' }, + { include: '#variable' }, + { include: '#storage' }, + { defaultToken: 'meta.block.forth' } ] } ] } + + this.normalizeRules(); +}; + +ForthHighlightRules.metaData = { fileTypes: [ 'frt', 'fs', 'ldr' ], + foldingStartMarker: '/\\*\\*|\\{\\s*$', + foldingStopMarker: '\\*\\*/|^\\s*\\}', + keyEquivalent: '^~F', + name: 'Forth', + scopeName: 'source.forth' } + + +oop.inherits(ForthHighlightRules, TextHighlightRules); + +exports.ForthHighlightRules = ForthHighlightRules; +}); + +ace.define('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var line = session.getLine(row); + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i + match[0].length, 1); + } + + if (foldStyle !== "markbeginend") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + +}).call(FoldMode.prototype); + +}); diff --git a/0.0.3_0/ace/mode-ftl.js b/0.0.3_0/ace/mode-ftl.js new file mode 100644 index 0000000..533f860 --- /dev/null +++ b/0.0.3_0/ace/mode-ftl.js @@ -0,0 +1,907 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2010, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/mode/ftl', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/ftl_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var FtlHighlightRules = require("./ftl_highlight_rules").FtlHighlightRules; + +var Mode = function() { + var highlighter = new FtlHighlightRules(); + this.$tokenizer = new Tokenizer(highlighter.getRules()); +}; +oop.inherits(Mode, TextMode); + +(function() { + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/ftl_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/html_highlight_rules', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var FtlLangHighlightRules = function () { + + var stringBuiltIns = "\\?|substring|cap_first|uncap_first|capitalize|chop_linebreak|date|time|datetime|" + + "ends_with|html|groups|index_of|j_string|js_string|json_string|last_index_of|length|lower_case|" + + "left_pad|right_pad|contains|matches|number|replace|rtf|url|split|starts_with|string|trim|" + + "upper_case|word_list|xhtml|xml"; + var numberBuiltIns = "c|round|floor|ceiling"; + var dateBuiltIns = "iso_[a-z_]+"; + var seqBuiltIns = "first|last|seq_contains|seq_index_of|seq_last_index_of|reverse|size|sort|sort_by|chunk"; + var hashBuiltIns = "keys|values"; + var xmlBuiltIns = "children|parent|root|ancestors|node_name|node_type|node_namespace"; + var expertBuiltIns = "byte|double|float|int|long|short|number_to_date|number_to_time|number_to_datetime|" + + "eval|has_content|interpret|is_[a-z_]+|namespacenew"; + var allBuiltIns = stringBuiltIns + numberBuiltIns + dateBuiltIns + seqBuiltIns + hashBuiltIns + + xmlBuiltIns + expertBuiltIns; + + var deprecatedBuiltIns = "default|exists|if_exists|web_safe"; + + var variables = "data_model|error|globals|lang|locale|locals|main|namespace|node|current_node|" + + "now|output_encoding|template_name|url_escaping_charset|vars|version"; + + var operators = "gt|gte|lt|lte|as|in|using"; + + var reserved = "true|false"; + + var attributes = "encoding|parse|locale|number_format|date_format|time_format|datetime_format|time_zone|" + + "url_escaping_charset|classic_compatible|strip_whitespace|strip_text|strict_syntax|ns_prefixes|" + + "attributes"; + + this.$rules = { + "start" : [{ + token : "constant.character.entity", + regex : /&[^;]+;/ + }, { + token : "support.function", + regex : "\\?("+allBuiltIns+")" + }, { + token : "support.function.deprecated", + regex : "\\?("+deprecatedBuiltIns+")" + }, { + token : "language.variable", + regex : "\\.(?:"+variables+")" + }, { + token : "constant.language", + regex : "\\b("+reserved+")\\b" + }, { + token : "keyword.operator", + regex : "\\b(?:"+operators+")\\b" + }, { + token : "entity.other.attribute-name", + regex : attributes + }, { + token : "string", // + regex : /['"]/, + next : "qstring" + }, { + token : function(value) { + if (value.match("^[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?$")) { + return "constant.numeric"; + } else { + return "variable"; + } + }, + regex : /[\w.+\-]+/ + }, { + token : "keyword.operator", + regex : "!|\\.|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=" + }, { + token : "paren.lparen", + regex : "[[({]" + }, { + token : "paren.rparen", + regex : "[\\])}]" + }, { + token : "text", + regex : "\\s+" + }], + + "qstring" : [{ + token : "constant.character.escape", + regex : '\\\\[nrtvef\\\\"$]' + }, { + token : "string", + regex : /['"]/, + next : "start" + }, { + defaultToken : "string" + }] + }; +}; + +oop.inherits(FtlLangHighlightRules, TextHighlightRules); + +var FtlHighlightRules = function() { + var directives = "assign|attempt|break|case|compress|default|elseif|else|escape|fallback|function|flush|" + + "ftl|global|if|import|include|list|local|lt|macro|nested|noescape|noparse|nt|recover|recurse|return|rt|" + + "setting|stop|switch|t|visit"; + + HtmlHighlightRules.call(this); + + for (var i in this.$rules) { + this.$rules[i].unshift({ + token : "string.interpolated", + regex : "\\${", + push : "ftl-start" + }, { + token : "keyword.function", + regex : "", + next : "pop" + }, { + token : "string.interpolated", + regex : "}", + next : "pop" + }); + + this.$rules.start.unshift({ + token : "comment", + regex : "<#--", + next : "comment" + }); + + this.$rules.comment.unshift({ + token : "comment", + regex : ".*?-->", + next : "start" + }, { + token : "comment", + regex : ".+" + }); + + this.normalizeRules(); +}; + +oop.inherits(FtlHighlightRules, HtmlHighlightRules); + +exports.FtlHighlightRules = FtlHighlightRules; +}); + +ace.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_util', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var xmlUtil = require("./xml_util"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var tagMap = lang.createMap({ + a : 'anchor', + button : 'form', + form : 'form', + img : 'image', + input : 'form', + label : 'form', + script : 'script', + select : 'form', + textarea : 'form', + style : 'style', + table : 'table', + tbody : 'table', + td : 'table', + tfoot : 'table', + th : 'table', + tr : 'table' +}); + +var HtmlHighlightRules = function() { + this.$rules = { + start : [{ + token : "text", + regex : "<\\!\\[CDATA\\[", + next : "cdata" + }, { + token : "xml-pe", + regex : "<\\?.*?\\?>" + }, { + token : "comment", + regex : "<\\!--", + next : "comment" + }, { + token : "xml-pe", + regex : "<\\!.*?>" + }, { + token : "meta.tag", + regex : "<(?=script\\b)", + next : "script" + }, { + token : "meta.tag", + regex : "<(?=style\\b)", + next : "style" + }, { + token : "meta.tag", // opening tag + regex : "<\\/?(?=\\S)", + next : "tag" + }, { + token : "text", + regex : "\\s+" + }, { + token : "constant.character.entity", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }], + + cdata : [ { + token : "text", + regex : "\\]\\]>", + next : "start" + } ], + + comment : [ { + token : "comment", + regex : ".*?-->", + next : "start" + }, { + defaultToken : "comment" + } ] + }; + + xmlUtil.tag(this.$rules, "tag", "start", tagMap); + xmlUtil.tag(this.$rules, "style", "css-start", tagMap); + xmlUtil.tag(this.$rules, "script", "js-start", tagMap); + + this.embedRules(JavaScriptHighlightRules, "js-", [{ + token: "comment", + regex: "\\/\\/.*(?=<\\/script>)", + next: "tag" + }, { + token: "meta.tag", + regex: "<\\/(?=script)", + next: "tag" + }]); + + this.embedRules(CssHighlightRules, "css-", [{ + token: "meta.tag", + regex: "<\\/(?=style)", + next: "tag" + }]); +}; + +oop.inherits(HtmlHighlightRules, TextHighlightRules); + +exports.HtmlHighlightRules = HtmlHighlightRules; +}); + +ace.define('ace/mode/css_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var supportType = exports.supportType = "animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|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|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|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|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index"; +var supportFunction = exports.supportFunction = "rgb|rgba|url|attr|counter|counters"; +var supportConstant = exports.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"; +var supportConstantColor = exports.supportConstantColor = "aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow"; +var supportConstantFonts = exports.supportConstantFonts = "arial|century|comic|courier|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace"; + +var numRe = exports.numRe = "\\-?(?:(?:[0-9]+)|(?:[0-9]*\\.[0-9]+))"; +var pseudoElements = exports.pseudoElements = "(\\:+)\\b(after|before|first-letter|first-line|moz-selection|selection)\\b"; +var pseudoClasses = exports.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"; + +var CssHighlightRules = function() { + + var keywordMapper = this.createKeywordMapper({ + "support.function": supportFunction, + "support.constant": supportConstant, + "support.type": supportType, + "support.constant.color": supportConstantColor, + "support.constant.fonts": supportConstantFonts + }, "text", true); + + var base_ruleset = [ + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "ruleset_comment" + }, { + token : "string", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' + }, { + token : "string", // single line + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" + }, { + token : ["constant.numeric", "keyword"], + regex : "(" + numRe + ")(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 : numRe + }, { + token : "constant.numeric", // hex6 color + regex : "#[a-f0-9]{6}" + }, { + token : "constant.numeric", // hex3 color + regex : "#[a-f0-9]{3}" + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"], + regex : pseudoElements + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"], + regex : pseudoClasses + }, { + token : ["support.function", "string", "support.function"], + regex : "(url\\()(.*)(\\))" + }, { + token : keywordMapper, + regex : "\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*" + }, { + caseInsensitive: true + } + ]; + + var ruleset = lang.copyArray(base_ruleset); + ruleset.unshift({ + token : "paren.rparen", + regex : "\\}", + next: "start" + }); + + var media_ruleset = lang.copyArray( base_ruleset ); + media_ruleset.unshift({ + token : "paren.rparen", + regex : "\\}", + next: "media" + }); + + var base_comment = [{ + token : "comment", // comment spanning whole line + regex : ".+" + }]; + + var comment = lang.copyArray(base_comment); + comment.unshift({ + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "start" + }); + + var media_comment = lang.copyArray(base_comment); + media_comment.unshift({ + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "media" + }); + + var ruleset_comment = lang.copyArray(base_comment); + ruleset_comment.unshift({ + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "ruleset" + }); + + this.$rules = { + "start" : [{ + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment" + }, { + token: "paren.lparen", + regex: "\\{", + next: "ruleset" + }, { + token: "string", + regex: "@.*?{", + next: "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: true + }], + + "media" : [ { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "media_comment" + }, { + token: "paren.lparen", + regex: "\\{", + next: "media_ruleset" + },{ + token: "string", + regex: "\\}", + next: "start" + },{ + 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: true + }], + + "comment" : comment, + + "ruleset" : ruleset, + "ruleset_comment" : ruleset_comment, + + "media_ruleset" : media_ruleset, + "media_comment" : media_comment + }; +}; + +oop.inherits(CssHighlightRules, TextHighlightRules); + +exports.CssHighlightRules = CssHighlightRules; + +}); + +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(require, exports, module) { + + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var JavaScriptHighlightRules = function() { + var keywordMapper = this.createKeywordMapper({ + "variable.language": + "Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|" + // Constructors + "Namespace|QName|XML|XMLList|" + // E4X + "ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|" + + "Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|" + + "Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|" + // Errors + "SyntaxError|TypeError|URIError|" + + "decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|" + // Non-constructor functions + "isNaN|parseFloat|parseInt|" + + "JSON|Math|" + // Other + "this|arguments|prototype|window|document" , // Pseudo + "keyword": + "const|yield|import|get|set|" + + "break|case|catch|continue|default|delete|do|else|finally|for|function|" + + "if|in|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"); + var kwBeforeRe = "case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void"; + var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*\\b"; + + var escapedRe = "\\\\(?:x[0-9a-fA-F]{2}|" + // hex + "u[0-9a-fA-F]{4}|" + // unicode + "[0-2][0-7]{0,2}|" + // oct + "3[0-6][0-7]?|" + // oct + "37[0-7]?|" + // oct + "[4-7][0-7]?|" + //oct + ".)"; + + this.$rules = { + "no_regex" : [ + { + token : "comment", + regex : /\/\/.*$/ + }, + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : /\/\*/, + next : "comment" + }, { + token : "string", + regex : "'(?=.)", + next : "qstring" + }, { + token : "string", + regex : '"(?=.)', + next : "qqstring" + }, { + token : "constant.numeric", // hex + regex : /0[xX][0-9a-fA-F]+\b/ + }, { + token : "constant.numeric", // float + regex : /[+-]?\d+(?:(?:\.\d*)?(?:[eE][+-]?\d+)?)?\b/ + }, { + token : [ + "storage.type", "punctuation.operator", "support.function", + "punctuation.operator", "entity.name.function", "text","keyword.operator" + ], + regex : "(" + identifierRe + ")(\\.)(prototype)(\\.)(" + identifierRe +")(\\s*)(=)", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "keyword.operator", "text", "storage.type", + "text", "paren.lparen" + ], + regex : "(" + identifierRe +")(\\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 : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(function)(\\s+)(" + identifierRe + ")(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "punctuation.operator", + "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\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 : "(?:" + kwBeforeRe + ")\\b", + next : "start" + }, { + token : ["punctuation.operator", "support.function"], + regex : /(\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:opzzzz|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 : ["punctuation.operator", "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)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/ + }, { + token : ["punctuation.operator", "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 : ["storage.type", "punctuation.operator", "support.function.firebug"], + regex : /(console)(\.)(warn|info|log|error|time|timeEnd|assert)\b/ + }, { + token : keywordMapper, + regex : identifierRe + }, { + token : "keyword.operator", + regex : /--|\+\+|[!$%&*+\-~]|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\|\||\?\:|\*=|%=|\+=|\-=|&=|\^=/, + next : "start" + }, { + token : "punctuation.operator", + regex : /\?|\:|\,|\;|\./, + next : "start" + }, { + token : "paren.lparen", + regex : /[\[({]/, + next : "start" + }, { + token : "paren.rparen", + regex : /[\])}]/ + }, { + token : "keyword.operator", + regex : /\/=?/, + next : "start" + }, { + token: "comment", + regex: /^#!.*$/ + } + ], + "start": [ + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment_regex_allowed" + }, { + token : "comment", + regex : "\\/\\/.*$", + next : "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: "/\\w*", + 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.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: identifierRe + }, { + token: "punctuation.operator", + regex: "[, ]+" + }, { + token: "punctuation.operator", + regex: "$" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "comment_regex_allowed" : [ + {token : "comment", regex : "\\*\\/", next : "start"}, + {defaultToken : "comment"} + ], + "comment" : [ + {token : "comment", regex : "\\*\\/", next : "no_regex"}, + {defaultToken : "comment"} + ], + "qqstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + next : "qqstring" + }, { + token : "string", + regex : '"|$', + next : "no_regex" + }, { + defaultToken: "string" + } + ], + "qstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + next : "qstring" + }, { + token : "string", + regex : "'|$", + next : "no_regex" + }, { + defaultToken: "string" + } + ] + }; + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("no_regex") ]); +}; + +oop.inherits(JavaScriptHighlightRules, TextHighlightRules); + +exports.JavaScriptHighlightRules = JavaScriptHighlightRules; +}); + +ace.define('ace/mode/doc_comment_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, { + token : "comment.doc.tag", + regex : "\\bTODO\\b" + }, { + defaultToken : "comment.doc" + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define('ace/mode/xml_util', ['require', 'exports', 'module' ], function(require, exports, module) { + + +function string(state) { + return [{ + token : "string", + regex : '"', + next : state + "_qqstring" + }, { + token : "string", + regex : "'", + next : state + "_qstring" + }]; +} + +function multiLineString(quote, state) { + return [ + {token : "string", regex : quote, next : state}, + { + token : "constant.language.escape", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }, + {defaultToken : "string"} + ]; +} + +exports.tag = function(states, name, nextState, tagMap) { + states[name] = [{ + token : "text", + regex : "\\s+" + }, { + + token : !tagMap ? "meta.tag.tag-name" : function(value) { + if (tagMap[value]) + return "meta.tag.tag-name." + tagMap[value]; + else + return "meta.tag.tag-name"; + }, + regex : "[-_a-zA-Z0-9:]+", + next : name + "_embed_attribute_list" + }, { + token: "empty", + regex: "", + next : name + "_embed_attribute_list" + }]; + + states[name + "_qstring"] = multiLineString("'", name + "_embed_attribute_list"); + states[name + "_qqstring"] = multiLineString("\"", name + "_embed_attribute_list"); + + states[name + "_embed_attribute_list"] = [{ + token : "meta.tag.r", + regex : "/?>", + next : nextState + }, { + token : "keyword.operator", + regex : "=" + }, { + token : "entity.other.attribute-name", + regex : "[-_a-zA-Z0-9:]+" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : "text", + regex : "\\s+" + }].concat(string(name)); +}; + +}); diff --git a/0.0.3_0/ace/mode-glsl.js b/0.0.3_0/ace/mode-glsl.js new file mode 100644 index 0000000..343b1fe --- /dev/null +++ b/0.0.3_0/ace/mode-glsl.js @@ -0,0 +1,810 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2010, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/mode/glsl', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/c_cpp', 'ace/tokenizer', 'ace/mode/glsl_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/range', 'ace/mode/behaviour/cstyle', 'ace/mode/folding/cstyle'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var CMode = require("./c_cpp").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var glslHighlightRules = require("./glsl_highlight_rules").glslHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var Range = require("../range").Range; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new glslHighlightRules().getRules()); + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, CMode); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/c_cpp', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/c_cpp_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/range', 'ace/mode/behaviour/cstyle', 'ace/mode/folding/cstyle'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var c_cppHighlightRules = require("./c_cpp_highlight_rules").c_cppHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var Range = require("../range").Range; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new c_cppHighlightRules().getRules()); + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.$tokenizer.getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start") { + var match = line.match(/^.*[\{\(\[]\s*$/); + if (match) { + indent += tab; + } + } else if (state == "doc-start") { + if (endState == "start") { + return ""; + } + var match = line.match(/^\s*(\/?)\*/); + if (match) { + if (match[1]) { + indent += " "; + } + indent += "* "; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); +ace.define('ace/mode/c_cpp_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/doc_comment_highlight_rules', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var cFunctions = exports.cFunctions = "\\s*\\bhypot(?:f|l)?|s(?:scanf|ystem|nprintf|ca(?:nf|lb(?:n(?:f|l)?|ln(?:f|l)?))|i(?:n(?:h(?:f|l)?|f|l)?|gn(?:al|bit))|tr(?:s(?:tr|pn)|nc(?:py|at|mp)|c(?:spn|hr|oll|py|at|mp)|to(?:imax|d|u(?:l(?:l)?|max)|k|f|l(?:d|l)?)|error|pbrk|ftime|len|rchr|xfrm)|printf|et(?:jmp|vbuf|locale|buf)|qrt(?:f|l)?|w(?:scanf|printf)|rand)|n(?:e(?:arbyint(?:f|l)?|xt(?:toward(?:f|l)?|after(?:f|l)?))|an(?:f|l)?)|c(?:s(?:in(?:h(?:f|l)?|f|l)?|qrt(?:f|l)?)|cos(?:h(?:f)?|f|l)?|imag(?:f|l)?|t(?:ime|an(?:h(?:f|l)?|f|l)?)|o(?:s(?:h(?:f|l)?|f|l)?|nj(?:f|l)?|pysign(?:f|l)?)|p(?:ow(?:f|l)?|roj(?:f|l)?)|e(?:il(?:f|l)?|xp(?:f|l)?)|l(?:o(?:ck|g(?:f|l)?)|earerr)|a(?:sin(?:h(?:f|l)?|f|l)?|cos(?:h(?:f|l)?|f|l)?|tan(?:h(?:f|l)?|f|l)?|lloc|rg(?:f|l)?|bs(?:f|l)?)|real(?:f|l)?|brt(?:f|l)?)|t(?:ime|o(?:upper|lower)|an(?:h(?:f|l)?|f|l)?|runc(?:f|l)?|gamma(?:f|l)?|mp(?:nam|file))|i(?:s(?:space|n(?:ormal|an)|cntrl|inf|digit|u(?:nordered|pper)|p(?:unct|rint)|finite|w(?:space|c(?:ntrl|type)|digit|upper|p(?:unct|rint)|lower|al(?:num|pha)|graph|xdigit|blank)|l(?:ower|ess(?:equal|greater)?)|al(?:num|pha)|gr(?:eater(?:equal)?|aph)|xdigit|blank)|logb(?:f|l)?|max(?:div|abs))|di(?:v|fftime)|_Exit|unget(?:c|wc)|p(?:ow(?:f|l)?|ut(?:s|c(?:har)?|wc(?:har)?)|error|rintf)|e(?:rf(?:c(?:f|l)?|f|l)?|x(?:it|p(?:2(?:f|l)?|f|l|m1(?:f|l)?)?))|v(?:s(?:scanf|nprintf|canf|printf|w(?:scanf|printf))|printf|f(?:scanf|printf|w(?:scanf|printf))|w(?:scanf|printf)|a_(?:start|copy|end|arg))|qsort|f(?:s(?:canf|e(?:tpos|ek))|close|tell|open|dim(?:f|l)?|p(?:classify|ut(?:s|c|w(?:s|c))|rintf)|e(?:holdexcept|set(?:e(?:nv|xceptflag)|round)|clearexcept|testexcept|of|updateenv|r(?:aiseexcept|ror)|get(?:e(?:nv|xceptflag)|round))|flush|w(?:scanf|ide|printf|rite)|loor(?:f|l)?|abs(?:f|l)?|get(?:s|c|pos|w(?:s|c))|re(?:open|e|ad|xp(?:f|l)?)|m(?:in(?:f|l)?|od(?:f|l)?|a(?:f|l|x(?:f|l)?)?))|l(?:d(?:iv|exp(?:f|l)?)|o(?:ngjmp|cal(?:time|econv)|g(?:1(?:p(?:f|l)?|0(?:f|l)?)|2(?:f|l)?|f|l|b(?:f|l)?)?)|abs|l(?:div|abs|r(?:int(?:f|l)?|ound(?:f|l)?))|r(?:int(?:f|l)?|ound(?:f|l)?)|gamma(?:f|l)?)|w(?:scanf|c(?:s(?:s(?:tr|pn)|nc(?:py|at|mp)|c(?:spn|hr|oll|py|at|mp)|to(?:imax|d|u(?:l(?:l)?|max)|k|f|l(?:d|l)?|mbs)|pbrk|ftime|len|r(?:chr|tombs)|xfrm)|to(?:b|mb)|rtomb)|printf|mem(?:set|c(?:hr|py|mp)|move))|a(?:s(?:sert|ctime|in(?:h(?:f|l)?|f|l)?)|cos(?:h(?:f|l)?|f|l)?|t(?:o(?:i|f|l(?:l)?)|exit|an(?:h(?:f|l)?|2(?:f|l)?|f|l)?)|b(?:s|ort))|g(?:et(?:s|c(?:har)?|env|wc(?:har)?)|mtime)|r(?:int(?:f|l)?|ound(?:f|l)?|e(?:name|alloc|wind|m(?:ove|quo(?:f|l)?|ainder(?:f|l)?))|a(?:nd|ise))|b(?:search|towc)|m(?:odf(?:f|l)?|em(?:set|c(?:hr|py|mp)|move)|ktime|alloc|b(?:s(?:init|towcs|rtowcs)|towc|len|r(?:towc|len)))\\b" + +var c_cppHighlightRules = function() { + + var keywordControls = ( + "break|case|continue|default|do|else|for|goto|if|_Pragma|" + + "return|switch|while|catch|operator|try|throw|using" + ); + + var storageType = ( + "asm|__asm__|auto|bool|_Bool|char|_Complex|double|enum|float|" + + "_Imaginary|int|long|short|signed|struct|typedef|union|unsigned|void|" + + "class|wchar_t|template" + ); + + var storageModifiers = ( + "const|extern|register|restrict|static|volatile|inline|private:|" + + "protected:|public:|friend|explicit|virtual|export|mutable|typename" + ); + + var keywordOperators = ( + "and|and_eq|bitand|bitor|compl|not|not_eq|or|or_eq|typeid|xor|xor_eq" + + "const_cast|dynamic_cast|reinterpret_cast|static_cast|sizeof|namespace" + ); + + var builtinConstants = ( + "NULL|true|false|TRUE|FALSE" + ); + + var keywordMapper = this.$keywords = this.createKeywordMapper({ + "keyword.control" : keywordControls, + "storage.type" : storageType, + "storage.modifier" : storageModifiers, + "keyword.operator" : keywordOperators, + "variable.language": "this", + "constant.language": builtinConstants + }, "identifier"); + + var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\d\\$_\u00a1-\uffff]*\\b"; + + this.$rules = { + "start" : [ + { + token : "comment", + regex : "\\/\\/.*$" + }, + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment" + }, { + token : "string", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' + }, { + token : "string", // multi line string start + regex : '["].*\\\\$', + next : "qqstring" + }, { + token : "string", // single line + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" + }, { + token : "string", // multi line string start + regex : "['].*\\\\$", + next : "qstring" + }, { + token : "constant.numeric", // hex + regex : "0[xX][0-9a-fA-F]+(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\b" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\b" + }, { + token : "keyword", // pre-compiler directives + regex : "#\\s*(?:include|import|pragma|line|define|undef|if|ifdef|else|elif|ifndef)\\b", + next : "directive" + }, { + token : "keyword", // special case pre-compiler directive + regex : "(?:#\\s*endif)\\b" + }, { + token : "support.function.C99.c", + regex : cFunctions + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "keyword.operator", + regex : "!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|==|=|!=|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|new|delete|typeof|void)" + }, { + token : "punctuation.operator", + regex : "\\?|\\:|\\,|\\;|\\." + }, { + token : "paren.lparen", + regex : "[[({]" + }, { + token : "paren.rparen", + regex : "[\\])}]" + }, { + token : "text", + regex : "\\s+" + } + ], + "comment" : [ + { + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "start" + }, { + token : "comment", // comment spanning whole line + regex : ".+" + } + ], + "qqstring" : [ + { + token : "string", + regex : '(?:(?:\\\\.)|(?:[^"\\\\]))*?"', + next : "start" + }, { + token : "string", + regex : '.+' + } + ], + "qstring" : [ + { + token : "string", + regex : "(?:(?:\\\\.)|(?:[^'\\\\]))*?'", + next : "start" + }, { + token : "string", + regex : '.+' + } + ], + "directive" : [ + { + token : "constant.other.multiline", + regex : /\\/ + }, + { + token : "constant.other.multiline", + regex : /.*\\/ + }, + { + token : "constant.other", + regex : "\\s*<.+?>", + next : "start" + }, + { + token : "constant.other", // single line + regex : '\\s*["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]', + next : "start" + }, + { + token : "constant.other", // single line + regex : "\\s*['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']", + next : "start" + }, + { + token : "constant.other", + regex : /[^\\\/]+/, + next : "start" + } + ] + }; + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("start") ]); +}; + +oop.inherits(c_cppHighlightRules, TextHighlightRules); + +exports.c_cppHighlightRules = c_cppHighlightRules; +}); + +ace.define('ace/mode/doc_comment_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, { + token : "comment.doc.tag", + regex : "\\bTODO\\b" + }, { + defaultToken : "comment.doc" + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) { + + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define('ace/mode/behaviour/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/token_iterator', 'ace/lib/lang'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; +var lang = require("../../lib/lang"); + +var SAFE_INSERT_IN_TOKENS = + ["text", "paren.rparen", "punctuation.operator"]; +var SAFE_INSERT_BEFORE_TOKENS = + ["text", "paren.rparen", "punctuation.operator", "comment"]; + + +var autoInsertedBrackets = 0; +var autoInsertedRow = -1; +var autoInsertedLineEnd = ""; +var maybeInsertedBrackets = 0; +var maybeInsertedRow = -1; +var maybeInsertedLineStart = ""; +var maybeInsertedLineEnd = ""; + +var CstyleBehaviour = function () { + + CstyleBehaviour.isSaneInsertion = function(editor, session) { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + if (!this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) { + var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1); + if (!this.$matchTokenType(iterator2.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) + return false; + } + iterator.stepForward(); + return iterator.getCurrentTokenRow() !== cursor.row || + this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_BEFORE_TOKENS); + }; + + CstyleBehaviour.$matchTokenType = function(token, types) { + return types.indexOf(token.type || token) > -1; + }; + + CstyleBehaviour.recordAutoInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isAutoInsertedClosing(cursor, line, autoInsertedLineEnd[0])) + autoInsertedBrackets = 0; + autoInsertedRow = cursor.row; + autoInsertedLineEnd = bracket + line.substr(cursor.column); + autoInsertedBrackets++; + }; + + CstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isMaybeInsertedClosing(cursor, line)) + maybeInsertedBrackets = 0; + maybeInsertedRow = cursor.row; + maybeInsertedLineStart = line.substr(0, cursor.column) + bracket; + maybeInsertedLineEnd = line.substr(cursor.column); + maybeInsertedBrackets++; + }; + + CstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) { + return autoInsertedBrackets > 0 && + cursor.row === autoInsertedRow && + bracket === autoInsertedLineEnd[0] && + line.substr(cursor.column) === autoInsertedLineEnd; + }; + + CstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) { + return maybeInsertedBrackets > 0 && + cursor.row === maybeInsertedRow && + line.substr(cursor.column) === maybeInsertedLineEnd && + line.substr(0, cursor.column) == maybeInsertedLineStart; + }; + + CstyleBehaviour.popAutoInsertedClosing = function() { + autoInsertedLineEnd = autoInsertedLineEnd.substr(1); + autoInsertedBrackets--; + }; + + CstyleBehaviour.clearMaybeInsertedClosing = function() { + maybeInsertedBrackets = 0; + maybeInsertedRow = -1; + }; + + this.add("braces", "insertion", function (state, action, editor, session, text) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (text == '{') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "{" && editor.getWrapBehavioursEnabled()) { + return { + text: '{' + selected + '}', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + if (/[\]\}\)]/.test(line[cursor.column])) { + CstyleBehaviour.recordAutoInsert(editor, session, "}"); + return { + text: '{}', + selection: [1, 1] + }; + } else { + CstyleBehaviour.recordMaybeInsert(editor, session, "{"); + return { + text: '{', + selection: [1, 1] + }; + } + } + } else if (text == '}') { + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}') { + var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } else if (text == "\n" || text == "\r\n") { + var closing = ""; + if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) { + closing = lang.stringRepeat("}", maybeInsertedBrackets); + CstyleBehaviour.clearMaybeInsertedClosing(); + } + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}' || closing !== "") { + var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column}, '}'); + if (!openBracePos) + return null; + + var indent = this.getNextLineIndent(state, line.substring(0, cursor.column), session.getTabString()); + var next_indent = this.$getIndent(line); + + return { + text: '\n' + indent + '\n' + next_indent + closing, + selection: [1, indent.length, 1, indent.length] + }; + } + } + }); + + this.add("braces", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '{') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar == '}') { + range.end.column++; + return range; + } else { + maybeInsertedBrackets--; + } + } + }); + + this.add("parens", "insertion", function (state, action, editor, session, text) { + if (text == '(') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return { + text: '(' + selected + ')', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, ")"); + return { + text: '()', + selection: [1, 1] + }; + } + } else if (text == ')') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ')') { + var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("parens", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '(') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ')') { + range.end.column++; + return range; + } + } + }); + + this.add("brackets", "insertion", function (state, action, editor, session, text) { + if (text == '[') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return { + text: '[' + selected + ']', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, "]"); + return { + text: '[]', + selection: [1, 1] + }; + } + } else if (text == ']') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ']') { + var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("brackets", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '[') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ']') { + range.end.column++; + return range; + } + } + }); + + this.add("string_dquotes", "insertion", function (state, action, editor, session, text) { + if (text == '"' || text == "'") { + var quote = text; + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "'" && selected != '"' && editor.getWrapBehavioursEnabled()) { + return { + text: quote + selected + quote, + selection: false + }; + } else { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var leftChar = line.substring(cursor.column-1, cursor.column); + if (leftChar == '\\') { + return null; + } + var tokens = session.getTokens(selection.start.row); + var col = 0, token; + var quotepos = -1; // Track whether we're inside an open quote. + + for (var x = 0; x < tokens.length; x++) { + token = tokens[x]; + if (token.type == "string") { + quotepos = -1; + } else if (quotepos < 0) { + quotepos = token.value.indexOf(quote); + } + if ((token.value.length + col) > selection.start.column) { + break; + } + col += tokens[x].value.length; + } + if (!token || (quotepos < 0 && token.type !== "comment" && (token.type !== "string" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) { + if (!CstyleBehaviour.isSaneInsertion(editor, session)) + return; + return { + text: quote + quote, + selection: [1,1] + }; + } else if (token && token.type === "string") { + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == quote) { + return { + text: '', + selection: [1, 1] + }; + } + } + } + } + }); + + this.add("string_dquotes", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && (selected == '"' || selected == "'")) { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == selected) { + range.end.column++; + return range; + } + } + }); + +}; + +oop.inherits(CstyleBehaviour, Behaviour); + +exports.CstyleBehaviour = CstyleBehaviour; +}); + +ace.define('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var line = session.getLine(row); + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i + match[0].length, 1); + } + + if (foldStyle !== "markbeginend") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define('ace/mode/glsl_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/c_cpp_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var c_cppHighlightRules = require("./c_cpp_highlight_rules").c_cppHighlightRules; + +var glslHighlightRules = function() { + + var keywords = ( + "attribute|const|uniform|varying|break|continue|do|for|while|" + + "if|else|in|out|inout|float|int|void|bool|true|false|" + + "lowp|mediump|highp|precision|invariant|discard|return|mat2|mat3|" + + "mat4|vec2|vec3|vec4|ivec2|ivec3|ivec4|bvec2|bvec3|bvec4|sampler2D|" + + "samplerCube|struct" + ); + + var buildinConstants = ( + "radians|degrees|sin|cos|tan|asin|acos|atan|pow|" + + "exp|log|exp2|log2|sqrt|inversesqrt|abs|sign|floor|ceil|fract|mod|" + + "min|max|clamp|mix|step|smoothstep|length|distance|dot|cross|" + + "normalize|faceforward|reflect|refract|matrixCompMult|lessThan|" + + "lessThanEqual|greaterThan|greaterThanEqual|equal|notEqual|any|all|" + + "not|dFdx|dFdy|fwidth|texture2D|texture2DProj|texture2DLod|" + + "texture2DProjLod|textureCube|textureCubeLod|" + + "gl_MaxVertexAttribs|gl_MaxVertexUniformVectors|gl_MaxVaryingVectors|" + + "gl_MaxVertexTextureImageUnits|gl_MaxCombinedTextureImageUnits|" + + "gl_MaxTextureImageUnits|gl_MaxFragmentUniformVectors|gl_MaxDrawBuffers|" + + "gl_DepthRangeParameters|gl_DepthRange|" + + "gl_Position|gl_PointSize|" + + "gl_FragCoord|gl_FrontFacing|gl_PointCoord|gl_FragColor|gl_FragData" + ); + + var keywordMapper = this.createKeywordMapper({ + "variable.language": "this", + "keyword": keywords, + "constant.language": buildinConstants + }, "identifier"); + + this.$rules = new c_cppHighlightRules().$rules; + this.$rules.start.forEach(function(rule) { + if (typeof rule.token == "function") + rule.token = keywordMapper; + }) +}; + +oop.inherits(glslHighlightRules, c_cppHighlightRules); + +exports.glslHighlightRules = glslHighlightRules; +}); diff --git a/0.0.3_0/ace/mode-golang.js b/0.0.3_0/ace/mode-golang.js new file mode 100644 index 0000000..3648d7f --- /dev/null +++ b/0.0.3_0/ace/mode-golang.js @@ -0,0 +1,632 @@ +ace.define('ace/mode/golang', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/golang_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/mode/behaviour/cstyle', 'ace/mode/folding/cstyle'], function(require, exports, module) { + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var GolangHighlightRules = require("./golang_highlight_rules").GolangHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new GolangHighlightRules().getRules()); + this.$outdent = new MatchingBraceOutdent(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.$tokenizer.getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start") { + var match = line.match(/^.*[\{\(\[]\s*$/); + if (match) { + indent += tab; + } + } + + return indent; + };//end getNextLineIndent + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); +ace.define('ace/mode/golang_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/doc_comment_highlight_rules', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + var oop = require("../lib/oop"); + var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; + var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + + var GolangHighlightRules = function() { + var keywords = ( + "true|else|false|break|case|return|goto|if|const|" + + "continue|struct|default|switch|for|" + + "func|import|package|chan|defer|fallthrough|go|interface|map|range" + + "select|type|var" + ); + var buildinConstants = ("nil|true|false|iota"); + + var keywordMapper = this.createKeywordMapper({ + "variable.language": "this", + "keyword": keywords, + "constant.language": buildinConstants + }, "identifier"); + + this.$rules = { + "start" : [ + { + token : "comment", + regex : "\\/\\/.*$" + }, + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment" + }, { + token : "string", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' + }, { + token : "string", // multi line string start + regex : '["].*\\\\$', + next : "qqstring" + }, { + token : "string", // single line + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" + }, { + token : "string", // multi line string start + regex : "['].*\\\\$", + next : "qstring" + }, { + token : "constant.numeric", // hex + regex : "0[xX][0-9a-fA-F]+\\b" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : "constant", // + regex : "<[a-zA-Z0-9.]+>" + }, { + token : "keyword", // pre-compiler directivs + regex : "(?:#include|#pragma|#line|#define|#undef|#ifdef|#else|#elif|#endif|#ifndef)" + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "keyword.operator", + regex : "!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|==|=|!=|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|new|delete|typeof|void)" + }, { + token : "punctuation.operator", + regex : "\\?|\\:|\\,|\\;|\\." + }, { + token : "paren.lparen", + regex : "[[({]" + }, { + token : "paren.rparen", + regex : "[\\])}]" + }, { + token : "text", + regex : "\\s+" + } + ], + "comment" : [ + { + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "start" + }, { + token : "comment", // comment spanning whole line + regex : ".+" + } + ], + "qqstring" : [ + { + token : "string", + regex : '(?:(?:\\\\.)|(?:[^"\\\\]))*?"', + next : "start" + }, { + token : "string", + regex : '.+' + } + ], + "qstring" : [ + { + token : "string", + regex : "(?:(?:\\\\.)|(?:[^'\\\\]))*?'", + next : "start" + }, { + token : "string", + regex : '.+' + } + ] + }; + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("start") ]); + } + oop.inherits(GolangHighlightRules, TextHighlightRules); + + exports.GolangHighlightRules = GolangHighlightRules; +}); + +ace.define('ace/mode/doc_comment_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, { + token : "comment.doc.tag", + regex : "\\bTODO\\b" + }, { + defaultToken : "comment.doc" + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) { + + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define('ace/mode/behaviour/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/token_iterator', 'ace/lib/lang'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; +var lang = require("../../lib/lang"); + +var SAFE_INSERT_IN_TOKENS = + ["text", "paren.rparen", "punctuation.operator"]; +var SAFE_INSERT_BEFORE_TOKENS = + ["text", "paren.rparen", "punctuation.operator", "comment"]; + + +var autoInsertedBrackets = 0; +var autoInsertedRow = -1; +var autoInsertedLineEnd = ""; +var maybeInsertedBrackets = 0; +var maybeInsertedRow = -1; +var maybeInsertedLineStart = ""; +var maybeInsertedLineEnd = ""; + +var CstyleBehaviour = function () { + + CstyleBehaviour.isSaneInsertion = function(editor, session) { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + if (!this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) { + var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1); + if (!this.$matchTokenType(iterator2.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) + return false; + } + iterator.stepForward(); + return iterator.getCurrentTokenRow() !== cursor.row || + this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_BEFORE_TOKENS); + }; + + CstyleBehaviour.$matchTokenType = function(token, types) { + return types.indexOf(token.type || token) > -1; + }; + + CstyleBehaviour.recordAutoInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isAutoInsertedClosing(cursor, line, autoInsertedLineEnd[0])) + autoInsertedBrackets = 0; + autoInsertedRow = cursor.row; + autoInsertedLineEnd = bracket + line.substr(cursor.column); + autoInsertedBrackets++; + }; + + CstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isMaybeInsertedClosing(cursor, line)) + maybeInsertedBrackets = 0; + maybeInsertedRow = cursor.row; + maybeInsertedLineStart = line.substr(0, cursor.column) + bracket; + maybeInsertedLineEnd = line.substr(cursor.column); + maybeInsertedBrackets++; + }; + + CstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) { + return autoInsertedBrackets > 0 && + cursor.row === autoInsertedRow && + bracket === autoInsertedLineEnd[0] && + line.substr(cursor.column) === autoInsertedLineEnd; + }; + + CstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) { + return maybeInsertedBrackets > 0 && + cursor.row === maybeInsertedRow && + line.substr(cursor.column) === maybeInsertedLineEnd && + line.substr(0, cursor.column) == maybeInsertedLineStart; + }; + + CstyleBehaviour.popAutoInsertedClosing = function() { + autoInsertedLineEnd = autoInsertedLineEnd.substr(1); + autoInsertedBrackets--; + }; + + CstyleBehaviour.clearMaybeInsertedClosing = function() { + maybeInsertedBrackets = 0; + maybeInsertedRow = -1; + }; + + this.add("braces", "insertion", function (state, action, editor, session, text) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (text == '{') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "{" && editor.getWrapBehavioursEnabled()) { + return { + text: '{' + selected + '}', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + if (/[\]\}\)]/.test(line[cursor.column])) { + CstyleBehaviour.recordAutoInsert(editor, session, "}"); + return { + text: '{}', + selection: [1, 1] + }; + } else { + CstyleBehaviour.recordMaybeInsert(editor, session, "{"); + return { + text: '{', + selection: [1, 1] + }; + } + } + } else if (text == '}') { + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}') { + var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } else if (text == "\n" || text == "\r\n") { + var closing = ""; + if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) { + closing = lang.stringRepeat("}", maybeInsertedBrackets); + CstyleBehaviour.clearMaybeInsertedClosing(); + } + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}' || closing !== "") { + var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column}, '}'); + if (!openBracePos) + return null; + + var indent = this.getNextLineIndent(state, line.substring(0, cursor.column), session.getTabString()); + var next_indent = this.$getIndent(line); + + return { + text: '\n' + indent + '\n' + next_indent + closing, + selection: [1, indent.length, 1, indent.length] + }; + } + } + }); + + this.add("braces", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '{') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar == '}') { + range.end.column++; + return range; + } else { + maybeInsertedBrackets--; + } + } + }); + + this.add("parens", "insertion", function (state, action, editor, session, text) { + if (text == '(') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return { + text: '(' + selected + ')', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, ")"); + return { + text: '()', + selection: [1, 1] + }; + } + } else if (text == ')') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ')') { + var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("parens", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '(') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ')') { + range.end.column++; + return range; + } + } + }); + + this.add("brackets", "insertion", function (state, action, editor, session, text) { + if (text == '[') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return { + text: '[' + selected + ']', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, "]"); + return { + text: '[]', + selection: [1, 1] + }; + } + } else if (text == ']') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ']') { + var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("brackets", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '[') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ']') { + range.end.column++; + return range; + } + } + }); + + this.add("string_dquotes", "insertion", function (state, action, editor, session, text) { + if (text == '"' || text == "'") { + var quote = text; + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "'" && selected != '"' && editor.getWrapBehavioursEnabled()) { + return { + text: quote + selected + quote, + selection: false + }; + } else { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var leftChar = line.substring(cursor.column-1, cursor.column); + if (leftChar == '\\') { + return null; + } + var tokens = session.getTokens(selection.start.row); + var col = 0, token; + var quotepos = -1; // Track whether we're inside an open quote. + + for (var x = 0; x < tokens.length; x++) { + token = tokens[x]; + if (token.type == "string") { + quotepos = -1; + } else if (quotepos < 0) { + quotepos = token.value.indexOf(quote); + } + if ((token.value.length + col) > selection.start.column) { + break; + } + col += tokens[x].value.length; + } + if (!token || (quotepos < 0 && token.type !== "comment" && (token.type !== "string" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) { + if (!CstyleBehaviour.isSaneInsertion(editor, session)) + return; + return { + text: quote + quote, + selection: [1,1] + }; + } else if (token && token.type === "string") { + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == quote) { + return { + text: '', + selection: [1, 1] + }; + } + } + } + } + }); + + this.add("string_dquotes", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && (selected == '"' || selected == "'")) { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == selected) { + range.end.column++; + return range; + } + } + }); + +}; + +oop.inherits(CstyleBehaviour, Behaviour); + +exports.CstyleBehaviour = CstyleBehaviour; +}); + +ace.define('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var line = session.getLine(row); + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i + match[0].length, 1); + } + + if (foldStyle !== "markbeginend") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + +}).call(FoldMode.prototype); + +}); diff --git a/0.0.3_0/ace/mode-groovy.js b/0.0.3_0/ace/mode-groovy.js new file mode 100644 index 0000000..7c85fba --- /dev/null +++ b/0.0.3_0/ace/mode-groovy.js @@ -0,0 +1,1037 @@ +ace.define('ace/mode/groovy', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/javascript', 'ace/tokenizer', 'ace/mode/groovy_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var JavaScriptMode = require("./javascript").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var GroovyHighlightRules = require("./groovy_highlight_rules").GroovyHighlightRules; + +var Mode = function() { + JavaScriptMode.call(this); + this.$tokenizer = new Tokenizer(new GroovyHighlightRules().getRules()); +}; +oop.inherits(Mode, JavaScriptMode); + +(function() { + + this.createWorker = function(session) { + return null; + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/javascript', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/javascript_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/range', 'ace/worker/worker_client', 'ace/mode/behaviour/cstyle', 'ace/mode/folding/cstyle'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var Range = require("../range").Range; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new JavaScriptHighlightRules().getRules()); + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.$tokenizer.getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start" || state == "no_regex") { + var match = line.match(/^.*(?:\bcase\b.*\:|[\{\(\[])\s*$/); + if (match) { + indent += tab; + } + } else if (state == "doc-start") { + if (endState == "start" || endState == "no_regex") { + return ""; + } + var match = line.match(/^\s*(\/?)\*/); + if (match) { + if (match[1]) { + indent += " "; + } + indent += "* "; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/javascript_worker", "JavaScriptWorker"); + worker.attachToDocument(session.getDocument()); + + worker.on("jslint", function(results) { + session.setAnnotations(results.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +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(require, exports, module) { + + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var JavaScriptHighlightRules = function() { + var keywordMapper = this.createKeywordMapper({ + "variable.language": + "Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|" + // Constructors + "Namespace|QName|XML|XMLList|" + // E4X + "ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|" + + "Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|" + + "Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|" + // Errors + "SyntaxError|TypeError|URIError|" + + "decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|" + // Non-constructor functions + "isNaN|parseFloat|parseInt|" + + "JSON|Math|" + // Other + "this|arguments|prototype|window|document" , // Pseudo + "keyword": + "const|yield|import|get|set|" + + "break|case|catch|continue|default|delete|do|else|finally|for|function|" + + "if|in|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"); + var kwBeforeRe = "case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void"; + var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*\\b"; + + var escapedRe = "\\\\(?:x[0-9a-fA-F]{2}|" + // hex + "u[0-9a-fA-F]{4}|" + // unicode + "[0-2][0-7]{0,2}|" + // oct + "3[0-6][0-7]?|" + // oct + "37[0-7]?|" + // oct + "[4-7][0-7]?|" + //oct + ".)"; + + this.$rules = { + "no_regex" : [ + { + token : "comment", + regex : /\/\/.*$/ + }, + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : /\/\*/, + next : "comment" + }, { + token : "string", + regex : "'(?=.)", + next : "qstring" + }, { + token : "string", + regex : '"(?=.)', + next : "qqstring" + }, { + token : "constant.numeric", // hex + regex : /0[xX][0-9a-fA-F]+\b/ + }, { + token : "constant.numeric", // float + regex : /[+-]?\d+(?:(?:\.\d*)?(?:[eE][+-]?\d+)?)?\b/ + }, { + token : [ + "storage.type", "punctuation.operator", "support.function", + "punctuation.operator", "entity.name.function", "text","keyword.operator" + ], + regex : "(" + identifierRe + ")(\\.)(prototype)(\\.)(" + identifierRe +")(\\s*)(=)", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "keyword.operator", "text", "storage.type", + "text", "paren.lparen" + ], + regex : "(" + identifierRe +")(\\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 : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(function)(\\s+)(" + identifierRe + ")(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "punctuation.operator", + "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\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 : "(?:" + kwBeforeRe + ")\\b", + next : "start" + }, { + token : ["punctuation.operator", "support.function"], + regex : /(\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:opzzzz|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 : ["punctuation.operator", "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)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/ + }, { + token : ["punctuation.operator", "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 : ["storage.type", "punctuation.operator", "support.function.firebug"], + regex : /(console)(\.)(warn|info|log|error|time|timeEnd|assert)\b/ + }, { + token : keywordMapper, + regex : identifierRe + }, { + token : "keyword.operator", + regex : /--|\+\+|[!$%&*+\-~]|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\|\||\?\:|\*=|%=|\+=|\-=|&=|\^=/, + next : "start" + }, { + token : "punctuation.operator", + regex : /\?|\:|\,|\;|\./, + next : "start" + }, { + token : "paren.lparen", + regex : /[\[({]/, + next : "start" + }, { + token : "paren.rparen", + regex : /[\])}]/ + }, { + token : "keyword.operator", + regex : /\/=?/, + next : "start" + }, { + token: "comment", + regex: /^#!.*$/ + } + ], + "start": [ + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment_regex_allowed" + }, { + token : "comment", + regex : "\\/\\/.*$", + next : "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: "/\\w*", + 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.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: identifierRe + }, { + token: "punctuation.operator", + regex: "[, ]+" + }, { + token: "punctuation.operator", + regex: "$" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "comment_regex_allowed" : [ + {token : "comment", regex : "\\*\\/", next : "start"}, + {defaultToken : "comment"} + ], + "comment" : [ + {token : "comment", regex : "\\*\\/", next : "no_regex"}, + {defaultToken : "comment"} + ], + "qqstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + next : "qqstring" + }, { + token : "string", + regex : '"|$', + next : "no_regex" + }, { + defaultToken: "string" + } + ], + "qstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + next : "qstring" + }, { + token : "string", + regex : "'|$", + next : "no_regex" + }, { + defaultToken: "string" + } + ] + }; + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("no_regex") ]); +}; + +oop.inherits(JavaScriptHighlightRules, TextHighlightRules); + +exports.JavaScriptHighlightRules = JavaScriptHighlightRules; +}); + +ace.define('ace/mode/doc_comment_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, { + token : "comment.doc.tag", + regex : "\\bTODO\\b" + }, { + defaultToken : "comment.doc" + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) { + + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define('ace/mode/behaviour/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/token_iterator', 'ace/lib/lang'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; +var lang = require("../../lib/lang"); + +var SAFE_INSERT_IN_TOKENS = + ["text", "paren.rparen", "punctuation.operator"]; +var SAFE_INSERT_BEFORE_TOKENS = + ["text", "paren.rparen", "punctuation.operator", "comment"]; + + +var autoInsertedBrackets = 0; +var autoInsertedRow = -1; +var autoInsertedLineEnd = ""; +var maybeInsertedBrackets = 0; +var maybeInsertedRow = -1; +var maybeInsertedLineStart = ""; +var maybeInsertedLineEnd = ""; + +var CstyleBehaviour = function () { + + CstyleBehaviour.isSaneInsertion = function(editor, session) { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + if (!this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) { + var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1); + if (!this.$matchTokenType(iterator2.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) + return false; + } + iterator.stepForward(); + return iterator.getCurrentTokenRow() !== cursor.row || + this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_BEFORE_TOKENS); + }; + + CstyleBehaviour.$matchTokenType = function(token, types) { + return types.indexOf(token.type || token) > -1; + }; + + CstyleBehaviour.recordAutoInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isAutoInsertedClosing(cursor, line, autoInsertedLineEnd[0])) + autoInsertedBrackets = 0; + autoInsertedRow = cursor.row; + autoInsertedLineEnd = bracket + line.substr(cursor.column); + autoInsertedBrackets++; + }; + + CstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isMaybeInsertedClosing(cursor, line)) + maybeInsertedBrackets = 0; + maybeInsertedRow = cursor.row; + maybeInsertedLineStart = line.substr(0, cursor.column) + bracket; + maybeInsertedLineEnd = line.substr(cursor.column); + maybeInsertedBrackets++; + }; + + CstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) { + return autoInsertedBrackets > 0 && + cursor.row === autoInsertedRow && + bracket === autoInsertedLineEnd[0] && + line.substr(cursor.column) === autoInsertedLineEnd; + }; + + CstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) { + return maybeInsertedBrackets > 0 && + cursor.row === maybeInsertedRow && + line.substr(cursor.column) === maybeInsertedLineEnd && + line.substr(0, cursor.column) == maybeInsertedLineStart; + }; + + CstyleBehaviour.popAutoInsertedClosing = function() { + autoInsertedLineEnd = autoInsertedLineEnd.substr(1); + autoInsertedBrackets--; + }; + + CstyleBehaviour.clearMaybeInsertedClosing = function() { + maybeInsertedBrackets = 0; + maybeInsertedRow = -1; + }; + + this.add("braces", "insertion", function (state, action, editor, session, text) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (text == '{') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "{" && editor.getWrapBehavioursEnabled()) { + return { + text: '{' + selected + '}', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + if (/[\]\}\)]/.test(line[cursor.column])) { + CstyleBehaviour.recordAutoInsert(editor, session, "}"); + return { + text: '{}', + selection: [1, 1] + }; + } else { + CstyleBehaviour.recordMaybeInsert(editor, session, "{"); + return { + text: '{', + selection: [1, 1] + }; + } + } + } else if (text == '}') { + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}') { + var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } else if (text == "\n" || text == "\r\n") { + var closing = ""; + if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) { + closing = lang.stringRepeat("}", maybeInsertedBrackets); + CstyleBehaviour.clearMaybeInsertedClosing(); + } + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}' || closing !== "") { + var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column}, '}'); + if (!openBracePos) + return null; + + var indent = this.getNextLineIndent(state, line.substring(0, cursor.column), session.getTabString()); + var next_indent = this.$getIndent(line); + + return { + text: '\n' + indent + '\n' + next_indent + closing, + selection: [1, indent.length, 1, indent.length] + }; + } + } + }); + + this.add("braces", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '{') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar == '}') { + range.end.column++; + return range; + } else { + maybeInsertedBrackets--; + } + } + }); + + this.add("parens", "insertion", function (state, action, editor, session, text) { + if (text == '(') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return { + text: '(' + selected + ')', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, ")"); + return { + text: '()', + selection: [1, 1] + }; + } + } else if (text == ')') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ')') { + var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("parens", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '(') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ')') { + range.end.column++; + return range; + } + } + }); + + this.add("brackets", "insertion", function (state, action, editor, session, text) { + if (text == '[') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return { + text: '[' + selected + ']', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, "]"); + return { + text: '[]', + selection: [1, 1] + }; + } + } else if (text == ']') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ']') { + var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("brackets", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '[') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ']') { + range.end.column++; + return range; + } + } + }); + + this.add("string_dquotes", "insertion", function (state, action, editor, session, text) { + if (text == '"' || text == "'") { + var quote = text; + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "'" && selected != '"' && editor.getWrapBehavioursEnabled()) { + return { + text: quote + selected + quote, + selection: false + }; + } else { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var leftChar = line.substring(cursor.column-1, cursor.column); + if (leftChar == '\\') { + return null; + } + var tokens = session.getTokens(selection.start.row); + var col = 0, token; + var quotepos = -1; // Track whether we're inside an open quote. + + for (var x = 0; x < tokens.length; x++) { + token = tokens[x]; + if (token.type == "string") { + quotepos = -1; + } else if (quotepos < 0) { + quotepos = token.value.indexOf(quote); + } + if ((token.value.length + col) > selection.start.column) { + break; + } + col += tokens[x].value.length; + } + if (!token || (quotepos < 0 && token.type !== "comment" && (token.type !== "string" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) { + if (!CstyleBehaviour.isSaneInsertion(editor, session)) + return; + return { + text: quote + quote, + selection: [1,1] + }; + } else if (token && token.type === "string") { + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == quote) { + return { + text: '', + selection: [1, 1] + }; + } + } + } + } + }); + + this.add("string_dquotes", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && (selected == '"' || selected == "'")) { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == selected) { + range.end.column++; + return range; + } + } + }); + +}; + +oop.inherits(CstyleBehaviour, Behaviour); + +exports.CstyleBehaviour = CstyleBehaviour; +}); + +ace.define('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var line = session.getLine(row); + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i + match[0].length, 1); + } + + if (foldStyle !== "markbeginend") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + +}).call(FoldMode.prototype); + +}); +ace.define('ace/mode/groovy_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/doc_comment_highlight_rules', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var GroovyHighlightRules = function() { + + var keywords = ( + "assert|with|abstract|continue|for|new|switch|" + + "assert|default|goto|package|synchronized|" + + "boolean|do|if|private|this|" + + "break|double|implements|protected|throw|" + + "byte|else|import|public|throws|" + + "case|enum|instanceof|return|transient|" + + "catch|extends|int|short|try|" + + "char|final|interface|static|void|" + + "class|finally|long|strictfp|volatile|" + + "def|float|native|super|while" + ); + + var buildinConstants = ( + "null|Infinity|NaN|undefined" + ); + + var langClasses = ( + "AbstractMethodError|AssertionError|ClassCircularityError|"+ + "ClassFormatError|Deprecated|EnumConstantNotPresentException|"+ + "ExceptionInInitializerError|IllegalAccessError|"+ + "IllegalThreadStateException|InstantiationError|InternalError|"+ + "NegativeArraySizeException|NoSuchFieldError|Override|Process|"+ + "ProcessBuilder|SecurityManager|StringIndexOutOfBoundsException|"+ + "SuppressWarnings|TypeNotPresentException|UnknownError|"+ + "UnsatisfiedLinkError|UnsupportedClassVersionError|VerifyError|"+ + "InstantiationException|IndexOutOfBoundsException|"+ + "ArrayIndexOutOfBoundsException|CloneNotSupportedException|"+ + "NoSuchFieldException|IllegalArgumentException|NumberFormatException|"+ + "SecurityException|Void|InheritableThreadLocal|IllegalStateException|"+ + "InterruptedException|NoSuchMethodException|IllegalAccessException|"+ + "UnsupportedOperationException|Enum|StrictMath|Package|Compiler|"+ + "Readable|Runtime|StringBuilder|Math|IncompatibleClassChangeError|"+ + "NoSuchMethodError|ThreadLocal|RuntimePermission|ArithmeticException|"+ + "NullPointerException|Long|Integer|Short|Byte|Double|Number|Float|"+ + "Character|Boolean|StackTraceElement|Appendable|StringBuffer|"+ + "Iterable|ThreadGroup|Runnable|Thread|IllegalMonitorStateException|"+ + "StackOverflowError|OutOfMemoryError|VirtualMachineError|"+ + "ArrayStoreException|ClassCastException|LinkageError|"+ + "NoClassDefFoundError|ClassNotFoundException|RuntimeException|"+ + "Exception|ThreadDeath|Error|Throwable|System|ClassLoader|"+ + "Cloneable|Class|CharSequence|Comparable|String|Object" + ); + + var keywordMapper = this.createKeywordMapper({ + "variable.language": "this", + "keyword": keywords, + "support.function": langClasses, + "constant.language": buildinConstants + }, "identifier"); + + this.$rules = { + "start" : [ + { + token : "comment", + regex : "\\/\\/.*$" + }, + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment" + }, { + token : "string.regexp", + regex : "[/](?:(?:\\[(?:\\\\]|[^\\]])+\\])|(?:\\\\/|[^\\]/]))*[/]\\w*\\s*(?=[).,;]|$)" + }, { + token : "string", + regex : '"""', + next : "qqstring" + }, { + token : "string", + regex : "'''", + next : "qstring" + }, { + token : "string", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' + }, { + token : "string", // single line + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" + }, { + token : "constant.numeric", // hex + regex : "0[xX][0-9a-fA-F]+\\b" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : "constant.language.boolean", + regex : "(?:true|false)\\b" + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "keyword.operator", + regex : "\\?:|\\?\\.|\\*\\.|<=>|=~|==~|\\.@|\\*\\.@|\\.&|as|in|is|!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)" + }, { + token : "lparen", + regex : "[[({]" + }, { + token : "rparen", + regex : "[\\])}]" + }, { + token : "text", + regex : "\\s+" + } + ], + "comment" : [ + { + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "start" + }, { + token : "comment", // comment spanning whole line + regex : ".+" + } + ], + "qqstring" : [ + { + token : "constant.language.escape", + regex : /\\(?:u[0-9A-Fa-f]{4}|.|$)/ + }, { + token : "constant.language.escape", + regex : /\$[\w\d]+/ + }, { + token : "constant.language.escape", + regex : /\$\{[^"\}]+\}?/ + }, { + token : "string", + regex : '"{3,5}', + next : "start" + }, { + token : "string", + regex : '.+?' + } + ], + "qstring" : [ + { + token : "constant.language.escape", + regex : /\\(?:u[0-9A-Fa-f]{4}|.|$)/ + }, { + token : "string", + regex : "'{3,5}", + next : "start" + }, { + token : "string", + regex : ".+?" + } + ] + }; + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("start") ]); +}; + +oop.inherits(GroovyHighlightRules, TextHighlightRules); + +exports.GroovyHighlightRules = GroovyHighlightRules; +}); diff --git a/0.0.3_0/ace/mode-haml.js b/0.0.3_0/ace/mode-haml.js new file mode 100644 index 0000000..5f213b6 --- /dev/null +++ b/0.0.3_0/ace/mode-haml.js @@ -0,0 +1,487 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2012, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * + * Contributor(s): + * + * Garen J. Torikian < gjtorikian AT gmail DOT com > + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/mode/haml', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/haml_highlight_rules', 'ace/mode/folding/coffee'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var HamlHighlightRules = require("./haml_highlight_rules").HamlHighlightRules; +var FoldMode = require("./folding/coffee").FoldMode; + +var Mode = function() { + var highlighter = new HamlHighlightRules(); + this.foldingRules = new FoldMode(); + + this.$tokenizer = new Tokenizer(highlighter.getRules()); +}; +oop.inherits(Mode, TextMode); + +(function() { + this.lineCommentStart = ["//", "#"]; + +}).call(Mode.prototype); + +exports.Mode = Mode; +});ace.define('ace/mode/haml_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules', 'ace/mode/ruby_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var RubyExports = require("./ruby_highlight_rules"); +var RubyHighlightRules = RubyExports.RubyHighlightRules; + +var HamlHighlightRules = function() { + + this.$rules = + { + "start": [ + { + token : "punctuation.section.comment", + regex : /^\s*\/.*/ + }, + { + token : "punctuation.section.comment", + regex : /^\s*#.*/ + }, + { + token: "string.quoted.double", + regex: "==.+?==" + }, + { + token: "keyword.other.doctype", + regex: "^!!!\\s*(?:[a-zA-Z0-9-_]+)?" + }, + RubyExports.qString, + RubyExports.qqString, + RubyExports.tString, + { + token: ["entity.name.tag.haml"], + regex: /^\s*%[\w:]+/, + next: "tag_single" + }, + { + token: [ "meta.escape.haml" ], + regex: "^\\s*\\\\." + }, + RubyExports.constantNumericHex, + RubyExports.constantNumericFloat, + + RubyExports.constantOtherSymbol, + { + token: "text", + regex: "=|-|~", + next: "embedded_ruby" + } + ], + "tag_single": [ + { + token: "entity.other.attribute-name.class.haml", + regex: "\\.[\\w-]+" + }, + { + token: "entity.other.attribute-name.id.haml", + regex: "#[\\w-]+" + }, + { + token: "punctuation.section", + regex: "\\{", + next: "section" + }, + + RubyExports.constantOtherSymbol, + + { + token: "text", + regex: /\s/, + next: "start" + }, + { + token: "empty", + regex: "$|(?!\\.|#|\\{|\\[|=|-|~|\\/)", + next: "start" + } + ], + "section": [ + RubyExports.constantOtherSymbol, + + RubyExports.qString, + RubyExports.qqString, + RubyExports.tString, + + RubyExports.constantNumericHex, + RubyExports.constantNumericFloat, + { + token: "punctuation.section", + regex: "\\}", + next: "start" + } + ], + "embedded_ruby": [ + RubyExports.constantNumericHex, + RubyExports.constantNumericFloat, + { + token : "support.class", // class name + regex : "[A-Z][a-zA-Z_\\d]+" + }, + { + token : new RubyHighlightRules().getKeywords(), + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, + { + token : ["keyword", "text", "text"], + regex : "(?:do|\\{)(?: \\|[^|]+\\|)?$", + next : "start" + }, + { + token : ["text"], + regex : "^$", + next : "start" + }, + { + token : ["text"], + regex : "^(?!.*\\|\\s*$)", + next : "start" + } + ] +} + +}; + +oop.inherits(HamlHighlightRules, TextHighlightRules); + +exports.HamlHighlightRules = HamlHighlightRules; +}); + +ace.define('ace/mode/ruby_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var constantOtherSymbol = exports.constantOtherSymbol = { + token : "constant.other.symbol.ruby", // symbol + regex : "[:](?:[A-Za-z_]|[@$](?=[a-zA-Z0-9_]))[a-zA-Z0-9_]*[!=?]?" +}; + +var qString = exports.qString = { + token : "string", // single line + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" +}; + +var qqString = exports.qqString = { + token : "string", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' +}; + +var tString = exports.tString = { + token : "string", // backtick string + regex : "[`](?:(?:\\\\.)|(?:[^'\\\\]))*?[`]" +}; + +var constantNumericHex = exports.constantNumericHex = { + token : "constant.numeric", // hex + regex : "0[xX][0-9a-fA-F](?:[0-9a-fA-F]|_(?=[0-9a-fA-F]))*\\b" +}; + +var constantNumericFloat = exports.constantNumericFloat = { + token : "constant.numeric", // float + regex : "[+-]?\\d(?:\\d|_(?=\\d))*(?:(?:\\.\\d(?:\\d|_(?=\\d))*)?(?:[eE][+-]?\\d+)?)?\\b" +}; + +var RubyHighlightRules = function() { + + var builtinFunctions = ( + "abort|Array|assert|assert_equal|assert_not_equal|assert_same|assert_not_same|" + + "assert_nil|assert_not_nil|assert_match|assert_no_match|assert_in_delta|assert_throws|" + + "assert_raise|assert_nothing_raised|assert_instance_of|assert_kind_of|assert_respond_to|" + + "assert_operator|assert_send|assert_difference|assert_no_difference|assert_recognizes|" + + "assert_generates|assert_response|assert_redirected_to|assert_template|assert_select|" + + "assert_select_email|assert_select_rjs|assert_select_encoded|css_select|at_exit|" + + "attr|attr_writer|attr_reader|attr_accessor|attr_accessible|autoload|binding|block_given?|callcc|" + + "caller|catch|chomp|chomp!|chop|chop!|defined?|delete_via_redirect|eval|exec|exit|" + + "exit!|fail|Float|flunk|follow_redirect!|fork|form_for|form_tag|format|gets|global_variables|gsub|" + + "gsub!|get_via_redirect|host!|https?|https!|include|Integer|lambda|link_to|" + + "link_to_unless_current|link_to_function|link_to_remote|load|local_variables|loop|open|open_session|" + + "p|print|printf|proc|putc|puts|post_via_redirect|put_via_redirect|raise|rand|" + + "raw|readline|readlines|redirect?|request_via_redirect|require|scan|select|" + + "set_trace_func|sleep|split|sprintf|srand|String|stylesheet_link_tag|syscall|system|sub|sub!|test|" + + "throw|trace_var|trap|untrace_var|atan2|cos|exp|frexp|ldexp|log|log10|sin|sqrt|tan|" + + "render|javascript_include_tag|csrf_meta_tag|label_tag|text_field_tag|submit_tag|check_box_tag|" + + "content_tag|radio_button_tag|text_area_tag|password_field_tag|hidden_field_tag|" + + "fields_for|select_tag|options_for_select|options_from_collection_for_select|collection_select|" + + "time_zone_select|select_date|select_time|select_datetime|date_select|time_select|datetime_select|" + + "select_year|select_month|select_day|select_hour|select_minute|select_second|file_field_tag|" + + "file_field|respond_to|skip_before_filter|around_filter|after_filter|verify|" + + "protect_from_forgery|rescue_from|helper_method|redirect_to|before_filter|" + + "send_data|send_file|validates_presence_of|validates_uniqueness_of|validates_length_of|" + + "validates_format_of|validates_acceptance_of|validates_associated|validates_exclusion_of|" + + "validates_inclusion_of|validates_numericality_of|validates_with|validates_each|" + + "authenticate_or_request_with_http_basic|authenticate_or_request_with_http_digest|" + + "filter_parameter_logging|match|get|post|resources|redirect|scope|assert_routing|" + + "translate|localize|extract_locale_from_tld|caches_page|expire_page|caches_action|expire_action|" + + "cache|expire_fragment|expire_cache_for|observe|cache_sweeper|" + + "has_many|has_one|belongs_to|has_and_belongs_to_many" + ); + + var keywords = ( + "alias|and|BEGIN|begin|break|case|class|def|defined|do|else|elsif|END|end|ensure|" + + "__FILE__|finally|for|gem|if|in|__LINE__|module|next|not|or|private|protected|public|" + + "redo|rescue|retry|return|super|then|undef|unless|until|when|while|yield" + ); + + var buildinConstants = ( + "true|TRUE|false|FALSE|nil|NIL|ARGF|ARGV|DATA|ENV|RUBY_PLATFORM|RUBY_RELEASE_DATE|" + + "RUBY_VERSION|STDERR|STDIN|STDOUT|TOPLEVEL_BINDING" + ); + + var builtinVariables = ( + "\$DEBUG|\$defout|\$FILENAME|\$LOAD_PATH|\$SAFE|\$stdin|\$stdout|\$stderr|\$VERBOSE|" + + "$!|root_url|flash|session|cookies|params|request|response|logger|self" + ); + + var keywordMapper = this.$keywords = this.createKeywordMapper({ + "keyword": keywords, + "constant.language": buildinConstants, + "variable.language": builtinVariables, + "support.function": builtinFunctions, + "invalid.deprecated": "debugger" // TODO is this a remnant from js mode? + }, "identifier"); + + this.$rules = { + "start" : [ + { + token : "comment", + regex : "#.*$" + }, { + token : "comment", // multi line comment + regex : "^=begin(?:$|\\s.*$)", + next : "comment" + }, { + token : "string.regexp", + regex : "[/](?:(?:\\[(?:\\\\]|[^\\]])+\\])|(?:\\\\/|[^\\]/]))*[/]\\w*\\s*(?=[).,;]|$)" + }, + + qString, + qqString, + tString, + + { + token : "text", // namespaces aren't symbols + regex : "::" + }, { + token : "variable.instance", // instance variable + regex : "@{1,2}[a-zA-Z_\\d]+" + }, { + token : "support.class", // class name + regex : "[A-Z][a-zA-Z_\\d]+" + }, + + constantOtherSymbol, + constantNumericHex, + constantNumericFloat, + + { + token : "constant.language.boolean", + regex : "(?:true|false)\\b" + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "punctuation.separator.key-value", + regex : "=>" + }, { + stateName: "heredoc", + onMatch : function(value, currentState, stack) { + var next = value[2] == '-' ? "indentedHeredoc" : "heredoc"; + var tokens = value.split(this.splitRegex); + stack.push(next, tokens[3]); + return [ + {type:"constant", value: tokens[1]}, + {type:"string", value: tokens[2]}, + {type:"support.class", value: tokens[3]}, + {type:"string", value: tokens[4]} + ]; + }, + regex : "(<<-?)(['\"`]?)([\\w]+)(['\"`]?)", + rules: { + heredoc: [{ + onMatch: function(value, currentState, stack) { + if (value == stack[1]) { + stack.shift(); + stack.shift(); + return "support.class"; + } + return "string"; + }, + regex: ".*$", + next: "start" + }], + indentedHeredoc: [{ + token: "string", + regex: "^ +" + }, { + onMatch: function(value, currentState, stack) { + if (value == stack[1]) { + stack.shift(); + stack.shift(); + return "support.class"; + } + return "string"; + }, + regex: ".*$", + next: "start" + }] + } + }, { + token : "keyword.operator", + regex : "!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)" + }, { + token : "paren.lparen", + regex : "[[({]" + }, { + token : "paren.rparen", + regex : "[\\])}]" + }, { + token : "text", + regex : "\\s+" + } + ], + "comment" : [ + { + token : "comment", // closing comment + regex : "^=end(?:$|\\s.*$)", + next : "start" + }, { + token : "comment", // comment spanning whole line + regex : ".+" + } + ] + }; + + this.normalizeRules(); +}; + +oop.inherits(RubyHighlightRules, TextHighlightRules); + +exports.RubyHighlightRules = RubyHighlightRules; +}); + +ace.define('ace/mode/folding/coffee', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/folding/fold_mode', 'ace/range'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var BaseFoldMode = require("./fold_mode").FoldMode; +var Range = require("../../range").Range; + +var FoldMode = exports.FoldMode = function() {}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var range = this.indentationBlock(session, row); + if (range) + return range; + + var re = /\S/; + var line = session.getLine(row); + var startLevel = line.search(re); + if (startLevel == -1 || line[startLevel] != "#") + return; + + var startColumn = line.length; + var maxRow = session.getLength(); + var startRow = row; + var endRow = row; + + while (++row < maxRow) { + line = session.getLine(row); + var level = line.search(re); + + if (level == -1) + continue; + + if (line[level] != "#") + break; + + endRow = row; + } + + if (endRow > startRow) { + var endColumn = session.getLine(endRow).length; + return new Range(startRow, startColumn, endRow, endColumn); + } + }; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + var indent = line.search(/\S/); + var next = session.getLine(row + 1); + var prev = session.getLine(row - 1); + var prevIndent = prev.search(/\S/); + var nextIndent = next.search(/\S/); + + if (indent == -1) { + session.foldWidgets[row - 1] = prevIndent!= -1 && prevIndent < nextIndent ? "start" : ""; + return ""; + } + if (prevIndent == -1) { + if (indent == nextIndent && line[indent] == "#" && next[indent] == "#") { + session.foldWidgets[row - 1] = ""; + session.foldWidgets[row + 1] = ""; + return "start"; + } + } else if (prevIndent == indent && line[indent] == "#" && prev[indent] == "#") { + if (session.getLine(row - 2).search(/\S/) == -1) { + session.foldWidgets[row - 1] = "start"; + session.foldWidgets[row + 1] = ""; + return ""; + } + } + + if (prevIndent!= -1 && prevIndent < indent) + session.foldWidgets[row - 1] = "start"; + else + session.foldWidgets[row - 1] = ""; + + if (indent < nextIndent) + return "start"; + else + return ""; + }; + +}).call(FoldMode.prototype); + +}); diff --git a/0.0.3_0/ace/mode-haskell.js b/0.0.3_0/ace/mode-haskell.js new file mode 100644 index 0000000..bea308c --- /dev/null +++ b/0.0.3_0/ace/mode-haskell.js @@ -0,0 +1,321 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2012, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * + * Contributor(s): + * + * + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/mode/haskell', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/haskell_highlight_rules', 'ace/mode/folding/cstyle'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var HaskellHighlightRules = require("./haskell_highlight_rules").HaskellHighlightRules; +var FoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + var highlighter = new HaskellHighlightRules(); + this.foldingRules = new FoldMode(); + this.$tokenizer = new Tokenizer(highlighter.getRules()); +}; +oop.inherits(Mode, TextMode); + +(function() { + this.lineCommentStart = "--"; + this.blockComment = {start: "/*", end: "*/"}; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/haskell_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var HaskellHighlightRules = function() { + + this.$rules = { start: + [ { token: + [ 'punctuation.definition.entity.haskell', + 'keyword.operator.function.infix.haskell', + 'punctuation.definition.entity.haskell' ], + regex: '(`)([a-zA-Z_\']*?)(`)', + comment: 'In case this regex seems unusual for an infix operator, note that Haskell allows any ordinary function application (elem 4 [1..10]) to be rewritten as an infix expression (4 `elem` [1..10]).' }, + { token: 'constant.language.unit.haskell', regex: '\\(\\)' }, + { token: 'constant.language.empty-list.haskell', + regex: '\\[\\]' }, + { token: 'keyword.other.haskell', + regex: 'module', + push: + [ { token: 'keyword.other.haskell', regex: 'where', next: 'pop' }, + { include: '#module_name' }, + { include: '#module_exports' }, + { token: 'invalid', regex: '[a-z]+' }, + { defaultToken: 'meta.declaration.module.haskell' } ] }, + { token: 'keyword.other.haskell', + regex: '\\bclass\\b', + push: + [ { token: 'keyword.other.haskell', + regex: '\\bwhere\\b', + next: 'pop' }, + { token: 'support.class.prelude.haskell', + regex: '\\b(?:Monad|Functor|Eq|Ord|Read|Show|Num|(?:Frac|Ra)tional|Enum|Bounded|Real(?:Frac|Float)?|Integral|Floating)\\b' }, + { token: 'entity.other.inherited-class.haskell', + regex: '[A-Z][A-Za-z_\']*' }, + { token: 'variable.other.generic-type.haskell', + regex: '\\b[a-z][a-zA-Z0-9_\']*\\b' }, + { defaultToken: 'meta.declaration.class.haskell' } ] }, + { token: 'keyword.other.haskell', + regex: '\\binstance\\b', + push: + [ { token: 'keyword.other.haskell', + regex: '\\bwhere\\b|$', + next: 'pop' }, + { include: '#type_signature' }, + { defaultToken: 'meta.declaration.instance.haskell' } ] }, + { token: 'keyword.other.haskell', + regex: 'import', + push: + [ { token: 'meta.import.haskell', regex: '$|;', next: 'pop' }, + { token: 'keyword.other.haskell', regex: 'qualified|as|hiding' }, + { include: '#module_name' }, + { include: '#module_exports' }, + { defaultToken: 'meta.import.haskell' } ] }, + { token: [ 'keyword.other.haskell', 'meta.deriving.haskell' ], + regex: '(deriving)(\\s*\\()', + push: + [ { token: 'meta.deriving.haskell', regex: '\\)', next: 'pop' }, + { token: 'entity.other.inherited-class.haskell', + regex: '\\b[A-Z][a-zA-Z_\']*' }, + { defaultToken: 'meta.deriving.haskell' } ] }, + { token: 'keyword.other.haskell', + regex: '\\b(?:deriving|where|data|type|case|of|let|in|newtype|default)\\b' }, + { token: 'keyword.operator.haskell', regex: '\\binfix[lr]?\\b' }, + { token: 'keyword.control.haskell', + regex: '\\b(?:do|if|then|else)\\b' }, + { token: 'constant.numeric.float.haskell', + regex: '\\b(?:[0-9]+\\.[0-9]+(?:[eE][+-]?[0-9]+)?|[0-9]+[eE][+-]?[0-9]+)\\b', + comment: 'Floats are always decimal' }, + { token: 'constant.numeric.haskell', + regex: '\\b(?:[0-9]+|0(?:[xX][0-9a-fA-F]+|[oO][0-7]+))\\b' }, + { token: + [ 'meta.preprocessor.c', + 'punctuation.definition.preprocessor.c', + 'meta.preprocessor.c' ], + regex: '^(\\s*)(#)(\\s*\\w+)', + comment: 'In addition to Haskell\'s "native" syntax, GHC permits the C preprocessor to be run on a source file.' }, + { include: '#pragma' }, + { token: 'punctuation.definition.string.begin.haskell', + regex: '"', + push: + [ { token: 'punctuation.definition.string.end.haskell', + regex: '"', + next: 'pop' }, + { token: 'constant.character.escape.haskell', + regex: '\\\\(?:NUL|SOH|STX|ETX|EOT|ENQ|ACK|BEL|BS|HT|LF|VT|FF|CR|SO|SI|DLE|DC1|DC2|DC3|DC4|NAK|SYN|ETB|CAN|EM|SUB|ESC|FS|GS|RS|US|SP|DEL|[abfnrtv\\\\\\"\'\\&])' }, + { token: 'constant.character.escape.octal.haskell', + regex: '\\\\o[0-7]+|\\\\x[0-9A-Fa-f]+|\\\\[0-9]+' }, + { token: 'constant.character.escape.control.haskell', + regex: '\\^[A-Z@\\[\\]\\\\\\^_]' }, + { defaultToken: 'string.quoted.double.haskell' } ] }, + { token: + [ 'punctuation.definition.string.begin.haskell', + 'string.quoted.single.haskell', + 'constant.character.escape.haskell', + 'constant.character.escape.octal.haskell', + 'constant.character.escape.hexadecimal.haskell', + 'constant.character.escape.control.haskell', + 'punctuation.definition.string.end.haskell' ], + regex: '(\')(?:([\\ -\\[\\]-~])|(\\\\(?:NUL|SOH|STX|ETX|EOT|ENQ|ACK|BEL|BS|HT|LF|VT|FF|CR|SO|SI|DLE|DC1|DC2|DC3|DC4|NAK|SYN|ETB|CAN|EM|SUB|ESC|FS|GS|RS|US|SP|DEL|[abfnrtv\\\\\\"\'\\&]))|(\\\\o[0-7]+)|(\\\\x[0-9A-Fa-f]+)|(\\^[A-Z@\\[\\]\\\\\\^_]))(\')' }, + { token: + [ 'meta.function.type-declaration.haskell', + 'entity.name.function.haskell', + 'meta.function.type-declaration.haskell', + 'keyword.other.double-colon.haskell' ], + regex: '^(\\s*)([a-z_][a-zA-Z0-9_\']*|\\([|!%$+\\-.,=]+\\))(\\s*)(::)', + push: + [ { token: 'meta.function.type-declaration.haskell', + regex: '$', + next: 'pop' }, + { include: '#type_signature' }, + { defaultToken: 'meta.function.type-declaration.haskell' } ] }, + { token: 'support.constant.haskell', + regex: '\\b(?:Just|Nothing|Left|Right|True|False|LT|EQ|GT|\\(\\)|\\[\\])\\b' }, + { token: 'constant.other.haskell', regex: '\\b[A-Z]\\w*\\b' }, + { include: '#comments' }, + { token: 'support.function.prelude.haskell', + regex: '\\b(?:abs|acos|acosh|all|and|any|appendFile|applyM|asTypeOf|asin|asinh|atan|atan2|atanh|break|catch|ceiling|compare|concat|concatMap|const|cos|cosh|curry|cycle|decodeFloat|div|divMod|drop|dropWhile|elem|encodeFloat|enumFrom|enumFromThen|enumFromThenTo|enumFromTo|error|even|exp|exponent|fail|filter|flip|floatDigits|floatRadix|floatRange|floor|fmap|foldl|foldl1|foldr|foldr1|fromEnum|fromInteger|fromIntegral|fromRational|fst|gcd|getChar|getContents|getLine|head|id|init|interact|ioError|isDenormalized|isIEEE|isInfinite|isNaN|isNegativeZero|iterate|last|lcm|length|lex|lines|log|logBase|lookup|map|mapM|mapM_|max|maxBound|maximum|maybe|min|minBound|minimum|mod|negate|not|notElem|null|odd|or|otherwise|pi|pred|print|product|properFraction|putChar|putStr|putStrLn|quot|quotRem|read|readFile|readIO|readList|readLn|readParen|reads|readsPrec|realToFrac|recip|rem|repeat|replicate|return|reverse|round|scaleFloat|scanl|scanl1|scanr|scanr1|seq|sequence|sequence_|show|showChar|showList|showParen|showString|shows|showsPrec|significand|signum|sin|sinh|snd|span|splitAt|sqrt|subtract|succ|sum|tail|take|takeWhile|tan|tanh|toEnum|toInteger|toRational|truncate|uncurry|undefined|unlines|until|unwords|unzip|unzip3|userError|words|writeFile|zip|zip3|zipWith|zipWith3)\\b' }, + { include: '#infix_op' }, + { token: 'keyword.operator.haskell', + regex: '[|!%$?~+:\\-.=\\\\]+', + comment: 'In case this regex seems overly general, note that Haskell permits the definition of new operators which can be nearly any string of punctuation characters, such as $%^&*.' }, + { token: 'punctuation.separator.comma.haskell', regex: ',' } ], + '#block_comment': + [ { token: 'punctuation.definition.comment.haskell', + regex: '\\{-(?!#)', + push: + [ { include: '#block_comment' }, + { token: 'punctuation.definition.comment.haskell', + regex: '-\\}', + next: 'pop' }, + { defaultToken: 'comment.block.haskell' } ] } ], + '#comments': + [ { token: 'punctuation.definition.comment.haskell', + regex: '--.*', + push_: + [ { token: 'comment.line.double-dash.haskell', + regex: '$', + next: 'pop' }, + { defaultToken: 'comment.line.double-dash.haskell' } ] }, + { include: '#block_comment' } ], + '#infix_op': + [ { token: 'entity.name.function.infix.haskell', + regex: '\\([|!%$+:\\-.=]+\\)|\\(,+\\)' } ], + '#module_exports': + [ { token: 'meta.declaration.exports.haskell', + regex: '\\(', + push: + [ { token: 'meta.declaration.exports.haskell', + regex: '\\)', + next: 'pop' }, + { token: 'entity.name.function.haskell', + regex: '\\b[a-z][a-zA-Z_\']*' }, + { token: 'storage.type.haskell', regex: '\\b[A-Z][A-Za-z_\']*' }, + { token: 'punctuation.separator.comma.haskell', regex: ',' }, + { include: '#infix_op' }, + { token: 'meta.other.unknown.haskell', + regex: '\\(.*?\\)', + comment: 'So named because I don\'t know what to call this.' }, + { defaultToken: 'meta.declaration.exports.haskell' } ] } ], + '#module_name': + [ { token: 'support.other.module.haskell', + regex: '[A-Z][A-Za-z._\']*' } ], + '#pragma': + [ { token: 'meta.preprocessor.haskell', + regex: '\\{-#', + push: + [ { token: 'meta.preprocessor.haskell', + regex: '#-\\}', + next: 'pop' }, + { token: 'keyword.other.preprocessor.haskell', + regex: '\\b(?:LANGUAGE|UNPACK|INLINE)\\b' }, + { defaultToken: 'meta.preprocessor.haskell' } ] } ], + '#type_signature': + [ { token: + [ 'meta.class-constraint.haskell', + 'entity.other.inherited-class.haskell', + 'meta.class-constraint.haskell', + 'variable.other.generic-type.haskell', + 'meta.class-constraint.haskell', + 'keyword.other.big-arrow.haskell' ], + regex: '(\\(\\s*)([A-Z][A-Za-z]*)(\\s+)([a-z][A-Za-z_\']*)(\\)\\s*)(=>)' }, + { include: '#pragma' }, + { token: 'keyword.other.arrow.haskell', regex: '->' }, + { token: 'keyword.other.big-arrow.haskell', regex: '=>' }, + { token: 'support.type.prelude.haskell', + regex: '\\b(?:Int(?:eger)?|Maybe|Either|Bool|Float|Double|Char|String|Ordering|ShowS|ReadS|FilePath|IO(?:Error)?)\\b' }, + { token: 'variable.other.generic-type.haskell', + regex: '\\b[a-z][a-zA-Z0-9_\']*\\b' }, + { token: 'storage.type.haskell', + regex: '\\b[A-Z][a-zA-Z0-9_\']*\\b' }, + { token: 'support.constant.unit.haskell', regex: '\\(\\)' }, + { include: '#comments' } ] } + + this.normalizeRules(); +}; + +HaskellHighlightRules.metaData = { fileTypes: [ 'hs' ], + keyEquivalent: '^~H', + name: 'Haskell', + scopeName: 'source.haskell' } + + +oop.inherits(HaskellHighlightRules, TextHighlightRules); + +exports.HaskellHighlightRules = HaskellHighlightRules; +}); + +ace.define('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var line = session.getLine(row); + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i + match[0].length, 1); + } + + if (foldStyle !== "markbeginend") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + +}).call(FoldMode.prototype); + +}); diff --git a/0.0.3_0/ace/mode-haxe.js b/0.0.3_0/ace/mode-haxe.js new file mode 100644 index 0000000..7fafb65 --- /dev/null +++ b/0.0.3_0/ace/mode-haxe.js @@ -0,0 +1,609 @@ +ace.define('ace/mode/haxe', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/haxe_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/mode/behaviour/cstyle', 'ace/mode/folding/cstyle'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var HaxeHighlightRules = require("./haxe_highlight_rules").HaxeHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new HaxeHighlightRules().getRules()); + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.$tokenizer.getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start") { + var match = line.match(/^.*[\{\(\[]\s*$/); + if (match) { + indent += tab; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); +ace.define('ace/mode/haxe_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/doc_comment_highlight_rules', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); + +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var HaxeHighlightRules = function() { + + var keywords = ( + "break|case|cast|catch|class|continue|default|else|enum|extends|for|function|if|implements|import|in|inline|interface|new|override|package|private|public|return|static|super|switch|this|throw|trace|try|typedef|untyped|var|while|Array|Void|Bool|Int|UInt|Float|Dynamic|String|List|Hash|IntHash|Error|Unknown|Type|Std" + ); + + var buildinConstants = ( + "null|true|false" + ); + + var keywordMapper = this.createKeywordMapper({ + "variable.language": "this", + "keyword": keywords, + "constant.language": buildinConstants + }, "identifier"); + + this.$rules = { + "start" : [ + { + token : "comment", + regex : "\\/\\/.*$" + }, + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment" + }, { + token : "string.regexp", + regex : "[/](?:(?:\\[(?:\\\\]|[^\\]])+\\])|(?:\\\\/|[^\\]/]))*[/]\\w*\\s*(?=[).,;]|$)" + }, { + token : "string", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' + }, { + token : "string", // single line + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" + }, { + token : "constant.numeric", // hex + regex : "0[xX][0-9a-fA-F]+\\b" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : "constant.language.boolean", + regex : "(?:true|false)\\b" + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "keyword.operator", + regex : "!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)" + }, { + token : "punctuation.operator", + regex : "\\?|\\:|\\,|\\;|\\." + }, { + token : "paren.lparen", + regex : "[[({<]" + }, { + token : "paren.rparen", + regex : "[\\])}>]" + }, { + token : "text", + regex : "\\s+" + } + ], + "comment" : [ + { + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "start" + }, { + token : "comment", // comment spanning whole line + regex : ".+" + } + ] + }; + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("start") ]); +}; + +oop.inherits(HaxeHighlightRules, TextHighlightRules); + +exports.HaxeHighlightRules = HaxeHighlightRules; +}); + +ace.define('ace/mode/doc_comment_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, { + token : "comment.doc.tag", + regex : "\\bTODO\\b" + }, { + defaultToken : "comment.doc" + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) { + + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define('ace/mode/behaviour/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/token_iterator', 'ace/lib/lang'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; +var lang = require("../../lib/lang"); + +var SAFE_INSERT_IN_TOKENS = + ["text", "paren.rparen", "punctuation.operator"]; +var SAFE_INSERT_BEFORE_TOKENS = + ["text", "paren.rparen", "punctuation.operator", "comment"]; + + +var autoInsertedBrackets = 0; +var autoInsertedRow = -1; +var autoInsertedLineEnd = ""; +var maybeInsertedBrackets = 0; +var maybeInsertedRow = -1; +var maybeInsertedLineStart = ""; +var maybeInsertedLineEnd = ""; + +var CstyleBehaviour = function () { + + CstyleBehaviour.isSaneInsertion = function(editor, session) { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + if (!this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) { + var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1); + if (!this.$matchTokenType(iterator2.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) + return false; + } + iterator.stepForward(); + return iterator.getCurrentTokenRow() !== cursor.row || + this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_BEFORE_TOKENS); + }; + + CstyleBehaviour.$matchTokenType = function(token, types) { + return types.indexOf(token.type || token) > -1; + }; + + CstyleBehaviour.recordAutoInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isAutoInsertedClosing(cursor, line, autoInsertedLineEnd[0])) + autoInsertedBrackets = 0; + autoInsertedRow = cursor.row; + autoInsertedLineEnd = bracket + line.substr(cursor.column); + autoInsertedBrackets++; + }; + + CstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isMaybeInsertedClosing(cursor, line)) + maybeInsertedBrackets = 0; + maybeInsertedRow = cursor.row; + maybeInsertedLineStart = line.substr(0, cursor.column) + bracket; + maybeInsertedLineEnd = line.substr(cursor.column); + maybeInsertedBrackets++; + }; + + CstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) { + return autoInsertedBrackets > 0 && + cursor.row === autoInsertedRow && + bracket === autoInsertedLineEnd[0] && + line.substr(cursor.column) === autoInsertedLineEnd; + }; + + CstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) { + return maybeInsertedBrackets > 0 && + cursor.row === maybeInsertedRow && + line.substr(cursor.column) === maybeInsertedLineEnd && + line.substr(0, cursor.column) == maybeInsertedLineStart; + }; + + CstyleBehaviour.popAutoInsertedClosing = function() { + autoInsertedLineEnd = autoInsertedLineEnd.substr(1); + autoInsertedBrackets--; + }; + + CstyleBehaviour.clearMaybeInsertedClosing = function() { + maybeInsertedBrackets = 0; + maybeInsertedRow = -1; + }; + + this.add("braces", "insertion", function (state, action, editor, session, text) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (text == '{') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "{" && editor.getWrapBehavioursEnabled()) { + return { + text: '{' + selected + '}', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + if (/[\]\}\)]/.test(line[cursor.column])) { + CstyleBehaviour.recordAutoInsert(editor, session, "}"); + return { + text: '{}', + selection: [1, 1] + }; + } else { + CstyleBehaviour.recordMaybeInsert(editor, session, "{"); + return { + text: '{', + selection: [1, 1] + }; + } + } + } else if (text == '}') { + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}') { + var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } else if (text == "\n" || text == "\r\n") { + var closing = ""; + if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) { + closing = lang.stringRepeat("}", maybeInsertedBrackets); + CstyleBehaviour.clearMaybeInsertedClosing(); + } + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}' || closing !== "") { + var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column}, '}'); + if (!openBracePos) + return null; + + var indent = this.getNextLineIndent(state, line.substring(0, cursor.column), session.getTabString()); + var next_indent = this.$getIndent(line); + + return { + text: '\n' + indent + '\n' + next_indent + closing, + selection: [1, indent.length, 1, indent.length] + }; + } + } + }); + + this.add("braces", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '{') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar == '}') { + range.end.column++; + return range; + } else { + maybeInsertedBrackets--; + } + } + }); + + this.add("parens", "insertion", function (state, action, editor, session, text) { + if (text == '(') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return { + text: '(' + selected + ')', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, ")"); + return { + text: '()', + selection: [1, 1] + }; + } + } else if (text == ')') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ')') { + var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("parens", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '(') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ')') { + range.end.column++; + return range; + } + } + }); + + this.add("brackets", "insertion", function (state, action, editor, session, text) { + if (text == '[') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return { + text: '[' + selected + ']', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, "]"); + return { + text: '[]', + selection: [1, 1] + }; + } + } else if (text == ']') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ']') { + var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("brackets", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '[') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ']') { + range.end.column++; + return range; + } + } + }); + + this.add("string_dquotes", "insertion", function (state, action, editor, session, text) { + if (text == '"' || text == "'") { + var quote = text; + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "'" && selected != '"' && editor.getWrapBehavioursEnabled()) { + return { + text: quote + selected + quote, + selection: false + }; + } else { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var leftChar = line.substring(cursor.column-1, cursor.column); + if (leftChar == '\\') { + return null; + } + var tokens = session.getTokens(selection.start.row); + var col = 0, token; + var quotepos = -1; // Track whether we're inside an open quote. + + for (var x = 0; x < tokens.length; x++) { + token = tokens[x]; + if (token.type == "string") { + quotepos = -1; + } else if (quotepos < 0) { + quotepos = token.value.indexOf(quote); + } + if ((token.value.length + col) > selection.start.column) { + break; + } + col += tokens[x].value.length; + } + if (!token || (quotepos < 0 && token.type !== "comment" && (token.type !== "string" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) { + if (!CstyleBehaviour.isSaneInsertion(editor, session)) + return; + return { + text: quote + quote, + selection: [1,1] + }; + } else if (token && token.type === "string") { + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == quote) { + return { + text: '', + selection: [1, 1] + }; + } + } + } + } + }); + + this.add("string_dquotes", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && (selected == '"' || selected == "'")) { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == selected) { + range.end.column++; + return range; + } + } + }); + +}; + +oop.inherits(CstyleBehaviour, Behaviour); + +exports.CstyleBehaviour = CstyleBehaviour; +}); + +ace.define('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var line = session.getLine(row); + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i + match[0].length, 1); + } + + if (foldStyle !== "markbeginend") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + +}).call(FoldMode.prototype); + +}); diff --git a/0.0.3_0/ace/mode-html.js b/0.0.3_0/ace/mode-html.js new file mode 100644 index 0000000..388a46f --- /dev/null +++ b/0.0.3_0/ace/mode-html.js @@ -0,0 +1,1883 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2010, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/mode/html', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/mode/javascript', 'ace/mode/css', 'ace/tokenizer', 'ace/mode/html_highlight_rules', 'ace/mode/behaviour/html', 'ace/mode/folding/html'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var JavaScriptMode = require("./javascript").Mode; +var CssMode = require("./css").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules; +var HtmlBehaviour = require("./behaviour/html").HtmlBehaviour; +var HtmlFoldMode = require("./folding/html").FoldMode; + +var Mode = function() { + var highlighter = new HtmlHighlightRules(); + this.$tokenizer = new Tokenizer(highlighter.getRules()); + this.$behaviour = new HtmlBehaviour(); + + this.$embeds = highlighter.getEmbeds(); + this.createModeDelegates({ + "js-": JavaScriptMode, + "css-": CssMode + }); + + this.foldingRules = new HtmlFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.blockComment = {start: ""}; + + this.getNextLineIndent = function(state, line, tab) { + return this.$getIndent(line); + }; + + this.checkOutdent = function(state, line, input) { + return false; + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/javascript', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/javascript_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/range', 'ace/worker/worker_client', 'ace/mode/behaviour/cstyle', 'ace/mode/folding/cstyle'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var Range = require("../range").Range; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new JavaScriptHighlightRules().getRules()); + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.$tokenizer.getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start" || state == "no_regex") { + var match = line.match(/^.*(?:\bcase\b.*\:|[\{\(\[])\s*$/); + if (match) { + indent += tab; + } + } else if (state == "doc-start") { + if (endState == "start" || endState == "no_regex") { + return ""; + } + var match = line.match(/^\s*(\/?)\*/); + if (match) { + if (match[1]) { + indent += " "; + } + indent += "* "; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/javascript_worker", "JavaScriptWorker"); + worker.attachToDocument(session.getDocument()); + + worker.on("jslint", function(results) { + session.setAnnotations(results.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +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(require, exports, module) { + + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var JavaScriptHighlightRules = function() { + var keywordMapper = this.createKeywordMapper({ + "variable.language": + "Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|" + // Constructors + "Namespace|QName|XML|XMLList|" + // E4X + "ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|" + + "Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|" + + "Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|" + // Errors + "SyntaxError|TypeError|URIError|" + + "decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|" + // Non-constructor functions + "isNaN|parseFloat|parseInt|" + + "JSON|Math|" + // Other + "this|arguments|prototype|window|document" , // Pseudo + "keyword": + "const|yield|import|get|set|" + + "break|case|catch|continue|default|delete|do|else|finally|for|function|" + + "if|in|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"); + var kwBeforeRe = "case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void"; + var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*\\b"; + + var escapedRe = "\\\\(?:x[0-9a-fA-F]{2}|" + // hex + "u[0-9a-fA-F]{4}|" + // unicode + "[0-2][0-7]{0,2}|" + // oct + "3[0-6][0-7]?|" + // oct + "37[0-7]?|" + // oct + "[4-7][0-7]?|" + //oct + ".)"; + + this.$rules = { + "no_regex" : [ + { + token : "comment", + regex : /\/\/.*$/ + }, + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : /\/\*/, + next : "comment" + }, { + token : "string", + regex : "'(?=.)", + next : "qstring" + }, { + token : "string", + regex : '"(?=.)', + next : "qqstring" + }, { + token : "constant.numeric", // hex + regex : /0[xX][0-9a-fA-F]+\b/ + }, { + token : "constant.numeric", // float + regex : /[+-]?\d+(?:(?:\.\d*)?(?:[eE][+-]?\d+)?)?\b/ + }, { + token : [ + "storage.type", "punctuation.operator", "support.function", + "punctuation.operator", "entity.name.function", "text","keyword.operator" + ], + regex : "(" + identifierRe + ")(\\.)(prototype)(\\.)(" + identifierRe +")(\\s*)(=)", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "keyword.operator", "text", "storage.type", + "text", "paren.lparen" + ], + regex : "(" + identifierRe +")(\\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 : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(function)(\\s+)(" + identifierRe + ")(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "punctuation.operator", + "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\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 : "(?:" + kwBeforeRe + ")\\b", + next : "start" + }, { + token : ["punctuation.operator", "support.function"], + regex : /(\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:opzzzz|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 : ["punctuation.operator", "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)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/ + }, { + token : ["punctuation.operator", "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 : ["storage.type", "punctuation.operator", "support.function.firebug"], + regex : /(console)(\.)(warn|info|log|error|time|timeEnd|assert)\b/ + }, { + token : keywordMapper, + regex : identifierRe + }, { + token : "keyword.operator", + regex : /--|\+\+|[!$%&*+\-~]|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\|\||\?\:|\*=|%=|\+=|\-=|&=|\^=/, + next : "start" + }, { + token : "punctuation.operator", + regex : /\?|\:|\,|\;|\./, + next : "start" + }, { + token : "paren.lparen", + regex : /[\[({]/, + next : "start" + }, { + token : "paren.rparen", + regex : /[\])}]/ + }, { + token : "keyword.operator", + regex : /\/=?/, + next : "start" + }, { + token: "comment", + regex: /^#!.*$/ + } + ], + "start": [ + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment_regex_allowed" + }, { + token : "comment", + regex : "\\/\\/.*$", + next : "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: "/\\w*", + 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.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: identifierRe + }, { + token: "punctuation.operator", + regex: "[, ]+" + }, { + token: "punctuation.operator", + regex: "$" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "comment_regex_allowed" : [ + {token : "comment", regex : "\\*\\/", next : "start"}, + {defaultToken : "comment"} + ], + "comment" : [ + {token : "comment", regex : "\\*\\/", next : "no_regex"}, + {defaultToken : "comment"} + ], + "qqstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + next : "qqstring" + }, { + token : "string", + regex : '"|$', + next : "no_regex" + }, { + defaultToken: "string" + } + ], + "qstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + next : "qstring" + }, { + token : "string", + regex : "'|$", + next : "no_regex" + }, { + defaultToken: "string" + } + ] + }; + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("no_regex") ]); +}; + +oop.inherits(JavaScriptHighlightRules, TextHighlightRules); + +exports.JavaScriptHighlightRules = JavaScriptHighlightRules; +}); + +ace.define('ace/mode/doc_comment_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, { + token : "comment.doc.tag", + regex : "\\bTODO\\b" + }, { + defaultToken : "comment.doc" + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) { + + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define('ace/mode/behaviour/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/token_iterator', 'ace/lib/lang'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; +var lang = require("../../lib/lang"); + +var SAFE_INSERT_IN_TOKENS = + ["text", "paren.rparen", "punctuation.operator"]; +var SAFE_INSERT_BEFORE_TOKENS = + ["text", "paren.rparen", "punctuation.operator", "comment"]; + + +var autoInsertedBrackets = 0; +var autoInsertedRow = -1; +var autoInsertedLineEnd = ""; +var maybeInsertedBrackets = 0; +var maybeInsertedRow = -1; +var maybeInsertedLineStart = ""; +var maybeInsertedLineEnd = ""; + +var CstyleBehaviour = function () { + + CstyleBehaviour.isSaneInsertion = function(editor, session) { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + if (!this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) { + var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1); + if (!this.$matchTokenType(iterator2.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) + return false; + } + iterator.stepForward(); + return iterator.getCurrentTokenRow() !== cursor.row || + this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_BEFORE_TOKENS); + }; + + CstyleBehaviour.$matchTokenType = function(token, types) { + return types.indexOf(token.type || token) > -1; + }; + + CstyleBehaviour.recordAutoInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isAutoInsertedClosing(cursor, line, autoInsertedLineEnd[0])) + autoInsertedBrackets = 0; + autoInsertedRow = cursor.row; + autoInsertedLineEnd = bracket + line.substr(cursor.column); + autoInsertedBrackets++; + }; + + CstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isMaybeInsertedClosing(cursor, line)) + maybeInsertedBrackets = 0; + maybeInsertedRow = cursor.row; + maybeInsertedLineStart = line.substr(0, cursor.column) + bracket; + maybeInsertedLineEnd = line.substr(cursor.column); + maybeInsertedBrackets++; + }; + + CstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) { + return autoInsertedBrackets > 0 && + cursor.row === autoInsertedRow && + bracket === autoInsertedLineEnd[0] && + line.substr(cursor.column) === autoInsertedLineEnd; + }; + + CstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) { + return maybeInsertedBrackets > 0 && + cursor.row === maybeInsertedRow && + line.substr(cursor.column) === maybeInsertedLineEnd && + line.substr(0, cursor.column) == maybeInsertedLineStart; + }; + + CstyleBehaviour.popAutoInsertedClosing = function() { + autoInsertedLineEnd = autoInsertedLineEnd.substr(1); + autoInsertedBrackets--; + }; + + CstyleBehaviour.clearMaybeInsertedClosing = function() { + maybeInsertedBrackets = 0; + maybeInsertedRow = -1; + }; + + this.add("braces", "insertion", function (state, action, editor, session, text) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (text == '{') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "{" && editor.getWrapBehavioursEnabled()) { + return { + text: '{' + selected + '}', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + if (/[\]\}\)]/.test(line[cursor.column])) { + CstyleBehaviour.recordAutoInsert(editor, session, "}"); + return { + text: '{}', + selection: [1, 1] + }; + } else { + CstyleBehaviour.recordMaybeInsert(editor, session, "{"); + return { + text: '{', + selection: [1, 1] + }; + } + } + } else if (text == '}') { + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}') { + var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } else if (text == "\n" || text == "\r\n") { + var closing = ""; + if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) { + closing = lang.stringRepeat("}", maybeInsertedBrackets); + CstyleBehaviour.clearMaybeInsertedClosing(); + } + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}' || closing !== "") { + var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column}, '}'); + if (!openBracePos) + return null; + + var indent = this.getNextLineIndent(state, line.substring(0, cursor.column), session.getTabString()); + var next_indent = this.$getIndent(line); + + return { + text: '\n' + indent + '\n' + next_indent + closing, + selection: [1, indent.length, 1, indent.length] + }; + } + } + }); + + this.add("braces", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '{') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar == '}') { + range.end.column++; + return range; + } else { + maybeInsertedBrackets--; + } + } + }); + + this.add("parens", "insertion", function (state, action, editor, session, text) { + if (text == '(') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return { + text: '(' + selected + ')', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, ")"); + return { + text: '()', + selection: [1, 1] + }; + } + } else if (text == ')') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ')') { + var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("parens", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '(') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ')') { + range.end.column++; + return range; + } + } + }); + + this.add("brackets", "insertion", function (state, action, editor, session, text) { + if (text == '[') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return { + text: '[' + selected + ']', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, "]"); + return { + text: '[]', + selection: [1, 1] + }; + } + } else if (text == ']') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ']') { + var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("brackets", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '[') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ']') { + range.end.column++; + return range; + } + } + }); + + this.add("string_dquotes", "insertion", function (state, action, editor, session, text) { + if (text == '"' || text == "'") { + var quote = text; + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "'" && selected != '"' && editor.getWrapBehavioursEnabled()) { + return { + text: quote + selected + quote, + selection: false + }; + } else { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var leftChar = line.substring(cursor.column-1, cursor.column); + if (leftChar == '\\') { + return null; + } + var tokens = session.getTokens(selection.start.row); + var col = 0, token; + var quotepos = -1; // Track whether we're inside an open quote. + + for (var x = 0; x < tokens.length; x++) { + token = tokens[x]; + if (token.type == "string") { + quotepos = -1; + } else if (quotepos < 0) { + quotepos = token.value.indexOf(quote); + } + if ((token.value.length + col) > selection.start.column) { + break; + } + col += tokens[x].value.length; + } + if (!token || (quotepos < 0 && token.type !== "comment" && (token.type !== "string" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) { + if (!CstyleBehaviour.isSaneInsertion(editor, session)) + return; + return { + text: quote + quote, + selection: [1,1] + }; + } else if (token && token.type === "string") { + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == quote) { + return { + text: '', + selection: [1, 1] + }; + } + } + } + } + }); + + this.add("string_dquotes", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && (selected == '"' || selected == "'")) { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == selected) { + range.end.column++; + return range; + } + } + }); + +}; + +oop.inherits(CstyleBehaviour, Behaviour); + +exports.CstyleBehaviour = CstyleBehaviour; +}); + +ace.define('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var line = session.getLine(row); + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i + match[0].length, 1); + } + + if (foldStyle !== "markbeginend") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define('ace/mode/css', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/css_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/worker/worker_client', 'ace/mode/behaviour/css', 'ace/mode/folding/cstyle'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CssBehaviour = require("./behaviour/css").CssBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new CssHighlightRules().getRules()); + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CssBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.foldingRules = "cStyle"; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + var tokens = this.$tokenizer.getLineTokens(line, state).tokens; + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + var match = line.match(/^.*\{\s*$/); + if (match) { + indent += tab; + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/css_worker", "Worker"); + worker.attachToDocument(session.getDocument()); + + worker.on("csslint", function(e) { + session.setAnnotations(e.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; + +}); + +ace.define('ace/mode/css_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var supportType = exports.supportType = "animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|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|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|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|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index"; +var supportFunction = exports.supportFunction = "rgb|rgba|url|attr|counter|counters"; +var supportConstant = exports.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"; +var supportConstantColor = exports.supportConstantColor = "aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow"; +var supportConstantFonts = exports.supportConstantFonts = "arial|century|comic|courier|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace"; + +var numRe = exports.numRe = "\\-?(?:(?:[0-9]+)|(?:[0-9]*\\.[0-9]+))"; +var pseudoElements = exports.pseudoElements = "(\\:+)\\b(after|before|first-letter|first-line|moz-selection|selection)\\b"; +var pseudoClasses = exports.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"; + +var CssHighlightRules = function() { + + var keywordMapper = this.createKeywordMapper({ + "support.function": supportFunction, + "support.constant": supportConstant, + "support.type": supportType, + "support.constant.color": supportConstantColor, + "support.constant.fonts": supportConstantFonts + }, "text", true); + + var base_ruleset = [ + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "ruleset_comment" + }, { + token : "string", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' + }, { + token : "string", // single line + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" + }, { + token : ["constant.numeric", "keyword"], + regex : "(" + numRe + ")(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 : numRe + }, { + token : "constant.numeric", // hex6 color + regex : "#[a-f0-9]{6}" + }, { + token : "constant.numeric", // hex3 color + regex : "#[a-f0-9]{3}" + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"], + regex : pseudoElements + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"], + regex : pseudoClasses + }, { + token : ["support.function", "string", "support.function"], + regex : "(url\\()(.*)(\\))" + }, { + token : keywordMapper, + regex : "\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*" + }, { + caseInsensitive: true + } + ]; + + var ruleset = lang.copyArray(base_ruleset); + ruleset.unshift({ + token : "paren.rparen", + regex : "\\}", + next: "start" + }); + + var media_ruleset = lang.copyArray( base_ruleset ); + media_ruleset.unshift({ + token : "paren.rparen", + regex : "\\}", + next: "media" + }); + + var base_comment = [{ + token : "comment", // comment spanning whole line + regex : ".+" + }]; + + var comment = lang.copyArray(base_comment); + comment.unshift({ + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "start" + }); + + var media_comment = lang.copyArray(base_comment); + media_comment.unshift({ + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "media" + }); + + var ruleset_comment = lang.copyArray(base_comment); + ruleset_comment.unshift({ + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "ruleset" + }); + + this.$rules = { + "start" : [{ + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment" + }, { + token: "paren.lparen", + regex: "\\{", + next: "ruleset" + }, { + token: "string", + regex: "@.*?{", + next: "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: true + }], + + "media" : [ { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "media_comment" + }, { + token: "paren.lparen", + regex: "\\{", + next: "media_ruleset" + },{ + token: "string", + regex: "\\}", + next: "start" + },{ + 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: true + }], + + "comment" : comment, + + "ruleset" : ruleset, + "ruleset_comment" : ruleset_comment, + + "media_ruleset" : media_ruleset, + "media_comment" : media_comment + }; +}; + +oop.inherits(CssHighlightRules, TextHighlightRules); + +exports.CssHighlightRules = CssHighlightRules; + +}); + +ace.define('ace/mode/behaviour/css', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/mode/behaviour/cstyle', 'ace/token_iterator'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var CstyleBehaviour = require("./cstyle").CstyleBehaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; + +var CssBehaviour = function () { + + this.inherit(CstyleBehaviour); + + this.add("colon", "insertion", function (state, action, editor, session, text) { + if (text === ':') { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + if (token && token.value.match(/\s+/)) { + token = iterator.stepBackward(); + } + if (token && token.type === 'support.type') { + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar === ':') { + return { + text: '', + selection: [1, 1] + } + } + if (!line.substring(cursor.column).match(/^\s*;/)) { + return { + text: ':;', + selection: [1, 1] + } + } + } + } + }); + + this.add("colon", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected === ':') { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + if (token && token.value.match(/\s+/)) { + token = iterator.stepBackward(); + } + if (token && token.type === 'support.type') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar === ';') { + range.end.column ++; + return range; + } + } + } + }); + + this.add("semicolon", "insertion", function (state, action, editor, session, text) { + if (text === ';') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar === ';') { + return { + text: '', + selection: [1, 1] + } + } + } + }); + +} +oop.inherits(CssBehaviour, CstyleBehaviour); + +exports.CssBehaviour = CssBehaviour; +}); + +ace.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_util', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var xmlUtil = require("./xml_util"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var tagMap = lang.createMap({ + a : 'anchor', + button : 'form', + form : 'form', + img : 'image', + input : 'form', + label : 'form', + script : 'script', + select : 'form', + textarea : 'form', + style : 'style', + table : 'table', + tbody : 'table', + td : 'table', + tfoot : 'table', + th : 'table', + tr : 'table' +}); + +var HtmlHighlightRules = function() { + this.$rules = { + start : [{ + token : "text", + regex : "<\\!\\[CDATA\\[", + next : "cdata" + }, { + token : "xml-pe", + regex : "<\\?.*?\\?>" + }, { + token : "comment", + regex : "<\\!--", + next : "comment" + }, { + token : "xml-pe", + regex : "<\\!.*?>" + }, { + token : "meta.tag", + regex : "<(?=script\\b)", + next : "script" + }, { + token : "meta.tag", + regex : "<(?=style\\b)", + next : "style" + }, { + token : "meta.tag", // opening tag + regex : "<\\/?(?=\\S)", + next : "tag" + }, { + token : "text", + regex : "\\s+" + }, { + token : "constant.character.entity", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }], + + cdata : [ { + token : "text", + regex : "\\]\\]>", + next : "start" + } ], + + comment : [ { + token : "comment", + regex : ".*?-->", + next : "start" + }, { + defaultToken : "comment" + } ] + }; + + xmlUtil.tag(this.$rules, "tag", "start", tagMap); + xmlUtil.tag(this.$rules, "style", "css-start", tagMap); + xmlUtil.tag(this.$rules, "script", "js-start", tagMap); + + this.embedRules(JavaScriptHighlightRules, "js-", [{ + token: "comment", + regex: "\\/\\/.*(?=<\\/script>)", + next: "tag" + }, { + token: "meta.tag", + regex: "<\\/(?=script)", + next: "tag" + }]); + + this.embedRules(CssHighlightRules, "css-", [{ + token: "meta.tag", + regex: "<\\/(?=style)", + next: "tag" + }]); +}; + +oop.inherits(HtmlHighlightRules, TextHighlightRules); + +exports.HtmlHighlightRules = HtmlHighlightRules; +}); + +ace.define('ace/mode/xml_util', ['require', 'exports', 'module' ], function(require, exports, module) { + + +function string(state) { + return [{ + token : "string", + regex : '"', + next : state + "_qqstring" + }, { + token : "string", + regex : "'", + next : state + "_qstring" + }]; +} + +function multiLineString(quote, state) { + return [ + {token : "string", regex : quote, next : state}, + { + token : "constant.language.escape", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }, + {defaultToken : "string"} + ]; +} + +exports.tag = function(states, name, nextState, tagMap) { + states[name] = [{ + token : "text", + regex : "\\s+" + }, { + + token : !tagMap ? "meta.tag.tag-name" : function(value) { + if (tagMap[value]) + return "meta.tag.tag-name." + tagMap[value]; + else + return "meta.tag.tag-name"; + }, + regex : "[-_a-zA-Z0-9:]+", + next : name + "_embed_attribute_list" + }, { + token: "empty", + regex: "", + next : name + "_embed_attribute_list" + }]; + + states[name + "_qstring"] = multiLineString("'", name + "_embed_attribute_list"); + states[name + "_qqstring"] = multiLineString("\"", name + "_embed_attribute_list"); + + states[name + "_embed_attribute_list"] = [{ + token : "meta.tag.r", + regex : "/?>", + next : nextState + }, { + token : "keyword.operator", + regex : "=" + }, { + token : "entity.other.attribute-name", + regex : "[-_a-zA-Z0-9:]+" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : "text", + regex : "\\s+" + }].concat(string(name)); +}; + +}); + +ace.define('ace/mode/behaviour/html', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour/xml', 'ace/mode/behaviour/cstyle', 'ace/token_iterator'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var XmlBehaviour = require("../behaviour/xml").XmlBehaviour; +var CstyleBehaviour = require("./cstyle").CstyleBehaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; +var voidElements = ['area', 'base', 'br', 'col', 'command', 'embed', 'hr', 'img', 'input', 'keygen', 'link', 'meta', 'param', 'source', 'track', 'wbr']; + +function hasType(token, type) { + var hasType = true; + var typeList = token.type.split('.'); + var needleList = type.split('.'); + needleList.forEach(function(needle){ + if (typeList.indexOf(needle) == -1) { + hasType = false; + return false; + } + }); + return hasType; +} + +var HtmlBehaviour = function () { + + this.inherit(XmlBehaviour); // Get xml behaviour + + this.add("autoclosing", "insertion", function (state, action, editor, session, text) { + if (text == '>') { + var position = editor.getCursorPosition(); + var iterator = new TokenIterator(session, position.row, position.column); + var token = iterator.getCurrentToken(); + + if (hasType(token, 'string') && iterator.getCurrentTokenColumn() + token.value.length > position.column) + return; + var atCursor = false; + if (!token || !hasType(token, 'meta.tag') && !(hasType(token, 'text') && token.value.match('/'))){ + do { + token = iterator.stepBackward(); + } while (token && (hasType(token, 'string') || hasType(token, 'keyword.operator') || hasType(token, 'entity.attribute-name') || hasType(token, 'text'))); + } else { + atCursor = true; + } + if (!token || !hasType(token, 'meta.tag-name') || iterator.stepBackward().value.match('/')) { + return + } + var element = token.value; + if (atCursor){ + var element = element.substring(0, position.column - token.start); + } + if (voidElements.indexOf(element) !== -1){ + return; + } + return { + text: '>' + '', + selection: [1, 1] + } + } + }); +} +oop.inherits(HtmlBehaviour, XmlBehaviour); + +exports.HtmlBehaviour = HtmlBehaviour; +}); + +ace.define('ace/mode/behaviour/xml', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/mode/behaviour/cstyle', 'ace/token_iterator'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var CstyleBehaviour = require("./cstyle").CstyleBehaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; + +function hasType(token, type) { + var hasType = true; + var typeList = token.type.split('.'); + var needleList = type.split('.'); + needleList.forEach(function(needle){ + if (typeList.indexOf(needle) == -1) { + hasType = false; + return false; + } + }); + return hasType; +} + +var XmlBehaviour = function () { + + this.inherit(CstyleBehaviour, ["string_dquotes"]); // Get string behaviour + + this.add("autoclosing", "insertion", function (state, action, editor, session, text) { + if (text == '>') { + var position = editor.getCursorPosition(); + var iterator = new TokenIterator(session, position.row, position.column); + var token = iterator.getCurrentToken(); + var atCursor = false; + if (!token || !hasType(token, 'meta.tag') && !(hasType(token, 'text') && token.value.match('/'))){ + do { + token = iterator.stepBackward(); + } while (token && (hasType(token, 'string') || hasType(token, 'keyword.operator') || hasType(token, 'entity.attribute-name') || hasType(token, 'text'))); + } else { + atCursor = true; + } + if (!token || !hasType(token, 'meta.tag-name') || iterator.stepBackward().value.match('/')) { + return + } + var tag = token.value; + if (atCursor){ + var tag = tag.substring(0, position.column - token.start); + } + + return { + text: '>' + '', + selection: [1, 1] + } + } + }); + + this.add('autoindent', 'insertion', function (state, action, editor, session, text) { + if (text == "\n") { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChars = line.substring(cursor.column, cursor.column + 2); + if (rightChars == '?)/; + this._parseTag = function(tag) { + + var match = tag.match(this.tagRe); + var column = 0; + + return { + value: tag, + match: match ? match[2] : "", + closing: match ? !!match[3] : false, + selfClosing: match ? !!match[5] || match[2] == "/>" : false, + tagName: match ? match[4] : "", + column: match[1] ? column + match[1].length : column + }; + }; + this._readTagForward = function(iterator) { + var token = iterator.getCurrentToken(); + if (!token) + return null; + + var value = ""; + var start; + + do { + if (token.type.indexOf("meta.tag") === 0) { + if (!start) { + var start = { + row: iterator.getCurrentTokenRow(), + column: iterator.getCurrentTokenColumn() + }; + } + value += token.value; + if (value.indexOf(">") !== -1) { + var tag = this._parseTag(value); + tag.start = start; + tag.end = { + row: iterator.getCurrentTokenRow(), + column: iterator.getCurrentTokenColumn() + token.value.length + }; + iterator.stepForward(); + return tag; + } + } + } while(token = iterator.stepForward()); + + return null; + }; + + this._readTagBackward = function(iterator) { + var token = iterator.getCurrentToken(); + if (!token) + return null; + + var value = ""; + var end; + + do { + if (token.type.indexOf("meta.tag") === 0) { + if (!end) { + end = { + row: iterator.getCurrentTokenRow(), + column: iterator.getCurrentTokenColumn() + token.value.length + }; + } + value = token.value + value; + if (value.indexOf("<") !== -1) { + var tag = this._parseTag(value); + tag.end = end; + tag.start = { + row: iterator.getCurrentTokenRow(), + column: iterator.getCurrentTokenColumn() + }; + iterator.stepBackward(); + return tag; + } + } + } while(token = iterator.stepBackward()); + + return null; + }; + + this._pop = function(stack, tag) { + while (stack.length) { + + var top = stack[stack.length-1]; + if (!tag || top.tagName == tag.tagName) { + return stack.pop(); + } + else if (this.voidElements[tag.tagName]) { + return; + } + else if (this.voidElements[top.tagName]) { + stack.pop(); + continue; + } else { + return null; + } + } + }; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var firstTag = this._getFirstTagInLine(session, row); + + if (!firstTag.match) + return null; + + var isBackward = firstTag.closing || firstTag.selfClosing; + var stack = []; + var tag; + + if (!isBackward) { + var iterator = new TokenIterator(session, row, firstTag.column); + var start = { + row: row, + column: firstTag.column + firstTag.tagName.length + 2 + }; + while (tag = this._readTagForward(iterator)) { + if (tag.selfClosing) { + if (!stack.length) { + tag.start.column += tag.tagName.length + 2; + tag.end.column -= 2; + return Range.fromPoints(tag.start, tag.end); + } else + continue; + } + + if (tag.closing) { + this._pop(stack, tag); + if (stack.length == 0) + return Range.fromPoints(start, tag.start); + } + else { + stack.push(tag) + } + } + } + else { + var iterator = new TokenIterator(session, row, firstTag.column + firstTag.match.length); + var end = { + row: row, + column: firstTag.column + }; + + while (tag = this._readTagBackward(iterator)) { + if (tag.selfClosing) { + if (!stack.length) { + tag.start.column += tag.tagName.length + 2; + tag.end.column -= 2; + return Range.fromPoints(tag.start, tag.end); + } else + continue; + } + + if (!tag.closing) { + this._pop(stack, tag); + if (stack.length == 0) { + tag.start.column += tag.tagName.length + 2; + return Range.fromPoints(tag.start, end); + } + } + else { + stack.push(tag) + } + } + } + + }; + +}).call(FoldMode.prototype); + +}); diff --git a/0.0.3_0/ace/mode-html_ruby.js b/0.0.3_0/ace/mode-html_ruby.js new file mode 100644 index 0000000..7eca51d --- /dev/null +++ b/0.0.3_0/ace/mode-html_ruby.js @@ -0,0 +1,2322 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2012, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ***** END LICENSE BLOCK ***** */ + + +ace.define('ace/mode/html_ruby', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/tokenizer', 'ace/mode/html_ruby_highlight_rules', 'ace/mode/html', 'ace/mode/javascript', 'ace/mode/css', 'ace/mode/ruby'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var Tokenizer = require("../tokenizer").Tokenizer; +var HtmlRubyHighlightRules = require("./html_ruby_highlight_rules").HtmlRubyHighlightRules; +var HtmlMode = require("./html").Mode; +var JavaScriptMode = require("./javascript").Mode; +var CssMode = require("./css").Mode; +var RubyMode = require("./ruby").Mode; + +var Mode = function() { + HtmlMode.call(this); + var highlighter = new HtmlRubyHighlightRules(); + this.$tokenizer = new Tokenizer(highlighter.getRules()); + this.$embeds = highlighter.getEmbeds(); + this.createModeDelegates({ + "js-": JavaScriptMode, + "css-": CssMode, + "ruby-": RubyMode + }); +}; +oop.inherits(Mode, HtmlMode); + +(function() { + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/html_ruby_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/html_highlight_rules', 'ace/mode/ruby_highlight_rules'], function(require, exports, module) { + + + var oop = require("../lib/oop"); + var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules; + var RubyHighlightRules = require("./ruby_highlight_rules").RubyHighlightRules; + + var HtmlRubyHighlightRules = function() { + HtmlHighlightRules.call(this); + + for (var i in this.$rules) { + this.$rules[i].unshift({ + regex: "<%%|%%>", + token: "constant.language.escape" + }, { + token : "comment.start.erb", + regex : "<%#", + push : [{regex: "%>", next: "pop"}] + }, { + token : "support.ruby_tag", + regex : "<%+(?!>)[-=]?", + push : "ruby-start" + }); + } + + this.embedRules(RubyHighlightRules, "ruby-"); + + this.$rules["ruby-start"].unshift({ + token : "support.ruby_tag", + regex : "%>", + next : "pop" + }, { + token: "comment", + regex: /#(?:[^%]|%[^>])*/ + }); + + this.normalizeRules(); + }; + + + oop.inherits(HtmlRubyHighlightRules, HtmlHighlightRules); + + exports.HtmlRubyHighlightRules = HtmlRubyHighlightRules; +}); + +ace.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_util', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var xmlUtil = require("./xml_util"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var tagMap = lang.createMap({ + a : 'anchor', + button : 'form', + form : 'form', + img : 'image', + input : 'form', + label : 'form', + script : 'script', + select : 'form', + textarea : 'form', + style : 'style', + table : 'table', + tbody : 'table', + td : 'table', + tfoot : 'table', + th : 'table', + tr : 'table' +}); + +var HtmlHighlightRules = function() { + this.$rules = { + start : [{ + token : "text", + regex : "<\\!\\[CDATA\\[", + next : "cdata" + }, { + token : "xml-pe", + regex : "<\\?.*?\\?>" + }, { + token : "comment", + regex : "<\\!--", + next : "comment" + }, { + token : "xml-pe", + regex : "<\\!.*?>" + }, { + token : "meta.tag", + regex : "<(?=script\\b)", + next : "script" + }, { + token : "meta.tag", + regex : "<(?=style\\b)", + next : "style" + }, { + token : "meta.tag", // opening tag + regex : "<\\/?(?=\\S)", + next : "tag" + }, { + token : "text", + regex : "\\s+" + }, { + token : "constant.character.entity", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }], + + cdata : [ { + token : "text", + regex : "\\]\\]>", + next : "start" + } ], + + comment : [ { + token : "comment", + regex : ".*?-->", + next : "start" + }, { + defaultToken : "comment" + } ] + }; + + xmlUtil.tag(this.$rules, "tag", "start", tagMap); + xmlUtil.tag(this.$rules, "style", "css-start", tagMap); + xmlUtil.tag(this.$rules, "script", "js-start", tagMap); + + this.embedRules(JavaScriptHighlightRules, "js-", [{ + token: "comment", + regex: "\\/\\/.*(?=<\\/script>)", + next: "tag" + }, { + token: "meta.tag", + regex: "<\\/(?=script)", + next: "tag" + }]); + + this.embedRules(CssHighlightRules, "css-", [{ + token: "meta.tag", + regex: "<\\/(?=style)", + next: "tag" + }]); +}; + +oop.inherits(HtmlHighlightRules, TextHighlightRules); + +exports.HtmlHighlightRules = HtmlHighlightRules; +}); + +ace.define('ace/mode/css_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var supportType = exports.supportType = "animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|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|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|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|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index"; +var supportFunction = exports.supportFunction = "rgb|rgba|url|attr|counter|counters"; +var supportConstant = exports.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"; +var supportConstantColor = exports.supportConstantColor = "aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow"; +var supportConstantFonts = exports.supportConstantFonts = "arial|century|comic|courier|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace"; + +var numRe = exports.numRe = "\\-?(?:(?:[0-9]+)|(?:[0-9]*\\.[0-9]+))"; +var pseudoElements = exports.pseudoElements = "(\\:+)\\b(after|before|first-letter|first-line|moz-selection|selection)\\b"; +var pseudoClasses = exports.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"; + +var CssHighlightRules = function() { + + var keywordMapper = this.createKeywordMapper({ + "support.function": supportFunction, + "support.constant": supportConstant, + "support.type": supportType, + "support.constant.color": supportConstantColor, + "support.constant.fonts": supportConstantFonts + }, "text", true); + + var base_ruleset = [ + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "ruleset_comment" + }, { + token : "string", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' + }, { + token : "string", // single line + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" + }, { + token : ["constant.numeric", "keyword"], + regex : "(" + numRe + ")(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 : numRe + }, { + token : "constant.numeric", // hex6 color + regex : "#[a-f0-9]{6}" + }, { + token : "constant.numeric", // hex3 color + regex : "#[a-f0-9]{3}" + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"], + regex : pseudoElements + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"], + regex : pseudoClasses + }, { + token : ["support.function", "string", "support.function"], + regex : "(url\\()(.*)(\\))" + }, { + token : keywordMapper, + regex : "\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*" + }, { + caseInsensitive: true + } + ]; + + var ruleset = lang.copyArray(base_ruleset); + ruleset.unshift({ + token : "paren.rparen", + regex : "\\}", + next: "start" + }); + + var media_ruleset = lang.copyArray( base_ruleset ); + media_ruleset.unshift({ + token : "paren.rparen", + regex : "\\}", + next: "media" + }); + + var base_comment = [{ + token : "comment", // comment spanning whole line + regex : ".+" + }]; + + var comment = lang.copyArray(base_comment); + comment.unshift({ + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "start" + }); + + var media_comment = lang.copyArray(base_comment); + media_comment.unshift({ + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "media" + }); + + var ruleset_comment = lang.copyArray(base_comment); + ruleset_comment.unshift({ + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "ruleset" + }); + + this.$rules = { + "start" : [{ + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment" + }, { + token: "paren.lparen", + regex: "\\{", + next: "ruleset" + }, { + token: "string", + regex: "@.*?{", + next: "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: true + }], + + "media" : [ { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "media_comment" + }, { + token: "paren.lparen", + regex: "\\{", + next: "media_ruleset" + },{ + token: "string", + regex: "\\}", + next: "start" + },{ + 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: true + }], + + "comment" : comment, + + "ruleset" : ruleset, + "ruleset_comment" : ruleset_comment, + + "media_ruleset" : media_ruleset, + "media_comment" : media_comment + }; +}; + +oop.inherits(CssHighlightRules, TextHighlightRules); + +exports.CssHighlightRules = CssHighlightRules; + +}); + +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(require, exports, module) { + + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var JavaScriptHighlightRules = function() { + var keywordMapper = this.createKeywordMapper({ + "variable.language": + "Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|" + // Constructors + "Namespace|QName|XML|XMLList|" + // E4X + "ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|" + + "Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|" + + "Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|" + // Errors + "SyntaxError|TypeError|URIError|" + + "decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|" + // Non-constructor functions + "isNaN|parseFloat|parseInt|" + + "JSON|Math|" + // Other + "this|arguments|prototype|window|document" , // Pseudo + "keyword": + "const|yield|import|get|set|" + + "break|case|catch|continue|default|delete|do|else|finally|for|function|" + + "if|in|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"); + var kwBeforeRe = "case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void"; + var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*\\b"; + + var escapedRe = "\\\\(?:x[0-9a-fA-F]{2}|" + // hex + "u[0-9a-fA-F]{4}|" + // unicode + "[0-2][0-7]{0,2}|" + // oct + "3[0-6][0-7]?|" + // oct + "37[0-7]?|" + // oct + "[4-7][0-7]?|" + //oct + ".)"; + + this.$rules = { + "no_regex" : [ + { + token : "comment", + regex : /\/\/.*$/ + }, + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : /\/\*/, + next : "comment" + }, { + token : "string", + regex : "'(?=.)", + next : "qstring" + }, { + token : "string", + regex : '"(?=.)', + next : "qqstring" + }, { + token : "constant.numeric", // hex + regex : /0[xX][0-9a-fA-F]+\b/ + }, { + token : "constant.numeric", // float + regex : /[+-]?\d+(?:(?:\.\d*)?(?:[eE][+-]?\d+)?)?\b/ + }, { + token : [ + "storage.type", "punctuation.operator", "support.function", + "punctuation.operator", "entity.name.function", "text","keyword.operator" + ], + regex : "(" + identifierRe + ")(\\.)(prototype)(\\.)(" + identifierRe +")(\\s*)(=)", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "keyword.operator", "text", "storage.type", + "text", "paren.lparen" + ], + regex : "(" + identifierRe +")(\\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 : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(function)(\\s+)(" + identifierRe + ")(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "punctuation.operator", + "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\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 : "(?:" + kwBeforeRe + ")\\b", + next : "start" + }, { + token : ["punctuation.operator", "support.function"], + regex : /(\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:opzzzz|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 : ["punctuation.operator", "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)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/ + }, { + token : ["punctuation.operator", "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 : ["storage.type", "punctuation.operator", "support.function.firebug"], + regex : /(console)(\.)(warn|info|log|error|time|timeEnd|assert)\b/ + }, { + token : keywordMapper, + regex : identifierRe + }, { + token : "keyword.operator", + regex : /--|\+\+|[!$%&*+\-~]|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\|\||\?\:|\*=|%=|\+=|\-=|&=|\^=/, + next : "start" + }, { + token : "punctuation.operator", + regex : /\?|\:|\,|\;|\./, + next : "start" + }, { + token : "paren.lparen", + regex : /[\[({]/, + next : "start" + }, { + token : "paren.rparen", + regex : /[\])}]/ + }, { + token : "keyword.operator", + regex : /\/=?/, + next : "start" + }, { + token: "comment", + regex: /^#!.*$/ + } + ], + "start": [ + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment_regex_allowed" + }, { + token : "comment", + regex : "\\/\\/.*$", + next : "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: "/\\w*", + 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.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: identifierRe + }, { + token: "punctuation.operator", + regex: "[, ]+" + }, { + token: "punctuation.operator", + regex: "$" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "comment_regex_allowed" : [ + {token : "comment", regex : "\\*\\/", next : "start"}, + {defaultToken : "comment"} + ], + "comment" : [ + {token : "comment", regex : "\\*\\/", next : "no_regex"}, + {defaultToken : "comment"} + ], + "qqstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + next : "qqstring" + }, { + token : "string", + regex : '"|$', + next : "no_regex" + }, { + defaultToken: "string" + } + ], + "qstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + next : "qstring" + }, { + token : "string", + regex : "'|$", + next : "no_regex" + }, { + defaultToken: "string" + } + ] + }; + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("no_regex") ]); +}; + +oop.inherits(JavaScriptHighlightRules, TextHighlightRules); + +exports.JavaScriptHighlightRules = JavaScriptHighlightRules; +}); + +ace.define('ace/mode/doc_comment_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, { + token : "comment.doc.tag", + regex : "\\bTODO\\b" + }, { + defaultToken : "comment.doc" + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define('ace/mode/xml_util', ['require', 'exports', 'module' ], function(require, exports, module) { + + +function string(state) { + return [{ + token : "string", + regex : '"', + next : state + "_qqstring" + }, { + token : "string", + regex : "'", + next : state + "_qstring" + }]; +} + +function multiLineString(quote, state) { + return [ + {token : "string", regex : quote, next : state}, + { + token : "constant.language.escape", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }, + {defaultToken : "string"} + ]; +} + +exports.tag = function(states, name, nextState, tagMap) { + states[name] = [{ + token : "text", + regex : "\\s+" + }, { + + token : !tagMap ? "meta.tag.tag-name" : function(value) { + if (tagMap[value]) + return "meta.tag.tag-name." + tagMap[value]; + else + return "meta.tag.tag-name"; + }, + regex : "[-_a-zA-Z0-9:]+", + next : name + "_embed_attribute_list" + }, { + token: "empty", + regex: "", + next : name + "_embed_attribute_list" + }]; + + states[name + "_qstring"] = multiLineString("'", name + "_embed_attribute_list"); + states[name + "_qqstring"] = multiLineString("\"", name + "_embed_attribute_list"); + + states[name + "_embed_attribute_list"] = [{ + token : "meta.tag.r", + regex : "/?>", + next : nextState + }, { + token : "keyword.operator", + regex : "=" + }, { + token : "entity.other.attribute-name", + regex : "[-_a-zA-Z0-9:]+" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : "text", + regex : "\\s+" + }].concat(string(name)); +}; + +}); + +ace.define('ace/mode/ruby_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var constantOtherSymbol = exports.constantOtherSymbol = { + token : "constant.other.symbol.ruby", // symbol + regex : "[:](?:[A-Za-z_]|[@$](?=[a-zA-Z0-9_]))[a-zA-Z0-9_]*[!=?]?" +}; + +var qString = exports.qString = { + token : "string", // single line + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" +}; + +var qqString = exports.qqString = { + token : "string", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' +}; + +var tString = exports.tString = { + token : "string", // backtick string + regex : "[`](?:(?:\\\\.)|(?:[^'\\\\]))*?[`]" +}; + +var constantNumericHex = exports.constantNumericHex = { + token : "constant.numeric", // hex + regex : "0[xX][0-9a-fA-F](?:[0-9a-fA-F]|_(?=[0-9a-fA-F]))*\\b" +}; + +var constantNumericFloat = exports.constantNumericFloat = { + token : "constant.numeric", // float + regex : "[+-]?\\d(?:\\d|_(?=\\d))*(?:(?:\\.\\d(?:\\d|_(?=\\d))*)?(?:[eE][+-]?\\d+)?)?\\b" +}; + +var RubyHighlightRules = function() { + + var builtinFunctions = ( + "abort|Array|assert|assert_equal|assert_not_equal|assert_same|assert_not_same|" + + "assert_nil|assert_not_nil|assert_match|assert_no_match|assert_in_delta|assert_throws|" + + "assert_raise|assert_nothing_raised|assert_instance_of|assert_kind_of|assert_respond_to|" + + "assert_operator|assert_send|assert_difference|assert_no_difference|assert_recognizes|" + + "assert_generates|assert_response|assert_redirected_to|assert_template|assert_select|" + + "assert_select_email|assert_select_rjs|assert_select_encoded|css_select|at_exit|" + + "attr|attr_writer|attr_reader|attr_accessor|attr_accessible|autoload|binding|block_given?|callcc|" + + "caller|catch|chomp|chomp!|chop|chop!|defined?|delete_via_redirect|eval|exec|exit|" + + "exit!|fail|Float|flunk|follow_redirect!|fork|form_for|form_tag|format|gets|global_variables|gsub|" + + "gsub!|get_via_redirect|host!|https?|https!|include|Integer|lambda|link_to|" + + "link_to_unless_current|link_to_function|link_to_remote|load|local_variables|loop|open|open_session|" + + "p|print|printf|proc|putc|puts|post_via_redirect|put_via_redirect|raise|rand|" + + "raw|readline|readlines|redirect?|request_via_redirect|require|scan|select|" + + "set_trace_func|sleep|split|sprintf|srand|String|stylesheet_link_tag|syscall|system|sub|sub!|test|" + + "throw|trace_var|trap|untrace_var|atan2|cos|exp|frexp|ldexp|log|log10|sin|sqrt|tan|" + + "render|javascript_include_tag|csrf_meta_tag|label_tag|text_field_tag|submit_tag|check_box_tag|" + + "content_tag|radio_button_tag|text_area_tag|password_field_tag|hidden_field_tag|" + + "fields_for|select_tag|options_for_select|options_from_collection_for_select|collection_select|" + + "time_zone_select|select_date|select_time|select_datetime|date_select|time_select|datetime_select|" + + "select_year|select_month|select_day|select_hour|select_minute|select_second|file_field_tag|" + + "file_field|respond_to|skip_before_filter|around_filter|after_filter|verify|" + + "protect_from_forgery|rescue_from|helper_method|redirect_to|before_filter|" + + "send_data|send_file|validates_presence_of|validates_uniqueness_of|validates_length_of|" + + "validates_format_of|validates_acceptance_of|validates_associated|validates_exclusion_of|" + + "validates_inclusion_of|validates_numericality_of|validates_with|validates_each|" + + "authenticate_or_request_with_http_basic|authenticate_or_request_with_http_digest|" + + "filter_parameter_logging|match|get|post|resources|redirect|scope|assert_routing|" + + "translate|localize|extract_locale_from_tld|caches_page|expire_page|caches_action|expire_action|" + + "cache|expire_fragment|expire_cache_for|observe|cache_sweeper|" + + "has_many|has_one|belongs_to|has_and_belongs_to_many" + ); + + var keywords = ( + "alias|and|BEGIN|begin|break|case|class|def|defined|do|else|elsif|END|end|ensure|" + + "__FILE__|finally|for|gem|if|in|__LINE__|module|next|not|or|private|protected|public|" + + "redo|rescue|retry|return|super|then|undef|unless|until|when|while|yield" + ); + + var buildinConstants = ( + "true|TRUE|false|FALSE|nil|NIL|ARGF|ARGV|DATA|ENV|RUBY_PLATFORM|RUBY_RELEASE_DATE|" + + "RUBY_VERSION|STDERR|STDIN|STDOUT|TOPLEVEL_BINDING" + ); + + var builtinVariables = ( + "\$DEBUG|\$defout|\$FILENAME|\$LOAD_PATH|\$SAFE|\$stdin|\$stdout|\$stderr|\$VERBOSE|" + + "$!|root_url|flash|session|cookies|params|request|response|logger|self" + ); + + var keywordMapper = this.$keywords = this.createKeywordMapper({ + "keyword": keywords, + "constant.language": buildinConstants, + "variable.language": builtinVariables, + "support.function": builtinFunctions, + "invalid.deprecated": "debugger" // TODO is this a remnant from js mode? + }, "identifier"); + + this.$rules = { + "start" : [ + { + token : "comment", + regex : "#.*$" + }, { + token : "comment", // multi line comment + regex : "^=begin(?:$|\\s.*$)", + next : "comment" + }, { + token : "string.regexp", + regex : "[/](?:(?:\\[(?:\\\\]|[^\\]])+\\])|(?:\\\\/|[^\\]/]))*[/]\\w*\\s*(?=[).,;]|$)" + }, + + qString, + qqString, + tString, + + { + token : "text", // namespaces aren't symbols + regex : "::" + }, { + token : "variable.instance", // instance variable + regex : "@{1,2}[a-zA-Z_\\d]+" + }, { + token : "support.class", // class name + regex : "[A-Z][a-zA-Z_\\d]+" + }, + + constantOtherSymbol, + constantNumericHex, + constantNumericFloat, + + { + token : "constant.language.boolean", + regex : "(?:true|false)\\b" + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "punctuation.separator.key-value", + regex : "=>" + }, { + stateName: "heredoc", + onMatch : function(value, currentState, stack) { + var next = value[2] == '-' ? "indentedHeredoc" : "heredoc"; + var tokens = value.split(this.splitRegex); + stack.push(next, tokens[3]); + return [ + {type:"constant", value: tokens[1]}, + {type:"string", value: tokens[2]}, + {type:"support.class", value: tokens[3]}, + {type:"string", value: tokens[4]} + ]; + }, + regex : "(<<-?)(['\"`]?)([\\w]+)(['\"`]?)", + rules: { + heredoc: [{ + onMatch: function(value, currentState, stack) { + if (value == stack[1]) { + stack.shift(); + stack.shift(); + return "support.class"; + } + return "string"; + }, + regex: ".*$", + next: "start" + }], + indentedHeredoc: [{ + token: "string", + regex: "^ +" + }, { + onMatch: function(value, currentState, stack) { + if (value == stack[1]) { + stack.shift(); + stack.shift(); + return "support.class"; + } + return "string"; + }, + regex: ".*$", + next: "start" + }] + } + }, { + token : "keyword.operator", + regex : "!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)" + }, { + token : "paren.lparen", + regex : "[[({]" + }, { + token : "paren.rparen", + regex : "[\\])}]" + }, { + token : "text", + regex : "\\s+" + } + ], + "comment" : [ + { + token : "comment", // closing comment + regex : "^=end(?:$|\\s.*$)", + next : "start" + }, { + token : "comment", // comment spanning whole line + regex : ".+" + } + ] + }; + + this.normalizeRules(); +}; + +oop.inherits(RubyHighlightRules, TextHighlightRules); + +exports.RubyHighlightRules = RubyHighlightRules; +}); + +ace.define('ace/mode/html', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/mode/javascript', 'ace/mode/css', 'ace/tokenizer', 'ace/mode/html_highlight_rules', 'ace/mode/behaviour/html', 'ace/mode/folding/html'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var JavaScriptMode = require("./javascript").Mode; +var CssMode = require("./css").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules; +var HtmlBehaviour = require("./behaviour/html").HtmlBehaviour; +var HtmlFoldMode = require("./folding/html").FoldMode; + +var Mode = function() { + var highlighter = new HtmlHighlightRules(); + this.$tokenizer = new Tokenizer(highlighter.getRules()); + this.$behaviour = new HtmlBehaviour(); + + this.$embeds = highlighter.getEmbeds(); + this.createModeDelegates({ + "js-": JavaScriptMode, + "css-": CssMode + }); + + this.foldingRules = new HtmlFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.blockComment = {start: ""}; + + this.getNextLineIndent = function(state, line, tab) { + return this.$getIndent(line); + }; + + this.checkOutdent = function(state, line, input) { + return false; + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/javascript', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/javascript_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/range', 'ace/worker/worker_client', 'ace/mode/behaviour/cstyle', 'ace/mode/folding/cstyle'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var Range = require("../range").Range; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new JavaScriptHighlightRules().getRules()); + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.$tokenizer.getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start" || state == "no_regex") { + var match = line.match(/^.*(?:\bcase\b.*\:|[\{\(\[])\s*$/); + if (match) { + indent += tab; + } + } else if (state == "doc-start") { + if (endState == "start" || endState == "no_regex") { + return ""; + } + var match = line.match(/^\s*(\/?)\*/); + if (match) { + if (match[1]) { + indent += " "; + } + indent += "* "; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/javascript_worker", "JavaScriptWorker"); + worker.attachToDocument(session.getDocument()); + + worker.on("jslint", function(results) { + session.setAnnotations(results.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) { + + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define('ace/mode/behaviour/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/token_iterator', 'ace/lib/lang'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; +var lang = require("../../lib/lang"); + +var SAFE_INSERT_IN_TOKENS = + ["text", "paren.rparen", "punctuation.operator"]; +var SAFE_INSERT_BEFORE_TOKENS = + ["text", "paren.rparen", "punctuation.operator", "comment"]; + + +var autoInsertedBrackets = 0; +var autoInsertedRow = -1; +var autoInsertedLineEnd = ""; +var maybeInsertedBrackets = 0; +var maybeInsertedRow = -1; +var maybeInsertedLineStart = ""; +var maybeInsertedLineEnd = ""; + +var CstyleBehaviour = function () { + + CstyleBehaviour.isSaneInsertion = function(editor, session) { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + if (!this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) { + var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1); + if (!this.$matchTokenType(iterator2.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) + return false; + } + iterator.stepForward(); + return iterator.getCurrentTokenRow() !== cursor.row || + this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_BEFORE_TOKENS); + }; + + CstyleBehaviour.$matchTokenType = function(token, types) { + return types.indexOf(token.type || token) > -1; + }; + + CstyleBehaviour.recordAutoInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isAutoInsertedClosing(cursor, line, autoInsertedLineEnd[0])) + autoInsertedBrackets = 0; + autoInsertedRow = cursor.row; + autoInsertedLineEnd = bracket + line.substr(cursor.column); + autoInsertedBrackets++; + }; + + CstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isMaybeInsertedClosing(cursor, line)) + maybeInsertedBrackets = 0; + maybeInsertedRow = cursor.row; + maybeInsertedLineStart = line.substr(0, cursor.column) + bracket; + maybeInsertedLineEnd = line.substr(cursor.column); + maybeInsertedBrackets++; + }; + + CstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) { + return autoInsertedBrackets > 0 && + cursor.row === autoInsertedRow && + bracket === autoInsertedLineEnd[0] && + line.substr(cursor.column) === autoInsertedLineEnd; + }; + + CstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) { + return maybeInsertedBrackets > 0 && + cursor.row === maybeInsertedRow && + line.substr(cursor.column) === maybeInsertedLineEnd && + line.substr(0, cursor.column) == maybeInsertedLineStart; + }; + + CstyleBehaviour.popAutoInsertedClosing = function() { + autoInsertedLineEnd = autoInsertedLineEnd.substr(1); + autoInsertedBrackets--; + }; + + CstyleBehaviour.clearMaybeInsertedClosing = function() { + maybeInsertedBrackets = 0; + maybeInsertedRow = -1; + }; + + this.add("braces", "insertion", function (state, action, editor, session, text) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (text == '{') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "{" && editor.getWrapBehavioursEnabled()) { + return { + text: '{' + selected + '}', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + if (/[\]\}\)]/.test(line[cursor.column])) { + CstyleBehaviour.recordAutoInsert(editor, session, "}"); + return { + text: '{}', + selection: [1, 1] + }; + } else { + CstyleBehaviour.recordMaybeInsert(editor, session, "{"); + return { + text: '{', + selection: [1, 1] + }; + } + } + } else if (text == '}') { + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}') { + var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } else if (text == "\n" || text == "\r\n") { + var closing = ""; + if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) { + closing = lang.stringRepeat("}", maybeInsertedBrackets); + CstyleBehaviour.clearMaybeInsertedClosing(); + } + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}' || closing !== "") { + var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column}, '}'); + if (!openBracePos) + return null; + + var indent = this.getNextLineIndent(state, line.substring(0, cursor.column), session.getTabString()); + var next_indent = this.$getIndent(line); + + return { + text: '\n' + indent + '\n' + next_indent + closing, + selection: [1, indent.length, 1, indent.length] + }; + } + } + }); + + this.add("braces", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '{') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar == '}') { + range.end.column++; + return range; + } else { + maybeInsertedBrackets--; + } + } + }); + + this.add("parens", "insertion", function (state, action, editor, session, text) { + if (text == '(') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return { + text: '(' + selected + ')', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, ")"); + return { + text: '()', + selection: [1, 1] + }; + } + } else if (text == ')') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ')') { + var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("parens", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '(') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ')') { + range.end.column++; + return range; + } + } + }); + + this.add("brackets", "insertion", function (state, action, editor, session, text) { + if (text == '[') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return { + text: '[' + selected + ']', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, "]"); + return { + text: '[]', + selection: [1, 1] + }; + } + } else if (text == ']') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ']') { + var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("brackets", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '[') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ']') { + range.end.column++; + return range; + } + } + }); + + this.add("string_dquotes", "insertion", function (state, action, editor, session, text) { + if (text == '"' || text == "'") { + var quote = text; + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "'" && selected != '"' && editor.getWrapBehavioursEnabled()) { + return { + text: quote + selected + quote, + selection: false + }; + } else { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var leftChar = line.substring(cursor.column-1, cursor.column); + if (leftChar == '\\') { + return null; + } + var tokens = session.getTokens(selection.start.row); + var col = 0, token; + var quotepos = -1; // Track whether we're inside an open quote. + + for (var x = 0; x < tokens.length; x++) { + token = tokens[x]; + if (token.type == "string") { + quotepos = -1; + } else if (quotepos < 0) { + quotepos = token.value.indexOf(quote); + } + if ((token.value.length + col) > selection.start.column) { + break; + } + col += tokens[x].value.length; + } + if (!token || (quotepos < 0 && token.type !== "comment" && (token.type !== "string" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) { + if (!CstyleBehaviour.isSaneInsertion(editor, session)) + return; + return { + text: quote + quote, + selection: [1,1] + }; + } else if (token && token.type === "string") { + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == quote) { + return { + text: '', + selection: [1, 1] + }; + } + } + } + } + }); + + this.add("string_dquotes", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && (selected == '"' || selected == "'")) { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == selected) { + range.end.column++; + return range; + } + } + }); + +}; + +oop.inherits(CstyleBehaviour, Behaviour); + +exports.CstyleBehaviour = CstyleBehaviour; +}); + +ace.define('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var line = session.getLine(row); + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i + match[0].length, 1); + } + + if (foldStyle !== "markbeginend") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define('ace/mode/css', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/css_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/worker/worker_client', 'ace/mode/behaviour/css', 'ace/mode/folding/cstyle'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CssBehaviour = require("./behaviour/css").CssBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new CssHighlightRules().getRules()); + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CssBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.foldingRules = "cStyle"; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + var tokens = this.$tokenizer.getLineTokens(line, state).tokens; + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + var match = line.match(/^.*\{\s*$/); + if (match) { + indent += tab; + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/css_worker", "Worker"); + worker.attachToDocument(session.getDocument()); + + worker.on("csslint", function(e) { + session.setAnnotations(e.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; + +}); + +ace.define('ace/mode/behaviour/css', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/mode/behaviour/cstyle', 'ace/token_iterator'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var CstyleBehaviour = require("./cstyle").CstyleBehaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; + +var CssBehaviour = function () { + + this.inherit(CstyleBehaviour); + + this.add("colon", "insertion", function (state, action, editor, session, text) { + if (text === ':') { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + if (token && token.value.match(/\s+/)) { + token = iterator.stepBackward(); + } + if (token && token.type === 'support.type') { + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar === ':') { + return { + text: '', + selection: [1, 1] + } + } + if (!line.substring(cursor.column).match(/^\s*;/)) { + return { + text: ':;', + selection: [1, 1] + } + } + } + } + }); + + this.add("colon", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected === ':') { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + if (token && token.value.match(/\s+/)) { + token = iterator.stepBackward(); + } + if (token && token.type === 'support.type') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar === ';') { + range.end.column ++; + return range; + } + } + } + }); + + this.add("semicolon", "insertion", function (state, action, editor, session, text) { + if (text === ';') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar === ';') { + return { + text: '', + selection: [1, 1] + } + } + } + }); + +} +oop.inherits(CssBehaviour, CstyleBehaviour); + +exports.CssBehaviour = CssBehaviour; +}); + +ace.define('ace/mode/behaviour/html', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour/xml', 'ace/mode/behaviour/cstyle', 'ace/token_iterator'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var XmlBehaviour = require("../behaviour/xml").XmlBehaviour; +var CstyleBehaviour = require("./cstyle").CstyleBehaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; +var voidElements = ['area', 'base', 'br', 'col', 'command', 'embed', 'hr', 'img', 'input', 'keygen', 'link', 'meta', 'param', 'source', 'track', 'wbr']; + +function hasType(token, type) { + var hasType = true; + var typeList = token.type.split('.'); + var needleList = type.split('.'); + needleList.forEach(function(needle){ + if (typeList.indexOf(needle) == -1) { + hasType = false; + return false; + } + }); + return hasType; +} + +var HtmlBehaviour = function () { + + this.inherit(XmlBehaviour); // Get xml behaviour + + this.add("autoclosing", "insertion", function (state, action, editor, session, text) { + if (text == '>') { + var position = editor.getCursorPosition(); + var iterator = new TokenIterator(session, position.row, position.column); + var token = iterator.getCurrentToken(); + + if (hasType(token, 'string') && iterator.getCurrentTokenColumn() + token.value.length > position.column) + return; + var atCursor = false; + if (!token || !hasType(token, 'meta.tag') && !(hasType(token, 'text') && token.value.match('/'))){ + do { + token = iterator.stepBackward(); + } while (token && (hasType(token, 'string') || hasType(token, 'keyword.operator') || hasType(token, 'entity.attribute-name') || hasType(token, 'text'))); + } else { + atCursor = true; + } + if (!token || !hasType(token, 'meta.tag-name') || iterator.stepBackward().value.match('/')) { + return + } + var element = token.value; + if (atCursor){ + var element = element.substring(0, position.column - token.start); + } + if (voidElements.indexOf(element) !== -1){ + return; + } + return { + text: '>' + '', + selection: [1, 1] + } + } + }); +} +oop.inherits(HtmlBehaviour, XmlBehaviour); + +exports.HtmlBehaviour = HtmlBehaviour; +}); + +ace.define('ace/mode/behaviour/xml', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/mode/behaviour/cstyle', 'ace/token_iterator'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var CstyleBehaviour = require("./cstyle").CstyleBehaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; + +function hasType(token, type) { + var hasType = true; + var typeList = token.type.split('.'); + var needleList = type.split('.'); + needleList.forEach(function(needle){ + if (typeList.indexOf(needle) == -1) { + hasType = false; + return false; + } + }); + return hasType; +} + +var XmlBehaviour = function () { + + this.inherit(CstyleBehaviour, ["string_dquotes"]); // Get string behaviour + + this.add("autoclosing", "insertion", function (state, action, editor, session, text) { + if (text == '>') { + var position = editor.getCursorPosition(); + var iterator = new TokenIterator(session, position.row, position.column); + var token = iterator.getCurrentToken(); + var atCursor = false; + if (!token || !hasType(token, 'meta.tag') && !(hasType(token, 'text') && token.value.match('/'))){ + do { + token = iterator.stepBackward(); + } while (token && (hasType(token, 'string') || hasType(token, 'keyword.operator') || hasType(token, 'entity.attribute-name') || hasType(token, 'text'))); + } else { + atCursor = true; + } + if (!token || !hasType(token, 'meta.tag-name') || iterator.stepBackward().value.match('/')) { + return + } + var tag = token.value; + if (atCursor){ + var tag = tag.substring(0, position.column - token.start); + } + + return { + text: '>' + '', + selection: [1, 1] + } + } + }); + + this.add('autoindent', 'insertion', function (state, action, editor, session, text) { + if (text == "\n") { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChars = line.substring(cursor.column, cursor.column + 2); + if (rightChars == '?)/; + this._parseTag = function(tag) { + + var match = tag.match(this.tagRe); + var column = 0; + + return { + value: tag, + match: match ? match[2] : "", + closing: match ? !!match[3] : false, + selfClosing: match ? !!match[5] || match[2] == "/>" : false, + tagName: match ? match[4] : "", + column: match[1] ? column + match[1].length : column + }; + }; + this._readTagForward = function(iterator) { + var token = iterator.getCurrentToken(); + if (!token) + return null; + + var value = ""; + var start; + + do { + if (token.type.indexOf("meta.tag") === 0) { + if (!start) { + var start = { + row: iterator.getCurrentTokenRow(), + column: iterator.getCurrentTokenColumn() + }; + } + value += token.value; + if (value.indexOf(">") !== -1) { + var tag = this._parseTag(value); + tag.start = start; + tag.end = { + row: iterator.getCurrentTokenRow(), + column: iterator.getCurrentTokenColumn() + token.value.length + }; + iterator.stepForward(); + return tag; + } + } + } while(token = iterator.stepForward()); + + return null; + }; + + this._readTagBackward = function(iterator) { + var token = iterator.getCurrentToken(); + if (!token) + return null; + + var value = ""; + var end; + + do { + if (token.type.indexOf("meta.tag") === 0) { + if (!end) { + end = { + row: iterator.getCurrentTokenRow(), + column: iterator.getCurrentTokenColumn() + token.value.length + }; + } + value = token.value + value; + if (value.indexOf("<") !== -1) { + var tag = this._parseTag(value); + tag.end = end; + tag.start = { + row: iterator.getCurrentTokenRow(), + column: iterator.getCurrentTokenColumn() + }; + iterator.stepBackward(); + return tag; + } + } + } while(token = iterator.stepBackward()); + + return null; + }; + + this._pop = function(stack, tag) { + while (stack.length) { + + var top = stack[stack.length-1]; + if (!tag || top.tagName == tag.tagName) { + return stack.pop(); + } + else if (this.voidElements[tag.tagName]) { + return; + } + else if (this.voidElements[top.tagName]) { + stack.pop(); + continue; + } else { + return null; + } + } + }; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var firstTag = this._getFirstTagInLine(session, row); + + if (!firstTag.match) + return null; + + var isBackward = firstTag.closing || firstTag.selfClosing; + var stack = []; + var tag; + + if (!isBackward) { + var iterator = new TokenIterator(session, row, firstTag.column); + var start = { + row: row, + column: firstTag.column + firstTag.tagName.length + 2 + }; + while (tag = this._readTagForward(iterator)) { + if (tag.selfClosing) { + if (!stack.length) { + tag.start.column += tag.tagName.length + 2; + tag.end.column -= 2; + return Range.fromPoints(tag.start, tag.end); + } else + continue; + } + + if (tag.closing) { + this._pop(stack, tag); + if (stack.length == 0) + return Range.fromPoints(start, tag.start); + } + else { + stack.push(tag) + } + } + } + else { + var iterator = new TokenIterator(session, row, firstTag.column + firstTag.match.length); + var end = { + row: row, + column: firstTag.column + }; + + while (tag = this._readTagBackward(iterator)) { + if (tag.selfClosing) { + if (!stack.length) { + tag.start.column += tag.tagName.length + 2; + tag.end.column -= 2; + return Range.fromPoints(tag.start, tag.end); + } else + continue; + } + + if (!tag.closing) { + this._pop(stack, tag); + if (stack.length == 0) { + tag.start.column += tag.tagName.length + 2; + return Range.fromPoints(tag.start, end); + } + } + else { + stack.push(tag) + } + } + } + + }; + +}).call(FoldMode.prototype); + +}); + +ace.define('ace/mode/ruby', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/ruby_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/range', 'ace/mode/folding/coffee'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var RubyHighlightRules = require("./ruby_highlight_rules").RubyHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var Range = require("../range").Range; +var FoldMode = require("./folding/coffee").FoldMode; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new RubyHighlightRules().getRules()); + this.$outdent = new MatchingBraceOutdent(); + this.foldingRules = new FoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + + this.lineCommentStart = "#"; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.$tokenizer.getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start") { + var match = line.match(/^.*[\{\(\[]\s*$/); + var startingClassOrMethod = line.match(/^\s*(class|def)\s.*$/); + var startingDoBlock = line.match(/.*do(\s*|\s+\|.*\|\s*)$/); + var startingConditional = line.match(/^\s*(if|else)\s*/) + if (match || startingClassOrMethod || startingDoBlock || startingConditional) { + indent += tab; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return /^\s+end$/.test(line + input) || /^\s+}$/.test(line + input) || /^\s+else$/.test(line + input); + }; + + this.autoOutdent = function(state, doc, row) { + var indent = this.$getIndent(doc.getLine(row)); + var tab = doc.getTabString(); + if (indent.slice(-tab.length) == tab) + doc.remove(new Range(row, indent.length-tab.length, row, indent.length)); + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/folding/coffee', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/folding/fold_mode', 'ace/range'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var BaseFoldMode = require("./fold_mode").FoldMode; +var Range = require("../../range").Range; + +var FoldMode = exports.FoldMode = function() {}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var range = this.indentationBlock(session, row); + if (range) + return range; + + var re = /\S/; + var line = session.getLine(row); + var startLevel = line.search(re); + if (startLevel == -1 || line[startLevel] != "#") + return; + + var startColumn = line.length; + var maxRow = session.getLength(); + var startRow = row; + var endRow = row; + + while (++row < maxRow) { + line = session.getLine(row); + var level = line.search(re); + + if (level == -1) + continue; + + if (line[level] != "#") + break; + + endRow = row; + } + + if (endRow > startRow) { + var endColumn = session.getLine(endRow).length; + return new Range(startRow, startColumn, endRow, endColumn); + } + }; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + var indent = line.search(/\S/); + var next = session.getLine(row + 1); + var prev = session.getLine(row - 1); + var prevIndent = prev.search(/\S/); + var nextIndent = next.search(/\S/); + + if (indent == -1) { + session.foldWidgets[row - 1] = prevIndent!= -1 && prevIndent < nextIndent ? "start" : ""; + return ""; + } + if (prevIndent == -1) { + if (indent == nextIndent && line[indent] == "#" && next[indent] == "#") { + session.foldWidgets[row - 1] = ""; + session.foldWidgets[row + 1] = ""; + return "start"; + } + } else if (prevIndent == indent && line[indent] == "#" && prev[indent] == "#") { + if (session.getLine(row - 2).search(/\S/) == -1) { + session.foldWidgets[row - 1] = "start"; + session.foldWidgets[row + 1] = ""; + return ""; + } + } + + if (prevIndent!= -1 && prevIndent < indent) + session.foldWidgets[row - 1] = "start"; + else + session.foldWidgets[row - 1] = ""; + + if (indent < nextIndent) + return "start"; + else + return ""; + }; + +}).call(FoldMode.prototype); + +}); diff --git a/0.0.3_0/ace/mode-ini.js b/0.0.3_0/ace/mode-ini.js new file mode 100644 index 0000000..bb2f96f --- /dev/null +++ b/0.0.3_0/ace/mode-ini.js @@ -0,0 +1,173 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2012, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * + * Contributor(s): + * + * + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/mode/ini', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/ini_highlight_rules', 'ace/mode/folding/cstyle'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var IniHighlightRules = require("./ini_highlight_rules").IniHighlightRules; +var FoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + var highlighter = new IniHighlightRules(); + this.foldingRules = new FoldMode(); + this.$tokenizer = new Tokenizer(highlighter.getRules()); +}; +oop.inherits(Mode, TextMode); + +(function() { + this.lineCommentStart = ";"; + this.blockComment = {start: "/*", end: "*/"}; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/ini_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var IniHighlightRules = function() { + + this.$rules = { start: + [ { token: 'punctuation.definition.comment.ini', + regex: '#.*', + push_: + [ { token: 'comment.line.number-sign.ini', + regex: '$', + next: 'pop' }, + { defaultToken: 'comment.line.number-sign.ini' } ] }, + { token: 'punctuation.definition.comment.ini', + regex: ';.*', + push_: + [ { token: 'comment.line.semicolon.ini', regex: '$', next: 'pop' }, + { defaultToken: 'comment.line.semicolon.ini' } ] }, + { token: + [ 'keyword.other.definition.ini', + 'text', + 'punctuation.separator.key-value.ini' ], + regex: '\\b([a-zA-Z0-9_.-]+)\\b(\\s*)(=)' }, + { token: + [ 'punctuation.definition.entity.ini', + 'constant.section.group-title.ini', + 'punctuation.definition.entity.ini' ], + regex: '^(\\[)(.*?)(\\])' }, + { token: 'punctuation.definition.string.begin.ini', + regex: '\'', + push: + [ { token: 'punctuation.definition.string.end.ini', + regex: '\'', + next: 'pop' }, + { token: 'constant.character.escape.ini', regex: '\\\\.' }, + { defaultToken: 'string.quoted.single.ini' } ] }, + { token: 'punctuation.definition.string.begin.ini', + regex: '"', + push: + [ { token: 'punctuation.definition.string.end.ini', + regex: '"', + next: 'pop' }, + { defaultToken: 'string.quoted.double.ini' } ] } ] } + + this.normalizeRules(); +}; + +IniHighlightRules.metaData = { fileTypes: [ 'ini', 'conf' ], + keyEquivalent: '^~I', + name: 'Ini', + scopeName: 'source.ini' } + + +oop.inherits(IniHighlightRules, TextHighlightRules); + +exports.IniHighlightRules = IniHighlightRules; +}); + +ace.define('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var line = session.getLine(row); + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i + match[0].length, 1); + } + + if (foldStyle !== "markbeginend") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + +}).call(FoldMode.prototype); + +}); diff --git a/0.0.3_0/ace/mode-jade.js b/0.0.3_0/ace/mode-jade.js new file mode 100644 index 0000000..7d510f6 --- /dev/null +++ b/0.0.3_0/ace/mode-jade.js @@ -0,0 +1,1971 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2012, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * + * Contributor(s): + * + * Garen J. Torikian + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/mode/jade', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/jade_highlight_rules', 'ace/mode/folding/coffee'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var JadeHighlightRules = require("./jade_highlight_rules").JadeHighlightRules; +var FoldMode = require("./folding/coffee").FoldMode; + +var Mode = function() { + var highlighter = new JadeHighlightRules(); + + this.$tokenizer = new Tokenizer(highlighter.getRules()); + this.foldingRules = new FoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + this.lineCommentStart = "//"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/jade_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules', 'ace/mode/markdown_highlight_rules', 'ace/mode/scss_highlight_rules', 'ace/mode/less_highlight_rules', 'ace/mode/coffee_highlight_rules', 'ace/mode/javascript_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var MarkdownHighlightRules = require("./markdown_highlight_rules").MarkdownHighlightRules; +var SassHighlightRules = require("./scss_highlight_rules").ScssHighlightRules; +var LessHighlightRules = require("./less_highlight_rules").LessHighlightRules; +var CoffeeHighlightRules = require("./coffee_highlight_rules").CoffeeHighlightRules; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; + +function mixin_embed(tag, prefix) { + return { + token : "entity.name.function.jade", + regex : "^\\s*\\:" + tag, + next : prefix + "start" + }; +} + +var JadeHighlightRules = function() { + + var escapedRe = "\\\\(?:x[0-9a-fA-F]{2}|" + // hex + "u[0-9a-fA-F]{4}|" + // unicode + "[0-2][0-7]{0,2}|" + // oct + "3[0-6][0-7]?|" + // oct + "37[0-7]?|" + // oct + "[4-7][0-7]?|" + //oct + ".)"; + + this.$rules = + { + "start": [ + { + token: "keyword.control.import.include.jade", + regex: "\\s*\\binclude\\b" + }, + { + token: "keyword.other.doctype.jade", + regex: "^!!!\\s*(?:[a-zA-Z0-9-_]+)?" + }, + { + token : "punctuation.section.comment", + regex : "^\\s*\/\/(?:\\s*[^-\\s]|\\s+\\S)(?:.*$)" + }, + { + onMatch: function(value, currentState, stack) { + stack.unshift(this.next, value.length - 2, currentState); + return "comment"; + }, + regex: /^\s*\/\//, + next: "comment_block" + }, + mixin_embed("markdown", "markdown-"), + mixin_embed("sass", "sass-"), + mixin_embed("less", "less-"), + mixin_embed("coffee", "coffee-"), + { + token: [ "storage.type.function.jade", + "entity.name.function.jade", + "punctuation.definition.parameters.begin.jade", + "variable.parameter.function.jade", + "punctuation.definition.parameters.end.jade" + ], + regex: "^(\\s*mixin)( [\\w\\-]+)(\\s*\\()(.*?)(\\))" + }, + { + token: [ "storage.type.function.jade", "entity.name.function.jade"], + regex: "^(\\s*mixin)( [\\w\\-]+)" + }, + { + token: "source.js.embedded.jade", + regex: "^\\s*(?:-|=|!=)", + next: "js-start" + }, + { + token: "string.interpolated.jade", + regex: "[#!]\\{[^\\}]+\\}" + }, + { + token: "meta.tag.any.jade", + regex: /^\s*(?!\w+\:)(?:[\w]+|(?=\.|#)])/, + next: "tag_single" + }, + { + token: "suport.type.attribute.id.jade", + regex: "#\\w+" + }, + { + token: "suport.type.attribute.class.jade", + regex: "\\.\\w+" + }, + { + token: "punctuation", + regex: "\\s*(?:\\()", + next: "tag_attributes" + } + ], + "comment_block": [ + {regex: /^\s*/, onMatch: function(value, currentState, stack) { + if (value.length <= stack[1]) { + stack.shift(); + stack.shift(); + this.next = stack.shift(); + return "text"; + } else { + this.next = ""; + return "comment"; + } + }, next: "start"}, + {defaultToken: "comment"} + ], + "tag_single": [ + { + token: "entity.other.attribute-name.class.jade", + regex: "\\.[\\w-]+" + }, + { + token: "entity.other.attribute-name.id.jade", + regex: "#[\\w-]+" + }, + { + token: ["text", "punctuation"], + regex: "($)|((?!\\.|#|=|-))", + next: "start" + } + ], + "tag_attributes": [ + { + token : "string", + regex : "'(?=.)", + next : "qstring" + }, + { + token : "string", + regex : '"(?=.)', + next : "qqstring" + }, + { + token: "entity.other.attribute-name.jade", + regex: "\\b[a-zA-Z\\-:]+" + }, + { + token: ["entity.other.attribute-name.jade", "punctuation"], + regex: "\\b([a-zA-Z:\\.-]+)(=)", + next: "attribute_strings" + }, + { + token: "punctuation", + regex: "\\)", + next: "start" + } + ], + "attribute_strings": [ + { + token : "string", + regex : "'(?=.)", + next : "qstring" + }, + { + token : "string", + regex : '"(?=.)', + next : "qqstring" + } + ], + "qqstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : '[^"\\\\]+' + }, { + token : "string", + regex : "\\\\$", + next : "qqstring" + }, { + token : "string", + regex : '"|$', + next : "tag_attributes" + } + ], + "qstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "[^'\\\\]+" + }, { + token : "string", + regex : "\\\\$", + next : "qstring" + }, { + token : "string", + regex : "'|$", + next : "tag_attributes" + } + ] +}; + + this.embedRules(JavaScriptHighlightRules, "js-", [{ + token: "text", + regex: ".$", + next: "start" + }]); +}; + +oop.inherits(JadeHighlightRules, TextHighlightRules); + +exports.JadeHighlightRules = JadeHighlightRules; +}); + +ace.define('ace/mode/markdown_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules', 'ace/mode/javascript_highlight_rules', 'ace/mode/xml_highlight_rules', 'ace/mode/html_highlight_rules', 'ace/mode/css_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var XmlHighlightRules = require("./xml_highlight_rules").XmlHighlightRules; +var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules; +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; + +function github_embed(tag, prefix) { + return { // Github style block + token : "support.function", + regex : "^```" + tag + "\\s*$", + next : prefix + "start" + }; +} + +var MarkdownHighlightRules = function() { + + this.$rules = { + "basic" : [{ + token : "constant.language.escape", + regex : /\\[\\`*_{}\[\]()#+\-.!]/ + }, { // code span ` + token : "support.function", + regex : "(`+)(.*?[^`])(\\1)" + }, { // reference + token : ["text", "constant", "text", "url", "string", "text"], + regex : "^([ ]{0,3}\\[)([^\\]]+)(\\]:\\s*)([^ ]+)(\\s*(?:[\"][^\"]+[\"])?(\\s*))$" + }, { // link by reference + token : ["text", "string", "text", "constant", "text"], + regex : "(\\[)((?:[[^\\]]*\\]|[^\\[\\]])*)(\\][ ]?(?:\\n[ ]*)?\\[)(.*?)(\\])" + }, { // link by url + token : ["text", "string", "text", "markup.underline", "string", "text"], + regex : "(\\[)"+ + "(\\[[^\\]]*\\]|[^\\[\\]]*)"+ + "(\\]\\([ \\t]*)"+ + "(?)"+ + "((?:[ \t]*\"(?:.*?)\"[ \\t]*)?)"+ + "(\\))" + }, { // strong ** __ + token : "string", + regex : "([*]{2}|[_]{2}(?=\\S))(.*?\\S[*_]*)(\\1)" + }, { // emphasis * _ + token : "string", + regex : "([*]|[_](?=\\S))(.*?\\S[*_]*)(\\1)" + }, { // + token : ["text", "url", "text"], + regex : "(<)("+ + "(?:https?|ftp|dict):[^'\">\\s]+"+ + "|"+ + "(?:mailto:)?[-.\\w]+\\@[-a-z0-9]+(?:\\.[-a-z0-9]+)*\\.[a-z]+"+ + ")(>)" + }], + "allowBlock": [ + {token : "support.function", regex : "^ {4}.+", next : "allowBlock"}, + {token : "empty", regex : "", next : "start"} + ], + + "start" : [{ + token : "empty_line", + regex : '^$', + next: "allowBlock" + }, { // h1 + token: "markup.heading.1", + regex: "^=+(?=\\s*$)" + }, { // h2 + token: "markup.heading.2", + regex: "^\\-+(?=\\s*$)" + }, { + token : function(value) { + return "markup.heading." + value.length; + }, + regex : /^#{1,6}(?=\s*[^ #]|\s+#.)/, + next : "header" + }, + github_embed("(?:javascript|js)", "js-"), + github_embed("xml", "xml-"), + github_embed("html", "html-"), + github_embed("css", "css-"), + { // Github style block + token : "support.function", + regex : "^```\\s*[a-zA-Z]*(?:{.*?\\})?\\s*$", + next : "githubblock" + }, { // block quote + token : "string", + regex : "^>[ ].+$", + next : "blockquote" + }, { // HR * - _ + token : "constant", + regex : "^ {0,2}(?:(?: ?\\* ?){3,}|(?: ?\\- ?){3,}|(?: ?\\_ ?){3,})\\s*$", + next: "allowBlock" + }, { // list + token : "markup.list", + regex : "^\\s{0,3}(?:[*+-]|\\d+\\.)\\s+", + next : "listblock-start" + }, { + include : "basic" + }], + + "header" : [{ + regex: "$", + next : "start" + }, { + include: "basic" + }, { + defaultToken : "markup.heading" + } ], + + "listblock-start" : [{ + token : "support.variable", + regex : /(?:\[[ x]\])?/, + next : "listblock" + }], + + "listblock" : [ { // Lists only escape on completely blank lines. + token : "empty_line", + regex : "^$", + next : "start" + }, { // list + token : "markup.list", + regex : "^\\s{0,3}(?:[*+-]|\\d+\\.)\\s+", + next : "listblock-start" + }, { + include : "basic", noEscape: true + }, { + defaultToken : "markup.list" + } ], + + "blockquote" : [ { // BLockquotes only escape on blank lines. + token : "empty_line", + regex : "^\\s*$", + next : "start" + }, { + token : "string", + regex : ".+" + } ], + + "githubblock" : [ { + token : "support.function", + regex : "^```", + next : "start" + }, { + token : "support.function", + regex : ".+" + } ] + }; + + this.embedRules(JavaScriptHighlightRules, "js-", [{ + token : "support.function", + regex : "^```", + next : "start" + }]); + + this.embedRules(HtmlHighlightRules, "html-", [{ + token : "support.function", + regex : "^```", + next : "start" + }]); + + this.embedRules(CssHighlightRules, "css-", [{ + token : "support.function", + regex : "^```", + next : "start" + }]); + + this.embedRules(XmlHighlightRules, "xml-", [{ + token : "support.function", + regex : "^```", + next : "start" + }]); + + var html = new HtmlHighlightRules().getRules(); + for (var i in html) { + if (this.$rules[i]) + this.$rules[i] = this.$rules[i].concat(html[i]); + else + this.$rules[i] = html[i]; + } + + this.normalizeRules(); +}; +oop.inherits(MarkdownHighlightRules, TextHighlightRules); + +exports.MarkdownHighlightRules = MarkdownHighlightRules; +}); + +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(require, exports, module) { + + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var JavaScriptHighlightRules = function() { + var keywordMapper = this.createKeywordMapper({ + "variable.language": + "Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|" + // Constructors + "Namespace|QName|XML|XMLList|" + // E4X + "ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|" + + "Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|" + + "Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|" + // Errors + "SyntaxError|TypeError|URIError|" + + "decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|" + // Non-constructor functions + "isNaN|parseFloat|parseInt|" + + "JSON|Math|" + // Other + "this|arguments|prototype|window|document" , // Pseudo + "keyword": + "const|yield|import|get|set|" + + "break|case|catch|continue|default|delete|do|else|finally|for|function|" + + "if|in|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"); + var kwBeforeRe = "case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void"; + var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*\\b"; + + var escapedRe = "\\\\(?:x[0-9a-fA-F]{2}|" + // hex + "u[0-9a-fA-F]{4}|" + // unicode + "[0-2][0-7]{0,2}|" + // oct + "3[0-6][0-7]?|" + // oct + "37[0-7]?|" + // oct + "[4-7][0-7]?|" + //oct + ".)"; + + this.$rules = { + "no_regex" : [ + { + token : "comment", + regex : /\/\/.*$/ + }, + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : /\/\*/, + next : "comment" + }, { + token : "string", + regex : "'(?=.)", + next : "qstring" + }, { + token : "string", + regex : '"(?=.)', + next : "qqstring" + }, { + token : "constant.numeric", // hex + regex : /0[xX][0-9a-fA-F]+\b/ + }, { + token : "constant.numeric", // float + regex : /[+-]?\d+(?:(?:\.\d*)?(?:[eE][+-]?\d+)?)?\b/ + }, { + token : [ + "storage.type", "punctuation.operator", "support.function", + "punctuation.operator", "entity.name.function", "text","keyword.operator" + ], + regex : "(" + identifierRe + ")(\\.)(prototype)(\\.)(" + identifierRe +")(\\s*)(=)", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "keyword.operator", "text", "storage.type", + "text", "paren.lparen" + ], + regex : "(" + identifierRe +")(\\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 : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(function)(\\s+)(" + identifierRe + ")(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "punctuation.operator", + "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\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 : "(?:" + kwBeforeRe + ")\\b", + next : "start" + }, { + token : ["punctuation.operator", "support.function"], + regex : /(\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:opzzzz|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 : ["punctuation.operator", "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)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/ + }, { + token : ["punctuation.operator", "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 : ["storage.type", "punctuation.operator", "support.function.firebug"], + regex : /(console)(\.)(warn|info|log|error|time|timeEnd|assert)\b/ + }, { + token : keywordMapper, + regex : identifierRe + }, { + token : "keyword.operator", + regex : /--|\+\+|[!$%&*+\-~]|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\|\||\?\:|\*=|%=|\+=|\-=|&=|\^=/, + next : "start" + }, { + token : "punctuation.operator", + regex : /\?|\:|\,|\;|\./, + next : "start" + }, { + token : "paren.lparen", + regex : /[\[({]/, + next : "start" + }, { + token : "paren.rparen", + regex : /[\])}]/ + }, { + token : "keyword.operator", + regex : /\/=?/, + next : "start" + }, { + token: "comment", + regex: /^#!.*$/ + } + ], + "start": [ + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment_regex_allowed" + }, { + token : "comment", + regex : "\\/\\/.*$", + next : "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: "/\\w*", + 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.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: identifierRe + }, { + token: "punctuation.operator", + regex: "[, ]+" + }, { + token: "punctuation.operator", + regex: "$" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "comment_regex_allowed" : [ + {token : "comment", regex : "\\*\\/", next : "start"}, + {defaultToken : "comment"} + ], + "comment" : [ + {token : "comment", regex : "\\*\\/", next : "no_regex"}, + {defaultToken : "comment"} + ], + "qqstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + next : "qqstring" + }, { + token : "string", + regex : '"|$', + next : "no_regex" + }, { + defaultToken: "string" + } + ], + "qstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + next : "qstring" + }, { + token : "string", + regex : "'|$", + next : "no_regex" + }, { + defaultToken: "string" + } + ] + }; + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("no_regex") ]); +}; + +oop.inherits(JavaScriptHighlightRules, TextHighlightRules); + +exports.JavaScriptHighlightRules = JavaScriptHighlightRules; +}); + +ace.define('ace/mode/doc_comment_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, { + token : "comment.doc.tag", + regex : "\\bTODO\\b" + }, { + defaultToken : "comment.doc" + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define('ace/mode/xml_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/xml_util', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var xmlUtil = require("./xml_util"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var XmlHighlightRules = function() { + this.$rules = { + start : [ + {token : "text", regex : "<\\!\\[CDATA\\[", next : "cdata"}, + {token : "xml-pe", regex : "<\\?.*?\\?>"}, + {token : "comment", regex : "<\\!--", next : "comment"}, + {token : "xml-pe", regex : "<\\!.*?>"}, + {token : "meta.tag", regex : "<\\/?", next : "tag"}, + {token : "text", regex : "\\s+"}, + { + token : "constant.character.entity", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + } + ], + + cdata : [ + {token : "text", regex : "\\]\\]>", next : "start"}, + {token : "text", regex : "\\s+"}, + {token : "text", regex : "(?:[^\\]]|\\](?!\\]>))+"} + ], + + comment : [ + {token : "comment", regex : ".*?-->", next : "start"}, + {token : "comment", regex : ".+"} + ] + }; + + xmlUtil.tag(this.$rules, "tag", "start"); +}; + +oop.inherits(XmlHighlightRules, TextHighlightRules); + +exports.XmlHighlightRules = XmlHighlightRules; +}); + +ace.define('ace/mode/xml_util', ['require', 'exports', 'module' ], function(require, exports, module) { + + +function string(state) { + return [{ + token : "string", + regex : '"', + next : state + "_qqstring" + }, { + token : "string", + regex : "'", + next : state + "_qstring" + }]; +} + +function multiLineString(quote, state) { + return [ + {token : "string", regex : quote, next : state}, + { + token : "constant.language.escape", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }, + {defaultToken : "string"} + ]; +} + +exports.tag = function(states, name, nextState, tagMap) { + states[name] = [{ + token : "text", + regex : "\\s+" + }, { + + token : !tagMap ? "meta.tag.tag-name" : function(value) { + if (tagMap[value]) + return "meta.tag.tag-name." + tagMap[value]; + else + return "meta.tag.tag-name"; + }, + regex : "[-_a-zA-Z0-9:]+", + next : name + "_embed_attribute_list" + }, { + token: "empty", + regex: "", + next : name + "_embed_attribute_list" + }]; + + states[name + "_qstring"] = multiLineString("'", name + "_embed_attribute_list"); + states[name + "_qqstring"] = multiLineString("\"", name + "_embed_attribute_list"); + + states[name + "_embed_attribute_list"] = [{ + token : "meta.tag.r", + regex : "/?>", + next : nextState + }, { + token : "keyword.operator", + regex : "=" + }, { + token : "entity.other.attribute-name", + regex : "[-_a-zA-Z0-9:]+" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : "text", + regex : "\\s+" + }].concat(string(name)); +}; + +}); + +ace.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_util', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var xmlUtil = require("./xml_util"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var tagMap = lang.createMap({ + a : 'anchor', + button : 'form', + form : 'form', + img : 'image', + input : 'form', + label : 'form', + script : 'script', + select : 'form', + textarea : 'form', + style : 'style', + table : 'table', + tbody : 'table', + td : 'table', + tfoot : 'table', + th : 'table', + tr : 'table' +}); + +var HtmlHighlightRules = function() { + this.$rules = { + start : [{ + token : "text", + regex : "<\\!\\[CDATA\\[", + next : "cdata" + }, { + token : "xml-pe", + regex : "<\\?.*?\\?>" + }, { + token : "comment", + regex : "<\\!--", + next : "comment" + }, { + token : "xml-pe", + regex : "<\\!.*?>" + }, { + token : "meta.tag", + regex : "<(?=script\\b)", + next : "script" + }, { + token : "meta.tag", + regex : "<(?=style\\b)", + next : "style" + }, { + token : "meta.tag", // opening tag + regex : "<\\/?(?=\\S)", + next : "tag" + }, { + token : "text", + regex : "\\s+" + }, { + token : "constant.character.entity", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }], + + cdata : [ { + token : "text", + regex : "\\]\\]>", + next : "start" + } ], + + comment : [ { + token : "comment", + regex : ".*?-->", + next : "start" + }, { + defaultToken : "comment" + } ] + }; + + xmlUtil.tag(this.$rules, "tag", "start", tagMap); + xmlUtil.tag(this.$rules, "style", "css-start", tagMap); + xmlUtil.tag(this.$rules, "script", "js-start", tagMap); + + this.embedRules(JavaScriptHighlightRules, "js-", [{ + token: "comment", + regex: "\\/\\/.*(?=<\\/script>)", + next: "tag" + }, { + token: "meta.tag", + regex: "<\\/(?=script)", + next: "tag" + }]); + + this.embedRules(CssHighlightRules, "css-", [{ + token: "meta.tag", + regex: "<\\/(?=style)", + next: "tag" + }]); +}; + +oop.inherits(HtmlHighlightRules, TextHighlightRules); + +exports.HtmlHighlightRules = HtmlHighlightRules; +}); + +ace.define('ace/mode/css_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var supportType = exports.supportType = "animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|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|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|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|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index"; +var supportFunction = exports.supportFunction = "rgb|rgba|url|attr|counter|counters"; +var supportConstant = exports.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"; +var supportConstantColor = exports.supportConstantColor = "aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow"; +var supportConstantFonts = exports.supportConstantFonts = "arial|century|comic|courier|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace"; + +var numRe = exports.numRe = "\\-?(?:(?:[0-9]+)|(?:[0-9]*\\.[0-9]+))"; +var pseudoElements = exports.pseudoElements = "(\\:+)\\b(after|before|first-letter|first-line|moz-selection|selection)\\b"; +var pseudoClasses = exports.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"; + +var CssHighlightRules = function() { + + var keywordMapper = this.createKeywordMapper({ + "support.function": supportFunction, + "support.constant": supportConstant, + "support.type": supportType, + "support.constant.color": supportConstantColor, + "support.constant.fonts": supportConstantFonts + }, "text", true); + + var base_ruleset = [ + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "ruleset_comment" + }, { + token : "string", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' + }, { + token : "string", // single line + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" + }, { + token : ["constant.numeric", "keyword"], + regex : "(" + numRe + ")(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 : numRe + }, { + token : "constant.numeric", // hex6 color + regex : "#[a-f0-9]{6}" + }, { + token : "constant.numeric", // hex3 color + regex : "#[a-f0-9]{3}" + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"], + regex : pseudoElements + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"], + regex : pseudoClasses + }, { + token : ["support.function", "string", "support.function"], + regex : "(url\\()(.*)(\\))" + }, { + token : keywordMapper, + regex : "\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*" + }, { + caseInsensitive: true + } + ]; + + var ruleset = lang.copyArray(base_ruleset); + ruleset.unshift({ + token : "paren.rparen", + regex : "\\}", + next: "start" + }); + + var media_ruleset = lang.copyArray( base_ruleset ); + media_ruleset.unshift({ + token : "paren.rparen", + regex : "\\}", + next: "media" + }); + + var base_comment = [{ + token : "comment", // comment spanning whole line + regex : ".+" + }]; + + var comment = lang.copyArray(base_comment); + comment.unshift({ + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "start" + }); + + var media_comment = lang.copyArray(base_comment); + media_comment.unshift({ + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "media" + }); + + var ruleset_comment = lang.copyArray(base_comment); + ruleset_comment.unshift({ + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "ruleset" + }); + + this.$rules = { + "start" : [{ + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment" + }, { + token: "paren.lparen", + regex: "\\{", + next: "ruleset" + }, { + token: "string", + regex: "@.*?{", + next: "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: true + }], + + "media" : [ { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "media_comment" + }, { + token: "paren.lparen", + regex: "\\{", + next: "media_ruleset" + },{ + token: "string", + regex: "\\}", + next: "start" + },{ + 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: true + }], + + "comment" : comment, + + "ruleset" : ruleset, + "ruleset_comment" : ruleset_comment, + + "media_ruleset" : media_ruleset, + "media_comment" : media_comment + }; +}; + +oop.inherits(CssHighlightRules, TextHighlightRules); + +exports.CssHighlightRules = CssHighlightRules; + +}); + +ace.define('ace/mode/scss_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var ScssHighlightRules = function() { + + var properties = lang.arrayToMap( (function () { + + var browserPrefix = ("-webkit-|-moz-|-o-|-ms-|-svg-|-pie-|-khtml-").split("|"); + + var prefixProperties = ("appearance|background-clip|background-inline-policy|background-origin|" + + "background-size|binding|border-bottom-colors|border-left-colors|" + + "border-right-colors|border-top-colors|border-end|border-end-color|" + + "border-end-style|border-end-width|border-image|border-start|" + + "border-start-color|border-start-style|border-start-width|box-align|" + + "box-direction|box-flex|box-flexgroup|box-ordinal-group|box-orient|" + + "box-pack|box-sizing|column-count|column-gap|column-width|column-rule|" + + "column-rule-width|column-rule-style|column-rule-color|float-edge|" + + "font-feature-settings|font-language-override|force-broken-image-icon|" + + "image-region|margin-end|margin-start|opacity|outline|outline-color|" + + "outline-offset|outline-radius|outline-radius-bottomleft|" + + "outline-radius-bottomright|outline-radius-topleft|outline-radius-topright|" + + "outline-style|outline-width|padding-end|padding-start|stack-sizing|" + + "tab-size|text-blink|text-decoration-color|text-decoration-line|" + + "text-decoration-style|transform|transform-origin|transition|" + + "transition-delay|transition-duration|transition-property|" + + "transition-timing-function|user-focus|user-input|user-modify|user-select|" + + "window-shadow|border-radius").split("|"); + + var properties = ("azimuth|background-attachment|background-color|background-image|" + + "background-position|background-repeat|background|border-bottom-color|" + + "border-bottom-style|border-bottom-width|border-bottom|border-collapse|" + + "border-color|border-left-color|border-left-style|border-left-width|" + + "border-left|border-right-color|border-right-style|border-right-width|" + + "border-right|border-spacing|border-style|border-top-color|" + + "border-top-style|border-top-width|border-top|border-width|border|bottom|" + + "box-shadow|box-sizing|caption-side|clear|clip|color|content|counter-increment|" + + "counter-reset|cue-after|cue-before|cue|cursor|direction|display|" + + "elevation|empty-cells|float|font-family|font-size-adjust|font-size|" + + "font-stretch|font-style|font-variant|font-weight|font|height|left|" + + "letter-spacing|line-height|list-style-image|list-style-position|" + + "list-style-type|list-style|margin-bottom|margin-left|margin-right|" + + "margin-top|marker-offset|margin|marks|max-height|max-width|min-height|" + + "min-width|opacity|orphans|outline-color|" + + "outline-style|outline-width|outline|overflow|overflow-x|overflow-y|padding-bottom|" + + "padding-left|padding-right|padding-top|padding|page-break-after|" + + "page-break-before|page-break-inside|page|pause-after|pause-before|" + + "pause|pitch-range|pitch|play-during|position|quotes|richness|right|" + + "size|speak-header|speak-numeral|speak-punctuation|speech-rate|speak|" + + "stress|table-layout|text-align|text-decoration|text-indent|" + + "text-shadow|text-transform|top|unicode-bidi|vertical-align|" + + "visibility|voice-family|volume|white-space|widows|width|word-spacing|" + + "z-index").split("|"); + var ret = []; + for (var i=0, ln=browserPrefix.length; i|<=|>=|==|!=|-|%|#|\\+|\\$|\\+|\\*" + }, { + token : "paren.lparen", + regex : "[[({]" + }, { + token : "paren.rparen", + regex : "[\\])}]" + }, { + token : "text", + regex : "\\s+" + }, { + caseInsensitive: true + } + ], + "comment" : [ + { + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "start" + }, { + token : "comment", // comment spanning whole line + regex : ".+" + } + ], + "qqstring" : [ + { + token : "string", + regex : '(?:(?:\\\\.)|(?:[^"\\\\]))*?"', + next : "start" + }, { + token : "string", + regex : '.+' + } + ], + "qstring" : [ + { + token : "string", + regex : "(?:(?:\\\\.)|(?:[^'\\\\]))*?'", + next : "start" + }, { + token : "string", + regex : '.+' + } + ] + }; +}; + +oop.inherits(ScssHighlightRules, TextHighlightRules); + +exports.ScssHighlightRules = ScssHighlightRules; + +}); + +ace.define('ace/mode/less_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var LessHighlightRules = function() { + + var properties = lang.arrayToMap( (function () { + + var browserPrefix = ("-webkit-|-moz-|-o-|-ms-|-svg-|-pie-|-khtml-").split("|"); + + var prefixProperties = ("appearance|background-clip|background-inline-policy|background-origin|" + + "background-size|binding|border-bottom-colors|border-left-colors|" + + "border-right-colors|border-top-colors|border-end|border-end-color|" + + "border-end-style|border-end-width|border-image|border-start|" + + "border-start-color|border-start-style|border-start-width|box-align|" + + "box-direction|box-flex|box-flexgroup|box-ordinal-group|box-orient|" + + "box-pack|box-sizing|column-count|column-gap|column-width|column-rule|" + + "column-rule-width|column-rule-style|column-rule-color|float-edge|" + + "font-feature-settings|font-language-override|force-broken-image-icon|" + + "image-region|margin-end|margin-start|opacity|outline|outline-color|" + + "outline-offset|outline-radius|outline-radius-bottomleft|" + + "outline-radius-bottomright|outline-radius-topleft|outline-radius-topright|" + + "outline-style|outline-width|padding-end|padding-start|stack-sizing|" + + "tab-size|text-blink|text-decoration-color|text-decoration-line|" + + "text-decoration-style|transform|transform-origin|transition|" + + "transition-delay|transition-duration|transition-property|" + + "transition-timing-function|user-focus|user-input|user-modify|user-select|" + + "window-shadow|border-radius").split("|"); + + var properties = ("azimuth|background-attachment|background-color|background-image|" + + "background-position|background-repeat|background|border-bottom-color|" + + "border-bottom-style|border-bottom-width|border-bottom|border-collapse|" + + "border-color|border-left-color|border-left-style|border-left-width|" + + "border-left|border-right-color|border-right-style|border-right-width|" + + "border-right|border-spacing|border-style|border-top-color|" + + "border-top-style|border-top-width|border-top|border-width|border|" + + "bottom|box-sizing|caption-side|clear|clip|color|content|counter-increment|" + + "counter-reset|cue-after|cue-before|cue|cursor|direction|display|" + + "elevation|empty-cells|float|font-family|font-size-adjust|font-size|" + + "font-stretch|font-style|font-variant|font-weight|font|height|left|" + + "letter-spacing|line-height|list-style-image|list-style-position|" + + "list-style-type|list-style|margin-bottom|margin-left|margin-right|" + + "margin-top|marker-offset|margin|marks|max-height|max-width|min-height|" + + "min-width|opacity|orphans|outline-color|" + + "outline-style|outline-width|outline|overflow|overflow-x|overflow-y|padding-bottom|" + + "padding-left|padding-right|padding-top|padding|page-break-after|" + + "page-break-before|page-break-inside|page|pause-after|pause-before|" + + "pause|pitch-range|pitch|play-during|position|quotes|richness|right|" + + "size|speak-header|speak-numeral|speak-punctuation|speech-rate|speak|" + + "stress|table-layout|text-align|text-decoration|text-indent|" + + "text-shadow|text-transform|top|unicode-bidi|vertical-align|" + + "visibility|voice-family|volume|white-space|widows|width|word-spacing|" + + "z-index").split("|"); + var ret = []; + for (var i=0, ln=browserPrefix.length; i|<=|>=|==|!=|-|%|#|\\+|\\$|\\+|\\*" + }, { + token : "paren.lparen", + regex : "[[({]" + }, { + token : "paren.rparen", + regex : "[\\])}]" + }, { + token : "text", + regex : "\\s+" + }, { + caseInsensitive: true + } + ], + "comment" : [ + { + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "start" + }, { + token : "comment", // comment spanning whole line + regex : ".+" + } + ] + }; +}; + +oop.inherits(LessHighlightRules, TextHighlightRules); + +exports.LessHighlightRules = LessHighlightRules; + +}); + +ace.define('ace/mode/coffee_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + + var oop = require("../lib/oop"); + var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + + oop.inherits(CoffeeHighlightRules, TextHighlightRules); + + function CoffeeHighlightRules() { + var identifier = "[$A-Za-z_\\x7f-\\uffff][$\\w\\x7f-\\uffff]*"; + + var keywords = ( + "this|throw|then|try|typeof|super|switch|return|break|by|continue|" + + "catch|class|in|instanceof|is|isnt|if|else|extends|for|forown|" + + "finally|function|while|when|new|no|not|delete|debugger|do|loop|of|off|" + + "or|on|unless|until|and|yes" + ); + + var langConstant = ( + "true|false|null|undefined|NaN|Infinity" + ); + + var illegal = ( + "case|const|default|function|var|void|with|enum|export|implements|" + + "interface|let|package|private|protected|public|static|yield|" + + "__hasProp|slice|bind|indexOf" + ); + + var supportClass = ( + "Array|Boolean|Date|Function|Number|Object|RegExp|ReferenceError|String|" + + "Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|" + + "SyntaxError|TypeError|URIError|" + + "ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|" + + "Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray" + ); + + var supportFunction = ( + "Math|JSON|isNaN|isFinite|parseInt|parseFloat|encodeURI|" + + "encodeURIComponent|decodeURI|decodeURIComponent|String|" + ); + + var variableLanguage = ( + "window|arguments|prototype|document" + ); + + var keywordMapper = this.createKeywordMapper({ + "keyword": keywords, + "constant.language": langConstant, + "invalid.illegal": illegal, + "language.support.class": supportClass, + "language.support.function": supportFunction, + "variable.language": variableLanguage + }, "identifier"); + + var functionRule = { + token: ["paren.lparen", "variable.parameter", "paren.rparen", "text", "storage.type"], + regex: /(?:(\()((?:"[^")]*?"|'[^')]*?'|\/[^\/)]*?\/|[^()\"'\/])*?)(\))(\s*))?([\-=]>)/.source + }; + + var stringEscape = /\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|[0-2][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.)/; + + this.$rules = { + start : [ + { + token : "constant.numeric", + regex : "(?:0x[\\da-fA-F]+|(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:[eE][+-]?\\d+)?)" + }, { + stateName: "qdoc", + token : "string", regex : "'''", next : [ + {token : "string", regex : "'''", next : "start"}, + {token : "constant.language.escape", regex : stringEscape}, + {defaultToken: "string"} + ] + }, { + stateName: "qqdoc", + token : "string", + regex : '"""', + next : [ + {token : "string", regex : '"""', next : "start"}, + {token : "paren.string", regex : '#{', push : "start"}, + {token : "constant.language.escape", regex : stringEscape}, + {defaultToken: "string"} + ] + }, { + stateName: "qstring", + token : "string", regex : "'", next : [ + {token : "string", regex : "'", next : "start"}, + {token : "constant.language.escape", regex : stringEscape}, + {defaultToken: "string"} + ] + }, { + stateName: "qqstring", + token : "string.start", regex : '"', next : [ + {token : "string.end", regex : '"', next : "start"}, + {token : "paren.string", regex : '#{', push : "start"}, + {token : "constant.language.escape", regex : stringEscape}, + {defaultToken: "string"} + ] + }, { + stateName: "js", + token : "string", regex : "`", next : [ + {token : "string", regex : "`", next : "start"}, + {token : "constant.language.escape", regex : stringEscape}, + {defaultToken: "string"} + ] + }, { + regex: "[{}]", onMatch: function(val, state, stack) { + this.next = ""; + if (val == "{" && stack.length) { + stack.unshift("start", state); + return "paren"; + } + if (val == "}" && stack.length) { + stack.shift(); + this.next = stack.shift(); + if (this.next.indexOf("string") != -1) + return "paren.string"; + } + return "paren"; + } + }, { + token : "string.regex", + regex : "///", + next : "heregex" + }, { + token : "string.regex", + regex : /(?:\/(?![\s=])[^[\/\n\\]*(?:(?:\\[\s\S]|\[[^\]\n\\]*(?:\\[\s\S][^\]\n\\]*)*])[^[\/\n\\]*)*\/)(?:[imgy]{0,4})(?!\w)/ + }, { + token : "comment", + regex : "###(?!#)", + next : "comment" + }, { + token : "comment", + regex : "#.*" + }, { + token : ["punctuation.operator", "text", "identifier"], + regex : "(\\.)(\\s*)(" + illegal + ")" + }, { + token : "punctuation.operator", + regex : "\\." + }, { + token : ["keyword", "text", "language.support.class", + "text", "keyword", "text", "language.support.class"], + regex : "(class)(\\s+)(" + identifier + ")(?:(\\s+)(extends)(\\s+)(" + identifier + "))?" + }, { + token : ["entity.name.function", "text", "keyword.operator", "text"].concat(functionRule.token), + regex : "(" + identifier + ")(\\s*)([=:])(\\s*)" + functionRule.regex + }, + functionRule, + { + token : "variable", + regex : "@(?:" + identifier + ")?" + }, { + token: keywordMapper, + regex : identifier + }, { + token : "punctuation.operator", + regex : "\\,|\\." + }, { + token : "storage.type", + regex : "[\\-=]>" + }, { + token : "keyword.operator", + regex : "(?:[-+*/%<>&|^!?=]=|>>>=?|\\-\\-|\\+\\+|::|&&=|\\|\\|=|<<=|>>=|\\?\\.|\\.{2,3}|[!*+-=><])" + }, { + token : "paren.lparen", + regex : "[({[]" + }, { + token : "paren.rparen", + regex : "[\\]})]" + }, { + token : "text", + regex : "\\s+" + }], + + + heregex : [{ + token : "string.regex", + regex : '.*?///[imgy]{0,4}', + next : "start" + }, { + token : "comment.regex", + regex : "\\s+(?:#.*)?" + }, { + token : "string.regex", + regex : "\\S+" + }], + + comment : [{ + token : "comment", + regex : '###', + next : "start" + }, { + defaultToken : "comment" + }] + }; + this.normalizeRules(); + } + + exports.CoffeeHighlightRules = CoffeeHighlightRules; +}); + +ace.define('ace/mode/folding/coffee', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/folding/fold_mode', 'ace/range'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var BaseFoldMode = require("./fold_mode").FoldMode; +var Range = require("../../range").Range; + +var FoldMode = exports.FoldMode = function() {}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var range = this.indentationBlock(session, row); + if (range) + return range; + + var re = /\S/; + var line = session.getLine(row); + var startLevel = line.search(re); + if (startLevel == -1 || line[startLevel] != "#") + return; + + var startColumn = line.length; + var maxRow = session.getLength(); + var startRow = row; + var endRow = row; + + while (++row < maxRow) { + line = session.getLine(row); + var level = line.search(re); + + if (level == -1) + continue; + + if (line[level] != "#") + break; + + endRow = row; + } + + if (endRow > startRow) { + var endColumn = session.getLine(endRow).length; + return new Range(startRow, startColumn, endRow, endColumn); + } + }; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + var indent = line.search(/\S/); + var next = session.getLine(row + 1); + var prev = session.getLine(row - 1); + var prevIndent = prev.search(/\S/); + var nextIndent = next.search(/\S/); + + if (indent == -1) { + session.foldWidgets[row - 1] = prevIndent!= -1 && prevIndent < nextIndent ? "start" : ""; + return ""; + } + if (prevIndent == -1) { + if (indent == nextIndent && line[indent] == "#" && next[indent] == "#") { + session.foldWidgets[row - 1] = ""; + session.foldWidgets[row + 1] = ""; + return "start"; + } + } else if (prevIndent == indent && line[indent] == "#" && prev[indent] == "#") { + if (session.getLine(row - 2).search(/\S/) == -1) { + session.foldWidgets[row - 1] = "start"; + session.foldWidgets[row + 1] = ""; + return ""; + } + } + + if (prevIndent!= -1 && prevIndent < indent) + session.foldWidgets[row - 1] = "start"; + else + session.foldWidgets[row - 1] = ""; + + if (indent < nextIndent) + return "start"; + else + return ""; + }; + +}).call(FoldMode.prototype); + +}); diff --git a/0.0.3_0/ace/mode-java.js b/0.0.3_0/ace/mode-java.js new file mode 100644 index 0000000..d041cd7 --- /dev/null +++ b/0.0.3_0/ace/mode-java.js @@ -0,0 +1,996 @@ +ace.define('ace/mode/java', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/javascript', 'ace/tokenizer', 'ace/mode/java_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var JavaScriptMode = require("./javascript").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var JavaHighlightRules = require("./java_highlight_rules").JavaHighlightRules; + +var Mode = function() { + JavaScriptMode.call(this); + + this.$tokenizer = new Tokenizer(new JavaHighlightRules().getRules()); +}; +oop.inherits(Mode, JavaScriptMode); + +(function() { + + this.createWorker = function(session) { + return null; + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/javascript', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/javascript_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/range', 'ace/worker/worker_client', 'ace/mode/behaviour/cstyle', 'ace/mode/folding/cstyle'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var Range = require("../range").Range; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new JavaScriptHighlightRules().getRules()); + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.$tokenizer.getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start" || state == "no_regex") { + var match = line.match(/^.*(?:\bcase\b.*\:|[\{\(\[])\s*$/); + if (match) { + indent += tab; + } + } else if (state == "doc-start") { + if (endState == "start" || endState == "no_regex") { + return ""; + } + var match = line.match(/^\s*(\/?)\*/); + if (match) { + if (match[1]) { + indent += " "; + } + indent += "* "; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/javascript_worker", "JavaScriptWorker"); + worker.attachToDocument(session.getDocument()); + + worker.on("jslint", function(results) { + session.setAnnotations(results.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +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(require, exports, module) { + + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var JavaScriptHighlightRules = function() { + var keywordMapper = this.createKeywordMapper({ + "variable.language": + "Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|" + // Constructors + "Namespace|QName|XML|XMLList|" + // E4X + "ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|" + + "Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|" + + "Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|" + // Errors + "SyntaxError|TypeError|URIError|" + + "decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|" + // Non-constructor functions + "isNaN|parseFloat|parseInt|" + + "JSON|Math|" + // Other + "this|arguments|prototype|window|document" , // Pseudo + "keyword": + "const|yield|import|get|set|" + + "break|case|catch|continue|default|delete|do|else|finally|for|function|" + + "if|in|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"); + var kwBeforeRe = "case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void"; + var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*\\b"; + + var escapedRe = "\\\\(?:x[0-9a-fA-F]{2}|" + // hex + "u[0-9a-fA-F]{4}|" + // unicode + "[0-2][0-7]{0,2}|" + // oct + "3[0-6][0-7]?|" + // oct + "37[0-7]?|" + // oct + "[4-7][0-7]?|" + //oct + ".)"; + + this.$rules = { + "no_regex" : [ + { + token : "comment", + regex : /\/\/.*$/ + }, + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : /\/\*/, + next : "comment" + }, { + token : "string", + regex : "'(?=.)", + next : "qstring" + }, { + token : "string", + regex : '"(?=.)', + next : "qqstring" + }, { + token : "constant.numeric", // hex + regex : /0[xX][0-9a-fA-F]+\b/ + }, { + token : "constant.numeric", // float + regex : /[+-]?\d+(?:(?:\.\d*)?(?:[eE][+-]?\d+)?)?\b/ + }, { + token : [ + "storage.type", "punctuation.operator", "support.function", + "punctuation.operator", "entity.name.function", "text","keyword.operator" + ], + regex : "(" + identifierRe + ")(\\.)(prototype)(\\.)(" + identifierRe +")(\\s*)(=)", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "keyword.operator", "text", "storage.type", + "text", "paren.lparen" + ], + regex : "(" + identifierRe +")(\\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 : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(function)(\\s+)(" + identifierRe + ")(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "punctuation.operator", + "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\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 : "(?:" + kwBeforeRe + ")\\b", + next : "start" + }, { + token : ["punctuation.operator", "support.function"], + regex : /(\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:opzzzz|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 : ["punctuation.operator", "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)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/ + }, { + token : ["punctuation.operator", "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 : ["storage.type", "punctuation.operator", "support.function.firebug"], + regex : /(console)(\.)(warn|info|log|error|time|timeEnd|assert)\b/ + }, { + token : keywordMapper, + regex : identifierRe + }, { + token : "keyword.operator", + regex : /--|\+\+|[!$%&*+\-~]|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\|\||\?\:|\*=|%=|\+=|\-=|&=|\^=/, + next : "start" + }, { + token : "punctuation.operator", + regex : /\?|\:|\,|\;|\./, + next : "start" + }, { + token : "paren.lparen", + regex : /[\[({]/, + next : "start" + }, { + token : "paren.rparen", + regex : /[\])}]/ + }, { + token : "keyword.operator", + regex : /\/=?/, + next : "start" + }, { + token: "comment", + regex: /^#!.*$/ + } + ], + "start": [ + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment_regex_allowed" + }, { + token : "comment", + regex : "\\/\\/.*$", + next : "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: "/\\w*", + 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.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: identifierRe + }, { + token: "punctuation.operator", + regex: "[, ]+" + }, { + token: "punctuation.operator", + regex: "$" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "comment_regex_allowed" : [ + {token : "comment", regex : "\\*\\/", next : "start"}, + {defaultToken : "comment"} + ], + "comment" : [ + {token : "comment", regex : "\\*\\/", next : "no_regex"}, + {defaultToken : "comment"} + ], + "qqstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + next : "qqstring" + }, { + token : "string", + regex : '"|$', + next : "no_regex" + }, { + defaultToken: "string" + } + ], + "qstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + next : "qstring" + }, { + token : "string", + regex : "'|$", + next : "no_regex" + }, { + defaultToken: "string" + } + ] + }; + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("no_regex") ]); +}; + +oop.inherits(JavaScriptHighlightRules, TextHighlightRules); + +exports.JavaScriptHighlightRules = JavaScriptHighlightRules; +}); + +ace.define('ace/mode/doc_comment_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, { + token : "comment.doc.tag", + regex : "\\bTODO\\b" + }, { + defaultToken : "comment.doc" + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) { + + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define('ace/mode/behaviour/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/token_iterator', 'ace/lib/lang'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; +var lang = require("../../lib/lang"); + +var SAFE_INSERT_IN_TOKENS = + ["text", "paren.rparen", "punctuation.operator"]; +var SAFE_INSERT_BEFORE_TOKENS = + ["text", "paren.rparen", "punctuation.operator", "comment"]; + + +var autoInsertedBrackets = 0; +var autoInsertedRow = -1; +var autoInsertedLineEnd = ""; +var maybeInsertedBrackets = 0; +var maybeInsertedRow = -1; +var maybeInsertedLineStart = ""; +var maybeInsertedLineEnd = ""; + +var CstyleBehaviour = function () { + + CstyleBehaviour.isSaneInsertion = function(editor, session) { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + if (!this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) { + var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1); + if (!this.$matchTokenType(iterator2.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) + return false; + } + iterator.stepForward(); + return iterator.getCurrentTokenRow() !== cursor.row || + this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_BEFORE_TOKENS); + }; + + CstyleBehaviour.$matchTokenType = function(token, types) { + return types.indexOf(token.type || token) > -1; + }; + + CstyleBehaviour.recordAutoInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isAutoInsertedClosing(cursor, line, autoInsertedLineEnd[0])) + autoInsertedBrackets = 0; + autoInsertedRow = cursor.row; + autoInsertedLineEnd = bracket + line.substr(cursor.column); + autoInsertedBrackets++; + }; + + CstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isMaybeInsertedClosing(cursor, line)) + maybeInsertedBrackets = 0; + maybeInsertedRow = cursor.row; + maybeInsertedLineStart = line.substr(0, cursor.column) + bracket; + maybeInsertedLineEnd = line.substr(cursor.column); + maybeInsertedBrackets++; + }; + + CstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) { + return autoInsertedBrackets > 0 && + cursor.row === autoInsertedRow && + bracket === autoInsertedLineEnd[0] && + line.substr(cursor.column) === autoInsertedLineEnd; + }; + + CstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) { + return maybeInsertedBrackets > 0 && + cursor.row === maybeInsertedRow && + line.substr(cursor.column) === maybeInsertedLineEnd && + line.substr(0, cursor.column) == maybeInsertedLineStart; + }; + + CstyleBehaviour.popAutoInsertedClosing = function() { + autoInsertedLineEnd = autoInsertedLineEnd.substr(1); + autoInsertedBrackets--; + }; + + CstyleBehaviour.clearMaybeInsertedClosing = function() { + maybeInsertedBrackets = 0; + maybeInsertedRow = -1; + }; + + this.add("braces", "insertion", function (state, action, editor, session, text) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (text == '{') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "{" && editor.getWrapBehavioursEnabled()) { + return { + text: '{' + selected + '}', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + if (/[\]\}\)]/.test(line[cursor.column])) { + CstyleBehaviour.recordAutoInsert(editor, session, "}"); + return { + text: '{}', + selection: [1, 1] + }; + } else { + CstyleBehaviour.recordMaybeInsert(editor, session, "{"); + return { + text: '{', + selection: [1, 1] + }; + } + } + } else if (text == '}') { + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}') { + var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } else if (text == "\n" || text == "\r\n") { + var closing = ""; + if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) { + closing = lang.stringRepeat("}", maybeInsertedBrackets); + CstyleBehaviour.clearMaybeInsertedClosing(); + } + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}' || closing !== "") { + var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column}, '}'); + if (!openBracePos) + return null; + + var indent = this.getNextLineIndent(state, line.substring(0, cursor.column), session.getTabString()); + var next_indent = this.$getIndent(line); + + return { + text: '\n' + indent + '\n' + next_indent + closing, + selection: [1, indent.length, 1, indent.length] + }; + } + } + }); + + this.add("braces", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '{') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar == '}') { + range.end.column++; + return range; + } else { + maybeInsertedBrackets--; + } + } + }); + + this.add("parens", "insertion", function (state, action, editor, session, text) { + if (text == '(') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return { + text: '(' + selected + ')', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, ")"); + return { + text: '()', + selection: [1, 1] + }; + } + } else if (text == ')') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ')') { + var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("parens", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '(') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ')') { + range.end.column++; + return range; + } + } + }); + + this.add("brackets", "insertion", function (state, action, editor, session, text) { + if (text == '[') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return { + text: '[' + selected + ']', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, "]"); + return { + text: '[]', + selection: [1, 1] + }; + } + } else if (text == ']') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ']') { + var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("brackets", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '[') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ']') { + range.end.column++; + return range; + } + } + }); + + this.add("string_dquotes", "insertion", function (state, action, editor, session, text) { + if (text == '"' || text == "'") { + var quote = text; + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "'" && selected != '"' && editor.getWrapBehavioursEnabled()) { + return { + text: quote + selected + quote, + selection: false + }; + } else { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var leftChar = line.substring(cursor.column-1, cursor.column); + if (leftChar == '\\') { + return null; + } + var tokens = session.getTokens(selection.start.row); + var col = 0, token; + var quotepos = -1; // Track whether we're inside an open quote. + + for (var x = 0; x < tokens.length; x++) { + token = tokens[x]; + if (token.type == "string") { + quotepos = -1; + } else if (quotepos < 0) { + quotepos = token.value.indexOf(quote); + } + if ((token.value.length + col) > selection.start.column) { + break; + } + col += tokens[x].value.length; + } + if (!token || (quotepos < 0 && token.type !== "comment" && (token.type !== "string" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) { + if (!CstyleBehaviour.isSaneInsertion(editor, session)) + return; + return { + text: quote + quote, + selection: [1,1] + }; + } else if (token && token.type === "string") { + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == quote) { + return { + text: '', + selection: [1, 1] + }; + } + } + } + } + }); + + this.add("string_dquotes", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && (selected == '"' || selected == "'")) { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == selected) { + range.end.column++; + return range; + } + } + }); + +}; + +oop.inherits(CstyleBehaviour, Behaviour); + +exports.CstyleBehaviour = CstyleBehaviour; +}); + +ace.define('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var line = session.getLine(row); + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i + match[0].length, 1); + } + + if (foldStyle !== "markbeginend") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + +}).call(FoldMode.prototype); + +}); +ace.define('ace/mode/java_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/doc_comment_highlight_rules', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var JavaHighlightRules = function() { + var keywords = ( + "abstract|continue|for|new|switch|" + + "assert|default|goto|package|synchronized|" + + "boolean|do|if|private|this|" + + "break|double|implements|protected|throw|" + + "byte|else|import|public|throws|" + + "case|enum|instanceof|return|transient|" + + "catch|extends|int|short|try|" + + "char|final|interface|static|void|" + + "class|finally|long|strictfp|volatile|" + + "const|float|native|super|while" + ); + + var buildinConstants = ("null|Infinity|NaN|undefined"); + + + var langClasses = ( + "AbstractMethodError|AssertionError|ClassCircularityError|"+ + "ClassFormatError|Deprecated|EnumConstantNotPresentException|"+ + "ExceptionInInitializerError|IllegalAccessError|"+ + "IllegalThreadStateException|InstantiationError|InternalError|"+ + "NegativeArraySizeException|NoSuchFieldError|Override|Process|"+ + "ProcessBuilder|SecurityManager|StringIndexOutOfBoundsException|"+ + "SuppressWarnings|TypeNotPresentException|UnknownError|"+ + "UnsatisfiedLinkError|UnsupportedClassVersionError|VerifyError|"+ + "InstantiationException|IndexOutOfBoundsException|"+ + "ArrayIndexOutOfBoundsException|CloneNotSupportedException|"+ + "NoSuchFieldException|IllegalArgumentException|NumberFormatException|"+ + "SecurityException|Void|InheritableThreadLocal|IllegalStateException|"+ + "InterruptedException|NoSuchMethodException|IllegalAccessException|"+ + "UnsupportedOperationException|Enum|StrictMath|Package|Compiler|"+ + "Readable|Runtime|StringBuilder|Math|IncompatibleClassChangeError|"+ + "NoSuchMethodError|ThreadLocal|RuntimePermission|ArithmeticException|"+ + "NullPointerException|Long|Integer|Short|Byte|Double|Number|Float|"+ + "Character|Boolean|StackTraceElement|Appendable|StringBuffer|"+ + "Iterable|ThreadGroup|Runnable|Thread|IllegalMonitorStateException|"+ + "StackOverflowError|OutOfMemoryError|VirtualMachineError|"+ + "ArrayStoreException|ClassCastException|LinkageError|"+ + "NoClassDefFoundError|ClassNotFoundException|RuntimeException|"+ + "Exception|ThreadDeath|Error|Throwable|System|ClassLoader|"+ + "Cloneable|Class|CharSequence|Comparable|String|Object" + ); + + var keywordMapper = this.createKeywordMapper({ + "variable.language": "this", + "keyword": keywords, + "constant.language": buildinConstants, + "support.function": langClasses + }, "identifier"); + + this.$rules = { + "start" : [ + { + token : "comment", + regex : "\\/\\/.*$" + }, + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment" + }, { + token : "string.regexp", + regex : "[/](?:(?:\\[(?:\\\\]|[^\\]])+\\])|(?:\\\\/|[^\\]/]))*[/]\\w*\\s*(?=[).,;]|$)" + }, { + token : "string", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' + }, { + token : "string", // single line + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" + }, { + token : "constant.numeric", // hex + regex : "0[xX][0-9a-fA-F]+\\b" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : "constant.language.boolean", + regex : "(?:true|false)\\b" + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "keyword.operator", + regex : "!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)" + }, { + token : "lparen", + regex : "[[({]" + }, { + token : "rparen", + regex : "[\\])}]" + }, { + token : "text", + regex : "\\s+" + } + ], + "comment" : [ + { + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "start" + }, { + token : "comment", // comment spanning whole line + regex : ".+" + } + ] + }; + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("start") ]); +}; + +oop.inherits(JavaHighlightRules, TextHighlightRules); + +exports.JavaHighlightRules = JavaHighlightRules; +}); diff --git a/0.0.3_0/ace/mode-javascript.js b/0.0.3_0/ace/mode-javascript.js new file mode 100644 index 0000000..07a48b9 --- /dev/null +++ b/0.0.3_0/ace/mode-javascript.js @@ -0,0 +1,876 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2010, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/mode/javascript', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/javascript_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/range', 'ace/worker/worker_client', 'ace/mode/behaviour/cstyle', 'ace/mode/folding/cstyle'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var Range = require("../range").Range; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new JavaScriptHighlightRules().getRules()); + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.$tokenizer.getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start" || state == "no_regex") { + var match = line.match(/^.*(?:\bcase\b.*\:|[\{\(\[])\s*$/); + if (match) { + indent += tab; + } + } else if (state == "doc-start") { + if (endState == "start" || endState == "no_regex") { + return ""; + } + var match = line.match(/^\s*(\/?)\*/); + if (match) { + if (match[1]) { + indent += " "; + } + indent += "* "; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/javascript_worker", "JavaScriptWorker"); + worker.attachToDocument(session.getDocument()); + + worker.on("jslint", function(results) { + session.setAnnotations(results.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +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(require, exports, module) { + + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var JavaScriptHighlightRules = function() { + var keywordMapper = this.createKeywordMapper({ + "variable.language": + "Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|" + // Constructors + "Namespace|QName|XML|XMLList|" + // E4X + "ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|" + + "Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|" + + "Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|" + // Errors + "SyntaxError|TypeError|URIError|" + + "decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|" + // Non-constructor functions + "isNaN|parseFloat|parseInt|" + + "JSON|Math|" + // Other + "this|arguments|prototype|window|document" , // Pseudo + "keyword": + "const|yield|import|get|set|" + + "break|case|catch|continue|default|delete|do|else|finally|for|function|" + + "if|in|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"); + var kwBeforeRe = "case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void"; + var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*\\b"; + + var escapedRe = "\\\\(?:x[0-9a-fA-F]{2}|" + // hex + "u[0-9a-fA-F]{4}|" + // unicode + "[0-2][0-7]{0,2}|" + // oct + "3[0-6][0-7]?|" + // oct + "37[0-7]?|" + // oct + "[4-7][0-7]?|" + //oct + ".)"; + + this.$rules = { + "no_regex" : [ + { + token : "comment", + regex : /\/\/.*$/ + }, + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : /\/\*/, + next : "comment" + }, { + token : "string", + regex : "'(?=.)", + next : "qstring" + }, { + token : "string", + regex : '"(?=.)', + next : "qqstring" + }, { + token : "constant.numeric", // hex + regex : /0[xX][0-9a-fA-F]+\b/ + }, { + token : "constant.numeric", // float + regex : /[+-]?\d+(?:(?:\.\d*)?(?:[eE][+-]?\d+)?)?\b/ + }, { + token : [ + "storage.type", "punctuation.operator", "support.function", + "punctuation.operator", "entity.name.function", "text","keyword.operator" + ], + regex : "(" + identifierRe + ")(\\.)(prototype)(\\.)(" + identifierRe +")(\\s*)(=)", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "keyword.operator", "text", "storage.type", + "text", "paren.lparen" + ], + regex : "(" + identifierRe +")(\\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 : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(function)(\\s+)(" + identifierRe + ")(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "punctuation.operator", + "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\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 : "(?:" + kwBeforeRe + ")\\b", + next : "start" + }, { + token : ["punctuation.operator", "support.function"], + regex : /(\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:opzzzz|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 : ["punctuation.operator", "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)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/ + }, { + token : ["punctuation.operator", "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 : ["storage.type", "punctuation.operator", "support.function.firebug"], + regex : /(console)(\.)(warn|info|log|error|time|timeEnd|assert)\b/ + }, { + token : keywordMapper, + regex : identifierRe + }, { + token : "keyword.operator", + regex : /--|\+\+|[!$%&*+\-~]|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\|\||\?\:|\*=|%=|\+=|\-=|&=|\^=/, + next : "start" + }, { + token : "punctuation.operator", + regex : /\?|\:|\,|\;|\./, + next : "start" + }, { + token : "paren.lparen", + regex : /[\[({]/, + next : "start" + }, { + token : "paren.rparen", + regex : /[\])}]/ + }, { + token : "keyword.operator", + regex : /\/=?/, + next : "start" + }, { + token: "comment", + regex: /^#!.*$/ + } + ], + "start": [ + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment_regex_allowed" + }, { + token : "comment", + regex : "\\/\\/.*$", + next : "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: "/\\w*", + 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.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: identifierRe + }, { + token: "punctuation.operator", + regex: "[, ]+" + }, { + token: "punctuation.operator", + regex: "$" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "comment_regex_allowed" : [ + {token : "comment", regex : "\\*\\/", next : "start"}, + {defaultToken : "comment"} + ], + "comment" : [ + {token : "comment", regex : "\\*\\/", next : "no_regex"}, + {defaultToken : "comment"} + ], + "qqstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + next : "qqstring" + }, { + token : "string", + regex : '"|$', + next : "no_regex" + }, { + defaultToken: "string" + } + ], + "qstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + next : "qstring" + }, { + token : "string", + regex : "'|$", + next : "no_regex" + }, { + defaultToken: "string" + } + ] + }; + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("no_regex") ]); +}; + +oop.inherits(JavaScriptHighlightRules, TextHighlightRules); + +exports.JavaScriptHighlightRules = JavaScriptHighlightRules; +}); + +ace.define('ace/mode/doc_comment_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, { + token : "comment.doc.tag", + regex : "\\bTODO\\b" + }, { + defaultToken : "comment.doc" + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) { + + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define('ace/mode/behaviour/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/token_iterator', 'ace/lib/lang'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; +var lang = require("../../lib/lang"); + +var SAFE_INSERT_IN_TOKENS = + ["text", "paren.rparen", "punctuation.operator"]; +var SAFE_INSERT_BEFORE_TOKENS = + ["text", "paren.rparen", "punctuation.operator", "comment"]; + + +var autoInsertedBrackets = 0; +var autoInsertedRow = -1; +var autoInsertedLineEnd = ""; +var maybeInsertedBrackets = 0; +var maybeInsertedRow = -1; +var maybeInsertedLineStart = ""; +var maybeInsertedLineEnd = ""; + +var CstyleBehaviour = function () { + + CstyleBehaviour.isSaneInsertion = function(editor, session) { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + if (!this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) { + var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1); + if (!this.$matchTokenType(iterator2.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) + return false; + } + iterator.stepForward(); + return iterator.getCurrentTokenRow() !== cursor.row || + this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_BEFORE_TOKENS); + }; + + CstyleBehaviour.$matchTokenType = function(token, types) { + return types.indexOf(token.type || token) > -1; + }; + + CstyleBehaviour.recordAutoInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isAutoInsertedClosing(cursor, line, autoInsertedLineEnd[0])) + autoInsertedBrackets = 0; + autoInsertedRow = cursor.row; + autoInsertedLineEnd = bracket + line.substr(cursor.column); + autoInsertedBrackets++; + }; + + CstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isMaybeInsertedClosing(cursor, line)) + maybeInsertedBrackets = 0; + maybeInsertedRow = cursor.row; + maybeInsertedLineStart = line.substr(0, cursor.column) + bracket; + maybeInsertedLineEnd = line.substr(cursor.column); + maybeInsertedBrackets++; + }; + + CstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) { + return autoInsertedBrackets > 0 && + cursor.row === autoInsertedRow && + bracket === autoInsertedLineEnd[0] && + line.substr(cursor.column) === autoInsertedLineEnd; + }; + + CstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) { + return maybeInsertedBrackets > 0 && + cursor.row === maybeInsertedRow && + line.substr(cursor.column) === maybeInsertedLineEnd && + line.substr(0, cursor.column) == maybeInsertedLineStart; + }; + + CstyleBehaviour.popAutoInsertedClosing = function() { + autoInsertedLineEnd = autoInsertedLineEnd.substr(1); + autoInsertedBrackets--; + }; + + CstyleBehaviour.clearMaybeInsertedClosing = function() { + maybeInsertedBrackets = 0; + maybeInsertedRow = -1; + }; + + this.add("braces", "insertion", function (state, action, editor, session, text) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (text == '{') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "{" && editor.getWrapBehavioursEnabled()) { + return { + text: '{' + selected + '}', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + if (/[\]\}\)]/.test(line[cursor.column])) { + CstyleBehaviour.recordAutoInsert(editor, session, "}"); + return { + text: '{}', + selection: [1, 1] + }; + } else { + CstyleBehaviour.recordMaybeInsert(editor, session, "{"); + return { + text: '{', + selection: [1, 1] + }; + } + } + } else if (text == '}') { + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}') { + var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } else if (text == "\n" || text == "\r\n") { + var closing = ""; + if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) { + closing = lang.stringRepeat("}", maybeInsertedBrackets); + CstyleBehaviour.clearMaybeInsertedClosing(); + } + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}' || closing !== "") { + var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column}, '}'); + if (!openBracePos) + return null; + + var indent = this.getNextLineIndent(state, line.substring(0, cursor.column), session.getTabString()); + var next_indent = this.$getIndent(line); + + return { + text: '\n' + indent + '\n' + next_indent + closing, + selection: [1, indent.length, 1, indent.length] + }; + } + } + }); + + this.add("braces", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '{') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar == '}') { + range.end.column++; + return range; + } else { + maybeInsertedBrackets--; + } + } + }); + + this.add("parens", "insertion", function (state, action, editor, session, text) { + if (text == '(') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return { + text: '(' + selected + ')', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, ")"); + return { + text: '()', + selection: [1, 1] + }; + } + } else if (text == ')') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ')') { + var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("parens", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '(') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ')') { + range.end.column++; + return range; + } + } + }); + + this.add("brackets", "insertion", function (state, action, editor, session, text) { + if (text == '[') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return { + text: '[' + selected + ']', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, "]"); + return { + text: '[]', + selection: [1, 1] + }; + } + } else if (text == ']') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ']') { + var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("brackets", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '[') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ']') { + range.end.column++; + return range; + } + } + }); + + this.add("string_dquotes", "insertion", function (state, action, editor, session, text) { + if (text == '"' || text == "'") { + var quote = text; + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "'" && selected != '"' && editor.getWrapBehavioursEnabled()) { + return { + text: quote + selected + quote, + selection: false + }; + } else { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var leftChar = line.substring(cursor.column-1, cursor.column); + if (leftChar == '\\') { + return null; + } + var tokens = session.getTokens(selection.start.row); + var col = 0, token; + var quotepos = -1; // Track whether we're inside an open quote. + + for (var x = 0; x < tokens.length; x++) { + token = tokens[x]; + if (token.type == "string") { + quotepos = -1; + } else if (quotepos < 0) { + quotepos = token.value.indexOf(quote); + } + if ((token.value.length + col) > selection.start.column) { + break; + } + col += tokens[x].value.length; + } + if (!token || (quotepos < 0 && token.type !== "comment" && (token.type !== "string" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) { + if (!CstyleBehaviour.isSaneInsertion(editor, session)) + return; + return { + text: quote + quote, + selection: [1,1] + }; + } else if (token && token.type === "string") { + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == quote) { + return { + text: '', + selection: [1, 1] + }; + } + } + } + } + }); + + this.add("string_dquotes", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && (selected == '"' || selected == "'")) { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == selected) { + range.end.column++; + return range; + } + } + }); + +}; + +oop.inherits(CstyleBehaviour, Behaviour); + +exports.CstyleBehaviour = CstyleBehaviour; +}); + +ace.define('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var line = session.getLine(row); + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i + match[0].length, 1); + } + + if (foldStyle !== "markbeginend") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + +}).call(FoldMode.prototype); + +}); diff --git a/0.0.3_0/ace/mode-json.js b/0.0.3_0/ace/mode-json.js new file mode 100644 index 0000000..f0cecb2 --- /dev/null +++ b/0.0.3_0/ace/mode-json.js @@ -0,0 +1,578 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2010, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/mode/json', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/json_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/mode/behaviour/cstyle', 'ace/mode/folding/cstyle', 'ace/worker/worker_client'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var HighlightRules = require("./json_highlight_rules").JsonHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; +var WorkerClient = require("../worker/worker_client").WorkerClient; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new HighlightRules().getRules()); + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + if (state == "start") { + var match = line.match(/^.*[\{\(\[]\s*$/); + if (match) { + indent += tab; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/json_worker", "JsonWorker"); + worker.attachToDocument(session.getDocument()); + + worker.on("error", function(e) { + session.setAnnotations([e.data]); + }); + + worker.on("ok", function() { + session.clearAnnotations(); + }); + + return worker; + }; + + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/json_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var JsonHighlightRules = function() { + this.$rules = { + "start" : [ + { + token : "variable", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]\\s*(?=:)' + }, { + token : "string", // single line + regex : '"', + next : "string" + }, { + token : "constant.numeric", // hex + regex : "0[xX][0-9a-fA-F]+\\b" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : "constant.language.boolean", + regex : "(?:true|false)\\b" + }, { + token : "invalid.illegal", // single quoted strings are not allowed + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" + }, { + token : "invalid.illegal", // comments are not allowed + regex : "\\/\\/.*$" + }, { + token : "paren.lparen", + regex : "[[({]" + }, { + token : "paren.rparen", + regex : "[\\])}]" + }, { + token : "text", + regex : "\\s+" + } + ], + "string" : [ + { + token : "constant.language.escape", + regex : /\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|["\\\/bfnrt])/ + }, { + token : "string", + regex : '[^"\\\\]+' + }, { + token : "string", + regex : '"', + next : "start" + }, { + token : "string", + regex : "", + next : "start" + } + ] + }; + +}; + +oop.inherits(JsonHighlightRules, TextHighlightRules); + +exports.JsonHighlightRules = JsonHighlightRules; +}); + +ace.define('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) { + + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define('ace/mode/behaviour/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/token_iterator', 'ace/lib/lang'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; +var lang = require("../../lib/lang"); + +var SAFE_INSERT_IN_TOKENS = + ["text", "paren.rparen", "punctuation.operator"]; +var SAFE_INSERT_BEFORE_TOKENS = + ["text", "paren.rparen", "punctuation.operator", "comment"]; + + +var autoInsertedBrackets = 0; +var autoInsertedRow = -1; +var autoInsertedLineEnd = ""; +var maybeInsertedBrackets = 0; +var maybeInsertedRow = -1; +var maybeInsertedLineStart = ""; +var maybeInsertedLineEnd = ""; + +var CstyleBehaviour = function () { + + CstyleBehaviour.isSaneInsertion = function(editor, session) { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + if (!this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) { + var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1); + if (!this.$matchTokenType(iterator2.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) + return false; + } + iterator.stepForward(); + return iterator.getCurrentTokenRow() !== cursor.row || + this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_BEFORE_TOKENS); + }; + + CstyleBehaviour.$matchTokenType = function(token, types) { + return types.indexOf(token.type || token) > -1; + }; + + CstyleBehaviour.recordAutoInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isAutoInsertedClosing(cursor, line, autoInsertedLineEnd[0])) + autoInsertedBrackets = 0; + autoInsertedRow = cursor.row; + autoInsertedLineEnd = bracket + line.substr(cursor.column); + autoInsertedBrackets++; + }; + + CstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isMaybeInsertedClosing(cursor, line)) + maybeInsertedBrackets = 0; + maybeInsertedRow = cursor.row; + maybeInsertedLineStart = line.substr(0, cursor.column) + bracket; + maybeInsertedLineEnd = line.substr(cursor.column); + maybeInsertedBrackets++; + }; + + CstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) { + return autoInsertedBrackets > 0 && + cursor.row === autoInsertedRow && + bracket === autoInsertedLineEnd[0] && + line.substr(cursor.column) === autoInsertedLineEnd; + }; + + CstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) { + return maybeInsertedBrackets > 0 && + cursor.row === maybeInsertedRow && + line.substr(cursor.column) === maybeInsertedLineEnd && + line.substr(0, cursor.column) == maybeInsertedLineStart; + }; + + CstyleBehaviour.popAutoInsertedClosing = function() { + autoInsertedLineEnd = autoInsertedLineEnd.substr(1); + autoInsertedBrackets--; + }; + + CstyleBehaviour.clearMaybeInsertedClosing = function() { + maybeInsertedBrackets = 0; + maybeInsertedRow = -1; + }; + + this.add("braces", "insertion", function (state, action, editor, session, text) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (text == '{') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "{" && editor.getWrapBehavioursEnabled()) { + return { + text: '{' + selected + '}', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + if (/[\]\}\)]/.test(line[cursor.column])) { + CstyleBehaviour.recordAutoInsert(editor, session, "}"); + return { + text: '{}', + selection: [1, 1] + }; + } else { + CstyleBehaviour.recordMaybeInsert(editor, session, "{"); + return { + text: '{', + selection: [1, 1] + }; + } + } + } else if (text == '}') { + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}') { + var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } else if (text == "\n" || text == "\r\n") { + var closing = ""; + if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) { + closing = lang.stringRepeat("}", maybeInsertedBrackets); + CstyleBehaviour.clearMaybeInsertedClosing(); + } + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}' || closing !== "") { + var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column}, '}'); + if (!openBracePos) + return null; + + var indent = this.getNextLineIndent(state, line.substring(0, cursor.column), session.getTabString()); + var next_indent = this.$getIndent(line); + + return { + text: '\n' + indent + '\n' + next_indent + closing, + selection: [1, indent.length, 1, indent.length] + }; + } + } + }); + + this.add("braces", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '{') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar == '}') { + range.end.column++; + return range; + } else { + maybeInsertedBrackets--; + } + } + }); + + this.add("parens", "insertion", function (state, action, editor, session, text) { + if (text == '(') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return { + text: '(' + selected + ')', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, ")"); + return { + text: '()', + selection: [1, 1] + }; + } + } else if (text == ')') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ')') { + var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("parens", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '(') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ')') { + range.end.column++; + return range; + } + } + }); + + this.add("brackets", "insertion", function (state, action, editor, session, text) { + if (text == '[') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return { + text: '[' + selected + ']', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, "]"); + return { + text: '[]', + selection: [1, 1] + }; + } + } else if (text == ']') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ']') { + var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("brackets", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '[') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ']') { + range.end.column++; + return range; + } + } + }); + + this.add("string_dquotes", "insertion", function (state, action, editor, session, text) { + if (text == '"' || text == "'") { + var quote = text; + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "'" && selected != '"' && editor.getWrapBehavioursEnabled()) { + return { + text: quote + selected + quote, + selection: false + }; + } else { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var leftChar = line.substring(cursor.column-1, cursor.column); + if (leftChar == '\\') { + return null; + } + var tokens = session.getTokens(selection.start.row); + var col = 0, token; + var quotepos = -1; // Track whether we're inside an open quote. + + for (var x = 0; x < tokens.length; x++) { + token = tokens[x]; + if (token.type == "string") { + quotepos = -1; + } else if (quotepos < 0) { + quotepos = token.value.indexOf(quote); + } + if ((token.value.length + col) > selection.start.column) { + break; + } + col += tokens[x].value.length; + } + if (!token || (quotepos < 0 && token.type !== "comment" && (token.type !== "string" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) { + if (!CstyleBehaviour.isSaneInsertion(editor, session)) + return; + return { + text: quote + quote, + selection: [1,1] + }; + } else if (token && token.type === "string") { + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == quote) { + return { + text: '', + selection: [1, 1] + }; + } + } + } + } + }); + + this.add("string_dquotes", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && (selected == '"' || selected == "'")) { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == selected) { + range.end.column++; + return range; + } + } + }); + +}; + +oop.inherits(CstyleBehaviour, Behaviour); + +exports.CstyleBehaviour = CstyleBehaviour; +}); + +ace.define('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var line = session.getLine(row); + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i + match[0].length, 1); + } + + if (foldStyle !== "markbeginend") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + +}).call(FoldMode.prototype); + +}); diff --git a/0.0.3_0/ace/mode-jsoniq.js b/0.0.3_0/ace/mode-jsoniq.js new file mode 100644 index 0000000..281eeaf --- /dev/null +++ b/0.0.3_0/ace/mode-jsoniq.js @@ -0,0 +1,2716 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2010, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ***** END LICENSE BLOCK ***** */ +ace.define('ace/mode/jsoniq', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/mode/xquery/JSONiqLexer', 'ace/range', 'ace/mode/behaviour/xquery', 'ace/mode/folding/cstyle'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var JSONiqLexer = require("./xquery/JSONiqLexer").JSONiqLexer; +var Range = require("../range").Range; +var XQueryBehaviour = require("./behaviour/xquery").XQueryBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + + +var Mode = function() { + this.$tokenizer = new JSONiqLexer(); + this.$behaviour = new XQueryBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; + +oop.inherits(Mode, TextMode); + +(function() { + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + var match = line.match(/\s*(?:then|else|return|[{\(]|<\w+>)\s*$/); + if (match) + indent += tab; + return indent; + }; + + this.checkOutdent = function(state, line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*[\}\)]/.test(input); + }; + + this.autoOutdent = function(state, doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*[\}\)])/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.toggleCommentLines = function(state, doc, startRow, endRow) { + var i, line; + var outdent = true; + var re = /^\s*\(:(.*):\)/; + + for (i=startRow; i<= endRow; i++) { + if (!re.test(doc.getLine(i))) { + outdent = false; + break; + } + } + + var range = new Range(0, 0, 0, 0); + for (i=startRow; i<= endRow; i++) { + line = doc.getLine(i); + range.start.row = i; + range.end.row = i; + range.end.column = line.length; + + doc.replace(range, outdent ? line.match(re)[1] : "(:" + line + ":)"); + } + }; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/xquery/JSONiqLexer', ['require', 'exports', 'module' , 'ace/mode/xquery/JSONiqTokenizer'], function(require, exports, module) { + + var JSONiqTokenizer = require("./JSONiqTokenizer").JSONiqTokenizer; + + var TokenHandler = function(code) { + + var input = code; + + this.tokens = []; + + this.reset = function(code) { + input = input; + this.tokens = []; + }; + + this.startNonterminal = function(name, begin) {}; + + this.endNonterminal = function(name, end) {}; + + this.terminal = function(name, begin, end) { + this.tokens.push({ + name: name, + value: input.substring(begin, end) + }); + }; + + this.whitespace = function(begin, end) { + this.tokens.push({ + name: "WS", + value: input.substring(begin, end) + }); + }; + }; + var keys = "NaN|after|allowing|ancestor|ancestor-or-self|and|append|array|as|ascending|at|attribute|base-uri|before|boundary-space|break|by|case|cast|castable|catch|child|collation|comment|constraint|construction|contains|context|continue|copy|copy-namespaces|count|decimal-format|decimal-separator|declare|default|delete|descendant|descendant-or-self|descending|digit|div|document|document-node|element|else|empty|empty-sequence|encoding|end|eq|every|except|exit|external|false|first|following|following-sibling|for|from|ft-option|function|ge|greatest|group|grouping-separator|gt|idiv|if|import|in|index|infinity|insert|instance|integrity|intersect|into|is|item|json|json-item|jsoniq|last|lax|le|least|let|loop|lt|minus-sign|mod|modify|module|namespace|namespace-node|ne|next|node|nodes|not|null|object|of|only|option|or|order|ordered|ordering|paragraphs|parent|pattern-separator|per-mille|percent|preceding|preceding-sibling|previous|processing-instruction|rename|replace|return|returning|revalidation|satisfies|schema|schema-attribute|schema-element|score|select|self|sentences|sliding|some|stable|start|strict|switch|text|then|times|to|treat|true|try|tumbling|type|typeswitch|union|unordered|updating|validate|value|variable|version|when|where|while|window|with|words|xquery|zero-digit".split("|"); + var keywords = keys.map( + function(val) { return { name: "'" + val + "'", token: "keyword" }; } + ); + + var ncnames = keys.map( + function(val) { return { name: "'" + val + "'", token: "text", next: function(stack){ stack.pop(); } }; } + ); + + var cdata = "constant.language"; + var number = "constant"; + var xmlcomment = "comment"; + var pi = "xml-pe"; + var pragma = "constant.buildin"; + + var Rules = { + start: [ + { name: "'(#'", token: pragma, next: function(stack){ stack.push("Pragma"); } }, + { name: "'(:'", token: "comment", next: function(stack){ stack.push("Comment"); } }, + { name: "'(:~'", token: "comment.doc", next: function(stack){ stack.push("CommentDoc"); } }, + { name: "''", token: xmlcomment, next: function(stack){ stack.pop(); } } + ], + CData: [ + { name: "CDataSectionContents", token: cdata }, + { name: "']]>'", token: cdata, next: function(stack){ stack.pop(); } } + ], + PI: [ + { name: "DirPIContents", token: pi }, + { name: "'?'", token: pi }, + { name: "'?>'", token: pi, next: function(stack){ stack.pop(); } } + ], + AposString: [ + { name: "''''", token: "string", next: function(stack){ stack.pop(); } }, + { name: "PredefinedEntityRef", token: "constant.language.escape" }, + { name: "CharRef", token: "constant.language.escape" }, + { name: "EscapeApos", token: "constant.language.escape" }, + { name: "AposChar", token: "string" } + ], + QuotString: [ + { name: "'\"'", token: "string", next: function(stack){ stack.pop(); } }, + { name: "PredefinedEntityRef", token: "constant.language.escape" }, + { name: "CharRef", token: "constant.language.escape" }, + { name: "EscapeQuot", token: "constant.language.escape" }, + { name: "QuotChar", token: "string" } + ] + }; + +exports.JSONiqLexer = function() { + + this.tokens = []; + + this.getLineTokens = function(line, state, row) { + state = (state === "start" || !state) ? '["start"]' : state; + var stack = JSON.parse(state); + var h = new TokenHandler(line); + var tokenizer = new JSONiqTokenizer(line, h); + var tokens = []; + + while(true) { + var currentState = stack[stack.length - 1]; + try { + + h.tokens = []; + tokenizer["parse_" + currentState](); + var info = null; + + if(h.tokens.length > 1 && h.tokens[0].name === "WS") { + tokens.push({ + type: "text", + value: h.tokens[0].value + }); + h.tokens.splice(0, 1); + } + + var token = h.tokens[0]; + var rules = Rules[currentState]; + for(var k = 0; k < rules.length; k++) { + var rule = Rules[currentState][k]; + if((typeof(rule.name) === "function" && rule.name(token)) || rule.name === token.name) { + info = rule; + break; + } + } + + if(token.name === "EOF") { break; } + if(token.value === "") { throw "Encountered empty string lexical rule."; } + + tokens.push({ + type: info === null ? "text" : (typeof(info.token) === "function" ? info.token(token.value) : info.token), + value: token.value + }); + + if(info && info.next) { + info.next(stack); + } + + } catch(e) { + if(e instanceof tokenizer.ParseException) { + var index = 0; + for(var i=0; i < tokens.length; i++) { + index += tokens[i].value.length; + } + tokens.push({ type: "text", value: line.substring(index) }); + return { + tokens: tokens, + state: JSON.stringify(["start"]) + }; + } else { + throw e; + } + } + } + + + if(this.tokens[row] !== undefined) { + var cachedLine = this.lines[row]; + var begin = sharedStart([line, cachedLine]); + var diff = cachedLine.length - line.length; + var idx = 0; + var col = 0; + for(var i = 0; i < tokens.length; i++) { + var token = tokens[i]; + for(var j = 0; j < this.tokens[row].length; j++) { + var semanticToken = this.tokens[row][j]; + if( + ((col + token.value.length) <= begin.length && semanticToken.sc === col && semanticToken.ec === (col + token.value.length)) || + (semanticToken.sc === (col + diff) && semanticToken.ec === (col + token.value.length + diff)) + ) { + idx = i; + tokens[i].type = semanticToken.type; + } + } + col += token.value.length; + } + } + + return { + tokens: tokens, + state: JSON.stringify(stack) + }; + }; + + function sharedStart(A) { + var tem1, tem2, s, A = A.slice(0).sort(); + tem1 = A[0]; + s = tem1.length; + tem2 = A.pop(); + while(s && tem2.indexOf(tem1) == -1) { + tem1 = tem1.substring(0, --s); + } + return tem1; + } +}; +}); + + ace.define('ace/mode/xquery/JSONiqTokenizer', ['require', 'exports', 'module' ], function(require, exports, module) { + var JSONiqTokenizer = exports.JSONiqTokenizer = function JSONiqTokenizer(string, parsingEventHandler) + { + init(string, parsingEventHandler); + var self = this; + + this.ParseException = function(b, e, s, o, x) + { + var + begin = b, + end = e, + state = s, + offending = o, + expected = x; + + this.getBegin = function() {return begin;}; + this.getEnd = function() {return end;}; + this.getState = function() {return state;}; + this.getExpected = function() {return expected;}; + this.getOffending = function() {return offending;}; + + this.getMessage = function() + { + return offending < 0 ? "lexical analysis failed" : "syntax error"; + }; + }; + + function init(string, parsingEventHandler) + { + eventHandler = parsingEventHandler; + input = string; + size = string.length; + reset(0, 0, 0); + } + + this.getInput = function() + { + return input; + }; + + function reset(l, b, e) + { + b0 = b; e0 = b; + l1 = l; b1 = b; e1 = e; + end = e; + eventHandler.reset(input); + } + + this.getOffendingToken = function(e) + { + var o = e.getOffending(); + return o >= 0 ? JSONiqTokenizer.TOKEN[o] : null; + }; + + this.getExpectedTokenSet = function(e) + { + var expected; + if (e.getExpected() < 0) + { + expected = JSONiqTokenizer.getTokenSet(- e.getState()); + } + else + { + expected = [JSONiqTokenizer.TOKEN[e.getExpected()]]; + } + return expected; + }; + + this.getErrorMessage = function(e) + { + var tokenSet = this.getExpectedTokenSet(e); + var found = this.getOffendingToken(e); + var prefix = input.substring(0, e.getBegin()); + var lines = prefix.split("\n"); + var line = lines.length; + var column = lines[line - 1].length + 1; + var size = e.getEnd() - e.getBegin(); + return e.getMessage() + + (found == null ? "" : ", found " + found) + + "\nwhile expecting " + + (tokenSet.length == 1 ? tokenSet[0] : ("[" + tokenSet.join(", ") + "]")) + + "\n" + + (size == 0 || found != null ? "" : "after successfully scanning " + size + " characters beginning ") + + "at line " + line + ", column " + column + ":\n..." + + input.substring(e.getBegin(), Math.min(input.length, e.getBegin() + 64)) + + "..."; + }; + + this.parse_start = function() + { + eventHandler.startNonterminal("start", e0); + lookahead1W(14); // ModuleDecl | Annotation | OptionDecl | Operator | Variable | Tag | AttrTest | + switch (l1) + { + case 55: // '' | '=' | '>' + switch (l1) + { + case 58: // '>' + shift(58); // '>' + break; + case 50: // '/>' + shift(50); // '/>' + break; + case 27: // QName + shift(27); // QName + break; + case 57: // '=' + shift(57); // '=' + break; + case 35: // '"' + shift(35); // '"' + break; + case 38: // "'" + shift(38); // "'" + break; + default: + shift(33); // EOF + } + eventHandler.endNonterminal("StartTag", e0); + }; + + this.parse_TagContent = function() + { + eventHandler.startNonterminal("TagContent", e0); + lookahead1(11); // Tag | EndTag | PredefinedEntityRef | ElementContentChar | CharRef | EOF | + switch (l1) + { + case 23: // ElementContentChar + shift(23); // ElementContentChar + break; + case 6: // Tag + shift(6); // Tag + break; + case 7: // EndTag + shift(7); // EndTag + break; + case 55: // '' + switch (l1) + { + case 11: // CDataSectionContents + shift(11); // CDataSectionContents + break; + case 64: // ']]>' + shift(64); // ']]>' + break; + default: + shift(33); // EOF + } + eventHandler.endNonterminal("CData", e0); + }; + + this.parse_XMLComment = function() + { + eventHandler.startNonterminal("XMLComment", e0); + lookahead1(0); // DirCommentContents | EOF | '-->' + switch (l1) + { + case 9: // DirCommentContents + shift(9); // DirCommentContents + break; + case 47: // '-->' + shift(47); // '-->' + break; + default: + shift(33); // EOF + } + eventHandler.endNonterminal("XMLComment", e0); + }; + + this.parse_PI = function() + { + eventHandler.startNonterminal("PI", e0); + lookahead1(3); // DirPIContents | EOF | '?' | '?>' + switch (l1) + { + case 10: // DirPIContents + shift(10); // DirPIContents + break; + case 59: // '?' + shift(59); // '?' + break; + case 60: // '?>' + shift(60); // '?>' + break; + default: + shift(33); // EOF + } + eventHandler.endNonterminal("PI", e0); + }; + + this.parse_Pragma = function() + { + eventHandler.startNonterminal("Pragma", e0); + lookahead1(2); // PragmaContents | EOF | '#' | '#)' + switch (l1) + { + case 8: // PragmaContents + shift(8); // PragmaContents + break; + case 36: // '#' + shift(36); // '#' + break; + case 37: // '#)' + shift(37); // '#)' + break; + default: + shift(33); // EOF + } + eventHandler.endNonterminal("Pragma", e0); + }; + + this.parse_Comment = function() + { + eventHandler.startNonterminal("Comment", e0); + lookahead1(4); // CommentContents | EOF | '(:' | ':)' + switch (l1) + { + case 52: // ':)' + shift(52); // ':)' + break; + case 41: // '(:' + shift(41); // '(:' + break; + case 30: // CommentContents + shift(30); // CommentContents + break; + default: + shift(33); // EOF + } + eventHandler.endNonterminal("Comment", e0); + }; + + this.parse_CommentDoc = function() + { + eventHandler.startNonterminal("CommentDoc", e0); + lookahead1(5); // DocTag | DocCommentContents | EOF | '(:' | ':)' + switch (l1) + { + case 31: // DocTag + shift(31); // DocTag + break; + case 32: // DocCommentContents + shift(32); // DocCommentContents + break; + case 52: // ':)' + shift(52); // ':)' + break; + case 41: // '(:' + shift(41); // '(:' + break; + default: + shift(33); // EOF + } + eventHandler.endNonterminal("CommentDoc", e0); + }; + + this.parse_QuotString = function() + { + eventHandler.startNonterminal("QuotString", e0); + lookahead1(6); // PredefinedEntityRef | EscapeQuot | QuotChar | CharRef | EOF | '"' + switch (l1) + { + case 18: // PredefinedEntityRef + shift(18); // PredefinedEntityRef + break; + case 29: // CharRef + shift(29); // CharRef + break; + case 19: // EscapeQuot + shift(19); // EscapeQuot + break; + case 21: // QuotChar + shift(21); // QuotChar + break; + case 35: // '"' + shift(35); // '"' + break; + default: + shift(33); // EOF + } + eventHandler.endNonterminal("QuotString", e0); + }; + + this.parse_AposString = function() + { + eventHandler.startNonterminal("AposString", e0); + lookahead1(7); // PredefinedEntityRef | EscapeApos | AposChar | CharRef | EOF | "'" + switch (l1) + { + case 18: // PredefinedEntityRef + shift(18); // PredefinedEntityRef + break; + case 29: // CharRef + shift(29); // CharRef + break; + case 20: // EscapeApos + shift(20); // EscapeApos + break; + case 22: // AposChar + shift(22); // AposChar + break; + case 38: // "'" + shift(38); // "'" + break; + default: + shift(33); // EOF + } + eventHandler.endNonterminal("AposString", e0); + }; + + this.parse_Prefix = function() + { + eventHandler.startNonterminal("Prefix", e0); + lookahead1W(13); // NCName^Token | S^WS | 'after' | 'allowing' | 'ancestor' | 'ancestor-or-self' | + whitespace(); + parse_NCName(); + eventHandler.endNonterminal("Prefix", e0); + }; + + this.parse__EQName = function() + { + eventHandler.startNonterminal("_EQName", e0); + lookahead1W(12); // EQName^Token | S^WS | 'after' | 'allowing' | 'ancestor' | 'ancestor-or-self' | + whitespace(); + parse_EQName(); + eventHandler.endNonterminal("_EQName", e0); + }; + + function parse_EQName() + { + eventHandler.startNonterminal("EQName", e0); + switch (l1) + { + case 77: // 'attribute' + shift(77); // 'attribute' + break; + case 91: // 'comment' + shift(91); // 'comment' + break; + case 115: // 'document-node' + shift(115); // 'document-node' + break; + case 116: // 'element' + shift(116); // 'element' + break; + case 119: // 'empty-sequence' + shift(119); // 'empty-sequence' + break; + case 140: // 'function' + shift(140); // 'function' + break; + case 147: // 'if' + shift(147); // 'if' + break; + case 160: // 'item' + shift(160); // 'item' + break; + case 180: // 'namespace-node' + shift(180); // 'namespace-node' + break; + case 186: // 'node' + shift(186); // 'node' + break; + case 211: // 'processing-instruction' + shift(211); // 'processing-instruction' + break; + case 221: // 'schema-attribute' + shift(221); // 'schema-attribute' + break; + case 222: // 'schema-element' + shift(222); // 'schema-element' + break; + case 238: // 'switch' + shift(238); // 'switch' + break; + case 239: // 'text' + shift(239); // 'text' + break; + case 248: // 'typeswitch' + shift(248); // 'typeswitch' + break; + default: + parse_FunctionName(); + } + eventHandler.endNonterminal("EQName", e0); + } + + function parse_FunctionName() + { + eventHandler.startNonterminal("FunctionName", e0); + switch (l1) + { + case 14: // EQName^Token + shift(14); // EQName^Token + break; + case 65: // 'after' + shift(65); // 'after' + break; + case 68: // 'ancestor' + shift(68); // 'ancestor' + break; + case 69: // 'ancestor-or-self' + shift(69); // 'ancestor-or-self' + break; + case 70: // 'and' + shift(70); // 'and' + break; + case 74: // 'as' + shift(74); // 'as' + break; + case 75: // 'ascending' + shift(75); // 'ascending' + break; + case 79: // 'before' + shift(79); // 'before' + break; + case 83: // 'case' + shift(83); // 'case' + break; + case 84: // 'cast' + shift(84); // 'cast' + break; + case 85: // 'castable' + shift(85); // 'castable' + break; + case 88: // 'child' + shift(88); // 'child' + break; + case 89: // 'collation' + shift(89); // 'collation' + break; + case 98: // 'copy' + shift(98); // 'copy' + break; + case 100: // 'count' + shift(100); // 'count' + break; + case 103: // 'declare' + shift(103); // 'declare' + break; + case 104: // 'default' + shift(104); // 'default' + break; + case 105: // 'delete' + shift(105); // 'delete' + break; + case 106: // 'descendant' + shift(106); // 'descendant' + break; + case 107: // 'descendant-or-self' + shift(107); // 'descendant-or-self' + break; + case 108: // 'descending' + shift(108); // 'descending' + break; + case 113: // 'div' + shift(113); // 'div' + break; + case 114: // 'document' + shift(114); // 'document' + break; + case 117: // 'else' + shift(117); // 'else' + break; + case 118: // 'empty' + shift(118); // 'empty' + break; + case 121: // 'end' + shift(121); // 'end' + break; + case 123: // 'eq' + shift(123); // 'eq' + break; + case 124: // 'every' + shift(124); // 'every' + break; + case 126: // 'except' + shift(126); // 'except' + break; + case 129: // 'first' + shift(129); // 'first' + break; + case 130: // 'following' + shift(130); // 'following' + break; + case 131: // 'following-sibling' + shift(131); // 'following-sibling' + break; + case 132: // 'for' + shift(132); // 'for' + break; + case 141: // 'ge' + shift(141); // 'ge' + break; + case 143: // 'group' + shift(143); // 'group' + break; + case 145: // 'gt' + shift(145); // 'gt' + break; + case 146: // 'idiv' + shift(146); // 'idiv' + break; + case 148: // 'import' + shift(148); // 'import' + break; + case 154: // 'insert' + shift(154); // 'insert' + break; + case 155: // 'instance' + shift(155); // 'instance' + break; + case 157: // 'intersect' + shift(157); // 'intersect' + break; + case 158: // 'into' + shift(158); // 'into' + break; + case 159: // 'is' + shift(159); // 'is' + break; + case 165: // 'last' + shift(165); // 'last' + break; + case 167: // 'le' + shift(167); // 'le' + break; + case 169: // 'let' + shift(169); // 'let' + break; + case 173: // 'lt' + shift(173); // 'lt' + break; + case 175: // 'mod' + shift(175); // 'mod' + break; + case 176: // 'modify' + shift(176); // 'modify' + break; + case 177: // 'module' + shift(177); // 'module' + break; + case 179: // 'namespace' + shift(179); // 'namespace' + break; + case 181: // 'ne' + shift(181); // 'ne' + break; + case 193: // 'only' + shift(193); // 'only' + break; + case 195: // 'or' + shift(195); // 'or' + break; + case 196: // 'order' + shift(196); // 'order' + break; + case 197: // 'ordered' + shift(197); // 'ordered' + break; + case 201: // 'parent' + shift(201); // 'parent' + break; + case 207: // 'preceding' + shift(207); // 'preceding' + break; + case 208: // 'preceding-sibling' + shift(208); // 'preceding-sibling' + break; + case 213: // 'rename' + shift(213); // 'rename' + break; + case 214: // 'replace' + shift(214); // 'replace' + break; + case 215: // 'return' + shift(215); // 'return' + break; + case 219: // 'satisfies' + shift(219); // 'satisfies' + break; + case 224: // 'self' + shift(224); // 'self' + break; + case 230: // 'some' + shift(230); // 'some' + break; + case 231: // 'stable' + shift(231); // 'stable' + break; + case 232: // 'start' + shift(232); // 'start' + break; + case 243: // 'to' + shift(243); // 'to' + break; + case 244: // 'treat' + shift(244); // 'treat' + break; + case 245: // 'try' + shift(245); // 'try' + break; + case 249: // 'union' + shift(249); // 'union' + break; + case 251: // 'unordered' + shift(251); // 'unordered' + break; + case 255: // 'validate' + shift(255); // 'validate' + break; + case 261: // 'where' + shift(261); // 'where' + break; + case 265: // 'with' + shift(265); // 'with' + break; + case 269: // 'xquery' + shift(269); // 'xquery' + break; + case 67: // 'allowing' + shift(67); // 'allowing' + break; + case 76: // 'at' + shift(76); // 'at' + break; + case 78: // 'base-uri' + shift(78); // 'base-uri' + break; + case 80: // 'boundary-space' + shift(80); // 'boundary-space' + break; + case 81: // 'break' + shift(81); // 'break' + break; + case 86: // 'catch' + shift(86); // 'catch' + break; + case 93: // 'construction' + shift(93); // 'construction' + break; + case 96: // 'context' + shift(96); // 'context' + break; + case 97: // 'continue' + shift(97); // 'continue' + break; + case 99: // 'copy-namespaces' + shift(99); // 'copy-namespaces' + break; + case 101: // 'decimal-format' + shift(101); // 'decimal-format' + break; + case 120: // 'encoding' + shift(120); // 'encoding' + break; + case 127: // 'exit' + shift(127); // 'exit' + break; + case 128: // 'external' + shift(128); // 'external' + break; + case 136: // 'ft-option' + shift(136); // 'ft-option' + break; + case 149: // 'in' + shift(149); // 'in' + break; + case 150: // 'index' + shift(150); // 'index' + break; + case 156: // 'integrity' + shift(156); // 'integrity' + break; + case 166: // 'lax' + shift(166); // 'lax' + break; + case 187: // 'nodes' + shift(187); // 'nodes' + break; + case 194: // 'option' + shift(194); // 'option' + break; + case 198: // 'ordering' + shift(198); // 'ordering' + break; + case 217: // 'revalidation' + shift(217); // 'revalidation' + break; + case 220: // 'schema' + shift(220); // 'schema' + break; + case 223: // 'score' + shift(223); // 'score' + break; + case 229: // 'sliding' + shift(229); // 'sliding' + break; + case 235: // 'strict' + shift(235); // 'strict' + break; + case 246: // 'tumbling' + shift(246); // 'tumbling' + break; + case 247: // 'type' + shift(247); // 'type' + break; + case 252: // 'updating' + shift(252); // 'updating' + break; + case 256: // 'value' + shift(256); // 'value' + break; + case 257: // 'variable' + shift(257); // 'variable' + break; + case 258: // 'version' + shift(258); // 'version' + break; + case 262: // 'while' + shift(262); // 'while' + break; + case 92: // 'constraint' + shift(92); // 'constraint' + break; + case 171: // 'loop' + shift(171); // 'loop' + break; + default: + shift(216); // 'returning' + } + eventHandler.endNonterminal("FunctionName", e0); + } + + function parse_NCName() + { + eventHandler.startNonterminal("NCName", e0); + switch (l1) + { + case 26: // NCName^Token + shift(26); // NCName^Token + break; + case 65: // 'after' + shift(65); // 'after' + break; + case 70: // 'and' + shift(70); // 'and' + break; + case 74: // 'as' + shift(74); // 'as' + break; + case 75: // 'ascending' + shift(75); // 'ascending' + break; + case 79: // 'before' + shift(79); // 'before' + break; + case 83: // 'case' + shift(83); // 'case' + break; + case 84: // 'cast' + shift(84); // 'cast' + break; + case 85: // 'castable' + shift(85); // 'castable' + break; + case 89: // 'collation' + shift(89); // 'collation' + break; + case 100: // 'count' + shift(100); // 'count' + break; + case 104: // 'default' + shift(104); // 'default' + break; + case 108: // 'descending' + shift(108); // 'descending' + break; + case 113: // 'div' + shift(113); // 'div' + break; + case 117: // 'else' + shift(117); // 'else' + break; + case 118: // 'empty' + shift(118); // 'empty' + break; + case 121: // 'end' + shift(121); // 'end' + break; + case 123: // 'eq' + shift(123); // 'eq' + break; + case 126: // 'except' + shift(126); // 'except' + break; + case 132: // 'for' + shift(132); // 'for' + break; + case 141: // 'ge' + shift(141); // 'ge' + break; + case 143: // 'group' + shift(143); // 'group' + break; + case 145: // 'gt' + shift(145); // 'gt' + break; + case 146: // 'idiv' + shift(146); // 'idiv' + break; + case 155: // 'instance' + shift(155); // 'instance' + break; + case 157: // 'intersect' + shift(157); // 'intersect' + break; + case 158: // 'into' + shift(158); // 'into' + break; + case 159: // 'is' + shift(159); // 'is' + break; + case 167: // 'le' + shift(167); // 'le' + break; + case 169: // 'let' + shift(169); // 'let' + break; + case 173: // 'lt' + shift(173); // 'lt' + break; + case 175: // 'mod' + shift(175); // 'mod' + break; + case 176: // 'modify' + shift(176); // 'modify' + break; + case 181: // 'ne' + shift(181); // 'ne' + break; + case 193: // 'only' + shift(193); // 'only' + break; + case 195: // 'or' + shift(195); // 'or' + break; + case 196: // 'order' + shift(196); // 'order' + break; + case 215: // 'return' + shift(215); // 'return' + break; + case 219: // 'satisfies' + shift(219); // 'satisfies' + break; + case 231: // 'stable' + shift(231); // 'stable' + break; + case 232: // 'start' + shift(232); // 'start' + break; + case 243: // 'to' + shift(243); // 'to' + break; + case 244: // 'treat' + shift(244); // 'treat' + break; + case 249: // 'union' + shift(249); // 'union' + break; + case 261: // 'where' + shift(261); // 'where' + break; + case 265: // 'with' + shift(265); // 'with' + break; + case 68: // 'ancestor' + shift(68); // 'ancestor' + break; + case 69: // 'ancestor-or-self' + shift(69); // 'ancestor-or-self' + break; + case 77: // 'attribute' + shift(77); // 'attribute' + break; + case 88: // 'child' + shift(88); // 'child' + break; + case 91: // 'comment' + shift(91); // 'comment' + break; + case 98: // 'copy' + shift(98); // 'copy' + break; + case 103: // 'declare' + shift(103); // 'declare' + break; + case 105: // 'delete' + shift(105); // 'delete' + break; + case 106: // 'descendant' + shift(106); // 'descendant' + break; + case 107: // 'descendant-or-self' + shift(107); // 'descendant-or-self' + break; + case 114: // 'document' + shift(114); // 'document' + break; + case 115: // 'document-node' + shift(115); // 'document-node' + break; + case 116: // 'element' + shift(116); // 'element' + break; + case 119: // 'empty-sequence' + shift(119); // 'empty-sequence' + break; + case 124: // 'every' + shift(124); // 'every' + break; + case 129: // 'first' + shift(129); // 'first' + break; + case 130: // 'following' + shift(130); // 'following' + break; + case 131: // 'following-sibling' + shift(131); // 'following-sibling' + break; + case 140: // 'function' + shift(140); // 'function' + break; + case 147: // 'if' + shift(147); // 'if' + break; + case 148: // 'import' + shift(148); // 'import' + break; + case 154: // 'insert' + shift(154); // 'insert' + break; + case 160: // 'item' + shift(160); // 'item' + break; + case 165: // 'last' + shift(165); // 'last' + break; + case 177: // 'module' + shift(177); // 'module' + break; + case 179: // 'namespace' + shift(179); // 'namespace' + break; + case 180: // 'namespace-node' + shift(180); // 'namespace-node' + break; + case 186: // 'node' + shift(186); // 'node' + break; + case 197: // 'ordered' + shift(197); // 'ordered' + break; + case 201: // 'parent' + shift(201); // 'parent' + break; + case 207: // 'preceding' + shift(207); // 'preceding' + break; + case 208: // 'preceding-sibling' + shift(208); // 'preceding-sibling' + break; + case 211: // 'processing-instruction' + shift(211); // 'processing-instruction' + break; + case 213: // 'rename' + shift(213); // 'rename' + break; + case 214: // 'replace' + shift(214); // 'replace' + break; + case 221: // 'schema-attribute' + shift(221); // 'schema-attribute' + break; + case 222: // 'schema-element' + shift(222); // 'schema-element' + break; + case 224: // 'self' + shift(224); // 'self' + break; + case 230: // 'some' + shift(230); // 'some' + break; + case 238: // 'switch' + shift(238); // 'switch' + break; + case 239: // 'text' + shift(239); // 'text' + break; + case 245: // 'try' + shift(245); // 'try' + break; + case 248: // 'typeswitch' + shift(248); // 'typeswitch' + break; + case 251: // 'unordered' + shift(251); // 'unordered' + break; + case 255: // 'validate' + shift(255); // 'validate' + break; + case 257: // 'variable' + shift(257); // 'variable' + break; + case 269: // 'xquery' + shift(269); // 'xquery' + break; + case 67: // 'allowing' + shift(67); // 'allowing' + break; + case 76: // 'at' + shift(76); // 'at' + break; + case 78: // 'base-uri' + shift(78); // 'base-uri' + break; + case 80: // 'boundary-space' + shift(80); // 'boundary-space' + break; + case 81: // 'break' + shift(81); // 'break' + break; + case 86: // 'catch' + shift(86); // 'catch' + break; + case 93: // 'construction' + shift(93); // 'construction' + break; + case 96: // 'context' + shift(96); // 'context' + break; + case 97: // 'continue' + shift(97); // 'continue' + break; + case 99: // 'copy-namespaces' + shift(99); // 'copy-namespaces' + break; + case 101: // 'decimal-format' + shift(101); // 'decimal-format' + break; + case 120: // 'encoding' + shift(120); // 'encoding' + break; + case 127: // 'exit' + shift(127); // 'exit' + break; + case 128: // 'external' + shift(128); // 'external' + break; + case 136: // 'ft-option' + shift(136); // 'ft-option' + break; + case 149: // 'in' + shift(149); // 'in' + break; + case 150: // 'index' + shift(150); // 'index' + break; + case 156: // 'integrity' + shift(156); // 'integrity' + break; + case 166: // 'lax' + shift(166); // 'lax' + break; + case 187: // 'nodes' + shift(187); // 'nodes' + break; + case 194: // 'option' + shift(194); // 'option' + break; + case 198: // 'ordering' + shift(198); // 'ordering' + break; + case 217: // 'revalidation' + shift(217); // 'revalidation' + break; + case 220: // 'schema' + shift(220); // 'schema' + break; + case 223: // 'score' + shift(223); // 'score' + break; + case 229: // 'sliding' + shift(229); // 'sliding' + break; + case 235: // 'strict' + shift(235); // 'strict' + break; + case 246: // 'tumbling' + shift(246); // 'tumbling' + break; + case 247: // 'type' + shift(247); // 'type' + break; + case 252: // 'updating' + shift(252); // 'updating' + break; + case 256: // 'value' + shift(256); // 'value' + break; + case 258: // 'version' + shift(258); // 'version' + break; + case 262: // 'while' + shift(262); // 'while' + break; + case 92: // 'constraint' + shift(92); // 'constraint' + break; + case 171: // 'loop' + shift(171); // 'loop' + break; + default: + shift(216); // 'returning' + } + eventHandler.endNonterminal("NCName", e0); + } + + function shift(t) + { + if (l1 == t) + { + whitespace(); + eventHandler.terminal(JSONiqTokenizer.TOKEN[l1], b1, e1 > size ? size : e1); + b0 = b1; e0 = e1; l1 = 0; + } + else + { + error(b1, e1, 0, l1, t); + } + } + + function whitespace() + { + if (e0 != b1) + { + b0 = e0; + e0 = b1; + eventHandler.whitespace(b0, e0); + } + } + + function matchW(set) + { + var code; + for (;;) + { + code = match(set); + if (code != 28) // S^WS + { + break; + } + } + return code; + } + + function lookahead1W(set) + { + if (l1 == 0) + { + l1 = matchW(set); + b1 = begin; + e1 = end; + } + } + + function lookahead1(set) + { + if (l1 == 0) + { + l1 = match(set); + b1 = begin; + e1 = end; + } + } + + function error(b, e, s, l, t) + { + throw new self.ParseException(b, e, s, l, t); + } + + var lk, b0, e0; + var l1, b1, e1; + var eventHandler; + + var input; + var size; + var begin; + var end; + + function match(tokenSetId) + { + var nonbmp = false; + begin = end; + var current = end; + var result = JSONiqTokenizer.INITIAL[tokenSetId]; + var state = 0; + + for (var code = result & 4095; code != 0; ) + { + var charclass; + var c0 = current < size ? input.charCodeAt(current) : 0; + ++current; + if (c0 < 0x80) + { + charclass = JSONiqTokenizer.MAP0[c0]; + } + else if (c0 < 0xd800) + { + var c1 = c0 >> 4; + charclass = JSONiqTokenizer.MAP1[(c0 & 15) + JSONiqTokenizer.MAP1[(c1 & 31) + JSONiqTokenizer.MAP1[c1 >> 5]]]; + } + else + { + if (c0 < 0xdc00) + { + var c1 = current < size ? input.charCodeAt(current) : 0; + if (c1 >= 0xdc00 && c1 < 0xe000) + { + ++current; + c0 = ((c0 & 0x3ff) << 10) + (c1 & 0x3ff) + 0x10000; + nonbmp = true; + } + } + var lo = 0, hi = 5; + for (var m = 3; ; m = (hi + lo) >> 1) + { + if (JSONiqTokenizer.MAP2[m] > c0) hi = m - 1; + else if (JSONiqTokenizer.MAP2[6 + m] < c0) lo = m + 1; + else {charclass = JSONiqTokenizer.MAP2[12 + m]; break;} + if (lo > hi) {charclass = 0; break;} + } + } + + state = code; + var i0 = (charclass << 12) + code - 1; + code = JSONiqTokenizer.TRANSITION[(i0 & 15) + JSONiqTokenizer.TRANSITION[i0 >> 4]]; + + if (code > 4095) + { + result = code; + code &= 4095; + end = current; + } + } + + result >>= 12; + if (result == 0) + { + end = current - 1; + var c1 = end < size ? input.charCodeAt(end) : 0; + if (c1 >= 0xdc00 && c1 < 0xe000) --end; + return error(begin, end, state, -1, -1); + } + + if (nonbmp) + { + for (var i = result >> 9; i > 0; --i) + { + --end; + var c1 = end < size ? input.charCodeAt(end) : 0; + if (c1 >= 0xdc00 && c1 < 0xe000) --end; + } + } + else + { + end -= result >> 9; + } + + return (result & 511) - 1; + } +} + +JSONiqTokenizer.getTokenSet = function(tokenSetId) +{ + var set = []; + var s = tokenSetId < 0 ? - tokenSetId : INITIAL[tokenSetId] & 4095; + for (var i = 0; i < 276; i += 32) + { + var j = i; + var i0 = (i >> 5) * 2062 + s - 1; + var i1 = i0 >> 2; + var i2 = i1 >> 2; + var f = JSONiqTokenizer.EXPECTED[(i0 & 3) + JSONiqTokenizer.EXPECTED[(i1 & 3) + JSONiqTokenizer.EXPECTED[(i2 & 3) + JSONiqTokenizer.EXPECTED[i2 >> 2]]]]; + for ( ; f != 0; f >>>= 1, ++j) + { + if ((f & 1) != 0) + { + set.push(JSONiqTokenizer.TOKEN[j]); + } + } + } + return set; +}; + +JSONiqTokenizer.MAP0 = +[ 66, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 27, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 32, 31, 31, 33, 31, 31, 31, 31, 31, 31, 34, 35, 36, 35, 31, 35, 37, 38, 39, 40, 41, 42, 43, 44, 45, 31, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 31, 61, 62, 63, 64, 35 +]; + +JSONiqTokenizer.MAP1 = +[ 108, 124, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 156, 181, 181, 181, 181, 181, 214, 215, 213, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 247, 261, 277, 293, 309, 347, 363, 379, 416, 416, 416, 408, 331, 323, 331, 323, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 433, 433, 433, 433, 433, 433, 433, 316, 331, 331, 331, 331, 331, 331, 331, 331, 394, 416, 416, 417, 415, 416, 416, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 330, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 416, 66, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 27, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 35, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 32, 31, 31, 33, 31, 31, 31, 31, 31, 31, 34, 35, 36, 35, 31, 35, 37, 38, 39, 40, 41, 42, 43, 44, 45, 31, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 31, 61, 62, 63, 64, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 31, 31, 35, 35, 35, 35, 35, 35, 35, 65, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65 +]; + +JSONiqTokenizer.MAP2 = +[ 57344, 63744, 64976, 65008, 65536, 983040, 63743, 64975, 65007, 65533, 983039, 1114111, 35, 31, 35, 31, 31, 35 +]; + +JSONiqTokenizer.INITIAL = +[ 1, 2, 36867, 45060, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 +]; + +JSONiqTokenizer.TRANSITION = +[ 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22874, 18847, 17152, 19027, 19252, 17687, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 17365, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 17470, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 18199, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 17890, 17922, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18065, 36544, 18632, 18081, 18098, 18114, 18159, 18185, 18215, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17756, 18816, 18429, 18445, 18143, 17393, 18500, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 18590, 21686, 17152, 19027, 19252, 17687, 19027, 28677, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 17365, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 17470, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 18199, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 17890, 17922, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18065, 36544, 18632, 18081, 18098, 18114, 18159, 18185, 18215, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17756, 18816, 18429, 18445, 18143, 17393, 18500, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 20083, 18847, 18648, 19027, 19252, 21242, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 18774, 18789, 18805, 19027, 19252, 17687, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 18832, 22889, 18925, 19027, 19252, 17569, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18956, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 19073, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 18972, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21818, 18847, 19006, 19027, 19252, 17687, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21671, 18847, 19006, 19027, 19252, 17687, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22395, 20098, 18731, 19027, 19252, 17687, 19027, 17173, 23525, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 18129, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 20746, 19130, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 19043, 18847, 18620, 19027, 19252, 17687, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 19100, 22410, 19006, 19027, 19252, 17687, 19027, 19084, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21967, 21982, 19006, 19027, 19252, 17687, 19027, 18701, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22380, 18847, 19006, 19027, 19252, 30659, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 19157, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 19299, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 19191, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21758, 18847, 19006, 19027, 19252, 17687, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 19237, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21626, 18847, 19006, 19027, 19252, 17687, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 19268, 19284, 19326, 18482, 27869, 30509, 24384, 31417, 23323, 18482, 19370, 18482, 18484, 27202, 19389, 27202, 27202, 19411, 24384, 34295, 24384, 24384, 25485, 18482, 18482, 18482, 18482, 18482, 25794, 27202, 27202, 27202, 27202, 28530, 19459, 24384, 24384, 24384, 24384, 24017, 18036, 24041, 18482, 18482, 18482, 18484, 19487, 27202, 27202, 27202, 27202, 19503, 35523, 19539, 24384, 24384, 24384, 19647, 18482, 35623, 18482, 18482, 23052, 27202, 19557, 27202, 27202, 30764, 23993, 24384, 19579, 24384, 24384, 26758, 18482, 18482, 19346, 27867, 27202, 27202, 19599, 17590, 23998, 24384, 24384, 19619, 25683, 18482, 18482, 28511, 27202, 27203, 23997, 19639, 19887, 28419, 18902, 18483, 19663, 27202, 24325, 35844, 19887, 30991, 19713, 19395, 19736, 22259, 19754, 22073, 19770, 35154, 19795, 19816, 19836, 19859, 25794, 34248, 24116, 19720, 19875, 30988, 23482, 30981, 28304, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21743, 18847, 19006, 19027, 19252, 17431, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22365, 18847, 19907, 19027, 19252, 17687, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21641, 18847, 19326, 18482, 27869, 30544, 24384, 29176, 21442, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 19935, 24384, 24384, 24384, 24384, 32316, 18482, 18482, 18482, 18482, 18482, 25794, 27202, 27202, 27202, 27202, 28530, 19965, 24384, 24384, 24384, 24384, 31473, 18475, 18482, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 27202, 19988, 24384, 24384, 24384, 24384, 24384, 33654, 18482, 18482, 18482, 18482, 23052, 27202, 27202, 27202, 27202, 29523, 29939, 24384, 24384, 24384, 24384, 26114, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 20017, 22934, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 35771, 20047, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 20068, 19058, 20158, 20367, 20884, 17944, 20276, 20853, 25651, 20604, 20460, 20185, 20209, 17189, 17208, 17281, 17675, 20232, 20273, 20295, 20338, 22456, 20777, 20600, 21329, 20635, 20365, 20937, 21207, 17292, 17421, 21157, 17192, 21217, 22425, 20279, 25549, 22436, 20276, 20383, 18983, 20421, 20446, 21317, 21051, 20476, 20322, 20663, 20490, 17543, 17559, 17585, 22463, 20540, 19523, 20246, 20556, 20257, 20430, 20585, 20620, 20193, 20651, 17661, 18368, 17703, 17730, 17772, 19513, 20679, 20692, 22446, 21027, 21097, 18990, 21111, 20708, 20736, 17744, 17795, 17874, 17590, 25536, 20349, 20762, 20812, 20169, 20828, 21376, 17714, 17976, 18021, 18560, 20844, 20569, 25560, 20869, 20900, 18114, 18159, 20916, 20953, 21013, 21043, 21067, 18281, 21083, 18574, 21127, 21143, 21181, 20515, 20930, 20883, 20504, 21197, 21233, 21258, 20524, 20216, 17405, 21270, 21286, 21302, 20720, 20310, 21345, 21361, 21392, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21952, 18847, 19006, 19027, 19252, 17687, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 21427, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 21479, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 36500, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 28667, 21921, 17617, 36472, 18265, 17237, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 21550, 21509, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 21535, 30636, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21773, 18847, 21587, 19027, 19252, 17687, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21611, 18847, 19006, 19027, 19252, 18169, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21728, 19115, 21878, 19027, 19252, 17687, 19027, 19310, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 17379, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 21906, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 18322, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21937, 18605, 19006, 19027, 19252, 22018, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21656, 21833, 19006, 19027, 19252, 17687, 19027, 21519, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22305, 18847, 22034, 18482, 27869, 25325, 24384, 29176, 22062, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 22096, 24384, 24384, 24384, 24384, 30621, 18482, 18482, 18482, 18482, 18482, 25794, 27202, 27202, 27202, 27202, 35010, 22148, 24384, 24384, 24384, 24384, 31473, 31659, 18482, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 27202, 19503, 24384, 24384, 24384, 24384, 24384, 32253, 18482, 18482, 18482, 18482, 23052, 27202, 27202, 27202, 27202, 30764, 21406, 24384, 24384, 24384, 24384, 26114, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 22171, 22934, 24384, 24384, 24384, 22228, 18482, 18482, 27202, 27202, 35771, 20047, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22305, 18847, 22034, 18482, 27869, 25325, 24384, 29176, 22062, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 22096, 24384, 24384, 24384, 24384, 30621, 18482, 18482, 18482, 18482, 18482, 25794, 27202, 27202, 27202, 27202, 35010, 22148, 24384, 24384, 24384, 24384, 31473, 31659, 18482, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 27202, 19503, 24384, 24384, 24384, 24384, 24384, 31154, 18482, 18482, 18482, 18482, 23052, 27202, 27202, 27202, 27202, 30764, 21406, 24384, 24384, 24384, 24384, 26114, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 22171, 22934, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 35771, 20047, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22305, 18847, 22034, 18482, 27869, 25325, 24384, 29176, 22062, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 22096, 24384, 24384, 24384, 24384, 31644, 18482, 18482, 18482, 18482, 18482, 25794, 27202, 27202, 27202, 27202, 35010, 22148, 24384, 24384, 24384, 24384, 31473, 31659, 18482, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 27202, 19503, 24384, 24384, 24384, 24384, 24384, 31154, 18482, 18482, 18482, 18482, 23052, 27202, 27202, 27202, 27202, 30764, 21406, 24384, 24384, 24384, 24384, 26114, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 22171, 22934, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 35771, 20047, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22305, 18847, 22034, 18482, 27869, 25325, 24384, 29176, 22062, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 22096, 24384, 24384, 24384, 24384, 30621, 18482, 18482, 18482, 18482, 18482, 25794, 27202, 27202, 27202, 27202, 35010, 22148, 24384, 24384, 24384, 24384, 33557, 31659, 18482, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 27202, 19503, 24384, 24384, 24384, 24384, 24384, 31154, 18482, 18482, 18482, 18482, 23052, 27202, 27202, 27202, 27202, 30764, 21406, 24384, 24384, 24384, 24384, 26114, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 22171, 22934, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 35771, 20047, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22305, 18847, 22034, 18482, 27869, 34068, 24384, 29176, 22062, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 22245, 24384, 24384, 24384, 24384, 30621, 18482, 18482, 18482, 18482, 18482, 25794, 27202, 27202, 27202, 27202, 35010, 22148, 24384, 24384, 24384, 24384, 31473, 31659, 18482, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 27202, 19503, 24384, 24384, 24384, 24384, 24384, 31154, 18482, 18482, 18482, 18482, 23052, 27202, 27202, 27202, 27202, 30764, 21406, 24384, 24384, 24384, 24384, 26114, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 22171, 22934, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 35771, 20047, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22305, 18847, 22034, 18482, 27869, 25325, 24384, 29176, 22062, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 22096, 24384, 24384, 24384, 24384, 18877, 18482, 18482, 18482, 18482, 18482, 25794, 27202, 27202, 27202, 27202, 35010, 22148, 24384, 24384, 24384, 24384, 24017, 31659, 18482, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 27202, 19503, 24384, 24384, 24384, 24384, 24384, 19647, 18482, 18482, 18482, 18482, 23052, 27202, 27202, 27202, 27202, 30764, 23993, 24384, 24384, 24384, 24384, 26758, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 17590, 23998, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 27203, 23997, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22290, 18847, 22034, 18482, 27869, 34957, 24384, 29176, 22062, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 22096, 24384, 24384, 24384, 24384, 18877, 18482, 18482, 18482, 18482, 18482, 25794, 27202, 27202, 27202, 27202, 35010, 22148, 24384, 24384, 24384, 24384, 24017, 31659, 18482, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 27202, 19503, 24384, 24384, 24384, 24384, 24384, 19647, 18482, 18482, 18482, 18482, 23052, 27202, 27202, 27202, 27202, 30764, 23993, 24384, 24384, 24384, 24384, 26758, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 17590, 23998, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 27203, 23997, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22305, 18847, 22034, 18482, 27869, 25325, 24384, 29176, 22062, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 22096, 24384, 24384, 24384, 24384, 18877, 18482, 18482, 18482, 18482, 18482, 25794, 27202, 27202, 27202, 27202, 35010, 22148, 24384, 24384, 24384, 24384, 24017, 31659, 18482, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 27202, 19503, 24384, 24384, 24384, 24384, 24384, 19647, 18482, 18482, 18482, 18482, 23052, 27202, 27202, 27202, 27202, 30764, 23993, 24384, 24384, 24384, 24384, 34436, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 17590, 23998, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 27203, 23997, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22320, 18847, 19006, 19027, 19252, 17687, 19027, 17173, 27077, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 19919, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21803, 18847, 19006, 19027, 19252, 17687, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22275, 22479, 19006, 19027, 19252, 17687, 19027, 19141, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 22510, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22574, 18847, 22954, 22970, 27597, 22986, 23002, 23033, 22062, 18482, 18482, 18482, 23049, 27202, 27202, 27202, 23068, 22096, 24384, 24384, 24384, 23088, 31359, 31082, 19693, 18482, 28112, 28225, 19443, 35045, 27202, 27202, 23108, 23139, 23155, 23178, 24384, 24384, 23212, 35330, 31659, 23228, 18482, 23256, 23274, 27795, 26712, 23293, 35214, 34879, 33340, 23312, 18235, 23359, 32708, 23949, 24384, 23380, 35255, 23429, 18482, 33884, 23408, 23448, 27202, 27202, 23498, 23518, 21406, 23541, 24384, 24384, 23570, 26114, 23601, 23623, 18482, 33444, 23651, 32875, 27202, 22171, 18862, 23702, 36589, 24384, 18481, 23731, 32601, 27202, 23750, 23768, 20047, 32969, 24367, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 23784, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 28217, 31795, 23804, 26925, 34916, 23831, 26501, 25793, 23859, 23895, 23482, 30981, 22080, 19438, 27956, 19678, 29812, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22589, 18847, 22034, 18482, 27869, 25325, 24384, 29176, 22062, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 22096, 24384, 24384, 24384, 24384, 30621, 18482, 18482, 18482, 18482, 28902, 25794, 27202, 27202, 27202, 34019, 23914, 22148, 24384, 24384, 24384, 28393, 23930, 31659, 18482, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 27202, 19503, 24384, 24384, 24384, 24384, 24384, 31154, 26591, 18482, 18482, 18482, 31585, 23965, 27202, 27202, 27202, 23986, 22185, 24014, 24384, 24384, 24384, 24033, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 22171, 22934, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 35771, 20047, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 34251, 26504, 24057, 24107, 24132, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22604, 18847, 22034, 19697, 27869, 24166, 24384, 24182, 24198, 26600, 18482, 18482, 18484, 24233, 24249, 27202, 27202, 22096, 24268, 24284, 24384, 24384, 30621, 19800, 35427, 35999, 32609, 18482, 25794, 24303, 28959, 23752, 27202, 35010, 22148, 24341, 32040, 26837, 24383, 31473, 31659, 18482, 18482, 18482, 24784, 18484, 27202, 27202, 27202, 27202, 24401, 19503, 24384, 24384, 24384, 24384, 20134, 31154, 18482, 18482, 18482, 27845, 23052, 27202, 27202, 33502, 27202, 30764, 21406, 24384, 24384, 22938, 24384, 26114, 18482, 36246, 18482, 27867, 27202, 24423, 27202, 22171, 22934, 24384, 24442, 24384, 36762, 28438, 18482, 34466, 34508, 35771, 24461, 24385, 24477, 25677, 18482, 36220, 27202, 27202, 24498, 30954, 23715, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 24521, 30990, 27868, 34251, 30090, 23343, 24546, 19856, 25793, 19779, 30988, 23482, 26152, 22080, 19438, 29824, 24562, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22619, 18847, 22034, 25767, 22132, 25325, 23162, 29176, 24597, 24091, 23607, 24656, 26122, 24680, 24426, 24696, 28551, 22096, 24731, 24445, 24747, 23364, 30621, 18482, 18482, 18482, 18482, 24781, 25794, 27202, 27202, 27202, 34210, 35010, 22148, 24384, 24384, 24384, 33259, 31473, 22525, 24087, 24213, 18482, 18482, 34908, 24800, 30419, 27202, 27202, 32418, 19503, 29781, 35065, 24384, 24384, 19891, 31154, 24835, 18482, 18482, 24854, 29214, 27202, 27202, 32006, 27202, 30764, 35344, 24384, 24384, 31544, 24384, 26114, 33098, 27814, 27002, 27867, 34668, 25625, 24871, 22171, 22934, 19214, 34531, 24889, 18481, 18482, 18482, 27202, 27202, 35771, 20047, 24385, 19887, 25677, 18482, 33615, 27202, 27202, 24907, 24930, 23554, 30991, 18484, 27202, 31802, 22199, 19466, 23052, 23296, 19847, 30877, 31015, 24955, 19859, 24983, 34248, 30871, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 24999, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22634, 18847, 25024, 25040, 31293, 25056, 25072, 25088, 22062, 34734, 24217, 36253, 34808, 32637, 25104, 23072, 32848, 22245, 36623, 25120, 30679, 27356, 30621, 25136, 26455, 25174, 25208, 22540, 23240, 25224, 25240, 25256, 25306, 25341, 25357, 25418, 25446, 25470, 26739, 25522, 31659, 23635, 25576, 27398, 25593, 28592, 25945, 25617, 27202, 32546, 27295, 25641, 25850, 25667, 24384, 34758, 25699, 25716, 22552, 27787, 30221, 25756, 25789, 25810, 25828, 28333, 28988, 30764, 21493, 33405, 25848, 25866, 25904, 26114, 31227, 26677, 30167, 27867, 25941, 25961, 27202, 22171, 22934, 25977, 25997, 24384, 23394, 27775, 25740, 25270, 26013, 26048, 26064, 26104, 26138, 26178, 26211, 26230, 26247, 30500, 26380, 26282, 28388, 30991, 33711, 27202, 33645, 26324, 36716, 26353, 26374, 35300, 30990, 26396, 26415, 30927, 26358, 33832, 26442, 26471, 26487, 26520, 23482, 33146, 26539, 26555, 27956, 31266, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22649, 18847, 26576, 26189, 26616, 25325, 26643, 29176, 22062, 26669, 18482, 18482, 18484, 26693, 27202, 27202, 27202, 22096, 26728, 24384, 24384, 24384, 30621, 18482, 18482, 18482, 18482, 26782, 25794, 27202, 27202, 27202, 26258, 35010, 22148, 24384, 24384, 24384, 21571, 31473, 31659, 18482, 18482, 33949, 18482, 18484, 27202, 27202, 25812, 27202, 27202, 19503, 24384, 24384, 24384, 26800, 24384, 31154, 18482, 18482, 18482, 35570, 23052, 27202, 27202, 27202, 26817, 30764, 21406, 24384, 24384, 24384, 26836, 26114, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 22171, 22934, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 35771, 20047, 24385, 19887, 25677, 31882, 18483, 35699, 27202, 19738, 26853, 19887, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 26913, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 24967, 31061, 19438, 26953, 27663, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22664, 18847, 26990, 18482, 27869, 25325, 24384, 29176, 22062, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 22096, 24384, 24384, 24384, 24384, 23017, 18482, 18482, 18482, 18482, 18482, 25794, 27202, 27202, 27202, 27202, 35010, 27024, 24384, 24384, 24384, 24384, 24017, 31659, 18482, 18482, 27047, 18482, 18484, 27202, 27202, 27331, 27202, 27202, 27066, 24384, 24384, 29025, 24384, 24384, 19647, 18482, 18482, 18482, 18482, 23052, 27202, 27202, 27202, 27202, 30764, 23993, 24384, 24384, 24384, 24384, 26758, 18482, 18482, 33957, 27867, 27202, 27202, 27093, 17590, 23998, 24384, 24384, 27114, 27135, 36322, 27153, 27201, 27219, 28359, 18229, 34780, 34405, 27235, 35972, 27268, 27293, 27311, 36040, 33984, 20980, 31851, 21453, 30535, 27347, 32520, 27372, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 26337, 30118, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22305, 18847, 22034, 27397, 27414, 27436, 27452, 27473, 22062, 18482, 18482, 30171, 18484, 27202, 27202, 27982, 27202, 22096, 24384, 24384, 25700, 24384, 18877, 18482, 18482, 18482, 18482, 18482, 34013, 27202, 27202, 27202, 27202, 29731, 22148, 24384, 24384, 24384, 24384, 27119, 31659, 27489, 18482, 18482, 18482, 18484, 27185, 27202, 27202, 27202, 27202, 19503, 27457, 24384, 24384, 24384, 24384, 19647, 18482, 18482, 18482, 27050, 23052, 27202, 27202, 27202, 32469, 30764, 23993, 24384, 24384, 24384, 34982, 26758, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 17590, 23998, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 27203, 23997, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 20796, 27202, 29362, 22110, 33940, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22679, 18847, 22034, 27508, 27528, 27553, 35182, 27569, 22062, 29693, 26300, 23258, 27585, 24715, 27613, 27202, 27648, 22096, 36597, 27698, 24384, 27733, 18877, 18482, 27811, 18482, 27830, 22046, 27865, 32194, 27202, 25158, 27885, 27913, 22148, 29458, 24384, 29977, 34392, 26750, 27763, 26889, 18482, 18482, 27252, 29886, 27929, 27202, 27202, 27202, 27981, 27998, 28024, 28045, 24384, 24384, 28062, 28081, 28128, 25506, 28145, 26088, 28160, 27202, 28173, 24640, 28189, 30764, 31496, 24384, 28205, 34154, 36166, 24939, 28241, 28259, 28283, 21463, 33034, 28320, 28349, 17590, 20967, 23092, 28375, 28409, 28095, 28435, 28454, 28474, 28509, 28527, 20001, 33682, 25879, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30272, 28267, 28546, 28567, 19425, 28583, 23052, 23296, 19847, 19471, 28608, 28653, 31075, 25794, 34248, 19856, 25793, 19779, 29644, 35950, 30318, 22080, 19438, 27956, 23123, 28693, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22305, 18847, 22034, 18482, 27869, 25325, 24384, 29176, 22062, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 22096, 24384, 24384, 24384, 24384, 18877, 18482, 18482, 18482, 18482, 18482, 25794, 27202, 27202, 27202, 27202, 35010, 22148, 24384, 24384, 24384, 24384, 24017, 22494, 18482, 18482, 18482, 18482, 18484, 25283, 27202, 27202, 27202, 27202, 19503, 29397, 24384, 24384, 24384, 24384, 19647, 18482, 18482, 18482, 18482, 23052, 27202, 27202, 27202, 27202, 30764, 23993, 24384, 24384, 24384, 24384, 26758, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 17590, 23998, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 27203, 23997, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22694, 18847, 28740, 28775, 28810, 28834, 28850, 28873, 28889, 24142, 28936, 31945, 36329, 25290, 28954, 27632, 28975, 29004, 24505, 29020, 25454, 29041, 23017, 27512, 29083, 29103, 30721, 18482, 23478, 29123, 24819, 27202, 29148, 28920, 27024, 29166, 23196, 24384, 29192, 35529, 31659, 18482, 18482, 25601, 32589, 29211, 27202, 27202, 31434, 30700, 29230, 27066, 24384, 24384, 24384, 29255, 29306, 19647, 18482, 33383, 18482, 18482, 23052, 27202, 29333, 27202, 27202, 30764, 23993, 35925, 24384, 24384, 24384, 27717, 36123, 18482, 18482, 29350, 29413, 27202, 35642, 17590, 21411, 29432, 24384, 25981, 18481, 33866, 18482, 27202, 26967, 27203, 23997, 32729, 19887, 25677, 18482, 26897, 27202, 27202, 29451, 23870, 24354, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 31737, 19859, 25794, 34248, 19856, 29474, 29539, 29283, 29581, 29637, 22080, 32533, 29501, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22709, 18847, 22034, 29660, 29512, 25325, 33242, 29176, 29682, 27245, 18482, 29709, 33286, 26974, 27202, 29725, 29747, 22096, 19221, 24384, 32702, 29772, 18877, 26784, 33892, 28458, 18482, 18482, 25794, 29797, 27202, 29840, 27202, 35010, 22148, 35817, 24384, 29859, 24384, 24017, 36756, 25192, 18482, 18482, 29879, 18484, 27202, 29902, 27202, 26032, 27202, 29925, 24384, 29960, 24384, 33594, 24384, 19647, 18482, 18482, 18482, 18482, 23052, 27202, 27202, 27202, 27202, 29239, 29993, 24384, 24384, 24384, 24384, 26758, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 17590, 23998, 24384, 24384, 24384, 31665, 18482, 18482, 19603, 27202, 27203, 23997, 30013, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 19949, 19466, 36661, 19563, 19847, 30029, 30128, 30062, 19859, 25794, 30078, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 30106, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22724, 18847, 30152, 30187, 30237, 30288, 30304, 30344, 22062, 35616, 32797, 25773, 18484, 29909, 34096, 26820, 27202, 22096, 24914, 23189, 29195, 24384, 18877, 34444, 30360, 18482, 18482, 18482, 23413, 24707, 27202, 27202, 27202, 35010, 30378, 34990, 24384, 24384, 24384, 24017, 29554, 18482, 18482, 27137, 18482, 31281, 30394, 27202, 27202, 30413, 30566, 19503, 30435, 24384, 24384, 29969, 35678, 19647, 28759, 30455, 35459, 35606, 23052, 28724, 30490, 30525, 30560, 30764, 23993, 20123, 30582, 30606, 30675, 26291, 33426, 28938, 27682, 30695, 23675, 33466, 28493, 17590, 23944, 20405, 34338, 20997, 32331, 26308, 30716, 30737, 24315, 30756, 21563, 36372, 30787, 26653, 24611, 33177, 32448, 30814, 31804, 25430, 25917, 26523, 18484, 28818, 31802, 29269, 19466, 28297, 34240, 23815, 26076, 30842, 30858, 32115, 30893, 30915, 32757, 25793, 30943, 30988, 23482, 30981, 30970, 31007, 27956, 19678, 29489, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22739, 18847, 31031, 31047, 32397, 31098, 31114, 31170, 22062, 18482, 29565, 35577, 36725, 27202, 33216, 31186, 24407, 22096, 24384, 20142, 31202, 34301, 27748, 31218, 33388, 27166, 18482, 29087, 27277, 27202, 31251, 31309, 27202, 31328, 31344, 24384, 31375, 31391, 24384, 31410, 31659, 18482, 36130, 32801, 18482, 18484, 27202, 27202, 31433, 31450, 27202, 19503, 24384, 24384, 31470, 33588, 24384, 32977, 18482, 18482, 18482, 18482, 30038, 27202, 27202, 27202, 27202, 31489, 32244, 24384, 24384, 24384, 24384, 31512, 18482, 28755, 18482, 24634, 35732, 27202, 27202, 28637, 31538, 35788, 24384, 24384, 19337, 31986, 18482, 33208, 25316, 27203, 29997, 29863, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 31560, 19887, 31601, 32369, 33316, 30136, 31629, 19972, 31681, 31726, 31753, 31781, 30046, 31820, 31847, 25794, 34282, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 31867, 30252, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22754, 18847, 22034, 18909, 30474, 31902, 24287, 31918, 31934, 32767, 35262, 27008, 29621, 34103, 19820, 29416, 33323, 22096, 27031, 30439, 29435, 28857, 29596, 18482, 18482, 18482, 31961, 18482, 25794, 27202, 27202, 35038, 27202, 35010, 22148, 24384, 24384, 29389, 24384, 24017, 31979, 18482, 26937, 18482, 18482, 18484, 27202, 31454, 32002, 27202, 27202, 32022, 24384, 33015, 32056, 24384, 24384, 33690, 18482, 18482, 33119, 18482, 23052, 27202, 27202, 27624, 27202, 29756, 32078, 24384, 24384, 34332, 24384, 26758, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 36691, 23998, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 27203, 23997, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 31710, 22155, 33181, 24252, 32103, 30990, 27868, 34251, 19859, 25794, 34248, 30265, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22305, 18847, 32138, 32166, 32186, 30826, 33252, 29067, 22062, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 22096, 24384, 24384, 24384, 24384, 23585, 18482, 18482, 18482, 18482, 18482, 25794, 27202, 27202, 27202, 27202, 35010, 32210, 24384, 24384, 24384, 24384, 24017, 31659, 18482, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 27202, 32233, 24384, 24384, 24384, 24384, 24384, 19647, 18482, 18482, 18482, 18482, 23052, 27202, 27202, 27202, 27202, 30764, 23993, 24384, 24384, 24384, 24384, 26758, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 17590, 23998, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 27203, 23997, 24385, 19887, 25677, 33857, 18483, 36057, 27202, 19738, 35289, 19887, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22769, 18847, 32269, 31613, 34604, 32285, 32301, 32351, 22062, 18482, 32367, 19354, 32385, 27202, 32413, 27098, 32434, 22096, 24384, 32485, 20052, 32506, 18877, 25396, 23734, 18482, 18482, 32562, 32625, 27202, 32653, 27202, 23664, 32673, 32689, 24384, 32724, 24384, 25888, 32745, 34706, 18482, 27381, 32783, 24577, 24838, 32817, 24873, 32838, 32864, 27202, 32899, 32934, 24384, 32957, 29317, 24384, 30798, 26214, 27678, 33875, 18482, 23052, 36352, 27202, 32993, 27202, 30764, 23993, 32087, 24384, 33013, 24384, 35853, 18482, 18482, 30362, 27965, 27202, 27202, 33754, 17590, 20112, 24384, 24384, 34576, 20792, 18482, 18482, 33031, 27202, 27203, 36159, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 19425, 34554, 24150, 33050, 33080, 33114, 27868, 34251, 23843, 26560, 31696, 19856, 25793, 19779, 30988, 23482, 30981, 33135, 22123, 27956, 23463, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22784, 18847, 33162, 28106, 33197, 25325, 33232, 29176, 22062, 33275, 35433, 18482, 18484, 33302, 26399, 33339, 27202, 22096, 33356, 28065, 33404, 24384, 18877, 22229, 18482, 33421, 18482, 18482, 33442, 33460, 24811, 27202, 27202, 26627, 22148, 24758, 35190, 24384, 24384, 25925, 29611, 18482, 18482, 29290, 25186, 33482, 33501, 27202, 27202, 33518, 36276, 19503, 33554, 24384, 24384, 33573, 32490, 19647, 18482, 18482, 31235, 33610, 23052, 27202, 27202, 33631, 27202, 30764, 23993, 24384, 24384, 33670, 24384, 26862, 27492, 18482, 33706, 27867, 32883, 34639, 27202, 17590, 32036, 24765, 23788, 24384, 18481, 18482, 18482, 27202, 27202, 27203, 33727, 36097, 19887, 25677, 18482, 23334, 27202, 29150, 19738, 23870, 35357, 30328, 18484, 33748, 34675, 33770, 19466, 34050, 33824, 31831, 30990, 27868, 34251, 33848, 28913, 33908, 19856, 30469, 33973, 25385, 36033, 34000, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22799, 18847, 34035, 32576, 34084, 34119, 34135, 34170, 34186, 32150, 36005, 31522, 31886, 34202, 34226, 34267, 29334, 34317, 34354, 34378, 34421, 26801, 18877, 26195, 29666, 25402, 18482, 35091, 25794, 34460, 34482, 34504, 25832, 35010, 22148, 34524, 34547, 34570, 19623, 24017, 36654, 35111, 24664, 18482, 32335, 34592, 31312, 34620, 34636, 27202, 34655, 34691, 28046, 34750, 34774, 24384, 33785, 19647, 34796, 32170, 34844, 24581, 33485, 26704, 34828, 34860, 35493, 29132, 36704, 33800, 35368, 32941, 34146, 26758, 34895, 18482, 18482, 34932, 34948, 27202, 32997, 17590, 29944, 34973, 24384, 36296, 25500, 30202, 35875, 35006, 35026, 26266, 20396, 31146, 35061, 35081, 35127, 24623, 28484, 27897, 19738, 35143, 35170, 26162, 28794, 35206, 35230, 33064, 35245, 23052, 23296, 29054, 30990, 27868, 34251, 19859, 25794, 34248, 24530, 25147, 35278, 31765, 35316, 33370, 22080, 19438, 27956, 24072, 28623, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22814, 18847, 22034, 34720, 34059, 35384, 20989, 35400, 35416, 35449, 18482, 18482, 23432, 35475, 27202, 27202, 27202, 35509, 31127, 24384, 24384, 24384, 35545, 18482, 26871, 35101, 35593, 24855, 25794, 30397, 23502, 26024, 35639, 35658, 22148, 19541, 19583, 30590, 35674, 27709, 35560, 29107, 18482, 18482, 18482, 18484, 27202, 35694, 27202, 27202, 27202, 35715, 24384, 36580, 24384, 24384, 24384, 19647, 30215, 18482, 18482, 18482, 23052, 35731, 27202, 27202, 27202, 27537, 22904, 24384, 24384, 24384, 24384, 23879, 35748, 18482, 18482, 25008, 35770, 27202, 27202, 17590, 20031, 35787, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 27203, 23997, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 23898, 18484, 34488, 31802, 25371, 19466, 23052, 23296, 26426, 30990, 27868, 34251, 19859, 25794, 35804, 19856, 27178, 35833, 33092, 23482, 30981, 22080, 22212, 28705, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22829, 18847, 22034, 35869, 28716, 25325, 31137, 29176, 22062, 26766, 18482, 22558, 18484, 23970, 27202, 29843, 27202, 22096, 33732, 24384, 31394, 24384, 18877, 18482, 18482, 26880, 18482, 18482, 25794, 27202, 30740, 27202, 27202, 35010, 22148, 24384, 24891, 24384, 24384, 24017, 31659, 18482, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 27202, 19503, 24384, 24384, 24384, 24384, 24384, 19647, 18482, 18482, 18482, 18482, 23052, 27202, 27202, 27202, 27202, 30764, 23993, 24384, 24384, 24384, 24384, 26758, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 17590, 23998, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 27203, 23997, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22844, 18847, 22034, 27849, 27869, 35891, 24384, 35907, 22062, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 22096, 24384, 24384, 24384, 24384, 18877, 18482, 18482, 18482, 18482, 18482, 25794, 27202, 27202, 27202, 27202, 35010, 22148, 24384, 24384, 24384, 24384, 24017, 31575, 18482, 18482, 18482, 18482, 26231, 27202, 27202, 27202, 27202, 27202, 19503, 35923, 24384, 24384, 24384, 24384, 19647, 18482, 28129, 18482, 18482, 35941, 27202, 32822, 27202, 32657, 30764, 23993, 24384, 32217, 24384, 32062, 26758, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 17590, 23998, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 27203, 23997, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22859, 18847, 22034, 35966, 34820, 25325, 33931, 29176, 35988, 18482, 23277, 18482, 36021, 27202, 27202, 36056, 36073, 22096, 24384, 24384, 36096, 33921, 18877, 18482, 18482, 18482, 18482, 18482, 25794, 27202, 27202, 27202, 27202, 35010, 22148, 24384, 24384, 24384, 24384, 24017, 36113, 18482, 25577, 18482, 18482, 18484, 27202, 27202, 27324, 27202, 27202, 36146, 24384, 24384, 34362, 24384, 24384, 19647, 28243, 18482, 18482, 18482, 23052, 30899, 27202, 27202, 27202, 23686, 23993, 33808, 24384, 24384, 24384, 26758, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 17590, 23998, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 27203, 23997, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22305, 18847, 22034, 19373, 27869, 36182, 24384, 36198, 22062, 18482, 18482, 18482, 18049, 27202, 27202, 27202, 35485, 22096, 24384, 24384, 24384, 29371, 18877, 18482, 36214, 18482, 28788, 18482, 25794, 34872, 27202, 27420, 27202, 35010, 22148, 29380, 24384, 24482, 24384, 24017, 31659, 18482, 36236, 18482, 18482, 18484, 27202, 36080, 27202, 27202, 27202, 19503, 24384, 28029, 24384, 24384, 24384, 19647, 18482, 18482, 32122, 18482, 35754, 27202, 27202, 36269, 27202, 33531, 23993, 24384, 24384, 36292, 24384, 36312, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 17590, 23998, 24384, 24384, 24384, 25730, 18482, 18482, 36345, 27202, 27203, 19203, 24385, 19887, 25677, 31963, 18483, 27202, 32462, 19738, 23870, 36368, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22350, 18847, 36388, 19027, 19252, 17687, 36433, 17173, 17595, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 36452, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 17682, 21701, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22335, 18847, 19006, 19027, 19252, 17687, 19027, 21712, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21788, 18847, 36488, 19027, 19252, 17687, 19027, 17173, 17779, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17810, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21165, 21997, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21803, 18847, 19006, 19027, 19252, 17687, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 36516, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21803, 18847, 19326, 18482, 27869, 30764, 24384, 29176, 28008, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 36566, 24384, 24384, 24384, 24384, 22919, 18482, 18482, 18482, 18482, 18482, 25794, 27202, 27202, 27202, 27202, 28530, 36613, 24384, 24384, 24384, 24384, 24017, 18892, 18482, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 27202, 19503, 24384, 24384, 24384, 24384, 24384, 19647, 18482, 18482, 18482, 18482, 23052, 27202, 27202, 27202, 27202, 30764, 23993, 24384, 24384, 24384, 24384, 26758, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 17590, 23998, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 27203, 23997, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 36639, 36677, 18731, 19027, 19252, 17687, 19027, 17454, 17595, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17223, 17308, 17327, 17346, 18937, 36741, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 17682, 21701, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 0, 94242, 0, 118820, 0, 2211840, 102439, 0, 0, 106538, 98347, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2482176, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 2207744, 2404352, 2412544, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 3104768, 2605056, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2678784, 2207744, 2695168, 2207744, 2703360, 2207744, 2711552, 2752512, 2207744, 0, 0, 0, 0, 0, 0, 2166784, 0, 0, 0, 0, 0, 0, 2158592, 2158592, 3170304, 3174400, 2158592, 0, 139, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 2424832, 2158592, 2158592, 2158592, 2748416, 2756608, 2777088, 2801664, 2158592, 2158592, 2158592, 2863104, 2891776, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 3104768, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2207744, 2785280, 2207744, 2809856, 2207744, 2207744, 2842624, 2207744, 2207744, 2207744, 2899968, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2564096, 2207744, 2207744, 2207744, 2158592, 2404352, 2412544, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2564096, 2158592, 2158592, 2605056, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2678784, 2158592, 2695168, 2158592, 2703360, 2158592, 2711552, 2752512, 2158592, 2158592, 2785280, 2158592, 2158592, 2785280, 2158592, 2809856, 2158592, 2158592, 2842624, 2158592, 2158592, 2158592, 2899968, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 18, 0, 0, 0, 0, 0, 0, 0, 2211840, 0, 0, 641, 0, 2158592, 0, 0, 0, 0, 0, 0, 0, 0, 2211840, 0, 0, 32768, 0, 2158592, 0, 2158592, 2158592, 2158592, 2383872, 2158592, 2158592, 2158592, 2158592, 3006464, 2383872, 2207744, 2207744, 2207744, 2207744, 2158877, 2158877, 2158877, 2158877, 0, 0, 0, 2158877, 2572573, 2158877, 2158877, 0, 2207744, 2207744, 2596864, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2641920, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 0, 0, 0, 0, 0, 0, 2162968, 0, 0, 3104768, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 0, 0, 0, 2146304, 2146304, 2224128, 2224128, 2232320, 2232320, 2232320, 641, 0, 0, 0, 0, 0, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2531328, 2158592, 2158592, 2158592, 2158592, 2158592, 2617344, 2158592, 2158592, 2158592, 2158592, 2441216, 2445312, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2502656, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2580480, 2158592, 2158592, 2158592, 2158592, 2621440, 2158592, 2580480, 2158592, 2158592, 2158592, 2158592, 2621440, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2699264, 2158592, 2158592, 2158592, 2158592, 2158592, 2748416, 2756608, 2777088, 2801664, 2207744, 2863104, 2891776, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 3018752, 2207744, 3043328, 2207744, 2207744, 2207744, 2207744, 3080192, 2207744, 2207744, 3112960, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 0, 0, 0, 167936, 0, 0, 2162688, 0, 0, 2207744, 2207744, 2207744, 3186688, 2207744, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2158592, 2158592, 2158592, 2404352, 2412544, 2158592, 2510848, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2584576, 2158592, 2609152, 2158592, 2158592, 2629632, 2158592, 2158592, 2158592, 2686976, 2158592, 2715648, 2158592, 2158592, 3121152, 2158592, 2158592, 2158592, 3149824, 2158592, 2158592, 3170304, 3174400, 2158592, 2367488, 2207744, 2207744, 2207744, 2207744, 2158592, 2158592, 2158592, 2158592, 0, 0, 0, 2158592, 2572288, 2158592, 2158592, 0, 2207744, 2207744, 2207744, 2433024, 2207744, 2453504, 2461696, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2510848, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 3096576, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 0, 0, 0, 0, 0, 0, 2162688, 0, 0, 2715648, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2867200, 2207744, 2904064, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2473984, 2207744, 2207744, 2494464, 2207744, 2207744, 2207744, 2523136, 2207744, 2207744, 2207744, 2207744, 3014656, 2207744, 2207744, 3051520, 2207744, 2207744, 3100672, 2207744, 2207744, 3121152, 2207744, 2207744, 2207744, 2207744, 2207744, 2531328, 2207744, 2207744, 2207744, 2207744, 2207744, 2617344, 2207744, 2207744, 2207744, 2207744, 2158592, 2158592, 2158592, 2158592, 0, 0, 0, 2158592, 2572288, 2158592, 2158592, 1508, 2207744, 3149824, 2207744, 2207744, 3170304, 3174400, 2207744, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 138, 2158592, 2158592, 2158592, 2404352, 2412544, 2707456, 2732032, 2207744, 2207744, 2207744, 2822144, 2826240, 2207744, 2895872, 2207744, 2207744, 2924544, 2207744, 2207744, 2973696, 2207744, 0, 0, 0, 0, 0, 0, 2166784, 0, 0, 0, 0, 0, 285, 2158592, 2158592, 3112960, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 3186688, 2158592, 2207744, 2207744, 2158592, 2158592, 2158592, 2158592, 2158592, 0, 0, 0, 2158592, 2158592, 2158592, 2158592, 0, 0, 2535424, 2543616, 2158592, 2158592, 2158592, 0, 0, 0, 2158592, 2158592, 2158592, 2990080, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2572288, 2981888, 2207744, 2207744, 3002368, 2207744, 3047424, 3063808, 3076096, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 3203072, 2708960, 2732032, 2158592, 2158592, 2158592, 2822144, 2827748, 2158592, 2895872, 2158592, 2158592, 2924544, 2158592, 2158592, 2973696, 2158592, 2981888, 2158592, 2158592, 3002368, 2158592, 3047424, 3063808, 3076096, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 3203072, 2981888, 2158592, 2158592, 3003876, 2158592, 3047424, 3063808, 3076096, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 3203072, 2207744, 2207744, 2207744, 2207744, 2207744, 2424832, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 0, 0, 0, 172310, 279, 0, 2162688, 0, 0, 2523136, 2527232, 2158592, 2158592, 2576384, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2908160, 2527232, 2207744, 2207744, 2576384, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2908160, 2207744, 0, 0, 0, 0, 0, 0, 2166784, 0, 0, 0, 0, 0, 286, 2158592, 2158592, 0, 0, 2158592, 2158592, 2158592, 2158592, 2633728, 2658304, 0, 0, 2740224, 2744320, 0, 2834432, 2207744, 2207744, 2977792, 2207744, 2207744, 2207744, 2207744, 3039232, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 3158016, 0, 0, 29315, 0, 0, 0, 0, 45, 45, 45, 45, 45, 933, 45, 45, 45, 45, 442, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 2494464, 2158592, 2158592, 2158592, 2524757, 2527232, 2158592, 2158592, 2576384, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 1504, 2158592, 2498560, 2158592, 2158592, 2158592, 2158592, 2568192, 2158592, 2592768, 2625536, 2158592, 2158592, 2674688, 2736128, 2158592, 2158592, 0, 2158592, 2912256, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 3108864, 2158592, 2158592, 3133440, 3145728, 3153920, 2375680, 2379776, 2207744, 2207744, 2420736, 2207744, 2449408, 2207744, 2207744, 2207744, 2498560, 2207744, 2207744, 2207744, 2207744, 2568192, 2207744, 0, 0, 0, 0, 0, 0, 2166784, 0, 0, 0, 0, 0, 551, 2158592, 2158592, 2158592, 2158592, 2207744, 2506752, 2207744, 2207744, 2207744, 2207744, 2207744, 2158592, 2506752, 0, 2020, 2158592, 2592768, 2625536, 2207744, 2207744, 2674688, 2736128, 2207744, 2207744, 2207744, 2912256, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 20480, 0, 0, 0, 0, 0, 2162688, 20480, 0, 2207744, 3108864, 2207744, 2207744, 3133440, 3145728, 3153920, 2375680, 2379776, 2158592, 2158592, 2420736, 2158592, 2449408, 2158592, 2158592, 2158592, 2158592, 2158592, 3186688, 2158592, 0, 641, 0, 0, 0, 0, 0, 0, 2367488, 2158592, 2498560, 2158592, 2158592, 1621, 2158592, 2158592, 2568192, 2158592, 2592768, 2625536, 2158592, 2158592, 2674688, 0, 0, 0, 0, 0, 1608, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1107, 97, 97, 1110, 97, 97, 3133440, 3145728, 3153920, 2158592, 2408448, 2416640, 2158592, 2465792, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 3014656, 2158592, 2158592, 3051520, 2158592, 2158592, 3100672, 2158592, 2158592, 3121152, 2158592, 2158592, 2158592, 3149824, 2416640, 2207744, 2465792, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2633728, 2658304, 2740224, 2744320, 2834432, 2949120, 2158592, 2985984, 2158592, 2998272, 2158592, 2158592, 2158592, 3129344, 2207744, 2408448, 2949120, 2207744, 2985984, 2207744, 2998272, 2207744, 2207744, 2207744, 3129344, 2158592, 2408448, 2416640, 2158592, 2465792, 2158592, 2158592, 2158592, 2158592, 2158592, 3186688, 2158592, 0, 32768, 0, 0, 0, 0, 0, 0, 2367488, 2949120, 2158592, 2985984, 2158592, 2998272, 2158592, 2158592, 2158592, 3129344, 2158592, 2158592, 2478080, 2158592, 2158592, 2158592, 2535424, 2543616, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 3117056, 2207744, 2207744, 2478080, 2207744, 2207744, 2207744, 2207744, 2207744, 2584576, 2207744, 2609152, 2207744, 2207744, 2629632, 2207744, 2207744, 2207744, 2686976, 2207744, 2207744, 2535424, 2543616, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 3117056, 2158592, 2158592, 2478080, 2207744, 2207744, 2990080, 2207744, 2207744, 2158592, 2158592, 2482176, 2158592, 2158592, 0, 0, 0, 2158592, 2158592, 2158592, 0, 2158592, 2908160, 2158592, 2158592, 2158592, 2977792, 2158592, 2158592, 2158592, 2158592, 3039232, 2158592, 2158592, 3010560, 2207744, 2428928, 2207744, 2514944, 2207744, 2588672, 2207744, 2838528, 2207744, 2207744, 2207744, 3010560, 2158592, 2428928, 2158592, 2514944, 0, 0, 2158592, 2588672, 2158592, 0, 2838528, 2158592, 2158592, 2158592, 3010560, 2158592, 2506752, 2158592, 18, 0, 0, 0, 0, 0, 0, 0, 2211840, 0, 0, 0, 0, 2158592, 0, 0, 29315, 922, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 3006464, 2383872, 0, 2020, 2158592, 2158592, 2158592, 2158592, 3006464, 2158592, 2637824, 2953216, 2158592, 2207744, 2637824, 2953216, 2207744, 0, 0, 2158592, 2637824, 2953216, 2158592, 2539520, 2158592, 2539520, 2207744, 0, 0, 2539520, 2158592, 2158592, 2158592, 2158592, 2207744, 2506752, 2207744, 2207744, 2207744, 2207744, 2207744, 2158592, 2506752, 0, 0, 2158592, 2207744, 0, 2158592, 2158592, 2207744, 0, 2158592, 2158592, 2207744, 0, 2158592, 2965504, 2965504, 2965504, 0, 0, 0, 0, 0, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2474269, 2158877, 2158877, 0, 0, 2158877, 2158877, 2158877, 2158877, 2634013, 2658589, 0, 0, 2740509, 2744605, 0, 2834717, 40976, 18, 36884, 45078, 24, 28, 90143, 94242, 118820, 102439, 106538, 98347, 118820, 118820, 118820, 40976, 18, 18, 36884, 0, 0, 0, 24, 24, 24, 27, 27, 27, 27, 90143, 0, 0, 86016, 0, 0, 2211840, 102439, 0, 0, 0, 98347, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 3158016, 0, 2375680, 2379776, 2158592, 2158592, 2420736, 2158592, 2449408, 2158592, 2158592, 0, 94242, 0, 0, 0, 2211840, 102439, 0, 0, 106538, 98347, 135, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2564096, 2158592, 2158592, 2158592, 2158592, 2158592, 2596864, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2641920, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2781184, 2793472, 2494464, 2158592, 2158592, 2158592, 2523136, 2527232, 2158592, 2158592, 2576384, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 0, 40976, 0, 18, 18, 24, 0, 27, 27, 0, 2158592, 2498560, 2158592, 2158592, 0, 2158592, 2158592, 2568192, 2158592, 2592768, 2625536, 2158592, 2158592, 2674688, 0, 0, 0, 0, 0, 2211840, 0, 0, 0, 0, 0, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2473984, 2158592, 2158592, 2494464, 2158592, 2158592, 2158592, 3006464, 2383872, 0, 0, 2158592, 2158592, 2158592, 2158592, 3006464, 2158592, 2637824, 2953216, 2158592, 2207744, 2637824, 2953216, 40976, 18, 36884, 45078, 24, 27, 147488, 94242, 147456, 147488, 106538, 98347, 0, 0, 147456, 40976, 18, 18, 36884, 0, 45078, 0, 24, 24, 24, 27, 27, 27, 27, 0, 81920, 0, 94242, 0, 0, 0, 2211840, 0, 0, 0, 106538, 98347, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2428928, 2158592, 2514944, 2158592, 2588672, 2158592, 2838528, 2158592, 2158592, 40976, 18, 151573, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 0, 40976, 18, 18, 36884, 0, 45078, 0, 24, 24, 24, 27, 27, 27, 27, 90143, 0, 0, 1315, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1487, 97, 18, 131427, 0, 0, 0, 0, 0, 0, 362, 0, 0, 365, 29315, 367, 0, 0, 29315, 0, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1663, 45, 45, 45, 45, 45, 45, 45, 45, 45, 183, 45, 45, 45, 45, 201, 45, 130, 94242, 0, 0, 0, 2211840, 102439, 0, 0, 106538, 98347, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 3096576, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2207744, 2207744, 2158592, 18, 0, 0, 0, 0, 0, 0, 0, 2211840, 0, 0, 0, 0, 2158592, 644, 2207744, 2207744, 2207744, 3186688, 2207744, 0, 1080, 0, 1084, 0, 1088, 0, 0, 0, 0, 0, 0, 0, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2531466, 2158730, 2158730, 2158730, 2158730, 2158730, 2617482, 0, 94242, 0, 0, 0, 2211840, 102439, 0, 0, 106538, 98347, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 2781184, 2793472, 2158592, 2818048, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 40976, 18, 36884, 45078, 24, 27, 90143, 159779, 159744, 102439, 159779, 98347, 0, 0, 159744, 40976, 18, 18, 36884, 0, 45078, 0, 2224253, 172032, 2224253, 2232448, 2232448, 172032, 2232448, 90143, 0, 0, 2170880, 0, 0, 550, 829, 2158592, 2158592, 2158592, 2387968, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 0, 40976, 0, 18, 18, 124, 124, 127, 127, 127, 40976, 18, 36884, 45078, 25, 29, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 163931, 40976, 18, 18, 36884, 0, 45078, 249856, 24, 24, 24, 27, 27, 27, 27, 90143, 0, 0, 2170880, 0, 0, 827, 0, 2158592, 2158592, 2158592, 2387968, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 0, 40976, 0, 4243810, 4243810, 24, 24, 27, 27, 27, 2207744, 0, 0, 0, 0, 0, 0, 2166784, 0, 0, 0, 0, 57344, 286, 2158592, 2158592, 2158592, 2158592, 2707456, 2732032, 2158592, 2158592, 2158592, 2822144, 2826240, 2158592, 2895872, 2158592, 2158592, 2924544, 2158592, 2158592, 2973696, 2158592, 2207744, 2207744, 2207744, 3186688, 2207744, 0, 0, 0, 0, 0, 0, 53248, 0, 0, 0, 0, 0, 97, 97, 97, 97, 97, 1613, 97, 97, 97, 97, 97, 97, 1495, 97, 97, 97, 97, 97, 97, 97, 97, 97, 566, 97, 97, 97, 97, 97, 97, 2207744, 0, 0, 0, 0, 0, 0, 2166784, 546, 0, 0, 0, 0, 286, 2158592, 2158592, 2158592, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 17, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 20480, 120, 121, 18, 18, 36884, 0, 45078, 0, 24, 24, 24, 27, 27, 27, 27, 90143, 0, 0, 2170880, 0, 53248, 550, 0, 2158592, 2158592, 2158592, 2387968, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 0, 40976, 196608, 18, 266240, 24, 24, 27, 27, 27, 0, 94242, 0, 0, 0, 38, 102439, 0, 0, 106538, 98347, 0, 45, 45, 45, 45, 45, 45, 45, 1535, 45, 45, 45, 45, 45, 45, 45, 1416, 45, 45, 45, 45, 45, 45, 45, 45, 424, 45, 45, 45, 45, 45, 45, 45, 45, 45, 405, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 199, 45, 45, 67, 67, 67, 67, 67, 491, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1766, 67, 67, 67, 1767, 67, 24850, 24850, 12564, 12564, 0, 0, 2166784, 546, 0, 53531, 53531, 0, 286, 97, 97, 0, 0, 97, 97, 97, 97, 97, 97, 0, 0, 97, 97, 0, 97, 97, 97, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 743, 57889, 0, 2170880, 0, 0, 550, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 45, 45, 1856, 45, 1858, 1859, 67, 67, 67, 1009, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1021, 67, 67, 67, 67, 67, 25398, 0, 13112, 0, 54074, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2367773, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2699549, 2158877, 2158877, 2158877, 2158877, 2158877, 2748701, 2756893, 2777373, 2801949, 97, 1115, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 857, 97, 67, 67, 67, 67, 67, 1258, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1826, 67, 97, 97, 97, 97, 97, 97, 1338, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 870, 97, 97, 67, 67, 67, 1463, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1579, 67, 67, 97, 97, 97, 1518, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 904, 905, 97, 97, 97, 97, 1620, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 921, 0, 0, 0, 0, 0, 0, 45, 1679, 67, 67, 67, 1682, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1690, 67, 0, 0, 97, 97, 97, 97, 45, 45, 67, 67, 0, 0, 97, 97, 45, 45, 45, 669, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 189, 45, 45, 45, 1748, 45, 45, 45, 1749, 1750, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 1959, 67, 67, 67, 67, 1768, 67, 67, 67, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1791, 97, 97, 97, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 1802, 67, 1817, 67, 67, 67, 67, 67, 67, 1823, 67, 67, 67, 67, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 0, 97, 97, 97, 97, 1848, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 659, 45, 45, 45, 45, 45, 45, 45, 1863, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 495, 67, 67, 67, 67, 67, 1878, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 0, 0, 97, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 97, 97, 97, 97, 0, 0, 0, 1973, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1165, 97, 1167, 0, 94242, 0, 0, 0, 2211840, 102439, 0, 0, 106538, 98347, 136, 2158592, 2158592, 2158592, 2158592, 2158592, 3158016, 229376, 2375680, 2379776, 2158592, 2158592, 2420736, 2158592, 2449408, 2158592, 2158592, 67, 24850, 24850, 12564, 12564, 0, 0, 280, 547, 0, 53531, 53531, 0, 286, 97, 97, 0, 0, 97, 97, 97, 97, 97, 97, 0, 0, 97, 97, 1789, 97, 57889, 547, 547, 0, 0, 550, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 45, 45, 45, 1799, 45, 45, 45, 67, 67, 67, 67, 67, 25398, 0, 13112, 0, 54074, 0, 0, 1092, 0, 0, 0, 0, 0, 97, 97, 97, 97, 1612, 97, 97, 97, 97, 1616, 97, 1297, 1472, 0, 0, 0, 0, 1303, 1474, 0, 0, 0, 0, 1309, 1476, 0, 0, 0, 0, 97, 97, 97, 1481, 97, 97, 97, 97, 97, 97, 1488, 97, 0, 1474, 0, 1476, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 607, 97, 97, 97, 97, 40976, 18, 36884, 45078, 26, 30, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 213080, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 143448, 40976, 18, 18, 36884, 0, 45078, 0, 24, 24, 24, 27, 27, 27, 27, 0, 0, 0, 0, 97, 97, 97, 97, 1482, 97, 1483, 97, 97, 97, 97, 97, 97, 1326, 97, 97, 1329, 1330, 97, 97, 97, 97, 97, 97, 1159, 1160, 97, 97, 97, 97, 97, 97, 97, 97, 590, 97, 97, 97, 97, 97, 97, 97, 0, 94242, 0, 0, 0, 2211974, 102439, 0, 0, 106538, 98347, 0, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2474122, 2158730, 2158730, 2494602, 2158730, 2158730, 2158730, 2809994, 2158730, 2158730, 2842762, 2158730, 2158730, 2158730, 2900106, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 3014794, 2158730, 2158730, 3051658, 2158730, 2158730, 3100810, 2158730, 2158730, 2158730, 2158730, 3096714, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2207744, 2207744, 2207744, 2207744, 2207744, 2572288, 2207744, 2207744, 2207744, 2207744, 541, 541, 543, 543, 0, 0, 2166784, 0, 548, 549, 549, 0, 286, 2158877, 2158877, 2158877, 2863389, 2892061, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 3186973, 2158877, 0, 0, 0, 0, 0, 0, 0, 0, 2367626, 2158877, 2404637, 2412829, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2564381, 2158877, 2158877, 2605341, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2679069, 2158877, 2695453, 2158877, 2703645, 2158877, 2711837, 2752797, 2158877, 0, 2158877, 2158877, 2158877, 2384010, 2158730, 2158730, 2158730, 2158730, 3006602, 2383872, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2441216, 2445312, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2502656, 2158877, 2785565, 2158877, 2810141, 2158877, 2158877, 2842909, 2158877, 2158877, 2158877, 2900253, 2158877, 2158877, 2158877, 2158877, 2158877, 2531613, 2158877, 2158877, 2158877, 2158877, 2158877, 2617629, 2158877, 2158877, 2158877, 2158877, 2158730, 2818186, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 3105053, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 0, 0, 0, 0, 0, 97, 97, 97, 1611, 97, 97, 97, 97, 97, 97, 97, 1496, 97, 97, 1499, 97, 97, 97, 97, 97, 2441354, 2445450, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2502794, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2433162, 2158730, 2453642, 2461834, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2580618, 2158730, 2158730, 2158730, 2158730, 2621578, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2699402, 2158730, 2158730, 2158730, 2158730, 2678922, 2158730, 2695306, 2158730, 2703498, 2158730, 2711690, 2752650, 2158730, 2158730, 2785418, 2158730, 2158730, 2158730, 3113098, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 3186826, 2158730, 2207744, 2207744, 2207744, 2207744, 2699264, 2207744, 2207744, 2207744, 2207744, 2207744, 2748416, 2756608, 2777088, 2801664, 2207744, 2207744, 2158877, 2158877, 2158877, 2158877, 2158877, 0, 0, 0, 2158877, 2158877, 2158877, 2158877, 0, 0, 2535709, 2543901, 2158877, 2158877, 2158877, 0, 0, 0, 2158877, 2158877, 2158877, 2990365, 2158877, 2158877, 2158730, 2158730, 2158730, 2158730, 2158730, 2572426, 2158877, 2502941, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2580765, 2158877, 2158877, 2158877, 2158877, 2621725, 2158877, 3019037, 2158877, 3043613, 2158877, 2158877, 2158877, 2158877, 3080477, 2158877, 2158877, 3113245, 2158877, 2158877, 2158877, 2158877, 0, 2158877, 2908445, 2158877, 2158877, 2158877, 2978077, 2158877, 2158877, 2158877, 2158877, 3039517, 2158877, 2158730, 2510986, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2584714, 2158730, 2609290, 2158730, 2158730, 2629770, 2158730, 2158730, 2158730, 2388106, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2605194, 2158730, 2158730, 2158730, 2158730, 2687114, 2158730, 2715786, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2867338, 2158730, 2904202, 2158730, 2158730, 2158730, 2642058, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2781322, 2793610, 2158730, 3121290, 2158730, 2158730, 2158730, 3149962, 2158730, 2158730, 3170442, 3174538, 2158730, 2367488, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2580480, 2207744, 2207744, 2207744, 2207744, 2621440, 2207744, 2207744, 2158877, 2433309, 2158877, 2453789, 2461981, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2511133, 2158877, 2158877, 2158877, 2158877, 2584861, 2158877, 2609437, 2158877, 2158877, 2629917, 2158877, 2158877, 2158877, 2687261, 2158877, 2715933, 2158877, 2158730, 2158730, 2973834, 2158730, 2982026, 2158730, 2158730, 3002506, 2158730, 3047562, 3063946, 3076234, 2158730, 2158730, 2158730, 2158730, 2207744, 2506752, 2207744, 2207744, 2207744, 2207744, 2207744, 2158877, 2507037, 0, 0, 2158877, 2158730, 2158730, 2158730, 3203210, 2207744, 2207744, 2207744, 2207744, 2207744, 2424832, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 0, 823, 0, 825, 2707741, 2732317, 2158877, 2158877, 2158877, 2822429, 2826525, 2158877, 2896157, 2158877, 2158877, 2924829, 2158877, 2158877, 2973981, 2158877, 18, 0, 0, 0, 0, 0, 0, 0, 2211840, 0, 0, 642, 0, 2158592, 0, 45, 1529, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1755, 45, 67, 67, 2982173, 2158877, 2158877, 3002653, 2158877, 3047709, 3064093, 3076381, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 3203357, 2523274, 2527370, 2158730, 2158730, 2576522, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2908298, 2494749, 2158877, 2158877, 2158877, 2523421, 2527517, 2158877, 2158877, 2576669, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 0, 40976, 0, 18, 18, 4321280, 2224253, 2232448, 4329472, 2232448, 2158730, 2498698, 2158730, 2158730, 2158730, 2158730, 2568330, 2158730, 2592906, 2625674, 2158730, 2158730, 2674826, 2736266, 2158730, 2158730, 2158730, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2158730, 2912394, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 3109002, 2158730, 2158730, 3133578, 3145866, 3154058, 2375680, 2207744, 3108864, 2207744, 2207744, 3133440, 3145728, 3153920, 2375965, 2380061, 2158877, 2158877, 2421021, 2158877, 2449693, 2158877, 2158877, 2158877, 3117341, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 3104906, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158877, 2498845, 2158877, 2158877, 0, 2158877, 2158877, 2568477, 2158877, 2593053, 2625821, 2158877, 2158877, 2674973, 0, 0, 0, 0, 97, 97, 1480, 97, 97, 97, 97, 97, 1485, 97, 97, 97, 0, 97, 97, 1729, 97, 1731, 97, 97, 97, 97, 97, 97, 97, 311, 97, 97, 97, 97, 97, 97, 97, 97, 1520, 97, 97, 1523, 97, 97, 1526, 97, 2736413, 2158877, 2158877, 0, 2158877, 2912541, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 3109149, 2158877, 2158877, 3014941, 2158877, 2158877, 3051805, 2158877, 2158877, 3100957, 2158877, 2158877, 3121437, 2158877, 2158877, 2158877, 3150109, 3133725, 3146013, 3154205, 2158730, 2408586, 2416778, 2158730, 2465930, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 3018890, 2158730, 3043466, 2158730, 2158730, 2158730, 2158730, 3080330, 2633866, 2658442, 2740362, 2744458, 2834570, 2949258, 2158730, 2986122, 2158730, 2998410, 2158730, 2158730, 2158730, 3129482, 2207744, 2408448, 2949120, 2207744, 2985984, 2207744, 2998272, 2207744, 2207744, 2207744, 3129344, 2158877, 2408733, 2416925, 2158877, 2466077, 2158877, 2158877, 3170589, 3174685, 2158877, 0, 0, 0, 2158730, 2158730, 2158730, 2158730, 2158730, 2424970, 2158730, 2158730, 2158730, 2158730, 2707594, 2732170, 2158730, 2158730, 2158730, 2822282, 2826378, 2158730, 2896010, 2158730, 2158730, 2924682, 2949405, 2158877, 2986269, 2158877, 2998557, 2158877, 2158877, 2158877, 3129629, 2158730, 2158730, 2478218, 2158730, 2158730, 2158730, 2535562, 2543754, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 3117194, 2207744, 2207744, 2478080, 2207744, 2207744, 2207744, 2207744, 2781184, 2793472, 2207744, 2818048, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 0, 541, 0, 543, 2207744, 2535424, 2543616, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 3117056, 2158877, 2158877, 2478365, 0, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158730, 2158730, 2482314, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2207744, 2207744, 2207744, 2387968, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 0, 542, 0, 544, 2158730, 2158730, 2158730, 2990218, 2158730, 2158730, 2207744, 2207744, 2482176, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 0, 0, 0, 0, 0, 0, 2162688, 135, 0, 2207744, 2207744, 2990080, 2207744, 2207744, 2158877, 2158877, 2482461, 2158877, 2158877, 0, 0, 0, 2158877, 2158877, 2158877, 2158877, 2158877, 2158730, 2429066, 2158730, 2515082, 2158730, 2588810, 2158730, 2838666, 2158730, 2158730, 2158730, 3010698, 2207744, 2428928, 2207744, 2514944, 2207744, 2588672, 2207744, 2838528, 2207744, 2207744, 2207744, 3010560, 2158877, 2429213, 2158877, 2515229, 0, 0, 2158877, 2588957, 2158877, 0, 2838813, 2158877, 2158877, 2158877, 3010845, 2158730, 2506890, 2158730, 2158730, 2158730, 2748554, 2756746, 2777226, 2801802, 2158730, 2158730, 2158730, 2863242, 2891914, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2564234, 2158730, 2158730, 2158730, 2158730, 2158730, 2597002, 2158730, 2158730, 2158730, 3006464, 2384157, 0, 0, 2158877, 2158877, 2158877, 2158877, 3006749, 2158730, 2637962, 2953354, 2158730, 2207744, 2637824, 2953216, 2207744, 0, 0, 2158877, 2638109, 2953501, 2158877, 2539658, 2158730, 2539520, 2207744, 0, 0, 2539805, 2158877, 2158730, 2158730, 2158730, 2977930, 2158730, 2158730, 2158730, 2158730, 3039370, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 3158154, 2207744, 0, 2158877, 2158730, 2207744, 0, 2158877, 2158730, 2207744, 0, 2158877, 2965642, 2965504, 2965789, 0, 0, 0, 0, 1315, 0, 0, 0, 0, 97, 97, 97, 97, 97, 97, 97, 1484, 97, 97, 97, 97, 2158592, 18, 0, 122880, 0, 0, 0, 77824, 0, 2211840, 0, 0, 0, 0, 2158592, 0, 356, 0, 0, 0, 0, 0, 0, 28809, 0, 139, 45, 45, 45, 45, 45, 45, 1751, 45, 45, 45, 45, 45, 45, 45, 67, 67, 1427, 67, 67, 67, 67, 67, 1432, 67, 67, 67, 3104768, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 122880, 0, 0, 0, 0, 1315, 0, 0, 0, 0, 97, 97, 97, 97, 97, 97, 1322, 550, 0, 286, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 2424832, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 0, 40976, 0, 18, 18, 24, 24, 4329472, 27, 27, 2207744, 2207744, 2977792, 2207744, 2207744, 2207744, 2207744, 3039232, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 3158016, 542, 0, 0, 0, 542, 0, 544, 0, 0, 0, 544, 0, 550, 0, 0, 0, 0, 0, 97, 97, 1610, 97, 97, 97, 97, 97, 97, 97, 97, 898, 97, 97, 97, 97, 97, 97, 97, 0, 94242, 0, 0, 0, 2211840, 0, 0, 0, 0, 0, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 2424832, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 237568, 102439, 106538, 98347, 0, 0, 20480, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 192512, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 94, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 96, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 12378, 40976, 18, 18, 36884, 0, 45078, 0, 24, 24, 24, 126, 126, 126, 126, 90143, 0, 0, 2170880, 0, 0, 0, 0, 2158592, 2158592, 2158592, 2387968, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 20480, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 241664, 102439, 106538, 98347, 0, 0, 20568, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 200797, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 20480, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 0, 0, 44, 0, 0, 20575, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 41, 41, 41, 0, 0, 1126400, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 0, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 89, 40976, 18, 18, 36884, 0, 45078, 0, 24, 24, 24, 27, 131201, 27, 27, 90143, 0, 0, 2170880, 0, 0, 550, 0, 2158592, 2158592, 2158592, 2387968, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2441216, 2445312, 2158592, 2158592, 2158592, 2158592, 2158592, 0, 94242, 0, 0, 208896, 2211840, 102439, 0, 0, 106538, 98347, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 3186688, 2158592, 0, 0, 0, 0, 0, 0, 0, 0, 2367488, 32768, 0, 0, 0, 0, 0, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2433024, 2158592, 2453504, 2461696, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2510848, 2158592, 2158592, 2158592, 2158592, 40976, 18, 36884, 245783, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 20480, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 221184, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 180224, 40976, 18, 18, 36884, 155648, 45078, 0, 24, 24, 217088, 27, 27, 27, 217088, 90143, 0, 0, 2170880, 0, 0, 828, 0, 2158592, 2158592, 2158592, 2387968, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2207744, 2207744, 2207744, 2387968, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 0, 0, 0, 0, 0, 0, 2162688, 233472, 0, 0, 94242, 0, 0, 0, 38, 102439, 0, 0, 106538, 98347, 28809, 45, 45, 45, 45, 45, 718, 45, 45, 45, 45, 45, 45, 45, 45, 45, 727, 131427, 0, 0, 0, 0, 362, 0, 365, 28809, 367, 139, 45, 45, 45, 45, 45, 45, 1808, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 97, 97, 0, 0, 97, 67, 24850, 24850, 12564, 12564, 0, 57889, 0, 0, 0, 53531, 53531, 367, 286, 97, 97, 0, 0, 97, 97, 97, 97, 97, 97, 0, 1788, 97, 97, 0, 97, 2024, 97, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 235, 67, 67, 67, 67, 67, 57889, 0, 0, 54074, 54074, 550, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 45, 1798, 45, 45, 1800, 45, 45, 0, 1472, 0, 0, 0, 0, 0, 1474, 0, 0, 0, 0, 0, 1476, 0, 0, 0, 0, 1315, 0, 0, 0, 0, 97, 97, 97, 97, 1320, 97, 97, 0, 0, 97, 97, 97, 97, 97, 97, 1787, 0, 97, 97, 0, 97, 97, 97, 45, 45, 45, 45, 2029, 45, 67, 67, 67, 67, 2033, 1527, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 663, 67, 24850, 24850, 12564, 12564, 0, 57889, 281, 0, 0, 53531, 53531, 367, 286, 97, 97, 0, 0, 97, 97, 97, 97, 1786, 97, 0, 0, 97, 97, 0, 1790, 40976, 19, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 262144, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 46, 67, 98, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 45, 67, 97, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 258048, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 1122423, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 1114152, 1114152, 1114152, 0, 0, 1114112, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 37, 102439, 106538, 98347, 0, 0, 204800, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 57436, 40976, 18, 36884, 45078, 24, 27, 33, 33, 0, 33, 33, 33, 0, 0, 0, 40976, 18, 18, 36884, 0, 45078, 0, 124, 124, 124, 127, 127, 127, 127, 90143, 0, 0, 2170880, 0, 0, 550, 0, 2158877, 2158877, 2158877, 2388253, 2158877, 2158877, 2158877, 2158877, 2158877, 2781469, 2793757, 2158877, 2818333, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2867485, 2158877, 2904349, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 3096861, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2441501, 2445597, 2158877, 2158877, 2158877, 2158877, 2158877, 40976, 122, 123, 36884, 0, 45078, 0, 24, 24, 24, 27, 27, 27, 27, 90143, 0, 921, 29315, 0, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 936, 2158592, 4243810, 0, 0, 0, 0, 0, 0, 0, 2211840, 0, 0, 0, 0, 2158592, 0, 921, 29315, 0, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 935, 45, 45, 45, 715, 45, 45, 45, 45, 45, 45, 45, 723, 45, 45, 45, 45, 45, 1182, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 430, 45, 45, 45, 45, 45, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 47, 68, 99, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 48, 69, 100, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 49, 70, 101, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 50, 71, 102, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 51, 72, 103, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 52, 73, 104, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 53, 74, 105, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 54, 75, 106, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 55, 76, 107, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 56, 77, 108, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 57, 78, 109, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 58, 79, 110, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 59, 80, 111, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 60, 81, 112, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 61, 82, 113, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 62, 83, 114, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 63, 84, 115, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 64, 85, 116, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 65, 86, 117, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 66, 87, 118, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 118820, 102439, 106538, 98347, 118820, 118820, 118820, 40976, 18, 18, 0, 0, 45078, 0, 24, 24, 24, 27, 27, 27, 27, 90143, 0, 0, 1314, 0, 0, 0, 0, 0, 0, 97, 97, 97, 97, 97, 1321, 97, 18, 131427, 0, 0, 0, 0, 0, 0, 362, 0, 0, 365, 0, 367, 0, 0, 1315, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1360, 97, 97, 131, 94242, 0, 0, 0, 38, 102439, 0, 0, 106538, 98347, 28809, 45, 45, 45, 145, 149, 45, 45, 45, 45, 45, 174, 45, 179, 45, 185, 45, 188, 45, 45, 202, 67, 255, 67, 67, 269, 67, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 97, 97, 97, 292, 296, 97, 97, 97, 97, 97, 321, 97, 326, 97, 332, 97, 18, 131427, 0, 0, 0, 0, 0, 0, 362, 0, 0, 365, 29315, 367, 646, 335, 97, 97, 349, 97, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 437, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 523, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 511, 67, 67, 67, 97, 97, 97, 620, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1501, 1502, 97, 793, 67, 67, 796, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 808, 67, 0, 0, 97, 97, 97, 97, 45, 45, 67, 67, 0, 0, 97, 97, 2052, 67, 67, 67, 67, 813, 67, 67, 67, 67, 67, 67, 67, 25398, 542, 13112, 544, 57889, 0, 0, 54074, 54074, 550, 830, 97, 97, 97, 97, 97, 97, 97, 97, 97, 315, 97, 97, 97, 97, 97, 97, 841, 97, 97, 97, 97, 97, 97, 97, 97, 97, 854, 97, 97, 97, 97, 97, 97, 589, 97, 97, 97, 97, 97, 97, 97, 97, 97, 867, 97, 97, 97, 97, 97, 97, 97, 891, 97, 97, 894, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 906, 45, 937, 45, 45, 940, 45, 45, 45, 45, 45, 45, 948, 45, 45, 45, 45, 45, 734, 735, 67, 737, 67, 738, 67, 740, 67, 67, 67, 45, 967, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 435, 45, 45, 45, 980, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 415, 45, 45, 67, 67, 1024, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 97, 97, 97, 67, 67, 67, 67, 67, 25398, 1081, 13112, 1085, 54074, 1089, 0, 0, 0, 0, 0, 0, 363, 0, 28809, 0, 139, 45, 45, 45, 45, 45, 45, 1674, 45, 45, 45, 45, 45, 45, 45, 45, 67, 1913, 67, 1914, 67, 67, 67, 1918, 67, 67, 97, 97, 97, 97, 1118, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 630, 97, 97, 97, 97, 97, 1169, 97, 97, 97, 97, 97, 0, 921, 0, 1175, 0, 0, 0, 0, 45, 45, 45, 45, 45, 45, 1534, 45, 45, 45, 45, 45, 1538, 45, 45, 45, 45, 1233, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 742, 67, 45, 45, 1191, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 454, 67, 67, 67, 67, 1243, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1251, 67, 0, 0, 97, 97, 97, 97, 45, 45, 67, 67, 2050, 0, 97, 97, 45, 45, 45, 732, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 97, 97, 67, 67, 67, 1284, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 772, 67, 67, 67, 1293, 67, 67, 67, 67, 67, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 368, 2158592, 2158592, 2158592, 2404352, 2412544, 1323, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1331, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1737, 97, 1364, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1373, 97, 18, 131427, 0, 0, 0, 0, 0, 0, 362, 0, 0, 365, 29315, 367, 647, 45, 45, 1387, 45, 45, 1391, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 410, 45, 45, 45, 45, 45, 1400, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1407, 45, 45, 45, 45, 45, 941, 45, 943, 45, 45, 45, 45, 45, 45, 951, 45, 67, 1438, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1447, 67, 67, 67, 67, 67, 67, 799, 67, 67, 67, 804, 67, 67, 67, 67, 67, 67, 67, 1443, 67, 67, 1446, 67, 67, 67, 67, 67, 67, 67, 1298, 0, 0, 0, 1304, 0, 0, 0, 1310, 97, 1491, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1500, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1736, 97, 45, 45, 1541, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 677, 45, 45, 67, 1581, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 791, 792, 67, 67, 67, 67, 1598, 67, 1600, 67, 67, 67, 67, 67, 67, 67, 67, 1472, 97, 97, 97, 1727, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1513, 97, 97, 67, 67, 97, 1879, 97, 1881, 97, 0, 1884, 0, 97, 97, 97, 97, 0, 0, 97, 97, 97, 97, 97, 0, 0, 0, 1842, 97, 97, 67, 67, 67, 67, 67, 97, 97, 97, 97, 1928, 0, 0, 0, 97, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 1903, 45, 45, 45, 67, 67, 67, 67, 97, 97, 97, 97, 1971, 0, 0, 97, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 0, 0, 45, 45, 45, 1381, 45, 45, 45, 45, 1976, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1747, 809, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 25398, 542, 13112, 544, 97, 907, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 638, 0, 0, 0, 0, 1478, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1150, 97, 97, 97, 97, 67, 67, 67, 67, 1244, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 477, 67, 67, 67, 67, 67, 67, 1294, 67, 67, 67, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1324, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 0, 0, 1374, 97, 97, 97, 97, 0, 1175, 0, 45, 45, 45, 45, 45, 45, 45, 45, 945, 45, 45, 45, 45, 45, 45, 45, 45, 1908, 45, 45, 1910, 45, 67, 67, 67, 67, 67, 67, 67, 67, 1919, 67, 0, 0, 97, 97, 97, 97, 45, 2048, 67, 2049, 0, 0, 97, 2051, 45, 45, 45, 939, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 397, 45, 45, 45, 1921, 67, 67, 1923, 67, 97, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 97, 97, 45, 45, 45, 45, 1947, 45, 1935, 0, 0, 0, 97, 1939, 97, 97, 1941, 97, 45, 45, 45, 45, 45, 45, 382, 389, 45, 45, 45, 45, 45, 45, 45, 45, 1810, 45, 45, 1812, 67, 67, 67, 67, 67, 256, 67, 67, 67, 67, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 336, 97, 97, 97, 97, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 131427, 0, 0, 0, 0, 362, 0, 365, 28809, 367, 139, 45, 45, 371, 373, 45, 45, 45, 955, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 413, 45, 45, 45, 457, 459, 67, 67, 67, 67, 67, 67, 67, 67, 473, 67, 478, 67, 67, 482, 67, 67, 485, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 97, 1828, 97, 554, 556, 97, 97, 97, 97, 97, 97, 97, 97, 570, 97, 575, 97, 97, 579, 97, 97, 582, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 330, 97, 97, 67, 746, 67, 67, 67, 67, 67, 67, 67, 67, 67, 758, 67, 67, 67, 67, 67, 67, 67, 1587, 67, 1589, 67, 67, 67, 67, 67, 67, 67, 97, 1706, 97, 97, 97, 1709, 97, 97, 97, 97, 97, 844, 97, 97, 97, 97, 97, 97, 97, 97, 97, 856, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 1735, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 97, 1642, 97, 1644, 97, 97, 890, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 67, 67, 67, 67, 1065, 1066, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 532, 67, 67, 67, 67, 67, 67, 67, 1451, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 496, 67, 67, 97, 97, 1505, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 593, 97, 97, 0, 1474, 0, 1476, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1617, 97, 97, 1635, 0, 1637, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 885, 97, 97, 97, 97, 67, 67, 1704, 67, 67, 67, 67, 97, 97, 97, 97, 97, 97, 97, 97, 97, 565, 572, 97, 97, 97, 97, 97, 97, 97, 97, 1832, 0, 97, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 97, 97, 45, 45, 45, 1946, 45, 45, 67, 67, 67, 67, 67, 97, 1926, 97, 1927, 97, 0, 0, 0, 97, 97, 1934, 2043, 0, 0, 97, 97, 97, 2047, 45, 45, 67, 67, 0, 1832, 97, 97, 45, 45, 45, 981, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1227, 45, 45, 45, 131427, 0, 0, 0, 0, 362, 0, 365, 28809, 367, 139, 45, 45, 372, 45, 45, 45, 45, 1661, 1662, 45, 45, 45, 45, 45, 1666, 45, 45, 45, 45, 45, 1673, 45, 1675, 45, 45, 45, 45, 45, 45, 45, 67, 1426, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1275, 67, 67, 67, 67, 67, 45, 418, 45, 45, 420, 45, 45, 423, 45, 45, 45, 45, 45, 45, 45, 45, 959, 45, 45, 962, 45, 45, 45, 45, 458, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 483, 67, 67, 67, 67, 504, 67, 67, 506, 67, 67, 509, 67, 67, 67, 67, 67, 67, 67, 753, 67, 67, 67, 67, 67, 67, 67, 67, 467, 67, 67, 67, 67, 67, 67, 67, 555, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 580, 97, 97, 97, 97, 601, 97, 97, 603, 97, 97, 606, 97, 97, 97, 97, 97, 97, 848, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1498, 97, 97, 97, 97, 97, 97, 45, 45, 714, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 989, 990, 45, 67, 67, 67, 67, 67, 1011, 67, 67, 67, 67, 1015, 67, 67, 67, 67, 67, 67, 67, 768, 67, 67, 67, 67, 67, 67, 67, 67, 769, 67, 67, 67, 67, 67, 67, 67, 45, 45, 1179, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1003, 1004, 67, 1217, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 728, 67, 1461, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1034, 67, 97, 1516, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 871, 97, 67, 67, 67, 1705, 67, 67, 67, 97, 97, 97, 97, 97, 97, 97, 97, 97, 567, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1715, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 0, 0, 45, 45, 1380, 45, 45, 45, 45, 45, 67, 67, 97, 97, 97, 97, 97, 0, 0, 0, 97, 1887, 97, 97, 0, 0, 97, 97, 97, 0, 97, 97, 97, 97, 97, 2006, 45, 45, 1907, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1920, 67, 97, 0, 2035, 97, 97, 97, 97, 97, 45, 45, 45, 45, 67, 67, 67, 1428, 67, 67, 67, 67, 67, 67, 1435, 67, 0, 94242, 0, 0, 0, 38, 102439, 0, 0, 106538, 98347, 28809, 45, 45, 45, 146, 45, 152, 45, 45, 165, 45, 175, 45, 180, 45, 45, 187, 190, 195, 45, 203, 254, 257, 262, 67, 270, 67, 67, 0, 24850, 12564, 0, 0, 0, 281, 28809, 53531, 97, 97, 97, 293, 97, 299, 97, 97, 312, 97, 322, 97, 327, 97, 97, 334, 337, 342, 97, 350, 97, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 67, 484, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 499, 97, 581, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 596, 648, 45, 650, 45, 651, 45, 653, 45, 45, 45, 657, 45, 45, 45, 45, 45, 45, 1954, 67, 67, 67, 1958, 67, 67, 67, 67, 67, 67, 67, 783, 67, 67, 67, 788, 67, 67, 67, 67, 680, 45, 45, 45, 45, 45, 45, 45, 45, 688, 689, 691, 45, 45, 45, 45, 45, 983, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 947, 45, 45, 45, 45, 952, 45, 45, 698, 699, 45, 45, 702, 703, 45, 45, 45, 45, 45, 45, 45, 711, 744, 67, 67, 67, 67, 67, 67, 67, 67, 67, 757, 67, 67, 67, 67, 761, 67, 67, 67, 67, 765, 67, 767, 67, 67, 67, 67, 67, 67, 67, 67, 775, 776, 778, 67, 67, 67, 67, 67, 67, 785, 786, 67, 67, 789, 790, 67, 67, 67, 67, 67, 67, 1574, 67, 67, 67, 67, 67, 1578, 67, 67, 67, 67, 67, 67, 1012, 67, 67, 67, 67, 67, 67, 67, 67, 67, 468, 475, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 798, 67, 67, 67, 802, 67, 67, 67, 67, 67, 67, 67, 67, 1588, 67, 67, 67, 67, 67, 67, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 67, 810, 67, 67, 67, 67, 67, 67, 67, 67, 67, 821, 25398, 542, 13112, 544, 57889, 0, 0, 54074, 54074, 550, 0, 833, 97, 835, 97, 836, 97, 838, 97, 97, 0, 0, 97, 97, 97, 1785, 97, 97, 0, 0, 97, 97, 0, 97, 97, 1979, 97, 97, 45, 45, 1983, 45, 1984, 45, 45, 45, 45, 45, 652, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 690, 45, 45, 694, 45, 45, 97, 842, 97, 97, 97, 97, 97, 97, 97, 97, 97, 855, 97, 97, 97, 97, 0, 1717, 1718, 97, 97, 97, 97, 97, 1722, 97, 0, 0, 859, 97, 97, 97, 97, 863, 97, 865, 97, 97, 97, 97, 97, 97, 97, 97, 604, 97, 97, 97, 97, 97, 97, 97, 873, 874, 876, 97, 97, 97, 97, 97, 97, 883, 884, 97, 97, 887, 888, 97, 18, 131427, 0, 0, 0, 0, 0, 0, 362, 225280, 0, 365, 0, 367, 0, 45, 45, 45, 1531, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1199, 45, 45, 45, 45, 45, 97, 97, 908, 97, 97, 97, 97, 97, 97, 97, 97, 97, 919, 638, 0, 0, 0, 0, 2158877, 2158877, 2158877, 2158877, 2158877, 2425117, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2597149, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2642205, 2158877, 2158877, 2158877, 2158877, 2158877, 3158301, 0, 2375818, 2379914, 2158730, 2158730, 2420874, 2158730, 2449546, 2158730, 2158730, 953, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 965, 978, 45, 45, 45, 45, 45, 45, 985, 45, 45, 45, 45, 45, 45, 45, 45, 971, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 1027, 67, 1029, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1455, 67, 67, 67, 67, 67, 67, 67, 1077, 1078, 67, 67, 25398, 0, 13112, 0, 54074, 0, 0, 0, 0, 0, 0, 0, 0, 366, 0, 139, 2158730, 2158730, 2158730, 2404490, 2412682, 1113, 97, 97, 97, 97, 97, 97, 1121, 97, 1123, 97, 97, 97, 97, 97, 97, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1540, 1155, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 615, 1168, 97, 97, 1171, 1172, 97, 97, 0, 921, 0, 1175, 0, 0, 0, 0, 45, 45, 45, 45, 45, 1533, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1559, 1561, 45, 45, 45, 1564, 45, 1566, 1567, 45, 45, 45, 1219, 45, 45, 45, 45, 45, 45, 45, 1226, 45, 45, 45, 45, 45, 168, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 427, 45, 45, 45, 45, 45, 45, 45, 1231, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1242, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1046, 67, 67, 1254, 67, 1256, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 806, 807, 67, 67, 97, 1336, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1111, 97, 97, 97, 97, 97, 1351, 97, 97, 97, 1354, 97, 97, 97, 1359, 97, 97, 97, 0, 97, 97, 97, 97, 1640, 97, 97, 97, 97, 97, 97, 97, 897, 97, 97, 97, 902, 97, 97, 97, 97, 97, 97, 97, 97, 1366, 97, 97, 97, 97, 97, 97, 97, 1371, 97, 97, 97, 0, 97, 97, 97, 1730, 97, 97, 97, 97, 97, 97, 97, 97, 915, 97, 97, 97, 97, 0, 360, 0, 67, 67, 67, 1440, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1017, 67, 1019, 67, 67, 67, 67, 67, 1453, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1459, 97, 97, 97, 1493, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1525, 97, 97, 97, 97, 97, 97, 1507, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1514, 67, 67, 67, 67, 1584, 67, 67, 67, 67, 67, 1590, 67, 67, 67, 67, 67, 67, 67, 784, 67, 67, 67, 67, 67, 67, 67, 67, 1055, 67, 67, 67, 67, 1060, 67, 67, 67, 67, 67, 67, 67, 1599, 1601, 67, 67, 67, 1604, 67, 1606, 1607, 67, 1472, 0, 1474, 0, 1476, 0, 97, 97, 97, 97, 97, 97, 1614, 97, 97, 97, 97, 45, 45, 1850, 45, 45, 45, 45, 1855, 45, 45, 45, 45, 45, 1222, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1229, 97, 1618, 97, 97, 97, 97, 97, 97, 97, 1625, 97, 97, 97, 97, 97, 0, 1175, 0, 45, 45, 45, 45, 45, 45, 45, 45, 447, 45, 45, 45, 45, 45, 67, 67, 1633, 97, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 1643, 1645, 97, 97, 0, 0, 97, 97, 97, 2002, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 1740, 45, 45, 45, 1744, 45, 45, 45, 97, 1648, 97, 1650, 1651, 97, 0, 45, 45, 45, 1654, 45, 45, 45, 45, 45, 169, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 658, 45, 45, 45, 45, 664, 45, 45, 1659, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1187, 45, 45, 1669, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 1005, 67, 67, 1681, 67, 67, 67, 67, 67, 67, 67, 1686, 67, 67, 67, 67, 67, 67, 67, 800, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1603, 67, 67, 67, 67, 67, 0, 97, 97, 1713, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 0, 0, 1378, 45, 45, 45, 45, 45, 45, 45, 408, 45, 45, 45, 45, 45, 45, 45, 45, 1547, 45, 1549, 45, 45, 45, 45, 45, 97, 97, 1780, 0, 97, 97, 97, 97, 97, 97, 0, 0, 97, 97, 0, 97, 97, 97, 45, 45, 2027, 2028, 45, 45, 67, 67, 2031, 2032, 67, 45, 45, 1804, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 1917, 67, 67, 67, 67, 67, 67, 67, 1819, 67, 67, 67, 67, 67, 67, 67, 67, 97, 97, 97, 1708, 97, 97, 97, 97, 97, 45, 45, 1862, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 497, 67, 67, 67, 1877, 97, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 0, 0, 97, 97, 97, 97, 97, 1839, 0, 0, 97, 97, 97, 97, 1936, 0, 0, 97, 97, 97, 97, 97, 97, 1943, 1944, 1945, 45, 45, 45, 45, 670, 45, 45, 45, 45, 674, 45, 45, 45, 45, 678, 45, 1948, 45, 1950, 45, 45, 45, 45, 1955, 1956, 1957, 67, 67, 67, 1960, 67, 1962, 67, 67, 67, 67, 1967, 1968, 1969, 97, 0, 0, 0, 97, 97, 1974, 97, 0, 1936, 0, 97, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 45, 45, 1906, 0, 1977, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1746, 45, 45, 45, 45, 2011, 67, 67, 2013, 67, 67, 67, 2017, 97, 97, 0, 0, 2021, 97, 8192, 97, 97, 2025, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 1916, 67, 67, 67, 67, 0, 94242, 0, 0, 0, 38, 102439, 0, 0, 106538, 98347, 28809, 45, 45, 140, 45, 45, 45, 1180, 45, 45, 45, 45, 1184, 45, 45, 45, 45, 45, 45, 45, 387, 45, 392, 45, 45, 396, 45, 45, 399, 45, 45, 67, 207, 67, 67, 67, 67, 67, 67, 236, 67, 67, 67, 67, 67, 67, 67, 817, 67, 67, 67, 67, 25398, 542, 13112, 544, 97, 97, 287, 97, 97, 97, 97, 97, 97, 316, 97, 97, 97, 97, 97, 97, 0, 45, 45, 45, 45, 45, 45, 45, 1656, 1657, 45, 376, 45, 45, 45, 45, 45, 388, 45, 45, 45, 45, 45, 45, 45, 45, 1406, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 462, 67, 67, 67, 67, 67, 474, 67, 67, 67, 67, 67, 67, 67, 1245, 67, 67, 67, 67, 67, 67, 67, 67, 1013, 67, 67, 1016, 67, 67, 67, 67, 97, 97, 97, 97, 559, 97, 97, 97, 97, 97, 571, 97, 97, 97, 97, 97, 97, 896, 97, 97, 97, 900, 97, 97, 97, 97, 97, 97, 912, 914, 97, 97, 97, 97, 97, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 391, 45, 45, 45, 45, 45, 45, 45, 45, 713, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 662, 45, 1140, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 636, 67, 67, 1283, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 513, 67, 67, 1363, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 889, 97, 97, 97, 1714, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 0, 926, 45, 45, 45, 45, 45, 45, 45, 45, 672, 45, 45, 45, 45, 45, 45, 45, 45, 686, 45, 45, 45, 45, 45, 45, 45, 45, 944, 45, 45, 45, 45, 45, 45, 45, 45, 1676, 45, 45, 45, 45, 45, 45, 67, 97, 97, 97, 1833, 0, 97, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 97, 97, 45, 45, 45, 45, 1902, 45, 45, 45, 45, 45, 957, 45, 45, 45, 45, 961, 45, 963, 45, 45, 45, 67, 97, 2034, 0, 97, 97, 97, 97, 97, 2040, 45, 45, 45, 2042, 67, 67, 67, 67, 67, 67, 1586, 67, 67, 67, 67, 67, 67, 67, 67, 67, 469, 67, 67, 67, 67, 67, 67, 132, 94242, 0, 0, 0, 38, 102439, 0, 0, 106538, 98347, 28809, 45, 45, 45, 45, 45, 1414, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 428, 45, 45, 45, 45, 45, 57889, 0, 0, 54074, 54074, 550, 831, 97, 97, 97, 97, 97, 97, 97, 97, 97, 568, 97, 97, 97, 97, 578, 97, 45, 45, 968, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1228, 45, 45, 67, 67, 67, 67, 67, 25398, 1082, 13112, 1086, 54074, 1090, 0, 0, 0, 0, 0, 0, 364, 0, 0, 0, 139, 2158592, 2158592, 2158592, 2404352, 2412544, 67, 67, 67, 67, 1464, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 510, 67, 67, 67, 67, 97, 97, 97, 97, 1519, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 918, 97, 0, 0, 0, 0, 1528, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 976, 45, 1554, 45, 45, 45, 45, 45, 45, 45, 45, 1562, 45, 45, 1565, 45, 45, 45, 45, 683, 45, 45, 45, 687, 45, 45, 692, 45, 45, 45, 45, 45, 1953, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1014, 67, 67, 67, 67, 67, 67, 1568, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 0, 67, 67, 67, 67, 67, 1585, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1594, 97, 97, 1649, 97, 97, 97, 0, 45, 45, 1653, 45, 45, 45, 45, 45, 45, 383, 45, 45, 45, 45, 45, 45, 45, 45, 45, 986, 45, 45, 45, 45, 45, 45, 45, 45, 1670, 45, 1672, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 736, 67, 67, 67, 67, 67, 741, 67, 67, 67, 1680, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1074, 67, 67, 67, 1692, 67, 67, 67, 67, 67, 67, 67, 1697, 67, 1699, 67, 67, 67, 67, 67, 67, 1041, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1044, 67, 67, 67, 67, 67, 67, 67, 1769, 67, 67, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 97, 97, 624, 97, 97, 97, 97, 97, 97, 634, 97, 97, 1792, 97, 97, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 45, 958, 45, 45, 45, 45, 45, 45, 964, 45, 150, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 977, 204, 45, 67, 67, 67, 217, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 787, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 271, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 97, 97, 97, 97, 297, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1108, 97, 97, 97, 97, 97, 97, 97, 97, 351, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 45, 45, 938, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1398, 45, 45, 45, 153, 45, 161, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 660, 661, 45, 45, 205, 45, 67, 67, 67, 67, 220, 67, 228, 67, 67, 67, 67, 67, 67, 67, 0, 0, 0, 1302, 0, 0, 0, 1308, 0, 67, 67, 67, 67, 67, 272, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 97, 97, 97, 97, 352, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 45, 439, 45, 45, 45, 45, 45, 445, 45, 45, 45, 452, 45, 45, 67, 67, 212, 216, 67, 67, 67, 67, 67, 241, 67, 246, 67, 252, 67, 67, 486, 67, 67, 67, 67, 67, 67, 67, 494, 67, 67, 67, 67, 67, 67, 67, 1272, 67, 67, 67, 67, 67, 67, 67, 67, 507, 67, 67, 67, 67, 67, 67, 67, 67, 521, 67, 67, 525, 67, 67, 67, 67, 67, 531, 67, 67, 67, 538, 67, 0, 0, 2046, 97, 97, 97, 45, 45, 67, 67, 0, 0, 97, 97, 45, 45, 45, 1192, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1418, 45, 45, 1421, 97, 97, 583, 97, 97, 97, 97, 97, 97, 97, 591, 97, 97, 97, 97, 97, 97, 913, 97, 97, 97, 97, 97, 97, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 1384, 97, 618, 97, 97, 622, 97, 97, 97, 97, 97, 628, 97, 97, 97, 635, 97, 18, 131427, 0, 0, 0, 639, 0, 132, 362, 0, 0, 365, 29315, 367, 0, 921, 29315, 0, 0, 0, 0, 45, 45, 45, 45, 932, 45, 45, 45, 45, 45, 1544, 45, 45, 45, 45, 45, 1550, 45, 45, 45, 45, 45, 1194, 45, 1196, 45, 45, 45, 45, 45, 45, 45, 45, 999, 45, 45, 45, 45, 45, 67, 67, 45, 45, 667, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1408, 45, 45, 45, 696, 45, 45, 45, 701, 45, 45, 45, 45, 45, 45, 45, 45, 710, 45, 45, 45, 1220, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 194, 45, 45, 45, 729, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 797, 67, 67, 67, 67, 67, 67, 805, 67, 67, 67, 67, 67, 67, 67, 1695, 67, 67, 67, 67, 67, 1700, 67, 1702, 67, 67, 67, 67, 67, 814, 816, 67, 67, 67, 67, 67, 25398, 542, 13112, 544, 67, 67, 1008, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1020, 67, 0, 97, 45, 67, 0, 97, 45, 67, 0, 97, 45, 67, 97, 0, 0, 97, 97, 97, 97, 97, 45, 45, 45, 45, 67, 67, 67, 67, 1429, 67, 1430, 67, 67, 67, 67, 67, 1062, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 518, 1076, 67, 67, 67, 67, 25398, 0, 13112, 0, 54074, 0, 0, 0, 0, 0, 0, 0, 0, 28809, 0, 139, 45, 45, 45, 45, 45, 97, 97, 97, 97, 1102, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1124, 97, 1126, 97, 97, 1114, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1112, 97, 97, 1156, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 594, 97, 97, 97, 97, 1170, 97, 97, 97, 97, 0, 921, 0, 0, 0, 0, 0, 0, 45, 45, 45, 45, 1532, 45, 45, 45, 45, 1536, 45, 45, 45, 45, 45, 172, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 706, 45, 45, 709, 45, 45, 1177, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1202, 45, 1204, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1215, 45, 45, 45, 1232, 45, 45, 45, 45, 45, 45, 45, 67, 1237, 67, 67, 67, 67, 67, 67, 1259, 67, 67, 67, 67, 67, 67, 1264, 67, 67, 67, 1282, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1289, 67, 67, 67, 1292, 97, 97, 97, 97, 1339, 97, 97, 97, 97, 97, 97, 1344, 97, 97, 97, 97, 45, 1849, 45, 1851, 45, 45, 45, 45, 45, 45, 45, 45, 721, 45, 45, 45, 45, 45, 726, 45, 1385, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1188, 45, 45, 1401, 1402, 45, 45, 45, 45, 1405, 45, 45, 45, 45, 45, 45, 45, 45, 1752, 45, 45, 45, 45, 45, 67, 67, 1410, 45, 45, 45, 1413, 45, 1415, 45, 45, 45, 45, 45, 45, 1419, 45, 45, 45, 45, 1806, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 97, 97, 2019, 0, 97, 67, 67, 67, 1452, 67, 67, 67, 67, 67, 67, 67, 67, 1457, 67, 67, 67, 67, 67, 67, 1271, 67, 67, 67, 1274, 67, 67, 67, 1279, 67, 1460, 67, 1462, 67, 67, 67, 67, 67, 67, 1466, 67, 67, 67, 67, 67, 67, 67, 67, 1602, 67, 67, 1605, 67, 67, 67, 0, 97, 97, 97, 1506, 97, 97, 97, 97, 97, 97, 97, 97, 1512, 97, 97, 97, 0, 1728, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 901, 97, 97, 97, 97, 1515, 97, 1517, 97, 97, 97, 97, 97, 97, 1521, 97, 97, 97, 97, 97, 97, 0, 45, 1652, 45, 45, 45, 1655, 45, 45, 45, 45, 45, 1542, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1552, 1553, 45, 45, 45, 1556, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 693, 45, 45, 45, 67, 67, 67, 67, 1572, 67, 67, 67, 67, 1576, 67, 67, 67, 67, 67, 67, 67, 67, 1685, 67, 67, 67, 67, 67, 67, 67, 67, 1465, 67, 67, 1468, 67, 67, 1471, 67, 67, 1582, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1580, 67, 67, 1596, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 0, 542, 0, 544, 67, 67, 67, 67, 1759, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 533, 67, 67, 67, 67, 67, 67, 67, 1770, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 97, 1777, 97, 97, 97, 1793, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 45, 998, 45, 45, 1001, 1002, 45, 45, 67, 67, 45, 1861, 45, 67, 67, 67, 67, 67, 67, 67, 67, 1871, 67, 1873, 1874, 67, 0, 97, 45, 67, 0, 97, 45, 67, 16384, 97, 45, 67, 97, 0, 0, 0, 1473, 0, 1082, 0, 0, 0, 1475, 0, 1086, 0, 0, 0, 1477, 1876, 67, 97, 97, 97, 97, 97, 1883, 0, 1885, 97, 97, 97, 1889, 0, 0, 0, 286, 0, 0, 0, 286, 0, 2367488, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 0, 40976, 0, 18, 18, 24, 24, 126, 126, 126, 2053, 0, 2055, 45, 67, 0, 97, 45, 67, 0, 97, 45, 67, 97, 0, 0, 97, 97, 97, 2039, 97, 45, 45, 45, 45, 67, 67, 67, 67, 67, 226, 67, 67, 67, 67, 67, 67, 67, 67, 1246, 67, 67, 1249, 1250, 67, 67, 67, 132, 94242, 0, 0, 0, 38, 102439, 0, 0, 106538, 98347, 28809, 45, 45, 141, 45, 45, 45, 1403, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1186, 45, 45, 1189, 45, 45, 155, 45, 45, 45, 45, 45, 45, 45, 45, 45, 191, 45, 45, 45, 45, 700, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1753, 45, 45, 45, 67, 67, 45, 45, 67, 208, 67, 67, 67, 222, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1764, 67, 67, 67, 67, 67, 67, 67, 258, 67, 67, 67, 67, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 97, 97, 288, 97, 97, 97, 302, 97, 97, 97, 97, 97, 97, 97, 97, 97, 627, 97, 97, 97, 97, 97, 97, 338, 97, 97, 97, 97, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 131427, 0, 0, 0, 0, 362, 0, 365, 28809, 367, 139, 45, 370, 45, 45, 45, 45, 716, 45, 45, 45, 45, 45, 722, 45, 45, 45, 45, 45, 45, 1912, 67, 67, 67, 67, 67, 67, 67, 67, 67, 819, 67, 67, 25398, 542, 13112, 544, 45, 403, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1409, 45, 67, 67, 67, 67, 489, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 771, 67, 67, 67, 67, 520, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 534, 67, 67, 67, 67, 67, 67, 1286, 67, 67, 67, 67, 67, 67, 67, 1291, 67, 67, 24850, 24850, 12564, 12564, 0, 57889, 0, 0, 0, 53531, 53531, 367, 286, 97, 553, 97, 97, 97, 97, 586, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1138, 97, 97, 97, 97, 617, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 631, 97, 97, 97, 0, 1834, 97, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 97, 353, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 45, 45, 668, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 724, 45, 45, 45, 45, 45, 682, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 949, 45, 45, 45, 67, 67, 747, 748, 67, 67, 67, 67, 755, 67, 67, 67, 67, 67, 67, 67, 0, 0, 1301, 0, 0, 0, 1307, 0, 0, 67, 794, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1701, 67, 97, 97, 97, 845, 846, 97, 97, 97, 97, 853, 97, 97, 97, 97, 97, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 97, 97, 892, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 610, 97, 97, 45, 992, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 1239, 67, 67, 67, 1063, 67, 67, 67, 67, 67, 1068, 67, 67, 67, 67, 67, 67, 67, 0, 1299, 0, 0, 0, 1305, 0, 0, 0, 97, 1141, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1152, 97, 97, 0, 0, 97, 97, 1784, 97, 97, 97, 0, 0, 97, 97, 0, 97, 1978, 97, 97, 97, 1982, 45, 45, 45, 45, 45, 45, 45, 45, 45, 972, 973, 45, 45, 45, 45, 45, 97, 97, 97, 97, 1157, 97, 97, 97, 97, 97, 1162, 97, 97, 97, 97, 97, 97, 1145, 97, 97, 97, 97, 97, 1151, 97, 97, 97, 1253, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 539, 45, 1423, 45, 45, 67, 67, 67, 67, 67, 67, 67, 1431, 67, 67, 67, 67, 67, 67, 67, 1773, 67, 97, 97, 97, 97, 97, 97, 97, 625, 97, 97, 97, 97, 97, 97, 97, 97, 850, 97, 97, 97, 97, 97, 97, 97, 97, 880, 97, 97, 97, 97, 97, 97, 97, 97, 1106, 97, 97, 97, 97, 97, 97, 97, 67, 67, 1439, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 514, 67, 67, 97, 97, 1492, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 611, 97, 97, 1703, 67, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 97, 97, 97, 97, 852, 97, 97, 97, 97, 97, 97, 45, 1949, 45, 1951, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 1961, 67, 0, 97, 45, 67, 0, 97, 2060, 2061, 0, 2062, 45, 67, 97, 0, 0, 2036, 97, 97, 97, 97, 45, 45, 45, 45, 67, 67, 67, 67, 67, 223, 67, 67, 237, 67, 67, 67, 67, 67, 67, 67, 1297, 0, 0, 0, 1303, 0, 0, 0, 1309, 1963, 67, 67, 67, 97, 97, 97, 97, 0, 1972, 0, 97, 97, 97, 1975, 0, 921, 29315, 0, 0, 0, 0, 45, 45, 45, 931, 45, 45, 45, 45, 45, 407, 45, 45, 45, 45, 45, 45, 45, 45, 45, 417, 45, 45, 1989, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1996, 97, 18, 131427, 0, 0, 360, 0, 0, 0, 362, 0, 0, 365, 29315, 367, 0, 921, 29315, 0, 0, 0, 0, 45, 45, 930, 45, 45, 45, 45, 45, 45, 444, 45, 45, 45, 45, 45, 45, 45, 67, 67, 97, 97, 1998, 0, 97, 97, 97, 0, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 1985, 45, 1986, 45, 45, 45, 156, 45, 45, 170, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 675, 45, 45, 45, 45, 679, 131427, 0, 358, 0, 0, 362, 0, 365, 28809, 367, 139, 45, 45, 45, 45, 45, 381, 45, 45, 45, 45, 45, 45, 45, 45, 45, 400, 45, 45, 419, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 436, 67, 67, 67, 67, 67, 505, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 820, 67, 25398, 542, 13112, 544, 67, 67, 522, 67, 67, 67, 67, 67, 529, 67, 67, 67, 67, 67, 67, 67, 0, 1300, 0, 0, 0, 1306, 0, 0, 0, 97, 97, 619, 97, 97, 97, 97, 97, 626, 97, 97, 97, 97, 97, 97, 97, 1105, 97, 97, 97, 97, 1109, 97, 97, 97, 67, 67, 67, 67, 749, 67, 67, 67, 67, 67, 67, 67, 67, 67, 760, 67, 0, 97, 45, 67, 2058, 97, 45, 67, 0, 97, 45, 67, 97, 0, 0, 97, 97, 97, 97, 97, 45, 45, 45, 2041, 67, 67, 67, 67, 67, 780, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 516, 67, 67, 97, 97, 97, 878, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1629, 97, 0, 45, 979, 45, 45, 45, 45, 984, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1000, 45, 45, 45, 45, 67, 67, 67, 1023, 67, 67, 67, 67, 1028, 67, 67, 67, 67, 67, 67, 67, 67, 67, 470, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 25398, 0, 13112, 0, 54074, 0, 0, 0, 1094, 0, 0, 0, 1092, 1315, 0, 0, 0, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1486, 97, 1489, 97, 97, 97, 1117, 97, 97, 97, 97, 1122, 97, 97, 97, 97, 97, 97, 97, 1146, 97, 97, 97, 97, 97, 97, 97, 97, 881, 97, 97, 97, 886, 97, 97, 97, 1311, 0, 0, 0, 0, 0, 0, 0, 0, 97, 97, 97, 97, 97, 97, 97, 1615, 97, 97, 97, 97, 97, 1619, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1631, 97, 97, 1847, 97, 45, 45, 45, 45, 1852, 45, 45, 45, 45, 45, 45, 45, 1235, 45, 45, 45, 67, 67, 67, 67, 67, 1868, 67, 67, 67, 1872, 67, 67, 67, 67, 67, 97, 97, 97, 97, 1882, 0, 0, 0, 97, 97, 97, 97, 0, 1891, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 1929, 0, 0, 97, 97, 97, 97, 97, 97, 45, 1900, 45, 1901, 45, 45, 45, 1905, 45, 67, 2054, 97, 45, 67, 0, 97, 45, 67, 0, 97, 45, 67, 97, 0, 0, 97, 2037, 2038, 97, 97, 45, 45, 45, 45, 67, 67, 67, 67, 1867, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1774, 97, 97, 97, 97, 97, 97, 0, 94242, 0, 0, 0, 38, 102439, 0, 0, 106538, 98347, 28809, 45, 45, 142, 45, 45, 45, 1412, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 432, 45, 45, 45, 45, 45, 157, 45, 45, 171, 45, 45, 45, 182, 45, 45, 45, 45, 200, 45, 45, 45, 1543, 45, 45, 45, 45, 45, 45, 45, 45, 1551, 45, 45, 45, 45, 1181, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1211, 45, 45, 45, 1214, 45, 45, 45, 67, 209, 67, 67, 67, 224, 67, 67, 238, 67, 67, 67, 249, 67, 0, 97, 2056, 2057, 0, 2059, 45, 67, 0, 97, 45, 67, 97, 0, 0, 1937, 97, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 1741, 45, 45, 45, 45, 45, 45, 67, 67, 67, 267, 67, 67, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 97, 97, 289, 97, 97, 97, 304, 97, 97, 318, 97, 97, 97, 329, 97, 97, 0, 0, 97, 97, 2001, 0, 97, 2003, 97, 97, 97, 45, 45, 45, 1739, 45, 45, 45, 1742, 45, 45, 45, 45, 45, 97, 97, 347, 97, 97, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 45, 666, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1420, 45, 57889, 0, 0, 54074, 54074, 550, 0, 97, 97, 97, 97, 97, 97, 97, 97, 840, 67, 1007, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 759, 67, 67, 67, 67, 67, 67, 67, 1052, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1031, 67, 67, 67, 67, 67, 97, 97, 97, 1101, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 592, 97, 97, 97, 1190, 45, 45, 45, 45, 45, 1195, 45, 1197, 45, 45, 45, 45, 1201, 45, 45, 45, 45, 1952, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 250, 67, 67, 67, 1255, 67, 1257, 67, 67, 67, 67, 1261, 67, 67, 67, 67, 67, 67, 67, 67, 1696, 67, 67, 67, 67, 67, 67, 67, 0, 0, 0, 0, 0, 0, 2162688, 0, 0, 67, 67, 1267, 67, 67, 67, 67, 67, 67, 1273, 67, 67, 67, 67, 67, 67, 67, 67, 1763, 67, 67, 67, 67, 67, 67, 67, 0, 0, 0, 0, 0, 280, 94, 0, 0, 1281, 67, 67, 67, 67, 1285, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1070, 67, 67, 67, 67, 67, 1335, 97, 1337, 97, 97, 97, 97, 1341, 97, 97, 97, 97, 97, 97, 97, 97, 882, 97, 97, 97, 97, 97, 97, 97, 1347, 97, 97, 97, 97, 97, 97, 1353, 97, 97, 97, 97, 97, 97, 1361, 97, 18, 131427, 0, 638, 0, 0, 0, 0, 362, 0, 0, 365, 29315, 367, 0, 544, 0, 550, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2473984, 2158592, 2158592, 2158592, 2990080, 2158592, 2158592, 2207744, 2207744, 2482176, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 0, 0, 0, 0, 0, 0, 2162688, 0, 53530, 97, 97, 97, 1365, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 608, 97, 97, 97, 45, 45, 1424, 45, 1425, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1058, 67, 67, 67, 67, 45, 1555, 45, 45, 1557, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 707, 45, 45, 45, 45, 67, 67, 1570, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 773, 67, 67, 1595, 67, 67, 1597, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 139, 2158592, 2158592, 2158592, 2404352, 2412544, 97, 97, 97, 1636, 97, 97, 97, 1639, 97, 97, 1641, 97, 97, 97, 97, 97, 97, 1173, 0, 921, 0, 0, 0, 0, 0, 0, 45, 67, 67, 67, 1693, 67, 67, 67, 67, 67, 67, 67, 1698, 67, 67, 67, 67, 67, 67, 273, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 1860, 45, 45, 67, 67, 1865, 67, 67, 67, 67, 1870, 67, 67, 67, 67, 1875, 67, 67, 97, 97, 1880, 97, 97, 0, 0, 0, 97, 97, 1888, 97, 0, 0, 0, 1938, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 1854, 45, 45, 45, 45, 45, 45, 45, 1909, 45, 45, 1911, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1248, 67, 67, 67, 67, 67, 67, 1922, 67, 67, 1924, 97, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 97, 1898, 45, 45, 45, 45, 45, 45, 1904, 45, 45, 67, 67, 67, 67, 97, 97, 97, 97, 0, 0, 16384, 97, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 1724, 2008, 2009, 45, 45, 67, 67, 67, 2014, 2015, 67, 67, 97, 97, 0, 0, 97, 97, 97, 0, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 2022, 0, 2023, 97, 97, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 1869, 67, 67, 67, 67, 67, 67, 0, 94242, 0, 0, 0, 38, 102439, 0, 0, 106538, 98347, 28809, 45, 45, 45, 147, 151, 154, 45, 162, 45, 45, 176, 178, 181, 45, 45, 45, 192, 196, 45, 45, 45, 45, 2012, 67, 67, 67, 67, 67, 67, 2018, 97, 0, 0, 97, 1894, 1895, 97, 1897, 97, 45, 45, 45, 45, 45, 45, 45, 45, 45, 656, 45, 45, 45, 45, 45, 45, 67, 259, 263, 67, 67, 67, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 97, 97, 97, 294, 298, 301, 97, 309, 97, 97, 323, 325, 328, 97, 97, 97, 97, 97, 560, 97, 97, 97, 569, 97, 97, 97, 97, 97, 97, 306, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1624, 97, 97, 97, 97, 97, 97, 97, 0, 921, 0, 1175, 0, 0, 0, 0, 45, 339, 343, 97, 97, 97, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 67, 67, 503, 67, 67, 67, 67, 67, 67, 67, 67, 67, 512, 67, 67, 519, 97, 97, 600, 97, 97, 97, 97, 97, 97, 97, 97, 97, 609, 97, 97, 616, 45, 649, 45, 45, 45, 45, 45, 654, 45, 45, 45, 45, 45, 45, 45, 45, 1393, 45, 45, 45, 45, 45, 45, 45, 45, 1209, 45, 45, 45, 45, 45, 45, 45, 67, 763, 67, 67, 67, 67, 67, 67, 67, 67, 770, 67, 67, 67, 774, 67, 0, 2045, 97, 97, 97, 97, 45, 45, 67, 67, 0, 0, 97, 97, 45, 45, 45, 994, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 213, 67, 219, 67, 67, 232, 67, 242, 67, 247, 67, 67, 67, 779, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1018, 67, 67, 67, 67, 811, 67, 67, 67, 67, 67, 67, 67, 67, 67, 25398, 542, 13112, 544, 57889, 0, 0, 54074, 54074, 550, 0, 97, 834, 97, 97, 97, 97, 97, 839, 97, 18, 131427, 0, 638, 0, 0, 0, 0, 362, 0, 0, 365, 29315, 367, 645, 97, 97, 861, 97, 97, 97, 97, 97, 97, 97, 97, 868, 97, 97, 97, 872, 97, 97, 877, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 613, 97, 97, 97, 97, 97, 909, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 0, 0, 18, 18, 24, 24, 27, 27, 27, 1036, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1047, 67, 67, 67, 1050, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1033, 67, 67, 67, 97, 97, 1130, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 638, 0, 0, 67, 67, 67, 1295, 67, 67, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 1317, 97, 97, 97, 97, 97, 97, 1375, 97, 97, 97, 0, 0, 0, 45, 1379, 45, 45, 45, 45, 45, 45, 422, 45, 45, 45, 429, 431, 45, 45, 45, 45, 0, 1090, 0, 0, 97, 1479, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1357, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1716, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1723, 0, 921, 29315, 0, 0, 0, 0, 45, 929, 45, 45, 45, 45, 45, 45, 45, 1234, 45, 45, 45, 45, 67, 67, 67, 67, 1240, 97, 97, 97, 1738, 45, 45, 45, 45, 45, 45, 45, 1743, 45, 45, 45, 45, 166, 45, 45, 45, 45, 184, 186, 45, 45, 197, 45, 45, 97, 1779, 0, 0, 97, 97, 97, 97, 97, 97, 0, 0, 97, 97, 0, 97, 18, 131427, 0, 638, 0, 0, 0, 0, 362, 0, 640, 365, 29315, 367, 0, 921, 29315, 0, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1539, 45, 45, 1803, 45, 45, 45, 45, 45, 1809, 45, 45, 45, 67, 67, 67, 1814, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 0, 0, 0, 1932, 97, 97, 0, 1781, 97, 97, 97, 97, 97, 97, 0, 0, 97, 97, 0, 97, 67, 67, 67, 1818, 67, 67, 67, 67, 67, 1824, 67, 67, 67, 97, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 1890, 0, 1829, 97, 97, 0, 0, 97, 97, 1836, 97, 97, 0, 0, 0, 97, 97, 97, 97, 1981, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1987, 1845, 97, 97, 97, 45, 45, 45, 45, 45, 1853, 45, 45, 45, 1857, 45, 45, 45, 67, 1864, 67, 1866, 67, 67, 67, 67, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 97, 97, 1710, 1711, 67, 67, 97, 97, 97, 97, 97, 0, 0, 0, 1886, 97, 97, 97, 0, 0, 97, 97, 97, 97, 1838, 0, 0, 0, 97, 1843, 97, 0, 1893, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1745, 45, 45, 67, 2044, 0, 97, 97, 97, 97, 45, 45, 67, 67, 0, 0, 97, 97, 45, 45, 45, 1660, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 453, 45, 455, 67, 67, 67, 67, 268, 67, 67, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 97, 97, 348, 97, 97, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 131427, 0, 359, 0, 0, 362, 0, 365, 28809, 367, 139, 45, 45, 45, 45, 45, 421, 45, 45, 45, 45, 45, 45, 45, 434, 45, 45, 695, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1667, 45, 0, 921, 29315, 0, 925, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1548, 45, 45, 45, 45, 45, 45, 67, 1037, 67, 1039, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1277, 67, 67, 67, 67, 67, 67, 67, 67, 25398, 0, 13112, 0, 54074, 0, 0, 0, 1095, 0, 0, 0, 1096, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 869, 97, 97, 97, 97, 97, 97, 1131, 97, 1133, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1370, 97, 97, 97, 97, 97, 1312, 0, 0, 0, 0, 1096, 0, 0, 0, 97, 97, 97, 97, 97, 97, 97, 1327, 97, 97, 97, 97, 97, 1332, 97, 97, 97, 1830, 97, 0, 0, 97, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 1896, 97, 97, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1210, 45, 45, 45, 45, 45, 45, 133, 94242, 0, 0, 0, 38, 102439, 0, 0, 106538, 98347, 28809, 45, 45, 45, 45, 380, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 401, 45, 45, 158, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1200, 45, 45, 45, 45, 206, 67, 67, 67, 67, 67, 225, 67, 67, 67, 67, 67, 67, 67, 67, 754, 67, 67, 67, 67, 67, 67, 67, 57889, 0, 0, 54074, 54074, 550, 832, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1342, 97, 97, 97, 97, 97, 97, 67, 67, 67, 67, 67, 25398, 1083, 13112, 1087, 54074, 1091, 0, 0, 0, 0, 0, 0, 1316, 0, 831, 97, 97, 97, 97, 97, 97, 97, 1174, 921, 0, 1175, 0, 0, 0, 0, 45, 0, 94242, 0, 0, 0, 38, 102439, 0, 0, 106538, 98347, 28809, 45, 45, 45, 148, 67, 67, 264, 67, 67, 67, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 97, 97, 97, 295, 97, 97, 97, 97, 313, 97, 97, 97, 97, 331, 333, 97, 18, 131427, 356, 638, 0, 0, 0, 0, 362, 0, 0, 365, 0, 367, 0, 45, 45, 1530, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 988, 45, 45, 45, 97, 344, 97, 97, 97, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 402, 404, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1756, 67, 438, 45, 45, 45, 45, 45, 45, 45, 45, 449, 450, 45, 45, 45, 67, 67, 214, 218, 221, 67, 229, 67, 67, 243, 245, 248, 67, 67, 67, 67, 67, 488, 490, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1071, 67, 1073, 67, 67, 67, 67, 67, 524, 67, 67, 67, 67, 67, 67, 67, 67, 535, 536, 67, 67, 67, 67, 67, 67, 1683, 1684, 67, 67, 67, 67, 1688, 1689, 67, 67, 67, 67, 67, 67, 1694, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1288, 67, 67, 67, 67, 67, 67, 97, 97, 97, 585, 587, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1163, 97, 97, 97, 97, 97, 97, 97, 621, 97, 97, 97, 97, 97, 97, 97, 97, 632, 633, 97, 97, 0, 0, 97, 1783, 97, 97, 97, 97, 0, 0, 97, 97, 0, 97, 97, 97, 45, 2026, 45, 45, 45, 45, 67, 2030, 67, 67, 67, 67, 67, 67, 1053, 1054, 67, 67, 67, 67, 67, 67, 1061, 67, 712, 45, 45, 45, 717, 45, 45, 45, 45, 45, 45, 45, 45, 725, 45, 45, 45, 163, 167, 173, 177, 45, 45, 45, 45, 45, 193, 45, 45, 45, 45, 982, 45, 45, 45, 45, 45, 45, 987, 45, 45, 45, 45, 45, 1558, 45, 1560, 45, 45, 45, 45, 45, 45, 45, 45, 704, 705, 45, 45, 45, 45, 45, 45, 45, 45, 731, 45, 45, 45, 67, 67, 67, 67, 67, 739, 67, 67, 67, 67, 67, 67, 464, 67, 67, 67, 67, 67, 67, 479, 67, 67, 67, 67, 67, 764, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1290, 67, 67, 67, 67, 67, 67, 812, 67, 67, 67, 67, 818, 67, 67, 67, 25398, 542, 13112, 544, 57889, 0, 0, 54074, 54074, 550, 0, 97, 97, 97, 97, 97, 837, 97, 97, 97, 97, 97, 602, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1137, 97, 97, 97, 97, 97, 97, 97, 97, 97, 862, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1627, 97, 97, 97, 0, 97, 97, 97, 97, 910, 97, 97, 97, 97, 916, 97, 97, 97, 0, 0, 0, 97, 97, 1940, 97, 97, 1942, 45, 45, 45, 45, 45, 45, 385, 45, 45, 45, 45, 395, 45, 45, 45, 45, 966, 45, 969, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 975, 45, 45, 45, 406, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 974, 45, 45, 45, 67, 67, 67, 67, 1010, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1262, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1040, 67, 1042, 67, 1045, 67, 67, 67, 67, 67, 67, 67, 527, 67, 67, 67, 67, 67, 67, 537, 67, 67, 67, 67, 67, 1051, 67, 67, 67, 67, 67, 1057, 67, 67, 67, 67, 67, 67, 67, 1454, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1445, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1079, 25398, 0, 13112, 0, 54074, 0, 0, 0, 0, 0, 0, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2207744, 2207744, 2207744, 2207744, 2207744, 2572288, 2207744, 2207744, 2207744, 1098, 97, 97, 97, 97, 97, 1104, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1356, 97, 97, 97, 97, 97, 97, 1128, 97, 97, 97, 97, 97, 97, 1134, 97, 1136, 97, 1139, 97, 97, 97, 97, 97, 97, 1622, 97, 97, 97, 97, 97, 97, 97, 97, 0, 921, 0, 0, 0, 1176, 0, 646, 45, 67, 67, 67, 1268, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1469, 67, 67, 67, 97, 1348, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1127, 97, 67, 1569, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1448, 1449, 67, 1816, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1825, 67, 67, 1827, 97, 97, 0, 0, 1782, 97, 97, 97, 97, 97, 0, 0, 97, 97, 0, 97, 97, 97, 1831, 0, 0, 97, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 1980, 97, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1395, 45, 45, 45, 45, 45, 97, 1846, 97, 97, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1212, 45, 45, 45, 45, 45, 45, 2010, 45, 67, 67, 67, 67, 67, 2016, 67, 97, 97, 0, 0, 97, 97, 97, 0, 97, 97, 97, 97, 97, 45, 45, 2007, 0, 94242, 0, 0, 0, 38, 102439, 0, 0, 106538, 98347, 28809, 45, 45, 143, 45, 45, 45, 1671, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 1813, 67, 67, 1815, 45, 45, 67, 210, 67, 67, 67, 67, 67, 67, 239, 67, 67, 67, 67, 67, 67, 67, 1575, 67, 67, 67, 67, 67, 67, 67, 67, 493, 67, 67, 67, 67, 67, 67, 67, 97, 97, 290, 97, 97, 97, 97, 97, 97, 319, 97, 97, 97, 97, 97, 97, 303, 97, 97, 317, 97, 97, 97, 97, 97, 97, 305, 97, 97, 97, 97, 97, 97, 97, 97, 97, 899, 97, 97, 97, 97, 97, 97, 375, 45, 45, 45, 379, 45, 45, 390, 45, 45, 394, 45, 45, 45, 45, 45, 443, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 461, 67, 67, 67, 465, 67, 67, 476, 67, 67, 480, 67, 67, 67, 67, 67, 67, 1761, 67, 67, 67, 67, 67, 67, 67, 67, 67, 530, 67, 67, 67, 67, 67, 67, 500, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1075, 97, 97, 97, 558, 97, 97, 97, 562, 97, 97, 573, 97, 97, 577, 97, 97, 0, 1999, 97, 97, 97, 0, 97, 97, 2004, 2005, 97, 45, 45, 45, 45, 1193, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 676, 45, 45, 45, 45, 597, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1334, 45, 681, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1396, 45, 45, 1399, 45, 45, 730, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1434, 67, 67, 67, 67, 67, 67, 750, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1456, 67, 67, 67, 67, 67, 45, 45, 993, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 1238, 67, 67, 1006, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1280, 1048, 1049, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1059, 67, 67, 67, 67, 67, 67, 1296, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2367488, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 97, 97, 1100, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 638, 0, 920, 97, 97, 1142, 1143, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1153, 97, 97, 97, 97, 97, 1144, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1149, 97, 97, 97, 97, 1154, 45, 1218, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1678, 45, 45, 45, 67, 67, 67, 67, 67, 1269, 67, 67, 67, 67, 67, 67, 67, 67, 1278, 67, 67, 67, 67, 67, 67, 1772, 67, 67, 97, 97, 97, 97, 97, 97, 97, 0, 921, 922, 1175, 0, 0, 0, 0, 45, 97, 97, 1349, 97, 97, 97, 97, 97, 97, 97, 97, 1358, 97, 97, 97, 97, 97, 97, 1623, 97, 97, 97, 97, 97, 97, 97, 97, 0, 921, 0, 0, 926, 0, 0, 0, 45, 45, 1411, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1754, 45, 45, 67, 67, 1301, 0, 1307, 0, 1313, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 21054, 97, 97, 97, 97, 67, 1757, 67, 67, 67, 1760, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1467, 67, 67, 67, 67, 67, 1778, 97, 0, 0, 97, 97, 97, 97, 97, 97, 0, 0, 97, 97, 0, 97, 97, 97, 97, 97, 1158, 97, 97, 97, 1161, 97, 97, 97, 97, 1166, 97, 97, 97, 97, 97, 1325, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1328, 97, 97, 97, 97, 97, 97, 97, 67, 67, 67, 67, 67, 1820, 67, 1822, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 0, 0, 0, 97, 1933, 97, 1892, 97, 97, 97, 97, 97, 97, 1899, 45, 45, 45, 45, 45, 45, 45, 45, 1664, 45, 45, 45, 45, 45, 45, 45, 45, 1546, 45, 45, 45, 45, 45, 45, 45, 45, 1208, 45, 45, 45, 45, 45, 45, 45, 45, 1224, 45, 45, 45, 45, 45, 45, 45, 45, 673, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 1925, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 97, 623, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 307, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1796, 97, 45, 45, 45, 45, 45, 45, 45, 970, 45, 45, 45, 45, 45, 45, 45, 45, 1417, 45, 45, 45, 45, 45, 45, 45, 67, 1964, 67, 67, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 1721, 97, 97, 0, 0, 1997, 97, 0, 0, 2000, 97, 97, 0, 97, 97, 97, 97, 97, 45, 45, 45, 45, 733, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 803, 67, 67, 67, 67, 67, 0, 94242, 0, 0, 0, 38, 102439, 0, 0, 106538, 98347, 28809, 45, 45, 144, 45, 45, 45, 1805, 45, 1807, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 231, 67, 67, 67, 67, 67, 67, 67, 0, 24850, 12564, 0, 0, 0, 281, 28809, 53531, 45, 45, 67, 211, 67, 67, 67, 67, 230, 234, 240, 244, 67, 67, 67, 67, 67, 67, 492, 67, 67, 67, 67, 67, 67, 67, 67, 67, 471, 67, 67, 67, 67, 481, 67, 67, 260, 67, 67, 67, 67, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 97, 97, 291, 97, 97, 97, 97, 310, 314, 320, 324, 97, 97, 97, 97, 97, 97, 1367, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1355, 97, 97, 97, 97, 97, 97, 1362, 340, 97, 97, 97, 97, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 131427, 0, 0, 360, 0, 362, 0, 365, 28809, 367, 139, 369, 45, 45, 45, 374, 67, 67, 460, 67, 67, 67, 67, 466, 67, 67, 67, 67, 67, 67, 67, 67, 801, 67, 67, 67, 67, 67, 67, 67, 67, 67, 487, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 498, 67, 67, 67, 67, 67, 67, 1821, 67, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 0, 0, 67, 502, 67, 67, 67, 67, 67, 67, 67, 508, 67, 67, 67, 515, 517, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 0, 0, 1931, 97, 97, 97, 97, 97, 588, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 629, 97, 97, 97, 97, 97, 67, 24850, 24850, 12564, 12564, 0, 57889, 0, 0, 0, 53531, 53531, 367, 286, 552, 97, 97, 97, 97, 97, 1352, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1511, 97, 97, 97, 97, 97, 97, 97, 557, 97, 97, 97, 97, 563, 97, 97, 97, 97, 97, 97, 97, 97, 1135, 97, 97, 97, 97, 97, 97, 97, 97, 97, 584, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 595, 97, 97, 97, 97, 97, 895, 97, 97, 97, 97, 97, 97, 903, 97, 97, 97, 0, 97, 97, 1638, 97, 97, 97, 97, 97, 97, 97, 97, 1646, 97, 599, 97, 97, 97, 97, 97, 97, 97, 605, 97, 97, 97, 612, 614, 97, 97, 97, 97, 97, 1377, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 655, 45, 45, 45, 45, 45, 45, 45, 745, 67, 67, 67, 67, 751, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1577, 67, 67, 67, 67, 67, 762, 67, 67, 67, 67, 766, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1765, 67, 67, 67, 67, 67, 777, 67, 67, 781, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1592, 1593, 67, 67, 97, 843, 97, 97, 97, 97, 849, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1510, 97, 97, 97, 97, 97, 97, 97, 860, 97, 97, 97, 97, 864, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1797, 45, 45, 45, 45, 1801, 45, 97, 875, 97, 97, 879, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1522, 97, 97, 97, 97, 97, 991, 45, 45, 45, 45, 996, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 215, 67, 67, 67, 67, 233, 67, 67, 67, 67, 251, 253, 1022, 67, 67, 67, 1026, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1035, 67, 67, 1038, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1458, 67, 67, 67, 67, 67, 1064, 67, 67, 67, 1067, 67, 67, 67, 67, 1072, 67, 67, 67, 67, 67, 67, 1442, 67, 67, 67, 67, 67, 67, 67, 67, 67, 97, 97, 97, 1775, 97, 97, 97, 67, 67, 67, 67, 67, 25398, 0, 13112, 0, 54074, 0, 0, 0, 0, 1096, 0, 921, 29315, 0, 0, 0, 0, 928, 45, 45, 45, 45, 45, 934, 45, 45, 45, 164, 45, 45, 45, 45, 45, 45, 45, 45, 45, 198, 45, 45, 45, 378, 45, 45, 45, 45, 45, 45, 393, 45, 45, 45, 398, 45, 97, 97, 1116, 97, 97, 97, 1120, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1147, 1148, 97, 97, 97, 97, 97, 97, 97, 1129, 97, 97, 1132, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1626, 97, 97, 97, 97, 0, 45, 1178, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1185, 45, 45, 45, 45, 441, 45, 45, 45, 45, 45, 45, 451, 45, 45, 67, 67, 67, 67, 67, 227, 67, 67, 67, 67, 67, 67, 67, 67, 1260, 67, 67, 67, 1263, 67, 67, 1265, 1203, 45, 45, 1205, 45, 1206, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1216, 67, 1266, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1276, 67, 67, 67, 67, 67, 67, 752, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1056, 67, 67, 67, 67, 67, 67, 45, 1386, 45, 1389, 45, 45, 45, 45, 1394, 45, 45, 45, 1397, 45, 45, 45, 45, 995, 45, 997, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 1915, 67, 67, 67, 67, 67, 1422, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1433, 67, 1436, 67, 67, 67, 67, 1441, 67, 67, 67, 1444, 67, 67, 67, 67, 67, 67, 67, 0, 24851, 12565, 0, 0, 0, 0, 28809, 53532, 97, 97, 97, 97, 1494, 97, 97, 97, 1497, 97, 97, 97, 97, 97, 97, 97, 1368, 97, 97, 97, 97, 97, 97, 97, 97, 851, 97, 97, 97, 97, 97, 97, 97, 67, 67, 67, 1571, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 25398, 542, 13112, 544, 67, 67, 1583, 67, 67, 67, 67, 67, 67, 67, 67, 1591, 67, 67, 67, 67, 67, 67, 782, 67, 67, 67, 67, 67, 67, 67, 67, 67, 756, 67, 67, 67, 67, 67, 67, 97, 1634, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1125, 97, 97, 97, 1647, 97, 97, 97, 97, 97, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 719, 720, 45, 45, 45, 45, 45, 45, 45, 45, 685, 45, 45, 45, 45, 45, 45, 45, 45, 45, 942, 45, 45, 946, 45, 45, 45, 950, 45, 45, 1658, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1668, 1712, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 0, 1835, 97, 97, 97, 97, 0, 0, 0, 97, 97, 1844, 97, 97, 1726, 0, 97, 97, 97, 97, 97, 1732, 97, 1734, 97, 97, 97, 97, 97, 300, 97, 308, 97, 97, 97, 97, 97, 97, 97, 97, 866, 97, 97, 97, 97, 97, 97, 97, 67, 67, 67, 1758, 67, 67, 67, 1762, 67, 67, 67, 67, 67, 67, 67, 67, 1043, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1771, 67, 67, 67, 97, 97, 97, 97, 97, 1776, 97, 97, 97, 97, 97, 1794, 97, 97, 97, 45, 45, 45, 45, 45, 45, 45, 1183, 45, 45, 45, 45, 45, 45, 45, 45, 45, 409, 45, 45, 45, 45, 45, 45, 67, 67, 67, 1966, 97, 97, 97, 1970, 0, 0, 0, 97, 97, 97, 97, 0, 97, 97, 97, 1720, 97, 97, 97, 97, 97, 0, 0, 97, 97, 97, 1837, 97, 0, 1840, 1841, 97, 97, 97, 1988, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1994, 1995, 67, 97, 97, 97, 97, 97, 911, 97, 97, 97, 97, 97, 97, 97, 638, 0, 0, 0, 0, 1315, 0, 0, 0, 0, 97, 97, 97, 1319, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 1733, 97, 97, 97, 97, 97, 97, 1340, 97, 97, 97, 1343, 97, 97, 1345, 97, 1346, 67, 67, 265, 67, 67, 67, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 97, 345, 97, 97, 97, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 131427, 0, 0, 0, 361, 362, 0, 365, 28809, 367, 139, 45, 45, 45, 45, 45, 671, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 411, 45, 45, 414, 45, 45, 45, 45, 377, 45, 45, 45, 386, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1207, 45, 45, 45, 45, 45, 45, 1213, 45, 45, 67, 67, 67, 67, 67, 463, 67, 67, 67, 472, 67, 67, 67, 67, 67, 67, 67, 528, 67, 67, 67, 67, 67, 67, 67, 67, 1287, 67, 67, 67, 67, 67, 67, 67, 540, 24850, 24850, 12564, 12564, 0, 57889, 0, 0, 0, 53531, 53531, 367, 286, 97, 97, 97, 97, 97, 1103, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 917, 97, 97, 0, 0, 0, 637, 18, 131427, 0, 0, 0, 0, 0, 0, 362, 0, 0, 365, 29315, 367, 0, 921, 29315, 0, 0, 0, 927, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1223, 45, 45, 45, 45, 45, 45, 45, 45, 45, 426, 45, 45, 433, 45, 45, 45, 45, 697, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 708, 45, 45, 45, 45, 1221, 45, 45, 45, 45, 1225, 45, 45, 45, 45, 45, 45, 384, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1198, 45, 45, 45, 45, 45, 45, 67, 67, 795, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1470, 67, 67, 67, 67, 67, 67, 67, 815, 67, 67, 67, 67, 67, 67, 25398, 542, 13112, 544, 97, 97, 97, 893, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1164, 97, 97, 97, 67, 67, 67, 1025, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1687, 67, 67, 67, 67, 67, 67, 67, 67, 67, 25398, 0, 13112, 0, 54074, 0, 0, 0, 0, 0, 1097, 1241, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1450, 45, 45, 1388, 45, 1390, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1236, 67, 67, 67, 67, 67, 1437, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1472, 1490, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1503, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 0, 1930, 0, 97, 97, 97, 97, 97, 847, 97, 97, 97, 97, 97, 97, 97, 97, 97, 858, 67, 67, 1965, 67, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 0, 97, 97, 1719, 97, 97, 97, 97, 97, 97, 0, 0, 0, 45, 45, 45, 45, 1382, 45, 1383, 45, 45, 45, 159, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1563, 45, 45, 45, 45, 45, 67, 261, 67, 67, 67, 67, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 341, 97, 97, 97, 97, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 97, 1099, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1333, 97, 1230, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 1992, 67, 1993, 67, 67, 67, 97, 97, 45, 45, 160, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1665, 45, 45, 45, 45, 45, 131427, 357, 0, 0, 0, 362, 0, 365, 28809, 367, 139, 45, 45, 45, 45, 45, 684, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 412, 45, 45, 45, 416, 45, 45, 45, 440, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 1990, 67, 1991, 67, 67, 67, 67, 67, 67, 67, 97, 97, 1707, 97, 97, 97, 97, 97, 97, 501, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1691, 67, 67, 67, 67, 67, 526, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1030, 67, 1032, 67, 67, 67, 67, 598, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1632, 0, 921, 29315, 923, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1392, 45, 45, 45, 45, 45, 45, 45, 45, 45, 960, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 25398, 0, 13112, 0, 54074, 0, 0, 1093, 0, 0, 0, 0, 0, 97, 1609, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1369, 97, 97, 97, 1372, 97, 97, 67, 67, 266, 67, 67, 67, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 97, 346, 97, 97, 97, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 665, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1677, 45, 45, 45, 45, 67, 45, 45, 954, 45, 956, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1404, 45, 45, 45, 45, 45, 45, 45, 45, 45, 425, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 1270, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1069, 67, 67, 67, 67, 67, 67, 97, 97, 97, 1350, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1524, 97, 97, 97, 97, 97, 97, 97, 1376, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 1545, 45, 45, 45, 45, 45, 45, 45, 45, 45, 448, 45, 45, 45, 45, 67, 456, 67, 67, 67, 67, 67, 1573, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1247, 67, 67, 67, 67, 67, 1252, 97, 1725, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1628, 97, 1630, 0, 0, 94242, 0, 0, 0, 2211840, 0, 1118208, 0, 0, 0, 0, 2158592, 2158731, 2158592, 2158592, 2158592, 3117056, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 3018752, 2158592, 3043328, 2158592, 2158592, 2158592, 2158592, 3080192, 2158592, 2158592, 3112960, 2158592, 2158592, 2158592, 2158592, 2158592, 2158878, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2605056, 2158592, 2158592, 2207744, 0, 542, 0, 544, 0, 0, 2166784, 0, 0, 0, 550, 0, 0, 2158592, 2158592, 2686976, 2158592, 2715648, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2867200, 2158592, 2904064, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 0, 94242, 0, 0, 0, 2211840, 0, 0, 1130496, 0, 0, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 3186688, 2158592, 0, 0, 139, 0, 0, 0, 139, 0, 2367488, 2207744, 0, 0, 0, 0, 176128, 0, 2166784, 0, 0, 0, 0, 0, 286, 2158592, 2158592, 3170304, 3174400, 2158592, 0, 0, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 2424832, 2158592, 2158592, 2158592, 1508, 2158592, 2908160, 2158592, 2158592, 2158592, 2977792, 2158592, 2158592, 2158592, 2158592, 3039232, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 3158016, 67, 24850, 24850, 12564, 12564, 0, 0, 0, 0, 0, 53531, 53531, 0, 286, 97, 97, 97, 97, 97, 1119, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1509, 97, 97, 97, 97, 97, 97, 97, 97, 564, 97, 97, 97, 97, 97, 97, 97, 57889, 0, 0, 0, 0, 550, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 561, 97, 97, 97, 97, 97, 97, 576, 97, 97, 139264, 139264, 139264, 139264, 139264, 139264, 139264, 139264, 139264, 139264, 139264, 139264, 0, 0, 139264, 0, 921, 29315, 0, 0, 926, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1811, 45, 67, 67, 67, 67, 67, 0, 2146304, 2146304, 0, 0, 0, 0, 2224128, 2224128, 2224128, 2232320, 2232320, 2232320, 2232320, 0, 0, 1301, 0, 0, 0, 0, 0, 1307, 0, 0, 0, 0, 0, 1313, 0, 0, 0, 0, 0, 0, 0, 97, 97, 1318, 97, 97, 97, 97, 97, 97, 1795, 97, 97, 45, 45, 45, 45, 45, 45, 45, 446, 45, 45, 45, 45, 45, 45, 67, 67, 2158592, 2146304, 0, 0, 0, 0, 0, 0, 0, 2211840, 0, 0, 0, 0, 2158592, 0, 921, 29315, 0, 924, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1537, 45, 45, 45, 45 +]; + +JSONiqTokenizer.EXPECTED = +[ 290, 300, 304, 353, 296, 309, 305, 319, 315, 324, 328, 352, 354, 334, 338, 330, 320, 345, 349, 293, 358, 362, 341, 366, 312, 370, 374, 378, 382, 386, 390, 394, 398, 737, 402, 634, 439, 604, 634, 634, 634, 634, 408, 634, 634, 634, 404, 634, 634, 634, 457, 634, 634, 963, 634, 634, 413, 634, 634, 634, 634, 634, 634, 634, 663, 418, 422, 903, 902, 426, 431, 548, 634, 437, 521, 919, 443, 615, 409, 449, 455, 624, 731, 751, 634, 461, 465, 672, 470, 469, 474, 481, 485, 477, 489, 493, 629, 542, 497, 505, 603, 602, 991, 648, 510, 804, 634, 515, 958, 526, 525, 530, 768, 634, 546, 552, 711, 710, 593, 558, 562, 618, 566, 570, 574, 578, 582, 586, 590, 608, 612, 660, 822, 821, 634, 622, 596, 444, 628, 533, 724, 633, 640, 653, 647, 652, 536, 1008, 451, 450, 445, 657, 670, 676, 685, 689, 693, 697, 701, 704, 707, 715, 719, 798, 815, 634, 723, 762, 996, 634, 728, 969, 730, 735, 908, 634, 741, 679, 889, 511, 747, 634, 750, 755, 499, 666, 499, 501, 759, 772, 776, 780, 634, 787, 784, 797, 802, 809, 808, 427, 814, 1006, 517, 634, 519, 853, 634, 813, 850, 793, 634, 819, 826, 833, 832, 837, 843, 847, 857, 861, 863, 867, 871, 875, 879, 883, 643, 887, 539, 980, 979, 634, 893, 944, 634, 900, 896, 634, 907, 933, 506, 912, 917, 828, 433, 636, 635, 554, 961, 923, 930, 927, 937, 941, 634, 634, 634, 974, 948, 952, 985, 913, 968, 967, 743, 634, 973, 839, 634, 978, 599, 634, 984, 989, 765, 444, 995, 1000, 634, 1003, 790, 955, 1012, 681, 634, 634, 634, 634, 634, 414, 1016, 1020, 1024, 1085, 1027, 1090, 1090, 1046, 1080, 1137, 1108, 1215, 1049, 1032, 1039, 1085, 1085, 1085, 1085, 1058, 1062, 1068, 1085, 1086, 1090, 1090, 1091, 1072, 1064, 1107, 1090, 1090, 1090, 1118, 1123, 1138, 1078, 1074, 1084, 1085, 1085, 1085, 1087, 1090, 1062, 1052, 1060, 1114, 1062, 1104, 1085, 1085, 1090, 1090, 1028, 1122, 1063, 1128, 1139, 1127, 1158, 1085, 1085, 1151, 1090, 1090, 1090, 1095, 1090, 1132, 1073, 1136, 1143, 1061, 1150, 1085, 1155, 1098, 1101, 1146, 1162, 1169, 1101, 1185, 1151, 1090, 1110, 1173, 1054, 1087, 1109, 1177, 1165, 1089, 1204, 1184, 1107, 1189, 1193, 1088, 1197, 1180, 1201, 1208, 1042, 1212, 1219, 1223, 1227, 1231, 1235, 1245, 1777, 1527, 1686, 1686, 1238, 1686, 1254, 1686, 1686, 1686, 1294, 1669, 1686, 1686, 1686, 1322, 1625, 1534, 1268, 1624, 1275, 1281, 1443, 1292, 1300, 1686, 1686, 1686, 1350, 1826, 1306, 1686, 1686, 1240, 2032, 1317, 1321, 1686, 1686, 1253, 1686, 1326, 1686, 1686, 1686, 1418, 1709, 1446, 1686, 1686, 1686, 1492, 1686, 1295, 1447, 1686, 1686, 1258, 1686, 1736, 1686, 1686, 1520, 1355, 1686, 1288, 1348, 1361, 1686, 1359, 1686, 1364, 1498, 1368, 1302, 1362, 1381, 1389, 1395, 1486, 1686, 1371, 1377, 1370, 1686, 1375, 1382, 1384, 1402, 1408, 1385, 1383, 1619, 1413, 1423, 1428, 1433, 1686, 1686, 1270, 1686, 1338, 1686, 1440, 1686, 1686, 1686, 1499, 1465, 1686, 1686, 1686, 1639, 1473, 1884, 1686, 1686, 1293, 1864, 1686, 1686, 1296, 1321, 1483, 1686, 1686, 1686, 1646, 1686, 1748, 1496, 1686, 1418, 1675, 1686, 1418, 1702, 1686, 1418, 1981, 1686, 1429, 1409, 1427, 1504, 1692, 1686, 1686, 1313, 1448, 1651, 1508, 1686, 1686, 1340, 1686, 1903, 1686, 1686, 1435, 1513, 1686, 1283, 1287, 1519, 1686, 1524, 1363, 1568, 1938, 1539, 1566, 1579, 1479, 1533, 1538, 1553, 1544, 1552, 1557, 1563, 1574, 1557, 1583, 1589, 1590, 1759, 1594, 1603, 1607, 1611, 1686, 1436, 1514, 1686, 1434, 1656, 1686, 1434, 1680, 1686, 1453, 1686, 1686, 1686, 1559, 1617, 1686, 1770, 1418, 1623, 1769, 1629, 1686, 1515, 1335, 1686, 1285, 1686, 1671, 1921, 1650, 1686, 1686, 1344, 1308, 1666, 1686, 1686, 1686, 1659, 1685, 1686, 1686, 1686, 1686, 1241, 1686, 1686, 1844, 1691, 1686, 1630, 1977, 1970, 1362, 1686, 1686, 1686, 1693, 1698, 1686, 1686, 1686, 1697, 1686, 1764, 1715, 1686, 1634, 1638, 1686, 1599, 1585, 1686, 1271, 1686, 1269, 1686, 1721, 1686, 1686, 1354, 1686, 1801, 1686, 1799, 1686, 1640, 1686, 1686, 1461, 1686, 1686, 1732, 1686, 1944, 1686, 1740, 1686, 1746, 1415, 1396, 1686, 1598, 1547, 1417, 1597, 1416, 1577, 1546, 1397, 1577, 1547, 1548, 1570, 1398, 1753, 1686, 1652, 1509, 1686, 1686, 1686, 1757, 1686, 1419, 1686, 1763, 1418, 1768, 1781, 1686, 1686, 1686, 1705, 1686, 2048, 1792, 1686, 1686, 1686, 1735, 1686, 1797, 1686, 1686, 1404, 1686, 1639, 1815, 1686, 1686, 1418, 2017, 1820, 1686, 1686, 1803, 1686, 1686, 1686, 1736, 1489, 1686, 1686, 1825, 1338, 1260, 1263, 1686, 1686, 1785, 1686, 1686, 1728, 1686, 1686, 1749, 1497, 1830, 1830, 1262, 1248, 1261, 1329, 1260, 1264, 1329, 1248, 1249, 1259, 1540, 1849, 1842, 1686, 1686, 1835, 1686, 1686, 1816, 1686, 1686, 1831, 1882, 1848, 1686, 1686, 1686, 1774, 2071, 1854, 1686, 1686, 1469, 1884, 1686, 1821, 1859, 1686, 1686, 1350, 1883, 1686, 1686, 1686, 1781, 1391, 1875, 1686, 1686, 1613, 1644, 1686, 1686, 1889, 1686, 1686, 1662, 1884, 1686, 1885, 1890, 1686, 1686, 1686, 1894, 1686, 1686, 1678, 1686, 1907, 1686, 1686, 1529, 1914, 1686, 1838, 1686, 1686, 1881, 1686, 1686, 1872, 1876, 1836, 1919, 1686, 1837, 1692, 1910, 1686, 1925, 1928, 1742, 1686, 1811, 1811, 1930, 1810, 1929, 1935, 1928, 1900, 1942, 1867, 1868, 1931, 1035, 1788, 1948, 1952, 1956, 1960, 1964, 1686, 1976, 1686, 1686, 1686, 2065, 1686, 1992, 2037, 1686, 1686, 1998, 2009, 1972, 2002, 1686, 1686, 1686, 2077, 1300, 2023, 1686, 1686, 1686, 1807, 2031, 1686, 1686, 1686, 1860, 1500, 2032, 1686, 1686, 1686, 2083, 1686, 2036, 1686, 1277, 1276, 2042, 1877, 1686, 1686, 2041, 1686, 1686, 2027, 2037, 2012, 1686, 2012, 1855, 1850, 1686, 2046, 1686, 1686, 2054, 1996, 1686, 1897, 1309, 2059, 2052, 1686, 2058, 1686, 1686, 2081, 1686, 1717, 1477, 1686, 1331, 1686, 1686, 1687, 1686, 1860, 1681, 1686, 1686, 1686, 1966, 1724, 1686, 1686, 1686, 1984, 2015, 1686, 1686, 1686, 1988, 1686, 2063, 1686, 1686, 1686, 2005, 1686, 1727, 1686, 1686, 1711, 1457, 2069, 1686, 1686, 1686, 2019, 2075, 1686, 1686, 1915, 1686, 1686, 1793, 1874, 1686, 1686, 1491, 1362, 1449, 1686, 1686, 1460, 2098, 2087, 2091, 2095, 2184, 2102, 2113, 2780, 2117, 2134, 2142, 2281, 2146, 2146, 2146, 2304, 2296, 2181, 2639, 2591, 2872, 2592, 2873, 2313, 2195, 2200, 2281, 2146, 2273, 2226, 2204, 2152, 2219, 2276, 2167, 2177, 2276, 2235, 2276, 2276, 2230, 2281, 2276, 2296, 2276, 2293, 2276, 2276, 2276, 2276, 2234, 2276, 2311, 2314, 2210, 2199, 2217, 2222, 2276, 2276, 2276, 2240, 2276, 2294, 2276, 2276, 2173, 2276, 2198, 2281, 2281, 2281, 2281, 2282, 2146, 2146, 2146, 2146, 2205, 2146, 2204, 2248, 2276, 2235, 2276, 2297, 2276, 2276, 2276, 2277, 2256, 2281, 2283, 2146, 2146, 2146, 2275, 2276, 2295, 2276, 2276, 2293, 2146, 2304, 2264, 2269, 2221, 2276, 2276, 2276, 2293, 2295, 2276, 2276, 2276, 2295, 2263, 2205, 2268, 2220, 2172, 2276, 2276, 2276, 2296, 2276, 2276, 2296, 2294, 2276, 2276, 2278, 2281, 2281, 2280, 2281, 2281, 2281, 2283, 2206, 2223, 2276, 2276, 2279, 2281, 2281, 2146, 2273, 2276, 2276, 2281, 2281, 2281, 2276, 2292, 2276, 2298, 2225, 2276, 2298, 2169, 2224, 2292, 2298, 2171, 2229, 2281, 2281, 2171, 2236, 2281, 2281, 2281, 2146, 2275, 2225, 2292, 2299, 2276, 2229, 2281, 2146, 2276, 2290, 2297, 2283, 2146, 2146, 2274, 2224, 2227, 2298, 2225, 2297, 2276, 2230, 2170, 2230, 2282, 2146, 2147, 2151, 2156, 2288, 2276, 2230, 2303, 2308, 2236, 2284, 2228, 2318, 2318, 2318, 2326, 2335, 2339, 2343, 2349, 2416, 2693, 2357, 2592, 2109, 2592, 2592, 2162, 2943, 2823, 2646, 2592, 2361, 2592, 2122, 2592, 2592, 2122, 2470, 2592, 2592, 2592, 2109, 2107, 2592, 2592, 2592, 2123, 2592, 2592, 2592, 2125, 2592, 2413, 2592, 2592, 2592, 2127, 2592, 2592, 2414, 2592, 2592, 2592, 2130, 2952, 2592, 2594, 2592, 2592, 2212, 2609, 2252, 2592, 2592, 2592, 2446, 2434, 2592, 2592, 2592, 2212, 2446, 2450, 2456, 2431, 2435, 2592, 2592, 2243, 2478, 2448, 2439, 2946, 2592, 2592, 2592, 2368, 2809, 2813, 2450, 2441, 2212, 2812, 2449, 2440, 2947, 2592, 2592, 2592, 2345, 2451, 2457, 2948, 2592, 2124, 2592, 2592, 2650, 2823, 2449, 2455, 2946, 2592, 2128, 2592, 2592, 2649, 2952, 2592, 2810, 2448, 2461, 2991, 2467, 2592, 2592, 2329, 2817, 2474, 2990, 2466, 2592, 2592, 2373, 2447, 2992, 2469, 2592, 2592, 2592, 2373, 2447, 2477, 2468, 2592, 2592, 2353, 2469, 2592, 2495, 2592, 2592, 2415, 2483, 2592, 2415, 2496, 2592, 2592, 2352, 2592, 2592, 2352, 2352, 2469, 2592, 2592, 2363, 2331, 2494, 2592, 2592, 2592, 2375, 2592, 2375, 2415, 2504, 2592, 2592, 2367, 2372, 2503, 2592, 2592, 2592, 2389, 2418, 2415, 2592, 2592, 2373, 2592, 2592, 2592, 2593, 2732, 2417, 2415, 2592, 2417, 2520, 2592, 2592, 2592, 2390, 2521, 2521, 2592, 2592, 2592, 2401, 2599, 2585, 2526, 2531, 2120, 2592, 2212, 2426, 2450, 2463, 2948, 2592, 2592, 2592, 2213, 2389, 2527, 2532, 2121, 2542, 2551, 2105, 2592, 2213, 2592, 2592, 2592, 2558, 2538, 2544, 2553, 2557, 2537, 2543, 2552, 2421, 2572, 2576, 2546, 2543, 2547, 2592, 2592, 2373, 2615, 2575, 2545, 2105, 2592, 2244, 2479, 2592, 2129, 2592, 2592, 2628, 2690, 2469, 2562, 2566, 2592, 2592, 2592, 2415, 2928, 2934, 2401, 2570, 2574, 2564, 2572, 2585, 2590, 2592, 2592, 2585, 2965, 2592, 2592, 2592, 2445, 2251, 2592, 2592, 2592, 2474, 2592, 2609, 2892, 2592, 2362, 2592, 2592, 2138, 2851, 2159, 2592, 2592, 2592, 2509, 2888, 2892, 2592, 2592, 2592, 2490, 2418, 2891, 2592, 2592, 2376, 2592, 2592, 2374, 2592, 2889, 2388, 2592, 2373, 2373, 2890, 2592, 2592, 2387, 2592, 2887, 2505, 2892, 2592, 2373, 2610, 2388, 2592, 2592, 2376, 2373, 2592, 2887, 2891, 2592, 2374, 2592, 2592, 2608, 2159, 2614, 2620, 2592, 2592, 2394, 2594, 2887, 2399, 2592, 2887, 2397, 2508, 2374, 2507, 2592, 2375, 2592, 2592, 2592, 2595, 2508, 2506, 2592, 2506, 2505, 2505, 2592, 2507, 2637, 2505, 2592, 2592, 2401, 2661, 2592, 2643, 2592, 2592, 2417, 2592, 2655, 2592, 2592, 2592, 2510, 2414, 2656, 2592, 2592, 2592, 2516, 2592, 2593, 2660, 2665, 2880, 2592, 2592, 2592, 2522, 2767, 2666, 2881, 2592, 2592, 2420, 2571, 2696, 2592, 2592, 2592, 2580, 2572, 2686, 2632, 2698, 2592, 2383, 2514, 2592, 2163, 2932, 2465, 2685, 2631, 2697, 2592, 2388, 2592, 2592, 2212, 2604, 2671, 2632, 2678, 2592, 2401, 2405, 2409, 2592, 2592, 2592, 2679, 2592, 2592, 2592, 2592, 2108, 2677, 2591, 2592, 2592, 2592, 2419, 2592, 2683, 2187, 2191, 2469, 2671, 2189, 2467, 2592, 2401, 2629, 2633, 2702, 2468, 2592, 2592, 2421, 2536, 2703, 2469, 2592, 2592, 2422, 2573, 2593, 2672, 2467, 2592, 2402, 2406, 2592, 2402, 2979, 2592, 2592, 2626, 2673, 2467, 2592, 2446, 2259, 2947, 2592, 2377, 2709, 2592, 2592, 2522, 2862, 2713, 2468, 2592, 2592, 2581, 2572, 2562, 2374, 2374, 2592, 2376, 2721, 2724, 2592, 2592, 2624, 2373, 2731, 2592, 2592, 2592, 2626, 2732, 2592, 2592, 2592, 2755, 2656, 2726, 2736, 2741, 2592, 2486, 2593, 2381, 2592, 2727, 2737, 2742, 2715, 2747, 2753, 2592, 2498, 2469, 2873, 2743, 2592, 2592, 2592, 2791, 2759, 2763, 2592, 2592, 2627, 2704, 2592, 2592, 2522, 2789, 2593, 2761, 2753, 2592, 2498, 2863, 2592, 2592, 2767, 2592, 2592, 2592, 2792, 2789, 2592, 2592, 2592, 2803, 2126, 2592, 2592, 2592, 2811, 2122, 2592, 2592, 2592, 2834, 2777, 2592, 2592, 2592, 2848, 2936, 2591, 2489, 2797, 2592, 2592, 2670, 2631, 2490, 2798, 2592, 2592, 2592, 2963, 2807, 2592, 2592, 2592, 2965, 2838, 2592, 2592, 2592, 2975, 2330, 2818, 2829, 2592, 2498, 2939, 2592, 2498, 2592, 2791, 2331, 2819, 2830, 2592, 2592, 2592, 2982, 2834, 2817, 2828, 2106, 2592, 2592, 2592, 2405, 2405, 2817, 2828, 2592, 2592, 2415, 2849, 2842, 2592, 2522, 2773, 2592, 2522, 2868, 2592, 2580, 2600, 2586, 2137, 2850, 2843, 2592, 2592, 2855, 2937, 2844, 2592, 2592, 2592, 2987, 2936, 2591, 2592, 2592, 2684, 2630, 2592, 2856, 2938, 2592, 2592, 2860, 2939, 2592, 2592, 2872, 2592, 2861, 2591, 2592, 2592, 2887, 2616, 2592, 2867, 2592, 2592, 2708, 2592, 2498, 2469, 2498, 2497, 2785, 2773, 2499, 2783, 2770, 2877, 2877, 2877, 2772, 2592, 2592, 2345, 2885, 2592, 2592, 2592, 2715, 2762, 2515, 2896, 2592, 2592, 2715, 2917, 2516, 2897, 2592, 2592, 2592, 2901, 2906, 2911, 2592, 2592, 2956, 2960, 2715, 2902, 2907, 2912, 2593, 2916, 2920, 2820, 2922, 2822, 2592, 2592, 2715, 2927, 2921, 2821, 2106, 2592, 2592, 2974, 2408, 2321, 2821, 2106, 2592, 2592, 2983, 2592, 2593, 2404, 2408, 2592, 2592, 2717, 2749, 2716, 2928, 2322, 2822, 2593, 2926, 2919, 2820, 2934, 2823, 2592, 2592, 2592, 2651, 2824, 2592, 2592, 2592, 2130, 2952, 2592, 2592, 2592, 2592, 2964, 2592, 2592, 2716, 2748, 2592, 2969, 2592, 2592, 2716, 2918, 2368, 2970, 2592, 2592, 2592, 2403, 2407, 2592, 2592, 2787, 2211, 2404, 2409, 2592, 2592, 2802, 2837, 2987, 2592, 2592, 2592, 2809, 2427, 2592, 2793, 2592, 2592, 2809, 2447, 1073741824, 0x80000000, 539754496, 542375936, 402653184, 554434560, 571736064, 545521856, 268451840, 335544320, 268693630, 512, 2048, 256, 1024, 0, 1024, 0, 1073741824, 0x80000000, 0, 0, 0, 8388608, 0, 0, 1073741824, 1073741824, 0, 0x80000000, 537133056, 4194304, 1048576, 268435456, -1073741824, 0, 0, 0, 1048576, 0, 0, 0, 1572864, 0, 0, 0, 4194304, 0, 134217728, 16777216, 0, 0, 32, 64, 98304, 0, 33554432, 8388608, 192, 67108864, 67108864, 67108864, 67108864, 16, 32, 4, 0, 8192, 196608, 196608, 229376, 80, 4096, 524288, 8388608, 0, 0, 32, 128, 256, 24576, 24600, 24576, 24576, 2, 24576, 24576, 24576, 24584, 24592, 24576, 24578, 24576, 24578, 24576, 24576, 16, 512, 2048, 2048, 256, 4096, 32768, 1048576, 4194304, 67108864, 134217728, 268435456, 262144, 134217728, 0, 128, 128, 64, 16384, 16384, 16384, 67108864, 32, 32, 4, 4, 4096, 262144, 134217728, 0, 0, 0, 2, 0, 8192, 131072, 131072, 4096, 4096, 4096, 4096, 24576, 24576, 24576, 8, 8, 24576, 24576, 16384, 16384, 16384, 24576, 24584, 24576, 24576, 24576, 16384, 24576, 536870912, 262144, 0, 0, 32, 2048, 8192, 4, 4096, 4096, 4096, 786432, 8388608, 16777216, 0, 128, 16384, 16384, 16384, 32768, 65536, 2097152, 32, 32, 32, 32, 4, 4, 4, 4, 4, 4096, 67108864, 67108864, 67108864, 24576, 24576, 24576, 24576, 0, 16384, 16384, 16384, 16384, 67108864, 67108864, 8, 67108864, 24576, 8, 8, 8, 24576, 24576, 24576, 24578, 24576, 24576, 24576, 2, 2, 2, 16384, 67108864, 67108864, 67108864, 32, 67108864, 8, 8, 24576, 2048, 0x80000000, 536870912, 262144, 262144, 262144, 67108864, 8, 24576, 16384, 32768, 1048576, 4194304, 25165824, 67108864, 24576, 32770, 2, 4, 112, 512, 98304, 524288, 50, 402653186, 1049090, 1049091, 10, 66, 100925514, 10, 66, 12582914, 0, 0, -1678194207, -1678194207, -1041543218, 0, 32768, 0, 0, 32, 65536, 268435456, 1, 1, 513, 1048577, 0, 12582912, 0, 0, 0, 4, 1792, 0, 0, 0, 7, 29360128, 0, 0, 0, 8, 0, 0, 0, 12, 1, 1, 0, 0, -604102721, -604102721, 4194304, 8388608, 0, 0, 0, 31, 925600, 997981306, 997981306, 997981306, 0, 0, 2048, 8388608, 0, 0, 1, 2, 4, 32, 64, 512, 8192, 0, 0, 0, 245760, 997720064, 0, 0, 0, 32, 0, 0, 0, 3, 12, 16, 32, 8, 112, 3072, 12288, 16384, 32768, 65536, 131072, 7864320, 16777216, 973078528, 0, 0, 65536, 131072, 3670016, 4194304, 16777216, 33554432, 2, 8, 48, 2048, 8192, 16384, 32768, 65536, 131072, 524288, 131072, 524288, 3145728, 4194304, 16777216, 33554432, 65536, 131072, 2097152, 4194304, 16777216, 33554432, 134217728, 268435456, 536870912, 0, 0, 0, 1024, 0, 8, 48, 2048, 8192, 65536, 33554432, 268435456, 536870912, 65536, 268435456, 536870912, 0, 0, 32768, 0, 0, 126, 623104, 65011712, 0, 32, 65536, 536870912, 0, 0, 65536, 524288, 0, 32, 65536, 0, 0, 0, 2048, 0, 0, 0, 15482, 245760, -604102721, 0, 0, 0, 18913, 33062912, 925600, -605028352, 0, 0, 0, 65536, 31, 8096, 131072, 786432, 3145728, 3145728, 12582912, 50331648, 134217728, 268435456, 160, 256, 512, 7168, 131072, 786432, 131072, 786432, 1048576, 2097152, 12582912, 16777216, 268435456, 1073741824, 0x80000000, 12582912, 16777216, 33554432, 268435456, 1073741824, 0x80000000, 3, 12, 16, 160, 256, 7168, 786432, 1048576, 12582912, 16777216, 268435456, 1073741824, 0, 8, 16, 32, 128, 256, 512, 7168, 786432, 1048576, 2097152, 0, 1, 2, 8, 16, 7168, 786432, 1048576, 8388608, 16777216, 16777216, 1073741824, 0, 0, 0, 0, 1, 0, 0, 8, 32, 128, 256, 7168, 8, 32, 0, 3072, 0, 8, 32, 3072, 4096, 524288, 8, 32, 0, 0, 3072, 4096, 0, 2048, 524288, 8388608, 8, 2048, 0, 0, 1, 12, 256, 4096, 32768, 262144, 1048576, 4194304, 67108864, 0, 2048, 0, 2048, 2048, 1073741824, -58805985, -58805985, -58805985, 0, 0, 262144, 0, 0, 32, 4194304, 16777216, 134217728, 4382, 172032, -58982400, 0, 0, 2, 28, 256, 4096, 8192, 8192, 32768, 131072, 262144, 524288, 1, 2, 12, 256, 4096, 0, 0, 4194304, 67108864, 134217728, 805306368, 1073741824, 0, 0, 1, 2, 12, 16, 256, 4096, 1048576, 67108864, 134217728, 268435456, 0, 512, 1048576, 4194304, 201326592, 1879048192, 0, 0, 12, 256, 4096, 134217728, 268435456, 536870912, 12, 256, 268435456, 536870912, 0, 12, 256, 0, 0, 1, 32, 64, 512, 0, 0, 205236961, 205236961, 0, 0, 0, 1, 96, 640, 1, 10976, 229376, 204996608, 0, 640, 2048, 8192, 229376, 1572864, 1572864, 2097152, 201326592, 0, 0, 0, 64, 512, 2048, 229376, 1572864, 201326592, 1572864, 201326592, 0, 0, 1, 4382, 0, 1, 32, 2048, 65536, 131072, 1572864, 201326592, 131072, 1572864, 134217728, 0, 0, 524288, 524288, 0, 0, 0, -68582786, -68582786, -68582786, 0, 0, 2097152, 524288, 0, 524288, 0, 0, 65536, 131072, 1572864, 0, 0, 2, 4, 0, 0, 65011712, -134217728, 0, 0, 0, 0, 2, 4, 120, 512, -268435456, 0, 0, 0, 2, 8, 48, 64, 2048, 8192, 98304, 524288, 2097152, 4194304, 25165824, 33554432, 134217728, 268435456, 0x80000000, 0, 0, 25165824, 33554432, 134217728, 1879048192, 0x80000000, 0, 0, 4, 112, 512, 622592, 65011712, 134217728, -268435456, 16777216, 33554432, 134217728, 1610612736, 0, 0, 0, 64, 98304, 524288, 4194304, 16777216, 33554432, 0, 98304, 524288, 16777216, 33554432, 0, 65536, 524288, 33554432, 536870912, 1073741824, 0, 65536, 524288, 536870912, 1073741824, 0, 0, 65536, 524288, 536870912, 0, 524288, 0, 524288, 524288, 1048576, 2086666240, 0x80000000, 0, -1678194207, 0, 0, 0, 8, 32, 2048, 524288, 8388608, 0, 0, 33062912, 436207616, 0x80000000, 0, 0, 32, 64, 2432, 16384, 32768, 32768, 524288, 3145728, 4194304, 25165824, 25165824, 167772160, 268435456, 0x80000000, 0, 32, 64, 384, 2048, 16384, 32768, 1048576, 2097152, 4194304, 25165824, 32, 64, 128, 256, 2048, 16384, 2048, 16384, 1048576, 4194304, 16777216, 33554432, 134217728, 536870912, 1073741824, 0, 0, 2048, 16384, 4194304, 16777216, 33554432, 134217728, 805306368, 0, 0, 16777216, 134217728, 268435456, 0x80000000, 0, 622592, 622592, 622592, 8807, 8807, 434791, 0, 0, 16777216, 0, 0, 0, 7, 608, 8192, 0, 0, 0, 3, 4, 96, 512, 32, 64, 8192, 0, 0, 16777216, 134217728, 0, 0, 2, 4, 8192, 16384, 65536, 2097152, 33554432, 268435456 +]; + +JSONiqTokenizer.TOKEN = +[ + "(0)", + "ModuleDecl", + "Annotation", + "OptionDecl", + "Operator", + "Variable", + "Tag", + "EndTag", + "PragmaContents", + "DirCommentContents", + "DirPIContents", + "CDataSectionContents", + "AttrTest", + "Wildcard", + "EQName", + "IntegerLiteral", + "DecimalLiteral", + "DoubleLiteral", + "PredefinedEntityRef", + "'\"\"'", + "EscapeApos", + "QuotChar", + "AposChar", + "ElementContentChar", + "QuotAttrContentChar", + "AposAttrContentChar", + "NCName", + "QName", + "S", + "CharRef", + "CommentContents", + "DocTag", + "DocCommentContents", + "EOF", + "'!'", + "'\"'", + "'#'", + "'#)'", + "''''", + "'('", + "'(#'", + "'(:'", + "'(:~'", + "')'", + "'*'", + "'*'", + "','", + "'-->'", + "'.'", + "'/'", + "'/>'", + "':'", + "':)'", + "';'", + "'", + next : "start" + }, { + defaultToken : "comment" + } ] + }; + + xmlUtil.tag(this.$rules, "tag", "start", tagMap); + xmlUtil.tag(this.$rules, "style", "css-start", tagMap); + xmlUtil.tag(this.$rules, "script", "js-start", tagMap); + + this.embedRules(JavaScriptHighlightRules, "js-", [{ + token: "comment", + regex: "\\/\\/.*(?=<\\/script>)", + next: "tag" + }, { + token: "meta.tag", + regex: "<\\/(?=script)", + next: "tag" + }]); + + this.embedRules(CssHighlightRules, "css-", [{ + token: "meta.tag", + regex: "<\\/(?=style)", + next: "tag" + }]); +}; + +oop.inherits(HtmlHighlightRules, TextHighlightRules); + +exports.HtmlHighlightRules = HtmlHighlightRules; +}); + +ace.define('ace/mode/css_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var supportType = exports.supportType = "animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|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|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|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|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index"; +var supportFunction = exports.supportFunction = "rgb|rgba|url|attr|counter|counters"; +var supportConstant = exports.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"; +var supportConstantColor = exports.supportConstantColor = "aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow"; +var supportConstantFonts = exports.supportConstantFonts = "arial|century|comic|courier|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace"; + +var numRe = exports.numRe = "\\-?(?:(?:[0-9]+)|(?:[0-9]*\\.[0-9]+))"; +var pseudoElements = exports.pseudoElements = "(\\:+)\\b(after|before|first-letter|first-line|moz-selection|selection)\\b"; +var pseudoClasses = exports.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"; + +var CssHighlightRules = function() { + + var keywordMapper = this.createKeywordMapper({ + "support.function": supportFunction, + "support.constant": supportConstant, + "support.type": supportType, + "support.constant.color": supportConstantColor, + "support.constant.fonts": supportConstantFonts + }, "text", true); + + var base_ruleset = [ + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "ruleset_comment" + }, { + token : "string", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' + }, { + token : "string", // single line + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" + }, { + token : ["constant.numeric", "keyword"], + regex : "(" + numRe + ")(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 : numRe + }, { + token : "constant.numeric", // hex6 color + regex : "#[a-f0-9]{6}" + }, { + token : "constant.numeric", // hex3 color + regex : "#[a-f0-9]{3}" + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"], + regex : pseudoElements + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"], + regex : pseudoClasses + }, { + token : ["support.function", "string", "support.function"], + regex : "(url\\()(.*)(\\))" + }, { + token : keywordMapper, + regex : "\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*" + }, { + caseInsensitive: true + } + ]; + + var ruleset = lang.copyArray(base_ruleset); + ruleset.unshift({ + token : "paren.rparen", + regex : "\\}", + next: "start" + }); + + var media_ruleset = lang.copyArray( base_ruleset ); + media_ruleset.unshift({ + token : "paren.rparen", + regex : "\\}", + next: "media" + }); + + var base_comment = [{ + token : "comment", // comment spanning whole line + regex : ".+" + }]; + + var comment = lang.copyArray(base_comment); + comment.unshift({ + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "start" + }); + + var media_comment = lang.copyArray(base_comment); + media_comment.unshift({ + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "media" + }); + + var ruleset_comment = lang.copyArray(base_comment); + ruleset_comment.unshift({ + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "ruleset" + }); + + this.$rules = { + "start" : [{ + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment" + }, { + token: "paren.lparen", + regex: "\\{", + next: "ruleset" + }, { + token: "string", + regex: "@.*?{", + next: "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: true + }], + + "media" : [ { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "media_comment" + }, { + token: "paren.lparen", + regex: "\\{", + next: "media_ruleset" + },{ + token: "string", + regex: "\\}", + next: "start" + },{ + 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: true + }], + + "comment" : comment, + + "ruleset" : ruleset, + "ruleset_comment" : ruleset_comment, + + "media_ruleset" : media_ruleset, + "media_comment" : media_comment + }; +}; + +oop.inherits(CssHighlightRules, TextHighlightRules); + +exports.CssHighlightRules = CssHighlightRules; + +}); + +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(require, exports, module) { + + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var JavaScriptHighlightRules = function() { + var keywordMapper = this.createKeywordMapper({ + "variable.language": + "Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|" + // Constructors + "Namespace|QName|XML|XMLList|" + // E4X + "ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|" + + "Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|" + + "Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|" + // Errors + "SyntaxError|TypeError|URIError|" + + "decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|" + // Non-constructor functions + "isNaN|parseFloat|parseInt|" + + "JSON|Math|" + // Other + "this|arguments|prototype|window|document" , // Pseudo + "keyword": + "const|yield|import|get|set|" + + "break|case|catch|continue|default|delete|do|else|finally|for|function|" + + "if|in|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"); + var kwBeforeRe = "case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void"; + var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*\\b"; + + var escapedRe = "\\\\(?:x[0-9a-fA-F]{2}|" + // hex + "u[0-9a-fA-F]{4}|" + // unicode + "[0-2][0-7]{0,2}|" + // oct + "3[0-6][0-7]?|" + // oct + "37[0-7]?|" + // oct + "[4-7][0-7]?|" + //oct + ".)"; + + this.$rules = { + "no_regex" : [ + { + token : "comment", + regex : /\/\/.*$/ + }, + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : /\/\*/, + next : "comment" + }, { + token : "string", + regex : "'(?=.)", + next : "qstring" + }, { + token : "string", + regex : '"(?=.)', + next : "qqstring" + }, { + token : "constant.numeric", // hex + regex : /0[xX][0-9a-fA-F]+\b/ + }, { + token : "constant.numeric", // float + regex : /[+-]?\d+(?:(?:\.\d*)?(?:[eE][+-]?\d+)?)?\b/ + }, { + token : [ + "storage.type", "punctuation.operator", "support.function", + "punctuation.operator", "entity.name.function", "text","keyword.operator" + ], + regex : "(" + identifierRe + ")(\\.)(prototype)(\\.)(" + identifierRe +")(\\s*)(=)", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "keyword.operator", "text", "storage.type", + "text", "paren.lparen" + ], + regex : "(" + identifierRe +")(\\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 : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(function)(\\s+)(" + identifierRe + ")(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "punctuation.operator", + "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\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 : "(?:" + kwBeforeRe + ")\\b", + next : "start" + }, { + token : ["punctuation.operator", "support.function"], + regex : /(\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:opzzzz|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 : ["punctuation.operator", "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)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/ + }, { + token : ["punctuation.operator", "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 : ["storage.type", "punctuation.operator", "support.function.firebug"], + regex : /(console)(\.)(warn|info|log|error|time|timeEnd|assert)\b/ + }, { + token : keywordMapper, + regex : identifierRe + }, { + token : "keyword.operator", + regex : /--|\+\+|[!$%&*+\-~]|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\|\||\?\:|\*=|%=|\+=|\-=|&=|\^=/, + next : "start" + }, { + token : "punctuation.operator", + regex : /\?|\:|\,|\;|\./, + next : "start" + }, { + token : "paren.lparen", + regex : /[\[({]/, + next : "start" + }, { + token : "paren.rparen", + regex : /[\])}]/ + }, { + token : "keyword.operator", + regex : /\/=?/, + next : "start" + }, { + token: "comment", + regex: /^#!.*$/ + } + ], + "start": [ + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment_regex_allowed" + }, { + token : "comment", + regex : "\\/\\/.*$", + next : "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: "/\\w*", + 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.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: identifierRe + }, { + token: "punctuation.operator", + regex: "[, ]+" + }, { + token: "punctuation.operator", + regex: "$" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "comment_regex_allowed" : [ + {token : "comment", regex : "\\*\\/", next : "start"}, + {defaultToken : "comment"} + ], + "comment" : [ + {token : "comment", regex : "\\*\\/", next : "no_regex"}, + {defaultToken : "comment"} + ], + "qqstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + next : "qqstring" + }, { + token : "string", + regex : '"|$', + next : "no_regex" + }, { + defaultToken: "string" + } + ], + "qstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + next : "qstring" + }, { + token : "string", + regex : "'|$", + next : "no_regex" + }, { + defaultToken: "string" + } + ] + }; + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("no_regex") ]); +}; + +oop.inherits(JavaScriptHighlightRules, TextHighlightRules); + +exports.JavaScriptHighlightRules = JavaScriptHighlightRules; +}); + +ace.define('ace/mode/doc_comment_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, { + token : "comment.doc.tag", + regex : "\\bTODO\\b" + }, { + defaultToken : "comment.doc" + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define('ace/mode/xml_util', ['require', 'exports', 'module' ], function(require, exports, module) { + + +function string(state) { + return [{ + token : "string", + regex : '"', + next : state + "_qqstring" + }, { + token : "string", + regex : "'", + next : state + "_qstring" + }]; +} + +function multiLineString(quote, state) { + return [ + {token : "string", regex : quote, next : state}, + { + token : "constant.language.escape", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }, + {defaultToken : "string"} + ]; +} + +exports.tag = function(states, name, nextState, tagMap) { + states[name] = [{ + token : "text", + regex : "\\s+" + }, { + + token : !tagMap ? "meta.tag.tag-name" : function(value) { + if (tagMap[value]) + return "meta.tag.tag-name." + tagMap[value]; + else + return "meta.tag.tag-name"; + }, + regex : "[-_a-zA-Z0-9:]+", + next : name + "_embed_attribute_list" + }, { + token: "empty", + regex: "", + next : name + "_embed_attribute_list" + }]; + + states[name + "_qstring"] = multiLineString("'", name + "_embed_attribute_list"); + states[name + "_qqstring"] = multiLineString("\"", name + "_embed_attribute_list"); + + states[name + "_embed_attribute_list"] = [{ + token : "meta.tag.r", + regex : "/?>", + next : nextState + }, { + token : "keyword.operator", + regex : "=" + }, { + token : "entity.other.attribute-name", + regex : "[-_a-zA-Z0-9:]+" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : "text", + regex : "\\s+" + }].concat(string(name)); +}; + +}); +ace.define('ace/mode/java_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/doc_comment_highlight_rules', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var JavaHighlightRules = function() { + var keywords = ( + "abstract|continue|for|new|switch|" + + "assert|default|goto|package|synchronized|" + + "boolean|do|if|private|this|" + + "break|double|implements|protected|throw|" + + "byte|else|import|public|throws|" + + "case|enum|instanceof|return|transient|" + + "catch|extends|int|short|try|" + + "char|final|interface|static|void|" + + "class|finally|long|strictfp|volatile|" + + "const|float|native|super|while" + ); + + var buildinConstants = ("null|Infinity|NaN|undefined"); + + + var langClasses = ( + "AbstractMethodError|AssertionError|ClassCircularityError|"+ + "ClassFormatError|Deprecated|EnumConstantNotPresentException|"+ + "ExceptionInInitializerError|IllegalAccessError|"+ + "IllegalThreadStateException|InstantiationError|InternalError|"+ + "NegativeArraySizeException|NoSuchFieldError|Override|Process|"+ + "ProcessBuilder|SecurityManager|StringIndexOutOfBoundsException|"+ + "SuppressWarnings|TypeNotPresentException|UnknownError|"+ + "UnsatisfiedLinkError|UnsupportedClassVersionError|VerifyError|"+ + "InstantiationException|IndexOutOfBoundsException|"+ + "ArrayIndexOutOfBoundsException|CloneNotSupportedException|"+ + "NoSuchFieldException|IllegalArgumentException|NumberFormatException|"+ + "SecurityException|Void|InheritableThreadLocal|IllegalStateException|"+ + "InterruptedException|NoSuchMethodException|IllegalAccessException|"+ + "UnsupportedOperationException|Enum|StrictMath|Package|Compiler|"+ + "Readable|Runtime|StringBuilder|Math|IncompatibleClassChangeError|"+ + "NoSuchMethodError|ThreadLocal|RuntimePermission|ArithmeticException|"+ + "NullPointerException|Long|Integer|Short|Byte|Double|Number|Float|"+ + "Character|Boolean|StackTraceElement|Appendable|StringBuffer|"+ + "Iterable|ThreadGroup|Runnable|Thread|IllegalMonitorStateException|"+ + "StackOverflowError|OutOfMemoryError|VirtualMachineError|"+ + "ArrayStoreException|ClassCastException|LinkageError|"+ + "NoClassDefFoundError|ClassNotFoundException|RuntimeException|"+ + "Exception|ThreadDeath|Error|Throwable|System|ClassLoader|"+ + "Cloneable|Class|CharSequence|Comparable|String|Object" + ); + + var keywordMapper = this.createKeywordMapper({ + "variable.language": "this", + "keyword": keywords, + "constant.language": buildinConstants, + "support.function": langClasses + }, "identifier"); + + this.$rules = { + "start" : [ + { + token : "comment", + regex : "\\/\\/.*$" + }, + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment" + }, { + token : "string.regexp", + regex : "[/](?:(?:\\[(?:\\\\]|[^\\]])+\\])|(?:\\\\/|[^\\]/]))*[/]\\w*\\s*(?=[).,;]|$)" + }, { + token : "string", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' + }, { + token : "string", // single line + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" + }, { + token : "constant.numeric", // hex + regex : "0[xX][0-9a-fA-F]+\\b" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : "constant.language.boolean", + regex : "(?:true|false)\\b" + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "keyword.operator", + regex : "!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)" + }, { + token : "lparen", + regex : "[[({]" + }, { + token : "rparen", + regex : "[\\])}]" + }, { + token : "text", + regex : "\\s+" + } + ], + "comment" : [ + { + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "start" + }, { + token : "comment", // comment spanning whole line + regex : ".+" + } + ] + }; + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("start") ]); +}; + +oop.inherits(JavaHighlightRules, TextHighlightRules); + +exports.JavaHighlightRules = JavaHighlightRules; +}); + +ace.define('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) { + + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define('ace/mode/behaviour/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/token_iterator', 'ace/lib/lang'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; +var lang = require("../../lib/lang"); + +var SAFE_INSERT_IN_TOKENS = + ["text", "paren.rparen", "punctuation.operator"]; +var SAFE_INSERT_BEFORE_TOKENS = + ["text", "paren.rparen", "punctuation.operator", "comment"]; + + +var autoInsertedBrackets = 0; +var autoInsertedRow = -1; +var autoInsertedLineEnd = ""; +var maybeInsertedBrackets = 0; +var maybeInsertedRow = -1; +var maybeInsertedLineStart = ""; +var maybeInsertedLineEnd = ""; + +var CstyleBehaviour = function () { + + CstyleBehaviour.isSaneInsertion = function(editor, session) { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + if (!this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) { + var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1); + if (!this.$matchTokenType(iterator2.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) + return false; + } + iterator.stepForward(); + return iterator.getCurrentTokenRow() !== cursor.row || + this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_BEFORE_TOKENS); + }; + + CstyleBehaviour.$matchTokenType = function(token, types) { + return types.indexOf(token.type || token) > -1; + }; + + CstyleBehaviour.recordAutoInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isAutoInsertedClosing(cursor, line, autoInsertedLineEnd[0])) + autoInsertedBrackets = 0; + autoInsertedRow = cursor.row; + autoInsertedLineEnd = bracket + line.substr(cursor.column); + autoInsertedBrackets++; + }; + + CstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isMaybeInsertedClosing(cursor, line)) + maybeInsertedBrackets = 0; + maybeInsertedRow = cursor.row; + maybeInsertedLineStart = line.substr(0, cursor.column) + bracket; + maybeInsertedLineEnd = line.substr(cursor.column); + maybeInsertedBrackets++; + }; + + CstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) { + return autoInsertedBrackets > 0 && + cursor.row === autoInsertedRow && + bracket === autoInsertedLineEnd[0] && + line.substr(cursor.column) === autoInsertedLineEnd; + }; + + CstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) { + return maybeInsertedBrackets > 0 && + cursor.row === maybeInsertedRow && + line.substr(cursor.column) === maybeInsertedLineEnd && + line.substr(0, cursor.column) == maybeInsertedLineStart; + }; + + CstyleBehaviour.popAutoInsertedClosing = function() { + autoInsertedLineEnd = autoInsertedLineEnd.substr(1); + autoInsertedBrackets--; + }; + + CstyleBehaviour.clearMaybeInsertedClosing = function() { + maybeInsertedBrackets = 0; + maybeInsertedRow = -1; + }; + + this.add("braces", "insertion", function (state, action, editor, session, text) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (text == '{') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "{" && editor.getWrapBehavioursEnabled()) { + return { + text: '{' + selected + '}', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + if (/[\]\}\)]/.test(line[cursor.column])) { + CstyleBehaviour.recordAutoInsert(editor, session, "}"); + return { + text: '{}', + selection: [1, 1] + }; + } else { + CstyleBehaviour.recordMaybeInsert(editor, session, "{"); + return { + text: '{', + selection: [1, 1] + }; + } + } + } else if (text == '}') { + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}') { + var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } else if (text == "\n" || text == "\r\n") { + var closing = ""; + if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) { + closing = lang.stringRepeat("}", maybeInsertedBrackets); + CstyleBehaviour.clearMaybeInsertedClosing(); + } + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}' || closing !== "") { + var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column}, '}'); + if (!openBracePos) + return null; + + var indent = this.getNextLineIndent(state, line.substring(0, cursor.column), session.getTabString()); + var next_indent = this.$getIndent(line); + + return { + text: '\n' + indent + '\n' + next_indent + closing, + selection: [1, indent.length, 1, indent.length] + }; + } + } + }); + + this.add("braces", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '{') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar == '}') { + range.end.column++; + return range; + } else { + maybeInsertedBrackets--; + } + } + }); + + this.add("parens", "insertion", function (state, action, editor, session, text) { + if (text == '(') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return { + text: '(' + selected + ')', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, ")"); + return { + text: '()', + selection: [1, 1] + }; + } + } else if (text == ')') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ')') { + var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("parens", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '(') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ')') { + range.end.column++; + return range; + } + } + }); + + this.add("brackets", "insertion", function (state, action, editor, session, text) { + if (text == '[') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return { + text: '[' + selected + ']', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, "]"); + return { + text: '[]', + selection: [1, 1] + }; + } + } else if (text == ']') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ']') { + var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("brackets", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '[') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ']') { + range.end.column++; + return range; + } + } + }); + + this.add("string_dquotes", "insertion", function (state, action, editor, session, text) { + if (text == '"' || text == "'") { + var quote = text; + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "'" && selected != '"' && editor.getWrapBehavioursEnabled()) { + return { + text: quote + selected + quote, + selection: false + }; + } else { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var leftChar = line.substring(cursor.column-1, cursor.column); + if (leftChar == '\\') { + return null; + } + var tokens = session.getTokens(selection.start.row); + var col = 0, token; + var quotepos = -1; // Track whether we're inside an open quote. + + for (var x = 0; x < tokens.length; x++) { + token = tokens[x]; + if (token.type == "string") { + quotepos = -1; + } else if (quotepos < 0) { + quotepos = token.value.indexOf(quote); + } + if ((token.value.length + col) > selection.start.column) { + break; + } + col += tokens[x].value.length; + } + if (!token || (quotepos < 0 && token.type !== "comment" && (token.type !== "string" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) { + if (!CstyleBehaviour.isSaneInsertion(editor, session)) + return; + return { + text: quote + quote, + selection: [1,1] + }; + } else if (token && token.type === "string") { + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == quote) { + return { + text: '', + selection: [1, 1] + }; + } + } + } + } + }); + + this.add("string_dquotes", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && (selected == '"' || selected == "'")) { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == selected) { + range.end.column++; + return range; + } + } + }); + +}; + +oop.inherits(CstyleBehaviour, Behaviour); + +exports.CstyleBehaviour = CstyleBehaviour; +}); + +ace.define('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var line = session.getLine(row); + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i + match[0].length, 1); + } + + if (foldStyle !== "markbeginend") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + +}).call(FoldMode.prototype); + +}); diff --git a/0.0.3_0/ace/mode-jsx.js b/0.0.3_0/ace/mode-jsx.js new file mode 100644 index 0000000..f9962d7 --- /dev/null +++ b/0.0.3_0/ace/mode-jsx.js @@ -0,0 +1,635 @@ +ace.define('ace/mode/jsx', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/jsx_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/mode/behaviour/cstyle', 'ace/mode/folding/cstyle'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var JsxHighlightRules = require("./jsx_highlight_rules").JsxHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +function Mode() { + this.$tokenizer = new Tokenizer(new JsxHighlightRules().getRules()); + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new CStyleFoldMode(); +} +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.$tokenizer.getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start") { + var match = line.match(/^.*[\{\(\[]\s*$/); + if (match) { + indent += tab; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); +ace.define('ace/mode/jsx_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/doc_comment_highlight_rules', 'ace/mode/text_highlight_rules'], function(require, exports, module) { +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var JsxHighlightRules = function() { + var keywords = lang.arrayToMap( + ("break|do|instanceof|typeof|case|else|new|var|catch|finally|return|void|continue|for|switch|default|while|function|this|" + + "if|throw|" + + "delete|in|try|" + + "class|extends|super|import|from|into|implements|interface|static|mixin|override|abstract|final|" + + "number|int|string|boolean|variant|" + + "log|assert").split("|") + ); + + var buildinConstants = lang.arrayToMap( + ("null|true|false|NaN|Infinity|__FILE__|__LINE__|undefined").split("|") + ); + + var reserved = lang.arrayToMap( + ("debugger|with|" + + "const|export|" + + "let|private|public|yield|protected|" + + "extern|native|as|operator|__fake__|__readonly__").split("|") + ); + + var identifierRe = "[a-zA-Z_][a-zA-Z0-9_]*\\b"; + + this.$rules = { + "start" : [ + { + token : "comment", + regex : "\\/\\/.*$" + }, + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment" + }, { + token : "string.regexp", + regex : "[/](?:(?:\\[(?:\\\\]|[^\\]])+\\])|(?:\\\\/|[^\\]/]))*[/]\\w*\\s*(?=[).,;]|$)" + }, { + token : "string", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' + }, { + token : "string", // single line + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" + }, { + token : "constant.numeric", // hex + regex : "0[xX][0-9a-fA-F]+\\b" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : "constant.language.boolean", + regex : "(?:true|false)\\b" + }, { + token : [ + "storage.type", + "text", + "entity.name.function" + ], + regex : "(function)(\\s+)(" + identifierRe + ")" + }, { + token : function(value) { + if (value == "this") + return "variable.language"; + else if (value == "function") + return "storage.type"; + else if (keywords.hasOwnProperty(value) || reserved.hasOwnProperty(value)) + return "keyword"; + else if (buildinConstants.hasOwnProperty(value)) + return "constant.language"; + else if (/^_?[A-Z][a-zA-Z0-9_]*$/.test(value)) + return "language.support.class"; + else + return "identifier"; + }, + regex : identifierRe + }, { + token : "keyword.operator", + regex : "!|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|==|=|!=|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)" + }, { + token : "punctuation.operator", + regex : "\\?|\\:|\\,|\\;|\\." + }, { + token : "paren.lparen", + regex : "[[({<]" + }, { + token : "paren.rparen", + regex : "[\\])}>]" + }, { + token : "text", + regex : "\\s+" + } + ], + "comment" : [ + { + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "start" + }, { + token : "comment", // comment spanning whole line + regex : ".+" + } + ] + }; + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("start") ]); +}; + +oop.inherits(JsxHighlightRules, TextHighlightRules); + +exports.JsxHighlightRules = JsxHighlightRules; +}); + +ace.define('ace/mode/doc_comment_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, { + token : "comment.doc.tag", + regex : "\\bTODO\\b" + }, { + defaultToken : "comment.doc" + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) { + + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define('ace/mode/behaviour/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/token_iterator', 'ace/lib/lang'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; +var lang = require("../../lib/lang"); + +var SAFE_INSERT_IN_TOKENS = + ["text", "paren.rparen", "punctuation.operator"]; +var SAFE_INSERT_BEFORE_TOKENS = + ["text", "paren.rparen", "punctuation.operator", "comment"]; + + +var autoInsertedBrackets = 0; +var autoInsertedRow = -1; +var autoInsertedLineEnd = ""; +var maybeInsertedBrackets = 0; +var maybeInsertedRow = -1; +var maybeInsertedLineStart = ""; +var maybeInsertedLineEnd = ""; + +var CstyleBehaviour = function () { + + CstyleBehaviour.isSaneInsertion = function(editor, session) { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + if (!this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) { + var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1); + if (!this.$matchTokenType(iterator2.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) + return false; + } + iterator.stepForward(); + return iterator.getCurrentTokenRow() !== cursor.row || + this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_BEFORE_TOKENS); + }; + + CstyleBehaviour.$matchTokenType = function(token, types) { + return types.indexOf(token.type || token) > -1; + }; + + CstyleBehaviour.recordAutoInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isAutoInsertedClosing(cursor, line, autoInsertedLineEnd[0])) + autoInsertedBrackets = 0; + autoInsertedRow = cursor.row; + autoInsertedLineEnd = bracket + line.substr(cursor.column); + autoInsertedBrackets++; + }; + + CstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isMaybeInsertedClosing(cursor, line)) + maybeInsertedBrackets = 0; + maybeInsertedRow = cursor.row; + maybeInsertedLineStart = line.substr(0, cursor.column) + bracket; + maybeInsertedLineEnd = line.substr(cursor.column); + maybeInsertedBrackets++; + }; + + CstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) { + return autoInsertedBrackets > 0 && + cursor.row === autoInsertedRow && + bracket === autoInsertedLineEnd[0] && + line.substr(cursor.column) === autoInsertedLineEnd; + }; + + CstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) { + return maybeInsertedBrackets > 0 && + cursor.row === maybeInsertedRow && + line.substr(cursor.column) === maybeInsertedLineEnd && + line.substr(0, cursor.column) == maybeInsertedLineStart; + }; + + CstyleBehaviour.popAutoInsertedClosing = function() { + autoInsertedLineEnd = autoInsertedLineEnd.substr(1); + autoInsertedBrackets--; + }; + + CstyleBehaviour.clearMaybeInsertedClosing = function() { + maybeInsertedBrackets = 0; + maybeInsertedRow = -1; + }; + + this.add("braces", "insertion", function (state, action, editor, session, text) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (text == '{') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "{" && editor.getWrapBehavioursEnabled()) { + return { + text: '{' + selected + '}', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + if (/[\]\}\)]/.test(line[cursor.column])) { + CstyleBehaviour.recordAutoInsert(editor, session, "}"); + return { + text: '{}', + selection: [1, 1] + }; + } else { + CstyleBehaviour.recordMaybeInsert(editor, session, "{"); + return { + text: '{', + selection: [1, 1] + }; + } + } + } else if (text == '}') { + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}') { + var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } else if (text == "\n" || text == "\r\n") { + var closing = ""; + if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) { + closing = lang.stringRepeat("}", maybeInsertedBrackets); + CstyleBehaviour.clearMaybeInsertedClosing(); + } + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}' || closing !== "") { + var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column}, '}'); + if (!openBracePos) + return null; + + var indent = this.getNextLineIndent(state, line.substring(0, cursor.column), session.getTabString()); + var next_indent = this.$getIndent(line); + + return { + text: '\n' + indent + '\n' + next_indent + closing, + selection: [1, indent.length, 1, indent.length] + }; + } + } + }); + + this.add("braces", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '{') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar == '}') { + range.end.column++; + return range; + } else { + maybeInsertedBrackets--; + } + } + }); + + this.add("parens", "insertion", function (state, action, editor, session, text) { + if (text == '(') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return { + text: '(' + selected + ')', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, ")"); + return { + text: '()', + selection: [1, 1] + }; + } + } else if (text == ')') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ')') { + var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("parens", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '(') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ')') { + range.end.column++; + return range; + } + } + }); + + this.add("brackets", "insertion", function (state, action, editor, session, text) { + if (text == '[') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return { + text: '[' + selected + ']', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, "]"); + return { + text: '[]', + selection: [1, 1] + }; + } + } else if (text == ']') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ']') { + var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("brackets", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '[') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ']') { + range.end.column++; + return range; + } + } + }); + + this.add("string_dquotes", "insertion", function (state, action, editor, session, text) { + if (text == '"' || text == "'") { + var quote = text; + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "'" && selected != '"' && editor.getWrapBehavioursEnabled()) { + return { + text: quote + selected + quote, + selection: false + }; + } else { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var leftChar = line.substring(cursor.column-1, cursor.column); + if (leftChar == '\\') { + return null; + } + var tokens = session.getTokens(selection.start.row); + var col = 0, token; + var quotepos = -1; // Track whether we're inside an open quote. + + for (var x = 0; x < tokens.length; x++) { + token = tokens[x]; + if (token.type == "string") { + quotepos = -1; + } else if (quotepos < 0) { + quotepos = token.value.indexOf(quote); + } + if ((token.value.length + col) > selection.start.column) { + break; + } + col += tokens[x].value.length; + } + if (!token || (quotepos < 0 && token.type !== "comment" && (token.type !== "string" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) { + if (!CstyleBehaviour.isSaneInsertion(editor, session)) + return; + return { + text: quote + quote, + selection: [1,1] + }; + } else if (token && token.type === "string") { + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == quote) { + return { + text: '', + selection: [1, 1] + }; + } + } + } + } + }); + + this.add("string_dquotes", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && (selected == '"' || selected == "'")) { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == selected) { + range.end.column++; + return range; + } + } + }); + +}; + +oop.inherits(CstyleBehaviour, Behaviour); + +exports.CstyleBehaviour = CstyleBehaviour; +}); + +ace.define('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var line = session.getLine(row); + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i + match[0].length, 1); + } + + if (foldStyle !== "markbeginend") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + +}).call(FoldMode.prototype); + +}); diff --git a/0.0.3_0/ace/mode-julia.js b/0.0.3_0/ace/mode-julia.js new file mode 100644 index 0000000..32765cd --- /dev/null +++ b/0.0.3_0/ace/mode-julia.js @@ -0,0 +1,245 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2012, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * + * Contributor(s): + * + * + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/mode/julia', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/julia_highlight_rules', 'ace/mode/folding/cstyle'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var JuliaHighlightRules = require("./julia_highlight_rules").JuliaHighlightRules; +var FoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + var highlighter = new JuliaHighlightRules(); + this.foldingRules = new FoldMode(); + this.$tokenizer = new Tokenizer(highlighter.getRules()); +}; +oop.inherits(Mode, TextMode); + +(function() { + this.lineCommentStart = "#"; + this.blockComment = ""; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/julia_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var JuliaHighlightRules = function() { + + this.$rules = { start: + [ { include: '#function_decl' }, + { include: '#function_call' }, + { include: '#type_decl' }, + { include: '#keyword' }, + { include: '#operator' }, + { include: '#number' }, + { include: '#string' }, + { include: '#comment' } ], + '#bracket': + [ { token: 'keyword.bracket.julia', + regex: '\\(|\\)|\\[|\\]|\\{|\\}|,' } ], + '#comment': + [ { token: + [ 'punctuation.definition.comment.julia', + 'comment.line.number-sign.julia' ], + regex: '(#)(?!\\{)(.*$)'} ], + '#function_call': + [ { token: [ 'support.function.julia', 'text' ], + regex: '([a-zA-Z0-9_]+!?)(\\w*\\()'} ], + '#function_decl': + [ { token: [ 'keyword.other.julia', 'meta.function.julia', + 'entity.name.function.julia', 'meta.function.julia','text' ], + regex: '(function|macro)(\\s*)([a-zA-Z0-9_\\{]+!?)(\\w*)([(\\\\{])'} ], + '#keyword': + [ { token: 'keyword.other.julia', + regex: '\\b(?:function|type|immutable|macro|quote|abstract|bitstype|typealias|module|baremodule|new)\\b' }, + { token: 'keyword.control.julia', + regex: '\\b(?:if|else|elseif|while|for|in|begin|let|end|do|try|catch|finally|return|break|continue)\\b' }, + { token: 'storage.modifier.variable.julia', + regex: '\\b(?:global|local|const|export|import|importall|using)\\b' }, + { token: 'variable.macro.julia', regex: '@\\w+\\b' } ], + '#number': + [ { token: 'constant.numeric.julia', + regex: '\\b0(?:x|X)[0-9a-fA-F]*|(?:\\b[0-9]+\\.?[0-9]*|\\.[0-9]+)(?:(?:e|E)(?:\\+|-)?[0-9]*)?(?:im)?|\\bInf(?:32)?\\b|\\bNaN(?:32)?\\b|\\btrue\\b|\\bfalse\\b' } ], + '#operator': + [ { token: 'keyword.operator.update.julia', + regex: '=|:=|\\+=|-=|\\*=|/=|//=|\\.//=|\\.\\*=|\\\\=|\\.\\\\=|^=|\\.^=|%=|\\|=|&=|\\$=|<<=|>>=' }, + { token: 'keyword.operator.ternary.julia', regex: '\\?|:' }, + { token: 'keyword.operator.boolean.julia', + regex: '\\|\\||&&|!' }, + { token: 'keyword.operator.arrow.julia', regex: '->|<-|-->' }, + { token: 'keyword.operator.relation.julia', + regex: '>|<|>=|<=|==|!=|\\.>|\\.<|\\.>=|\\.>=|\\.==|\\.!=|\\.=|\\.!|<:|:>' }, + { token: 'keyword.operator.range.julia', regex: ':' }, + { token: 'keyword.operator.shift.julia', regex: '<<|>>' }, + { token: 'keyword.operator.bitwise.julia', regex: '\\||\\&|~' }, + { token: 'keyword.operator.arithmetic.julia', + regex: '\\+|-|\\*|\\.\\*|/|\\./|//|\\.//|%|\\.%|\\\\|\\.\\\\|\\^|\\.\\^' }, + { token: 'keyword.operator.isa.julia', regex: '::' }, + { token: 'keyword.operator.dots.julia', + regex: '\\.(?=[a-zA-Z])|\\.\\.+' }, + { token: 'keyword.operator.interpolation.julia', + regex: '\\$#?(?=.)' }, + { token: [ 'variable', 'keyword.operator.transposed-variable.julia' ], + regex: '(\\w+)((?:\'|\\.\')*\\.?\')' }, + { token: 'text', + regex: '\\[|\\('}, + { token: [ 'text', 'keyword.operator.transposed-matrix.julia' ], + regex: "([\\]\\)])((?:'|\\.')*\\.?')"} ], + '#string': + [ { token: 'punctuation.definition.string.begin.julia', + regex: '\'', + push: + [ { token: 'punctuation.definition.string.end.julia', + regex: '\'', + next: 'pop' }, + { include: '#string_escaped_char' }, + { defaultToken: 'string.quoted.single.julia' } ] }, + { token: 'punctuation.definition.string.begin.julia', + regex: '"', + push: + [ { token: 'punctuation.definition.string.end.julia', + regex: '"', + next: 'pop' }, + { include: '#string_escaped_char' }, + { defaultToken: 'string.quoted.double.julia' } ] }, + { token: 'punctuation.definition.string.begin.julia', + regex: '\\b\\w+"', + push: + [ { token: 'punctuation.definition.string.end.julia', + regex: '"\\w*', + next: 'pop' }, + { include: '#string_custom_escaped_char' }, + { defaultToken: 'string.quoted.custom-double.julia' } ] }, + { token: 'punctuation.definition.string.begin.julia', + regex: '`', + push: + [ { token: 'punctuation.definition.string.end.julia', + regex: '`', + next: 'pop' }, + { include: '#string_escaped_char' }, + { defaultToken: 'string.quoted.backtick.julia' } ] } ], + '#string_custom_escaped_char': [ { token: 'constant.character.escape.julia', regex: '\\\\"' } ], + '#string_escaped_char': + [ { token: 'constant.character.escape.julia', + regex: '\\\\(?:\\\\|[0-3]\\d{,2}|[4-7]\\d?|x[a-fA-F0-9]{,2}|u[a-fA-F0-9]{,4}|U[a-fA-F0-9]{,8}|.)' } ], + '#type_decl': + [ { token: + [ 'keyword.control.type.julia', + 'meta.type.julia', + 'entity.name.type.julia', + 'entity.other.inherited-class.julia', + 'punctuation.separator.inheritance.julia', + 'entity.other.inherited-class.julia' ], + regex: '(type|immutable)(\\s+)([a-zA-Z0-9_]+)(?:(\\s*)(<:)(\\s*[.a-zA-Z0-9_:]+))?' }, + { token: [ 'other.typed-variable.julia', 'support.type.julia' ], + regex: '([a-zA-Z0-9_]+)(::[a-zA-Z0-9_{}]+)' } ] } + + this.normalizeRules(); +}; + +JuliaHighlightRules.metaData = { fileTypes: [ 'jl' ], + firstLineMatch: '^#!.*\\bjulia\\s*$', + foldingStartMarker: '^\\s*(?:if|while|for|begin|function|macro|module|baremodule|type|immutable|let)\\b(?!.*\\bend\\b).*$', + foldingStopMarker: '^\\s*(?:end)\\b.*$', + name: 'Julia', + scopeName: 'source.julia' } + + +oop.inherits(JuliaHighlightRules, TextHighlightRules); + +exports.JuliaHighlightRules = JuliaHighlightRules; +}); + +ace.define('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var line = session.getLine(row); + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i + match[0].length, 1); + } + + if (foldStyle !== "markbeginend") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + +}).call(FoldMode.prototype); + +}); diff --git a/0.0.3_0/ace/mode-latex.js b/0.0.3_0/ace/mode-latex.js new file mode 100644 index 0000000..d19d359 --- /dev/null +++ b/0.0.3_0/ace/mode-latex.js @@ -0,0 +1,189 @@ +ace.define('ace/mode/latex', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/latex_highlight_rules', 'ace/mode/folding/latex', 'ace/range'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var LatexHighlightRules = require("./latex_highlight_rules").LatexHighlightRules; +var LatexFoldMode = require("./folding/latex").FoldMode; +var Range = require("../range").Range; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new LatexHighlightRules().getRules()); + this.foldingRules = new LatexFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + this.lineCommentStart = "%"; + +}).call(Mode.prototype); + +exports.Mode = Mode; + +}); +ace.define('ace/mode/latex_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var LatexHighlightRules = function() { + this.$rules = { + "start" : [{ + token : "keyword", + regex : "\\\\(?:[^a-zA-Z]|[a-zA-Z]+)" + }, { + token : "lparen", + regex : "[[({]" + }, { + token : "rparen", + regex : "[\\])}]" + }, { + token : "string", + regex : "\\$(?:(?:\\\\.)|(?:[^\\$\\\\]))*?\\$" + }, { + token : "comment", + regex : "%.*$" + }] + }; +}; + +oop.inherits(LatexHighlightRules, TextHighlightRules); + +exports.LatexHighlightRules = LatexHighlightRules; + +}); + +ace.define('ace/mode/folding/latex', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/folding/fold_mode', 'ace/range', 'ace/token_iterator'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var BaseFoldMode = require("./fold_mode").FoldMode; +var Range = require("../../range").Range; +var TokenIterator = require("../../token_iterator").TokenIterator; + +var FoldMode = exports.FoldMode = function() {}; + +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /^\s*\\(begin)|(section|subsection)\b|{\s*$/; + this.foldingStopMarker = /^\s*\\(end)\b|^\s*}/; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var line = session.doc.getLine(row); + var match = this.foldingStartMarker.exec(line); + if (match) { + if (match[1]) + return this.latexBlock(session, row, match[0].length - 1); + if (match[2]) + return this.latexSection(session, row, match[0].length - 1); + + return this.openingBracketBlock(session, "{", row, match.index); + } + + var match = this.foldingStopMarker.exec(line); + if (match) { + if (match[1]) + return this.latexBlock(session, row, match[0].length - 1); + + return this.closingBracketBlock(session, "}", row, match.index + match[0].length); + } + }; + + this.latexBlock = function(session, row, column) { + var keywords = { + "\\begin": 1, + "\\end": -1 + }; + + var stream = new TokenIterator(session, row, column); + var token = stream.getCurrentToken(); + if (!token || token.type !== "keyword") + return; + + var val = token.value; + var dir = keywords[val]; + + var getType = function() { + var token = stream.stepForward(); + var type = token.type == "lparen" ?stream.stepForward().value : ""; + if (dir === -1) { + stream.stepBackward(); + if (type) + stream.stepBackward(); + } + return type; + }; + var stack = [getType()]; + var startColumn = dir === -1 ? stream.getCurrentTokenColumn() : session.getLine(row).length; + var startRow = row; + + stream.step = dir === -1 ? stream.stepBackward : stream.stepForward; + while(token = stream.step()) { + if (token.type !== "keyword") + continue; + var level = keywords[token.value]; + if (!level) + continue; + var type = getType(); + if (level === dir) + stack.unshift(type); + else if (stack.shift() !== type || !stack.length) + break; + } + + if (stack.length) + return; + + var row = stream.getCurrentTokenRow(); + if (dir === -1) + return new Range(row, session.getLine(row).length, startRow, startColumn); + stream.stepBackward(); + return new Range(startRow, startColumn, row, stream.getCurrentTokenColumn()); + }; + + this.latexSection = function(session, row, column) { + var keywords = ["\\subsection", "\\section", "\\begin", "\\end"]; + + var stream = new TokenIterator(session, row, column); + var token = stream.getCurrentToken(); + if (!token || token.type != "keyword") + return; + + var startLevel = keywords.indexOf(token.value); + var stackDepth = 0 + var endRow = row; + + while(token = stream.stepForward()) { + if (token.type !== "keyword") + continue; + var level = keywords.indexOf(token.value); + + if (level >= 2) { + if (!stackDepth) + endRow = stream.getCurrentTokenRow() - 1; + stackDepth += level == 2 ? 1 : - 1; + if (stackDepth < 0) + break + } else if (level >= startLevel) + break; + } + + if (!stackDepth) + endRow = stream.getCurrentTokenRow() - 1; + + while (endRow > row && !/\S/.test(session.getLine(endRow))) + endRow--; + + return new Range( + row, session.getLine(row).length, + endRow, session.getLine(endRow).length + ); + }; + +}).call(FoldMode.prototype); + +}); diff --git a/0.0.3_0/ace/mode-less.js b/0.0.3_0/ace/mode-less.js new file mode 100644 index 0000000..4b78a8f --- /dev/null +++ b/0.0.3_0/ace/mode-less.js @@ -0,0 +1,807 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2010, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/mode/less', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/less_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/mode/behaviour/css', 'ace/mode/folding/cstyle'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var LessHighlightRules = require("./less_highlight_rules").LessHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var CssBehaviour = require("./behaviour/css").CssBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new LessHighlightRules().getRules()); + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CssBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + var tokens = this.$tokenizer.getLineTokens(line, state).tokens; + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + var match = line.match(/^.*\{\s*$/); + if (match) { + indent += tab; + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; + +}); + +ace.define('ace/mode/less_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var LessHighlightRules = function() { + + var properties = lang.arrayToMap( (function () { + + var browserPrefix = ("-webkit-|-moz-|-o-|-ms-|-svg-|-pie-|-khtml-").split("|"); + + var prefixProperties = ("appearance|background-clip|background-inline-policy|background-origin|" + + "background-size|binding|border-bottom-colors|border-left-colors|" + + "border-right-colors|border-top-colors|border-end|border-end-color|" + + "border-end-style|border-end-width|border-image|border-start|" + + "border-start-color|border-start-style|border-start-width|box-align|" + + "box-direction|box-flex|box-flexgroup|box-ordinal-group|box-orient|" + + "box-pack|box-sizing|column-count|column-gap|column-width|column-rule|" + + "column-rule-width|column-rule-style|column-rule-color|float-edge|" + + "font-feature-settings|font-language-override|force-broken-image-icon|" + + "image-region|margin-end|margin-start|opacity|outline|outline-color|" + + "outline-offset|outline-radius|outline-radius-bottomleft|" + + "outline-radius-bottomright|outline-radius-topleft|outline-radius-topright|" + + "outline-style|outline-width|padding-end|padding-start|stack-sizing|" + + "tab-size|text-blink|text-decoration-color|text-decoration-line|" + + "text-decoration-style|transform|transform-origin|transition|" + + "transition-delay|transition-duration|transition-property|" + + "transition-timing-function|user-focus|user-input|user-modify|user-select|" + + "window-shadow|border-radius").split("|"); + + var properties = ("azimuth|background-attachment|background-color|background-image|" + + "background-position|background-repeat|background|border-bottom-color|" + + "border-bottom-style|border-bottom-width|border-bottom|border-collapse|" + + "border-color|border-left-color|border-left-style|border-left-width|" + + "border-left|border-right-color|border-right-style|border-right-width|" + + "border-right|border-spacing|border-style|border-top-color|" + + "border-top-style|border-top-width|border-top|border-width|border|" + + "bottom|box-sizing|caption-side|clear|clip|color|content|counter-increment|" + + "counter-reset|cue-after|cue-before|cue|cursor|direction|display|" + + "elevation|empty-cells|float|font-family|font-size-adjust|font-size|" + + "font-stretch|font-style|font-variant|font-weight|font|height|left|" + + "letter-spacing|line-height|list-style-image|list-style-position|" + + "list-style-type|list-style|margin-bottom|margin-left|margin-right|" + + "margin-top|marker-offset|margin|marks|max-height|max-width|min-height|" + + "min-width|opacity|orphans|outline-color|" + + "outline-style|outline-width|outline|overflow|overflow-x|overflow-y|padding-bottom|" + + "padding-left|padding-right|padding-top|padding|page-break-after|" + + "page-break-before|page-break-inside|page|pause-after|pause-before|" + + "pause|pitch-range|pitch|play-during|position|quotes|richness|right|" + + "size|speak-header|speak-numeral|speak-punctuation|speech-rate|speak|" + + "stress|table-layout|text-align|text-decoration|text-indent|" + + "text-shadow|text-transform|top|unicode-bidi|vertical-align|" + + "visibility|voice-family|volume|white-space|widows|width|word-spacing|" + + "z-index").split("|"); + var ret = []; + for (var i=0, ln=browserPrefix.length; i|<=|>=|==|!=|-|%|#|\\+|\\$|\\+|\\*" + }, { + token : "paren.lparen", + regex : "[[({]" + }, { + token : "paren.rparen", + regex : "[\\])}]" + }, { + token : "text", + regex : "\\s+" + }, { + caseInsensitive: true + } + ], + "comment" : [ + { + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "start" + }, { + token : "comment", // comment spanning whole line + regex : ".+" + } + ] + }; +}; + +oop.inherits(LessHighlightRules, TextHighlightRules); + +exports.LessHighlightRules = LessHighlightRules; + +}); + +ace.define('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) { + + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define('ace/mode/behaviour/css', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/mode/behaviour/cstyle', 'ace/token_iterator'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var CstyleBehaviour = require("./cstyle").CstyleBehaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; + +var CssBehaviour = function () { + + this.inherit(CstyleBehaviour); + + this.add("colon", "insertion", function (state, action, editor, session, text) { + if (text === ':') { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + if (token && token.value.match(/\s+/)) { + token = iterator.stepBackward(); + } + if (token && token.type === 'support.type') { + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar === ':') { + return { + text: '', + selection: [1, 1] + } + } + if (!line.substring(cursor.column).match(/^\s*;/)) { + return { + text: ':;', + selection: [1, 1] + } + } + } + } + }); + + this.add("colon", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected === ':') { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + if (token && token.value.match(/\s+/)) { + token = iterator.stepBackward(); + } + if (token && token.type === 'support.type') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar === ';') { + range.end.column ++; + return range; + } + } + } + }); + + this.add("semicolon", "insertion", function (state, action, editor, session, text) { + if (text === ';') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar === ';') { + return { + text: '', + selection: [1, 1] + } + } + } + }); + +} +oop.inherits(CssBehaviour, CstyleBehaviour); + +exports.CssBehaviour = CssBehaviour; +}); + +ace.define('ace/mode/behaviour/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/token_iterator', 'ace/lib/lang'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; +var lang = require("../../lib/lang"); + +var SAFE_INSERT_IN_TOKENS = + ["text", "paren.rparen", "punctuation.operator"]; +var SAFE_INSERT_BEFORE_TOKENS = + ["text", "paren.rparen", "punctuation.operator", "comment"]; + + +var autoInsertedBrackets = 0; +var autoInsertedRow = -1; +var autoInsertedLineEnd = ""; +var maybeInsertedBrackets = 0; +var maybeInsertedRow = -1; +var maybeInsertedLineStart = ""; +var maybeInsertedLineEnd = ""; + +var CstyleBehaviour = function () { + + CstyleBehaviour.isSaneInsertion = function(editor, session) { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + if (!this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) { + var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1); + if (!this.$matchTokenType(iterator2.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) + return false; + } + iterator.stepForward(); + return iterator.getCurrentTokenRow() !== cursor.row || + this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_BEFORE_TOKENS); + }; + + CstyleBehaviour.$matchTokenType = function(token, types) { + return types.indexOf(token.type || token) > -1; + }; + + CstyleBehaviour.recordAutoInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isAutoInsertedClosing(cursor, line, autoInsertedLineEnd[0])) + autoInsertedBrackets = 0; + autoInsertedRow = cursor.row; + autoInsertedLineEnd = bracket + line.substr(cursor.column); + autoInsertedBrackets++; + }; + + CstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isMaybeInsertedClosing(cursor, line)) + maybeInsertedBrackets = 0; + maybeInsertedRow = cursor.row; + maybeInsertedLineStart = line.substr(0, cursor.column) + bracket; + maybeInsertedLineEnd = line.substr(cursor.column); + maybeInsertedBrackets++; + }; + + CstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) { + return autoInsertedBrackets > 0 && + cursor.row === autoInsertedRow && + bracket === autoInsertedLineEnd[0] && + line.substr(cursor.column) === autoInsertedLineEnd; + }; + + CstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) { + return maybeInsertedBrackets > 0 && + cursor.row === maybeInsertedRow && + line.substr(cursor.column) === maybeInsertedLineEnd && + line.substr(0, cursor.column) == maybeInsertedLineStart; + }; + + CstyleBehaviour.popAutoInsertedClosing = function() { + autoInsertedLineEnd = autoInsertedLineEnd.substr(1); + autoInsertedBrackets--; + }; + + CstyleBehaviour.clearMaybeInsertedClosing = function() { + maybeInsertedBrackets = 0; + maybeInsertedRow = -1; + }; + + this.add("braces", "insertion", function (state, action, editor, session, text) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (text == '{') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "{" && editor.getWrapBehavioursEnabled()) { + return { + text: '{' + selected + '}', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + if (/[\]\}\)]/.test(line[cursor.column])) { + CstyleBehaviour.recordAutoInsert(editor, session, "}"); + return { + text: '{}', + selection: [1, 1] + }; + } else { + CstyleBehaviour.recordMaybeInsert(editor, session, "{"); + return { + text: '{', + selection: [1, 1] + }; + } + } + } else if (text == '}') { + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}') { + var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } else if (text == "\n" || text == "\r\n") { + var closing = ""; + if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) { + closing = lang.stringRepeat("}", maybeInsertedBrackets); + CstyleBehaviour.clearMaybeInsertedClosing(); + } + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}' || closing !== "") { + var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column}, '}'); + if (!openBracePos) + return null; + + var indent = this.getNextLineIndent(state, line.substring(0, cursor.column), session.getTabString()); + var next_indent = this.$getIndent(line); + + return { + text: '\n' + indent + '\n' + next_indent + closing, + selection: [1, indent.length, 1, indent.length] + }; + } + } + }); + + this.add("braces", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '{') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar == '}') { + range.end.column++; + return range; + } else { + maybeInsertedBrackets--; + } + } + }); + + this.add("parens", "insertion", function (state, action, editor, session, text) { + if (text == '(') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return { + text: '(' + selected + ')', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, ")"); + return { + text: '()', + selection: [1, 1] + }; + } + } else if (text == ')') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ')') { + var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("parens", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '(') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ')') { + range.end.column++; + return range; + } + } + }); + + this.add("brackets", "insertion", function (state, action, editor, session, text) { + if (text == '[') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return { + text: '[' + selected + ']', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, "]"); + return { + text: '[]', + selection: [1, 1] + }; + } + } else if (text == ']') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ']') { + var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("brackets", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '[') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ']') { + range.end.column++; + return range; + } + } + }); + + this.add("string_dquotes", "insertion", function (state, action, editor, session, text) { + if (text == '"' || text == "'") { + var quote = text; + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "'" && selected != '"' && editor.getWrapBehavioursEnabled()) { + return { + text: quote + selected + quote, + selection: false + }; + } else { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var leftChar = line.substring(cursor.column-1, cursor.column); + if (leftChar == '\\') { + return null; + } + var tokens = session.getTokens(selection.start.row); + var col = 0, token; + var quotepos = -1; // Track whether we're inside an open quote. + + for (var x = 0; x < tokens.length; x++) { + token = tokens[x]; + if (token.type == "string") { + quotepos = -1; + } else if (quotepos < 0) { + quotepos = token.value.indexOf(quote); + } + if ((token.value.length + col) > selection.start.column) { + break; + } + col += tokens[x].value.length; + } + if (!token || (quotepos < 0 && token.type !== "comment" && (token.type !== "string" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) { + if (!CstyleBehaviour.isSaneInsertion(editor, session)) + return; + return { + text: quote + quote, + selection: [1,1] + }; + } else if (token && token.type === "string") { + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == quote) { + return { + text: '', + selection: [1, 1] + }; + } + } + } + } + }); + + this.add("string_dquotes", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && (selected == '"' || selected == "'")) { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == selected) { + range.end.column++; + return range; + } + } + }); + +}; + +oop.inherits(CstyleBehaviour, Behaviour); + +exports.CstyleBehaviour = CstyleBehaviour; +}); + +ace.define('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var line = session.getLine(row); + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i + match[0].length, 1); + } + + if (foldStyle !== "markbeginend") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + +}).call(FoldMode.prototype); + +}); diff --git a/0.0.3_0/ace/mode-liquid.js b/0.0.3_0/ace/mode-liquid.js new file mode 100644 index 0000000..01e3f8a --- /dev/null +++ b/0.0.3_0/ace/mode-liquid.js @@ -0,0 +1,862 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2010, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/mode/liquid', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/liquid_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/range'], function(require, exports, module) { + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var LiquidHighlightRules = require("./liquid_highlight_rules").LiquidHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var Range = require("../range").Range; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new LiquidHighlightRules().getRules()); + this.$outdent = new MatchingBraceOutdent(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.blockComment = {start: ""}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.$tokenizer.getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start") { + var match = line.match(/^.*[\{\(\[]\s*$/); + if (match) { + indent += tab; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/liquid_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/css_highlight_rules', 'ace/mode/javascript_highlight_rules', 'ace/mode/xml_util', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var xmlUtil = require("./xml_util"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var LiquidHighlightRules = function() { + var functions = ( + "date|capitalize|downcase|upcase|first|last|join|sort|map|size|escape|" + + "escape_once|strip_html|strip_newlines|newline_to_br|replace|replace_first|" + + "truncate|truncatewords|prepend|append|minus|plus|times|divided_by|split" + ); + + var keywords = ( + "capture|endcapture|case|endcase|when|comment|endcomment|" + + "cycle|for|endfor|in|reversed|if|endif|else|elsif|include|endinclude|unless|endunless|" + + "style|text|image|widget|plugin|marker|endmarker|tablerow|endtablerow" + ); + + var builtinVariables = 'forloop|tablerowloop'; + + var definitions = ("assign"); + + var keywordMapper = this.createKeywordMapper({ + "variable.language": builtinVariables, + "keyword": keywords, + "support.function": functions, + "keyword.definition": definitions + }, "identifier"); + + this.$rules = { + start : [{ + token : "variable", + regex : "{%", + next : "liquid_start" + }, { + token : "variable", + regex : "{{", + next : "liquid_start" + }, { + token : "meta.tag", + regex : "<\\!\\[CDATA\\[", + next : "cdata" + }, { + token : "xml-pe", + regex : "<\\?.*?\\?>" + }, { + token : "comment", + regex : "<\\!--", + next : "comment" + }, { + token : "meta.tag", + regex : "<(?=\\s*script\\b)", + next : "script" + }, { + token : "meta.tag", + regex : "<(?=\\s*style\\b)", + next : "style" + }, { + token : "meta.tag", // opening tag + regex : "<\\/?", + next : "tag" + } ], + + cdata : [ { + token : "text", + regex : "\\]\\]>", + next : "start" + } ], + + comment : [ { + token : "comment", + regex : ".*?-->", + next : "start" + }, { + defaultToken : "comment" + } ] , + + liquid_start : [{ + token: "variable", + regex: "}}", + next: "start" + }, { + token: "variable", + regex: "%}", + next: "start" + }, { + token : "string", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' + }, { + token : "string", // single line + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" + }, { + token : "constant.numeric", // hex + regex : "0[xX][0-9a-fA-F]+\\b" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : "constant.language.boolean", + regex : "(?:true|false)\\b" + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "keyword.operator", + regex : "\/|\\*|\\-|\\+|=|!=|\\?\\:" + }, { + token : "paren.lparen", + regex : /[\[\({]/ + }, { + token : "paren.rparen", + regex : /[\])}]/ + }, { + token : "text", + regex : "\\s+" + }] + }; + + xmlUtil.tag(this.$rules, "tag", "start"); + xmlUtil.tag(this.$rules, "style", "css-start"); + xmlUtil.tag(this.$rules, "script", "js-start"); + + this.embedRules(JavaScriptHighlightRules, "js-", [{ + token: "comment", + regex: "\\/\\/.*(?=<\\/script>)", + next: "tag" + }, { + token: "meta.tag", + regex: "<\\/(?=script)", + next: "tag" + }]); + + this.embedRules(CssHighlightRules, "css-", [{ + token: "meta.tag", + regex: "<\\/(?=style)", + next: "tag" + }]); +}; +oop.inherits(LiquidHighlightRules, TextHighlightRules); + +exports.LiquidHighlightRules = LiquidHighlightRules; +}); + +ace.define('ace/mode/css_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var supportType = exports.supportType = "animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|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|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|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|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index"; +var supportFunction = exports.supportFunction = "rgb|rgba|url|attr|counter|counters"; +var supportConstant = exports.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"; +var supportConstantColor = exports.supportConstantColor = "aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow"; +var supportConstantFonts = exports.supportConstantFonts = "arial|century|comic|courier|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace"; + +var numRe = exports.numRe = "\\-?(?:(?:[0-9]+)|(?:[0-9]*\\.[0-9]+))"; +var pseudoElements = exports.pseudoElements = "(\\:+)\\b(after|before|first-letter|first-line|moz-selection|selection)\\b"; +var pseudoClasses = exports.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"; + +var CssHighlightRules = function() { + + var keywordMapper = this.createKeywordMapper({ + "support.function": supportFunction, + "support.constant": supportConstant, + "support.type": supportType, + "support.constant.color": supportConstantColor, + "support.constant.fonts": supportConstantFonts + }, "text", true); + + var base_ruleset = [ + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "ruleset_comment" + }, { + token : "string", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' + }, { + token : "string", // single line + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" + }, { + token : ["constant.numeric", "keyword"], + regex : "(" + numRe + ")(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 : numRe + }, { + token : "constant.numeric", // hex6 color + regex : "#[a-f0-9]{6}" + }, { + token : "constant.numeric", // hex3 color + regex : "#[a-f0-9]{3}" + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"], + regex : pseudoElements + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"], + regex : pseudoClasses + }, { + token : ["support.function", "string", "support.function"], + regex : "(url\\()(.*)(\\))" + }, { + token : keywordMapper, + regex : "\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*" + }, { + caseInsensitive: true + } + ]; + + var ruleset = lang.copyArray(base_ruleset); + ruleset.unshift({ + token : "paren.rparen", + regex : "\\}", + next: "start" + }); + + var media_ruleset = lang.copyArray( base_ruleset ); + media_ruleset.unshift({ + token : "paren.rparen", + regex : "\\}", + next: "media" + }); + + var base_comment = [{ + token : "comment", // comment spanning whole line + regex : ".+" + }]; + + var comment = lang.copyArray(base_comment); + comment.unshift({ + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "start" + }); + + var media_comment = lang.copyArray(base_comment); + media_comment.unshift({ + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "media" + }); + + var ruleset_comment = lang.copyArray(base_comment); + ruleset_comment.unshift({ + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "ruleset" + }); + + this.$rules = { + "start" : [{ + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment" + }, { + token: "paren.lparen", + regex: "\\{", + next: "ruleset" + }, { + token: "string", + regex: "@.*?{", + next: "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: true + }], + + "media" : [ { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "media_comment" + }, { + token: "paren.lparen", + regex: "\\{", + next: "media_ruleset" + },{ + token: "string", + regex: "\\}", + next: "start" + },{ + 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: true + }], + + "comment" : comment, + + "ruleset" : ruleset, + "ruleset_comment" : ruleset_comment, + + "media_ruleset" : media_ruleset, + "media_comment" : media_comment + }; +}; + +oop.inherits(CssHighlightRules, TextHighlightRules); + +exports.CssHighlightRules = CssHighlightRules; + +}); + +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(require, exports, module) { + + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var JavaScriptHighlightRules = function() { + var keywordMapper = this.createKeywordMapper({ + "variable.language": + "Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|" + // Constructors + "Namespace|QName|XML|XMLList|" + // E4X + "ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|" + + "Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|" + + "Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|" + // Errors + "SyntaxError|TypeError|URIError|" + + "decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|" + // Non-constructor functions + "isNaN|parseFloat|parseInt|" + + "JSON|Math|" + // Other + "this|arguments|prototype|window|document" , // Pseudo + "keyword": + "const|yield|import|get|set|" + + "break|case|catch|continue|default|delete|do|else|finally|for|function|" + + "if|in|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"); + var kwBeforeRe = "case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void"; + var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*\\b"; + + var escapedRe = "\\\\(?:x[0-9a-fA-F]{2}|" + // hex + "u[0-9a-fA-F]{4}|" + // unicode + "[0-2][0-7]{0,2}|" + // oct + "3[0-6][0-7]?|" + // oct + "37[0-7]?|" + // oct + "[4-7][0-7]?|" + //oct + ".)"; + + this.$rules = { + "no_regex" : [ + { + token : "comment", + regex : /\/\/.*$/ + }, + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : /\/\*/, + next : "comment" + }, { + token : "string", + regex : "'(?=.)", + next : "qstring" + }, { + token : "string", + regex : '"(?=.)', + next : "qqstring" + }, { + token : "constant.numeric", // hex + regex : /0[xX][0-9a-fA-F]+\b/ + }, { + token : "constant.numeric", // float + regex : /[+-]?\d+(?:(?:\.\d*)?(?:[eE][+-]?\d+)?)?\b/ + }, { + token : [ + "storage.type", "punctuation.operator", "support.function", + "punctuation.operator", "entity.name.function", "text","keyword.operator" + ], + regex : "(" + identifierRe + ")(\\.)(prototype)(\\.)(" + identifierRe +")(\\s*)(=)", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "keyword.operator", "text", "storage.type", + "text", "paren.lparen" + ], + regex : "(" + identifierRe +")(\\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 : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(function)(\\s+)(" + identifierRe + ")(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "punctuation.operator", + "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\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 : "(?:" + kwBeforeRe + ")\\b", + next : "start" + }, { + token : ["punctuation.operator", "support.function"], + regex : /(\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:opzzzz|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 : ["punctuation.operator", "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)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/ + }, { + token : ["punctuation.operator", "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 : ["storage.type", "punctuation.operator", "support.function.firebug"], + regex : /(console)(\.)(warn|info|log|error|time|timeEnd|assert)\b/ + }, { + token : keywordMapper, + regex : identifierRe + }, { + token : "keyword.operator", + regex : /--|\+\+|[!$%&*+\-~]|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\|\||\?\:|\*=|%=|\+=|\-=|&=|\^=/, + next : "start" + }, { + token : "punctuation.operator", + regex : /\?|\:|\,|\;|\./, + next : "start" + }, { + token : "paren.lparen", + regex : /[\[({]/, + next : "start" + }, { + token : "paren.rparen", + regex : /[\])}]/ + }, { + token : "keyword.operator", + regex : /\/=?/, + next : "start" + }, { + token: "comment", + regex: /^#!.*$/ + } + ], + "start": [ + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment_regex_allowed" + }, { + token : "comment", + regex : "\\/\\/.*$", + next : "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: "/\\w*", + 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.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: identifierRe + }, { + token: "punctuation.operator", + regex: "[, ]+" + }, { + token: "punctuation.operator", + regex: "$" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "comment_regex_allowed" : [ + {token : "comment", regex : "\\*\\/", next : "start"}, + {defaultToken : "comment"} + ], + "comment" : [ + {token : "comment", regex : "\\*\\/", next : "no_regex"}, + {defaultToken : "comment"} + ], + "qqstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + next : "qqstring" + }, { + token : "string", + regex : '"|$', + next : "no_regex" + }, { + defaultToken: "string" + } + ], + "qstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + next : "qstring" + }, { + token : "string", + regex : "'|$", + next : "no_regex" + }, { + defaultToken: "string" + } + ] + }; + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("no_regex") ]); +}; + +oop.inherits(JavaScriptHighlightRules, TextHighlightRules); + +exports.JavaScriptHighlightRules = JavaScriptHighlightRules; +}); + +ace.define('ace/mode/doc_comment_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, { + token : "comment.doc.tag", + regex : "\\bTODO\\b" + }, { + defaultToken : "comment.doc" + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define('ace/mode/xml_util', ['require', 'exports', 'module' ], function(require, exports, module) { + + +function string(state) { + return [{ + token : "string", + regex : '"', + next : state + "_qqstring" + }, { + token : "string", + regex : "'", + next : state + "_qstring" + }]; +} + +function multiLineString(quote, state) { + return [ + {token : "string", regex : quote, next : state}, + { + token : "constant.language.escape", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }, + {defaultToken : "string"} + ]; +} + +exports.tag = function(states, name, nextState, tagMap) { + states[name] = [{ + token : "text", + regex : "\\s+" + }, { + + token : !tagMap ? "meta.tag.tag-name" : function(value) { + if (tagMap[value]) + return "meta.tag.tag-name." + tagMap[value]; + else + return "meta.tag.tag-name"; + }, + regex : "[-_a-zA-Z0-9:]+", + next : name + "_embed_attribute_list" + }, { + token: "empty", + regex: "", + next : name + "_embed_attribute_list" + }]; + + states[name + "_qstring"] = multiLineString("'", name + "_embed_attribute_list"); + states[name + "_qqstring"] = multiLineString("\"", name + "_embed_attribute_list"); + + states[name + "_embed_attribute_list"] = [{ + token : "meta.tag.r", + regex : "/?>", + next : nextState + }, { + token : "keyword.operator", + regex : "=" + }, { + token : "entity.other.attribute-name", + regex : "[-_a-zA-Z0-9:]+" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : "text", + regex : "\\s+" + }].concat(string(name)); +}; + +}); + +ace.define('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) { + + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); diff --git a/0.0.3_0/ace/mode-lisp.js b/0.0.3_0/ace/mode-lisp.js new file mode 100644 index 0000000..fa4311a --- /dev/null +++ b/0.0.3_0/ace/mode-lisp.js @@ -0,0 +1,138 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2012, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/mode/lisp', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/lisp_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var LispHighlightRules = require("./lisp_highlight_rules").LispHighlightRules; + +var Mode = function() { + var highlighter = new LispHighlightRules(); + + this.$tokenizer = new Tokenizer(highlighter.getRules()); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = ";"; + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + + +ace.define('ace/mode/lisp_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var LispHighlightRules = function() { + var keywordControl = "case|do|let|loop|if|else|when"; + var keywordOperator = "eq|neq|and|or"; + var constantLanguage = "null|nil"; + var supportFunctions = "cons|car|cdr|cond|lambda|format|setq|setf|quote|eval|append|list|listp|memberp|t|load|progn"; + + var keywordMapper = this.createKeywordMapper({ + "keyword.control": keywordControl, + "keyword.operator": keywordOperator, + "constant.language": constantLanguage, + "support.function": supportFunctions + }, "identifier", true); + + this.$rules = + { + "start": [ + { + token : "comment", + regex : ";.*$" + }, + { + token: ["storage.type.function-type.lisp", "text", "entity.name.function.lisp"], + regex: "(?:\\b(?:(defun|defmethod|defmacro))\\b)(\\s+)((?:\\w|\\-|\\!|\\?)*)" + }, + { + token: ["punctuation.definition.constant.character.lisp", "constant.character.lisp"], + regex: "(#)((?:\\w|[\\\\+-=<>'\"&#])+)" + }, + { + token: ["punctuation.definition.variable.lisp", "variable.other.global.lisp", "punctuation.definition.variable.lisp"], + regex: "(\\*)(\\S*)(\\*)" + }, + { + token : "constant.numeric", // hex + regex : "0[xX][0-9a-fA-F]+(?:L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\b" + }, + { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?(?:L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\b" + }, + { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, + { + token : "string", + regex : '"(?=.)', + next : "qqstring" + } + ], + "qqstring": [ + { + token: "constant.character.escape.lisp", + regex: "\\\\." + }, + { + token : "string", + regex : '[^"\\\\]+' + }, { + token : "string", + regex : "\\\\$", + next : "qqstring" + }, { + token : "string", + regex : '"|$', + next : "start" + } + ] +} + +}; + +oop.inherits(LispHighlightRules, TextHighlightRules); + +exports.LispHighlightRules = LispHighlightRules; +}); diff --git a/0.0.3_0/ace/mode-livescript.js b/0.0.3_0/ace/mode-livescript.js new file mode 100644 index 0000000..dc2cda0 --- /dev/null +++ b/0.0.3_0/ace/mode-livescript.js @@ -0,0 +1,288 @@ +ace.define('ace/mode/livescript', ['require', 'exports', 'module' , 'ace/tokenizer', 'ace/mode/matching_brace_outdent', 'ace/range', 'ace/mode/text'], function(require, exports, module) { + var identifier, LiveScriptMode, keywordend, stringfill; + identifier = '(?![\\d\\s])[$\\w\\xAA-\\uFFDC](?:(?!\\s)[$\\w\\xAA-\\uFFDC]|-[A-Za-z])*'; + exports.Mode = LiveScriptMode = (function(superclass){ + var indenter, prototype = extend$((import$(LiveScriptMode, superclass).displayName = 'LiveScriptMode', LiveScriptMode), superclass).prototype, constructor = LiveScriptMode; + function LiveScriptMode(){ + var that; + this.$tokenizer = new (require('../tokenizer')).Tokenizer(LiveScriptMode.Rules); + if (that = require('../mode/matching_brace_outdent')) { + this.$outdent = new that.MatchingBraceOutdent; + } + } + indenter = RegExp('(?:[({[=:]|[-~]>|\\b(?:e(?:lse|xport)|d(?:o|efault)|t(?:ry|hen)|finally|import(?:\\s*all)?|const|var|let|new|catch(?:\\s*' + identifier + ')?))\\s*$'); + prototype.getNextLineIndent = function(state, line, tab){ + var indent, tokens; + indent = this.$getIndent(line); + tokens = this.$tokenizer.getLineTokens(line, state).tokens; + if (!(tokens.length && tokens[tokens.length - 1].type === 'comment')) { + if (state === 'start' && indenter.test(line)) { + indent += tab; + } + } + return indent; + }; + prototype.toggleCommentLines = function(state, doc, startRow, endRow){ + var comment, range, i$, i, out, line; + comment = /^(\s*)#/; + range = new (require('../range')).Range(0, 0, 0, 0); + for (i$ = startRow; i$ <= endRow; ++i$) { + i = i$; + if (out = comment.test(line = doc.getLine(i))) { + line = line.replace(comment, '$1'); + } else { + line = line.replace(/^\s*/, '$&#'); + } + range.end.row = range.start.row = i; + range.end.column = line.length + 1; + doc.replace(range, line); + } + return 1 - out * 2; + }; + prototype.checkOutdent = function(state, line, input){ + var ref$; + return (ref$ = this.$outdent) != null ? ref$.checkOutdent(line, input) : void 8; + }; + prototype.autoOutdent = function(state, doc, row){ + var ref$; + return (ref$ = this.$outdent) != null ? ref$.autoOutdent(doc, row) : void 8; + }; + return LiveScriptMode; + }(require('../mode/text').Mode)); + keywordend = '(?![$\\w]|-[A-Za-z]|\\s*:(?![:=]))'; + stringfill = { + token: 'string', + regex: '.+' + }; + LiveScriptMode.Rules = { + start: [ + { + token: 'keyword', + regex: '(?:t(?:h(?:is|row|en)|ry|ypeof!?)|c(?:on(?:tinue|st)|a(?:se|tch)|lass)|i(?:n(?:stanceof)?|mp(?:ort(?:\\s+all)?|lements)|[fs])|d(?:e(?:fault|lete|bugger)|o)|f(?:or(?:\\s+own)?|inally|unction)|s(?:uper|witch)|e(?:lse|x(?:tends|port)|val)|a(?:nd|rguments)|n(?:ew|ot)|un(?:less|til)|w(?:hile|ith)|o[fr]|return|break|let|var|loop)' + keywordend + }, { + token: 'constant.language', + regex: '(?:true|false|yes|no|on|off|null|void|undefined)' + keywordend + }, { + token: 'invalid.illegal', + regex: '(?:p(?:ackage|r(?:ivate|otected)|ublic)|i(?:mplements|nterface)|enum|static|yield)' + keywordend + }, { + token: 'language.support.class', + regex: '(?:R(?:e(?:gExp|ferenceError)|angeError)|S(?:tring|yntaxError)|E(?:rror|valError)|Array|Boolean|Date|Function|Number|Object|TypeError|URIError)' + keywordend + }, { + token: 'language.support.function', + regex: '(?:is(?:NaN|Finite)|parse(?:Int|Float)|Math|JSON|(?:en|de)codeURI(?:Component)?)' + keywordend + }, { + token: 'variable.language', + regex: '(?:t(?:hat|il|o)|f(?:rom|allthrough)|it|by|e)' + keywordend + }, { + token: 'identifier', + regex: identifier + '\\s*:(?![:=])' + }, { + token: 'variable', + regex: identifier + }, { + token: 'keyword.operator', + regex: '(?:\\.{3}|\\s+\\?)' + }, { + token: 'keyword.variable', + regex: '(?:@+|::|\\.\\.)', + next: 'key' + }, { + token: 'keyword.operator', + regex: '\\.\\s*', + next: 'key' + }, { + token: 'string', + regex: '\\\\\\S[^\\s,;)}\\]]*' + }, { + token: 'string.doc', + regex: '\'\'\'', + next: 'qdoc' + }, { + token: 'string.doc', + regex: '"""', + next: 'qqdoc' + }, { + token: 'string', + regex: '\'', + next: 'qstring' + }, { + token: 'string', + regex: '"', + next: 'qqstring' + }, { + token: 'string', + regex: '`', + next: 'js' + }, { + token: 'string', + regex: '<\\[', + next: 'words' + }, { + token: 'string.regex', + regex: '//', + next: 'heregex' + }, { + token: 'comment.doc', + regex: '/\\*', + next: 'comment' + }, { + token: 'comment', + regex: '#.*' + }, { + token: 'string.regex', + regex: '\\/(?:[^[\\/\\n\\\\]*(?:(?:\\\\.|\\[[^\\]\\n\\\\]*(?:\\\\.[^\\]\\n\\\\]*)*\\])[^[\\/\\n\\\\]*)*)\\/[gimy$]{0,4}', + next: 'key' + }, { + token: 'constant.numeric', + regex: '(?:0x[\\da-fA-F][\\da-fA-F_]*|(?:[2-9]|[12]\\d|3[0-6])r[\\da-zA-Z][\\da-zA-Z_]*|(?:\\d[\\d_]*(?:\\.\\d[\\d_]*)?|\\.\\d[\\d_]*)(?:e[+-]?\\d[\\d_]*)?[\\w$]*)' + }, { + token: 'lparen', + regex: '[({[]' + }, { + token: 'rparen', + regex: '[)}\\]]', + next: 'key' + }, { + token: 'keyword.operator', + regex: '\\S+' + }, { + token: 'text', + regex: '\\s+' + } + ], + heregex: [ + { + token: 'string.regex', + regex: '.*?//[gimy$?]{0,4}', + next: 'start' + }, { + token: 'string.regex', + regex: '\\s*#{' + }, { + token: 'comment.regex', + regex: '\\s+(?:#.*)?' + }, { + token: 'string.regex', + regex: '\\S+' + } + ], + key: [ + { + token: 'keyword.operator', + regex: '[.?@!]+' + }, { + token: 'identifier', + regex: identifier, + next: 'start' + }, { + token: 'text', + regex: '.', + next: 'start' + } + ], + comment: [ + { + token: 'comment.doc', + regex: '.*?\\*/', + next: 'start' + }, { + token: 'comment.doc', + regex: '.+' + } + ], + qdoc: [ + { + token: 'string', + regex: ".*?'''", + next: 'key' + }, stringfill + ], + qqdoc: [ + { + token: 'string', + regex: '.*?"""', + next: 'key' + }, stringfill + ], + qstring: [ + { + token: 'string', + regex: '[^\\\\\']*(?:\\\\.[^\\\\\']*)*\'', + next: 'key' + }, stringfill + ], + qqstring: [ + { + token: 'string', + regex: '[^\\\\"]*(?:\\\\.[^\\\\"]*)*"', + next: 'key' + }, stringfill + ], + js: [ + { + token: 'string', + regex: '[^\\\\`]*(?:\\\\.[^\\\\`]*)*`', + next: 'key' + }, stringfill + ], + words: [ + { + token: 'string', + regex: '.*?\\]>', + next: 'key' + }, stringfill + ] + }; +function extend$(sub, sup){ + function fun(){} fun.prototype = (sub.superclass = sup).prototype; + (sub.prototype = new fun).constructor = sub; + if (typeof sup.extended == 'function') sup.extended(sub); + return sub; +} +function import$(obj, src){ + var own = {}.hasOwnProperty; + for (var key in src) if (own.call(src, key)) obj[key] = src[key]; + return obj; +} +}); + +ace.define('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) { + + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); diff --git a/0.0.3_0/ace/mode-logiql.js b/0.0.3_0/ace/mode-logiql.js new file mode 100644 index 0000000..46c5c6d --- /dev/null +++ b/0.0.3_0/ace/mode-logiql.js @@ -0,0 +1,664 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2012, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/mode/logiql', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/logiql_highlight_rules', 'ace/mode/folding/coffee', 'ace/token_iterator', 'ace/range', 'ace/mode/behaviour/cstyle', 'ace/mode/matching_brace_outdent'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var LogiQLHighlightRules = require("./logiql_highlight_rules").LogiQLHighlightRules; +var FoldMode = require("./folding/coffee").FoldMode; +var TokenIterator = require("../token_iterator").TokenIterator; +var Range = require("../range").Range; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; + +var Mode = function() { + var highlighter = new LogiQLHighlightRules(); + this.foldingRules = new FoldMode(); + this.$tokenizer = new Tokenizer(highlighter.getRules()); + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); +}; +oop.inherits(Mode, TextMode); + +(function() { + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.$tokenizer.getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + if (/comment|string/.test(endState)) + return indent; + if (tokens.length && tokens[tokens.length - 1].type == "comment.single") + return indent; + + var match = line.match(); + if (/(-->|<--|<-|->|{)\s*$/.test(line)) + indent += tab; + return indent; + }; + + this.checkOutdent = function(state, line, input) { + if (this.$outdent.checkOutdent(line, input)) + return true; + + if (input !== "\n" && input !== "\r\n") + return false; + + if (!/^\s+/.test(line)) + return false; + + return true; + }; + + this.autoOutdent = function(state, doc, row) { + if (this.$outdent.autoOutdent(doc, row)) + return; + var prevLine = doc.getLine(row); + var match = prevLine.match(/^\s+/); + var column = prevLine.lastIndexOf(".") + 1; + if (!match || !row || !column) return 0; + + var line = doc.getLine(row + 1); + var startRange = this.getMatching(doc, {row: row, column: column}); + if (!startRange || startRange.start.row == row) return 0; + + column = match[0].length; + var indent = this.$getIndent(doc.getLine(startRange.start.row)); + doc.replace(new Range(row + 1, 0, row + 1, column), indent); + }; + + this.getMatching = function(session, row, column) { + if (row == undefined) + row = session.selection.lead + if (typeof row == "object") { + column = row.column; + row = row.row; + } + + var startToken = session.getTokenAt(row, column); + var KW_START = "keyword.start", KW_END = "keyword.end"; + var tok; + if (!startToken) + return; + if (startToken.type == KW_START) { + var it = new TokenIterator(session, row, column); + it.step = it.stepForward; + } else if (startToken.type == KW_END) { + var it = new TokenIterator(session, row, column); + it.step = it.stepBackward; + } else + return; + + while (tok = it.step()) { + if (tok.type == KW_START || tok.type == KW_END) + break; + } + if (!tok || tok.type == startToken.type) + return; + + var col = it.getCurrentTokenColumn(); + var row = it.getCurrentTokenRow(); + return new Range(row, col, row, col + tok.value.length); + }; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/logiql_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var LogiQLHighlightRules = function() { + + this.$rules = { start: + [ { token: 'comment.block', + regex: '/\\*', + push: + [ { token: 'comment.block', regex: '\\*/', next: 'pop' }, + { defaultToken: 'comment.block' } ], + }, + { token: 'comment.single', + regex: '//.*', + }, + { token: 'constant.numeric', + regex: '\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?', + }, + { token: 'string', + regex: '"', + push: + [ { token: 'string', regex: '"', next: 'pop' }, + { defaultToken: 'string' } ], + }, + { token: 'constant.language', + regex: '\\b(true|false)\\b', + }, + { token: 'entity.name.type.logicblox', + regex: '`[a-zA-Z_:]+(\\d|\\a)*\\b', + }, + { token: 'keyword.start', regex: '->', comment: 'Constraint' }, + { token: 'keyword.start', regex: '-->', comment: 'Level 1 Constraint'}, + { token: 'keyword.start', regex: '<-', comment: 'Rule' }, + { token: 'keyword.start', regex: '<--', comment: 'Level 1 Rule' }, + { token: 'keyword.end', regex: '\\.', comment: 'Terminator' }, + { token: 'keyword.other', regex: '!', comment: 'Negation' }, + { token: 'keyword.other', regex: ',', comment: 'Conjunction' }, + { token: 'keyword.other', regex: ';', comment: 'Disjunction' }, + { token: 'keyword.operator', regex: '<=|>=|!=|<|>', comment: 'Equality'}, + { token: 'keyword.other', regex: '@', comment: 'Equality' }, + { token: 'keyword.operator', regex: '\\+|-|\\*|/', comment: 'Arithmetic operations'}, + { token: 'keyword', regex: '::', comment: 'Colon colon' }, + { token: 'support.function', + regex: '\\b(agg\\s*<<)', + push: + [ { include: '$self' }, + { token: 'support.function', + regex: '>>', + next: 'pop' } ], + }, + { token: 'storage.modifier', + regex: '\\b(lang:[\\w:]*)', + }, + { token: [ 'storage.type', 'text' ], + regex: '(export|sealed|clauses|block|alias)(\\s*\\()(?=`)', + }, + { token: 'entity.name', + regex: '[a-zA-Z_][a-zA-Z_0-9:]*(@prev|@init|@final)?(?=(\\(|\\[))', + }, + { token: 'variable.parameter', + regex: '([a-zA-Z][a-zA-Z_0-9]*|_)\\s*(?=(,|\\.|<-|->|\\)|\\]|=))', + } ] } + + this.normalizeRules(); +}; + +oop.inherits(LogiQLHighlightRules, TextHighlightRules); + +exports.LogiQLHighlightRules = LogiQLHighlightRules; +}); + +ace.define('ace/mode/folding/coffee', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/folding/fold_mode', 'ace/range'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var BaseFoldMode = require("./fold_mode").FoldMode; +var Range = require("../../range").Range; + +var FoldMode = exports.FoldMode = function() {}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var range = this.indentationBlock(session, row); + if (range) + return range; + + var re = /\S/; + var line = session.getLine(row); + var startLevel = line.search(re); + if (startLevel == -1 || line[startLevel] != "#") + return; + + var startColumn = line.length; + var maxRow = session.getLength(); + var startRow = row; + var endRow = row; + + while (++row < maxRow) { + line = session.getLine(row); + var level = line.search(re); + + if (level == -1) + continue; + + if (line[level] != "#") + break; + + endRow = row; + } + + if (endRow > startRow) { + var endColumn = session.getLine(endRow).length; + return new Range(startRow, startColumn, endRow, endColumn); + } + }; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + var indent = line.search(/\S/); + var next = session.getLine(row + 1); + var prev = session.getLine(row - 1); + var prevIndent = prev.search(/\S/); + var nextIndent = next.search(/\S/); + + if (indent == -1) { + session.foldWidgets[row - 1] = prevIndent!= -1 && prevIndent < nextIndent ? "start" : ""; + return ""; + } + if (prevIndent == -1) { + if (indent == nextIndent && line[indent] == "#" && next[indent] == "#") { + session.foldWidgets[row - 1] = ""; + session.foldWidgets[row + 1] = ""; + return "start"; + } + } else if (prevIndent == indent && line[indent] == "#" && prev[indent] == "#") { + if (session.getLine(row - 2).search(/\S/) == -1) { + session.foldWidgets[row - 1] = "start"; + session.foldWidgets[row + 1] = ""; + return ""; + } + } + + if (prevIndent!= -1 && prevIndent < indent) + session.foldWidgets[row - 1] = "start"; + else + session.foldWidgets[row - 1] = ""; + + if (indent < nextIndent) + return "start"; + else + return ""; + }; + +}).call(FoldMode.prototype); + +}); + +ace.define('ace/mode/behaviour/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/token_iterator', 'ace/lib/lang'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; +var lang = require("../../lib/lang"); + +var SAFE_INSERT_IN_TOKENS = + ["text", "paren.rparen", "punctuation.operator"]; +var SAFE_INSERT_BEFORE_TOKENS = + ["text", "paren.rparen", "punctuation.operator", "comment"]; + + +var autoInsertedBrackets = 0; +var autoInsertedRow = -1; +var autoInsertedLineEnd = ""; +var maybeInsertedBrackets = 0; +var maybeInsertedRow = -1; +var maybeInsertedLineStart = ""; +var maybeInsertedLineEnd = ""; + +var CstyleBehaviour = function () { + + CstyleBehaviour.isSaneInsertion = function(editor, session) { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + if (!this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) { + var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1); + if (!this.$matchTokenType(iterator2.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) + return false; + } + iterator.stepForward(); + return iterator.getCurrentTokenRow() !== cursor.row || + this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_BEFORE_TOKENS); + }; + + CstyleBehaviour.$matchTokenType = function(token, types) { + return types.indexOf(token.type || token) > -1; + }; + + CstyleBehaviour.recordAutoInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isAutoInsertedClosing(cursor, line, autoInsertedLineEnd[0])) + autoInsertedBrackets = 0; + autoInsertedRow = cursor.row; + autoInsertedLineEnd = bracket + line.substr(cursor.column); + autoInsertedBrackets++; + }; + + CstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isMaybeInsertedClosing(cursor, line)) + maybeInsertedBrackets = 0; + maybeInsertedRow = cursor.row; + maybeInsertedLineStart = line.substr(0, cursor.column) + bracket; + maybeInsertedLineEnd = line.substr(cursor.column); + maybeInsertedBrackets++; + }; + + CstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) { + return autoInsertedBrackets > 0 && + cursor.row === autoInsertedRow && + bracket === autoInsertedLineEnd[0] && + line.substr(cursor.column) === autoInsertedLineEnd; + }; + + CstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) { + return maybeInsertedBrackets > 0 && + cursor.row === maybeInsertedRow && + line.substr(cursor.column) === maybeInsertedLineEnd && + line.substr(0, cursor.column) == maybeInsertedLineStart; + }; + + CstyleBehaviour.popAutoInsertedClosing = function() { + autoInsertedLineEnd = autoInsertedLineEnd.substr(1); + autoInsertedBrackets--; + }; + + CstyleBehaviour.clearMaybeInsertedClosing = function() { + maybeInsertedBrackets = 0; + maybeInsertedRow = -1; + }; + + this.add("braces", "insertion", function (state, action, editor, session, text) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (text == '{') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "{" && editor.getWrapBehavioursEnabled()) { + return { + text: '{' + selected + '}', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + if (/[\]\}\)]/.test(line[cursor.column])) { + CstyleBehaviour.recordAutoInsert(editor, session, "}"); + return { + text: '{}', + selection: [1, 1] + }; + } else { + CstyleBehaviour.recordMaybeInsert(editor, session, "{"); + return { + text: '{', + selection: [1, 1] + }; + } + } + } else if (text == '}') { + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}') { + var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } else if (text == "\n" || text == "\r\n") { + var closing = ""; + if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) { + closing = lang.stringRepeat("}", maybeInsertedBrackets); + CstyleBehaviour.clearMaybeInsertedClosing(); + } + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}' || closing !== "") { + var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column}, '}'); + if (!openBracePos) + return null; + + var indent = this.getNextLineIndent(state, line.substring(0, cursor.column), session.getTabString()); + var next_indent = this.$getIndent(line); + + return { + text: '\n' + indent + '\n' + next_indent + closing, + selection: [1, indent.length, 1, indent.length] + }; + } + } + }); + + this.add("braces", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '{') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar == '}') { + range.end.column++; + return range; + } else { + maybeInsertedBrackets--; + } + } + }); + + this.add("parens", "insertion", function (state, action, editor, session, text) { + if (text == '(') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return { + text: '(' + selected + ')', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, ")"); + return { + text: '()', + selection: [1, 1] + }; + } + } else if (text == ')') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ')') { + var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("parens", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '(') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ')') { + range.end.column++; + return range; + } + } + }); + + this.add("brackets", "insertion", function (state, action, editor, session, text) { + if (text == '[') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return { + text: '[' + selected + ']', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, "]"); + return { + text: '[]', + selection: [1, 1] + }; + } + } else if (text == ']') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ']') { + var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("brackets", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '[') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ']') { + range.end.column++; + return range; + } + } + }); + + this.add("string_dquotes", "insertion", function (state, action, editor, session, text) { + if (text == '"' || text == "'") { + var quote = text; + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "'" && selected != '"' && editor.getWrapBehavioursEnabled()) { + return { + text: quote + selected + quote, + selection: false + }; + } else { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var leftChar = line.substring(cursor.column-1, cursor.column); + if (leftChar == '\\') { + return null; + } + var tokens = session.getTokens(selection.start.row); + var col = 0, token; + var quotepos = -1; // Track whether we're inside an open quote. + + for (var x = 0; x < tokens.length; x++) { + token = tokens[x]; + if (token.type == "string") { + quotepos = -1; + } else if (quotepos < 0) { + quotepos = token.value.indexOf(quote); + } + if ((token.value.length + col) > selection.start.column) { + break; + } + col += tokens[x].value.length; + } + if (!token || (quotepos < 0 && token.type !== "comment" && (token.type !== "string" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) { + if (!CstyleBehaviour.isSaneInsertion(editor, session)) + return; + return { + text: quote + quote, + selection: [1,1] + }; + } else if (token && token.type === "string") { + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == quote) { + return { + text: '', + selection: [1, 1] + }; + } + } + } + } + }); + + this.add("string_dquotes", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && (selected == '"' || selected == "'")) { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == selected) { + range.end.column++; + return range; + } + } + }); + +}; + +oop.inherits(CstyleBehaviour, Behaviour); + +exports.CstyleBehaviour = CstyleBehaviour; +}); + +ace.define('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) { + + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); diff --git a/0.0.3_0/ace/mode-lsl.js b/0.0.3_0/ace/mode-lsl.js new file mode 100644 index 0000000..c428dfb --- /dev/null +++ b/0.0.3_0/ace/mode-lsl.js @@ -0,0 +1,832 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2013, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/mode/lsl', ['require', 'exports', 'module' , 'ace/tokenizer', 'ace/mode/lsl_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/range', 'ace/mode/text', 'ace/mode/behaviour/cstyle', 'ace/mode/folding/cstyle', 'ace/lib/oop'], function(require, exports, module) { + + +var Tokenizer = require("../tokenizer").Tokenizer; +var Rules = require("./lsl_highlight_rules").LSLHighlightRules; +var Outdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var Range = require("../range").Range; +var TextMode = require("./text").Mode; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; +var oop = require("../lib/oop"); + +var Mode = function() { + this.$tokenizer = new Tokenizer(new Rules().getRules()); + this.$outdent = new Outdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = ["//"]; + + this.blockComment = { + start: "/*", + end: "*/" + }; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.$tokenizer.getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + + if (tokens.length && tokens[tokens.length-1].type === "comment.block.lsl") { + return indent; + } + + if (state === "start") { + var match = line.match(/^.*[\{\(\[]\s*$/); + if (match) { + indent += tab; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/lsl_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +oop.inherits(LSLHighlightRules, TextHighlightRules); + +function LSLHighlightRules() { + var keywordMapper = this.createKeywordMapper({ + "constant.language.float.lsl" : "DEG_TO_RAD|PI|PI_BY_TWO|RAD_TO_DEG|SQRT2|TWO_PI", + "constant.language.integer.lsl": "ACTIVE|ALWAYS_RUN|AGENT_ATTACHMENTS|AGENT_AUTOPILOT|" + + "AGENT_AWAY|AGENT_BUSY|AGENT_BY_LEGACY_NAME|AGENT_BY_USERNAME|AGENT_CROUCHING|" + + "AGENT_FLYING|AGENT_IN_AIR|AGENT_LIST_PARCEL|AGENT_LIST_PARCEL_OWNER|" + + "AGENT_LIST_REGION|AGENT_MOUSELOOK|AGENT_ON_OBJECT|AGENT_SCRIPTED|AGENT_SITTING|" + + "AGENT_TYPING|AGENT_WALKING|ALL_SIDES|ANIM_ON|ATTACH_AVATAR_CENTER|ATTACH_BACK|ATTACH_BELLY|" + + "ATTACH_CHEST|ATTACH_CHIN|ATTACH_HEAD|ATTACH_HUD_BOTTOM|ATTACH_HUD_BOTTOM_LEFT|" + + "ATTACH_HUD_BOTTOM_RIGHT|ATTACH_HUD_CENTER_1|ATTACH_HUD_CENTER_2|ATTACH_HUD_TOP_CENTER|" + + "ATTACH_HUD_TOP_LEFT|ATTACH_HUD_TOP_RIGHT|ATTACH_LEAR|ATTACH_LEFT_PEC|" + + "ATTACH_LEYE|ATTACH_LFOOT|ATTACH_LHAND|ATTACH_LHIP|ATTACH_LLARM|ATTACH_LLLEG|" + + "ATTACH_LSHOULDER|ATTACH_LUARM|ATTACH_LULEG|ATTACH_MOUTH|ATTACH_NECK|ATTACH_NOSE|" + + "ATTACH_PELVIS|ATTACH_REAR|ATTACH_REYE|ATTACH_RFOOT|ATTACH_RHAND|ATTACH_RHIP|" + + "ATTACH_RIGHT_PEC|ATTACH_RLARM|ATTACH_RLLEG|ATTACH_RSHOULDER|ATTACH_RUARM|" + + "ATTACH_RULEG|AVOID_CHARACTERS|AVOID_DYNAMIC_OBSTACLES|AVOID_NONE|CAMERA_ACTIVE|" + + "CAMERA_BEHINDNESS_ANGLE|CAMERA_BEHINDNESS_LAG|CAMERA_DISTANCE|CAMERA_FOCUS|" + + "CAMERA_FOCUS_LAG|CAMERA_FOCUS_LOCKED|CAMERA_FOCUS_OFFSET|CAMERA_FOCUS_THRESHOLD|" + + "CAMERA_PITCH|CAMERA_POSITION|CAMERA_POSITION_LAG|CAMERA_POSITION_LOCKED|" + + "CAMERA_POSITION_THRESHOLD|CHANGED_ALLOWED_DROP|CHANGED_COLOR|CHANGED_INVENTORY|" + + "CHANGED_LINK|CHANGED_MEDIA|CHANGED_OWNER|CHANGED_REGION|CHANGED_REGION_START|" + + "CHANGED_SCALE|CHANGED_SHAPE|CHANGED_TELEPORT|CHANGED_TEXTURE|CHARACTER_ACCOUNT_FOR_SKIPPED_FRAMES|" + + "CHARACTER_AVOIDANCE_MODE|CHARACTER_CMD_JUMP|CHARACTER_CMD_SMOOTH_STOP|" + + "CHARACTER_CMD_STOP|CHARACTER_DESIRED_SPEED|CHARACTER_DESIRED_TURN_SPEED|" + + "CHARACTER_LENGTH|CHARACTER_MAX_ACCEL|" + + "CHARACTER_MAX_DECEL|CHARACTER_MAX_SPEED|CHARACTER_MAX_TURN_RADIUS|CHARACTER_ORIENTATION|" + + "CHARACTER_RADIUS|CHARACTER_TYPE|CHARACTER_TYPE_A|CHARACTER_TYPE_B|CHARACTER_TYPE_C|" + + "CHARACTER_TYPE_D|CHARACTER_TYPE_NONE|CLICK_ACTION_BUY|CLICK_ACTION_NONE|" + + "CLICK_ACTION_OPEN|CLICK_ACTION_OPEN_MEDIA|CLICK_ACTION_PAY|CLICK_ACTION_PLAY|" + + "CLICK_ACTION_SIT|CLICK_ACTION_TOUCH|CONTENT_TYPE_ATOM|CONTENT_TYPE_FORM|" + + "CONTENT_TYPE_HTML|CONTENT_TYPE_JSON|CONTENT_TYPE_LLSD|CONTENT_TYPE_RSS|" + + "CONTENT_TYPE_TEXT|CONTENT_TYPE_XHTML|CONTENT_TYPE_XML|" + + "CONTROL_BACK|CONTROL_DOWN|CONTROL_FWD|CONTROL_LBUTTON|CONTROL_LEFT|CONTROL_ML_LBUTTON|" + + "CONTROL_RIGHT|CONTROL_ROT_LEFT|CONTROL_ROT_RIGHT|CONTROL_UP|DATA_BORN|" + + "DATA_NAME|DATA_ONLINE|DATA_PAYINFO|DATA_SIM_POS|DATA_SIM_RATING|DATA_SIM_STATUS|" + + "DENSITY|DEBUG_CHANNEL|ESTATE_ACCESS_ALLOWED_AGENT_ADD|ESTATE_ACCESS_ALLOWED_AGENT_REMOVE|" + + "ESTATE_ACCESS_ALLOWED_GROUP_ADD|ESTATE_ACCESS_ALLOWED_GROUP_REMOVE|" + + "ESTATE_ACCESS_BANNED_AGENT_ADD|ESTATE_ACCESS_BANNED_AGENT_REMOVE|" + + "FORCE_DIRECT_PATH|FRICTION|GCNP_RADIUS|GCNP_STATIC|GRAVITY_MULTIPLIER|" + + "HORIZONTAL|HTTP_BODY_MAXLENGTH|HTTP_BODY_TRUNCATED|HTTP_CUSTOM_HEADER|" + + "HTTP_METHOD|HTTP_MIMETYPE|HTTP_PRAGMA_NO_CACHE|HTTP_VERBOSE_THROTTLE|" + + "HTTP_VERIFY_CERT|INVENTORY_ALL|INVENTORY_ANIMATION|INVENTORY_BODYPART|" + + "INVENTORY_CLOTHING|INVENTORY_GESTURE|INVENTORY_LANDMARK|INVENTORY_NONE|" + + "INVENTORY_NOTECARD|INVENTORY_OBJECT|INVENTORY_SCRIPT|INVENTORY_SOUND|" + + "INVENTORY_TEXTURE|JSON_APPEND|KFM_CMD_PAUSE|KFM_CMD_PLAY|" + + "KFM_CMD_SET_MODE|KFM_CMD_STOP|KFM_COMMAND|KFM_DATA|" + + "KFM_FORWARD|KFM_LOOP|KFM_MODE|KFM_PING_PONG|KFM_REVERSE|KFM_ROTATION|" + + "KFM_TRANSLATION|LAND_LEVEL|LAND_LOWER|LAND_NOISE|LAND_RAISE|LAND_REVERT|" + + "LAND_SMOOTH|LINK_ALL_CHILDREN|LINK_ALL_OTHERS|LINK_ROOT|LINK_SET|LINK_THIS|" + + "LIST_STAT_GEOMETRIC_MEAN|LIST_STAT_MAX|LIST_STAT_MEAN|LIST_STAT_MEDIAN|" + + "LIST_STAT_MIN|LIST_STAT_NUM_COUNT|LIST_STAT_RANGE|LIST_STAT_STD_DEV|LIST_STAT_SUM|" + + "LIST_STAT_SUM_SQUARES|LOOP|MASK_BASE|MASK_EVERYONE|MASK_GROUP|MASK_NEXT|" + + "MASK_OWNER|OBJECT_ATTACHED_POINT|OBJECT_CREATOR|OBJECT_DESC|" + + "OBJECT_GROUP|OBJECT_NAME|OBJECT_OWNER|OBJECT_PATHFINDING_TYPE|OBJECT_PHYSICS_COST|" + + "OBJECT_POS|OBJECT_PRIM_EQUIVALENCE|OBJECT_ROOT|OBJECT_ROT|OBJECT_RUNNING_SCRIPT_COUNT|" + + "OBJECT_SCRIPT_MEMORY|OBJECT_SCRIPT_TIME|OBJECT_SERVER_COST|OBJECT_STREAMING_COST|" + + "OBJECT_TOTAL_SCRIPT_COUNT|OBJECT_UNKNOWN_DETAIL|OBJECT_VELOCITY|OPT_AVATAR|" + + "OPT_CHARACTER|OPT_EXCLUSION_VOLUME|OPT_LEGACY_LINKSET|OPT_MATERIAL_VOLUME|" + + "OPT_OTHER|OPT_STATIC_OBSTACLE|OPT_WALKABLE|PARCEL_COUNT_GROUP|PARCEL_COUNT_OTHER|" + + "PARCEL_COUNT_OWNER|PARCEL_COUNT_SELECTED|PARCEL_COUNT_TEMP|PARCEL_COUNT_TOTAL|" + + "PARCEL_DETAILS_AREA|PARCEL_DETAILS_DESC|PARCEL_DETAILS_GROUP|PARCEL_DETAILS_ID|" + + "PARCEL_DETAILS_NAME|PARCEL_DETAILS_OWNER|PARCEL_DETAILS_SEE_AVATARS|" + + "PARCEL_FLAG_ALLOW_ALL_OBJECT_ENTRY|PARCEL_FLAG_ALLOW_CREATE_GROUP_OBJECTS|" + + "PARCEL_FLAG_ALLOW_CREATE_OBJECTS|PARCEL_FLAG_ALLOW_DAMAGE|PARCEL_FLAG_ALLOW_FLY|" + + "PARCEL_FLAG_ALLOW_GROUP_OBJECT_ENTRY|PARCEL_FLAG_ALLOW_GROUP_SCRIPTS|" + + "PARCEL_FLAG_ALLOW_LANDMARK|PARCEL_FLAG_ALLOW_SCRIPTS|PARCEL_FLAG_ALLOW_TERRAFORM|" + + "PARCEL_FLAG_LOCAL_SOUND_ONLY|PARCEL_FLAG_RESTRICT_PUSHOBJECT|PARCEL_FLAG_USE_ACCESS_GROUP|" + + "PARCEL_FLAG_USE_ACCESS_LIST|PARCEL_FLAG_USE_BAN_LIST|PARCEL_FLAG_USE_LAND_PASS_LIST|" + + "PARCEL_MEDIA_COMMAND_AGENT|PARCEL_MEDIA_COMMAND_AUTO_ALIGN|PARCEL_MEDIA_COMMAND_DESC|" + + "PARCEL_MEDIA_COMMAND_LOOP|PARCEL_MEDIA_COMMAND_LOOP_SET|PARCEL_MEDIA_COMMAND_PAUSE|" + + "PARCEL_MEDIA_COMMAND_PLAY|PARCEL_MEDIA_COMMAND_SIZE|PARCEL_MEDIA_COMMAND_STOP|" + + "PARCEL_MEDIA_COMMAND_TEXTURE|PARCEL_MEDIA_COMMAND_TIME|PARCEL_MEDIA_COMMAND_TYPE|" + + "PARCEL_MEDIA_COMMAND_UNLOAD|PARCEL_MEDIA_COMMAND_URL|PASSIVE|PATROL_PAUSE_AT_WAYPOINTS|" + + "PAYMENT_INFO_ON_FILE|PAYMENT_INFO_USED|PAY_DEFAULT|PAY_HIDE|PERMISSION_ATTACH|" + + "PERMISSION_CHANGE_LINKS|PERMISSION_CONTROL_CAMERA|PERMISSION_DEBIT|PERMISSION_OVERRIDE_ANIMATIONS|" + + "PERMISSION_SILENT_ESTATE_MANAGEMENT|PERMISSION_TAKE_CONTROLS|PERMISSION_TELEPORT|" + + "PERMISSION_TRACK_CAMERA|PERMISSION_TRIGGER_ANIMATION|PERM_ALL|PERM_COPY|PERM_MODIFY|" + + "PERM_MOVE|PERM_TRANSFER|PING_PONG|PRIM_BUMP_BARK|PRIM_BUMP_BLOBS|PRIM_BUMP_BRICKS|" + + "PRIM_BUMP_BRIGHT|PRIM_BUMP_CHECKER|PRIM_BUMP_CONCRETE|PRIM_BUMP_DARK|PRIM_BUMP_DISKS|" + + "PRIM_BUMP_GRAVEL|PRIM_BUMP_LARGETILE|PRIM_BUMP_NONE|PRIM_BUMP_SHINY|PRIM_BUMP_SIDING|" + + "PRIM_BUMP_STONE|PRIM_BUMP_STUCCO|PRIM_BUMP_SUCTION|PRIM_BUMP_TILE|PRIM_BUMP_WEAVE|" + + "PRIM_BUMP_WOOD|PRIM_COLOR|PRIM_DESC|PRIM_FLEXIBLE|PRIM_FULLBRIGHT|PRIM_GLOW|" + + "PRIM_HOLE_CIRCLE|PRIM_HOLE_DEFAULT|PRIM_HOLE_SQUARE|PRIM_HOLE_TRIANGLE|PRIM_LINK_TARGET|" + + "PRIM_MATERIAL|PRIM_MATERIAL_FLESH|PRIM_MATERIAL_GLASS|PRIM_MATERIAL_LIGHT|" + + "PRIM_MATERIAL_METAL|PRIM_MATERIAL_PLASTIC|PRIM_MATERIAL_RUBBER|PRIM_MATERIAL_STONE|" + + "PRIM_MATERIAL_WOOD|PRIM_MEDIA_ALT_IMAGE_ENABLE|PRIM_MEDIA_AUTO_LOOP|PRIM_MEDIA_AUTO_PLAY|" + + "PRIM_MEDIA_AUTO_SCALE|PRIM_MEDIA_AUTO_ZOOM|PRIM_MEDIA_CONTROLS|PRIM_MEDIA_CONTROLS_STANDARD|" + + "PRIM_MEDIA_CONTROLS_MINI|PRIM_MEDIA_CURRENT_URL|PRIM_MEDIA_FIRST_CLICK_INTERACT|" + + "PRIM_MEDIA_HEIGHT_PIXELS|PRIM_MEDIA_HOME_URL|PRIM_MEDIA_MAX_HEIGHT_PIXELS|" + + "PRIM_MEDIA_MAX_URL_LENGTH|PRIM_MEDIA_MAX_WHITELIST_COUNT|PRIM_MEDIA_MAX_WHITELIST_SIZE|" + + "PRIM_MEDIA_MAX_WIDTH_PIXELS|PRIM_MEDIA_PARAM_MAX|PRIM_MEDIA_PERM_ANYONE|PRIM_MEDIA_PERM_GROUP|" + + "PRIM_MEDIA_PERM_NONE|PRIM_MEDIA_PERM_OWNER|PRIM_MEDIA_PERMS_CONTROL|PRIM_MEDIA_PERMS_INTERACT|" + + "PRIM_MEDIA_WIDTH_PIXELS|PRIM_MEDIA_WHITELIST|PRIM_MEDIA_WHITELIST_ENABLE|" + + "PRIM_NAME|PRIM_OMEGA|PRIM_PHANTOM|PRIM_PHYSICS|PRIM_PHYSICS_SHAPE_CONVEX|" + + "PRIM_PHYSICS_SHAPE_NONE|PRIM_PHYSICS_SHAPE_PRIM|PRIM_PHYSICS_SHAPE_TYPE|" + + "PRIM_POINT_LIGHT|PRIM_POSITION|PRIM_POS_LOCAL|PRIM_ROTATION|PRIM_ROT_LOCAL|" + + "PRIM_SCULPT_FLAG_INVERT|PRIM_SCULPT_FLAG_MIRROR|PRIM_SCULPT_TYPE_CYLINDER|" + + "PRIM_SCULPT_TYPE_MASK|PRIM_SCULPT_TYPE_PLANE|PRIM_SCULPT_TYPE_SPHERE|PRIM_SCULPT_TYPE_TORUS|" + + "PRIM_SHINY_HIGH|PRIM_SHINY_LOW|PRIM_SHINY_MEDIUM|PRIM_SHINY_NONE|PRIM_SIZE|" + + "PRIM_SLICE|PRIM_TEMP_ON_REZ|PRIM_TEXGEN|PRIM_TEXGEN_DEFAULT|PRIM_TEXGEN_PLANAR|" + + "PRIM_TEXT|PRIM_TEXTURE|PRIM_TYPE|PRIM_TYPE_BOX|PRIM_TYPE_CYLINDER|PRIM_TYPE_PRISM|PRIM_TYPE_RING|" + + "PRIM_TYPE_SCULPT|PRIM_TYPE_SPHERE|PRIM_TYPE_TORUS|PRIM_TYPE_TUBE|PROFILE_NONE|" + + "PROFILE_SCRIPT_MEMORY|PSYS_PART_BOUNCE_MASK|PSYS_PART_EMISSIVE_MASK|PSYS_PART_END_ALPHA|" + + "PSYS_PART_END_COLOR|PSYS_PART_END_SCALE|PSYS_PART_FLAGS|PSYS_PART_FOLLOW_SRC_MASK|" + + "PSYS_PART_FOLLOW_VELOCITY_MASK|PSYS_PART_INTERP_COLOR_MASK|PSYS_PART_INTERP_SCALE_MASK|" + + "PSYS_PART_MAX_AGE|PSYS_PART_START_ALPHA|PSYS_PART_START_COLOR|PSYS_PART_START_SCALE|" + + "PSYS_PART_TARGET_LINEAR_MASK|PSYS_PART_TARGET_POS_MASK|PSYS_PART_WIND_MASK|" + + "PSYS_SRC_ACCEL|PSYS_SRC_ANGLE_BEGIN|PSYS_SRC_ANGLE_END|PSYS_SRC_BURST_PART_COUNT|" + + "PSYS_SRC_BURST_RADIUS|PSYS_SRC_BURST_RATE|PSYS_SRC_BURST_SPEED_MAX|PSYS_SRC_BURST_SPEED_MIN|" + + "PSYS_SRC_MAX_AGE|PSYS_SRC_OMEGA|PSYS_SRC_PATTERN|PSYS_SRC_PATTERN_ANGLE|" + + "PSYS_SRC_PATTERN_ANGLE_CONE|PSYS_SRC_PATTERN_ANGLE_CONE_EMPTY|PSYS_SRC_PATTERN_DROP|" + + "PSYS_SRC_PATTERN_EXPLODE|PSYS_SRC_TARGET_KEY|PSYS_SRC_TEXTURE|PUBLIC_CHANNEL|" + + "PURSUIT_FUZZ_FACTOR|PURSUIT_GOAL_TOLERANCE|PURSUIT_INTERCEPT|PURSUIT_OFFSET|" + + "PU_EVADE_HIDDEN|PU_EVADE_SPOTTED|PU_FAILURE_DYNAMIC_PATHFINDING_DISABLED|" + + "PU_FAILURE_INVALID_GOAL|PU_FAILURE_INVALID_START|PU_FAILURE_NO_NAVMESH|" + + "PU_FAILURE_NO_VALID_DESTINATION|PU_FAILURE_OTHER|PU_FAILURE_PARCEL_UNREACHABLE|" + + "PU_FAILURE_TARGET_GONE|PU_FAILURE_UNREACHABLE|PU_GOAL_REACHED|PU_SLOWDOWN_DISTANCE_REACHED|" + + "RC_DATA_FLAGS|RC_DETECT_PHANTOM|RC_GET_LINK_NUM|RC_GET_NORMAL|RC_GET_ROOT_KEY|" + + "RC_MAX_HITS|RC_REJECT_AGENTS|RC_REJECT_LAND|RC_REJECT_NONPHYSICAL|RC_REJECT_PHYSICAL|" + + "RC_REJECT_TYPES|RCERR_CAST_TIME_EXCEEDED|RCERR_SIM_PERF_LOW|RCERR_UNKNOWN|" + + "REGION_FLAG_ALLOW_DAMAGE|REGION_FLAG_ALLOW_DIRECT_TELEPORT|REGION_FLAG_BLOCK_FLY|" + + "REGION_FLAG_BLOCK_TERRAFORM|REGION_FLAG_DISABLE_COLLISIONS|REGION_FLAG_DISABLE_PHYSICS|" + + "REGION_FLAG_FIXED_SUN|REGION_FLAG_RESTRICT_PUSHOBJECT|REGION_FLAG_SANDBOX|" + + "REMOTE_DATA_CHANNEL|REMOTE_DATA_REPLY|REMOTE_DATA_REQUEST|REQUIRE_LINE_OF_SIGHT|" + + "RESTITUTION|REVERSE|ROTATE|SCALE|SCRIPTED|SIM_STAT_PCT_CHARS_STEPPED|SMOOTH|" + + "STATUS_BLOCK_GRAB|STATUS_BLOCK_GRAB_OBJECT|STATUS_BOUNDS_ERROR|STATUS_CAST_SHADOWS|" + + "STATUS_DIE_AT_EDGE|STATUS_INTERNAL_ERROR|STATUS_MALFORMED_PARAMS|STATUS_NOT_FOUND|" + + "STATUS_NOT_SUPPORTED|STATUS_OK|STATUS_PHANTOM|STATUS_PHYSICS|STATUS_RETURN_AT_EDGE|" + + "STATUS_ROTATE_X|STATUS_ROTATE_Y|STATUS_ROTATE_Z|STATUS_SANDBOX|STATUS_TYPE_MISMATCH|" + + "STATUS_WHITELIST_FAILED|STRING_TRIM|STRING_TRIM_HEAD|STRING_TRIM_TAIL|TOUCH_INVALID_FACE|" + + "TRAVERSAL_TYPE|TRAVERSAL_TYPE_FAST|TRAVERSAL_TYPE_NONE|TRAVERSAL_TYPE_SLOW|" + + "TYPE_FLOAT|TYPE_INTEGER|TYPE_INVALID|TYPE_KEY|TYPE_ROTATION|TYPE_STRING|" + + "TYPE_VECTOR|VEHICLE_ANGULAR_DEFLECTION_EFFICIENCY|" + + "VEHICLE_ANGULAR_DEFLECTION_TIMESCALE|VEHICLE_ANGULAR_FRICTION_TIMESCALE|" + + "VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE|VEHICLE_ANGULAR_MOTOR_DIRECTION|VEHICLE_ANGULAR_MOTOR_TIMESCALE|" + + "VEHICLE_BANKING_EFFICIENCY|VEHICLE_BANKING_MIX|VEHICLE_BANKING_TIMESCALE|" + + "VEHICLE_BUOYANCY|VEHICLE_FLAG_CAMERA_DECOUPLED|VEHICLE_FLAG_HOVER_GLOBAL_HEIGHT|" + + "VEHICLE_FLAG_HOVER_TERRAIN_ONLY|VEHICLE_FLAG_HOVER_UP_ONLY|VEHICLE_FLAG_HOVER_WATER_ONLY|" + + "VEHICLE_FLAG_LIMIT_MOTOR_UP|VEHICLE_FLAG_LIMIT_ROLL_ONLY|VEHICLE_FLAG_MOUSELOOK_BANK|" + + "VEHICLE_FLAG_MOUSELOOK_STEER|VEHICLE_FLAG_NO_DEFLECTION_UP|VEHICLE_HOVER_EFFICIENCY|" + + "VEHICLE_HOVER_HEIGHT|VEHICLE_HOVER_TIMESCALE|VEHICLE_LINEAR_DEFLECTION_EFFICIENCY|" + + "VEHICLE_LINEAR_DEFLECTION_TIMESCALE|VEHICLE_LINEAR_FRICTION_TIMESCALE|VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE|" + + "VEHICLE_LINEAR_MOTOR_DIRECTION|VEHICLE_LINEAR_MOTOR_OFFSET|VEHICLE_LINEAR_MOTOR_TIMESCALE|" + + "VEHICLE_REFERENCE_FRAME|VEHICLE_TYPE_AIRPLANE|VEHICLE_TYPE_BALLOON|VEHICLE_TYPE_BOAT|" + + "VEHICLE_TYPE_CAR|VEHICLE_TYPE_NONE|VEHICLE_TYPE_SLED|VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY|" + + "VEHICLE_VERTICAL_ATTRACTION_TIMESCALE|VERTICAL|WANDER_PAUSE_AT_WAYPOINTS", + "constant.language.integer.boolean.lsl" : "FALSE|TRUE", + "constant.language.quaternion.lsl" : "ZERO_ROTATION", + "constant.language.string.lsl" : "EOF|JSON_ARRAY|JSON_FALSE|JSON_INVALID|" + + "JSON_NULL|JSON_NUMBER|JSON_OBJECT|JSON_STRING|JSON_TRUE|NULL_KEY|" + + "TEXTURE_BLANK|TEXTURE_DEFAULT|TEXTURE_MEDIA|TEXTURE_PLYWOOD|" + + "TEXTURE_TRANSPARENT|URL_REQUEST_DENIED|URL_REQUEST_GRANTED", + "constant.language.vector.lsl" : "TOUCH_INVALID_TEXCOORD|TOUCH_INVALID_VECTOR|ZERO_VECTOR", + "invalid.deprecated.lsl" : "llCloud|llCollisionSprite|llGodLikeRezObject|llMakeExplosion|" + + "llMakeFountain|llMakeSmoke|llMakeFire|llPointAt|llStopPointAt|llRefreshPrimURL|" + + "llSetPrimURL|llReleaseCamera|llTakeCamera|llRemoteDataSetRegion|llRemoteLoadScript|" + + "llSetInventoryPermMask|llSound|llSoundPreload|llXorBase64Strings|AGENT|" + + "CHARACTER_MAX_ANGULAR_ACCEL|CHARACTER_MAX_ANGULAR_SPEED|CHARACTER_TURN_SPEED_MULTIPLIER|" + + "DATA_RATING|LAND_LARGE_BRUSH|LAND_MEDIUM_BRUSH|LAND_SMALL_BRUSH|PERMISSION_CHANGE_JOINTS|" + + "PERMISSION_CHANGE_PERMISSIONS|PERMISSION_RELEASE_OWNERSHIP|PERMISSION_REMAP_CONTROLS|" + + "PRIM_CAST_SHADOWS|PRIM_PHYSICS_MATERIAL|PRIM_TYPE_LEGACY|PSYS_SRC_INNERANGLE|" + + "PSYS_SRC_OUTERANGLE|VEHICLE_FLAG_NO_FLY_UP", + "invalid.illegal.lsl" : "event|print", + "keyword.control.lsl" : "do|else|for|if|jump|return|while", + "storage.type.lsl" : "float|integer|key|list|quaternion|rotation|string|vector", + "support.function.lsl": "llAbs|llAcos|llAddToLandBanList|llAddToLandPassList|" + + "llAdjustSoundVolume|llAllowInventoryDrop|llAngleBetween|llApplyImpulse|" + + "llApplyRotationalImpulse|llAsin|llAtan2|llAttachToAvatar|llAttachToAvatarTemp|" + + "llAvatarOnLinkSitTarget|llAvatarOnSitTarget|llAxes2Rot|llAxisAngle2Rot|" + + "llBase64ToInteger|llBase64ToString|llBreakAllLinks|llBreakLink|llCastRay|" + + "llCeil|llClearCameraParams|llClearLinkMedia|llClearPrimMedia|llCloseRemoteDataChannel|" + + "llCollisionFilter|llCollisionSound|llCos|llCreateCharacter|llCreateLink|" + + "llCSV2List|llDeleteCharacter|llDeleteSubList|llDeleteSubString|llDetachFromAvatar|" + + "llDetectedGrab|llDetectedGroup|llDetectedKey|llDetectedLinkNumber|llDetectedName|" + + "llDetectedOwner|llDetectedPos|llDetectedRot|llDetectedTouchBinormal|" + + "llDetectedTouchFace|llDetectedTouchNormal|llDetectedTouchPos|llDetectedTouchST|" + + "llDetectedTouchUV|llDetectedType|llDetectedVel|llDialog|llDie|llDumpList2String|" + + "llEdgeOfWorld|llEjectFromLand|llEmail|llEscapeURL|llEuler2Rot|llExecCharacterCmd|" + + "llEvade|llFabs|llFleeFrom|llFloor|llForceMouselook|llFrand|llGenerateKey|" + + "llGetAccel|llGetAgentInfo|llGetAgentLanguage|llGetAgentList|llGetAgentSize|" + + "llGetAlpha|llGetAndResetTime|llGetAnimation|llGetAnimationList|llGetAnimationOverride|" + + "llGetAttached|llGetBoundingBox|llGetCameraPos|llGetCameraRot|llGetCenterOfMass|" + + "llGetClosestNavPoint|llGetColor|llGetCreator|llGetDate|llGetDisplayName|" + + "llGetEnergy|llGetEnv|llGetForce|llGetFreeMemory|llGetFreeURLs|llGetGeometricCenter|" + + "llGetGMTclock|llGetHTTPHeader|llGetInventoryCreator|llGetInventoryKey|llGetInventoryName|" + + "llGetInventoryNumber|llGetInventoryPermMask|llGetInventoryType|llGetKey|" + + "llGetLandOwnerAt|llGetLinkKey|llGetLinkMedia|llGetLinkName|llGetLinkNumber|" + + "llGetLinkNumberOfSides|llGetLinkPrimitiveParams|llGetListEntryType|llGetListLength|" + + "llGetLocalPos|llGetLocalRot|llGetMass|llGetMassMKS|llGetMemoryLimit|" + + "llGetNextEmail|llGetNotecardLine|llGetNumberOfNotecardLines|llGetNumberOfPrims|" + + "llGetNumberOfSides|llGetObjectDesc|llGetObjectDetails|llGetObjectMass|" + + "llGetObjectName|llGetObjectPermMask|llGetObjectPrimCount|llGetOmega|" + + "llGetOwner|llGetOwnerKey|llGetParcelDetails|llGetParcelFlags|llGetParcelMaxPrims|" + + "llGetParcelMusicURL|llGetParcelPrimCount|llGetParcelPrimOwners|llGetPermissions|" + + "llGetPermissionsKey|llGetPhysicsMaterial|llGetPos|llGetPrimitiveParams|" + + "llGetPrimMediaParams|llGetRegionAgentCount|llGetRegionCorner|llGetRegionFlags|" + + "llGetRegionFPS|llGetRegionName|llGetRegionTimeDilation|llGetRootPosition|" + + "llGetRootRotation|llGetRot|llGetScale|llGetScriptName|llGetScriptState|" + + "llGetSimStats|llGetSimulatorHostname|llGetSPMaxMemory|llGetStartParameter|" + + "llGetStaticPath|llGetStatus|llGetSubString|llGetSunDirection|llGetTexture|" + + "llGetTextureOffset|llGetTextureRot|llGetTextureScale|llGetTime|llGetTimeOfDay|" + + "llGetTimestamp|llGetTorque|llGetUnixTime|llGetUsedMemory|llGetUsername|" + + "llGetVel|llGetWallclock|llGiveInventory|llGiveInventoryList|llGiveMoney|" + + "llGround|llGroundContour|llGroundNormal|llGroundRepel|llGroundSlope|" + + "llHTTPRequest|llHTTPResponse|llInsertString|llInstantMessage|llIntegerToBase64|" + + "llJson2List|llJsonGetValue|llJsonSetValue|llJsonValueType|llKey2Name|" + + "llLinkParticleSystem|llLinkSitTarget|llList2CSV|llList2Float|llList2Integer|" + + "llList2Json|llList2Key|llList2List|llList2ListStrided|llList2Rot|" + + "llList2String|llList2Vector|llListen|llListenControl|llListenRemove|" + + "llListFindList|llListInsertList|llListRandomize|llListReplaceList|llListSort|" + + "llListStatistics|llLoadURL|llLog|llLog10|llLookAt|llLoopSound|llLoopSoundMaster|" + + "llLoopSoundSlave|llManageEstateAccess|llMapDestination|llMD5String|llMessageLinked|" + + "llMinEventDelay|llModifyLand|llModPow|llMoveToTarget|llNavigateTo|llOffsetTexture|" + + "llOpenRemoteDataChannel|llOverMyLand|llOwnerSay|llParcelMediaCommandList|" + + "llParcelMediaQuery|llParseString2List|llParseStringKeepNulls|llParticleSystem|" + + "llPassCollisions|llPassTouches|llPatrolPoints|llPlaySound|llPlaySoundSlave|" + + "llPow|llPreloadSound|llPursue|llPushObject|llRegionSay|llRegionSayTo|" + + "llReleaseControls|llReleaseURL|llRemoteDataReply|llRemoteLoadScriptPin|" + + "llRemoveFromLandBanList|llRemoveFromLandPassList|llRemoveInventory|llRemoveVehicleFlags|" + + "llRequestAgentData|llRequestDisplayName|llRequestInventoryData|llRequestPermissions|" + + "llRequestSecureURL|llRequestSimulatorData|llRequestURL|llRequestUsername|" + + "llResetAnimationOverride|llResetLandBanList|llResetLandPassList|llResetOtherScript|" + + "llResetScript|llResetTime|llRezAtRoot|llRezObject|llRot2Angle|llRot2Axis|llRot2Euler|" + + "llRot2Fwd|llRot2Left|llRot2Up|llRotateTexture|llRotBetween|llRotLookAt|" + + "llRotTarget|llRotTargetRemove|llRound|llSameGroup|llSay|llScaleTexture|" + + "llScriptDanger|llScriptProfiler|llSendRemoteData|llSensor|llSensorRemove|" + + "llSensorRepeat|llSetAlpha|llSetAngularVelocity|llSetAnimationOverride|llSetBuoyancy|" + + "llSetCameraAtOffset|llSetCameraEyeOffset|llSetCameraParams|llSetClickAction|" + + "llSetColor|llSetContentType|llSetDamage|llSetForce|llSetForceAndTorque|llSetHoverHeight|" + + "llSetKeyframedMotion|llSetLinkAlpha|llSetLinkCamera|llSetLinkColor|llSetLinkMedia|" + + "llSetLinkPrimitiveParams|llSetLinkPrimitiveParamsFast|llSetLinkTexture|llSetLinkTextureAnim|" + + "llSetLocalRot|llSetMemoryLimit|llSetObjectDesc|llSetObjectName|llSetParcelMusicURL|" + + "llSetPayPrice|llSetPhysicsMaterial|llSetPos|llSetPrimitiveParams|llSetPrimMediaParams|" + + "llSetRegionPos|llSetRemoteScriptAccessPin|llSetRot|llSetScale|llSetScriptState|" + + "llSetSitText|llSetSoundQueueing|llSetSoundRadius|llSetStatus|llSetText|" + + "llSetTexture|llSetTextureAnim|llSetTimerEvent|llSetTorque|llSetTouchText|" + + "llSetVehicleFlags|llSetVehicleFloatParam|llSetVehicleRotationParam|llSetVehicleType|" + + "llSetVehicleVectorParam|llSetVelocity|llSHA1String|llShout|llSin|llSitTarget|" + + "llSleep|llSqrt|llStartAnimation|llStopAnimation|llStopHover|llStopLookAt|" + + "llStopMoveToTarget|llStopSound|llStringLength|llStringToBase64|llStringTrim|" + + "llSubStringIndex|llTakeControls|llTan|llTarget|llTargetOmega|llTargetRemove|" + + "llTeleportAgent|llTeleportAgentGlobalCoords|llTeleportAgentHome|llTextBox|" + + "llToLower|llToUpper|llTransferLindenDollars|llTriggerSound|llTriggerSoundLimited|" + + "llUnescapeURL|llUnSit|llUpdateCharacter|llVecDist|llVecMag|llVecNorm|" + + "llVolumeDetect|llWanderWithin|llWater|llWhisper|llWind|llXorBase64StringsCorrect", + "support.function.event.lsl" : "at_rot_target|at_target|attach|changed|collision|" + + "collision_end|collision_start|control|dataserver|email|http_request|" + + "http_response|land_collision|land_collision_end|land_collision_start|" + + "link_message|listen|money|moving_end|moving_start|no_sensor|not_at_rot_target|" + + "not_at_target|object_rez|on_rez|path_update|remote_data|run_time_permissions|" + + "sensor|state_entry|state_exit|timer|touch|touch_end|touch_start|transaction_result" + }, "identifier"); + + this.$rules = { + "start" : [ + { + token : "comment.line.double-slash.lsl", + regex : "\\/\\/.*$" + }, { + token : "comment.block.lsl", + regex : "\\/\\*", + next : "comment" + }, { + token : "string.quoted.double.lsl", + start : '"', + end : '"', + next : [{ + token : "constant.language.escape.lsl", regex : /\\[tn"\\]/ + }] + }, { + token : "constant.numeric.lsl", + regex : "(0[xX][0-9a-fA-F]+|[+-]?[0-9]+(?:(?:\\.[0-9]*)?(?:[eE][+-]?[0-9]+)?)?)\\b" + }, { + token : "entity.name.state.lsl", + regex : "\\b((state)\\s+\\w+|default)\\b" + }, { + token : keywordMapper, + regex : "\\b[a-zA-Z_][a-zA-Z0-9_]*\\b" + }, { + token : "support.function.user-defined.lsl", + regex : /\b([a-zA-Z_]\w*)(?=\(.*?\))/ + }, { + token : "keyword.operator.lsl", + regex : "\\+\\+|\\-\\-|<<|>>|&&?|\\|\\|?|\\^|~|[!%<>=*+\\-\\/]=?" + }, { + token : "punctuation.operator.lsl", + regex : "\\,|\\;" + }, { + token : "paren.lparen.lsl", + regex : "[\\[\\(\\{]" + }, { + token : "paren.rparen.lsl", + regex : "[\\]\\)\\}]" + }, { + token : "text.lsl", + regex : "\\s+" + } + ], + "comment" : [ + { + token : "comment.block.lsl", + regex : ".*?\\*\\/", + next : "start" + }, { + token : "comment.block.lsl", + regex : ".+" + } + ] + }; + this.normalizeRules(); +} + +exports.LSLHighlightRules = LSLHighlightRules; +}); + +ace.define('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) { + + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define('ace/mode/behaviour/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/token_iterator', 'ace/lib/lang'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; +var lang = require("../../lib/lang"); + +var SAFE_INSERT_IN_TOKENS = + ["text", "paren.rparen", "punctuation.operator"]; +var SAFE_INSERT_BEFORE_TOKENS = + ["text", "paren.rparen", "punctuation.operator", "comment"]; + + +var autoInsertedBrackets = 0; +var autoInsertedRow = -1; +var autoInsertedLineEnd = ""; +var maybeInsertedBrackets = 0; +var maybeInsertedRow = -1; +var maybeInsertedLineStart = ""; +var maybeInsertedLineEnd = ""; + +var CstyleBehaviour = function () { + + CstyleBehaviour.isSaneInsertion = function(editor, session) { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + if (!this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) { + var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1); + if (!this.$matchTokenType(iterator2.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) + return false; + } + iterator.stepForward(); + return iterator.getCurrentTokenRow() !== cursor.row || + this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_BEFORE_TOKENS); + }; + + CstyleBehaviour.$matchTokenType = function(token, types) { + return types.indexOf(token.type || token) > -1; + }; + + CstyleBehaviour.recordAutoInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isAutoInsertedClosing(cursor, line, autoInsertedLineEnd[0])) + autoInsertedBrackets = 0; + autoInsertedRow = cursor.row; + autoInsertedLineEnd = bracket + line.substr(cursor.column); + autoInsertedBrackets++; + }; + + CstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isMaybeInsertedClosing(cursor, line)) + maybeInsertedBrackets = 0; + maybeInsertedRow = cursor.row; + maybeInsertedLineStart = line.substr(0, cursor.column) + bracket; + maybeInsertedLineEnd = line.substr(cursor.column); + maybeInsertedBrackets++; + }; + + CstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) { + return autoInsertedBrackets > 0 && + cursor.row === autoInsertedRow && + bracket === autoInsertedLineEnd[0] && + line.substr(cursor.column) === autoInsertedLineEnd; + }; + + CstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) { + return maybeInsertedBrackets > 0 && + cursor.row === maybeInsertedRow && + line.substr(cursor.column) === maybeInsertedLineEnd && + line.substr(0, cursor.column) == maybeInsertedLineStart; + }; + + CstyleBehaviour.popAutoInsertedClosing = function() { + autoInsertedLineEnd = autoInsertedLineEnd.substr(1); + autoInsertedBrackets--; + }; + + CstyleBehaviour.clearMaybeInsertedClosing = function() { + maybeInsertedBrackets = 0; + maybeInsertedRow = -1; + }; + + this.add("braces", "insertion", function (state, action, editor, session, text) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (text == '{') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "{" && editor.getWrapBehavioursEnabled()) { + return { + text: '{' + selected + '}', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + if (/[\]\}\)]/.test(line[cursor.column])) { + CstyleBehaviour.recordAutoInsert(editor, session, "}"); + return { + text: '{}', + selection: [1, 1] + }; + } else { + CstyleBehaviour.recordMaybeInsert(editor, session, "{"); + return { + text: '{', + selection: [1, 1] + }; + } + } + } else if (text == '}') { + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}') { + var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } else if (text == "\n" || text == "\r\n") { + var closing = ""; + if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) { + closing = lang.stringRepeat("}", maybeInsertedBrackets); + CstyleBehaviour.clearMaybeInsertedClosing(); + } + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}' || closing !== "") { + var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column}, '}'); + if (!openBracePos) + return null; + + var indent = this.getNextLineIndent(state, line.substring(0, cursor.column), session.getTabString()); + var next_indent = this.$getIndent(line); + + return { + text: '\n' + indent + '\n' + next_indent + closing, + selection: [1, indent.length, 1, indent.length] + }; + } + } + }); + + this.add("braces", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '{') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar == '}') { + range.end.column++; + return range; + } else { + maybeInsertedBrackets--; + } + } + }); + + this.add("parens", "insertion", function (state, action, editor, session, text) { + if (text == '(') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return { + text: '(' + selected + ')', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, ")"); + return { + text: '()', + selection: [1, 1] + }; + } + } else if (text == ')') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ')') { + var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("parens", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '(') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ')') { + range.end.column++; + return range; + } + } + }); + + this.add("brackets", "insertion", function (state, action, editor, session, text) { + if (text == '[') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return { + text: '[' + selected + ']', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, "]"); + return { + text: '[]', + selection: [1, 1] + }; + } + } else if (text == ']') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ']') { + var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("brackets", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '[') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ']') { + range.end.column++; + return range; + } + } + }); + + this.add("string_dquotes", "insertion", function (state, action, editor, session, text) { + if (text == '"' || text == "'") { + var quote = text; + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "'" && selected != '"' && editor.getWrapBehavioursEnabled()) { + return { + text: quote + selected + quote, + selection: false + }; + } else { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var leftChar = line.substring(cursor.column-1, cursor.column); + if (leftChar == '\\') { + return null; + } + var tokens = session.getTokens(selection.start.row); + var col = 0, token; + var quotepos = -1; // Track whether we're inside an open quote. + + for (var x = 0; x < tokens.length; x++) { + token = tokens[x]; + if (token.type == "string") { + quotepos = -1; + } else if (quotepos < 0) { + quotepos = token.value.indexOf(quote); + } + if ((token.value.length + col) > selection.start.column) { + break; + } + col += tokens[x].value.length; + } + if (!token || (quotepos < 0 && token.type !== "comment" && (token.type !== "string" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) { + if (!CstyleBehaviour.isSaneInsertion(editor, session)) + return; + return { + text: quote + quote, + selection: [1,1] + }; + } else if (token && token.type === "string") { + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == quote) { + return { + text: '', + selection: [1, 1] + }; + } + } + } + } + }); + + this.add("string_dquotes", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && (selected == '"' || selected == "'")) { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == selected) { + range.end.column++; + return range; + } + } + }); + +}; + +oop.inherits(CstyleBehaviour, Behaviour); + +exports.CstyleBehaviour = CstyleBehaviour; +}); + +ace.define('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var line = session.getLine(row); + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i + match[0].length, 1); + } + + if (foldStyle !== "markbeginend") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + +}).call(FoldMode.prototype); + +}); diff --git a/0.0.3_0/ace/mode-lua.js b/0.0.3_0/ace/mode-lua.js new file mode 100644 index 0000000..6b244e7 --- /dev/null +++ b/0.0.3_0/ace/mode-lua.js @@ -0,0 +1,455 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2010, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/mode/lua', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/lua_highlight_rules', 'ace/mode/folding/lua', 'ace/range', 'ace/worker/worker_client'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var LuaHighlightRules = require("./lua_highlight_rules").LuaHighlightRules; +var LuaFoldMode = require("./folding/lua").FoldMode; +var Range = require("../range").Range; +var WorkerClient = require("../worker/worker_client").WorkerClient; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new LuaHighlightRules().getRules()); + this.foldingRules = new LuaFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "--"; + this.blockComment = {start: "--[", end: "]--"}; + + var indentKeywords = { + "function": 1, + "then": 1, + "do": 1, + "else": 1, + "elseif": 1, + "repeat": 1, + "end": -1, + "until": -1 + }; + var outdentKeywords = [ + "else", + "elseif", + "end", + "until" + ]; + + function getNetIndentLevel(tokens) { + var level = 0; + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i]; + if (token.type == "keyword") { + if (token.value in indentKeywords) { + level += indentKeywords[token.value]; + } + } else if (token.type == "paren.lparen") { + level ++; + } else if (token.type == "paren.rparen") { + level --; + } + } + if (level < 0) { + return -1; + } else if (level > 0) { + return 1; + } else { + return 0; + } + } + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + var level = 0; + + var tokenizedLine = this.$tokenizer.getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + + if (state == "start") { + level = getNetIndentLevel(tokens); + } + if (level > 0) { + return indent + tab; + } else if (level < 0 && indent.substr(indent.length - tab.length) == tab) { + if (!this.checkOutdent(state, line, "\n")) { + return indent.substr(0, indent.length - tab.length); + } + } + return indent; + }; + + this.checkOutdent = function(state, line, input) { + if (input != "\n" && input != "\r" && input != "\r\n") + return false; + + if (line.match(/^\s*[\)\}\]]$/)) + return true; + + var tokens = this.$tokenizer.getLineTokens(line.trim(), state).tokens; + + if (!tokens || !tokens.length) + return false; + + return (tokens[0].type == "keyword" && outdentKeywords.indexOf(tokens[0].value) != -1); + }; + + this.autoOutdent = function(state, session, row) { + var prevLine = session.getLine(row - 1); + var prevIndent = this.$getIndent(prevLine).length; + var prevTokens = this.$tokenizer.getLineTokens(prevLine, "start").tokens; + var tabLength = session.getTabString().length; + var expectedIndent = prevIndent + tabLength * getNetIndentLevel(prevTokens); + var curIndent = this.$getIndent(session.getLine(row)).length; + if (curIndent < expectedIndent) { + return; + } + session.outdentRows(new Range(row, 0, row + 2, 0)); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/lua_worker", "Worker"); + worker.attachToDocument(session.getDocument()); + + worker.on("error", function(e) { + session.setAnnotations([e.data]); + }); + + worker.on("ok", function(e) { + session.clearAnnotations(); + }); + + return worker; + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/lua_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var LuaHighlightRules = function() { + + var keywords = ( + "break|do|else|elseif|end|for|function|if|in|local|repeat|"+ + "return|then|until|while|or|and|not" + ); + + var builtinConstants = ("true|false|nil|_G|_VERSION"); + + var functions = ( + "string|xpcall|package|tostring|print|os|unpack|require|"+ + "getfenv|setmetatable|next|assert|tonumber|io|rawequal|"+ + "collectgarbage|getmetatable|module|rawset|math|debug|"+ + "pcall|table|newproxy|type|coroutine|_G|select|gcinfo|"+ + "pairs|rawget|loadstring|ipairs|_VERSION|dofile|setfenv|"+ + "load|error|loadfile|"+ + + "sub|upper|len|gfind|rep|find|match|char|dump|gmatch|"+ + "reverse|byte|format|gsub|lower|preload|loadlib|loaded|"+ + "loaders|cpath|config|path|seeall|exit|setlocale|date|"+ + "getenv|difftime|remove|time|clock|tmpname|rename|execute|"+ + "lines|write|close|flush|open|output|type|read|stderr|"+ + "stdin|input|stdout|popen|tmpfile|log|max|acos|huge|"+ + "ldexp|pi|cos|tanh|pow|deg|tan|cosh|sinh|random|randomseed|"+ + "frexp|ceil|floor|rad|abs|sqrt|modf|asin|min|mod|fmod|log10|"+ + "atan2|exp|sin|atan|getupvalue|debug|sethook|getmetatable|"+ + "gethook|setmetatable|setlocal|traceback|setfenv|getinfo|"+ + "setupvalue|getlocal|getregistry|getfenv|setn|insert|getn|"+ + "foreachi|maxn|foreach|concat|sort|remove|resume|yield|"+ + "status|wrap|create|running|"+ + "__add|__sub|__mod|__unm|__concat|__lt|__index|__call|__gc|__metatable|"+ + "__mul|__div|__pow|__len|__eq|__le|__newindex|__tostring|__mode|__tonumber" + ); + + var stdLibaries = ("string|package|os|io|math|debug|table|coroutine"); + + var futureReserved = ""; + + var deprecatedIn5152 = ("setn|foreach|foreachi|gcinfo|log10|maxn"); + + var keywordMapper = this.createKeywordMapper({ + "keyword": keywords, + "support.function": functions, + "invalid.deprecated": deprecatedIn5152, + "constant.library": stdLibaries, + "constant.language": builtinConstants, + "invalid.illegal": futureReserved, + "variable.language": "this" + }, "identifier"); + + var decimalInteger = "(?:(?:[1-9]\\d*)|(?:0))"; + var hexInteger = "(?:0[xX][\\dA-Fa-f]+)"; + var integer = "(?:" + decimalInteger + "|" + hexInteger + ")"; + + var fraction = "(?:\\.\\d+)"; + var intPart = "(?:\\d+)"; + var pointFloat = "(?:(?:" + intPart + "?" + fraction + ")|(?:" + intPart + "\\.))"; + var floatNumber = "(?:" + pointFloat + ")"; + + this.$rules = { + "start" : [{ + stateName: "bracketedComment", + onMatch : function(value, currentState, stack){ + stack.unshift(this.next, value.length, currentState); + return "comment"; + }, + regex : /\-\-\[=*\[/, + next : [ + { + onMatch : function(value, currentState, stack) { + if (value.length == stack[1]) { + stack.shift(); + stack.shift(); + this.next = stack.shift(); + } else { + this.next = ""; + } + return "comment"; + }, + regex : /(?:[^\\]|\\.)*?\]=*\]/, + next : "start" + }, { + defaultToken : "comment" + } + ] + }, + + { + token : "comment", + regex : "\\-\\-.*$" + }, + { + stateName: "bracketedString", + onMatch : function(value, currentState, stack){ + stack.unshift(this.next, value.length, currentState); + return "comment"; + }, + regex : /\[=*\[/, + next : [ + { + onMatch : function(value, currentState, stack) { + if (value.length == stack[1]) { + stack.shift(); + stack.shift(); + this.next = stack.shift(); + } else { + this.next = ""; + } + return "comment"; + }, + + regex : /(?:[^\\]|\\.)*?\]=*\]/, + next : "start" + }, { + defaultToken : "comment" + } + ] + }, + { + token : "string", // " string + regex : '"(?:[^\\\\]|\\\\.)*?"' + }, { + token : "string", // ' string + regex : "'(?:[^\\\\]|\\\\.)*?'" + }, { + token : "constant.numeric", // float + regex : floatNumber + }, { + token : "constant.numeric", // integer + regex : integer + "\\b" + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "keyword.operator", + regex : "\\+|\\-|\\*|\\/|%|\\#|\\^|~|<|>|<=|=>|==|~=|=|\\:|\\.\\.\\.|\\.\\." + }, { + token : "paren.lparen", + regex : "[\\[\\(\\{]" + }, { + token : "paren.rparen", + regex : "[\\]\\)\\}]" + }, { + token : "text", + regex : "\\s+|\\w+" + } ] + }; + + this.normalizeRules(); +} + +oop.inherits(LuaHighlightRules, TextHighlightRules); + +exports.LuaHighlightRules = LuaHighlightRules; +}); + +ace.define('ace/mode/folding/lua', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/folding/fold_mode', 'ace/range', 'ace/token_iterator'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var BaseFoldMode = require("./fold_mode").FoldMode; +var Range = require("../../range").Range; +var TokenIterator = require("../../token_iterator").TokenIterator; + + +var FoldMode = exports.FoldMode = function() {}; + +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /\b(function|then|do|repeat)\b|{\s*$|(\[=*\[)/; + this.foldingStopMarker = /\bend\b|^\s*}|\]=*\]/; + + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + var isStart = this.foldingStartMarker.test(line); + var isEnd = this.foldingStopMarker.test(line); + + if (isStart && !isEnd) { + var match = line.match(this.foldingStartMarker); + if (match[1] == "then" && /\belseif\b/.test(line)) + return; + if (match[1]) { + if (session.getTokenAt(row, match.index + 1).type === "keyword") + return "start"; + } else if (match[2]) { + var type = session.bgTokenizer.getState(row) || ""; + if (type[0] == "bracketedComment" || type[0] == "bracketedString") + return "start"; + } else { + return "start"; + } + } + if (foldStyle != "markbeginend" || !isEnd || isStart && isEnd) + return ""; + + var match = line.match(this.foldingStopMarker); + if (match[0] === "end") { + if (session.getTokenAt(row, match.index + 1).type === "keyword") + return "end"; + } else if (match[0][0] === "]") { + var type = session.bgTokenizer.getState(row - 1) || ""; + if (type[0] == "bracketedComment" || type[0] == "bracketedString") + return "end"; + } else + return "end"; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var line = session.doc.getLine(row); + var match = this.foldingStartMarker.exec(line); + if (match) { + if (match[1]) + return this.luaBlock(session, row, match.index + 1); + + if (match[2]) + return session.getCommentFoldRange(row, match.index + 1); + + return this.openingBracketBlock(session, "{", row, match.index); + } + + var match = this.foldingStopMarker.exec(line); + if (match) { + if (match[0] === "end") { + if (session.getTokenAt(row, match.index + 1).type === "keyword") + return this.luaBlock(session, row, match.index + 1); + } + + if (match[0][0] === "]") + return session.getCommentFoldRange(row, match.index + 1); + + return this.closingBracketBlock(session, "}", row, match.index + match[0].length); + } + }; + + this.luaBlock = function(session, row, column) { + var stream = new TokenIterator(session, row, column); + var indentKeywords = { + "function": 1, + "do": 1, + "then": 1, + "elseif": -1, + "end": -1, + "repeat": 1, + "until": -1 + }; + + var token = stream.getCurrentToken(); + if (!token || token.type != "keyword") + return; + + var val = token.value; + var stack = [val]; + var dir = indentKeywords[val]; + + if (!dir) + return; + + var startColumn = dir === -1 ? stream.getCurrentTokenColumn() : session.getLine(row).length; + var startRow = row; + + stream.step = dir === -1 ? stream.stepBackward : stream.stepForward; + while(token = stream.step()) { + if (token.type !== "keyword") + continue; + var level = dir * indentKeywords[token.value]; + + if (level > 0) { + stack.unshift(token.value); + } else if (level <= 0) { + stack.shift(); + if (!stack.length && token.value != "elseif") + break; + if (level === 0) + stack.unshift(token.value); + } + } + + var row = stream.getCurrentTokenRow(); + if (dir === -1) + return new Range(row, session.getLine(row).length, startRow, startColumn); + else + return new Range(startRow, startColumn, row, stream.getCurrentTokenColumn()); + }; + +}).call(FoldMode.prototype); + +}); diff --git a/0.0.3_0/ace/mode-luapage.js b/0.0.3_0/ace/mode-luapage.js new file mode 100644 index 0000000..e4356de --- /dev/null +++ b/0.0.3_0/ace/mode-luapage.js @@ -0,0 +1,2342 @@ +ace.define('ace/mode/luapage', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/html', 'ace/mode/lua', 'ace/tokenizer', 'ace/mode/luapage_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var HtmlMode = require("./html").Mode; +var LuaMode = require("./lua").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var LuaPageHighlightRules = require("./luapage_highlight_rules").LuaPageHighlightRules; + +var Mode = function() { + var highlighter = new LuaPageHighlightRules(); + + this.$tokenizer = new Tokenizer(new LuaPageHighlightRules().getRules()); + this.$embeds = highlighter.getEmbeds(); + this.createModeDelegates({ + "lua-": LuaMode + }); +}; +oop.inherits(Mode, HtmlMode); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/html', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/mode/javascript', 'ace/mode/css', 'ace/tokenizer', 'ace/mode/html_highlight_rules', 'ace/mode/behaviour/html', 'ace/mode/folding/html'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var JavaScriptMode = require("./javascript").Mode; +var CssMode = require("./css").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules; +var HtmlBehaviour = require("./behaviour/html").HtmlBehaviour; +var HtmlFoldMode = require("./folding/html").FoldMode; + +var Mode = function() { + var highlighter = new HtmlHighlightRules(); + this.$tokenizer = new Tokenizer(highlighter.getRules()); + this.$behaviour = new HtmlBehaviour(); + + this.$embeds = highlighter.getEmbeds(); + this.createModeDelegates({ + "js-": JavaScriptMode, + "css-": CssMode + }); + + this.foldingRules = new HtmlFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.blockComment = {start: ""}; + + this.getNextLineIndent = function(state, line, tab) { + return this.$getIndent(line); + }; + + this.checkOutdent = function(state, line, input) { + return false; + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/javascript', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/javascript_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/range', 'ace/worker/worker_client', 'ace/mode/behaviour/cstyle', 'ace/mode/folding/cstyle'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var Range = require("../range").Range; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new JavaScriptHighlightRules().getRules()); + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.$tokenizer.getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start" || state == "no_regex") { + var match = line.match(/^.*(?:\bcase\b.*\:|[\{\(\[])\s*$/); + if (match) { + indent += tab; + } + } else if (state == "doc-start") { + if (endState == "start" || endState == "no_regex") { + return ""; + } + var match = line.match(/^\s*(\/?)\*/); + if (match) { + if (match[1]) { + indent += " "; + } + indent += "* "; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/javascript_worker", "JavaScriptWorker"); + worker.attachToDocument(session.getDocument()); + + worker.on("jslint", function(results) { + session.setAnnotations(results.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +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(require, exports, module) { + + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var JavaScriptHighlightRules = function() { + var keywordMapper = this.createKeywordMapper({ + "variable.language": + "Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|" + // Constructors + "Namespace|QName|XML|XMLList|" + // E4X + "ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|" + + "Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|" + + "Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|" + // Errors + "SyntaxError|TypeError|URIError|" + + "decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|" + // Non-constructor functions + "isNaN|parseFloat|parseInt|" + + "JSON|Math|" + // Other + "this|arguments|prototype|window|document" , // Pseudo + "keyword": + "const|yield|import|get|set|" + + "break|case|catch|continue|default|delete|do|else|finally|for|function|" + + "if|in|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"); + var kwBeforeRe = "case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void"; + var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*\\b"; + + var escapedRe = "\\\\(?:x[0-9a-fA-F]{2}|" + // hex + "u[0-9a-fA-F]{4}|" + // unicode + "[0-2][0-7]{0,2}|" + // oct + "3[0-6][0-7]?|" + // oct + "37[0-7]?|" + // oct + "[4-7][0-7]?|" + //oct + ".)"; + + this.$rules = { + "no_regex" : [ + { + token : "comment", + regex : /\/\/.*$/ + }, + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : /\/\*/, + next : "comment" + }, { + token : "string", + regex : "'(?=.)", + next : "qstring" + }, { + token : "string", + regex : '"(?=.)', + next : "qqstring" + }, { + token : "constant.numeric", // hex + regex : /0[xX][0-9a-fA-F]+\b/ + }, { + token : "constant.numeric", // float + regex : /[+-]?\d+(?:(?:\.\d*)?(?:[eE][+-]?\d+)?)?\b/ + }, { + token : [ + "storage.type", "punctuation.operator", "support.function", + "punctuation.operator", "entity.name.function", "text","keyword.operator" + ], + regex : "(" + identifierRe + ")(\\.)(prototype)(\\.)(" + identifierRe +")(\\s*)(=)", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "keyword.operator", "text", "storage.type", + "text", "paren.lparen" + ], + regex : "(" + identifierRe +")(\\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 : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(function)(\\s+)(" + identifierRe + ")(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "punctuation.operator", + "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\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 : "(?:" + kwBeforeRe + ")\\b", + next : "start" + }, { + token : ["punctuation.operator", "support.function"], + regex : /(\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:opzzzz|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 : ["punctuation.operator", "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)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/ + }, { + token : ["punctuation.operator", "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 : ["storage.type", "punctuation.operator", "support.function.firebug"], + regex : /(console)(\.)(warn|info|log|error|time|timeEnd|assert)\b/ + }, { + token : keywordMapper, + regex : identifierRe + }, { + token : "keyword.operator", + regex : /--|\+\+|[!$%&*+\-~]|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\|\||\?\:|\*=|%=|\+=|\-=|&=|\^=/, + next : "start" + }, { + token : "punctuation.operator", + regex : /\?|\:|\,|\;|\./, + next : "start" + }, { + token : "paren.lparen", + regex : /[\[({]/, + next : "start" + }, { + token : "paren.rparen", + regex : /[\])}]/ + }, { + token : "keyword.operator", + regex : /\/=?/, + next : "start" + }, { + token: "comment", + regex: /^#!.*$/ + } + ], + "start": [ + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment_regex_allowed" + }, { + token : "comment", + regex : "\\/\\/.*$", + next : "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: "/\\w*", + 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.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: identifierRe + }, { + token: "punctuation.operator", + regex: "[, ]+" + }, { + token: "punctuation.operator", + regex: "$" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "comment_regex_allowed" : [ + {token : "comment", regex : "\\*\\/", next : "start"}, + {defaultToken : "comment"} + ], + "comment" : [ + {token : "comment", regex : "\\*\\/", next : "no_regex"}, + {defaultToken : "comment"} + ], + "qqstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + next : "qqstring" + }, { + token : "string", + regex : '"|$', + next : "no_regex" + }, { + defaultToken: "string" + } + ], + "qstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + next : "qstring" + }, { + token : "string", + regex : "'|$", + next : "no_regex" + }, { + defaultToken: "string" + } + ] + }; + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("no_regex") ]); +}; + +oop.inherits(JavaScriptHighlightRules, TextHighlightRules); + +exports.JavaScriptHighlightRules = JavaScriptHighlightRules; +}); + +ace.define('ace/mode/doc_comment_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, { + token : "comment.doc.tag", + regex : "\\bTODO\\b" + }, { + defaultToken : "comment.doc" + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) { + + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define('ace/mode/behaviour/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/token_iterator', 'ace/lib/lang'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; +var lang = require("../../lib/lang"); + +var SAFE_INSERT_IN_TOKENS = + ["text", "paren.rparen", "punctuation.operator"]; +var SAFE_INSERT_BEFORE_TOKENS = + ["text", "paren.rparen", "punctuation.operator", "comment"]; + + +var autoInsertedBrackets = 0; +var autoInsertedRow = -1; +var autoInsertedLineEnd = ""; +var maybeInsertedBrackets = 0; +var maybeInsertedRow = -1; +var maybeInsertedLineStart = ""; +var maybeInsertedLineEnd = ""; + +var CstyleBehaviour = function () { + + CstyleBehaviour.isSaneInsertion = function(editor, session) { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + if (!this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) { + var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1); + if (!this.$matchTokenType(iterator2.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) + return false; + } + iterator.stepForward(); + return iterator.getCurrentTokenRow() !== cursor.row || + this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_BEFORE_TOKENS); + }; + + CstyleBehaviour.$matchTokenType = function(token, types) { + return types.indexOf(token.type || token) > -1; + }; + + CstyleBehaviour.recordAutoInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isAutoInsertedClosing(cursor, line, autoInsertedLineEnd[0])) + autoInsertedBrackets = 0; + autoInsertedRow = cursor.row; + autoInsertedLineEnd = bracket + line.substr(cursor.column); + autoInsertedBrackets++; + }; + + CstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isMaybeInsertedClosing(cursor, line)) + maybeInsertedBrackets = 0; + maybeInsertedRow = cursor.row; + maybeInsertedLineStart = line.substr(0, cursor.column) + bracket; + maybeInsertedLineEnd = line.substr(cursor.column); + maybeInsertedBrackets++; + }; + + CstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) { + return autoInsertedBrackets > 0 && + cursor.row === autoInsertedRow && + bracket === autoInsertedLineEnd[0] && + line.substr(cursor.column) === autoInsertedLineEnd; + }; + + CstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) { + return maybeInsertedBrackets > 0 && + cursor.row === maybeInsertedRow && + line.substr(cursor.column) === maybeInsertedLineEnd && + line.substr(0, cursor.column) == maybeInsertedLineStart; + }; + + CstyleBehaviour.popAutoInsertedClosing = function() { + autoInsertedLineEnd = autoInsertedLineEnd.substr(1); + autoInsertedBrackets--; + }; + + CstyleBehaviour.clearMaybeInsertedClosing = function() { + maybeInsertedBrackets = 0; + maybeInsertedRow = -1; + }; + + this.add("braces", "insertion", function (state, action, editor, session, text) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (text == '{') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "{" && editor.getWrapBehavioursEnabled()) { + return { + text: '{' + selected + '}', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + if (/[\]\}\)]/.test(line[cursor.column])) { + CstyleBehaviour.recordAutoInsert(editor, session, "}"); + return { + text: '{}', + selection: [1, 1] + }; + } else { + CstyleBehaviour.recordMaybeInsert(editor, session, "{"); + return { + text: '{', + selection: [1, 1] + }; + } + } + } else if (text == '}') { + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}') { + var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } else if (text == "\n" || text == "\r\n") { + var closing = ""; + if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) { + closing = lang.stringRepeat("}", maybeInsertedBrackets); + CstyleBehaviour.clearMaybeInsertedClosing(); + } + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}' || closing !== "") { + var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column}, '}'); + if (!openBracePos) + return null; + + var indent = this.getNextLineIndent(state, line.substring(0, cursor.column), session.getTabString()); + var next_indent = this.$getIndent(line); + + return { + text: '\n' + indent + '\n' + next_indent + closing, + selection: [1, indent.length, 1, indent.length] + }; + } + } + }); + + this.add("braces", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '{') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar == '}') { + range.end.column++; + return range; + } else { + maybeInsertedBrackets--; + } + } + }); + + this.add("parens", "insertion", function (state, action, editor, session, text) { + if (text == '(') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return { + text: '(' + selected + ')', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, ")"); + return { + text: '()', + selection: [1, 1] + }; + } + } else if (text == ')') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ')') { + var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("parens", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '(') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ')') { + range.end.column++; + return range; + } + } + }); + + this.add("brackets", "insertion", function (state, action, editor, session, text) { + if (text == '[') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return { + text: '[' + selected + ']', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, "]"); + return { + text: '[]', + selection: [1, 1] + }; + } + } else if (text == ']') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ']') { + var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("brackets", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '[') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ']') { + range.end.column++; + return range; + } + } + }); + + this.add("string_dquotes", "insertion", function (state, action, editor, session, text) { + if (text == '"' || text == "'") { + var quote = text; + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "'" && selected != '"' && editor.getWrapBehavioursEnabled()) { + return { + text: quote + selected + quote, + selection: false + }; + } else { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var leftChar = line.substring(cursor.column-1, cursor.column); + if (leftChar == '\\') { + return null; + } + var tokens = session.getTokens(selection.start.row); + var col = 0, token; + var quotepos = -1; // Track whether we're inside an open quote. + + for (var x = 0; x < tokens.length; x++) { + token = tokens[x]; + if (token.type == "string") { + quotepos = -1; + } else if (quotepos < 0) { + quotepos = token.value.indexOf(quote); + } + if ((token.value.length + col) > selection.start.column) { + break; + } + col += tokens[x].value.length; + } + if (!token || (quotepos < 0 && token.type !== "comment" && (token.type !== "string" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) { + if (!CstyleBehaviour.isSaneInsertion(editor, session)) + return; + return { + text: quote + quote, + selection: [1,1] + }; + } else if (token && token.type === "string") { + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == quote) { + return { + text: '', + selection: [1, 1] + }; + } + } + } + } + }); + + this.add("string_dquotes", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && (selected == '"' || selected == "'")) { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == selected) { + range.end.column++; + return range; + } + } + }); + +}; + +oop.inherits(CstyleBehaviour, Behaviour); + +exports.CstyleBehaviour = CstyleBehaviour; +}); + +ace.define('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var line = session.getLine(row); + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i + match[0].length, 1); + } + + if (foldStyle !== "markbeginend") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define('ace/mode/css', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/css_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/worker/worker_client', 'ace/mode/behaviour/css', 'ace/mode/folding/cstyle'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CssBehaviour = require("./behaviour/css").CssBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new CssHighlightRules().getRules()); + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CssBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.foldingRules = "cStyle"; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + var tokens = this.$tokenizer.getLineTokens(line, state).tokens; + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + var match = line.match(/^.*\{\s*$/); + if (match) { + indent += tab; + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/css_worker", "Worker"); + worker.attachToDocument(session.getDocument()); + + worker.on("csslint", function(e) { + session.setAnnotations(e.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; + +}); + +ace.define('ace/mode/css_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var supportType = exports.supportType = "animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|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|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|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|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index"; +var supportFunction = exports.supportFunction = "rgb|rgba|url|attr|counter|counters"; +var supportConstant = exports.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"; +var supportConstantColor = exports.supportConstantColor = "aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow"; +var supportConstantFonts = exports.supportConstantFonts = "arial|century|comic|courier|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace"; + +var numRe = exports.numRe = "\\-?(?:(?:[0-9]+)|(?:[0-9]*\\.[0-9]+))"; +var pseudoElements = exports.pseudoElements = "(\\:+)\\b(after|before|first-letter|first-line|moz-selection|selection)\\b"; +var pseudoClasses = exports.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"; + +var CssHighlightRules = function() { + + var keywordMapper = this.createKeywordMapper({ + "support.function": supportFunction, + "support.constant": supportConstant, + "support.type": supportType, + "support.constant.color": supportConstantColor, + "support.constant.fonts": supportConstantFonts + }, "text", true); + + var base_ruleset = [ + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "ruleset_comment" + }, { + token : "string", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' + }, { + token : "string", // single line + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" + }, { + token : ["constant.numeric", "keyword"], + regex : "(" + numRe + ")(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 : numRe + }, { + token : "constant.numeric", // hex6 color + regex : "#[a-f0-9]{6}" + }, { + token : "constant.numeric", // hex3 color + regex : "#[a-f0-9]{3}" + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"], + regex : pseudoElements + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"], + regex : pseudoClasses + }, { + token : ["support.function", "string", "support.function"], + regex : "(url\\()(.*)(\\))" + }, { + token : keywordMapper, + regex : "\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*" + }, { + caseInsensitive: true + } + ]; + + var ruleset = lang.copyArray(base_ruleset); + ruleset.unshift({ + token : "paren.rparen", + regex : "\\}", + next: "start" + }); + + var media_ruleset = lang.copyArray( base_ruleset ); + media_ruleset.unshift({ + token : "paren.rparen", + regex : "\\}", + next: "media" + }); + + var base_comment = [{ + token : "comment", // comment spanning whole line + regex : ".+" + }]; + + var comment = lang.copyArray(base_comment); + comment.unshift({ + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "start" + }); + + var media_comment = lang.copyArray(base_comment); + media_comment.unshift({ + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "media" + }); + + var ruleset_comment = lang.copyArray(base_comment); + ruleset_comment.unshift({ + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "ruleset" + }); + + this.$rules = { + "start" : [{ + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment" + }, { + token: "paren.lparen", + regex: "\\{", + next: "ruleset" + }, { + token: "string", + regex: "@.*?{", + next: "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: true + }], + + "media" : [ { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "media_comment" + }, { + token: "paren.lparen", + regex: "\\{", + next: "media_ruleset" + },{ + token: "string", + regex: "\\}", + next: "start" + },{ + 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: true + }], + + "comment" : comment, + + "ruleset" : ruleset, + "ruleset_comment" : ruleset_comment, + + "media_ruleset" : media_ruleset, + "media_comment" : media_comment + }; +}; + +oop.inherits(CssHighlightRules, TextHighlightRules); + +exports.CssHighlightRules = CssHighlightRules; + +}); + +ace.define('ace/mode/behaviour/css', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/mode/behaviour/cstyle', 'ace/token_iterator'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var CstyleBehaviour = require("./cstyle").CstyleBehaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; + +var CssBehaviour = function () { + + this.inherit(CstyleBehaviour); + + this.add("colon", "insertion", function (state, action, editor, session, text) { + if (text === ':') { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + if (token && token.value.match(/\s+/)) { + token = iterator.stepBackward(); + } + if (token && token.type === 'support.type') { + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar === ':') { + return { + text: '', + selection: [1, 1] + } + } + if (!line.substring(cursor.column).match(/^\s*;/)) { + return { + text: ':;', + selection: [1, 1] + } + } + } + } + }); + + this.add("colon", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected === ':') { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + if (token && token.value.match(/\s+/)) { + token = iterator.stepBackward(); + } + if (token && token.type === 'support.type') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar === ';') { + range.end.column ++; + return range; + } + } + } + }); + + this.add("semicolon", "insertion", function (state, action, editor, session, text) { + if (text === ';') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar === ';') { + return { + text: '', + selection: [1, 1] + } + } + } + }); + +} +oop.inherits(CssBehaviour, CstyleBehaviour); + +exports.CssBehaviour = CssBehaviour; +}); + +ace.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_util', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var xmlUtil = require("./xml_util"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var tagMap = lang.createMap({ + a : 'anchor', + button : 'form', + form : 'form', + img : 'image', + input : 'form', + label : 'form', + script : 'script', + select : 'form', + textarea : 'form', + style : 'style', + table : 'table', + tbody : 'table', + td : 'table', + tfoot : 'table', + th : 'table', + tr : 'table' +}); + +var HtmlHighlightRules = function() { + this.$rules = { + start : [{ + token : "text", + regex : "<\\!\\[CDATA\\[", + next : "cdata" + }, { + token : "xml-pe", + regex : "<\\?.*?\\?>" + }, { + token : "comment", + regex : "<\\!--", + next : "comment" + }, { + token : "xml-pe", + regex : "<\\!.*?>" + }, { + token : "meta.tag", + regex : "<(?=script\\b)", + next : "script" + }, { + token : "meta.tag", + regex : "<(?=style\\b)", + next : "style" + }, { + token : "meta.tag", // opening tag + regex : "<\\/?(?=\\S)", + next : "tag" + }, { + token : "text", + regex : "\\s+" + }, { + token : "constant.character.entity", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }], + + cdata : [ { + token : "text", + regex : "\\]\\]>", + next : "start" + } ], + + comment : [ { + token : "comment", + regex : ".*?-->", + next : "start" + }, { + defaultToken : "comment" + } ] + }; + + xmlUtil.tag(this.$rules, "tag", "start", tagMap); + xmlUtil.tag(this.$rules, "style", "css-start", tagMap); + xmlUtil.tag(this.$rules, "script", "js-start", tagMap); + + this.embedRules(JavaScriptHighlightRules, "js-", [{ + token: "comment", + regex: "\\/\\/.*(?=<\\/script>)", + next: "tag" + }, { + token: "meta.tag", + regex: "<\\/(?=script)", + next: "tag" + }]); + + this.embedRules(CssHighlightRules, "css-", [{ + token: "meta.tag", + regex: "<\\/(?=style)", + next: "tag" + }]); +}; + +oop.inherits(HtmlHighlightRules, TextHighlightRules); + +exports.HtmlHighlightRules = HtmlHighlightRules; +}); + +ace.define('ace/mode/xml_util', ['require', 'exports', 'module' ], function(require, exports, module) { + + +function string(state) { + return [{ + token : "string", + regex : '"', + next : state + "_qqstring" + }, { + token : "string", + regex : "'", + next : state + "_qstring" + }]; +} + +function multiLineString(quote, state) { + return [ + {token : "string", regex : quote, next : state}, + { + token : "constant.language.escape", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }, + {defaultToken : "string"} + ]; +} + +exports.tag = function(states, name, nextState, tagMap) { + states[name] = [{ + token : "text", + regex : "\\s+" + }, { + + token : !tagMap ? "meta.tag.tag-name" : function(value) { + if (tagMap[value]) + return "meta.tag.tag-name." + tagMap[value]; + else + return "meta.tag.tag-name"; + }, + regex : "[-_a-zA-Z0-9:]+", + next : name + "_embed_attribute_list" + }, { + token: "empty", + regex: "", + next : name + "_embed_attribute_list" + }]; + + states[name + "_qstring"] = multiLineString("'", name + "_embed_attribute_list"); + states[name + "_qqstring"] = multiLineString("\"", name + "_embed_attribute_list"); + + states[name + "_embed_attribute_list"] = [{ + token : "meta.tag.r", + regex : "/?>", + next : nextState + }, { + token : "keyword.operator", + regex : "=" + }, { + token : "entity.other.attribute-name", + regex : "[-_a-zA-Z0-9:]+" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : "text", + regex : "\\s+" + }].concat(string(name)); +}; + +}); + +ace.define('ace/mode/behaviour/html', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour/xml', 'ace/mode/behaviour/cstyle', 'ace/token_iterator'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var XmlBehaviour = require("../behaviour/xml").XmlBehaviour; +var CstyleBehaviour = require("./cstyle").CstyleBehaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; +var voidElements = ['area', 'base', 'br', 'col', 'command', 'embed', 'hr', 'img', 'input', 'keygen', 'link', 'meta', 'param', 'source', 'track', 'wbr']; + +function hasType(token, type) { + var hasType = true; + var typeList = token.type.split('.'); + var needleList = type.split('.'); + needleList.forEach(function(needle){ + if (typeList.indexOf(needle) == -1) { + hasType = false; + return false; + } + }); + return hasType; +} + +var HtmlBehaviour = function () { + + this.inherit(XmlBehaviour); // Get xml behaviour + + this.add("autoclosing", "insertion", function (state, action, editor, session, text) { + if (text == '>') { + var position = editor.getCursorPosition(); + var iterator = new TokenIterator(session, position.row, position.column); + var token = iterator.getCurrentToken(); + + if (hasType(token, 'string') && iterator.getCurrentTokenColumn() + token.value.length > position.column) + return; + var atCursor = false; + if (!token || !hasType(token, 'meta.tag') && !(hasType(token, 'text') && token.value.match('/'))){ + do { + token = iterator.stepBackward(); + } while (token && (hasType(token, 'string') || hasType(token, 'keyword.operator') || hasType(token, 'entity.attribute-name') || hasType(token, 'text'))); + } else { + atCursor = true; + } + if (!token || !hasType(token, 'meta.tag-name') || iterator.stepBackward().value.match('/')) { + return + } + var element = token.value; + if (atCursor){ + var element = element.substring(0, position.column - token.start); + } + if (voidElements.indexOf(element) !== -1){ + return; + } + return { + text: '>' + '', + selection: [1, 1] + } + } + }); +} +oop.inherits(HtmlBehaviour, XmlBehaviour); + +exports.HtmlBehaviour = HtmlBehaviour; +}); + +ace.define('ace/mode/behaviour/xml', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/mode/behaviour/cstyle', 'ace/token_iterator'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var CstyleBehaviour = require("./cstyle").CstyleBehaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; + +function hasType(token, type) { + var hasType = true; + var typeList = token.type.split('.'); + var needleList = type.split('.'); + needleList.forEach(function(needle){ + if (typeList.indexOf(needle) == -1) { + hasType = false; + return false; + } + }); + return hasType; +} + +var XmlBehaviour = function () { + + this.inherit(CstyleBehaviour, ["string_dquotes"]); // Get string behaviour + + this.add("autoclosing", "insertion", function (state, action, editor, session, text) { + if (text == '>') { + var position = editor.getCursorPosition(); + var iterator = new TokenIterator(session, position.row, position.column); + var token = iterator.getCurrentToken(); + var atCursor = false; + if (!token || !hasType(token, 'meta.tag') && !(hasType(token, 'text') && token.value.match('/'))){ + do { + token = iterator.stepBackward(); + } while (token && (hasType(token, 'string') || hasType(token, 'keyword.operator') || hasType(token, 'entity.attribute-name') || hasType(token, 'text'))); + } else { + atCursor = true; + } + if (!token || !hasType(token, 'meta.tag-name') || iterator.stepBackward().value.match('/')) { + return + } + var tag = token.value; + if (atCursor){ + var tag = tag.substring(0, position.column - token.start); + } + + return { + text: '>' + '', + selection: [1, 1] + } + } + }); + + this.add('autoindent', 'insertion', function (state, action, editor, session, text) { + if (text == "\n") { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChars = line.substring(cursor.column, cursor.column + 2); + if (rightChars == '?)/; + this._parseTag = function(tag) { + + var match = tag.match(this.tagRe); + var column = 0; + + return { + value: tag, + match: match ? match[2] : "", + closing: match ? !!match[3] : false, + selfClosing: match ? !!match[5] || match[2] == "/>" : false, + tagName: match ? match[4] : "", + column: match[1] ? column + match[1].length : column + }; + }; + this._readTagForward = function(iterator) { + var token = iterator.getCurrentToken(); + if (!token) + return null; + + var value = ""; + var start; + + do { + if (token.type.indexOf("meta.tag") === 0) { + if (!start) { + var start = { + row: iterator.getCurrentTokenRow(), + column: iterator.getCurrentTokenColumn() + }; + } + value += token.value; + if (value.indexOf(">") !== -1) { + var tag = this._parseTag(value); + tag.start = start; + tag.end = { + row: iterator.getCurrentTokenRow(), + column: iterator.getCurrentTokenColumn() + token.value.length + }; + iterator.stepForward(); + return tag; + } + } + } while(token = iterator.stepForward()); + + return null; + }; + + this._readTagBackward = function(iterator) { + var token = iterator.getCurrentToken(); + if (!token) + return null; + + var value = ""; + var end; + + do { + if (token.type.indexOf("meta.tag") === 0) { + if (!end) { + end = { + row: iterator.getCurrentTokenRow(), + column: iterator.getCurrentTokenColumn() + token.value.length + }; + } + value = token.value + value; + if (value.indexOf("<") !== -1) { + var tag = this._parseTag(value); + tag.end = end; + tag.start = { + row: iterator.getCurrentTokenRow(), + column: iterator.getCurrentTokenColumn() + }; + iterator.stepBackward(); + return tag; + } + } + } while(token = iterator.stepBackward()); + + return null; + }; + + this._pop = function(stack, tag) { + while (stack.length) { + + var top = stack[stack.length-1]; + if (!tag || top.tagName == tag.tagName) { + return stack.pop(); + } + else if (this.voidElements[tag.tagName]) { + return; + } + else if (this.voidElements[top.tagName]) { + stack.pop(); + continue; + } else { + return null; + } + } + }; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var firstTag = this._getFirstTagInLine(session, row); + + if (!firstTag.match) + return null; + + var isBackward = firstTag.closing || firstTag.selfClosing; + var stack = []; + var tag; + + if (!isBackward) { + var iterator = new TokenIterator(session, row, firstTag.column); + var start = { + row: row, + column: firstTag.column + firstTag.tagName.length + 2 + }; + while (tag = this._readTagForward(iterator)) { + if (tag.selfClosing) { + if (!stack.length) { + tag.start.column += tag.tagName.length + 2; + tag.end.column -= 2; + return Range.fromPoints(tag.start, tag.end); + } else + continue; + } + + if (tag.closing) { + this._pop(stack, tag); + if (stack.length == 0) + return Range.fromPoints(start, tag.start); + } + else { + stack.push(tag) + } + } + } + else { + var iterator = new TokenIterator(session, row, firstTag.column + firstTag.match.length); + var end = { + row: row, + column: firstTag.column + }; + + while (tag = this._readTagBackward(iterator)) { + if (tag.selfClosing) { + if (!stack.length) { + tag.start.column += tag.tagName.length + 2; + tag.end.column -= 2; + return Range.fromPoints(tag.start, tag.end); + } else + continue; + } + + if (!tag.closing) { + this._pop(stack, tag); + if (stack.length == 0) { + tag.start.column += tag.tagName.length + 2; + return Range.fromPoints(tag.start, end); + } + } + else { + stack.push(tag) + } + } + } + + }; + +}).call(FoldMode.prototype); + +}); + +ace.define('ace/mode/lua', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/lua_highlight_rules', 'ace/mode/folding/lua', 'ace/range', 'ace/worker/worker_client'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var LuaHighlightRules = require("./lua_highlight_rules").LuaHighlightRules; +var LuaFoldMode = require("./folding/lua").FoldMode; +var Range = require("../range").Range; +var WorkerClient = require("../worker/worker_client").WorkerClient; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new LuaHighlightRules().getRules()); + this.foldingRules = new LuaFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "--"; + this.blockComment = {start: "--[", end: "]--"}; + + var indentKeywords = { + "function": 1, + "then": 1, + "do": 1, + "else": 1, + "elseif": 1, + "repeat": 1, + "end": -1, + "until": -1 + }; + var outdentKeywords = [ + "else", + "elseif", + "end", + "until" + ]; + + function getNetIndentLevel(tokens) { + var level = 0; + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i]; + if (token.type == "keyword") { + if (token.value in indentKeywords) { + level += indentKeywords[token.value]; + } + } else if (token.type == "paren.lparen") { + level ++; + } else if (token.type == "paren.rparen") { + level --; + } + } + if (level < 0) { + return -1; + } else if (level > 0) { + return 1; + } else { + return 0; + } + } + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + var level = 0; + + var tokenizedLine = this.$tokenizer.getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + + if (state == "start") { + level = getNetIndentLevel(tokens); + } + if (level > 0) { + return indent + tab; + } else if (level < 0 && indent.substr(indent.length - tab.length) == tab) { + if (!this.checkOutdent(state, line, "\n")) { + return indent.substr(0, indent.length - tab.length); + } + } + return indent; + }; + + this.checkOutdent = function(state, line, input) { + if (input != "\n" && input != "\r" && input != "\r\n") + return false; + + if (line.match(/^\s*[\)\}\]]$/)) + return true; + + var tokens = this.$tokenizer.getLineTokens(line.trim(), state).tokens; + + if (!tokens || !tokens.length) + return false; + + return (tokens[0].type == "keyword" && outdentKeywords.indexOf(tokens[0].value) != -1); + }; + + this.autoOutdent = function(state, session, row) { + var prevLine = session.getLine(row - 1); + var prevIndent = this.$getIndent(prevLine).length; + var prevTokens = this.$tokenizer.getLineTokens(prevLine, "start").tokens; + var tabLength = session.getTabString().length; + var expectedIndent = prevIndent + tabLength * getNetIndentLevel(prevTokens); + var curIndent = this.$getIndent(session.getLine(row)).length; + if (curIndent < expectedIndent) { + return; + } + session.outdentRows(new Range(row, 0, row + 2, 0)); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/lua_worker", "Worker"); + worker.attachToDocument(session.getDocument()); + + worker.on("error", function(e) { + session.setAnnotations([e.data]); + }); + + worker.on("ok", function(e) { + session.clearAnnotations(); + }); + + return worker; + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/lua_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var LuaHighlightRules = function() { + + var keywords = ( + "break|do|else|elseif|end|for|function|if|in|local|repeat|"+ + "return|then|until|while|or|and|not" + ); + + var builtinConstants = ("true|false|nil|_G|_VERSION"); + + var functions = ( + "string|xpcall|package|tostring|print|os|unpack|require|"+ + "getfenv|setmetatable|next|assert|tonumber|io|rawequal|"+ + "collectgarbage|getmetatable|module|rawset|math|debug|"+ + "pcall|table|newproxy|type|coroutine|_G|select|gcinfo|"+ + "pairs|rawget|loadstring|ipairs|_VERSION|dofile|setfenv|"+ + "load|error|loadfile|"+ + + "sub|upper|len|gfind|rep|find|match|char|dump|gmatch|"+ + "reverse|byte|format|gsub|lower|preload|loadlib|loaded|"+ + "loaders|cpath|config|path|seeall|exit|setlocale|date|"+ + "getenv|difftime|remove|time|clock|tmpname|rename|execute|"+ + "lines|write|close|flush|open|output|type|read|stderr|"+ + "stdin|input|stdout|popen|tmpfile|log|max|acos|huge|"+ + "ldexp|pi|cos|tanh|pow|deg|tan|cosh|sinh|random|randomseed|"+ + "frexp|ceil|floor|rad|abs|sqrt|modf|asin|min|mod|fmod|log10|"+ + "atan2|exp|sin|atan|getupvalue|debug|sethook|getmetatable|"+ + "gethook|setmetatable|setlocal|traceback|setfenv|getinfo|"+ + "setupvalue|getlocal|getregistry|getfenv|setn|insert|getn|"+ + "foreachi|maxn|foreach|concat|sort|remove|resume|yield|"+ + "status|wrap|create|running|"+ + "__add|__sub|__mod|__unm|__concat|__lt|__index|__call|__gc|__metatable|"+ + "__mul|__div|__pow|__len|__eq|__le|__newindex|__tostring|__mode|__tonumber" + ); + + var stdLibaries = ("string|package|os|io|math|debug|table|coroutine"); + + var futureReserved = ""; + + var deprecatedIn5152 = ("setn|foreach|foreachi|gcinfo|log10|maxn"); + + var keywordMapper = this.createKeywordMapper({ + "keyword": keywords, + "support.function": functions, + "invalid.deprecated": deprecatedIn5152, + "constant.library": stdLibaries, + "constant.language": builtinConstants, + "invalid.illegal": futureReserved, + "variable.language": "this" + }, "identifier"); + + var decimalInteger = "(?:(?:[1-9]\\d*)|(?:0))"; + var hexInteger = "(?:0[xX][\\dA-Fa-f]+)"; + var integer = "(?:" + decimalInteger + "|" + hexInteger + ")"; + + var fraction = "(?:\\.\\d+)"; + var intPart = "(?:\\d+)"; + var pointFloat = "(?:(?:" + intPart + "?" + fraction + ")|(?:" + intPart + "\\.))"; + var floatNumber = "(?:" + pointFloat + ")"; + + this.$rules = { + "start" : [{ + stateName: "bracketedComment", + onMatch : function(value, currentState, stack){ + stack.unshift(this.next, value.length, currentState); + return "comment"; + }, + regex : /\-\-\[=*\[/, + next : [ + { + onMatch : function(value, currentState, stack) { + if (value.length == stack[1]) { + stack.shift(); + stack.shift(); + this.next = stack.shift(); + } else { + this.next = ""; + } + return "comment"; + }, + regex : /(?:[^\\]|\\.)*?\]=*\]/, + next : "start" + }, { + defaultToken : "comment" + } + ] + }, + + { + token : "comment", + regex : "\\-\\-.*$" + }, + { + stateName: "bracketedString", + onMatch : function(value, currentState, stack){ + stack.unshift(this.next, value.length, currentState); + return "comment"; + }, + regex : /\[=*\[/, + next : [ + { + onMatch : function(value, currentState, stack) { + if (value.length == stack[1]) { + stack.shift(); + stack.shift(); + this.next = stack.shift(); + } else { + this.next = ""; + } + return "comment"; + }, + + regex : /(?:[^\\]|\\.)*?\]=*\]/, + next : "start" + }, { + defaultToken : "comment" + } + ] + }, + { + token : "string", // " string + regex : '"(?:[^\\\\]|\\\\.)*?"' + }, { + token : "string", // ' string + regex : "'(?:[^\\\\]|\\\\.)*?'" + }, { + token : "constant.numeric", // float + regex : floatNumber + }, { + token : "constant.numeric", // integer + regex : integer + "\\b" + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "keyword.operator", + regex : "\\+|\\-|\\*|\\/|%|\\#|\\^|~|<|>|<=|=>|==|~=|=|\\:|\\.\\.\\.|\\.\\." + }, { + token : "paren.lparen", + regex : "[\\[\\(\\{]" + }, { + token : "paren.rparen", + regex : "[\\]\\)\\}]" + }, { + token : "text", + regex : "\\s+|\\w+" + } ] + }; + + this.normalizeRules(); +} + +oop.inherits(LuaHighlightRules, TextHighlightRules); + +exports.LuaHighlightRules = LuaHighlightRules; +}); + +ace.define('ace/mode/folding/lua', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/folding/fold_mode', 'ace/range', 'ace/token_iterator'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var BaseFoldMode = require("./fold_mode").FoldMode; +var Range = require("../../range").Range; +var TokenIterator = require("../../token_iterator").TokenIterator; + + +var FoldMode = exports.FoldMode = function() {}; + +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /\b(function|then|do|repeat)\b|{\s*$|(\[=*\[)/; + this.foldingStopMarker = /\bend\b|^\s*}|\]=*\]/; + + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + var isStart = this.foldingStartMarker.test(line); + var isEnd = this.foldingStopMarker.test(line); + + if (isStart && !isEnd) { + var match = line.match(this.foldingStartMarker); + if (match[1] == "then" && /\belseif\b/.test(line)) + return; + if (match[1]) { + if (session.getTokenAt(row, match.index + 1).type === "keyword") + return "start"; + } else if (match[2]) { + var type = session.bgTokenizer.getState(row) || ""; + if (type[0] == "bracketedComment" || type[0] == "bracketedString") + return "start"; + } else { + return "start"; + } + } + if (foldStyle != "markbeginend" || !isEnd || isStart && isEnd) + return ""; + + var match = line.match(this.foldingStopMarker); + if (match[0] === "end") { + if (session.getTokenAt(row, match.index + 1).type === "keyword") + return "end"; + } else if (match[0][0] === "]") { + var type = session.bgTokenizer.getState(row - 1) || ""; + if (type[0] == "bracketedComment" || type[0] == "bracketedString") + return "end"; + } else + return "end"; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var line = session.doc.getLine(row); + var match = this.foldingStartMarker.exec(line); + if (match) { + if (match[1]) + return this.luaBlock(session, row, match.index + 1); + + if (match[2]) + return session.getCommentFoldRange(row, match.index + 1); + + return this.openingBracketBlock(session, "{", row, match.index); + } + + var match = this.foldingStopMarker.exec(line); + if (match) { + if (match[0] === "end") { + if (session.getTokenAt(row, match.index + 1).type === "keyword") + return this.luaBlock(session, row, match.index + 1); + } + + if (match[0][0] === "]") + return session.getCommentFoldRange(row, match.index + 1); + + return this.closingBracketBlock(session, "}", row, match.index + match[0].length); + } + }; + + this.luaBlock = function(session, row, column) { + var stream = new TokenIterator(session, row, column); + var indentKeywords = { + "function": 1, + "do": 1, + "then": 1, + "elseif": -1, + "end": -1, + "repeat": 1, + "until": -1 + }; + + var token = stream.getCurrentToken(); + if (!token || token.type != "keyword") + return; + + var val = token.value; + var stack = [val]; + var dir = indentKeywords[val]; + + if (!dir) + return; + + var startColumn = dir === -1 ? stream.getCurrentTokenColumn() : session.getLine(row).length; + var startRow = row; + + stream.step = dir === -1 ? stream.stepBackward : stream.stepForward; + while(token = stream.step()) { + if (token.type !== "keyword") + continue; + var level = dir * indentKeywords[token.value]; + + if (level > 0) { + stack.unshift(token.value); + } else if (level <= 0) { + stack.shift(); + if (!stack.length && token.value != "elseif") + break; + if (level === 0) + stack.unshift(token.value); + } + } + + var row = stream.getCurrentTokenRow(); + if (dir === -1) + return new Range(row, session.getLine(row).length, startRow, startColumn); + else + return new Range(startRow, startColumn, row, stream.getCurrentTokenColumn()); + }; + +}).call(FoldMode.prototype); + +}); +ace.define('ace/mode/luapage_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/html_highlight_rules', 'ace/mode/lua_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules; +var LuaHighlightRules = require("./lua_highlight_rules").LuaHighlightRules; + +var LuaPageHighlightRules = function() { + this.$rules = new HtmlHighlightRules().getRules(); + + for (var i in this.$rules) { + this.$rules[i].unshift({ + token: "keyword", + regex: "<\\%\\=?", + next: "lua-start" + }, { + token: "keyword", + regex: "<\\?lua\\=?", + next: "lua-start" + }); + } + this.embedRules(LuaHighlightRules, "lua-", [ + { + token: "keyword", + regex: "\\%>", + next: "start" + }, + { + token: "keyword", + regex: "\\?>", + next: "start" + } + ]); +}; + +oop.inherits(LuaPageHighlightRules, HtmlHighlightRules); + +exports.LuaPageHighlightRules = LuaPageHighlightRules; + +}); \ No newline at end of file diff --git a/0.0.3_0/ace/mode-lucene.js b/0.0.3_0/ace/mode-lucene.js new file mode 100644 index 0000000..5fa60cf --- /dev/null +++ b/0.0.3_0/ace/mode-lucene.js @@ -0,0 +1,64 @@ +ace.define('ace/mode/lucene', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/lucene_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var LuceneHighlightRules = require("./lucene_highlight_rules").LuceneHighlightRules; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new LuceneHighlightRules().getRules()); +}; + +oop.inherits(Mode, TextMode); + +exports.Mode = Mode; +});ace.define('ace/mode/lucene_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var LuceneHighlightRules = function() { + this.$rules = { + "start" : [ + { + token : "constant.character.negation", + regex : "[\\-]" + }, { + token : "constant.character.interro", + regex : "[\\?]" + }, { + token : "constant.character.asterisk", + regex : "[\\*]" + }, { + token: 'constant.character.proximity', + regex: '~[0-9]+\\b' + }, { + token : 'keyword.operator', + regex: '(?:AND|OR|NOT)\\b' + }, { + token : "paren.lparen", + regex : "[\\(]" + }, { + token : "paren.rparen", + regex : "[\\)]" + }, { + token : "keyword", + regex : "[\\S]+:" + }, { + token : "string", // " string + regex : '".*?"' + }, { + token : "text", + regex : "\\s+" + } + ] + }; +}; + +oop.inherits(LuceneHighlightRules, TextHighlightRules); + +exports.LuceneHighlightRules = LuceneHighlightRules; +}); diff --git a/0.0.3_0/ace/mode-makefile.js b/0.0.3_0/ace/mode-makefile.js new file mode 100644 index 0000000..fbb4dd2 --- /dev/null +++ b/0.0.3_0/ace/mode-makefile.js @@ -0,0 +1,313 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2012, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * + * Contributor(s): + * + * + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/mode/makefile', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/makefile_highlight_rules', 'ace/mode/folding/coffee'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var MakefileHighlightRules = require("./makefile_highlight_rules").MakefileHighlightRules; +var FoldMode = require("./folding/coffee").FoldMode; + +var Mode = function() { + var highlighter = new MakefileHighlightRules(); + this.foldingRules = new FoldMode(); + + this.$tokenizer = new Tokenizer(highlighter.getRules()); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "#"; +}).call(Mode.prototype); + +exports.Mode = Mode; +});ace.define('ace/mode/makefile_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules', 'ace/mode/sh_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var ShHighlightFile = require("./sh_highlight_rules"); + +var MakefileHighlightRules = function() { + + var keywordMapper = this.createKeywordMapper({ + "keyword": ShHighlightFile.reservedKeywords, + "support.function.builtin": ShHighlightFile.languageConstructs, + "invalid.deprecated": "debugger" + }, "string"); + + this.$rules = + { + "start": [ + { + token: "string.interpolated.backtick.makefile", + regex: "`", + next: "shell-start" + }, + { + token: "punctuation.definition.comment.makefile", + regex: /#(?=.)/, + next: "comment" + }, + { + token: [ "keyword.control.makefile"], + regex: "^(?:\\s*\\b)(\\-??include|ifeq|ifneq|ifdef|ifndef|else|endif|vpath|export|unexport|define|endef|override)(?:\\b)" + }, + {// ^([^\t ]+(\s[^\t ]+)*:(?!\=))\s*.* + token: ["entity.name.function.makefile", "text"], + regex: "^([^\\t ]+(?:\\s[^\\t ]+)*:)(\\s*.*)" + } + ], + "comment": [ + { + token : "punctuation.definition.comment.makefile", + regex : /.+\\/ + }, + { + token : "punctuation.definition.comment.makefile", + regex : ".+", + next : "start" + } + ], + "shell-start": [ + { + token: keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, + { + token: "string", + regex : "\\w+" + }, + { + token : "string.interpolated.backtick.makefile", + regex : "`", + next : "start" + } + ] +} + +}; + +oop.inherits(MakefileHighlightRules, TextHighlightRules); + +exports.MakefileHighlightRules = MakefileHighlightRules; +}); + +ace.define('ace/mode/sh_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var reservedKeywords = exports.reservedKeywords = ( + '!|{|}|case|do|done|elif|else|'+ + 'esac|fi|for|if|in|then|until|while|'+ + '&|;|export|local|read|typeset|unset|'+ + 'elif|select|set' + ); + +var languageConstructs = exports.languageConstructs = ( + '[|]|alias|bg|bind|break|builtin|'+ + 'cd|command|compgen|complete|continue|'+ + 'dirs|disown|echo|enable|eval|exec|'+ + 'exit|fc|fg|getopts|hash|help|history|'+ + 'jobs|kill|let|logout|popd|printf|pushd|'+ + 'pwd|return|set|shift|shopt|source|'+ + 'suspend|test|times|trap|type|ulimit|'+ + 'umask|unalias|wait' +); + +var ShHighlightRules = function() { + var keywordMapper = this.createKeywordMapper({ + "keyword": reservedKeywords, + "support.function.builtin": languageConstructs, + "invalid.deprecated": "debugger" + }, "identifier"); + + var integer = "(?:(?:[1-9]\\d*)|(?:0))"; + + var fraction = "(?:\\.\\d+)"; + var intPart = "(?:\\d+)"; + var pointFloat = "(?:(?:" + intPart + "?" + fraction + ")|(?:" + intPart + "\\.))"; + var exponentFloat = "(?:(?:" + pointFloat + "|" + intPart + ")" + ")"; + var floatNumber = "(?:" + exponentFloat + "|" + pointFloat + ")"; + var fileDescriptor = "(?:&" + intPart + ")"; + + var variableName = "[a-zA-Z][a-zA-Z0-9_]*"; + var variable = "(?:(?:\\$" + variableName + ")|(?:" + variableName + "=))"; + + var builtinVariable = "(?:\\$(?:SHLVL|\\$|\\!|\\?))"; + + var func = "(?:" + variableName + "\\s*\\(\\))"; + + this.$rules = { + "start" : [ { + token : ["text", "comment"], + regex : /(^|\s)(#.*)$/ + }, { + token : "string", // " string + regex : '"(?:[^\\\\]|\\\\.)*?"' + }, { + token : "variable.language", + regex : builtinVariable + }, { + token : "variable", + regex : variable + }, { + token : "support.function", + regex : func + }, { + token : "support.function", + regex : fileDescriptor + }, { + token : "string", // ' string + regex : "'(?:[^\\\\]|\\\\.)*?'" + }, { + token : "constant.numeric", // float + regex : floatNumber + }, { + token : "constant.numeric", // integer + regex : integer + "\\b" + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "keyword.operator", + regex : "\\+|\\-|\\*|\\*\\*|\\/|\\/\\/|~|<|>|<=|=>|=|!=" + }, { + token : "paren.lparen", + regex : "[\\[\\(\\{]" + }, { + token : "paren.rparen", + regex : "[\\]\\)\\}]" + } ] + }; +}; + +oop.inherits(ShHighlightRules, TextHighlightRules); + +exports.ShHighlightRules = ShHighlightRules; +}); + +ace.define('ace/mode/folding/coffee', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/folding/fold_mode', 'ace/range'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var BaseFoldMode = require("./fold_mode").FoldMode; +var Range = require("../../range").Range; + +var FoldMode = exports.FoldMode = function() {}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var range = this.indentationBlock(session, row); + if (range) + return range; + + var re = /\S/; + var line = session.getLine(row); + var startLevel = line.search(re); + if (startLevel == -1 || line[startLevel] != "#") + return; + + var startColumn = line.length; + var maxRow = session.getLength(); + var startRow = row; + var endRow = row; + + while (++row < maxRow) { + line = session.getLine(row); + var level = line.search(re); + + if (level == -1) + continue; + + if (line[level] != "#") + break; + + endRow = row; + } + + if (endRow > startRow) { + var endColumn = session.getLine(endRow).length; + return new Range(startRow, startColumn, endRow, endColumn); + } + }; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + var indent = line.search(/\S/); + var next = session.getLine(row + 1); + var prev = session.getLine(row - 1); + var prevIndent = prev.search(/\S/); + var nextIndent = next.search(/\S/); + + if (indent == -1) { + session.foldWidgets[row - 1] = prevIndent!= -1 && prevIndent < nextIndent ? "start" : ""; + return ""; + } + if (prevIndent == -1) { + if (indent == nextIndent && line[indent] == "#" && next[indent] == "#") { + session.foldWidgets[row - 1] = ""; + session.foldWidgets[row + 1] = ""; + return "start"; + } + } else if (prevIndent == indent && line[indent] == "#" && prev[indent] == "#") { + if (session.getLine(row - 2).search(/\S/) == -1) { + session.foldWidgets[row - 1] = "start"; + session.foldWidgets[row + 1] = ""; + return ""; + } + } + + if (prevIndent!= -1 && prevIndent < indent) + session.foldWidgets[row - 1] = "start"; + else + session.foldWidgets[row - 1] = ""; + + if (indent < nextIndent) + return "start"; + else + return ""; + }; + +}).call(FoldMode.prototype); + +}); diff --git a/0.0.3_0/ace/mode-markdown.js b/0.0.3_0/ace/mode-markdown.js new file mode 100644 index 0000000..97bc32d --- /dev/null +++ b/0.0.3_0/ace/mode-markdown.js @@ -0,0 +1,2285 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2010, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/mode/markdown', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/mode/javascript', 'ace/mode/xml', 'ace/mode/html', 'ace/tokenizer', 'ace/mode/markdown_highlight_rules', 'ace/mode/folding/markdown'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var JavaScriptMode = require("./javascript").Mode; +var XmlMode = require("./xml").Mode; +var HtmlMode = require("./html").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var MarkdownHighlightRules = require("./markdown_highlight_rules").MarkdownHighlightRules; +var MarkdownFoldMode = require("./folding/markdown").FoldMode; + +var Mode = function() { + var highlighter = new MarkdownHighlightRules(); + + this.$tokenizer = new Tokenizer(highlighter.getRules()); + this.$embeds = highlighter.getEmbeds(); + this.createModeDelegates({ + "js-": JavaScriptMode, + "xml-": XmlMode, + "html-": HtmlMode + }); + + this.foldingRules = new MarkdownFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = ">"; + + this.getNextLineIndent = function(state, line, tab) { + if (state == "listblock") { + var match = /^(\s*)(?:([-+*])|(\d+)\.)(\s+)/.exec(line); + if (!match) + return ""; + var marker = match[2]; + if (!marker) + marker = parseInt(match[3], 10) + 1 + "."; + return match[1] + marker + match[4]; + } else { + return this.$getIndent(line); + } + }; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/javascript', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/javascript_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/range', 'ace/worker/worker_client', 'ace/mode/behaviour/cstyle', 'ace/mode/folding/cstyle'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var Range = require("../range").Range; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new JavaScriptHighlightRules().getRules()); + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.$tokenizer.getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start" || state == "no_regex") { + var match = line.match(/^.*(?:\bcase\b.*\:|[\{\(\[])\s*$/); + if (match) { + indent += tab; + } + } else if (state == "doc-start") { + if (endState == "start" || endState == "no_regex") { + return ""; + } + var match = line.match(/^\s*(\/?)\*/); + if (match) { + if (match[1]) { + indent += " "; + } + indent += "* "; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/javascript_worker", "JavaScriptWorker"); + worker.attachToDocument(session.getDocument()); + + worker.on("jslint", function(results) { + session.setAnnotations(results.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +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(require, exports, module) { + + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var JavaScriptHighlightRules = function() { + var keywordMapper = this.createKeywordMapper({ + "variable.language": + "Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|" + // Constructors + "Namespace|QName|XML|XMLList|" + // E4X + "ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|" + + "Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|" + + "Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|" + // Errors + "SyntaxError|TypeError|URIError|" + + "decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|" + // Non-constructor functions + "isNaN|parseFloat|parseInt|" + + "JSON|Math|" + // Other + "this|arguments|prototype|window|document" , // Pseudo + "keyword": + "const|yield|import|get|set|" + + "break|case|catch|continue|default|delete|do|else|finally|for|function|" + + "if|in|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"); + var kwBeforeRe = "case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void"; + var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*\\b"; + + var escapedRe = "\\\\(?:x[0-9a-fA-F]{2}|" + // hex + "u[0-9a-fA-F]{4}|" + // unicode + "[0-2][0-7]{0,2}|" + // oct + "3[0-6][0-7]?|" + // oct + "37[0-7]?|" + // oct + "[4-7][0-7]?|" + //oct + ".)"; + + this.$rules = { + "no_regex" : [ + { + token : "comment", + regex : /\/\/.*$/ + }, + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : /\/\*/, + next : "comment" + }, { + token : "string", + regex : "'(?=.)", + next : "qstring" + }, { + token : "string", + regex : '"(?=.)', + next : "qqstring" + }, { + token : "constant.numeric", // hex + regex : /0[xX][0-9a-fA-F]+\b/ + }, { + token : "constant.numeric", // float + regex : /[+-]?\d+(?:(?:\.\d*)?(?:[eE][+-]?\d+)?)?\b/ + }, { + token : [ + "storage.type", "punctuation.operator", "support.function", + "punctuation.operator", "entity.name.function", "text","keyword.operator" + ], + regex : "(" + identifierRe + ")(\\.)(prototype)(\\.)(" + identifierRe +")(\\s*)(=)", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "keyword.operator", "text", "storage.type", + "text", "paren.lparen" + ], + regex : "(" + identifierRe +")(\\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 : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(function)(\\s+)(" + identifierRe + ")(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "punctuation.operator", + "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\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 : "(?:" + kwBeforeRe + ")\\b", + next : "start" + }, { + token : ["punctuation.operator", "support.function"], + regex : /(\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:opzzzz|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 : ["punctuation.operator", "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)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/ + }, { + token : ["punctuation.operator", "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 : ["storage.type", "punctuation.operator", "support.function.firebug"], + regex : /(console)(\.)(warn|info|log|error|time|timeEnd|assert)\b/ + }, { + token : keywordMapper, + regex : identifierRe + }, { + token : "keyword.operator", + regex : /--|\+\+|[!$%&*+\-~]|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\|\||\?\:|\*=|%=|\+=|\-=|&=|\^=/, + next : "start" + }, { + token : "punctuation.operator", + regex : /\?|\:|\,|\;|\./, + next : "start" + }, { + token : "paren.lparen", + regex : /[\[({]/, + next : "start" + }, { + token : "paren.rparen", + regex : /[\])}]/ + }, { + token : "keyword.operator", + regex : /\/=?/, + next : "start" + }, { + token: "comment", + regex: /^#!.*$/ + } + ], + "start": [ + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment_regex_allowed" + }, { + token : "comment", + regex : "\\/\\/.*$", + next : "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: "/\\w*", + 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.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: identifierRe + }, { + token: "punctuation.operator", + regex: "[, ]+" + }, { + token: "punctuation.operator", + regex: "$" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "comment_regex_allowed" : [ + {token : "comment", regex : "\\*\\/", next : "start"}, + {defaultToken : "comment"} + ], + "comment" : [ + {token : "comment", regex : "\\*\\/", next : "no_regex"}, + {defaultToken : "comment"} + ], + "qqstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + next : "qqstring" + }, { + token : "string", + regex : '"|$', + next : "no_regex" + }, { + defaultToken: "string" + } + ], + "qstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + next : "qstring" + }, { + token : "string", + regex : "'|$", + next : "no_regex" + }, { + defaultToken: "string" + } + ] + }; + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("no_regex") ]); +}; + +oop.inherits(JavaScriptHighlightRules, TextHighlightRules); + +exports.JavaScriptHighlightRules = JavaScriptHighlightRules; +}); + +ace.define('ace/mode/doc_comment_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, { + token : "comment.doc.tag", + regex : "\\bTODO\\b" + }, { + defaultToken : "comment.doc" + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) { + + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define('ace/mode/behaviour/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/token_iterator', 'ace/lib/lang'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; +var lang = require("../../lib/lang"); + +var SAFE_INSERT_IN_TOKENS = + ["text", "paren.rparen", "punctuation.operator"]; +var SAFE_INSERT_BEFORE_TOKENS = + ["text", "paren.rparen", "punctuation.operator", "comment"]; + + +var autoInsertedBrackets = 0; +var autoInsertedRow = -1; +var autoInsertedLineEnd = ""; +var maybeInsertedBrackets = 0; +var maybeInsertedRow = -1; +var maybeInsertedLineStart = ""; +var maybeInsertedLineEnd = ""; + +var CstyleBehaviour = function () { + + CstyleBehaviour.isSaneInsertion = function(editor, session) { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + if (!this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) { + var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1); + if (!this.$matchTokenType(iterator2.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) + return false; + } + iterator.stepForward(); + return iterator.getCurrentTokenRow() !== cursor.row || + this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_BEFORE_TOKENS); + }; + + CstyleBehaviour.$matchTokenType = function(token, types) { + return types.indexOf(token.type || token) > -1; + }; + + CstyleBehaviour.recordAutoInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isAutoInsertedClosing(cursor, line, autoInsertedLineEnd[0])) + autoInsertedBrackets = 0; + autoInsertedRow = cursor.row; + autoInsertedLineEnd = bracket + line.substr(cursor.column); + autoInsertedBrackets++; + }; + + CstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isMaybeInsertedClosing(cursor, line)) + maybeInsertedBrackets = 0; + maybeInsertedRow = cursor.row; + maybeInsertedLineStart = line.substr(0, cursor.column) + bracket; + maybeInsertedLineEnd = line.substr(cursor.column); + maybeInsertedBrackets++; + }; + + CstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) { + return autoInsertedBrackets > 0 && + cursor.row === autoInsertedRow && + bracket === autoInsertedLineEnd[0] && + line.substr(cursor.column) === autoInsertedLineEnd; + }; + + CstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) { + return maybeInsertedBrackets > 0 && + cursor.row === maybeInsertedRow && + line.substr(cursor.column) === maybeInsertedLineEnd && + line.substr(0, cursor.column) == maybeInsertedLineStart; + }; + + CstyleBehaviour.popAutoInsertedClosing = function() { + autoInsertedLineEnd = autoInsertedLineEnd.substr(1); + autoInsertedBrackets--; + }; + + CstyleBehaviour.clearMaybeInsertedClosing = function() { + maybeInsertedBrackets = 0; + maybeInsertedRow = -1; + }; + + this.add("braces", "insertion", function (state, action, editor, session, text) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (text == '{') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "{" && editor.getWrapBehavioursEnabled()) { + return { + text: '{' + selected + '}', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + if (/[\]\}\)]/.test(line[cursor.column])) { + CstyleBehaviour.recordAutoInsert(editor, session, "}"); + return { + text: '{}', + selection: [1, 1] + }; + } else { + CstyleBehaviour.recordMaybeInsert(editor, session, "{"); + return { + text: '{', + selection: [1, 1] + }; + } + } + } else if (text == '}') { + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}') { + var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } else if (text == "\n" || text == "\r\n") { + var closing = ""; + if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) { + closing = lang.stringRepeat("}", maybeInsertedBrackets); + CstyleBehaviour.clearMaybeInsertedClosing(); + } + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}' || closing !== "") { + var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column}, '}'); + if (!openBracePos) + return null; + + var indent = this.getNextLineIndent(state, line.substring(0, cursor.column), session.getTabString()); + var next_indent = this.$getIndent(line); + + return { + text: '\n' + indent + '\n' + next_indent + closing, + selection: [1, indent.length, 1, indent.length] + }; + } + } + }); + + this.add("braces", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '{') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar == '}') { + range.end.column++; + return range; + } else { + maybeInsertedBrackets--; + } + } + }); + + this.add("parens", "insertion", function (state, action, editor, session, text) { + if (text == '(') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return { + text: '(' + selected + ')', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, ")"); + return { + text: '()', + selection: [1, 1] + }; + } + } else if (text == ')') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ')') { + var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("parens", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '(') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ')') { + range.end.column++; + return range; + } + } + }); + + this.add("brackets", "insertion", function (state, action, editor, session, text) { + if (text == '[') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return { + text: '[' + selected + ']', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, "]"); + return { + text: '[]', + selection: [1, 1] + }; + } + } else if (text == ']') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ']') { + var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("brackets", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '[') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ']') { + range.end.column++; + return range; + } + } + }); + + this.add("string_dquotes", "insertion", function (state, action, editor, session, text) { + if (text == '"' || text == "'") { + var quote = text; + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "'" && selected != '"' && editor.getWrapBehavioursEnabled()) { + return { + text: quote + selected + quote, + selection: false + }; + } else { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var leftChar = line.substring(cursor.column-1, cursor.column); + if (leftChar == '\\') { + return null; + } + var tokens = session.getTokens(selection.start.row); + var col = 0, token; + var quotepos = -1; // Track whether we're inside an open quote. + + for (var x = 0; x < tokens.length; x++) { + token = tokens[x]; + if (token.type == "string") { + quotepos = -1; + } else if (quotepos < 0) { + quotepos = token.value.indexOf(quote); + } + if ((token.value.length + col) > selection.start.column) { + break; + } + col += tokens[x].value.length; + } + if (!token || (quotepos < 0 && token.type !== "comment" && (token.type !== "string" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) { + if (!CstyleBehaviour.isSaneInsertion(editor, session)) + return; + return { + text: quote + quote, + selection: [1,1] + }; + } else if (token && token.type === "string") { + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == quote) { + return { + text: '', + selection: [1, 1] + }; + } + } + } + } + }); + + this.add("string_dquotes", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && (selected == '"' || selected == "'")) { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == selected) { + range.end.column++; + return range; + } + } + }); + +}; + +oop.inherits(CstyleBehaviour, Behaviour); + +exports.CstyleBehaviour = CstyleBehaviour; +}); + +ace.define('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var line = session.getLine(row); + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i + match[0].length, 1); + } + + if (foldStyle !== "markbeginend") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define('ace/mode/xml', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/xml_highlight_rules', 'ace/mode/behaviour/xml', 'ace/mode/folding/xml'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var XmlHighlightRules = require("./xml_highlight_rules").XmlHighlightRules; +var XmlBehaviour = require("./behaviour/xml").XmlBehaviour; +var XmlFoldMode = require("./folding/xml").FoldMode; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new XmlHighlightRules().getRules()); + this.$behaviour = new XmlBehaviour(); + this.foldingRules = new XmlFoldMode(); +}; + +oop.inherits(Mode, TextMode); + +(function() { + + this.blockComment = {start: ""}; + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/xml_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/xml_util', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var xmlUtil = require("./xml_util"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var XmlHighlightRules = function() { + this.$rules = { + start : [ + {token : "text", regex : "<\\!\\[CDATA\\[", next : "cdata"}, + {token : "xml-pe", regex : "<\\?.*?\\?>"}, + {token : "comment", regex : "<\\!--", next : "comment"}, + {token : "xml-pe", regex : "<\\!.*?>"}, + {token : "meta.tag", regex : "<\\/?", next : "tag"}, + {token : "text", regex : "\\s+"}, + { + token : "constant.character.entity", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + } + ], + + cdata : [ + {token : "text", regex : "\\]\\]>", next : "start"}, + {token : "text", regex : "\\s+"}, + {token : "text", regex : "(?:[^\\]]|\\](?!\\]>))+"} + ], + + comment : [ + {token : "comment", regex : ".*?-->", next : "start"}, + {token : "comment", regex : ".+"} + ] + }; + + xmlUtil.tag(this.$rules, "tag", "start"); +}; + +oop.inherits(XmlHighlightRules, TextHighlightRules); + +exports.XmlHighlightRules = XmlHighlightRules; +}); + +ace.define('ace/mode/xml_util', ['require', 'exports', 'module' ], function(require, exports, module) { + + +function string(state) { + return [{ + token : "string", + regex : '"', + next : state + "_qqstring" + }, { + token : "string", + regex : "'", + next : state + "_qstring" + }]; +} + +function multiLineString(quote, state) { + return [ + {token : "string", regex : quote, next : state}, + { + token : "constant.language.escape", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }, + {defaultToken : "string"} + ]; +} + +exports.tag = function(states, name, nextState, tagMap) { + states[name] = [{ + token : "text", + regex : "\\s+" + }, { + + token : !tagMap ? "meta.tag.tag-name" : function(value) { + if (tagMap[value]) + return "meta.tag.tag-name." + tagMap[value]; + else + return "meta.tag.tag-name"; + }, + regex : "[-_a-zA-Z0-9:]+", + next : name + "_embed_attribute_list" + }, { + token: "empty", + regex: "", + next : name + "_embed_attribute_list" + }]; + + states[name + "_qstring"] = multiLineString("'", name + "_embed_attribute_list"); + states[name + "_qqstring"] = multiLineString("\"", name + "_embed_attribute_list"); + + states[name + "_embed_attribute_list"] = [{ + token : "meta.tag.r", + regex : "/?>", + next : nextState + }, { + token : "keyword.operator", + regex : "=" + }, { + token : "entity.other.attribute-name", + regex : "[-_a-zA-Z0-9:]+" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : "text", + regex : "\\s+" + }].concat(string(name)); +}; + +}); + +ace.define('ace/mode/behaviour/xml', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/mode/behaviour/cstyle', 'ace/token_iterator'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var CstyleBehaviour = require("./cstyle").CstyleBehaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; + +function hasType(token, type) { + var hasType = true; + var typeList = token.type.split('.'); + var needleList = type.split('.'); + needleList.forEach(function(needle){ + if (typeList.indexOf(needle) == -1) { + hasType = false; + return false; + } + }); + return hasType; +} + +var XmlBehaviour = function () { + + this.inherit(CstyleBehaviour, ["string_dquotes"]); // Get string behaviour + + this.add("autoclosing", "insertion", function (state, action, editor, session, text) { + if (text == '>') { + var position = editor.getCursorPosition(); + var iterator = new TokenIterator(session, position.row, position.column); + var token = iterator.getCurrentToken(); + var atCursor = false; + if (!token || !hasType(token, 'meta.tag') && !(hasType(token, 'text') && token.value.match('/'))){ + do { + token = iterator.stepBackward(); + } while (token && (hasType(token, 'string') || hasType(token, 'keyword.operator') || hasType(token, 'entity.attribute-name') || hasType(token, 'text'))); + } else { + atCursor = true; + } + if (!token || !hasType(token, 'meta.tag-name') || iterator.stepBackward().value.match('/')) { + return + } + var tag = token.value; + if (atCursor){ + var tag = tag.substring(0, position.column - token.start); + } + + return { + text: '>' + '', + selection: [1, 1] + } + } + }); + + this.add('autoindent', 'insertion', function (state, action, editor, session, text) { + if (text == "\n") { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChars = line.substring(cursor.column, cursor.column + 2); + if (rightChars == '?)/; + this._parseTag = function(tag) { + + var match = tag.match(this.tagRe); + var column = 0; + + return { + value: tag, + match: match ? match[2] : "", + closing: match ? !!match[3] : false, + selfClosing: match ? !!match[5] || match[2] == "/>" : false, + tagName: match ? match[4] : "", + column: match[1] ? column + match[1].length : column + }; + }; + this._readTagForward = function(iterator) { + var token = iterator.getCurrentToken(); + if (!token) + return null; + + var value = ""; + var start; + + do { + if (token.type.indexOf("meta.tag") === 0) { + if (!start) { + var start = { + row: iterator.getCurrentTokenRow(), + column: iterator.getCurrentTokenColumn() + }; + } + value += token.value; + if (value.indexOf(">") !== -1) { + var tag = this._parseTag(value); + tag.start = start; + tag.end = { + row: iterator.getCurrentTokenRow(), + column: iterator.getCurrentTokenColumn() + token.value.length + }; + iterator.stepForward(); + return tag; + } + } + } while(token = iterator.stepForward()); + + return null; + }; + + this._readTagBackward = function(iterator) { + var token = iterator.getCurrentToken(); + if (!token) + return null; + + var value = ""; + var end; + + do { + if (token.type.indexOf("meta.tag") === 0) { + if (!end) { + end = { + row: iterator.getCurrentTokenRow(), + column: iterator.getCurrentTokenColumn() + token.value.length + }; + } + value = token.value + value; + if (value.indexOf("<") !== -1) { + var tag = this._parseTag(value); + tag.end = end; + tag.start = { + row: iterator.getCurrentTokenRow(), + column: iterator.getCurrentTokenColumn() + }; + iterator.stepBackward(); + return tag; + } + } + } while(token = iterator.stepBackward()); + + return null; + }; + + this._pop = function(stack, tag) { + while (stack.length) { + + var top = stack[stack.length-1]; + if (!tag || top.tagName == tag.tagName) { + return stack.pop(); + } + else if (this.voidElements[tag.tagName]) { + return; + } + else if (this.voidElements[top.tagName]) { + stack.pop(); + continue; + } else { + return null; + } + } + }; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var firstTag = this._getFirstTagInLine(session, row); + + if (!firstTag.match) + return null; + + var isBackward = firstTag.closing || firstTag.selfClosing; + var stack = []; + var tag; + + if (!isBackward) { + var iterator = new TokenIterator(session, row, firstTag.column); + var start = { + row: row, + column: firstTag.column + firstTag.tagName.length + 2 + }; + while (tag = this._readTagForward(iterator)) { + if (tag.selfClosing) { + if (!stack.length) { + tag.start.column += tag.tagName.length + 2; + tag.end.column -= 2; + return Range.fromPoints(tag.start, tag.end); + } else + continue; + } + + if (tag.closing) { + this._pop(stack, tag); + if (stack.length == 0) + return Range.fromPoints(start, tag.start); + } + else { + stack.push(tag) + } + } + } + else { + var iterator = new TokenIterator(session, row, firstTag.column + firstTag.match.length); + var end = { + row: row, + column: firstTag.column + }; + + while (tag = this._readTagBackward(iterator)) { + if (tag.selfClosing) { + if (!stack.length) { + tag.start.column += tag.tagName.length + 2; + tag.end.column -= 2; + return Range.fromPoints(tag.start, tag.end); + } else + continue; + } + + if (!tag.closing) { + this._pop(stack, tag); + if (stack.length == 0) { + tag.start.column += tag.tagName.length + 2; + return Range.fromPoints(tag.start, end); + } + } + else { + stack.push(tag) + } + } + } + + }; + +}).call(FoldMode.prototype); + +}); + +ace.define('ace/mode/html', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/mode/javascript', 'ace/mode/css', 'ace/tokenizer', 'ace/mode/html_highlight_rules', 'ace/mode/behaviour/html', 'ace/mode/folding/html'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var JavaScriptMode = require("./javascript").Mode; +var CssMode = require("./css").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules; +var HtmlBehaviour = require("./behaviour/html").HtmlBehaviour; +var HtmlFoldMode = require("./folding/html").FoldMode; + +var Mode = function() { + var highlighter = new HtmlHighlightRules(); + this.$tokenizer = new Tokenizer(highlighter.getRules()); + this.$behaviour = new HtmlBehaviour(); + + this.$embeds = highlighter.getEmbeds(); + this.createModeDelegates({ + "js-": JavaScriptMode, + "css-": CssMode + }); + + this.foldingRules = new HtmlFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.blockComment = {start: ""}; + + this.getNextLineIndent = function(state, line, tab) { + return this.$getIndent(line); + }; + + this.checkOutdent = function(state, line, input) { + return false; + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/css', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/css_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/worker/worker_client', 'ace/mode/behaviour/css', 'ace/mode/folding/cstyle'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CssBehaviour = require("./behaviour/css").CssBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new CssHighlightRules().getRules()); + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CssBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.foldingRules = "cStyle"; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + var tokens = this.$tokenizer.getLineTokens(line, state).tokens; + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + var match = line.match(/^.*\{\s*$/); + if (match) { + indent += tab; + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/css_worker", "Worker"); + worker.attachToDocument(session.getDocument()); + + worker.on("csslint", function(e) { + session.setAnnotations(e.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; + +}); + +ace.define('ace/mode/css_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var supportType = exports.supportType = "animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|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|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|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|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index"; +var supportFunction = exports.supportFunction = "rgb|rgba|url|attr|counter|counters"; +var supportConstant = exports.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"; +var supportConstantColor = exports.supportConstantColor = "aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow"; +var supportConstantFonts = exports.supportConstantFonts = "arial|century|comic|courier|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace"; + +var numRe = exports.numRe = "\\-?(?:(?:[0-9]+)|(?:[0-9]*\\.[0-9]+))"; +var pseudoElements = exports.pseudoElements = "(\\:+)\\b(after|before|first-letter|first-line|moz-selection|selection)\\b"; +var pseudoClasses = exports.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"; + +var CssHighlightRules = function() { + + var keywordMapper = this.createKeywordMapper({ + "support.function": supportFunction, + "support.constant": supportConstant, + "support.type": supportType, + "support.constant.color": supportConstantColor, + "support.constant.fonts": supportConstantFonts + }, "text", true); + + var base_ruleset = [ + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "ruleset_comment" + }, { + token : "string", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' + }, { + token : "string", // single line + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" + }, { + token : ["constant.numeric", "keyword"], + regex : "(" + numRe + ")(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 : numRe + }, { + token : "constant.numeric", // hex6 color + regex : "#[a-f0-9]{6}" + }, { + token : "constant.numeric", // hex3 color + regex : "#[a-f0-9]{3}" + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"], + regex : pseudoElements + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"], + regex : pseudoClasses + }, { + token : ["support.function", "string", "support.function"], + regex : "(url\\()(.*)(\\))" + }, { + token : keywordMapper, + regex : "\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*" + }, { + caseInsensitive: true + } + ]; + + var ruleset = lang.copyArray(base_ruleset); + ruleset.unshift({ + token : "paren.rparen", + regex : "\\}", + next: "start" + }); + + var media_ruleset = lang.copyArray( base_ruleset ); + media_ruleset.unshift({ + token : "paren.rparen", + regex : "\\}", + next: "media" + }); + + var base_comment = [{ + token : "comment", // comment spanning whole line + regex : ".+" + }]; + + var comment = lang.copyArray(base_comment); + comment.unshift({ + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "start" + }); + + var media_comment = lang.copyArray(base_comment); + media_comment.unshift({ + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "media" + }); + + var ruleset_comment = lang.copyArray(base_comment); + ruleset_comment.unshift({ + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "ruleset" + }); + + this.$rules = { + "start" : [{ + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment" + }, { + token: "paren.lparen", + regex: "\\{", + next: "ruleset" + }, { + token: "string", + regex: "@.*?{", + next: "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: true + }], + + "media" : [ { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "media_comment" + }, { + token: "paren.lparen", + regex: "\\{", + next: "media_ruleset" + },{ + token: "string", + regex: "\\}", + next: "start" + },{ + 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: true + }], + + "comment" : comment, + + "ruleset" : ruleset, + "ruleset_comment" : ruleset_comment, + + "media_ruleset" : media_ruleset, + "media_comment" : media_comment + }; +}; + +oop.inherits(CssHighlightRules, TextHighlightRules); + +exports.CssHighlightRules = CssHighlightRules; + +}); + +ace.define('ace/mode/behaviour/css', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/mode/behaviour/cstyle', 'ace/token_iterator'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var CstyleBehaviour = require("./cstyle").CstyleBehaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; + +var CssBehaviour = function () { + + this.inherit(CstyleBehaviour); + + this.add("colon", "insertion", function (state, action, editor, session, text) { + if (text === ':') { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + if (token && token.value.match(/\s+/)) { + token = iterator.stepBackward(); + } + if (token && token.type === 'support.type') { + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar === ':') { + return { + text: '', + selection: [1, 1] + } + } + if (!line.substring(cursor.column).match(/^\s*;/)) { + return { + text: ':;', + selection: [1, 1] + } + } + } + } + }); + + this.add("colon", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected === ':') { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + if (token && token.value.match(/\s+/)) { + token = iterator.stepBackward(); + } + if (token && token.type === 'support.type') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar === ';') { + range.end.column ++; + return range; + } + } + } + }); + + this.add("semicolon", "insertion", function (state, action, editor, session, text) { + if (text === ';') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar === ';') { + return { + text: '', + selection: [1, 1] + } + } + } + }); + +} +oop.inherits(CssBehaviour, CstyleBehaviour); + +exports.CssBehaviour = CssBehaviour; +}); + +ace.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_util', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var xmlUtil = require("./xml_util"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var tagMap = lang.createMap({ + a : 'anchor', + button : 'form', + form : 'form', + img : 'image', + input : 'form', + label : 'form', + script : 'script', + select : 'form', + textarea : 'form', + style : 'style', + table : 'table', + tbody : 'table', + td : 'table', + tfoot : 'table', + th : 'table', + tr : 'table' +}); + +var HtmlHighlightRules = function() { + this.$rules = { + start : [{ + token : "text", + regex : "<\\!\\[CDATA\\[", + next : "cdata" + }, { + token : "xml-pe", + regex : "<\\?.*?\\?>" + }, { + token : "comment", + regex : "<\\!--", + next : "comment" + }, { + token : "xml-pe", + regex : "<\\!.*?>" + }, { + token : "meta.tag", + regex : "<(?=script\\b)", + next : "script" + }, { + token : "meta.tag", + regex : "<(?=style\\b)", + next : "style" + }, { + token : "meta.tag", // opening tag + regex : "<\\/?(?=\\S)", + next : "tag" + }, { + token : "text", + regex : "\\s+" + }, { + token : "constant.character.entity", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }], + + cdata : [ { + token : "text", + regex : "\\]\\]>", + next : "start" + } ], + + comment : [ { + token : "comment", + regex : ".*?-->", + next : "start" + }, { + defaultToken : "comment" + } ] + }; + + xmlUtil.tag(this.$rules, "tag", "start", tagMap); + xmlUtil.tag(this.$rules, "style", "css-start", tagMap); + xmlUtil.tag(this.$rules, "script", "js-start", tagMap); + + this.embedRules(JavaScriptHighlightRules, "js-", [{ + token: "comment", + regex: "\\/\\/.*(?=<\\/script>)", + next: "tag" + }, { + token: "meta.tag", + regex: "<\\/(?=script)", + next: "tag" + }]); + + this.embedRules(CssHighlightRules, "css-", [{ + token: "meta.tag", + regex: "<\\/(?=style)", + next: "tag" + }]); +}; + +oop.inherits(HtmlHighlightRules, TextHighlightRules); + +exports.HtmlHighlightRules = HtmlHighlightRules; +}); + +ace.define('ace/mode/behaviour/html', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour/xml', 'ace/mode/behaviour/cstyle', 'ace/token_iterator'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var XmlBehaviour = require("../behaviour/xml").XmlBehaviour; +var CstyleBehaviour = require("./cstyle").CstyleBehaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; +var voidElements = ['area', 'base', 'br', 'col', 'command', 'embed', 'hr', 'img', 'input', 'keygen', 'link', 'meta', 'param', 'source', 'track', 'wbr']; + +function hasType(token, type) { + var hasType = true; + var typeList = token.type.split('.'); + var needleList = type.split('.'); + needleList.forEach(function(needle){ + if (typeList.indexOf(needle) == -1) { + hasType = false; + return false; + } + }); + return hasType; +} + +var HtmlBehaviour = function () { + + this.inherit(XmlBehaviour); // Get xml behaviour + + this.add("autoclosing", "insertion", function (state, action, editor, session, text) { + if (text == '>') { + var position = editor.getCursorPosition(); + var iterator = new TokenIterator(session, position.row, position.column); + var token = iterator.getCurrentToken(); + + if (hasType(token, 'string') && iterator.getCurrentTokenColumn() + token.value.length > position.column) + return; + var atCursor = false; + if (!token || !hasType(token, 'meta.tag') && !(hasType(token, 'text') && token.value.match('/'))){ + do { + token = iterator.stepBackward(); + } while (token && (hasType(token, 'string') || hasType(token, 'keyword.operator') || hasType(token, 'entity.attribute-name') || hasType(token, 'text'))); + } else { + atCursor = true; + } + if (!token || !hasType(token, 'meta.tag-name') || iterator.stepBackward().value.match('/')) { + return + } + var element = token.value; + if (atCursor){ + var element = element.substring(0, position.column - token.start); + } + if (voidElements.indexOf(element) !== -1){ + return; + } + return { + text: '>' + '', + selection: [1, 1] + } + } + }); +} +oop.inherits(HtmlBehaviour, XmlBehaviour); + +exports.HtmlBehaviour = HtmlBehaviour; +}); + +ace.define('ace/mode/folding/html', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/folding/mixed', 'ace/mode/folding/xml', 'ace/mode/folding/cstyle'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var MixedFoldMode = require("./mixed").FoldMode; +var XmlFoldMode = require("./xml").FoldMode; +var CStyleFoldMode = require("./cstyle").FoldMode; + +var FoldMode = exports.FoldMode = function() { + MixedFoldMode.call(this, new XmlFoldMode({ + "area": 1, + "base": 1, + "br": 1, + "col": 1, + "command": 1, + "embed": 1, + "hr": 1, + "img": 1, + "input": 1, + "keygen": 1, + "link": 1, + "meta": 1, + "param": 1, + "source": 1, + "track": 1, + "wbr": 1, + "li": 1, + "dt": 1, + "dd": 1, + "p": 1, + "rt": 1, + "rp": 1, + "optgroup": 1, + "option": 1, + "colgroup": 1, + "td": 1, + "th": 1 + }), { + "js-": new CStyleFoldMode(), + "css-": new CStyleFoldMode() + }); +}; + +oop.inherits(FoldMode, MixedFoldMode); + +}); + +ace.define('ace/mode/folding/mixed', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/folding/fold_mode'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(defaultMode, subModes) { + this.defaultMode = defaultMode; + this.subModes = subModes; +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + + this.$getMode = function(state) { + for (var key in this.subModes) { + if (state.indexOf(key) === 0) + return this.subModes[key]; + } + return null; + }; + + this.$tryMode = function(state, session, foldStyle, row) { + var mode = this.$getMode(state); + return (mode ? mode.getFoldWidget(session, foldStyle, row) : ""); + }; + + this.getFoldWidget = function(session, foldStyle, row) { + return ( + this.$tryMode(session.getState(row-1), session, foldStyle, row) || + this.$tryMode(session.getState(row), session, foldStyle, row) || + this.defaultMode.getFoldWidget(session, foldStyle, row) + ); + }; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var mode = this.$getMode(session.getState(row-1)); + + if (!mode || !mode.getFoldWidget(session, foldStyle, row)) + mode = this.$getMode(session.getState(row)); + + if (!mode || !mode.getFoldWidget(session, foldStyle, row)) + mode = this.defaultMode; + + return mode.getFoldWidgetRange(session, foldStyle, row); + }; + +}).call(FoldMode.prototype); + +}); + +ace.define('ace/mode/markdown_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules', 'ace/mode/javascript_highlight_rules', 'ace/mode/xml_highlight_rules', 'ace/mode/html_highlight_rules', 'ace/mode/css_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var XmlHighlightRules = require("./xml_highlight_rules").XmlHighlightRules; +var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules; +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; + +function github_embed(tag, prefix) { + return { // Github style block + token : "support.function", + regex : "^```" + tag + "\\s*$", + next : prefix + "start" + }; +} + +var MarkdownHighlightRules = function() { + + this.$rules = { + "basic" : [{ + token : "constant.language.escape", + regex : /\\[\\`*_{}\[\]()#+\-.!]/ + }, { // code span ` + token : "support.function", + regex : "(`+)(.*?[^`])(\\1)" + }, { // reference + token : ["text", "constant", "text", "url", "string", "text"], + regex : "^([ ]{0,3}\\[)([^\\]]+)(\\]:\\s*)([^ ]+)(\\s*(?:[\"][^\"]+[\"])?(\\s*))$" + }, { // link by reference + token : ["text", "string", "text", "constant", "text"], + regex : "(\\[)((?:[[^\\]]*\\]|[^\\[\\]])*)(\\][ ]?(?:\\n[ ]*)?\\[)(.*?)(\\])" + }, { // link by url + token : ["text", "string", "text", "markup.underline", "string", "text"], + regex : "(\\[)"+ + "(\\[[^\\]]*\\]|[^\\[\\]]*)"+ + "(\\]\\([ \\t]*)"+ + "(?)"+ + "((?:[ \t]*\"(?:.*?)\"[ \\t]*)?)"+ + "(\\))" + }, { // strong ** __ + token : "string", + regex : "([*]{2}|[_]{2}(?=\\S))(.*?\\S[*_]*)(\\1)" + }, { // emphasis * _ + token : "string", + regex : "([*]|[_](?=\\S))(.*?\\S[*_]*)(\\1)" + }, { // + token : ["text", "url", "text"], + regex : "(<)("+ + "(?:https?|ftp|dict):[^'\">\\s]+"+ + "|"+ + "(?:mailto:)?[-.\\w]+\\@[-a-z0-9]+(?:\\.[-a-z0-9]+)*\\.[a-z]+"+ + ")(>)" + }], + "allowBlock": [ + {token : "support.function", regex : "^ {4}.+", next : "allowBlock"}, + {token : "empty", regex : "", next : "start"} + ], + + "start" : [{ + token : "empty_line", + regex : '^$', + next: "allowBlock" + }, { // h1 + token: "markup.heading.1", + regex: "^=+(?=\\s*$)" + }, { // h2 + token: "markup.heading.2", + regex: "^\\-+(?=\\s*$)" + }, { + token : function(value) { + return "markup.heading." + value.length; + }, + regex : /^#{1,6}(?=\s*[^ #]|\s+#.)/, + next : "header" + }, + github_embed("(?:javascript|js)", "js-"), + github_embed("xml", "xml-"), + github_embed("html", "html-"), + github_embed("css", "css-"), + { // Github style block + token : "support.function", + regex : "^```\\s*[a-zA-Z]*(?:{.*?\\})?\\s*$", + next : "githubblock" + }, { // block quote + token : "string", + regex : "^>[ ].+$", + next : "blockquote" + }, { // HR * - _ + token : "constant", + regex : "^ {0,2}(?:(?: ?\\* ?){3,}|(?: ?\\- ?){3,}|(?: ?\\_ ?){3,})\\s*$", + next: "allowBlock" + }, { // list + token : "markup.list", + regex : "^\\s{0,3}(?:[*+-]|\\d+\\.)\\s+", + next : "listblock-start" + }, { + include : "basic" + }], + + "header" : [{ + regex: "$", + next : "start" + }, { + include: "basic" + }, { + defaultToken : "markup.heading" + } ], + + "listblock-start" : [{ + token : "support.variable", + regex : /(?:\[[ x]\])?/, + next : "listblock" + }], + + "listblock" : [ { // Lists only escape on completely blank lines. + token : "empty_line", + regex : "^$", + next : "start" + }, { // list + token : "markup.list", + regex : "^\\s{0,3}(?:[*+-]|\\d+\\.)\\s+", + next : "listblock-start" + }, { + include : "basic", noEscape: true + }, { + defaultToken : "markup.list" + } ], + + "blockquote" : [ { // BLockquotes only escape on blank lines. + token : "empty_line", + regex : "^\\s*$", + next : "start" + }, { + token : "string", + regex : ".+" + } ], + + "githubblock" : [ { + token : "support.function", + regex : "^```", + next : "start" + }, { + token : "support.function", + regex : ".+" + } ] + }; + + this.embedRules(JavaScriptHighlightRules, "js-", [{ + token : "support.function", + regex : "^```", + next : "start" + }]); + + this.embedRules(HtmlHighlightRules, "html-", [{ + token : "support.function", + regex : "^```", + next : "start" + }]); + + this.embedRules(CssHighlightRules, "css-", [{ + token : "support.function", + regex : "^```", + next : "start" + }]); + + this.embedRules(XmlHighlightRules, "xml-", [{ + token : "support.function", + regex : "^```", + next : "start" + }]); + + var html = new HtmlHighlightRules().getRules(); + for (var i in html) { + if (this.$rules[i]) + this.$rules[i] = this.$rules[i].concat(html[i]); + else + this.$rules[i] = html[i]; + } + + this.normalizeRules(); +}; +oop.inherits(MarkdownHighlightRules, TextHighlightRules); + +exports.MarkdownHighlightRules = MarkdownHighlightRules; +}); + +ace.define('ace/mode/folding/markdown', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/folding/fold_mode', 'ace/range'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var BaseFoldMode = require("./fold_mode").FoldMode; +var Range = require("../../range").Range; + +var FoldMode = exports.FoldMode = function() {}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + this.foldingStartMarker = /^(?:[=-]+\s*$|#{1,6} |`{3})/; + + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + if (!this.foldingStartMarker.test(line)) + return ""; + + if (line[0] == "`") { + if (session.bgTokenizer.getState(row) == "start") + return "end"; + return "start"; + } + + return "start"; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var line = session.getLine(row); + var startColumn = line.length; + var maxRow = session.getLength(); + var startRow = row; + var endRow = row; + if (!line.match(this.foldingStartMarker)) + return; + + if (line[0] == "`") { + if (session.bgTokenizer.getState(row) !== "start") { + while (++row < maxRow) { + line = session.getLine(row); + if (line[0] == "`" & line.substring(0, 3) == "```") + break; + } + return new Range(startRow, startColumn, row, 0); + } else { + while (row -- > 0) { + line = session.getLine(row); + if (line[0] == "`" & line.substring(0, 3) == "```") + break; + } + return new Range(row, line.length, startRow, 0); + } + } + + var token; + function isHeading(row) { + token = session.getTokens(row)[0]; + return token && token.type.lastIndexOf(heading, 0) === 0; + } + + var heading = "markup.heading"; + function getLevel() { + var ch = token.value[0]; + if (ch == "=") return 6; + if (ch == "-") return 5; + return 7 - token.value.search(/[^#]/); + } + + if (isHeading(row)) { + var startHeadingLevel = getLevel(); + while (++row < maxRow) { + if (!isHeading(row)) + continue; + var level = getLevel(); + if (level >= startHeadingLevel) + break; + } + + endRow = row - (!token || ["=", "-"].indexOf(token.value[0]) == -1 ? 1 : 2); + + if (endRow > startRow) { + while (endRow > startRow && /^\s*$/.test(session.getLine(endRow))) + endRow--; + } + + if (endRow > startRow) { + var endColumn = session.getLine(endRow).length; + return new Range(startRow, startColumn, endRow, endColumn); + } + } + }; + +}).call(FoldMode.prototype); + +}); diff --git a/0.0.3_0/ace/mode-matlab.js b/0.0.3_0/ace/mode-matlab.js new file mode 100644 index 0000000..f34ced6 --- /dev/null +++ b/0.0.3_0/ace/mode-matlab.js @@ -0,0 +1,229 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2010, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/mode/matlab', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/matlab_highlight_rules', 'ace/range'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var MatlabHighlightRules = require("./matlab_highlight_rules").MatlabHighlightRules; +var Range = require("../range").Range; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new MatlabHighlightRules().getRules()); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "%"; + this.blockComment = {start: "%{", end: "%}"}; + +}).call(Mode.prototype); + +exports.Mode = Mode; + +}); + +ace.define('ace/mode/matlab_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var MatlabHighlightRules = function() { + +var keywords = ( + "break|case|catch|classdef|continue|else|elseif|end|for|function|global|if|otherwise|parfor|persistent|return|spmd|switch|try|while" + ); + + var builtinConstants = ( + "true|false|inf|Inf|nan|NaN|eps|pi|ans|nargin|nargout|varargin|varargout" + ); + + var builtinFunctions = ( + "abs|accumarray|acos(?:d|h)?|acot(?:d|h)?|acsc(?:d|h)?|actxcontrol(?:list|select)?|actxGetRunningServer|actxserver|addlistener|addpath|addpref|addtodate|"+ + "airy|align|alim|all|allchild|alpha|alphamap|amd|ancestor|and|angle|annotation|any|area|arrayfun|asec(?:d|h)?|asin(?:d|h)?|assert|assignin|atan(?:2|d|h)?|" + + "audiodevinfo|audioplayer|audiorecorder|aufinfo|auread|autumn|auwrite|avifile|aviinfo|aviread|axes|axis|balance|bar(?:3|3h|h)?|base2dec|beep|BeginInvoke|bench|"+ + "bessel(?:h|i|j|k|y)|beta|betainc|betaincinv|betaln|bicg|bicgstab|bicgstabl|bin2dec|bitand|bitcmp|bitget|bitmax|bitnot|bitor|bitset|bitshift|bitxor|blanks|blkdiag|"+ + "bone|box|brighten|brush|bsxfun|builddocsearchdb|builtin|bvp4c|bvp5c|bvpget|bvpinit|bvpset|bvpxtend|calendar|calllib|callSoapService|camdolly|cameratoolbar|camlight|"+ + "camlookat|camorbit|campan|campos|camproj|camroll|camtarget|camup|camva|camzoom|cart2pol|cart2sph|cast|cat|caxis|cd|cdf2rdf|cdfepoch|cdfinfo|cdflib(?:\.(?:close|closeVar|"+ + "computeEpoch|computeEpoch16|create|createAttr|createVar|delete|deleteAttr|deleteAttrEntry|deleteAttrgEntry|deleteVar|deleteVarRecords|epoch16Breakdown|epochBreakdown|getAttrEntry|"+ + "getAttrgEntry|getAttrMaxEntry|getAttrMaxgEntry|getAttrName|getAttrNum|getAttrScope|getCacheSize|getChecksum|getCompression|getCompressionCacheSize|getConstantNames|"+ + "getConstantValue|getCopyright|getFileBackward|getFormat|getLibraryCopyright|getLibraryVersion|getMajority|getName|getNumAttrEntries|getNumAttrgEntries|getNumAttributes|"+ + "getNumgAttributes|getReadOnlyMode|getStageCacheSize|getValidate|getVarAllocRecords|getVarBlockingFactor|getVarCacheSize|getVarCompression|getVarData|getVarMaxAllocRecNum|"+ + "getVarMaxWrittenRecNum|getVarName|getVarNum|getVarNumRecsWritten|getVarPadValue|getVarRecordData|getVarReservePercent|getVarsMaxWrittenRecNum|getVarSparseRecords|getVersion|"+ + "hyperGetVarData|hyperPutVarData|inquire|inquireAttr|inquireAttrEntry|inquireAttrgEntry|inquireVar|open|putAttrEntry|putAttrgEntry|putVarData|putVarRecordData|renameAttr|"+ + "renameVar|setCacheSize|setChecksum|setCompression|setCompressionCacheSize|setFileBackward|setFormat|setMajority|setReadOnlyMode|setStageCacheSize|setValidate|"+ + "setVarAllocBlockRecords|setVarBlockingFactor|setVarCacheSize|setVarCompression|setVarInitialRecs|setVarPadValue|SetVarReservePercent|setVarsCacheSize|setVarSparseRecords))?|"+ + "cdfread|cdfwrite|ceil|cell2mat|cell2struct|celldisp|cellfun|cellplot|cellstr|cgs|checkcode|checkin|checkout|chol|cholinc|cholupdate|circshift|cla|clabel|class|clc|clear|"+ + "clearvars|clf|clipboard|clock|close|closereq|cmopts|cmpermute|cmunique|colamd|colon|colorbar|colordef|colormap|colormapeditor|colperm|Combine|comet|comet3|commandhistory|"+ + "commandwindow|compan|compass|complex|computer|cond|condeig|condest|coneplot|conj|containers\.Map|contour(?:3|c|f|slice)?|contrast|conv|conv2|convhull|convhulln|convn|cool|"+ + "copper|copyfile|copyobj|corrcoef|cos(?:d|h)?|cot(?:d|h)?|cov|cplxpair|cputime|createClassFromWsdl|createSoapMessage|cross|csc(?:d|h)?|csvread|csvwrite|ctranspose|cumprod|"+ + "cumsum|cumtrapz|curl|customverctrl|cylinder|daqread|daspect|datacursormode|datatipinfo|date|datenum|datestr|datetick|datevec|dbclear|dbcont|dbdown|dblquad|dbmex|dbquit|"+ + "dbstack|dbstatus|dbstep|dbstop|dbtype|dbup|dde23|ddeget|ddesd|ddeset|deal|deblank|dec2base|dec2bin|dec2hex|decic|deconv|del2|delaunay|delaunay3|delaunayn|DelaunayTri|delete|"+ + "demo|depdir|depfun|det|detrend|deval|diag|dialog|diary|diff|diffuse|dir|disp|display|dither|divergence|dlmread|dlmwrite|dmperm|doc|docsearch|dos|dot|dragrect|drawnow|dsearch|"+ + "dsearchn|dynamicprops|echo|echodemo|edit|eig|eigs|ellipj|ellipke|ellipsoid|empty|enableNETfromNetworkDrive|enableservice|EndInvoke|enumeration|eomday|eq|erf|erfc|erfcinv|"+ + "erfcx|erfinv|error|errorbar|errordlg|etime|etree|etreeplot|eval|evalc|evalin|event\.(?:EventData|listener|PropertyEvent|proplistener)|exifread|exist|exit|exp|expint|expm|"+ + "expm1|export2wsdlg|eye|ezcontour|ezcontourf|ezmesh|ezmeshc|ezplot|ezplot3|ezpolar|ezsurf|ezsurfc|factor|factorial|fclose|feather|feature|feof|ferror|feval|fft|fft2|fftn|"+ + "fftshift|fftw|fgetl|fgets|fieldnames|figure|figurepalette|fileattrib|filebrowser|filemarker|fileparts|fileread|filesep|fill|fill3|filter|filter2|find|findall|findfigs|"+ + "findobj|findstr|finish|fitsdisp|fitsinfo|fitsread|fitswrite|fix|flag|flipdim|fliplr|flipud|floor|flow|fminbnd|fminsearch|fopen|format|fplot|fprintf|frame2im|fread|freqspace|"+ + "frewind|fscanf|fseek|ftell|FTP|full|fullfile|func2str|functions|funm|fwrite|fzero|gallery|gamma|gammainc|gammaincinv|gammaln|gca|gcbf|gcbo|gcd|gcf|gco|ge|genpath|genvarname|"+ + "get|getappdata|getenv|getfield|getframe|getpixelposition|getpref|ginput|gmres|gplot|grabcode|gradient|gray|graymon|grid|griddata(?:3|n)?|griddedInterpolant|gsvd|gt|gtext|"+ + "guidata|guide|guihandles|gunzip|gzip|h5create|h5disp|h5info|h5read|h5readatt|h5write|h5writeatt|hadamard|handle|hankel|hdf|hdf5|hdf5info|hdf5read|hdf5write|hdfinfo|"+ + "hdfread|hdftool|help|helpbrowser|helpdesk|helpdlg|helpwin|hess|hex2dec|hex2num|hgexport|hggroup|hgload|hgsave|hgsetget|hgtransform|hidden|hilb|hist|histc|hold|home|horzcat|"+ + "hostid|hot|hsv|hsv2rgb|hypot|ichol|idivide|ifft|ifft2|ifftn|ifftshift|ilu|im2frame|im2java|imag|image|imagesc|imapprox|imfinfo|imformats|import|importdata|imread|imwrite|"+ + "ind2rgb|ind2sub|inferiorto|info|inline|inmem|inpolygon|input|inputdlg|inputname|inputParser|inspect|instrcallback|instrfind|instrfindall|int2str|integral(?:2|3)?|interp(?:1|"+ + "1q|2|3|ft|n)|interpstreamspeed|intersect|intmax|intmin|inv|invhilb|ipermute|isa|isappdata|iscell|iscellstr|ischar|iscolumn|isdir|isempty|isequal|isequaln|isequalwithequalnans|"+ + "isfield|isfinite|isfloat|isglobal|ishandle|ishghandle|ishold|isinf|isinteger|isjava|iskeyword|isletter|islogical|ismac|ismatrix|ismember|ismethod|isnan|isnumeric|isobject|"+ + "isocaps|isocolors|isonormals|isosurface|ispc|ispref|isprime|isprop|isreal|isrow|isscalar|issorted|isspace|issparse|isstr|isstrprop|isstruct|isstudent|isunix|isvarname|"+ + "isvector|javaaddpath|javaArray|javachk|javaclasspath|javacomponent|javaMethod|javaMethodEDT|javaObject|javaObjectEDT|javarmpath|jet|keyboard|kron|lasterr|lasterror|"+ + "lastwarn|lcm|ldivide|ldl|le|legend|legendre|length|libfunctions|libfunctionsview|libisloaded|libpointer|libstruct|license|light|lightangle|lighting|lin2mu|line|lines|"+ + "linkaxes|linkdata|linkprop|linsolve|linspace|listdlg|listfonts|load|loadlibrary|loadobj|log|log10|log1p|log2|loglog|logm|logspace|lookfor|lower|ls|lscov|lsqnonneg|lsqr|"+ + "lt|lu|luinc|magic|makehgtform|mat2cell|mat2str|material|matfile|matlab\.io\.MatFile|matlab\.mixin\.(?:Copyable|Heterogeneous(?:\.getDefaultScalarElement)?)|matlabrc|"+ + "matlabroot|max|maxNumCompThreads|mean|median|membrane|memmapfile|memory|menu|mesh|meshc|meshgrid|meshz|meta\.(?:class(?:\.fromName)?|DynamicProperty|EnumeratedValue|event|"+ + "MetaData|method|package(?:\.(?:fromName|getAllPackages))?|property)|metaclass|methods|methodsview|mex(?:\.getCompilerConfigurations)?|MException|mexext|mfilename|min|minres|"+ + "minus|mislocked|mkdir|mkpp|mldivide|mlint|mlintrpt|mlock|mmfileinfo|mmreader|mod|mode|more|move|movefile|movegui|movie|movie2avi|mpower|mrdivide|msgbox|mtimes|mu2lin|"+ + "multibandread|multibandwrite|munlock|namelengthmax|nargchk|narginchk|nargoutchk|native2unicode|nccreate|ncdisp|nchoosek|ncinfo|ncread|ncreadatt|ncwrite|ncwriteatt|"+ + "ncwriteschema|ndgrid|ndims|ne|NET(?:\.(?:addAssembly|Assembly|convertArray|createArray|createGeneric|disableAutoRelease|enableAutoRelease|GenericClass|invokeGenericMethod|"+ + "NetException|setStaticProperty))?|netcdf\.(?:abort|close|copyAtt|create|defDim|defGrp|defVar|defVarChunking|defVarDeflate|defVarFill|defVarFletcher32|delAtt|endDef|getAtt|"+ + "getChunkCache|getConstant|getConstantNames|getVar|inq|inqAtt|inqAttID|inqAttName|inqDim|inqDimID|inqDimIDs|inqFormat|inqGrpName|inqGrpNameFull|inqGrpParent|inqGrps|"+ + "inqLibVers|inqNcid|inqUnlimDims|inqVar|inqVarChunking|inqVarDeflate|inqVarFill|inqVarFletcher32|inqVarID|inqVarIDs|open|putAtt|putVar|reDef|renameAtt|renameDim|renameVar|"+ + "setChunkCache|setDefaultFormat|setFill|sync)|newplot|nextpow2|nnz|noanimate|nonzeros|norm|normest|not|notebook|now|nthroot|null|num2cell|num2hex|num2str|numel|nzmax|"+ + "ode(?:113|15i|15s|23|23s|23t|23tb|45)|odeget|odeset|odextend|onCleanup|ones|open|openfig|opengl|openvar|optimget|optimset|or|ordeig|orderfields|ordqz|ordschur|orient|"+ + "orth|pack|padecoef|pagesetupdlg|pan|pareto|parseSoapResponse|pascal|patch|path|path2rc|pathsep|pathtool|pause|pbaspect|pcg|pchip|pcode|pcolor|pdepe|pdeval|peaks|perl|perms|"+ + "permute|pie|pink|pinv|planerot|playshow|plot|plot3|plotbrowser|plotedit|plotmatrix|plottools|plotyy|plus|pol2cart|polar|poly|polyarea|polyder|polyeig|polyfit|polyint|polyval|"+ + "polyvalm|pow2|power|ppval|prefdir|preferences|primes|print|printdlg|printopt|printpreview|prod|profile|profsave|propedit|propertyeditor|psi|publish|PutCharArray|PutFullMatrix|"+ + "PutWorkspaceData|pwd|qhull|qmr|qr|qrdelete|qrinsert|qrupdate|quad|quad2d|quadgk|quadl|quadv|questdlg|quit|quiver|quiver3|qz|rand|randi|randn|randperm|RandStream(?:\.(?:create|"+ + "getDefaultStream|getGlobalStream|list|setDefaultStream|setGlobalStream))?|rank|rat|rats|rbbox|rcond|rdivide|readasync|real|reallog|realmax|realmin|realpow|realsqrt|record|"+ + "rectangle|rectint|recycle|reducepatch|reducevolume|refresh|refreshdata|regexp|regexpi|regexprep|regexptranslate|rehash|rem|Remove|RemoveAll|repmat|reset|reshape|residue|"+ + "restoredefaultpath|rethrow|rgb2hsv|rgb2ind|rgbplot|ribbon|rmappdata|rmdir|rmfield|rmpath|rmpref|rng|roots|rose|rosser|rot90|rotate|rotate3d|round|rref|rsf2csf|run|save|saveas|"+ + "saveobj|savepath|scatter|scatter3|schur|sec|secd|sech|selectmoveresize|semilogx|semilogy|sendmail|serial|set|setappdata|setdiff|setenv|setfield|setpixelposition|setpref|setstr|"+ + "setxor|shading|shg|shiftdim|showplottool|shrinkfaces|sign|sin(?:d|h)?|size|slice|smooth3|snapnow|sort|sortrows|sound|soundsc|spalloc|spaugment|spconvert|spdiags|specular|speye|"+ + "spfun|sph2cart|sphere|spinmap|spline|spones|spparms|sprand|sprandn|sprandsym|sprank|spring|sprintf|spy|sqrt|sqrtm|squeeze|ss2tf|sscanf|stairs|startup|std|stem|stem3|stopasync|"+ + "str2double|str2func|str2mat|str2num|strcat|strcmp|strcmpi|stream2|stream3|streamline|streamparticles|streamribbon|streamslice|streamtube|strfind|strjust|strmatch|strncmp|"+ + "strncmpi|strread|strrep|strtok|strtrim|struct2cell|structfun|strvcat|sub2ind|subplot|subsasgn|subsindex|subspace|subsref|substruct|subvolume|sum|summer|superclasses|superiorto|"+ + "support|surf|surf2patch|surface|surfc|surfl|surfnorm|svd|svds|swapbytes|symamd|symbfact|symmlq|symrcm|symvar|system|tan(?:d|h)?|tar|tempdir|tempname|tetramesh|texlabel|text|"+ + "textread|textscan|textwrap|tfqmr|throw|tic|Tiff(?:\.(?:getTagNames|getVersion))?|timer|timerfind|timerfindall|times|timeseries|title|toc|todatenum|toeplitz|toolboxdir|trace|"+ + "transpose|trapz|treelayout|treeplot|tril|trimesh|triplequad|triplot|TriRep|TriScatteredInterp|trisurf|triu|tscollection|tsearch|tsearchn|tstool|type|typecast|uibuttongroup|"+ + "uicontextmenu|uicontrol|uigetdir|uigetfile|uigetpref|uiimport|uimenu|uiopen|uipanel|uipushtool|uiputfile|uiresume|uisave|uisetcolor|uisetfont|uisetpref|uistack|uitable|"+ + "uitoggletool|uitoolbar|uiwait|uminus|undocheckout|unicode2native|union|unique|unix|unloadlibrary|unmesh|unmkpp|untar|unwrap|unzip|uplus|upper|urlread|urlwrite|usejava|"+ + "userpath|validateattributes|validatestring|vander|var|vectorize|ver|verctrl|verLessThan|version|vertcat|VideoReader(?:\.isPlatformSupported)?|VideoWriter(?:\.getProfiles)?|"+ + "view|viewmtx|visdiff|volumebounds|voronoi|voronoin|wait|waitbar|waitfor|waitforbuttonpress|warndlg|warning|waterfall|wavfinfo|wavplay|wavread|wavrecord|wavwrite|web|weekday|"+ + "what|whatsnew|which|whitebg|who|whos|wilkinson|winopen|winqueryreg|winter|wk1finfo|wk1read|wk1write|workspace|xlabel|xlim|xlsfinfo|xlsread|xlswrite|xmlread|xmlwrite|xor|xslt|"+ + "ylabel|ylim|zeros|zip|zlabel|zlim|zoom|addedvarplot|andrewsplot|anova(?:1|2|n)|ansaribradley|aoctool|barttest|bbdesign|beta(?:cdf|fit|inv|like|pdf|rnd|stat)|bino(?:cdf|fit|inv|"+ + "pdf|rnd|stat)|biplot|bootci|bootstrp|boxplot|candexch|candgen|canoncorr|capability|capaplot|caseread|casewrite|categorical|ccdesign|cdfplot|chi2(?:cdf|gof|inv|pdf|rnd|stat)|"+ + "cholcov|Classification(?:BaggedEnsemble|Discriminant(?:\.(?:fit|make|template))?|Ensemble|KNN(?:\.(?:fit|template))?|PartitionedEnsemble|PartitionedModel|Tree(?:\.(?:fit|"+ + "template))?)|classify|classregtree|cluster|clusterdata|cmdscale|combnk|Compact(?:Classification(?:Discriminant|Ensemble|Tree)|Regression(?:Ensemble|Tree)|TreeBagger)|confusionmat|"+ + "controlchart|controlrules|cophenet|copula(?:cdf|fit|param|pdf|rnd|stat)|cordexch|corr|corrcov|coxphfit|createns|crosstab|crossval|cvpartition|datasample|dataset|daugment|dcovary|"+ + "dendrogram|dfittool|disttool|dummyvar|dwtest|ecdf|ecdfhist|ev(?:cdf|fit|inv|like|pdf|rnd|stat)|ExhaustiveSearcher|exp(?:cdf|fit|inv|like|pdf|rnd|stat)|factoran|fcdf|ff2n|finv|"+ + "fitdist|fitensemble|fpdf|fracfact|fracfactgen|friedman|frnd|fstat|fsurfht|fullfact|gagerr|gam(?:cdf|fit|inv|like|pdf|rnd|stat)|GeneralizedLinearModel(?:\.fit)?|geo(?:cdf|inv|mean|"+ + "pdf|rnd|stat)|gev(?:cdf|fit|inv|like|pdf|rnd|stat)|gline|glmfit|glmval|glyphplot|gmdistribution(?:\.fit)?|gname|gp(?:cdf|fit|inv|like|pdf|rnd|stat)|gplotmatrix|grp2idx|grpstats|"+ + "gscatter|haltonset|harmmean|hist3|histfit|hmm(?:decode|estimate|generate|train|viterbi)|hougen|hyge(?:cdf|inv|pdf|rnd|stat)|icdf|inconsistent|interactionplot|invpred|iqr|iwishrnd|"+ + "jackknife|jbtest|johnsrnd|KDTreeSearcher|kmeans|knnsearch|kruskalwallis|ksdensity|kstest|kstest2|kurtosis|lasso|lassoglm|lassoPlot|leverage|lhsdesign|lhsnorm|lillietest|"+ + "LinearModel(?:\.fit)?|linhyptest|linkage|logn(?:cdf|fit|inv|like|pdf|rnd|stat)|lsline|mad|mahal|maineffectsplot|manova1|manovacluster|mdscale|mhsample|mle|mlecov|mnpdf|"+ + "mnrfit|mnrnd|mnrval|moment|multcompare|multivarichart|mvn(?:cdf|pdf|rnd)|mvregress|mvregresslike|mvt(?:cdf|pdf|rnd)|NaiveBayes(?:\.fit)?|nan(?:cov|max|mean|median|min|std|"+ + "sum|var)|nbin(?:cdf|fit|inv|pdf|rnd|stat)|ncf(?:cdf|inv|pdf|rnd|stat)|nct(?:cdf|inv|pdf|rnd|stat)|ncx2(?:cdf|inv|pdf|rnd|stat)|NeighborSearcher|nlinfit|nlintool|nlmefit|nlmefitsa|"+ + "nlparci|nlpredci|nnmf|nominal|NonLinearModel(?:\.fit)?|norm(?:cdf|fit|inv|like|pdf|rnd|stat)|normplot|normspec|ordinal|outlierMeasure|parallelcoords|paretotails|partialcorr|"+ + "pcacov|pcares|pdf|pdist|pdist2|pearsrnd|perfcurve|perms|piecewisedistribution|plsregress|poiss(?:cdf|fit|inv|pdf|rnd|tat)|polyconf|polytool|prctile|princomp|ProbDist(?:Kernel|"+ + "Parametric|UnivKernel|UnivParam)?|probplot|procrustes|qqplot|qrandset|qrandstream|quantile|randg|random|randsample|randtool|range|rangesearch|ranksum|rayl(?:cdf|fit|inv|pdf|"+ + "rnd|stat)|rcoplot|refcurve|refline|regress|Regression(?:BaggedEnsemble|Ensemble|PartitionedEnsemble|PartitionedModel|Tree(?:\.(?:fit|template))?)|regstats|relieff|ridge|"+ + "robustdemo|robustfit|rotatefactors|rowexch|rsmdemo|rstool|runstest|sampsizepwr|scatterhist|sequentialfs|signrank|signtest|silhouette|skewness|slicesample|sobolset|squareform|"+ + "statget|statset|stepwise|stepwisefit|surfht|tabulate|tblread|tblwrite|tcdf|tdfread|tiedrank|tinv|tpdf|TreeBagger|treedisp|treefit|treeprune|treetest|treeval|trimmean|trnd|tstat|"+ + "ttest|ttest2|unid(?:cdf|inv|pdf|rnd|stat)|unif(?:cdf|inv|it|pdf|rnd|stat)|vartest(?:2|n)?|wbl(?:cdf|fit|inv|like|pdf|rnd|stat)|wblplot|wishrnd|x2fx|xptread|zscore|ztest"+ + "adapthisteq|analyze75info|analyze75read|applycform|applylut|axes2pix|bestblk|blockproc|bwarea|bwareaopen|bwboundaries|bwconncomp|bwconvhull|bwdist|bwdistgeodesic|bweuler|"+ + "bwhitmiss|bwlabel|bwlabeln|bwmorph|bwpack|bwperim|bwselect|bwtraceboundary|bwulterode|bwunpack|checkerboard|col2im|colfilt|conndef|convmtx2|corner|cornermetric|corr2|cp2tform|"+ + "cpcorr|cpselect|cpstruct2pairs|dct2|dctmtx|deconvblind|deconvlucy|deconvreg|deconvwnr|decorrstretch|demosaic|dicom(?:anon|dict|info|lookup|read|uid|write)|edge|edgetaper|entropy|"+ + "entropyfilt|fan2para|fanbeam|findbounds|fliptform|freqz2|fsamp2|fspecial|ftrans2|fwind1|fwind2|getheight|getimage|getimagemodel|getline|getneighbors|getnhood|getpts|"+ + "getrangefromclass|getrect|getsequence|gray2ind|graycomatrix|graycoprops|graydist|grayslice|graythresh|hdrread|hdrwrite|histeq|hough|houghlines|houghpeaks|iccfind|iccread|"+ + "iccroot|iccwrite|idct2|ifanbeam|im2bw|im2col|im2double|im2int16|im2java2d|im2single|im2uint16|im2uint8|imabsdiff|imadd|imadjust|ImageAdapter|imageinfo|imagemodel|imapplymatrix|"+ + "imattributes|imbothat|imclearborder|imclose|imcolormaptool|imcomplement|imcontour|imcontrast|imcrop|imdilate|imdisplayrange|imdistline|imdivide|imellipse|imerode|imextendedmax|"+ + "imextendedmin|imfill|imfilter|imfindcircles|imfreehand|imfuse|imgca|imgcf|imgetfile|imhandles|imhist|imhmax|imhmin|imimposemin|imlincomb|imline|immagbox|immovie|immultiply|imnoise|"+ + "imopen|imoverview|imoverviewpanel|impixel|impixelinfo|impixelinfoval|impixelregion|impixelregionpanel|implay|impoint|impoly|impositionrect|improfile|imputfile|impyramid|"+ + "imreconstruct|imrect|imregconfig|imregionalmax|imregionalmin|imregister|imresize|imroi|imrotate|imsave|imscrollpanel|imshow|imshowpair|imsubtract|imtool|imtophat|imtransform|"+ + "imview|ind2gray|ind2rgb|interfileinfo|interfileread|intlut|ippl|iptaddcallback|iptcheckconn|iptcheckhandle|iptcheckinput|iptcheckmap|iptchecknargin|iptcheckstrs|iptdemos|iptgetapi|"+ + "iptGetPointerBehavior|iptgetpref|ipticondir|iptnum2ordinal|iptPointerManager|iptprefs|iptremovecallback|iptSetPointerBehavior|iptsetpref|iptwindowalign|iradon|isbw|isflat|isgray|"+ + "isicc|isind|isnitf|isrgb|isrset|lab2double|lab2uint16|lab2uint8|label2rgb|labelmatrix|makecform|makeConstrainToRectFcn|makehdr|makelut|makeresampler|maketform|mat2gray|mean2|"+ + "medfilt2|montage|nitfinfo|nitfread|nlfilter|normxcorr2|ntsc2rgb|openrset|ordfilt2|otf2psf|padarray|para2fan|phantom|poly2mask|psf2otf|qtdecomp|qtgetblk|qtsetblk|radon|rangefilt|"+ + "reflect|regionprops|registration\.metric\.(?:MattesMutualInformation|MeanSquares)|registration\.optimizer\.(?:OnePlusOneEvolutionary|RegularStepGradientDescent)|rgb2gray|"+ + "rgb2ntsc|rgb2ycbcr|roicolor|roifill|roifilt2|roipoly|rsetwrite|std2|stdfilt|strel|stretchlim|subimage|tformarray|tformfwd|tforminv|tonemap|translate|truesize|uintlut|viscircles|"+ + "warp|watershed|whitepoint|wiener2|xyz2double|xyz2uint16|ycbcr2rgb|bintprog|color|fgoalattain|fminbnd|fmincon|fminimax|fminsearch|fminunc|fseminf|fsolve|fzero|fzmult|gangstr|ktrlink|"+ + "linprog|lsqcurvefit|lsqlin|lsqnonlin|lsqnonneg|optimget|optimset|optimtool|quadprog" + ); + var storageType = ( + "cell|struct|char|double|single|logical|u?int(?:8|16|32|64)|sparse" + ); + var keywordMapper = this.createKeywordMapper({ + "storage.type": storageType, + "support.function": builtinFunctions, + "keyword": keywords, + "constant.language": builtinConstants + }, "identifier", true); + + this.$rules = { + "start" : [ { + token : "comment", + regex : "^%[^\r\n]*" + }, { + token : "string", // " string + regex : '".*?"' + }, { + token : "string", // ' string + regex : "'.*?'" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "keyword.operator", + regex : "\\+|\\-|\\/|\\/\\/|%|<@>|@>|<@|&|\\^|~|<|>|<=|=>|==|!=|<>|=" + }, { + token : "punctuation.operator", + regex : "\\?|\\:|\\,|\\;|\\." + }, { + token : "paren.lparen", + regex : "[\\(]" + }, { + token : "paren.rparen", + regex : "[\\)]" + }, { + token : "text", + regex : "\\s+" + } ] + }; +}; + +oop.inherits(MatlabHighlightRules, TextHighlightRules); + +exports.MatlabHighlightRules = MatlabHighlightRules; +}); \ No newline at end of file diff --git a/0.0.3_0/ace/mode-mushcode.js b/0.0.3_0/ace/mode-mushcode.js new file mode 100644 index 0000000..0aa70c2 --- /dev/null +++ b/0.0.3_0/ace/mode-mushcode.js @@ -0,0 +1,704 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2010, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/mode/mushcode', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/mushcode_high_rules', 'ace/mode/folding/pythonic', 'ace/range'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var MushCodeRules = require("./mushcode_high_rules").MushCodeRules; +var PythonFoldMode = require("./folding/pythonic").FoldMode; +var Range = require("../range").Range; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new MushCodeRules().getRules()); + this.foldingRules = new PythonFoldMode("\\:"); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "#"; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.$tokenizer.getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start") { + var match = line.match(/^.*[\{\(\[\:]\s*$/); + if (match) { + indent += tab; + } + } + + return indent; + }; + + var outdents = { + "pass": 1, + "return": 1, + "raise": 1, + "break": 1, + "continue": 1 + }; + + this.checkOutdent = function(state, line, input) { + if (input !== "\r\n" && input !== "\r" && input !== "\n") + return false; + + var tokens = this.$tokenizer.getLineTokens(line.trim(), state).tokens; + + if (!tokens) + return false; + do { + var last = tokens.pop(); + } while (last && (last.type == "comment" || (last.type == "text" && last.value.match(/^\s+$/)))); + + if (!last) + return false; + + return (last.type == "keyword" && outdents[last.value]); + }; + + this.autoOutdent = function(state, doc, row) { + + row += 1; + var indent = this.$getIndent(doc.getLine(row)); + var tab = doc.getTabString(); + if (indent.slice(-tab.length) == tab) + doc.remove(new Range(row, indent.length-tab.length, row, indent.length)); + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/mushcode_high_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var MushCodeRules = function() { + + + var keywords = ( + "@if|"+ + "@ifelse|"+ + "@switch|"+ + "@halt|"+ + "@dolist|"+ + "@create|"+ + "@scent|"+ + "@sound|"+ + "@touch|"+ + "@ataste|"+ + "@osound|"+ + "@ahear|"+ + "@aahear|"+ + "@amhear|"+ + "@otouch|"+ + "@otaste|"+ + "@drop|"+ + "@odrop|"+ + "@adrop|"+ + "@dropfail|"+ + "@odropfail|"+ + "@smell|"+ + "@oemit|"+ + "@emit|"+ + "@pemit|"+ + "@parent|"+ + "@clone|"+ + "@taste|"+ + "whisper|"+ + "page|"+ + "say|"+ + "pose|"+ + "semipose|"+ + "teach|"+ + "touch|"+ + "taste|"+ + "smell|"+ + "listen|"+ + "look|"+ + "move|"+ + "go|"+ + "home|"+ + "follow|"+ + "unfollow|"+ + "desert|"+ + "dismiss|"+ + "@tel" + ); + + var builtinConstants = ( + "=#0" + ); + + var builtinFunctions = ( + "default|"+ + "edefault|"+ + "eval|"+ + "get_eval|"+ + "get|"+ + "grep|"+ + "grepi|"+ + "hasattr|"+ + "hasattrp|"+ + "hasattrval|"+ + "hasattrpval|"+ + "lattr|"+ + "nattr|"+ + "poss|"+ + "udefault|"+ + "ufun|"+ + "u|"+ + "v|"+ + "uldefault|"+ + "xget|"+ + "zfun|"+ + "band|"+ + "bnand|"+ + "bnot|"+ + "bor|"+ + "bxor|"+ + "shl|"+ + "shr|"+ + "and|"+ + "cand|"+ + "cor|"+ + "eq|"+ + "gt|"+ + "gte|"+ + "lt|"+ + "lte|"+ + "nand|"+ + "neq|"+ + "nor|"+ + "not|"+ + "or|"+ + "t|"+ + "xor|"+ + "con|"+ + "entrances|"+ + "exit|"+ + "followers|"+ + "home|"+ + "lcon|"+ + "lexits|"+ + "loc|"+ + "locate|"+ + "lparent|"+ + "lsearch|"+ + "next|"+ + "num|"+ + "owner|"+ + "parent|"+ + "pmatch|"+ + "rloc|"+ + "rnum|"+ + "room|"+ + "where|"+ + "zone|"+ + "worn|"+ + "held|"+ + "carried|"+ + "acos|"+ + "asin|"+ + "atan|"+ + "ceil|"+ + "cos|"+ + "e|"+ + "exp|"+ + "fdiv|"+ + "fmod|"+ + "floor|"+ + "log|"+ + "ln|"+ + "pi|"+ + "power|"+ + "round|"+ + "sin|"+ + "sqrt|"+ + "tan|"+ + "aposs|"+ + "andflags|"+ + "conn|"+ + "commandssent|"+ + "controls|"+ + "doing|"+ + "elock|"+ + "findable|"+ + "flags|"+ + "fullname|"+ + "hasflag|"+ + "haspower|"+ + "hastype|"+ + "hidden|"+ + "idle|"+ + "isbaker|"+ + "lock|"+ + "lstats|"+ + "money|"+ + "who|"+ + "name|"+ + "nearby|"+ + "obj|"+ + "objflags|"+ + "photo|"+ + "poll|"+ + "powers|"+ + "pendingtext|"+ + "receivedtext|"+ + "restarts|"+ + "restarttime|"+ + "subj|"+ + "shortestpath|"+ + "tmoney|"+ + "type|"+ + "visible|"+ + "cat|"+ + "element|"+ + "elements|"+ + "extract|"+ + "filter|"+ + "filterbool|"+ + "first|"+ + "foreach|"+ + "fold|"+ + "grab|"+ + "graball|"+ + "index|"+ + "insert|"+ + "itemize|"+ + "items|"+ + "iter|"+ + "last|"+ + "ldelete|"+ + "map|"+ + "match|"+ + "matchall|"+ + "member|"+ + "mix|"+ + "munge|"+ + "pick|"+ + "remove|"+ + "replace|"+ + "rest|"+ + "revwords|"+ + "setdiff|"+ + "setinter|"+ + "setunion|"+ + "shuffle|"+ + "sort|"+ + "sortby|"+ + "splice|"+ + "step|"+ + "wordpos|"+ + "words|"+ + "add|"+ + "lmath|"+ + "max|"+ + "mean|"+ + "median|"+ + "min|"+ + "mul|"+ + "percent|"+ + "sign|"+ + "stddev|"+ + "sub|"+ + "val|"+ + "bound|"+ + "abs|"+ + "inc|"+ + "dec|"+ + "dist2d|"+ + "dist3d|"+ + "div|"+ + "floordiv|"+ + "mod|"+ + "modulo|"+ + "remainder|"+ + "vadd|"+ + "vdim|"+ + "vdot|"+ + "vmag|"+ + "vmax|"+ + "vmin|"+ + "vmul|"+ + "vsub|"+ + "vunit|"+ + "regedit|"+ + "regeditall|"+ + "regeditalli|"+ + "regediti|"+ + "regmatch|"+ + "regmatchi|"+ + "regrab|"+ + "regraball|"+ + "regraballi|"+ + "regrabi|"+ + "regrep|"+ + "regrepi|"+ + "after|"+ + "alphamin|"+ + "alphamax|"+ + "art|"+ + "before|"+ + "brackets|"+ + "capstr|"+ + "case|"+ + "caseall|"+ + "center|"+ + "containsfansi|"+ + "comp|"+ + "decompose|"+ + "decrypt|"+ + "delete|"+ + "edit|"+ + "encrypt|"+ + "escape|"+ + "if|"+ + "ifelse|"+ + "lcstr|"+ + "left|"+ + "lit|"+ + "ljust|"+ + "merge|"+ + "mid|"+ + "ostrlen|"+ + "pos|"+ + "repeat|"+ + "reverse|"+ + "right|"+ + "rjust|"+ + "scramble|"+ + "secure|"+ + "space|"+ + "spellnum|"+ + "squish|"+ + "strcat|"+ + "strmatch|"+ + "strinsert|"+ + "stripansi|"+ + "stripfansi|"+ + "strlen|"+ + "switch|"+ + "switchall|"+ + "table|"+ + "tr|"+ + "trim|"+ + "ucstr|"+ + "unsafe|"+ + "wrap|"+ + "ctitle|"+ + "cwho|"+ + "channels|"+ + "clock|"+ + "cflags|"+ + "ilev|"+ + "itext|"+ + "inum|"+ + "convsecs|"+ + "convutcsecs|"+ + "convtime|"+ + "ctime|"+ + "etimefmt|"+ + "isdaylight|"+ + "mtime|"+ + "secs|"+ + "msecs|"+ + "starttime|"+ + "time|"+ + "timefmt|"+ + "timestring|"+ + "utctime|"+ + "atrlock|"+ + "clone|"+ + "create|"+ + "cook|"+ + "dig|"+ + "emit|"+ + "lemit|"+ + "link|"+ + "oemit|"+ + "open|"+ + "pemit|"+ + "remit|"+ + "set|"+ + "tel|"+ + "wipe|"+ + "zemit|"+ + "fbcreate|"+ + "fbdestroy|"+ + "fbwrite|"+ + "fbclear|"+ + "fbcopy|"+ + "fbcopyto|"+ + "fbclip|"+ + "fbdump|"+ + "fbflush|"+ + "fbhset|"+ + "fblist|"+ + "fbstats|"+ + "qentries|"+ + "qentry|"+ + "play|"+ + "ansi|"+ + "break|"+ + "c|"+ + "asc|"+ + "die|"+ + "isdbref|"+ + "isint|"+ + "isnum|"+ + "isletters|"+ + "linecoords|"+ + "localize|"+ + "lnum|"+ + "nameshort|"+ + "null|"+ + "objeval|"+ + "r|"+ + "rand|"+ + "s|"+ + "setq|"+ + "setr|"+ + "soundex|"+ + "soundslike|"+ + "valid|"+ + "vchart|"+ + "vchart2|"+ + "vlabel|"+ + "@@|"+ + "bakerdays|"+ + "bodybuild|"+ + "box|"+ + "capall|"+ + "catalog|"+ + "children|"+ + "ctrailer|"+ + "darttime|"+ + "debt|"+ + "detailbar|"+ + "exploredroom|"+ + "fansitoansi|"+ + "fansitoxansi|"+ + "fullbar|"+ + "halfbar|"+ + "isdarted|"+ + "isnewbie|"+ + "isword|"+ + "lambda|"+ + "lobjects|"+ + "lplayers|"+ + "lthings|"+ + "lvexits|"+ + "lvobjects|"+ + "lvplayers|"+ + "lvthings|"+ + "newswrap|"+ + "numsuffix|"+ + "playerson|"+ + "playersthisweek|"+ + "randomad|"+ + "randword|"+ + "realrandword|"+ + "replacechr|"+ + "second|"+ + "splitamount|"+ + "strlenall|"+ + "text|"+ + "third|"+ + "tofansi|"+ + "totalac|"+ + "unique|"+ + "getaddressroom|"+ + "listpropertycomm|"+ + "listpropertyres|"+ + "lotowner|"+ + "lotrating|"+ + "lotratingcount|"+ + "lotvalue|"+ + "boughtproduct|"+ + "companyabb|"+ + "companyicon|"+ + "companylist|"+ + "companyname|"+ + "companyowners|"+ + "companyvalue|"+ + "employees|"+ + "invested|"+ + "productlist|"+ + "productname|"+ + "productowners|"+ + "productrating|"+ + "productratingcount|"+ + "productsoldat|"+ + "producttype|"+ + "ratedproduct|"+ + "soldproduct|"+ + "topproducts|"+ + "totalspentonproduct|"+ + "totalstock|"+ + "transfermoney|"+ + "uniquebuyercount|"+ + "uniqueproductsbought|"+ + "validcompany|"+ + "deletepicture|"+ + "fbsave|"+ + "getpicturesecurity|"+ + "haspicture|"+ + "listpictures|"+ + "picturesize|"+ + "replacecolor|"+ + "rgbtocolor|"+ + "savepicture|"+ + "setpicturesecurity|"+ + "showpicture|"+ + "piechart|"+ + "piechartlabel|"+ + "createmaze|"+ + "drawmaze|"+ + "drawwireframe" + ); + var keywordMapper = this.createKeywordMapper({ + "invalid.deprecated": "debugger", + "support.function": builtinFunctions, + "constant.language": builtinConstants, + "keyword": keywords + }, "identifier"); + + var strPre = "(?:r|u|ur|R|U|UR|Ur|uR)?"; + + var decimalInteger = "(?:(?:[1-9]\\d*)|(?:0))"; + var octInteger = "(?:0[oO]?[0-7]+)"; + var hexInteger = "(?:0[xX][\\dA-Fa-f]+)"; + var binInteger = "(?:0[bB][01]+)"; + var integer = "(?:" + decimalInteger + "|" + octInteger + "|" + hexInteger + "|" + binInteger + ")"; + + var exponent = "(?:[eE][+-]?\\d+)"; + var fraction = "(?:\\.\\d+)"; + var intPart = "(?:\\d+)"; + var pointFloat = "(?:(?:" + intPart + "?" + fraction + ")|(?:" + intPart + "\\.))"; + var exponentFloat = "(?:(?:" + pointFloat + "|" + intPart + ")" + exponent + ")"; + var floatNumber = "(?:" + exponentFloat + "|" + pointFloat + ")"; + + this.$rules = { + "start" : [ + { + token : "variable", // mush substitution register + regex : "%[0-9]{1}" + }, + { + token : "variable", // mush substitution register + regex : "%q[0-9A-Za-z]{1}" + }, + { + token : "variable", // mush special character register + regex : "%[a-zA-Z]{1}" + }, + { + token: "variable.language", + regex: "%[a-z0-9-_]+" + }, + { + token : "constant.numeric", // imaginary + regex : "(?:" + floatNumber + "|\\d+)[jJ]\\b" + }, { + token : "constant.numeric", // float + regex : floatNumber + }, { + token : "constant.numeric", // long integer + regex : integer + "[lL]\\b" + }, { + token : "constant.numeric", // integer + regex : integer + "\\b" + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "keyword.operator", + regex : "\\+|\\-|\\*|\\*\\*|\\/|\\/\\/|#|%|<<|>>|\\||\\^|~|<|>|<=|=>|==|!=|<>|=" + }, { + token : "paren.lparen", + regex : "[\\[\\(\\{]" + }, { + token : "paren.rparen", + regex : "[\\]\\)\\}]" + }, { + token : "text", + regex : "\\s+" + } ], + }; +}; + +oop.inherits(MushCodeRules, TextHighlightRules); + +exports.MushCodeRules = MushCodeRules; +}); + +ace.define('ace/mode/folding/pythonic', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/folding/fold_mode'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(markers) { + this.foldingStartMarker = new RegExp("([\\[{])(?:\\s*)$|(" + markers + ")(?:\\s*)(?:#.*)?$"); +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var line = session.getLine(row); + var match = line.match(this.foldingStartMarker); + if (match) { + if (match[1]) + return this.openingBracketBlock(session, match[1], row, match.index); + if (match[2]) + return this.indentationBlock(session, row, match.index + match[2].length); + return this.indentationBlock(session, row); + } + } + +}).call(FoldMode.prototype); + +}); diff --git a/0.0.3_0/ace/mode-mushcode_high_rules.js b/0.0.3_0/ace/mode-mushcode_high_rules.js new file mode 100644 index 0000000..6ce36e2 --- /dev/null +++ b/0.0.3_0/ace/mode-mushcode_high_rules.js @@ -0,0 +1,569 @@ +/* + * MUSHCodeMode + */ + +ace.define('ace/mode/mushcode_high_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var MushCodeRules = function() { + + + var keywords = ( + "@if|"+ + "@ifelse|"+ + "@switch|"+ + "@halt|"+ + "@dolist|"+ + "@create|"+ + "@scent|"+ + "@sound|"+ + "@touch|"+ + "@ataste|"+ + "@osound|"+ + "@ahear|"+ + "@aahear|"+ + "@amhear|"+ + "@otouch|"+ + "@otaste|"+ + "@drop|"+ + "@odrop|"+ + "@adrop|"+ + "@dropfail|"+ + "@odropfail|"+ + "@smell|"+ + "@oemit|"+ + "@emit|"+ + "@pemit|"+ + "@parent|"+ + "@clone|"+ + "@taste|"+ + "whisper|"+ + "page|"+ + "say|"+ + "pose|"+ + "semipose|"+ + "teach|"+ + "touch|"+ + "taste|"+ + "smell|"+ + "listen|"+ + "look|"+ + "move|"+ + "go|"+ + "home|"+ + "follow|"+ + "unfollow|"+ + "desert|"+ + "dismiss|"+ + "@tel" + ); + + var builtinConstants = ( + "=#0" + ); + + var builtinFunctions = ( + "default|"+ + "edefault|"+ + "eval|"+ + "get_eval|"+ + "get|"+ + "grep|"+ + "grepi|"+ + "hasattr|"+ + "hasattrp|"+ + "hasattrval|"+ + "hasattrpval|"+ + "lattr|"+ + "nattr|"+ + "poss|"+ + "udefault|"+ + "ufun|"+ + "u|"+ + "v|"+ + "uldefault|"+ + "xget|"+ + "zfun|"+ + "band|"+ + "bnand|"+ + "bnot|"+ + "bor|"+ + "bxor|"+ + "shl|"+ + "shr|"+ + "and|"+ + "cand|"+ + "cor|"+ + "eq|"+ + "gt|"+ + "gte|"+ + "lt|"+ + "lte|"+ + "nand|"+ + "neq|"+ + "nor|"+ + "not|"+ + "or|"+ + "t|"+ + "xor|"+ + "con|"+ + "entrances|"+ + "exit|"+ + "followers|"+ + "home|"+ + "lcon|"+ + "lexits|"+ + "loc|"+ + "locate|"+ + "lparent|"+ + "lsearch|"+ + "next|"+ + "num|"+ + "owner|"+ + "parent|"+ + "pmatch|"+ + "rloc|"+ + "rnum|"+ + "room|"+ + "where|"+ + "zone|"+ + "worn|"+ + "held|"+ + "carried|"+ + "acos|"+ + "asin|"+ + "atan|"+ + "ceil|"+ + "cos|"+ + "e|"+ + "exp|"+ + "fdiv|"+ + "fmod|"+ + "floor|"+ + "log|"+ + "ln|"+ + "pi|"+ + "power|"+ + "round|"+ + "sin|"+ + "sqrt|"+ + "tan|"+ + "aposs|"+ + "andflags|"+ + "conn|"+ + "commandssent|"+ + "controls|"+ + "doing|"+ + "elock|"+ + "findable|"+ + "flags|"+ + "fullname|"+ + "hasflag|"+ + "haspower|"+ + "hastype|"+ + "hidden|"+ + "idle|"+ + "isbaker|"+ + "lock|"+ + "lstats|"+ + "money|"+ + "who|"+ + "name|"+ + "nearby|"+ + "obj|"+ + "objflags|"+ + "photo|"+ + "poll|"+ + "powers|"+ + "pendingtext|"+ + "receivedtext|"+ + "restarts|"+ + "restarttime|"+ + "subj|"+ + "shortestpath|"+ + "tmoney|"+ + "type|"+ + "visible|"+ + "cat|"+ + "element|"+ + "elements|"+ + "extract|"+ + "filter|"+ + "filterbool|"+ + "first|"+ + "foreach|"+ + "fold|"+ + "grab|"+ + "graball|"+ + "index|"+ + "insert|"+ + "itemize|"+ + "items|"+ + "iter|"+ + "last|"+ + "ldelete|"+ + "map|"+ + "match|"+ + "matchall|"+ + "member|"+ + "mix|"+ + "munge|"+ + "pick|"+ + "remove|"+ + "replace|"+ + "rest|"+ + "revwords|"+ + "setdiff|"+ + "setinter|"+ + "setunion|"+ + "shuffle|"+ + "sort|"+ + "sortby|"+ + "splice|"+ + "step|"+ + "wordpos|"+ + "words|"+ + "add|"+ + "lmath|"+ + "max|"+ + "mean|"+ + "median|"+ + "min|"+ + "mul|"+ + "percent|"+ + "sign|"+ + "stddev|"+ + "sub|"+ + "val|"+ + "bound|"+ + "abs|"+ + "inc|"+ + "dec|"+ + "dist2d|"+ + "dist3d|"+ + "div|"+ + "floordiv|"+ + "mod|"+ + "modulo|"+ + "remainder|"+ + "vadd|"+ + "vdim|"+ + "vdot|"+ + "vmag|"+ + "vmax|"+ + "vmin|"+ + "vmul|"+ + "vsub|"+ + "vunit|"+ + "regedit|"+ + "regeditall|"+ + "regeditalli|"+ + "regediti|"+ + "regmatch|"+ + "regmatchi|"+ + "regrab|"+ + "regraball|"+ + "regraballi|"+ + "regrabi|"+ + "regrep|"+ + "regrepi|"+ + "after|"+ + "alphamin|"+ + "alphamax|"+ + "art|"+ + "before|"+ + "brackets|"+ + "capstr|"+ + "case|"+ + "caseall|"+ + "center|"+ + "containsfansi|"+ + "comp|"+ + "decompose|"+ + "decrypt|"+ + "delete|"+ + "edit|"+ + "encrypt|"+ + "escape|"+ + "if|"+ + "ifelse|"+ + "lcstr|"+ + "left|"+ + "lit|"+ + "ljust|"+ + "merge|"+ + "mid|"+ + "ostrlen|"+ + "pos|"+ + "repeat|"+ + "reverse|"+ + "right|"+ + "rjust|"+ + "scramble|"+ + "secure|"+ + "space|"+ + "spellnum|"+ + "squish|"+ + "strcat|"+ + "strmatch|"+ + "strinsert|"+ + "stripansi|"+ + "stripfansi|"+ + "strlen|"+ + "switch|"+ + "switchall|"+ + "table|"+ + "tr|"+ + "trim|"+ + "ucstr|"+ + "unsafe|"+ + "wrap|"+ + "ctitle|"+ + "cwho|"+ + "channels|"+ + "clock|"+ + "cflags|"+ + "ilev|"+ + "itext|"+ + "inum|"+ + "convsecs|"+ + "convutcsecs|"+ + "convtime|"+ + "ctime|"+ + "etimefmt|"+ + "isdaylight|"+ + "mtime|"+ + "secs|"+ + "msecs|"+ + "starttime|"+ + "time|"+ + "timefmt|"+ + "timestring|"+ + "utctime|"+ + "atrlock|"+ + "clone|"+ + "create|"+ + "cook|"+ + "dig|"+ + "emit|"+ + "lemit|"+ + "link|"+ + "oemit|"+ + "open|"+ + "pemit|"+ + "remit|"+ + "set|"+ + "tel|"+ + "wipe|"+ + "zemit|"+ + "fbcreate|"+ + "fbdestroy|"+ + "fbwrite|"+ + "fbclear|"+ + "fbcopy|"+ + "fbcopyto|"+ + "fbclip|"+ + "fbdump|"+ + "fbflush|"+ + "fbhset|"+ + "fblist|"+ + "fbstats|"+ + "qentries|"+ + "qentry|"+ + "play|"+ + "ansi|"+ + "break|"+ + "c|"+ + "asc|"+ + "die|"+ + "isdbref|"+ + "isint|"+ + "isnum|"+ + "isletters|"+ + "linecoords|"+ + "localize|"+ + "lnum|"+ + "nameshort|"+ + "null|"+ + "objeval|"+ + "r|"+ + "rand|"+ + "s|"+ + "setq|"+ + "setr|"+ + "soundex|"+ + "soundslike|"+ + "valid|"+ + "vchart|"+ + "vchart2|"+ + "vlabel|"+ + "@@|"+ + "bakerdays|"+ + "bodybuild|"+ + "box|"+ + "capall|"+ + "catalog|"+ + "children|"+ + "ctrailer|"+ + "darttime|"+ + "debt|"+ + "detailbar|"+ + "exploredroom|"+ + "fansitoansi|"+ + "fansitoxansi|"+ + "fullbar|"+ + "halfbar|"+ + "isdarted|"+ + "isnewbie|"+ + "isword|"+ + "lambda|"+ + "lobjects|"+ + "lplayers|"+ + "lthings|"+ + "lvexits|"+ + "lvobjects|"+ + "lvplayers|"+ + "lvthings|"+ + "newswrap|"+ + "numsuffix|"+ + "playerson|"+ + "playersthisweek|"+ + "randomad|"+ + "randword|"+ + "realrandword|"+ + "replacechr|"+ + "second|"+ + "splitamount|"+ + "strlenall|"+ + "text|"+ + "third|"+ + "tofansi|"+ + "totalac|"+ + "unique|"+ + "getaddressroom|"+ + "listpropertycomm|"+ + "listpropertyres|"+ + "lotowner|"+ + "lotrating|"+ + "lotratingcount|"+ + "lotvalue|"+ + "boughtproduct|"+ + "companyabb|"+ + "companyicon|"+ + "companylist|"+ + "companyname|"+ + "companyowners|"+ + "companyvalue|"+ + "employees|"+ + "invested|"+ + "productlist|"+ + "productname|"+ + "productowners|"+ + "productrating|"+ + "productratingcount|"+ + "productsoldat|"+ + "producttype|"+ + "ratedproduct|"+ + "soldproduct|"+ + "topproducts|"+ + "totalspentonproduct|"+ + "totalstock|"+ + "transfermoney|"+ + "uniquebuyercount|"+ + "uniqueproductsbought|"+ + "validcompany|"+ + "deletepicture|"+ + "fbsave|"+ + "getpicturesecurity|"+ + "haspicture|"+ + "listpictures|"+ + "picturesize|"+ + "replacecolor|"+ + "rgbtocolor|"+ + "savepicture|"+ + "setpicturesecurity|"+ + "showpicture|"+ + "piechart|"+ + "piechartlabel|"+ + "createmaze|"+ + "drawmaze|"+ + "drawwireframe" + ); + var keywordMapper = this.createKeywordMapper({ + "invalid.deprecated": "debugger", + "support.function": builtinFunctions, + "constant.language": builtinConstants, + "keyword": keywords + }, "identifier"); + + var strPre = "(?:r|u|ur|R|U|UR|Ur|uR)?"; + + var decimalInteger = "(?:(?:[1-9]\\d*)|(?:0))"; + var octInteger = "(?:0[oO]?[0-7]+)"; + var hexInteger = "(?:0[xX][\\dA-Fa-f]+)"; + var binInteger = "(?:0[bB][01]+)"; + var integer = "(?:" + decimalInteger + "|" + octInteger + "|" + hexInteger + "|" + binInteger + ")"; + + var exponent = "(?:[eE][+-]?\\d+)"; + var fraction = "(?:\\.\\d+)"; + var intPart = "(?:\\d+)"; + var pointFloat = "(?:(?:" + intPart + "?" + fraction + ")|(?:" + intPart + "\\.))"; + var exponentFloat = "(?:(?:" + pointFloat + "|" + intPart + ")" + exponent + ")"; + var floatNumber = "(?:" + exponentFloat + "|" + pointFloat + ")"; + + this.$rules = { + "start" : [ + { + token : "variable", // mush substitution register + regex : "%[0-9]{1}" + }, + { + token : "variable", // mush substitution register + regex : "%q[0-9A-Za-z]{1}" + }, + { + token : "variable", // mush special character register + regex : "%[a-zA-Z]{1}" + }, + { + token: "variable.language", + regex: "%[a-z0-9-_]+" + }, + { + token : "constant.numeric", // imaginary + regex : "(?:" + floatNumber + "|\\d+)[jJ]\\b" + }, { + token : "constant.numeric", // float + regex : floatNumber + }, { + token : "constant.numeric", // long integer + regex : integer + "[lL]\\b" + }, { + token : "constant.numeric", // integer + regex : integer + "\\b" + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "keyword.operator", + regex : "\\+|\\-|\\*|\\*\\*|\\/|\\/\\/|#|%|<<|>>|\\||\\^|~|<|>|<=|=>|==|!=|<>|=" + }, { + token : "paren.lparen", + regex : "[\\[\\(\\{]" + }, { + token : "paren.rparen", + regex : "[\\]\\)\\}]" + }, { + token : "text", + regex : "\\s+" + } ], + }; +}; + +oop.inherits(MushCodeRules, TextHighlightRules); + +exports.MushCodeRules = MushCodeRules; +}); diff --git a/0.0.3_0/ace/mode-mysql.js b/0.0.3_0/ace/mode-mysql.js new file mode 100644 index 0000000..4e2be27 --- /dev/null +++ b/0.0.3_0/ace/mode-mysql.js @@ -0,0 +1,184 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2010, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/mode/mysql', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/mysql_highlight_rules', 'ace/range'], function(require, exports, module) { + +var oop = require("../lib/oop"); +var TextMode = require("../mode/text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var MysqlHighlightRules = require("./mysql_highlight_rules").MysqlHighlightRules; +var Range = require("../range").Range; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new MysqlHighlightRules().getRules()); +}; +oop.inherits(Mode, TextMode); + +(function() { + this.lineCommentStart = ["--", "#"]; // todo space + this.blockComment = {start: "/*", end: "*/"}; + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/mysql_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/doc_comment_highlight_rules', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var MysqlHighlightRules = function() { + + var mySqlKeywords = /*sql*/ "alter|and|as|asc|between|count|create|delete|desc|distinct|drop|from|having|in|insert|into|is|join|like|not|on|or|order|select|set|table|union|update|values|where" + "|accessible|action|add|after|algorithm|all|analyze|asensitive|at|authors|auto_increment|autocommit|avg|avg_row_length|before|binary|binlog|both|btree|cache|call|cascade|cascaded|case|catalog_name|chain|change|changed|character|check|checkpoint|checksum|class_origin|client_statistics|close|coalesce|code|collate|collation|collations|column|columns|comment|commit|committed|completion|concurrent|condition|connection|consistent|constraint|contains|continue|contributors|convert|cross|current_date|current_time|current_timestamp|current_user|cursor|data|database|databases|day_hour|day_microsecond|day_minute|day_second|deallocate|dec|declare|default|delay_key_write|delayed|delimiter|des_key_file|describe|deterministic|dev_pop|dev_samp|deviance|directory|disable|discard|distinctrow|div|dual|dumpfile|each|elseif|enable|enclosed|end|ends|engine|engines|enum|errors|escape|escaped|even|event|events|every|execute|exists|exit|explain|extended|fast|fetch|field|fields|first|flush|for|force|foreign|found_rows|full|fulltext|function|general|global|grant|grants|group|groupby_concat|handler|hash|help|high_priority|hosts|hour_microsecond|hour_minute|hour_second|if|ignore|ignore_server_ids|import|index|index_statistics|infile|inner|innodb|inout|insensitive|insert_method|install|interval|invoker|isolation|iterate|key|keys|kill|language|last|leading|leave|left|level|limit|linear|lines|list|load|local|localtime|localtimestamp|lock|logs|low_priority|master|master_heartbeat_period|master_ssl_verify_server_cert|masters|match|max|max_rows|maxvalue|message_text|middleint|migrate|min|min_rows|minute_microsecond|minute_second|mod|mode|modifies|modify|mutex|mysql_errno|natural|next|no|no_write_to_binlog|offline|offset|one|online|open|optimize|option|optionally|out|outer|outfile|pack_keys|parser|partition|partitions|password|phase|plugin|plugins|prepare|preserve|prev|primary|privileges|procedure|processlist|profile|profiles|purge|query|quick|range|read|read_write|reads|real|rebuild|recover|references|regexp|relaylog|release|remove|rename|reorganize|repair|repeatable|replace|require|resignal|restrict|resume|return|returns|revoke|right|rlike|rollback|rollup|row|row_format|rtree|savepoint|schedule|schema|schema_name|schemas|second_microsecond|security|sensitive|separator|serializable|server|session|share|show|signal|slave|slow|smallint|snapshot|soname|spatial|specific|sql|sql_big_result|sql_buffer_result|sql_cache|sql_calc_found_rows|sql_no_cache|sql_small_result|sqlexception|sqlstate|sqlwarning|ssl|start|starting|starts|status|std|stddev|stddev_pop|stddev_samp|storage|straight_join|subclass_origin|sum|suspend|table_name|table_statistics|tables|tablespace|temporary|terminated|to|trailing|transaction|trigger|triggers|truncate|uncommitted|undo|uninstall|unique|unlock|upgrade|usage|use|use_frm|user|user_resources|user_statistics|using|utc_date|utc_time|utc_timestamp|value|variables|varying|view|views|warnings|when|while|with|work|write|xa|xor|year_month|zerofill|begin|do|then|else|loop|repeat"; + var builtins = "by|bool|boolean|bit|blob|decimal|double|enum|float|long|longblob|longtext|medium|mediumblob|mediumint|mediumtext|time|timestamp|tinyblob|tinyint|tinytext|text|bigint|int|int1|int2|int3|int4|int8|integer|float|float4|float8|double|char|varbinary|varchar|varcharacter|precision|date|datetime|year|unsigned|signed|numeric" + var variable = "charset|clear|connect|edit|ego|exit|go|help|nopager|notee|nowarning|pager|print|prompt|quit|rehash|source|status|system|tee" + + var keywordMapper = this.createKeywordMapper({ + "support.function": builtins, + "keyword": mySqlKeywords, + "constant": "false|true|null|unknown|date|time|timestamp|ODBCdotTable|zerolessFloat", + "variable.language": variable + }, "identifier", true); + + + function string(rule) { + var start = rule.start; + var escapeSeq = rule.escape; + return { + token: "string.start", + regex: start, + next: [ + {token: "constant.language.escape", regex: escapeSeq}, + {token: "string.end", next: "start", regex: start}, + {defaultToken: "string"} + ] + }; + } + + this.$rules = { + "start" : [ { + token : "comment", regex : "(?:-- |#).*$" + }, + string({start: '"', escape: /\\[0'"bnrtZ\\%_]?/}), + string({start: "'", escape: /\\[0'"bnrtZ\\%_]?/}), + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : /\/\*/, + next : "comment" + }, { + token : "constant.numeric", // hex + regex : /0[xX][0-9a-fA-F]+|[xX]'[0-9a-fA-F]+'|0[bB][01]+|[bB]'[01]+'/ + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "constant.class", + regex : "@@?[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "constant.buildin", + regex : "`[^`]*`" + }, { + token : "keyword.operator", + regex : "\\+|\\-|\\/|\\/\\/|%|<@>|@>|<@|&|\\^|~|<|>|<=|=>|==|!=|<>|=" + }, { + token : "paren.lparen", + regex : "[\\(]" + }, { + token : "paren.rparen", + regex : "[\\)]" + }, { + token : "text", + regex : "\\s+" + } ], + "comment" : [ + {token : "comment", regex : "\\*\\/", next : "start"}, + {defaultToken : "comment"} + ], + }; + + this.embedRules(DocCommentHighlightRules, "doc-", [ DocCommentHighlightRules.getEndRule("start") ]); + this.normalizeRules(); +}; + +oop.inherits(MysqlHighlightRules, TextHighlightRules); + +exports.MysqlHighlightRules = MysqlHighlightRules; +}); + +ace.define('ace/mode/doc_comment_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, { + token : "comment.doc.tag", + regex : "\\bTODO\\b" + }, { + defaultToken : "comment.doc" + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); diff --git a/0.0.3_0/ace/mode-objectivec.js b/0.0.3_0/ace/mode-objectivec.js new file mode 100644 index 0000000..5db116d --- /dev/null +++ b/0.0.3_0/ace/mode-objectivec.js @@ -0,0 +1,659 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2012, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * + * Contributor(s): + * + * + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/mode/objectivec', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/objectivec_highlight_rules', 'ace/mode/folding/cstyle'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var ObjectiveCHighlightRules = require("./objectivec_highlight_rules").ObjectiveCHighlightRules; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + var highlighter = new ObjectiveCHighlightRules(); + this.foldingRules = new CStyleFoldMode(); + + this.$tokenizer = new Tokenizer(highlighter.getRules()); +}; +oop.inherits(Mode, TextMode); + +(function() { + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; +}).call(Mode.prototype); + +exports.Mode = Mode; +});ace.define('ace/mode/objectivec_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/doc_comment_highlight_rules', 'ace/mode/c_cpp_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var C_Highlight_File = require("./c_cpp_highlight_rules"); +var CHighlightRules = C_Highlight_File.c_cppHighlightRules; + +var ObjectiveCHighlightRules = function() { + + var escapedConstRe = "\\\\(?:[abefnrtv'\"?\\\\]|" + + "[0-3]\\d{1,2}|" + + "[4-7]\\d?|" + + "222|" + + "x[a-zA-Z0-9]+)"; + + var specialVariables = [{ + regex: "\\b_cmd\\b", + token: "variable.other.selector.objc" + }, { + regex: "\\b(?:self|super)\\b", + token: "variable.language.objc" + } + ]; + + var cObj = new CHighlightRules(); + var cRules = cObj.getRules(); + + this.$rules = { + "start": [ + { + token : "comment", + regex : "\\/\\/.*$" + }, + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment" + }, + { + token: [ "storage.type.objc", "punctuation.definition.storage.type.objc", + "entity.name.type.objc", "text", "entity.other.inherited-class.objc" + ], + regex: "(@)(interface|protocol)(?!.+;)(\\s+[A-Za-z_][A-Za-z0-9_]*)(\\s*:\\s*)([A-Za-z]+)" + }, + { + token: [ "storage.type.objc" ], + regex: "(@end)" + }, + { + token: [ "storage.type.objc", "entity.name.type.objc", + "entity.other.inherited-class.objc" + ], + regex: "(@implementation)(\\s+[A-Za-z_][A-Za-z0-9_]*)(\\s*?::\\s*(?:[A-Za-z][A-Za-z0-9]*))?" + }, + { + token: "string.begin.objc", + regex: '@"', + next: "constant_NSString" + }, + { + token: "storage.type.objc", + regex: "\\bid\\s*<", + next: "protocol_list" + }, + { + token: "keyword.control.macro.objc", + regex: "\\bNS_DURING|NS_HANDLER|NS_ENDHANDLER\\b" + }, + { + token: ["punctuation.definition.keyword.objc", "keyword.control.exception.objc"], + regex: "(@)(try|catch|finally|throw)\\b" + }, + { + token: ["punctuation.definition.keyword.objc", "keyword.other.objc"], + regex: "(@)(defs|encode)\\b" + }, + { + token: ["storage.type.id.objc", "text"], + regex: "(\\bid\\b)(\\s|\\n)?" + }, + { + token: "storage.type.objc", + regex: "\\bIBOutlet|IBAction|BOOL|SEL|id|unichar|IMP|Class\\b" + }, + { + token: [ "punctuation.definition.storage.type.objc", "storage.type.objc"], + regex: "(@)(class|protocol)\\b" + }, + { + token: [ "punctuation.definition.storage.type.objc", "punctuation"], + regex: "(@selector)(\\s*\\()", + next: "selectors" + }, + { + token: [ "punctuation.definition.storage.modifier.objc", "storage.modifier.objc"], + regex: "(@)(synchronized|public|private|protected|package)\\b" + }, + { + token: "constant.language.objc", + regex: "\\bYES|NO|Nil|nil\\b" + }, + { + token: "support.variable.foundation", + regex: "\\bNSApp\\b" + }, + { + token: [ "support.function.cocoa.leopard"], + regex: "(?:\\b)(NS(?:Rect(?:ToCGRect|FromCGRect)|MakeCollectable|S(?:tringFromProtocol|ize(?:ToCGSize|FromCGSize))|Draw(?:NinePartImage|ThreePartImage)|P(?:oint(?:ToCGPoint|FromCGPoint)|rotocolFromString)|EventMaskFromType|Value))(?:\\b)" + }, + { + token: ["support.function.cocoa"], + regex: "(?:\\b)(NS(?:R(?:ound(?:DownToMultipleOfPageSize|UpToMultipleOfPageSize)|un(?:CriticalAlertPanel(?:RelativeToWindow)?|InformationalAlertPanel(?:RelativeToWindow)?|AlertPanel(?:RelativeToWindow)?)|e(?:set(?:MapTable|HashTable)|c(?:ycleZone|t(?:Clip(?:List)?|F(?:ill(?:UsingOperation|List(?:UsingOperation|With(?:Grays|Colors(?:UsingOperation)?))?)?|romString))|ordAllocationEvent)|turnAddress|leaseAlertPanel|a(?:dPixel|l(?:MemoryAvailable|locateCollectable))|gisterServicesProvider)|angeFromString)|Get(?:SizeAndAlignment|CriticalAlertPanel|InformationalAlertPanel|UncaughtExceptionHandler|FileType(?:s)?|WindowServerMemory|AlertPanel)|M(?:i(?:n(?:X|Y)|d(?:X|Y))|ouseInRect|a(?:p(?:Remove|Get|Member|Insert(?:IfAbsent|KnownAbsent)?)|ke(?:R(?:ect|ange)|Size|Point)|x(?:Range|X|Y)))|B(?:itsPer(?:SampleFromDepth|PixelFromDepth)|e(?:stDepth|ep|gin(?:CriticalAlertSheet|InformationalAlertSheet|AlertSheet)))|S(?:ho(?:uldRetainWithZone|w(?:sServicesMenuItem|AnimationEffect))|tringFrom(?:R(?:ect|ange)|MapTable|S(?:ize|elector)|HashTable|Class|Point)|izeFromString|e(?:t(?:ShowsServicesMenuItem|ZoneName|UncaughtExceptionHandler|FocusRingStyle)|lectorFromString|archPathForDirectoriesInDomains)|wap(?:Big(?:ShortToHost|IntToHost|DoubleToHost|FloatToHost|Long(?:ToHost|LongToHost))|Short|Host(?:ShortTo(?:Big|Little)|IntTo(?:Big|Little)|DoubleTo(?:Big|Little)|FloatTo(?:Big|Little)|Long(?:To(?:Big|Little)|LongTo(?:Big|Little)))|Int|Double|Float|L(?:ittle(?:ShortToHost|IntToHost|DoubleToHost|FloatToHost|Long(?:ToHost|LongToHost))|ong(?:Long)?)))|H(?:ighlightRect|o(?:stByteOrder|meDirectory(?:ForUser)?)|eight|ash(?:Remove|Get|Insert(?:IfAbsent|KnownAbsent)?)|FSType(?:CodeFromFileType|OfFile))|N(?:umberOfColorComponents|ext(?:MapEnumeratorPair|HashEnumeratorItem))|C(?:o(?:n(?:tainsRect|vert(?:GlyphsToPackedGlyphs|Swapped(?:DoubleToHost|FloatToHost)|Host(?:DoubleToSwapped|FloatToSwapped)))|unt(?:MapTable|HashTable|Frames|Windows(?:ForContext)?)|py(?:M(?:emoryPages|apTableWithZone)|Bits|HashTableWithZone|Object)|lorSpaceFromDepth|mpare(?:MapTables|HashTables))|lassFromString|reate(?:MapTable(?:WithZone)?|HashTable(?:WithZone)?|Zone|File(?:namePboardType|ContentsPboardType)))|TemporaryDirectory|I(?:s(?:ControllerMarker|EmptyRect|FreedObject)|n(?:setRect|crementExtraRefCount|te(?:r(?:sect(?:sRect|ionR(?:ect|ange))|faceStyleForKey)|gralRect)))|Zone(?:Realloc|Malloc|Name|Calloc|Fr(?:omPointer|ee))|O(?:penStepRootDirectory|ffsetRect)|D(?:i(?:sableScreenUpdates|videRect)|ottedFrameRect|e(?:c(?:imal(?:Round|Multiply|S(?:tring|ubtract)|Normalize|Co(?:py|mpa(?:ct|re))|IsNotANumber|Divide|Power|Add)|rementExtraRefCountWasZero)|faultMallocZone|allocate(?:MemoryPages|Object))|raw(?:Gr(?:oove|ayBezel)|B(?:itmap|utton)|ColorTiledRects|TiledRects|DarkBezel|W(?:hiteBezel|indowBackground)|LightBezel))|U(?:serName|n(?:ionR(?:ect|ange)|registerServicesProvider)|pdateDynamicServices)|Java(?:Bundle(?:Setup|Cleanup)|Setup(?:VirtualMachine)?|Needs(?:ToLoadClasses|VirtualMachine)|ClassesF(?:orBundle|romPath)|ObjectNamedInPath|ProvidesClasses)|P(?:oint(?:InRect|FromString)|erformService|lanarFromDepth|ageSize)|E(?:n(?:d(?:MapTableEnumeration|HashTableEnumeration)|umerate(?:MapTable|HashTable)|ableScreenUpdates)|qual(?:R(?:ects|anges)|Sizes|Points)|raseRect|xtraRefCount)|F(?:ileTypeForHFSTypeCode|ullUserName|r(?:ee(?:MapTable|HashTable)|ame(?:Rect(?:WithWidth(?:UsingOperation)?)?|Address)))|Wi(?:ndowList(?:ForContext)?|dth)|Lo(?:cationInRange|g(?:v|PageSize)?)|A(?:ccessibility(?:R(?:oleDescription(?:ForUIElement)?|aiseBadArgumentException)|Unignored(?:Children(?:ForOnlyChild)?|Descendant|Ancestor)|PostNotification|ActionDescription)|pplication(?:Main|Load)|vailableWindowDepths|ll(?:MapTable(?:Values|Keys)|HashTableObjects|ocate(?:MemoryPages|Collectable|Object)))))(?:\\b)" + }, + { + token: ["support.class.cocoa.leopard"], + regex: "(?:\\b)(NS(?:RuleEditor|G(?:arbageCollector|radient)|MapTable|HashTable|Co(?:ndition|llectionView(?:Item)?)|T(?:oolbarItemGroup|extInputClient|r(?:eeNode|ackingArea))|InvocationOperation|Operation(?:Queue)?|D(?:ictionaryController|ockTile)|P(?:ointer(?:Functions|Array)|athC(?:o(?:ntrol(?:Delegate)?|mponentCell)|ell(?:Delegate)?)|r(?:intPanelAccessorizing|edicateEditor(?:RowTemplate)?))|ViewController|FastEnumeration|Animat(?:ionContext|ablePropertyContainer)))(?:\\b)" + }, + { + token: ["support.class.cocoa"], + regex: "(?:\\b)(NS(?:R(?:u(?:nLoop|ler(?:Marker|View))|e(?:sponder|cursiveLock|lativeSpecifier)|an(?:domSpecifier|geSpecifier))|G(?:etCommand|lyph(?:Generator|Storage|Info)|raphicsContext)|XML(?:Node|D(?:ocument|TD(?:Node)?)|Parser|Element)|M(?:iddleSpecifier|ov(?:ie(?:View)?|eCommand)|utable(?:S(?:tring|et)|C(?:haracterSet|opying)|IndexSet|D(?:ictionary|ata)|URLRequest|ParagraphStyle|A(?:ttributedString|rray))|e(?:ssagePort(?:NameServer)?|nu(?:Item(?:Cell)?|View)?|t(?:hodSignature|adata(?:Item|Query(?:ResultGroup|AttributeValueTuple)?)))|a(?:ch(?:BootstrapServer|Port)|trix))|B(?:itmapImageRep|ox|u(?:ndle|tton(?:Cell)?)|ezierPath|rowser(?:Cell)?)|S(?:hadow|c(?:anner|r(?:ipt(?:SuiteRegistry|C(?:o(?:ercionHandler|mmand(?:Description)?)|lassDescription)|ObjectSpecifier|ExecutionContext|WhoseTest)|oll(?:er|View)|een))|t(?:epper(?:Cell)?|atus(?:Bar|Item)|r(?:ing|eam))|imple(?:HorizontalTypesetter|CString)|o(?:cketPort(?:NameServer)?|und|rtDescriptor)|p(?:e(?:cifierTest|ech(?:Recognizer|Synthesizer)|ll(?:Server|Checker))|litView)|e(?:cureTextField(?:Cell)?|t(?:Command)?|archField(?:Cell)?|rializer|gmentedC(?:ontrol|ell))|lider(?:Cell)?|avePanel)|H(?:ost|TTP(?:Cookie(?:Storage)?|URLResponse)|elpManager)|N(?:ib(?:Con(?:nector|trolConnector)|OutletConnector)?|otification(?:Center|Queue)?|u(?:ll|mber(?:Formatter)?)|etService(?:Browser)?|ameSpecifier)|C(?:ha(?:ngeSpelling|racterSet)|o(?:n(?:stantString|nection|trol(?:ler)?|ditionLock)|d(?:ing|er)|unt(?:Command|edSet)|pying|lor(?:Space|P(?:ick(?:ing(?:Custom|Default)|er)|anel)|Well|List)?|m(?:p(?:oundPredicate|arisonPredicate)|boBox(?:Cell)?))|u(?:stomImageRep|rsor)|IImageRep|ell|l(?:ipView|o(?:seCommand|neCommand)|assDescription)|a(?:ched(?:ImageRep|URLResponse)|lendar(?:Date)?)|reateCommand)|T(?:hread|ypesetter|ime(?:Zone|r)|o(?:olbar(?:Item(?:Validations)?)?|kenField(?:Cell)?)|ext(?:Block|Storage|Container|Tab(?:le(?:Block)?)?|Input|View|Field(?:Cell)?|List|Attachment(?:Cell)?)?|a(?:sk|b(?:le(?:Header(?:Cell|View)|Column|View)|View(?:Item)?))|reeController)|I(?:n(?:dex(?:S(?:pecifier|et)|Path)|put(?:Manager|S(?:tream|erv(?:iceProvider|er(?:MouseTracker)?)))|vocation)|gnoreMisspelledWords|mage(?:Rep|Cell|View)?)|O(?:ut(?:putStream|lineView)|pen(?:GL(?:Context|Pixel(?:Buffer|Format)|View)|Panel)|bj(?:CTypeSerializationCallBack|ect(?:Controller)?))|D(?:i(?:st(?:antObject(?:Request)?|ributed(?:NotificationCenter|Lock))|ctionary|rectoryEnumerator)|ocument(?:Controller)?|e(?:serializer|cimalNumber(?:Behaviors|Handler)?|leteCommand)|at(?:e(?:Components|Picker(?:Cell)?|Formatter)?|a)|ra(?:wer|ggingInfo))|U(?:ser(?:InterfaceValidations|Defaults(?:Controller)?)|RL(?:Re(?:sponse|quest)|Handle(?:Client)?|C(?:onnection|ache|redential(?:Storage)?)|Download(?:Delegate)?|Prot(?:ocol(?:Client)?|ectionSpace)|AuthenticationChallenge(?:Sender)?)?|n(?:iqueIDSpecifier|doManager|archiver))|P(?:ipe|o(?:sitionalSpecifier|pUpButton(?:Cell)?|rt(?:Message|NameServer|Coder)?)|ICTImageRep|ersistentDocument|DFImageRep|a(?:steboard|nel|ragraphStyle|geLayout)|r(?:int(?:Info|er|Operation|Panel)|o(?:cessInfo|tocolChecker|perty(?:Specifier|ListSerialization)|gressIndicator|xy)|edicate))|E(?:numerator|vent|PSImageRep|rror|x(?:ception|istsCommand|pression))|V(?:iew(?:Animation)?|al(?:idated(?:ToobarItem|UserInterfaceItem)|ue(?:Transformer)?))|Keyed(?:Unarchiver|Archiver)|Qui(?:ckDrawView|tCommand)|F(?:ile(?:Manager|Handle|Wrapper)|o(?:nt(?:Manager|Descriptor|Panel)?|rm(?:Cell|atter)))|W(?:hoseSpecifier|indow(?:Controller)?|orkspace)|L(?:o(?:c(?:k(?:ing)?|ale)|gicalTest)|evelIndicator(?:Cell)?|ayoutManager)|A(?:ssertionHandler|nimation|ctionCell|ttributedString|utoreleasePool|TSTypesetter|ppl(?:ication|e(?:Script|Event(?:Manager|Descriptor)))|ffineTransform|lert|r(?:chiver|ray(?:Controller)?))))(?:\\b)" + }, + { + token: ["support.type.cocoa.leopard"], + regex: "(?:\\b)(NS(?:R(?:u(?:nLoop|ler(?:Marker|View))|e(?:sponder|cursiveLock|lativeSpecifier)|an(?:domSpecifier|geSpecifier))|G(?:etCommand|lyph(?:Generator|Storage|Info)|raphicsContext)|XML(?:Node|D(?:ocument|TD(?:Node)?)|Parser|Element)|M(?:iddleSpecifier|ov(?:ie(?:View)?|eCommand)|utable(?:S(?:tring|et)|C(?:haracterSet|opying)|IndexSet|D(?:ictionary|ata)|URLRequest|ParagraphStyle|A(?:ttributedString|rray))|e(?:ssagePort(?:NameServer)?|nu(?:Item(?:Cell)?|View)?|t(?:hodSignature|adata(?:Item|Query(?:ResultGroup|AttributeValueTuple)?)))|a(?:ch(?:BootstrapServer|Port)|trix))|B(?:itmapImageRep|ox|u(?:ndle|tton(?:Cell)?)|ezierPath|rowser(?:Cell)?)|S(?:hadow|c(?:anner|r(?:ipt(?:SuiteRegistry|C(?:o(?:ercionHandler|mmand(?:Description)?)|lassDescription)|ObjectSpecifier|ExecutionContext|WhoseTest)|oll(?:er|View)|een))|t(?:epper(?:Cell)?|atus(?:Bar|Item)|r(?:ing|eam))|imple(?:HorizontalTypesetter|CString)|o(?:cketPort(?:NameServer)?|und|rtDescriptor)|p(?:e(?:cifierTest|ech(?:Recognizer|Synthesizer)|ll(?:Server|Checker))|litView)|e(?:cureTextField(?:Cell)?|t(?:Command)?|archField(?:Cell)?|rializer|gmentedC(?:ontrol|ell))|lider(?:Cell)?|avePanel)|H(?:ost|TTP(?:Cookie(?:Storage)?|URLResponse)|elpManager)|N(?:ib(?:Con(?:nector|trolConnector)|OutletConnector)?|otification(?:Center|Queue)?|u(?:ll|mber(?:Formatter)?)|etService(?:Browser)?|ameSpecifier)|C(?:ha(?:ngeSpelling|racterSet)|o(?:n(?:stantString|nection|trol(?:ler)?|ditionLock)|d(?:ing|er)|unt(?:Command|edSet)|pying|lor(?:Space|P(?:ick(?:ing(?:Custom|Default)|er)|anel)|Well|List)?|m(?:p(?:oundPredicate|arisonPredicate)|boBox(?:Cell)?))|u(?:stomImageRep|rsor)|IImageRep|ell|l(?:ipView|o(?:seCommand|neCommand)|assDescription)|a(?:ched(?:ImageRep|URLResponse)|lendar(?:Date)?)|reateCommand)|T(?:hread|ypesetter|ime(?:Zone|r)|o(?:olbar(?:Item(?:Validations)?)?|kenField(?:Cell)?)|ext(?:Block|Storage|Container|Tab(?:le(?:Block)?)?|Input|View|Field(?:Cell)?|List|Attachment(?:Cell)?)?|a(?:sk|b(?:le(?:Header(?:Cell|View)|Column|View)|View(?:Item)?))|reeController)|I(?:n(?:dex(?:S(?:pecifier|et)|Path)|put(?:Manager|S(?:tream|erv(?:iceProvider|er(?:MouseTracker)?)))|vocation)|gnoreMisspelledWords|mage(?:Rep|Cell|View)?)|O(?:ut(?:putStream|lineView)|pen(?:GL(?:Context|Pixel(?:Buffer|Format)|View)|Panel)|bj(?:CTypeSerializationCallBack|ect(?:Controller)?))|D(?:i(?:st(?:antObject(?:Request)?|ributed(?:NotificationCenter|Lock))|ctionary|rectoryEnumerator)|ocument(?:Controller)?|e(?:serializer|cimalNumber(?:Behaviors|Handler)?|leteCommand)|at(?:e(?:Components|Picker(?:Cell)?|Formatter)?|a)|ra(?:wer|ggingInfo))|U(?:ser(?:InterfaceValidations|Defaults(?:Controller)?)|RL(?:Re(?:sponse|quest)|Handle(?:Client)?|C(?:onnection|ache|redential(?:Storage)?)|Download(?:Delegate)?|Prot(?:ocol(?:Client)?|ectionSpace)|AuthenticationChallenge(?:Sender)?)?|n(?:iqueIDSpecifier|doManager|archiver))|P(?:ipe|o(?:sitionalSpecifier|pUpButton(?:Cell)?|rt(?:Message|NameServer|Coder)?)|ICTImageRep|ersistentDocument|DFImageRep|a(?:steboard|nel|ragraphStyle|geLayout)|r(?:int(?:Info|er|Operation|Panel)|o(?:cessInfo|tocolChecker|perty(?:Specifier|ListSerialization)|gressIndicator|xy)|edicate))|E(?:numerator|vent|PSImageRep|rror|x(?:ception|istsCommand|pression))|V(?:iew(?:Animation)?|al(?:idated(?:ToobarItem|UserInterfaceItem)|ue(?:Transformer)?))|Keyed(?:Unarchiver|Archiver)|Qui(?:ckDrawView|tCommand)|F(?:ile(?:Manager|Handle|Wrapper)|o(?:nt(?:Manager|Descriptor|Panel)?|rm(?:Cell|atter)))|W(?:hoseSpecifier|indow(?:Controller)?|orkspace)|L(?:o(?:c(?:k(?:ing)?|ale)|gicalTest)|evelIndicator(?:Cell)?|ayoutManager)|A(?:ssertionHandler|nimation|ctionCell|ttributedString|utoreleasePool|TSTypesetter|ppl(?:ication|e(?:Script|Event(?:Manager|Descriptor)))|ffineTransform|lert|r(?:chiver|ray(?:Controller)?))))(?:\\b)" + }, + { + token: ["support.class.quartz"], + regex: "(?:\\b)(C(?:I(?:Sampler|Co(?:ntext|lor)|Image(?:Accumulator)?|PlugIn(?:Registration)?|Vector|Kernel|Filter(?:Generator|Shape)?)|A(?:Renderer|MediaTiming(?:Function)?|BasicAnimation|ScrollLayer|Constraint(?:LayoutManager)?|T(?:iledLayer|extLayer|rans(?:ition|action))|OpenGLLayer|PropertyAnimation|KeyframeAnimation|Layer|A(?:nimation(?:Group)?|ction))))(?:\\b)" + }, + { + token: ["support.type.quartz"], + regex: "(?:\\b)(C(?:G(?:Float|Point|Size|Rect)|IFormat|AConstraintAttribute))(?:\\b)" + }, + { + token: ["support.type.cocoa"], + regex: "(?:\\b)(NS(?:R(?:ect(?:Edge)?|ange)|G(?:lyph(?:Relation|LayoutMode)?|radientType)|M(?:odalSession|a(?:trixMode|p(?:Table|Enumerator)))|B(?:itmapImageFileType|orderType|uttonType|ezelStyle|ackingStoreType|rowserColumnResizingType)|S(?:cr(?:oll(?:er(?:Part|Arrow)|ArrowPosition)|eenAuxiliaryOpaque)|tringEncoding|ize|ocketNativeHandle|election(?:Granularity|Direction|Affinity)|wapped(?:Double|Float)|aveOperationType)|Ha(?:sh(?:Table|Enumerator)|ndler(?:2)?)|C(?:o(?:ntrol(?:Size|Tint)|mp(?:ositingOperation|arisonResult))|ell(?:State|Type|ImagePosition|Attribute))|T(?:hreadPrivate|ypesetterGlyphInfo|i(?:ckMarkPosition|tlePosition|meInterval)|o(?:ol(?:TipTag|bar(?:SizeMode|DisplayMode))|kenStyle)|IFFCompression|ext(?:TabType|Alignment)|ab(?:State|leViewDropOperation|ViewType)|rackingRectTag)|ImageInterpolation|Zone|OpenGL(?:ContextAuxiliary|PixelFormatAuxiliary)|D(?:ocumentChangeType|atePickerElementFlags|ra(?:werState|gOperation))|UsableScrollerParts|P(?:oint|r(?:intingPageOrder|ogressIndicator(?:Style|Th(?:ickness|readInfo))))|EventType|KeyValueObservingOptions|Fo(?:nt(?:SymbolicTraits|TraitMask|Action)|cusRingType)|W(?:indow(?:OrderingMode|Depth)|orkspace(?:IconCreationOptions|LaunchOptions)|ritingDirection)|L(?:ineBreakMode|ayout(?:Status|Direction))|A(?:nimation(?:Progress|Effect)|ppl(?:ication(?:TerminateReply|DelegateReply|PrintReply)|eEventManagerSuspensionID)|ffineTransformStruct|lertStyle)))(?:\\b)" + }, + { + token: ["support.constant.cocoa"], + regex: "(?:\\b)(NS(?:NotFound|Ordered(?:Ascending|Descending|Same)))(?:\\b)" + }, + { + token: ["support.constant.notification.cocoa.leopard"], + regex: "(?:\\b)(NS(?:MenuDidBeginTracking|ViewDidUpdateTrackingAreas)?Notification)(?:\\b)" + }, + { + token: ["support.constant.notification.cocoa"], + regex: "(?:\\b)(NS(?:Menu(?:Did(?:RemoveItem|SendAction|ChangeItem|EndTracking|AddItem)|WillSendAction)|S(?:ystemColorsDidChange|plitView(?:DidResizeSubviews|WillResizeSubviews))|C(?:o(?:nt(?:extHelpModeDid(?:Deactivate|Activate)|rolT(?:intDidChange|extDid(?:BeginEditing|Change|EndEditing)))|lor(?:PanelColorDidChange|ListDidChange)|mboBox(?:Selection(?:IsChanging|DidChange)|Will(?:Dismiss|PopUp)))|lassDescriptionNeededForClass)|T(?:oolbar(?:DidRemoveItem|WillAddItem)|ext(?:Storage(?:DidProcessEditing|WillProcessEditing)|Did(?:BeginEditing|Change|EndEditing)|View(?:DidChange(?:Selection|TypingAttributes)|WillChangeNotifyingTextView))|ableView(?:Selection(?:IsChanging|DidChange)|ColumnDid(?:Resize|Move)))|ImageRepRegistryDidChange|OutlineView(?:Selection(?:IsChanging|DidChange)|ColumnDid(?:Resize|Move)|Item(?:Did(?:Collapse|Expand)|Will(?:Collapse|Expand)))|Drawer(?:Did(?:Close|Open)|Will(?:Close|Open))|PopUpButton(?:CellWillPopUp|WillPopUp)|View(?:GlobalFrameDidChange|BoundsDidChange|F(?:ocusDidChange|rameDidChange))|FontSetChanged|W(?:indow(?:Did(?:Resi(?:ze|gn(?:Main|Key))|M(?:iniaturize|ove)|Become(?:Main|Key)|ChangeScreen(?:|Profile)|Deminiaturize|Update|E(?:ndSheet|xpose))|Will(?:M(?:iniaturize|ove)|BeginSheet|Close))|orkspace(?:SessionDid(?:ResignActive|BecomeActive)|Did(?:Mount|TerminateApplication|Unmount|PerformFileOperation|Wake|LaunchApplication)|Will(?:Sleep|Unmount|PowerOff|LaunchApplication)))|A(?:ntialiasThresholdChanged|ppl(?:ication(?:Did(?:ResignActive|BecomeActive|Hide|ChangeScreenParameters|U(?:nhide|pdate)|FinishLaunching)|Will(?:ResignActive|BecomeActive|Hide|Terminate|U(?:nhide|pdate)|FinishLaunching))|eEventManagerWillProcessFirstEvent)))Notification)(?:\\b)" + }, + { + token: ["support.constant.cocoa.leopard"], + regex: "(?:\\b)(NS(?:RuleEditor(?:RowType(?:Simple|Compound)|NestingMode(?:Si(?:ngle|mple)|Compound|List))|GradientDraws(?:BeforeStartingLocation|AfterEndingLocation)|M(?:inusSetExpressionType|a(?:chPortDeallocate(?:ReceiveRight|SendRight|None)|pTable(?:StrongMemory|CopyIn|ZeroingWeakMemory|ObjectPointerPersonality)))|B(?:oxCustom|undleExecutableArchitecture(?:X86|I386|PPC(?:64)?)|etweenPredicateOperatorType|ackgroundStyle(?:Raised|Dark|L(?:ight|owered)))|S(?:tring(?:DrawingTruncatesLastVisibleLine|EncodingConversion(?:ExternalRepresentation|AllowLossy))|ubqueryExpressionType|p(?:e(?:ech(?:SentenceBoundary|ImmediateBoundary|WordBoundary)|llingState(?:GrammarFlag|SpellingFlag))|litViewDividerStyleThi(?:n|ck))|e(?:rvice(?:RequestTimedOutError|M(?:iscellaneousError|alformedServiceDictionaryError)|InvalidPasteboardDataError|ErrorM(?:inimum|aximum)|Application(?:NotFoundError|LaunchFailedError))|gmentStyle(?:Round(?:Rect|ed)|SmallSquare|Capsule|Textured(?:Rounded|Square)|Automatic)))|H(?:UDWindowMask|ashTable(?:StrongMemory|CopyIn|ZeroingWeakMemory|ObjectPointerPersonality))|N(?:oModeColorPanel|etServiceNoAutoRename)|C(?:hangeRedone|o(?:ntainsPredicateOperatorType|l(?:orRenderingIntent(?:RelativeColorimetric|Saturation|Default|Perceptual|AbsoluteColorimetric)|lectorDisabledOption))|ellHit(?:None|ContentArea|TrackableArea|EditableTextArea))|T(?:imeZoneNameStyle(?:S(?:hort(?:Standard|DaylightSaving)|tandard)|DaylightSaving)|extFieldDatePickerStyle|ableViewSelectionHighlightStyle(?:Regular|SourceList)|racking(?:Mouse(?:Moved|EnteredAndExited)|CursorUpdate|InVisibleRect|EnabledDuringMouseDrag|A(?:ssumeInside|ctive(?:In(?:KeyWindow|ActiveApp)|WhenFirstResponder|Always))))|I(?:n(?:tersectSetExpressionType|dexedColorSpaceModel)|mageScale(?:None|Proportionally(?:Down|UpOrDown)|AxesIndependently))|Ope(?:nGLPFAAllowOfflineRenderers|rationQueue(?:DefaultMaxConcurrentOperationCount|Priority(?:High|Normal|Very(?:High|Low)|Low)))|D(?:iacriticInsensitiveSearch|ownloadsDirectory)|U(?:nionSetExpressionType|TF(?:16(?:BigEndianStringEncoding|StringEncoding|LittleEndianStringEncoding)|32(?:BigEndianStringEncoding|StringEncoding|LittleEndianStringEncoding)))|P(?:ointerFunctions(?:Ma(?:chVirtualMemory|llocMemory)|Str(?:ongMemory|uctPersonality)|C(?:StringPersonality|opyIn)|IntegerPersonality|ZeroingWeakMemory|O(?:paque(?:Memory|Personality)|bjectP(?:ointerPersonality|ersonality)))|at(?:hStyle(?:Standard|NavigationBar|PopUp)|ternColorSpaceModel)|rintPanelShows(?:Scaling|Copies|Orientation|P(?:a(?:perSize|ge(?:Range|SetupAccessory))|review)))|Executable(?:RuntimeMismatchError|NotLoadableError|ErrorM(?:inimum|aximum)|L(?:inkError|oadError)|ArchitectureMismatchError)|KeyValueObservingOption(?:Initial|Prior)|F(?:i(?:ndPanelSubstringMatchType(?:StartsWith|Contains|EndsWith|FullWord)|leRead(?:TooLargeError|UnknownStringEncodingError))|orcedOrderingSearch)|Wi(?:ndow(?:BackingLocation(?:MainMemory|Default|VideoMemory)|Sharing(?:Read(?:Only|Write)|None)|CollectionBehavior(?:MoveToActiveSpace|CanJoinAllSpaces|Default))|dthInsensitiveSearch)|AggregateExpressionType))(?:\\b)" + }, + { + token: ["support.constant.cocoa"], + regex: "(?:\\b)(NS(?:R(?:GB(?:ModeColorPanel|ColorSpaceModel)|ight(?:Mouse(?:D(?:own(?:Mask)?|ragged(?:Mask)?)|Up(?:Mask)?)|T(?:ext(?:Movement|Alignment)|ab(?:sBezelBorder|StopType))|ArrowFunctionKey)|ound(?:RectBezelStyle|Bankers|ed(?:BezelStyle|TokenStyle|DisclosureBezelStyle)|Down|Up|Plain|Line(?:CapStyle|JoinStyle))|un(?:StoppedResponse|ContinuesResponse|AbortedResponse)|e(?:s(?:izableWindowMask|et(?:CursorRectsRunLoopOrdering|FunctionKey))|ce(?:ssedBezelStyle|iver(?:sCantHandleCommandScriptError|EvaluationScriptError))|turnTextMovement|doFunctionKey|quiredArgumentsMissingScriptError|l(?:evancyLevelIndicatorStyle|ative(?:Before|After))|gular(?:SquareBezelStyle|ControlSize)|moveTraitFontAction)|a(?:n(?:domSubelement|geDateMode)|tingLevelIndicatorStyle|dio(?:ModeMatrix|Button)))|G(?:IFFileType|lyph(?:Below|Inscribe(?:B(?:elow|ase)|Over(?:strike|Below)|Above)|Layout(?:WithPrevious|A(?:tAPoint|gainstAPoint))|A(?:ttribute(?:BidiLevel|Soft|Inscribe|Elastic)|bove))|r(?:ooveBorder|eaterThan(?:Comparison|OrEqualTo(?:Comparison|PredicateOperatorType)|PredicateOperatorType)|a(?:y(?:ModeColorPanel|ColorSpaceModel)|dient(?:None|Con(?:cave(?:Strong|Weak)|vex(?:Strong|Weak)))|phiteControlTint)))|XML(?:N(?:o(?:tationDeclarationKind|de(?:CompactEmptyElement|IsCDATA|OptionsNone|Use(?:SingleQuotes|DoubleQuotes)|Pre(?:serve(?:NamespaceOrder|C(?:haracterReferences|DATA)|DTD|Prefixes|E(?:ntities|mptyElements)|Quotes|Whitespace|A(?:ttributeOrder|ll))|ttyPrint)|ExpandEmptyElement))|amespaceKind)|CommentKind|TextKind|InvalidKind|D(?:ocument(?:X(?:MLKind|HTMLKind|Include)|HTMLKind|T(?:idy(?:XML|HTML)|extKind)|IncludeContentTypeDeclaration|Validate|Kind)|TDKind)|P(?:arser(?:GTRequiredError|XMLDeclNot(?:StartedError|FinishedError)|Mi(?:splaced(?:XMLDeclarationError|CDATAEndStringError)|xedContentDeclNot(?:StartedError|FinishedError))|S(?:t(?:andaloneValueError|ringNot(?:StartedError|ClosedError))|paceRequiredError|eparatorRequiredError)|N(?:MTOKENRequiredError|o(?:t(?:ationNot(?:StartedError|FinishedError)|WellBalancedError)|DTDError)|amespaceDeclarationError|AMERequiredError)|C(?:haracterRef(?:In(?:DTDError|PrologError|EpilogError)|AtEOFError)|o(?:nditionalSectionNot(?:StartedError|FinishedError)|mment(?:NotFinishedError|ContainsDoubleHyphenError))|DATANotFinishedError)|TagNameMismatchError|In(?:ternalError|valid(?:HexCharacterRefError|C(?:haracter(?:RefError|InEntityError|Error)|onditionalSectionError)|DecimalCharacterRefError|URIError|Encoding(?:NameError|Error)))|OutOfMemoryError|D(?:ocumentStartError|elegateAbortedParseError|OCTYPEDeclNotFinishedError)|U(?:RI(?:RequiredError|FragmentError)|n(?:declaredEntityError|parsedEntityError|knownEncodingError|finishedTagError))|P(?:CDATARequiredError|ublicIdentifierRequiredError|arsedEntityRef(?:MissingSemiError|NoNameError|In(?:Internal(?:SubsetError|Error)|PrologError|EpilogError)|AtEOFError)|r(?:ocessingInstructionNot(?:StartedError|FinishedError)|ematureDocumentEndError))|E(?:n(?:codingNotSupportedError|tity(?:Ref(?:In(?:DTDError|PrologError|EpilogError)|erence(?:MissingSemiError|WithoutNameError)|LoopError|AtEOFError)|BoundaryError|Not(?:StartedError|FinishedError)|Is(?:ParameterError|ExternalError)|ValueRequiredError))|qualExpectedError|lementContentDeclNot(?:StartedError|FinishedError)|xt(?:ernalS(?:tandaloneEntityError|ubsetNotFinishedError)|raContentError)|mptyDocumentError)|L(?:iteralNot(?:StartedError|FinishedError)|T(?:RequiredError|SlashRequiredError)|essThanSymbolInAttributeError)|Attribute(?:RedefinedError|HasNoValueError|Not(?:StartedError|FinishedError)|ListNot(?:StartedError|FinishedError)))|rocessingInstructionKind)|E(?:ntity(?:GeneralKind|DeclarationKind|UnparsedKind|P(?:ar(?:sedKind|ameterKind)|redefined))|lement(?:Declaration(?:MixedKind|UndefinedKind|E(?:lementKind|mptyKind)|Kind|AnyKind)|Kind))|Attribute(?:N(?:MToken(?:sKind|Kind)|otationKind)|CDATAKind|ID(?:Ref(?:sKind|Kind)|Kind)|DeclarationKind|En(?:tit(?:yKind|iesKind)|umerationKind)|Kind))|M(?:i(?:n(?:XEdge|iaturizableWindowMask|YEdge|uteCalendarUnit)|terLineJoinStyle|ddleSubelement|xedState)|o(?:nthCalendarUnit|deSwitchFunctionKey|use(?:Moved(?:Mask)?|E(?:ntered(?:Mask)?|ventSubtype|xited(?:Mask)?))|veToBezierPathElement|mentary(?:ChangeButton|Push(?:Button|InButton)|Light(?:Button)?))|enuFunctionKey|a(?:c(?:intoshInterfaceStyle|OSRomanStringEncoding)|tchesPredicateOperatorType|ppedRead|x(?:XEdge|YEdge))|ACHOperatingSystem)|B(?:MPFileType|o(?:ttomTabsBezelBorder|ldFontMask|rderlessWindowMask|x(?:Se(?:condary|parator)|OldStyle|Primary))|uttLineCapStyle|e(?:zelBorder|velLineJoinStyle|low(?:Bottom|Top)|gin(?:sWith(?:Comparison|PredicateOperatorType)|FunctionKey))|lueControlTint|ack(?:spaceCharacter|tabTextMovement|ingStore(?:Retained|Buffered|Nonretained)|TabCharacter|wardsSearch|groundTab)|r(?:owser(?:NoColumnResizing|UserColumnResizing|AutoColumnResizing)|eakFunctionKey))|S(?:h(?:ift(?:JISStringEncoding|KeyMask)|ow(?:ControlGlyphs|InvisibleGlyphs)|adowlessSquareBezelStyle)|y(?:s(?:ReqFunctionKey|tem(?:D(?:omainMask|efined(?:Mask)?)|FunctionKey))|mbolStringEncoding)|c(?:a(?:nnedOption|le(?:None|ToFit|Proportionally))|r(?:oll(?:er(?:NoPart|Increment(?:Page|Line|Arrow)|Decrement(?:Page|Line|Arrow)|Knob(?:Slot)?|Arrows(?:M(?:inEnd|axEnd)|None|DefaultSetting))|Wheel(?:Mask)?|LockFunctionKey)|eenChangedEventType))|t(?:opFunctionKey|r(?:ingDrawing(?:OneShot|DisableScreenFontSubstitution|Uses(?:DeviceMetrics|FontLeading|LineFragmentOrigin))|eam(?:Status(?:Reading|NotOpen|Closed|Open(?:ing)?|Error|Writing|AtEnd)|Event(?:Has(?:BytesAvailable|SpaceAvailable)|None|OpenCompleted|E(?:ndEncountered|rrorOccurred)))))|i(?:ngle(?:DateMode|UnderlineStyle)|ze(?:DownFontAction|UpFontAction))|olarisOperatingSystem|unOSOperatingSystem|pecialPageOrder|e(?:condCalendarUnit|lect(?:By(?:Character|Paragraph|Word)|i(?:ng(?:Next|Previous)|onAffinity(?:Downstream|Upstream))|edTab|FunctionKey)|gmentSwitchTracking(?:Momentary|Select(?:One|Any)))|quareLineCapStyle|witchButton|ave(?:ToOperation|Op(?:tions(?:Yes|No|Ask)|eration)|AsOperation)|mall(?:SquareBezelStyle|C(?:ontrolSize|apsFontMask)|IconButtonBezelStyle))|H(?:ighlightModeMatrix|SBModeColorPanel|o(?:ur(?:Minute(?:SecondDatePickerElementFlag|DatePickerElementFlag)|CalendarUnit)|rizontalRuler|meFunctionKey)|TTPCookieAcceptPolicy(?:Never|OnlyFromMainDocumentDomain|Always)|e(?:lp(?:ButtonBezelStyle|KeyMask|FunctionKey)|avierFontAction)|PUXOperatingSystem)|Year(?:MonthDa(?:yDatePickerElementFlag|tePickerElementFlag)|CalendarUnit)|N(?:o(?:n(?:StandardCharacterSetFontMask|ZeroWindingRule|activatingPanelMask|LossyASCIIStringEncoding)|Border|t(?:ification(?:SuspensionBehavior(?:Hold|Coalesce|D(?:eliverImmediately|rop))|NoCoalescing|CoalescingOn(?:Sender|Name)|DeliverImmediately|PostToAllSessions)|PredicateType|EqualToPredicateOperatorType)|S(?:cr(?:iptError|ollerParts)|ubelement|pecifierError)|CellMask|T(?:itle|opLevelContainersSpecifierError|abs(?:BezelBorder|NoBorder|LineBorder))|I(?:nterfaceStyle|mage)|UnderlineStyle|FontChangeAction)|u(?:ll(?:Glyph|CellType)|m(?:eric(?:Search|PadKeyMask)|berFormatter(?:Round(?:Half(?:Down|Up|Even)|Ceiling|Down|Up|Floor)|Behavior(?:10|Default)|S(?:cientificStyle|pellOutStyle)|NoStyle|CurrencyStyle|DecimalStyle|P(?:ercentStyle|ad(?:Before(?:Suffix|Prefix)|After(?:Suffix|Prefix))))))|e(?:t(?:Services(?:BadArgumentError|NotFoundError|C(?:ollisionError|ancelledError)|TimeoutError|InvalidError|UnknownError|ActivityInProgress)|workDomainMask)|wlineCharacter|xt(?:StepInterfaceStyle|FunctionKey))|EXTSTEPStringEncoding|a(?:t(?:iveShortGlyphPacking|uralTextAlignment)|rrowFontMask))|C(?:hange(?:ReadOtherContents|GrayCell(?:Mask)?|BackgroundCell(?:Mask)?|Cleared|Done|Undone|Autosaved)|MYK(?:ModeColorPanel|ColorSpaceModel)|ircular(?:BezelStyle|Slider)|o(?:n(?:stantValueExpressionType|t(?:inuousCapacityLevelIndicatorStyle|entsCellMask|ain(?:sComparison|erSpecifierError)|rol(?:Glyph|KeyMask))|densedFontMask)|lor(?:Panel(?:RGBModeMask|GrayModeMask|HSBModeMask|C(?:MYKModeMask|olorListModeMask|ustomPaletteModeMask|rayonModeMask)|WheelModeMask|AllModesMask)|ListModeColorPanel)|reServiceDirectory|m(?:p(?:osite(?:XOR|Source(?:In|O(?:ut|ver)|Atop)|Highlight|C(?:opy|lear)|Destination(?:In|O(?:ut|ver)|Atop)|Plus(?:Darker|Lighter))|ressedFontMask)|mandKeyMask))|u(?:stom(?:SelectorPredicateOperatorType|PaletteModeColorPanel)|r(?:sor(?:Update(?:Mask)?|PointingDevice)|veToBezierPathElement))|e(?:nterT(?:extAlignment|abStopType)|ll(?:State|H(?:ighlighted|as(?:Image(?:Horizontal|OnLeftOrBottom)|OverlappingImage))|ChangesContents|Is(?:Bordered|InsetButton)|Disabled|Editable|LightsBy(?:Gray|Background|Contents)|AllowsMixedState))|l(?:ipPagination|o(?:s(?:ePathBezierPathElement|ableWindowMask)|ckAndCalendarDatePickerStyle)|ear(?:ControlTint|DisplayFunctionKey|LineFunctionKey))|a(?:seInsensitive(?:Search|PredicateOption)|n(?:notCreateScriptCommandError|cel(?:Button|TextMovement))|chesDirectory|lculation(?:NoError|Overflow|DivideByZero|Underflow|LossOfPrecision)|rriageReturnCharacter)|r(?:itical(?:Request|AlertStyle)|ayonModeColorPanel))|T(?:hick(?:SquareBezelStyle|erSquareBezelStyle)|ypesetter(?:Behavior|HorizontalTabAction|ContainerBreakAction|ZeroAdvancementAction|OriginalBehavior|ParagraphBreakAction|WhitespaceAction|L(?:ineBreakAction|atestBehavior))|i(?:ckMark(?:Right|Below|Left|Above)|tledWindowMask|meZoneDatePickerElementFlag)|o(?:olbarItemVisibilityPriority(?:Standard|High|User|Low)|pTabsBezelBorder|ggleButton)|IFF(?:Compression(?:N(?:one|EXT)|CCITTFAX(?:3|4)|OldJPEG|JPEG|PackBits|LZW)|FileType)|e(?:rminate(?:Now|Cancel|Later)|xt(?:Read(?:InapplicableDocumentTypeError|WriteErrorM(?:inimum|aximum))|Block(?:M(?:i(?:nimum(?:Height|Width)|ddleAlignment)|a(?:rgin|ximum(?:Height|Width)))|B(?:o(?:ttomAlignment|rder)|aselineAlignment)|Height|TopAlignment|P(?:ercentageValueType|adding)|Width|AbsoluteValueType)|StorageEdited(?:Characters|Attributes)|CellType|ured(?:RoundedBezelStyle|BackgroundWindowMask|SquareBezelStyle)|Table(?:FixedLayoutAlgorithm|AutomaticLayoutAlgorithm)|Field(?:RoundedBezel|SquareBezel|AndStepperDatePickerStyle)|WriteInapplicableDocumentTypeError|ListPrependEnclosingMarker))|woByteGlyphPacking|ab(?:Character|TextMovement|le(?:tP(?:oint(?:Mask|EventSubtype)?|roximity(?:Mask|EventSubtype)?)|Column(?:NoResizing|UserResizingMask|AutoresizingMask)|View(?:ReverseSequentialColumnAutoresizingStyle|GridNone|S(?:olid(?:HorizontalGridLineMask|VerticalGridLineMask)|equentialColumnAutoresizingStyle)|NoColumnAutoresizing|UniformColumnAutoresizingStyle|FirstColumnOnlyAutoresizingStyle|LastColumnOnlyAutoresizingStyle)))|rackModeMatrix)|I(?:n(?:sert(?:CharFunctionKey|FunctionKey|LineFunctionKey)|t(?:Type|ernalS(?:criptError|pecifierError))|dexSubelement|validIndexSpecifierError|formational(?:Request|AlertStyle)|PredicateOperatorType)|talicFontMask|SO(?:2022JPStringEncoding|Latin(?:1StringEncoding|2StringEncoding))|dentityMappingCharacterCollection|llegalTextMovement|mage(?:R(?:ight|ep(?:MatchesDevice|LoadStatus(?:ReadingHeader|Completed|InvalidData|Un(?:expectedEOF|knownType)|WillNeedAllData)))|Below|C(?:ellType|ache(?:BySize|Never|Default|Always))|Interpolation(?:High|None|Default|Low)|O(?:nly|verlaps)|Frame(?:Gr(?:oove|ayBezel)|Button|None|Photo)|L(?:oadStatus(?:ReadError|C(?:ompleted|ancelled)|InvalidData|UnexpectedEOF)|eft)|A(?:lign(?:Right|Bottom(?:Right|Left)?|Center|Top(?:Right|Left)?|Left)|bove)))|O(?:n(?:State|eByteGlyphPacking|OffButton|lyScrollerArrows)|ther(?:Mouse(?:D(?:own(?:Mask)?|ragged(?:Mask)?)|Up(?:Mask)?)|TextMovement)|SF1OperatingSystem|pe(?:n(?:GL(?:GO(?:Re(?:setLibrary|tainRenderers)|ClearFormatCache|FormatCacheSize)|PFA(?:R(?:obust|endererID)|M(?:inimumPolicy|ulti(?:sample|Screen)|PSafe|aximumPolicy)|BackingStore|S(?:creenMask|te(?:ncilSize|reo)|ingleRenderer|upersample|ample(?:s|Buffers|Alpha))|NoRecovery|C(?:o(?:lor(?:Size|Float)|mpliant)|losestPolicy)|OffScreen|D(?:oubleBuffer|epthSize)|PixelBuffer|VirtualScreenCount|FullScreen|Window|A(?:cc(?:umSize|elerated)|ux(?:Buffers|DepthStencil)|l(?:phaSize|lRenderers))))|StepUnicodeReservedBase)|rationNotSupportedForKeyS(?:criptError|pecifierError))|ffState|KButton|rPredicateType|bjC(?:B(?:itfield|oolType)|S(?:hortType|tr(?:ingType|uctType)|electorType)|NoType|CharType|ObjectType|DoubleType|UnionType|PointerType|VoidType|FloatType|Long(?:Type|longType)|ArrayType))|D(?:i(?:s(?:c(?:losureBezelStyle|reteCapacityLevelIndicatorStyle)|playWindowRunLoopOrdering)|acriticInsensitivePredicateOption|rect(?:Selection|PredicateModifier))|o(?:c(?:ModalWindowMask|ument(?:Directory|ationDirectory))|ubleType|wn(?:TextMovement|ArrowFunctionKey))|e(?:s(?:cendingPageOrder|ktopDirectory)|cimalTabStopType|v(?:ice(?:NColorSpaceModel|IndependentModifierFlagsMask)|eloper(?:Directory|ApplicationDirectory))|fault(?:ControlTint|TokenStyle)|lete(?:Char(?:acter|FunctionKey)|FunctionKey|LineFunctionKey)|moApplicationDirectory)|a(?:yCalendarUnit|teFormatter(?:MediumStyle|Behavior(?:10|Default)|ShortStyle|NoStyle|FullStyle|LongStyle))|ra(?:wer(?:Clos(?:ingState|edState)|Open(?:ingState|State))|gOperation(?:Generic|Move|None|Copy|Delete|Private|Every|Link|All)))|U(?:ser(?:CancelledError|D(?:irectory|omainMask)|FunctionKey)|RL(?:Handle(?:NotLoaded|Load(?:Succeeded|InProgress|Failed))|CredentialPersistence(?:None|Permanent|ForSession))|n(?:scaledWindowMask|cachedRead|i(?:codeStringEncoding|talicFontMask|fiedTitleAndToolbarWindowMask)|d(?:o(?:CloseGroupingRunLoopOrdering|FunctionKey)|e(?:finedDateComponent|rline(?:Style(?:Single|None|Thick|Double)|Pattern(?:Solid|D(?:ot|ash(?:Dot(?:Dot)?)?)))))|known(?:ColorSpaceModel|P(?:ointingDevice|ageOrder)|KeyS(?:criptError|pecifierError))|boldFontMask)|tilityWindowMask|TF8StringEncoding|p(?:dateWindowsRunLoopOrdering|TextMovement|ArrowFunctionKey))|J(?:ustifiedTextAlignment|PEG(?:2000FileType|FileType)|apaneseEUC(?:GlyphPacking|StringEncoding))|P(?:o(?:s(?:t(?:Now|erFontMask|WhenIdle|ASAP)|iti(?:on(?:Replace|Be(?:fore|ginning)|End|After)|ve(?:IntType|DoubleType|FloatType)))|pUp(?:NoArrow|ArrowAt(?:Bottom|Center))|werOffEventType|rtraitOrientation)|NGFileType|ush(?:InCell(?:Mask)?|OnPushOffButton)|e(?:n(?:TipMask|UpperSideMask|PointingDevice|LowerSideMask)|riodic(?:Mask)?)|P(?:S(?:caleField|tatus(?:Title|Field)|aveButton)|N(?:ote(?:Title|Field)|ame(?:Title|Field))|CopiesField|TitleField|ImageButton|OptionsButton|P(?:a(?:perFeedButton|ge(?:Range(?:To|From)|ChoiceMatrix))|reviewButton)|LayoutButton)|lainTextTokenStyle|a(?:useFunctionKey|ragraphSeparatorCharacter|ge(?:DownFunctionKey|UpFunctionKey))|r(?:int(?:ing(?:ReplyLater|Success|Cancelled|Failure)|ScreenFunctionKey|erTable(?:NotFound|OK|Error)|FunctionKey)|o(?:p(?:ertyList(?:XMLFormat|MutableContainers(?:AndLeaves)?|BinaryFormat|Immutable|OpenStepFormat)|rietaryStringEncoding)|gressIndicator(?:BarStyle|SpinningStyle|Preferred(?:SmallThickness|Thickness|LargeThickness|AquaThickness)))|e(?:ssedTab|vFunctionKey))|L(?:HeightForm|CancelButton|TitleField|ImageButton|O(?:KButton|rientationMatrix)|UnitsButton|PaperNameButton|WidthForm))|E(?:n(?:terCharacter|d(?:sWith(?:Comparison|PredicateOperatorType)|FunctionKey))|v(?:e(?:nOddWindingRule|rySubelement)|aluatedObjectExpressionType)|qualTo(?:Comparison|PredicateOperatorType)|ra(?:serPointingDevice|CalendarUnit|DatePickerElementFlag)|x(?:clude(?:10|QuickDrawElementsIconCreationOption)|pandedFontMask|ecuteFunctionKey))|V(?:i(?:ew(?:M(?:in(?:XMargin|YMargin)|ax(?:XMargin|YMargin))|HeightSizable|NotSizable|WidthSizable)|aPanelFontAction)|erticalRuler|a(?:lidationErrorM(?:inimum|aximum)|riableExpressionType))|Key(?:SpecifierEvaluationScriptError|Down(?:Mask)?|Up(?:Mask)?|PathExpressionType|Value(?:MinusSetMutation|SetSetMutation|Change(?:Re(?:placement|moval)|Setting|Insertion)|IntersectSetMutation|ObservingOption(?:New|Old)|UnionSetMutation|ValidationError))|QTMovie(?:NormalPlayback|Looping(?:BackAndForthPlayback|Playback))|F(?:1(?:1FunctionKey|7FunctionKey|2FunctionKey|8FunctionKey|3FunctionKey|9FunctionKey|4FunctionKey|5FunctionKey|FunctionKey|0FunctionKey|6FunctionKey)|7FunctionKey|i(?:nd(?:PanelAction(?:Replace(?:A(?:ndFind|ll(?:InSelection)?))?|S(?:howFindPanel|e(?:tFindString|lectAll(?:InSelection)?))|Next|Previous)|FunctionKey)|tPagination|le(?:Read(?:No(?:SuchFileError|PermissionError)|CorruptFileError|In(?:validFileNameError|applicableStringEncodingError)|Un(?:supportedSchemeError|knownError))|HandlingPanel(?:CancelButton|OKButton)|NoSuchFileError|ErrorM(?:inimum|aximum)|Write(?:NoPermissionError|In(?:validFileNameError|applicableStringEncodingError)|OutOfSpaceError|Un(?:supportedSchemeError|knownError))|LockingError)|xedPitchFontMask)|2(?:1FunctionKey|7FunctionKey|2FunctionKey|8FunctionKey|3FunctionKey|9FunctionKey|4FunctionKey|5FunctionKey|FunctionKey|0FunctionKey|6FunctionKey)|o(?:nt(?:Mo(?:noSpaceTrait|dernSerifsClass)|BoldTrait|S(?:ymbolicClass|criptsClass|labSerifsClass|ansSerifClass)|C(?:o(?:ndensedTrait|llectionApplicationOnlyMask)|larendonSerifsClass)|TransitionalSerifsClass|I(?:ntegerAdvancementsRenderingMode|talicTrait)|O(?:ldStyleSerifsClass|rnamentalsClass)|DefaultRenderingMode|U(?:nknownClass|IOptimizedTrait)|Panel(?:S(?:hadowEffectModeMask|t(?:andardModesMask|rikethroughEffectModeMask)|izeModeMask)|CollectionModeMask|TextColorEffectModeMask|DocumentColorEffectModeMask|UnderlineEffectModeMask|FaceModeMask|All(?:ModesMask|EffectsModeMask))|ExpandedTrait|VerticalTrait|F(?:amilyClassMask|reeformSerifsClass)|Antialiased(?:RenderingMode|IntegerAdvancementsRenderingMode))|cusRing(?:Below|Type(?:None|Default|Exterior)|Only|Above)|urByteGlyphPacking|rm(?:attingError(?:M(?:inimum|aximum))?|FeedCharacter))|8FunctionKey|unction(?:ExpressionType|KeyMask)|3(?:1FunctionKey|2FunctionKey|3FunctionKey|4FunctionKey|5FunctionKey|FunctionKey|0FunctionKey)|9FunctionKey|4FunctionKey|P(?:RevertButton|S(?:ize(?:Title|Field)|etButton)|CurrentField|Preview(?:Button|Field))|l(?:oat(?:ingPointSamplesBitmapFormat|Type)|agsChanged(?:Mask)?)|axButton|5FunctionKey|6FunctionKey)|W(?:heelModeColorPanel|indow(?:s(?:NTOperatingSystem|CP125(?:1StringEncoding|2StringEncoding|3StringEncoding|4StringEncoding|0StringEncoding)|95(?:InterfaceStyle|OperatingSystem))|M(?:iniaturizeButton|ovedEventType)|Below|CloseButton|ToolbarButton|ZoomButton|Out|DocumentIconButton|ExposedEventType|Above)|orkspaceLaunch(?:NewInstance|InhibitingBackgroundOnly|Default|PreferringClassic|WithoutA(?:ctivation|ddingToRecents)|A(?:sync|nd(?:Hide(?:Others)?|Print)|llowingClassicStartup))|eek(?:day(?:CalendarUnit|OrdinalCalendarUnit)|CalendarUnit)|a(?:ntsBidiLevels|rningAlertStyle)|r(?:itingDirection(?:RightToLeft|Natural|LeftToRight)|apCalendarComponents))|L(?:i(?:stModeMatrix|ne(?:Moves(?:Right|Down|Up|Left)|B(?:order|reakBy(?:C(?:harWrapping|lipping)|Truncating(?:Middle|Head|Tail)|WordWrapping))|S(?:eparatorCharacter|weep(?:Right|Down|Up|Left))|ToBezierPathElement|DoesntMove|arSlider)|teralSearch|kePredicateOperatorType|ghterFontAction|braryDirectory)|ocalDomainMask|e(?:ssThan(?:Comparison|OrEqualTo(?:Comparison|PredicateOperatorType)|PredicateOperatorType)|ft(?:Mouse(?:D(?:own(?:Mask)?|ragged(?:Mask)?)|Up(?:Mask)?)|T(?:ext(?:Movement|Alignment)|ab(?:sBezelBorder|StopType))|ArrowFunctionKey))|a(?:yout(?:RightToLeft|NotDone|CantFit|OutOfGlyphs|Done|LeftToRight)|ndscapeOrientation)|ABColorSpaceModel)|A(?:sc(?:iiWithDoubleByteEUCGlyphPacking|endingPageOrder)|n(?:y(?:Type|PredicateModifier|EventMask)|choredSearch|imation(?:Blocking|Nonblocking(?:Threaded)?|E(?:ffect(?:DisappearingItemDefault|Poof)|ase(?:In(?:Out)?|Out))|Linear)|dPredicateType)|t(?:Bottom|tachmentCharacter|omicWrite|Top)|SCIIStringEncoding|d(?:obe(?:GB1CharacterCollection|CNS1CharacterCollection|Japan(?:1CharacterCollection|2CharacterCollection)|Korea1CharacterCollection)|dTraitFontAction|minApplicationDirectory)|uto(?:saveOperation|Pagination)|pp(?:lication(?:SupportDirectory|D(?:irectory|e(?:fined(?:Mask)?|legateReply(?:Success|Cancel|Failure)|activatedEventType))|ActivatedEventType)|KitDefined(?:Mask)?)|l(?:ternateKeyMask|pha(?:ShiftKeyMask|NonpremultipliedBitmapFormat|FirstBitmapFormat)|ert(?:SecondButtonReturn|ThirdButtonReturn|OtherReturn|DefaultReturn|ErrorReturn|FirstButtonReturn|AlternateReturn)|l(?:ScrollerParts|DomainsMask|PredicateModifier|LibrariesDirectory|ApplicationsDirectory))|rgument(?:sWrongScriptError|EvaluationScriptError)|bove(?:Bottom|Top)|WTEventType)))(?:\\b)" + }, + { + token: "support.function.C99.c", + regex: C_Highlight_File.cFunctions + }, + { + token : cObj.getKeywords(), + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, + { + token: "punctuation.section.scope.begin.objc", + regex: "\\[", + next: "bracketed_content" + }, + { + token: "meta.function.objc", + regex: "^(?:-|\\+)\\s*" + } + ], + "constant_NSString": [ + { + token: "constant.character.escape.objc", + regex: escapedConstRe + }, + { + token: "invalid.illegal.unknown-escape.objc", + regex: "\\\\." + }, + { + token: "string", + regex: '[^"\\\\]+' + }, + { + token: "punctuation.definition.string.end", + regex: "\"", + next: "start" + } + ], + "protocol_list": [ + { + token: "punctuation.section.scope.end.objc", + regex: ">", + next: "start" + }, + { + token: "support.other.protocol.objc", + regex: "\bNS(?:GlyphStorage|M(?:utableCopying|enuItem)|C(?:hangeSpelling|o(?:ding|pying|lorPicking(?:Custom|Default)))|T(?:oolbarItemValidations|ext(?:Input|AttachmentCell))|I(?:nputServ(?:iceProvider|erMouseTracker)|gnoreMisspelledWords)|Obj(?:CTypeSerializationCallBack|ect)|D(?:ecimalNumberBehaviors|raggingInfo)|U(?:serInterfaceValidations|RL(?:HandleClient|DownloadDelegate|ProtocolClient|AuthenticationChallengeSender))|Validated(?:ToobarItem|UserInterfaceItem)|Locking)\b" + } + ], + "selectors": [ + { + token: "support.function.any-method.name-of-parameter.objc", + regex: "\\b(?:[a-zA-Z_:][\\w]*)+" + }, + { + token: "punctuation", + regex: "\\)", + next: "start" + } + ], + "bracketed_content": [ + { + token: "punctuation.section.scope.end.objc", + regex: "\]", + next: "start" + }, + { + token: ["support.function.any-method.objc"], + regex: "(?:predicateWithFormat:| NSPredicate predicateWithFormat:)", + next: "start" + }, + { + token: "support.function.any-method.objc", + regex: "\\w+(?::|(?=\]))", + next: "start" + } + ], + "bracketed_strings": [ + { + token: "punctuation.section.scope.end.objc", + regex: "\]", + next: "start" + }, + { + token: "keyword.operator.logical.predicate.cocoa", + regex: "\\b(?:AND|OR|NOT|IN)\\b" + }, + { + token: ["invalid.illegal.unknown-method.objc", "punctuation.separator.arguments.objc"], + regex: "\\b(\w+)(:)" + }, + { + regex: "\\b(?:ALL|ANY|SOME|NONE)\\b", + token: "constant.language.predicate.cocoa" + }, + { + regex: "\\b(?:NULL|NIL|SELF|TRUE|YES|FALSE|NO|FIRST|LAST|SIZE)\\b", + token: "constant.language.predicate.cocoa" + }, + { + regex: "\\b(?:MATCHES|CONTAINS|BEGINSWITH|ENDSWITH|BETWEEN)\\b", + token: "keyword.operator.comparison.predicate.cocoa" + }, + { + regex: "\\bC(?:ASEINSENSITIVE|I)\\b", + token: "keyword.other.modifier.predicate.cocoa" + }, + { + regex: "\\b(?:ANYKEY|SUBQUERY|CAST|TRUEPREDICATE|FALSEPREDICATE)\\b", + token: "keyword.other.predicate.cocoa" + }, + { + regex: escapedConstRe, + token: "constant.character.escape.objc" + }, + { + regex: "\\\\.", + token: "invalid.illegal.unknown-escape.objc" + }, + { + token: "string", + regex: '[^"\\\\]' + }, + { + token: "punctuation.definition.string.end.objc", + regex: "\"", + next: "predicates" + } + ], + "comment" : [ + { + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "start" + }, { + token : "comment", // comment spanning whole line + regex : ".+" + } + ], + "methods" : [ + { + token : "meta.function.objc", + regex : "(?=\\{|#)|;", + next : "start" + } + ] +} + for (var r in cRules) { + if (this.$rules[r]) { + if (this.$rules[r].push) + this.$rules[r].push.apply(this.$rules[r], cRules[r]); + } else { + this.$rules[r] = cRules[r]; + } + } + + this.$rules.bracketed_content = this.$rules.bracketed_content.concat( + this.$rules.start, specialVariables + ); + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("start") ]); +}; + +oop.inherits(ObjectiveCHighlightRules, CHighlightRules); + +exports.ObjectiveCHighlightRules = ObjectiveCHighlightRules; +}); + +ace.define('ace/mode/doc_comment_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, { + token : "comment.doc.tag", + regex : "\\bTODO\\b" + }, { + defaultToken : "comment.doc" + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); +ace.define('ace/mode/c_cpp_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/doc_comment_highlight_rules', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var cFunctions = exports.cFunctions = "\\s*\\bhypot(?:f|l)?|s(?:scanf|ystem|nprintf|ca(?:nf|lb(?:n(?:f|l)?|ln(?:f|l)?))|i(?:n(?:h(?:f|l)?|f|l)?|gn(?:al|bit))|tr(?:s(?:tr|pn)|nc(?:py|at|mp)|c(?:spn|hr|oll|py|at|mp)|to(?:imax|d|u(?:l(?:l)?|max)|k|f|l(?:d|l)?)|error|pbrk|ftime|len|rchr|xfrm)|printf|et(?:jmp|vbuf|locale|buf)|qrt(?:f|l)?|w(?:scanf|printf)|rand)|n(?:e(?:arbyint(?:f|l)?|xt(?:toward(?:f|l)?|after(?:f|l)?))|an(?:f|l)?)|c(?:s(?:in(?:h(?:f|l)?|f|l)?|qrt(?:f|l)?)|cos(?:h(?:f)?|f|l)?|imag(?:f|l)?|t(?:ime|an(?:h(?:f|l)?|f|l)?)|o(?:s(?:h(?:f|l)?|f|l)?|nj(?:f|l)?|pysign(?:f|l)?)|p(?:ow(?:f|l)?|roj(?:f|l)?)|e(?:il(?:f|l)?|xp(?:f|l)?)|l(?:o(?:ck|g(?:f|l)?)|earerr)|a(?:sin(?:h(?:f|l)?|f|l)?|cos(?:h(?:f|l)?|f|l)?|tan(?:h(?:f|l)?|f|l)?|lloc|rg(?:f|l)?|bs(?:f|l)?)|real(?:f|l)?|brt(?:f|l)?)|t(?:ime|o(?:upper|lower)|an(?:h(?:f|l)?|f|l)?|runc(?:f|l)?|gamma(?:f|l)?|mp(?:nam|file))|i(?:s(?:space|n(?:ormal|an)|cntrl|inf|digit|u(?:nordered|pper)|p(?:unct|rint)|finite|w(?:space|c(?:ntrl|type)|digit|upper|p(?:unct|rint)|lower|al(?:num|pha)|graph|xdigit|blank)|l(?:ower|ess(?:equal|greater)?)|al(?:num|pha)|gr(?:eater(?:equal)?|aph)|xdigit|blank)|logb(?:f|l)?|max(?:div|abs))|di(?:v|fftime)|_Exit|unget(?:c|wc)|p(?:ow(?:f|l)?|ut(?:s|c(?:har)?|wc(?:har)?)|error|rintf)|e(?:rf(?:c(?:f|l)?|f|l)?|x(?:it|p(?:2(?:f|l)?|f|l|m1(?:f|l)?)?))|v(?:s(?:scanf|nprintf|canf|printf|w(?:scanf|printf))|printf|f(?:scanf|printf|w(?:scanf|printf))|w(?:scanf|printf)|a_(?:start|copy|end|arg))|qsort|f(?:s(?:canf|e(?:tpos|ek))|close|tell|open|dim(?:f|l)?|p(?:classify|ut(?:s|c|w(?:s|c))|rintf)|e(?:holdexcept|set(?:e(?:nv|xceptflag)|round)|clearexcept|testexcept|of|updateenv|r(?:aiseexcept|ror)|get(?:e(?:nv|xceptflag)|round))|flush|w(?:scanf|ide|printf|rite)|loor(?:f|l)?|abs(?:f|l)?|get(?:s|c|pos|w(?:s|c))|re(?:open|e|ad|xp(?:f|l)?)|m(?:in(?:f|l)?|od(?:f|l)?|a(?:f|l|x(?:f|l)?)?))|l(?:d(?:iv|exp(?:f|l)?)|o(?:ngjmp|cal(?:time|econv)|g(?:1(?:p(?:f|l)?|0(?:f|l)?)|2(?:f|l)?|f|l|b(?:f|l)?)?)|abs|l(?:div|abs|r(?:int(?:f|l)?|ound(?:f|l)?))|r(?:int(?:f|l)?|ound(?:f|l)?)|gamma(?:f|l)?)|w(?:scanf|c(?:s(?:s(?:tr|pn)|nc(?:py|at|mp)|c(?:spn|hr|oll|py|at|mp)|to(?:imax|d|u(?:l(?:l)?|max)|k|f|l(?:d|l)?|mbs)|pbrk|ftime|len|r(?:chr|tombs)|xfrm)|to(?:b|mb)|rtomb)|printf|mem(?:set|c(?:hr|py|mp)|move))|a(?:s(?:sert|ctime|in(?:h(?:f|l)?|f|l)?)|cos(?:h(?:f|l)?|f|l)?|t(?:o(?:i|f|l(?:l)?)|exit|an(?:h(?:f|l)?|2(?:f|l)?|f|l)?)|b(?:s|ort))|g(?:et(?:s|c(?:har)?|env|wc(?:har)?)|mtime)|r(?:int(?:f|l)?|ound(?:f|l)?|e(?:name|alloc|wind|m(?:ove|quo(?:f|l)?|ainder(?:f|l)?))|a(?:nd|ise))|b(?:search|towc)|m(?:odf(?:f|l)?|em(?:set|c(?:hr|py|mp)|move)|ktime|alloc|b(?:s(?:init|towcs|rtowcs)|towc|len|r(?:towc|len)))\\b" + +var c_cppHighlightRules = function() { + + var keywordControls = ( + "break|case|continue|default|do|else|for|goto|if|_Pragma|" + + "return|switch|while|catch|operator|try|throw|using" + ); + + var storageType = ( + "asm|__asm__|auto|bool|_Bool|char|_Complex|double|enum|float|" + + "_Imaginary|int|long|short|signed|struct|typedef|union|unsigned|void|" + + "class|wchar_t|template" + ); + + var storageModifiers = ( + "const|extern|register|restrict|static|volatile|inline|private:|" + + "protected:|public:|friend|explicit|virtual|export|mutable|typename" + ); + + var keywordOperators = ( + "and|and_eq|bitand|bitor|compl|not|not_eq|or|or_eq|typeid|xor|xor_eq" + + "const_cast|dynamic_cast|reinterpret_cast|static_cast|sizeof|namespace" + ); + + var builtinConstants = ( + "NULL|true|false|TRUE|FALSE" + ); + + var keywordMapper = this.$keywords = this.createKeywordMapper({ + "keyword.control" : keywordControls, + "storage.type" : storageType, + "storage.modifier" : storageModifiers, + "keyword.operator" : keywordOperators, + "variable.language": "this", + "constant.language": builtinConstants + }, "identifier"); + + var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\d\\$_\u00a1-\uffff]*\\b"; + + this.$rules = { + "start" : [ + { + token : "comment", + regex : "\\/\\/.*$" + }, + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment" + }, { + token : "string", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' + }, { + token : "string", // multi line string start + regex : '["].*\\\\$', + next : "qqstring" + }, { + token : "string", // single line + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" + }, { + token : "string", // multi line string start + regex : "['].*\\\\$", + next : "qstring" + }, { + token : "constant.numeric", // hex + regex : "0[xX][0-9a-fA-F]+(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\b" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\b" + }, { + token : "keyword", // pre-compiler directives + regex : "#\\s*(?:include|import|pragma|line|define|undef|if|ifdef|else|elif|ifndef)\\b", + next : "directive" + }, { + token : "keyword", // special case pre-compiler directive + regex : "(?:#\\s*endif)\\b" + }, { + token : "support.function.C99.c", + regex : cFunctions + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "keyword.operator", + regex : "!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|==|=|!=|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|new|delete|typeof|void)" + }, { + token : "punctuation.operator", + regex : "\\?|\\:|\\,|\\;|\\." + }, { + token : "paren.lparen", + regex : "[[({]" + }, { + token : "paren.rparen", + regex : "[\\])}]" + }, { + token : "text", + regex : "\\s+" + } + ], + "comment" : [ + { + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "start" + }, { + token : "comment", // comment spanning whole line + regex : ".+" + } + ], + "qqstring" : [ + { + token : "string", + regex : '(?:(?:\\\\.)|(?:[^"\\\\]))*?"', + next : "start" + }, { + token : "string", + regex : '.+' + } + ], + "qstring" : [ + { + token : "string", + regex : "(?:(?:\\\\.)|(?:[^'\\\\]))*?'", + next : "start" + }, { + token : "string", + regex : '.+' + } + ], + "directive" : [ + { + token : "constant.other.multiline", + regex : /\\/ + }, + { + token : "constant.other.multiline", + regex : /.*\\/ + }, + { + token : "constant.other", + regex : "\\s*<.+?>", + next : "start" + }, + { + token : "constant.other", // single line + regex : '\\s*["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]', + next : "start" + }, + { + token : "constant.other", // single line + regex : "\\s*['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']", + next : "start" + }, + { + token : "constant.other", + regex : /[^\\\/]+/, + next : "start" + } + ] + }; + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("start") ]); +}; + +oop.inherits(c_cppHighlightRules, TextHighlightRules); + +exports.c_cppHighlightRules = c_cppHighlightRules; +}); + +ace.define('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var line = session.getLine(row); + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i + match[0].length, 1); + } + + if (foldStyle !== "markbeginend") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + +}).call(FoldMode.prototype); + +}); diff --git a/0.0.3_0/ace/mode-ocaml.js b/0.0.3_0/ace/mode-ocaml.js new file mode 100644 index 0000000..55cec57 --- /dev/null +++ b/0.0.3_0/ace/mode-ocaml.js @@ -0,0 +1,443 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2010, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/mode/ocaml', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/ocaml_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/range'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var OcamlHighlightRules = require("./ocaml_highlight_rules").OcamlHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var Range = require("../range").Range; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new OcamlHighlightRules().getRules()); + this.$outdent = new MatchingBraceOutdent(); +}; +oop.inherits(Mode, TextMode); + +var indenter = /(?:[({[=:]|[-=]>|\b(?:else|try|with))\s*$/; + +(function() { + + this.toggleCommentLines = function(state, doc, startRow, endRow) { + var i, line; + var outdent = true; + var re = /^\s*\(\*(.*)\*\)/; + + for (i=startRow; i<= endRow; i++) { + if (!re.test(doc.getLine(i))) { + outdent = false; + break; + } + } + + var range = new Range(0, 0, 0, 0); + for (i=startRow; i<= endRow; i++) { + line = doc.getLine(i); + range.start.row = i; + range.end.row = i; + range.end.column = line.length; + + doc.replace(range, outdent ? line.match(re)[1] : "(*" + line + "*)"); + } + }; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + var tokens = this.$tokenizer.getLineTokens(line, state).tokens; + + if (!(tokens.length && tokens[tokens.length - 1].type === 'comment') && + state === 'start' && indenter.test(line)) + indent += tab; + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/ocaml_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var OcamlHighlightRules = function() { + + var keywords = ( + "and|as|assert|begin|class|constraint|do|done|downto|else|end|" + + "exception|external|for|fun|function|functor|if|in|include|" + + "inherit|initializer|lazy|let|match|method|module|mutable|new|" + + "object|of|open|or|private|rec|sig|struct|then|to|try|type|val|" + + "virtual|when|while|with" + ); + + var builtinConstants = ("true|false"); + + var builtinFunctions = ( + "abs|abs_big_int|abs_float|abs_num|abstract_tag|accept|access|acos|add|" + + "add_available_units|add_big_int|add_buffer|add_channel|add_char|" + + "add_initializer|add_int_big_int|add_interfaces|add_num|add_string|" + + "add_substitute|add_substring|alarm|allocated_bytes|allow_only|" + + "allow_unsafe_modules|always|append|appname_get|appname_set|" + + "approx_num_exp|approx_num_fix|arg|argv|arith_status|array|" + + "array1_of_genarray|array2_of_genarray|array3_of_genarray|asin|asr|" + + "assoc|assq|at_exit|atan|atan2|auto_synchronize|background|basename|" + + "beginning_of_input|big_int_of_int|big_int_of_num|big_int_of_string|bind|" + + "bind_class|bind_tag|bits|bits_of_float|black|blit|blit_image|blue|bool|" + + "bool_of_string|bounded_full_split|bounded_split|bounded_split_delim|" + + "bprintf|break|broadcast|bscanf|button_down|c_layout|capitalize|cardinal|" + + "cardinal|catch|catch_break|ceil|ceiling_num|channel|char|char_of_int|" + + "chdir|check|check_suffix|chmod|choose|chop_extension|chop_suffix|chown|" + + "chown|chr|chroot|classify_float|clear|clear_available_units|" + + "clear_close_on_exec|clear_graph|clear_nonblock|clear_parser|" + + "close|close|closeTk|close_box|close_graph|close_in|close_in_noerr|" + + "close_out|close_out_noerr|close_process|close_process|" + + "close_process_full|close_process_in|close_process_out|close_subwindow|" + + "close_tag|close_tbox|closedir|closedir|closure_tag|code|combine|" + + "combine|combine|command|compact|compare|compare_big_int|compare_num|" + + "complex32|complex64|concat|conj|connect|contains|contains_from|contents|" + + "copy|cos|cosh|count|count|counters|create|create_alarm|create_image|" + + "create_matrix|create_matrix|create_matrix|create_object|" + + "create_object_and_run_initializers|create_object_opt|create_process|" + + "create_process|create_process_env|create_process_env|create_table|" + + "current|current_dir_name|current_point|current_x|current_y|curveto|" + + "custom_tag|cyan|data_size|decr|decr_num|default_available_units|delay|" + + "delete_alarm|descr_of_in_channel|descr_of_out_channel|destroy|diff|dim|" + + "dim1|dim2|dim3|dims|dirname|display_mode|div|div_big_int|div_num|" + + "double_array_tag|double_tag|draw_arc|draw_char|draw_circle|draw_ellipse|" + + "draw_image|draw_poly|draw_poly_line|draw_rect|draw_segments|draw_string|" + + "dummy_pos|dummy_table|dump_image|dup|dup2|elements|empty|end_of_input|" + + "environment|eprintf|epsilon_float|eq_big_int|eq_num|equal|err_formatter|" + + "error_message|escaped|establish_server|executable_name|execv|execve|execvp|" + + "execvpe|exists|exists2|exit|exp|failwith|fast_sort|fchmod|fchown|field|" + + "file|file_exists|fill|fill_arc|fill_circle|fill_ellipse|fill_poly|fill_rect|" + + "filter|final_tag|finalise|find|find_all|first_chars|firstkey|flatten|" + + "float|float32|float64|float_of_big_int|float_of_bits|float_of_int|" + + "float_of_num|float_of_string|floor|floor_num|flush|flush_all|flush_input|" + + "flush_str_formatter|fold|fold_left|fold_left2|fold_right|fold_right2|" + + "for_all|for_all2|force|force_newline|force_val|foreground|fork|" + + "format_of_string|formatter_of_buffer|formatter_of_out_channel|" + + "fortran_layout|forward_tag|fprintf|frexp|from|from_channel|from_file|" + + "from_file_bin|from_function|from_string|fscanf|fst|fstat|ftruncate|" + + "full_init|full_major|full_split|gcd_big_int|ge_big_int|ge_num|" + + "genarray_of_array1|genarray_of_array2|genarray_of_array3|get|" + + "get_all_formatter_output_functions|get_approx_printing|get_copy|" + + "get_ellipsis_text|get_error_when_null_denominator|get_floating_precision|" + + "get_formatter_output_functions|get_formatter_tag_functions|get_image|" + + "get_margin|get_mark_tags|get_max_boxes|get_max_indent|get_method|" + + "get_method_label|get_normalize_ratio|get_normalize_ratio_when_printing|" + + "get_print_tags|get_state|get_variable|getcwd|getegid|getegid|getenv|" + + "getenv|getenv|geteuid|geteuid|getgid|getgid|getgrgid|getgrgid|getgrnam|" + + "getgrnam|getgroups|gethostbyaddr|gethostbyname|gethostname|getitimer|" + + "getlogin|getpeername|getpid|getppid|getprotobyname|getprotobynumber|" + + "getpwnam|getpwuid|getservbyname|getservbyport|getsockname|getsockopt|" + + "getsockopt_float|getsockopt_int|getsockopt_optint|gettimeofday|getuid|" + + "global_replace|global_substitute|gmtime|green|grid|group_beginning|" + + "group_end|gt_big_int|gt_num|guard|handle_unix_error|hash|hash_param|" + + "hd|header_size|i|id|ignore|in_channel_length|in_channel_of_descr|incr|" + + "incr_num|index|index_from|inet_addr_any|inet_addr_of_string|infinity|" + + "infix_tag|init|init_class|input|input_binary_int|input_byte|input_char|" + + "input_line|input_value|int|int16_signed|int16_unsigned|int32|int64|" + + "int8_signed|int8_unsigned|int_of_big_int|int_of_char|int_of_float|" + + "int_of_num|int_of_string|integer_num|inter|interactive|inv|invalid_arg|" + + "is_block|is_empty|is_implicit|is_int|is_int_big_int|is_integer_num|" + + "is_relative|iter|iter2|iteri|join|junk|key_pressed|kill|kind|kprintf|" + + "kscanf|land|last_chars|layout|lazy_from_fun|lazy_from_val|lazy_is_val|" + + "lazy_tag|ldexp|le_big_int|le_num|length|lexeme|lexeme_char|lexeme_end|" + + "lexeme_end_p|lexeme_start|lexeme_start_p|lineto|link|list|listen|lnot|" + + "loadfile|loadfile_private|localtime|lock|lockf|log|log10|logand|lognot|" + + "logor|logxor|lor|lower_window|lowercase|lseek|lsl|lsr|lstat|lt_big_int|" + + "lt_num|lxor|magenta|magic|mainLoop|major|major_slice|make|make_formatter|" + + "make_image|make_lexer|make_matrix|make_self_init|map|map2|map_file|mapi|" + + "marshal|match_beginning|match_end|matched_group|matched_string|max|" + + "max_array_length|max_big_int|max_elt|max_float|max_int|max_num|" + + "max_string_length|mem|mem_assoc|mem_assq|memq|merge|min|min_big_int|" + + "min_elt|min_float|min_int|min_num|minor|minus_big_int|minus_num|" + + "minus_one|mkdir|mkfifo|mktime|mod|mod_big_int|mod_float|mod_num|modf|" + + "mouse_pos|moveto|mul|mult_big_int|mult_int_big_int|mult_num|nan|narrow|" + + "nat_of_num|nativeint|neg|neg_infinity|new_block|new_channel|new_method|" + + "new_variable|next|nextkey|nice|nice|no_scan_tag|norm|norm2|not|npeek|" + + "nth|nth_dim|num_digits_big_int|num_dims|num_of_big_int|num_of_int|" + + "num_of_nat|num_of_ratio|num_of_string|O|obj|object_tag|ocaml_version|" + + "of_array|of_channel|of_float|of_int|of_int32|of_list|of_nativeint|" + + "of_string|one|openTk|open_box|open_connection|open_graph|open_hbox|" + + "open_hovbox|open_hvbox|open_in|open_in_bin|open_in_gen|open_out|" + + "open_out_bin|open_out_gen|open_process|open_process_full|open_process_in|" + + "open_process_out|open_subwindow|open_tag|open_tbox|open_temp_file|" + + "open_vbox|opendbm|opendir|openfile|or|os_type|out_channel_length|" + + "out_channel_of_descr|output|output_binary_int|output_buffer|output_byte|" + + "output_char|output_string|output_value|over_max_boxes|pack|params|" + + "parent_dir_name|parse|parse_argv|partition|pause|peek|pipe|pixels|" + + "place|plot|plots|point_color|polar|poll|pop|pos_in|pos_out|pow|" + + "power_big_int_positive_big_int|power_big_int_positive_int|" + + "power_int_positive_big_int|power_int_positive_int|power_num|" + + "pp_close_box|pp_close_tag|pp_close_tbox|pp_force_newline|" + + "pp_get_all_formatter_output_functions|pp_get_ellipsis_text|" + + "pp_get_formatter_output_functions|pp_get_formatter_tag_functions|" + + "pp_get_margin|pp_get_mark_tags|pp_get_max_boxes|pp_get_max_indent|" + + "pp_get_print_tags|pp_open_box|pp_open_hbox|pp_open_hovbox|pp_open_hvbox|" + + "pp_open_tag|pp_open_tbox|pp_open_vbox|pp_over_max_boxes|pp_print_as|" + + "pp_print_bool|pp_print_break|pp_print_char|pp_print_cut|pp_print_float|" + + "pp_print_flush|pp_print_if_newline|pp_print_int|pp_print_newline|" + + "pp_print_space|pp_print_string|pp_print_tab|pp_print_tbreak|" + + "pp_set_all_formatter_output_functions|pp_set_ellipsis_text|" + + "pp_set_formatter_out_channel|pp_set_formatter_output_functions|" + + "pp_set_formatter_tag_functions|pp_set_margin|pp_set_mark_tags|" + + "pp_set_max_boxes|pp_set_max_indent|pp_set_print_tags|pp_set_tab|" + + "pp_set_tags|pred|pred_big_int|pred_num|prerr_char|prerr_endline|" + + "prerr_float|prerr_int|prerr_newline|prerr_string|print|print_as|" + + "print_bool|print_break|print_char|print_cut|print_endline|print_float|" + + "print_flush|print_if_newline|print_int|print_newline|print_space|" + + "print_stat|print_string|print_tab|print_tbreak|printf|prohibit|" + + "public_method_label|push|putenv|quo_num|quomod_big_int|quote|raise|" + + "raise_window|ratio_of_num|rcontains_from|read|read_float|read_int|" + + "read_key|read_line|readdir|readdir|readlink|really_input|receive|recv|" + + "recvfrom|red|ref|regexp|regexp_case_fold|regexp_string|" + + "regexp_string_case_fold|register|register_exception|rem|remember_mode|" + + "remove|remove_assoc|remove_assq|rename|replace|replace_first|" + + "replace_matched|repr|reset|reshape|reshape_1|reshape_2|reshape_3|rev|" + + "rev_append|rev_map|rev_map2|rewinddir|rgb|rhs_end|rhs_end_pos|rhs_start|" + + "rhs_start_pos|rindex|rindex_from|rlineto|rmdir|rmoveto|round_num|" + + "run_initializers|run_initializers_opt|scanf|search_backward|" + + "search_forward|seek_in|seek_out|select|self|self_init|send|sendto|set|" + + "set_all_formatter_output_functions|set_approx_printing|" + + "set_binary_mode_in|set_binary_mode_out|set_close_on_exec|" + + "set_close_on_exec|set_color|set_ellipsis_text|" + + "set_error_when_null_denominator|set_field|set_floating_precision|" + + "set_font|set_formatter_out_channel|set_formatter_output_functions|" + + "set_formatter_tag_functions|set_line_width|set_margin|set_mark_tags|" + + "set_max_boxes|set_max_indent|set_method|set_nonblock|set_nonblock|" + + "set_normalize_ratio|set_normalize_ratio_when_printing|set_print_tags|" + + "set_signal|set_state|set_tab|set_tag|set_tags|set_text_size|" + + "set_window_title|setgid|setgid|setitimer|setitimer|setsid|setsid|" + + "setsockopt|setsockopt|setsockopt_float|setsockopt_float|setsockopt_int|" + + "setsockopt_int|setsockopt_optint|setsockopt_optint|setuid|setuid|" + + "shift_left|shift_left|shift_left|shift_right|shift_right|shift_right|" + + "shift_right_logical|shift_right_logical|shift_right_logical|show_buckets|" + + "shutdown|shutdown|shutdown_connection|shutdown_connection|sigabrt|" + + "sigalrm|sigchld|sigcont|sigfpe|sighup|sigill|sigint|sigkill|sign_big_int|" + + "sign_num|signal|signal|sigpending|sigpending|sigpipe|sigprocmask|" + + "sigprocmask|sigprof|sigquit|sigsegv|sigstop|sigsuspend|sigsuspend|" + + "sigterm|sigtstp|sigttin|sigttou|sigusr1|sigusr2|sigvtalrm|sin|singleton|" + + "sinh|size|size|size_x|size_y|sleep|sleep|sleep|slice_left|slice_left|" + + "slice_left_1|slice_left_2|slice_right|slice_right|slice_right_1|" + + "slice_right_2|snd|socket|socket|socket|socketpair|socketpair|sort|sound|" + + "split|split_delim|sprintf|sprintf|sqrt|sqrt|sqrt_big_int|square_big_int|" + + "square_num|sscanf|stable_sort|stable_sort|stable_sort|stable_sort|stable_sort|" + + "stable_sort|stat|stat|stat|stat|stat|stats|stats|std_formatter|stdbuf|" + + "stderr|stderr|stderr|stdib|stdin|stdin|stdin|stdout|stdout|stdout|" + + "str_formatter|string|string_after|string_before|string_match|" + + "string_of_big_int|string_of_bool|string_of_float|string_of_format|" + + "string_of_inet_addr|string_of_inet_addr|string_of_int|string_of_num|" + + "string_partial_match|string_tag|sub|sub|sub_big_int|sub_left|sub_num|" + + "sub_right|subset|subset|substitute_first|substring|succ|succ|" + + "succ|succ|succ_big_int|succ_num|symbol_end|symbol_end_pos|symbol_start|" + + "symbol_start_pos|symlink|symlink|sync|synchronize|system|system|system|" + + "tag|take|tan|tanh|tcdrain|tcdrain|tcflow|tcflow|tcflush|tcflush|" + + "tcgetattr|tcgetattr|tcsendbreak|tcsendbreak|tcsetattr|tcsetattr|" + + "temp_file|text_size|time|time|time|timed_read|timed_write|times|times|" + + "tl|tl|tl|to_buffer|to_channel|to_float|to_hex|to_int|to_int32|to_list|" + + "to_list|to_list|to_nativeint|to_string|to_string|to_string|to_string|" + + "to_string|top|top|total_size|transfer|transp|truncate|truncate|truncate|" + + "truncate|truncate|truncate|try_lock|umask|umask|uncapitalize|uncapitalize|" + + "uncapitalize|union|union|unit_big_int|unlink|unlink|unlock|unmarshal|" + + "unsafe_blit|unsafe_fill|unsafe_get|unsafe_get|unsafe_set|unsafe_set|" + + "update|uppercase|uppercase|uppercase|uppercase|usage|utimes|utimes|wait|" + + "wait|wait|wait|wait_next_event|wait_pid|wait_read|wait_signal|" + + "wait_timed_read|wait_timed_write|wait_write|waitpid|white|" + + "widen|window_id|word_size|wrap|wrap_abort|write|yellow|yield|zero|zero_big_int|" + + + "Arg|Arith_status|Array|Array1|Array2|Array3|ArrayLabels|Big_int|Bigarray|" + + "Buffer|Callback|CamlinternalOO|Char|Complex|Condition|Dbm|Digest|Dynlink|" + + "Event|Filename|Format|Gc|Genarray|Genlex|Graphics|GraphicsX11|Hashtbl|" + + "Int32|Int64|LargeFile|Lazy|Lexing|List|ListLabels|Make|Map|Marshal|" + + "MoreLabels|Mutex|Nativeint|Num|Obj|Oo|Parsing|Pervasives|Printexc|" + + "Printf|Queue|Random|Scanf|Scanning|Set|Sort|Stack|State|StdLabels|Str|" + + "Stream|String|StringLabels|Sys|Thread|ThreadUnix|Tk|Unix|UnixLabels|Weak" + ); + + var keywordMapper = this.createKeywordMapper({ + "variable.language": "this", + "keyword": keywords, + "constant.language": builtinConstants, + "support.function": builtinFunctions + }, "identifier"); + + var decimalInteger = "(?:(?:[1-9]\\d*)|(?:0))"; + var octInteger = "(?:0[oO]?[0-7]+)"; + var hexInteger = "(?:0[xX][\\dA-Fa-f]+)"; + var binInteger = "(?:0[bB][01]+)"; + var integer = "(?:" + decimalInteger + "|" + octInteger + "|" + hexInteger + "|" + binInteger + ")"; + + var exponent = "(?:[eE][+-]?\\d+)"; + var fraction = "(?:\\.\\d+)"; + var intPart = "(?:\\d+)"; + var pointFloat = "(?:(?:" + intPart + "?" + fraction + ")|(?:" + intPart + "\\.))"; + var exponentFloat = "(?:(?:" + pointFloat + "|" + intPart + ")" + exponent + ")"; + var floatNumber = "(?:" + exponentFloat + "|" + pointFloat + ")"; + + this.$rules = { + "start" : [ + { + token : "comment", + regex : '\\(\\*.*?\\*\\)\\s*?$' + }, + { + token : "comment", + regex : '\\(\\*.*', + next : "comment" + }, + { + token : "string", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' + }, + { + token : "string", // single char + regex : "'.'" + }, + { + token : "string", // " string + regex : '"', + next : "qstring" + }, + { + token : "constant.numeric", // imaginary + regex : "(?:" + floatNumber + "|\\d+)[jJ]\\b" + }, + { + token : "constant.numeric", // float + regex : floatNumber + }, + { + token : "constant.numeric", // integer + regex : integer + "\\b" + }, + { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, + { + token : "keyword.operator", + regex : "\\+\\.|\\-\\.|\\*\\.|\\/\\.|#|;;|\\+|\\-|\\*|\\*\\*\\/|\\/\\/|%|<<|>>|&|\\||\\^|~|<|>|<=|=>|==|!=|<>|<-|=" + }, + { + token : "paren.lparen", + regex : "[[({]" + }, + { + token : "paren.rparen", + regex : "[\\])}]" + }, + { + token : "text", + regex : "\\s+" + } + ], + "comment" : [ + { + token : "comment", // closing comment + regex : ".*?\\*\\)", + next : "start" + }, + { + token : "comment", // comment spanning whole line + regex : ".+" + } + ], + + "qstring" : [ + { + token : "string", + regex : '"', + next : "start" + }, { + token : "string", + regex : '.+' + } + ] + }; +}; + +oop.inherits(OcamlHighlightRules, TextHighlightRules); + +exports.OcamlHighlightRules = OcamlHighlightRules; +}); + +ace.define('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) { + + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); diff --git a/0.0.3_0/ace/mode-pascal.js b/0.0.3_0/ace/mode-pascal.js new file mode 100644 index 0000000..7a9c092 --- /dev/null +++ b/0.0.3_0/ace/mode-pascal.js @@ -0,0 +1,233 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2012, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * + * Contributor(s): + * + * + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/mode/pascal', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/pascal_highlight_rules', 'ace/mode/folding/coffee'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var PascalHighlightRules = require("./pascal_highlight_rules").PascalHighlightRules; +var FoldMode = require("./folding/coffee").FoldMode; + +var Mode = function() { + var highlighter = new PascalHighlightRules(); + this.foldingRules = new FoldMode(); + this.$tokenizer = new Tokenizer(highlighter.getRules()); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = ["--", "//"]; + this.blockComment = [ + {start: "(*", end: "*)"}, + {start: "{", end: "}"} + ]; + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/pascal_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var PascalHighlightRules = function() { + + this.$rules = { start: + [ { caseInsensitive: true, + token: 'keyword.control.pascal', + regex: '\\b(?:(absolute|abstract|all|and|and_then|array|as|asm|attribute|begin|bindable|case|class|const|constructor|destructor|div|do|do|else|end|except|export|exports|external|far|file|finalization|finally|for|forward|goto|if|implementation|import|in|inherited|initialization|interface|interrupt|is|label|library|mod|module|name|near|nil|not|object|of|only|operator|or|or_else|otherwise|packed|pow|private|program|property|protected|public|published|qualified|record|repeat|resident|restricted|segment|set|shl|shr|then|to|try|type|unit|until|uses|value|var|view|virtual|while|with|xor))\\b' }, + { caseInsensitive: true, + token: + [ 'variable.pascal', "text", + 'storage.type.prototype.pascal', + 'entity.name.function.prototype.pascal' ], + regex: '\\b(function|procedure)(\\s+)(\\w+)(\\.\\w+)?(?=(?:\\(.*?\\))?;\\s*(?:attribute|forward|external))' }, + { caseInsensitive: true, + token: + [ 'variable.pascal', "text", + 'storage.type.function.pascal', + 'entity.name.function.pascal' ], + regex: '\\b(function|procedure)(\\s+)(\\w+)(\\.\\w+)?' }, + { token: 'constant.numeric.pascal', + regex: '\\b((0(x|X)[0-9a-fA-F]*)|(([0-9]+\\.?[0-9]*)|(\\.[0-9]+))((e|E)(\\+|-)?[0-9]+)?)(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\b' }, + { token: 'punctuation.definition.comment.pascal', + regex: '--.*$', + push_: + [ { token: 'comment.line.double-dash.pascal.one', + regex: '$', + next: 'pop' }, + { defaultToken: 'comment.line.double-dash.pascal.one' } ] }, + { token: 'punctuation.definition.comment.pascal', + regex: '//.*$', + push_: + [ { token: 'comment.line.double-slash.pascal.two', + regex: '$', + next: 'pop' }, + { defaultToken: 'comment.line.double-slash.pascal.two' } ] }, + { token: 'punctuation.definition.comment.pascal', + regex: '\\(\\*', + push: + [ { token: 'punctuation.definition.comment.pascal', + regex: '\\*\\)', + next: 'pop' }, + { defaultToken: 'comment.block.pascal.one' } ] }, + { token: 'punctuation.definition.comment.pascal', + regex: '\\{', + push: + [ { token: 'punctuation.definition.comment.pascal', + regex: '\\}', + next: 'pop' }, + { defaultToken: 'comment.block.pascal.two' } ] }, + { token: 'punctuation.definition.string.begin.pascal', + regex: '"', + push: + [ { token: 'constant.character.escape.pascal', regex: '\\\\.' }, + { token: 'punctuation.definition.string.end.pascal', + regex: '"', + next: 'pop' }, + { defaultToken: 'string.quoted.double.pascal' } ], + }, + { token: 'punctuation.definition.string.begin.pascal', + regex: '\'', + push: + [ { token: 'constant.character.escape.apostrophe.pascal', + regex: '\'\'' }, + { token: 'punctuation.definition.string.end.pascal', + regex: '\'', + next: 'pop' }, + { defaultToken: 'string.quoted.single.pascal' } ] }, + { token: 'keyword.operator', + regex: '[+\\-;,/*%]|:=|=' } ] } + + this.normalizeRules(); +}; + +oop.inherits(PascalHighlightRules, TextHighlightRules); + +exports.PascalHighlightRules = PascalHighlightRules; +}); + +ace.define('ace/mode/folding/coffee', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/folding/fold_mode', 'ace/range'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var BaseFoldMode = require("./fold_mode").FoldMode; +var Range = require("../../range").Range; + +var FoldMode = exports.FoldMode = function() {}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var range = this.indentationBlock(session, row); + if (range) + return range; + + var re = /\S/; + var line = session.getLine(row); + var startLevel = line.search(re); + if (startLevel == -1 || line[startLevel] != "#") + return; + + var startColumn = line.length; + var maxRow = session.getLength(); + var startRow = row; + var endRow = row; + + while (++row < maxRow) { + line = session.getLine(row); + var level = line.search(re); + + if (level == -1) + continue; + + if (line[level] != "#") + break; + + endRow = row; + } + + if (endRow > startRow) { + var endColumn = session.getLine(endRow).length; + return new Range(startRow, startColumn, endRow, endColumn); + } + }; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + var indent = line.search(/\S/); + var next = session.getLine(row + 1); + var prev = session.getLine(row - 1); + var prevIndent = prev.search(/\S/); + var nextIndent = next.search(/\S/); + + if (indent == -1) { + session.foldWidgets[row - 1] = prevIndent!= -1 && prevIndent < nextIndent ? "start" : ""; + return ""; + } + if (prevIndent == -1) { + if (indent == nextIndent && line[indent] == "#" && next[indent] == "#") { + session.foldWidgets[row - 1] = ""; + session.foldWidgets[row + 1] = ""; + return "start"; + } + } else if (prevIndent == indent && line[indent] == "#" && prev[indent] == "#") { + if (session.getLine(row - 2).search(/\S/) == -1) { + session.foldWidgets[row - 1] = "start"; + session.foldWidgets[row + 1] = ""; + return ""; + } + } + + if (prevIndent!= -1 && prevIndent < indent) + session.foldWidgets[row - 1] = "start"; + else + session.foldWidgets[row - 1] = ""; + + if (indent < nextIndent) + return "start"; + else + return ""; + }; + +}).call(FoldMode.prototype); + +}); diff --git a/0.0.3_0/ace/mode-perl.js b/0.0.3_0/ace/mode-perl.js new file mode 100644 index 0000000..b20bb61 --- /dev/null +++ b/0.0.3_0/ace/mode-perl.js @@ -0,0 +1,316 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2010, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/mode/perl', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/perl_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/range', 'ace/mode/folding/cstyle'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var PerlHighlightRules = require("./perl_highlight_rules").PerlHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var Range = require("../range").Range; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new PerlHighlightRules().getRules()); + this.$outdent = new MatchingBraceOutdent(); + this.foldingRules = new CStyleFoldMode({start: "^=(begin|item)\\b", end: "^=(cut)\\b"}); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "#"; + this.blockComment = [ + {start: "=begin", end: "=cut"}, + {start: "=item", end: "=cut"} + ]; + + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.$tokenizer.getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start") { + var match = line.match(/^.*[\{\(\[\:]\s*$/); + if (match) { + indent += tab; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/perl_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var PerlHighlightRules = function() { + + var keywords = ( + "base|constant|continue|else|elsif|for|foreach|format|goto|if|last|local|my|next|" + + "no|package|parent|redo|require|scalar|sub|unless|until|while|use|vars" + ); + + var buildinConstants = ("ARGV|ENV|INC|SIG"); + + var builtinFunctions = ( + "getprotobynumber|getprotobyname|getservbyname|gethostbyaddr|" + + "gethostbyname|getservbyport|getnetbyaddr|getnetbyname|getsockname|" + + "getpeername|setpriority|getprotoent|setprotoent|getpriority|" + + "endprotoent|getservent|setservent|endservent|sethostent|socketpair|" + + "getsockopt|gethostent|endhostent|setsockopt|setnetent|quotemeta|" + + "localtime|prototype|getnetent|endnetent|rewinddir|wantarray|getpwuid|" + + "closedir|getlogin|readlink|endgrent|getgrgid|getgrnam|shmwrite|" + + "shutdown|readline|endpwent|setgrent|readpipe|formline|truncate|" + + "dbmclose|syswrite|setpwent|getpwnam|getgrent|getpwent|ucfirst|sysread|" + + "setpgrp|shmread|sysseek|sysopen|telldir|defined|opendir|connect|" + + "lcfirst|getppid|binmode|syscall|sprintf|getpgrp|readdir|seekdir|" + + "waitpid|reverse|unshift|symlink|dbmopen|semget|msgrcv|rename|listen|" + + "chroot|msgsnd|shmctl|accept|unpack|exists|fileno|shmget|system|" + + "unlink|printf|gmtime|msgctl|semctl|values|rindex|substr|splice|" + + "length|msgget|select|socket|return|caller|delete|alarm|ioctl|index|" + + "undef|lstat|times|srand|chown|fcntl|close|write|umask|rmdir|study|" + + "sleep|chomp|untie|print|utime|mkdir|atan2|split|crypt|flock|chmod|" + + "BEGIN|bless|chdir|semop|shift|reset|link|stat|chop|grep|fork|dump|" + + "join|open|tell|pipe|exit|glob|warn|each|bind|sort|pack|eval|push|" + + "keys|getc|kill|seek|sqrt|send|wait|rand|tied|read|time|exec|recv|" + + "eof|chr|int|ord|exp|pos|pop|sin|log|abs|oct|hex|tie|cos|vec|END|ref|" + + "map|die|uc|lc|do" + ); + + var keywordMapper = this.createKeywordMapper({ + "keyword": keywords, + "constant.language": buildinConstants, + "support.function": builtinFunctions + }, "identifier"); + + this.$rules = { + "start" : [ + { + token : "comment", + regex : "#.*$" + }, { + token : "comment.doc", + regex : "^=(?:begin|item)\\b", + next : "block_comment" + }, { + token : "string.regexp", + regex : "[/](?:(?:\\[(?:\\\\]|[^\\]])+\\])|(?:\\\\/|[^\\]/]))*[/]\\w*\\s*(?=[).,;]|$)" + }, { + token : "string", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' + }, { + token : "string", // multi line string start + regex : '["].*\\\\$', + next : "qqstring" + }, { + token : "string", // single line + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" + }, { + token : "string", // multi line string start + regex : "['].*\\\\$", + next : "qstring" + }, { + token : "constant.numeric", // hex + regex : "0x[0-9a-fA-F]+\\b" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "keyword.operator", + regex : "\\.\\.\\.|\\|\\|=|>>=|<<=|<=>|&&=|=>|!~|\\^=|&=|\\|=|\\.=|x=|%=|\\/=|\\*=|\\-=|\\+=|=~|\\*\\*|\\-\\-|\\.\\.|\\|\\||&&|\\+\\+|\\->|!=|==|>=|<=|>>|<<|,|=|\\?\\:|\\^|\\||x|%|\\/|\\*|<|&|\\\\|~|!|>|\\.|\\-|\\+|\\-C|\\-b|\\-S|\\-u|\\-t|\\-p|\\-l|\\-d|\\-f|\\-g|\\-s|\\-z|\\-k|\\-e|\\-O|\\-T|\\-B|\\-M|\\-A|\\-X|\\-W|\\-c|\\-R|\\-o|\\-x|\\-w|\\-r|\\b(?:and|cmp|eq|ge|gt|le|lt|ne|not|or|xor)" + }, { + token : "lparen", + regex : "[[({]" + }, { + token : "rparen", + regex : "[\\])}]" + }, { + token : "text", + regex : "\\s+" + } + ], + "qqstring" : [ + { + token : "string", + regex : '(?:(?:\\\\.)|(?:[^"\\\\]))*?"', + next : "start" + }, { + token : "string", + regex : '.+' + } + ], + "qstring" : [ + { + token : "string", + regex : "(?:(?:\\\\.)|(?:[^'\\\\]))*?'", + next : "start" + }, { + token : "string", + regex : '.+' + } + ], + "block_comment": [ + { + token: "comment.doc", + regex: "^=cut\\b", + next: "start" + }, + { + defaultToken: "comment.doc" + } + ] + }; +}; + +oop.inherits(PerlHighlightRules, TextHighlightRules); + +exports.PerlHighlightRules = PerlHighlightRules; +}); + +ace.define('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) { + + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var line = session.getLine(row); + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i + match[0].length, 1); + } + + if (foldStyle !== "markbeginend") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + +}).call(FoldMode.prototype); + +}); diff --git a/0.0.3_0/ace/mode-pgsql.js b/0.0.3_0/ace/mode-pgsql.js new file mode 100644 index 0000000..c6a4538 --- /dev/null +++ b/0.0.3_0/ace/mode-pgsql.js @@ -0,0 +1,929 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2010, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/mode/pgsql', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/pgsql_highlight_rules', 'ace/range'], function(require, exports, module) { + +var oop = require("../lib/oop"); +var TextMode = require("../mode/text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var PgsqlHighlightRules = require("./pgsql_highlight_rules").PgsqlHighlightRules; +var Range = require("../range").Range; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new PgsqlHighlightRules().getRules()); +}; +oop.inherits(Mode, TextMode); + +(function() { + this.lineCommentStart = "--"; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + if (state == "start" || state == "keyword.statementEnd") { + return ""; + } else { + return this.$getIndent(line); // Keep whatever indent the previous line has + } + } + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/pgsql_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/doc_comment_highlight_rules', 'ace/mode/text_highlight_rules', 'ace/mode/perl_highlight_rules', 'ace/mode/python_highlight_rules'], function(require, exports, module) { + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var PerlHighlightRules = require("./perl_highlight_rules").PerlHighlightRules; +var PythonHighlightRules = require("./python_highlight_rules").PythonHighlightRules; + +var PgsqlHighlightRules = function() { + var keywords = ( + "abort|absolute|abstime|access|aclitem|action|add|admin|after|aggregate|all|also|alter|always|" + + "analyse|analyze|and|any|anyarray|anyelement|anyenum|anynonarray|array|as|asc|assertion|" + + "assignment|asymmetric|at|attribute|authorization|backward|before|begin|between|bigint|" + + "binary|bit|bool|boolean|both|box|bpchar|by|bytea|cache|called|cascade|cascaded|case|cast|" + + "catalog|chain|char|character|characteristics|check|checkpoint|cid|cidr|circle|class|close|" + + "cluster|coalesce|collate|collation|column|comment|comments|commit|committed|concurrently|" + + "configuration|connection|constraint|constraints|content|continue|conversion|copy|cost|" + + "create|cross|cstring|csv|current|current_catalog|current_date|current_role|" + + "current_schema|current_time|current_timestamp|current_user|cursor|cycle|data|database|" + + "date|day|deallocate|dec|decimal|declare|default|defaults|deferrable|deferred|definer|delete|" + + "delimiter|delimiters|desc|dictionary|disable|discard|distinct|do|document|domain|double|" + + "drop|each|else|enable|encoding|encrypted|end|enum|escape|except|exclude|excluding|exclusive|" + + "execute|exists|explain|extension|external|extract|false|family|fdw_handler|fetch|first|" + + "float|float4|float8|following|for|force|foreign|forward|freeze|from|full|function|functions|" + + "global|grant|granted|greatest|group|gtsvector|handler|having|header|hold|hour|identity|if|" + + "ilike|immediate|immutable|implicit|in|including|increment|index|indexes|inet|inherit|" + + "inherits|initially|inline|inner|inout|input|insensitive|insert|instead|int|int2|int2vector|" + + "int4|int8|integer|internal|intersect|interval|into|invoker|is|isnull|isolation|join|key|label|" + + "language|language_handler|large|last|lc_collate|lc_ctype|leading|least|left|level|like|" + + "limit|line|listen|load|local|localtime|localtimestamp|location|lock|lseg|macaddr|mapping|" + + "match|maxvalue|minute|minvalue|mode|money|month|move|name|names|national|natural|nchar|next|no|" + + "none|not|nothing|notify|notnull|nowait|null|nullif|nulls|numeric|object|of|off|offset|oid|oids|" + + "oidvector|on|only|opaque|operator|option|options|or|order|out|outer|over|overlaps|overlay|" + + "owned|owner|parser|partial|partition|passing|password|path|pg_attribute|pg_auth_members|" + + "pg_authid|pg_class|pg_database|pg_node_tree|pg_proc|pg_type|placing|plans|point|polygon|" + + "position|preceding|precision|prepare|prepared|preserve|primary|prior|privileges|" + + "procedural|procedure|quote|range|read|real|reassign|recheck|record|recursive|ref|refcursor|" + + "references|regclass|regconfig|regdictionary|regoper|regoperator|regproc|regprocedure|" + + "regtype|reindex|relative|release|reltime|rename|repeatable|replace|replica|reset|restart|" + + "restrict|returning|returns|revoke|right|role|rollback|row|rows|rule|savepoint|schema|scroll|" + + "search|second|security|select|sequence|sequences|serializable|server|session|session_user|" + + "set|setof|share|show|similar|simple|smallint|smgr|some|stable|standalone|start|statement|" + + "statistics|stdin|stdout|storage|strict|strip|substring|symmetric|sysid|system|table|tables|" + + "tablespace|temp|template|temporary|text|then|tid|time|timestamp|timestamptz|timetz|" + + "tinterval|to|trailing|transaction|treat|trigger|trim|true|truncate|trusted|tsquery|tsvector|" + + "txid_snapshot|type|unbounded|uncommitted|unencrypted|union|unique|unknown|unlisten|" + + "unlogged|until|update|user|using|uuid|vacuum|valid|validate|validator|value|values|varbit|" + + "varchar|variadic|varying|verbose|version|view|void|volatile|when|where|whitespace|window|" + + "with|without|work|wrapper|write|xid|xml|xmlattributes|xmlconcat|xmlelement|xmlexists|" + + "xmlforest|xmlparse|xmlpi|xmlroot|xmlserialize|year|yes|zone" + ); + + + var builtinFunctions = ( + "RI_FKey_cascade_del|RI_FKey_cascade_upd|RI_FKey_check_ins|RI_FKey_check_upd|" + + "RI_FKey_noaction_del|RI_FKey_noaction_upd|RI_FKey_restrict_del|RI_FKey_restrict_upd|" + + "RI_FKey_setdefault_del|RI_FKey_setdefault_upd|RI_FKey_setnull_del|" + + "RI_FKey_setnull_upd|abbrev|abs|abstime|abstimeeq|abstimege|abstimegt|abstimein|abstimele|" + + "abstimelt|abstimene|abstimeout|abstimerecv|abstimesend|aclcontains|aclexplode|aclinsert|" + + "aclitemeq|aclitemin|aclitemout|aclremove|acos|age|any_in|any_out|anyarray_in|anyarray_out|" + + "anyarray_recv|anyarray_send|anyelement_in|anyelement_out|anyenum_in|anyenum_out|" + + "anynonarray_in|anynonarray_out|anytextcat|area|areajoinsel|areasel|array_agg|" + + "array_agg_finalfn|array_agg_transfn|array_append|array_cat|array_dims|array_eq|" + + "array_fill|array_ge|array_gt|array_in|array_larger|array_le|array_length|array_lower|" + + "array_lt|array_ndims|array_ne|array_out|array_prepend|array_recv|array_send|" + + "array_smaller|array_to_string|array_upper|arraycontained|arraycontains|arrayoverlap|" + + "ascii|ascii_to_mic|ascii_to_utf8|asin|atan|atan2|avg|big5_to_euc_tw|big5_to_mic|" + + "big5_to_utf8|bit_and|bit_in|bit_length|bit_or|bit_out|bit_recv|bit_send|bitand|bitcat|" + + "bitcmp|biteq|bitge|bitgt|bitle|bitlt|bitne|bitnot|bitor|bitshiftleft|bitshiftright|" + + "bittypmodin|bittypmodout|bitxor|bool|bool_and|bool_or|booland_statefunc|booleq|boolge|" + + "boolgt|boolin|boolle|boollt|boolne|boolor_statefunc|boolout|boolrecv|boolsend|box|" + + "box_above|box_above_eq|box_add|box_below|box_below_eq|box_center|box_contain|" + + "box_contain_pt|box_contained|box_distance|box_div|box_eq|box_ge|box_gt|box_in|" + + "box_intersect|box_le|box_left|box_lt|box_mul|box_out|box_overabove|box_overbelow|" + + "box_overlap|box_overleft|box_overright|box_recv|box_right|box_same|box_send|box_sub|" + + "bpchar_larger|bpchar_pattern_ge|bpchar_pattern_gt|bpchar_pattern_le|" + + "bpchar_pattern_lt|bpchar_smaller|bpcharcmp|bpchareq|bpcharge|bpchargt|bpchariclike|" + + "bpcharicnlike|bpcharicregexeq|bpcharicregexne|bpcharin|bpcharle|bpcharlike|bpcharlt|" + + "bpcharne|bpcharnlike|bpcharout|bpcharrecv|bpcharregexeq|bpcharregexne|bpcharsend|" + + "bpchartypmodin|bpchartypmodout|broadcast|btabstimecmp|btarraycmp|btbeginscan|btboolcmp|" + + "btbpchar_pattern_cmp|btbuild|btbuildempty|btbulkdelete|btcharcmp|btcostestimate|" + + "btendscan|btfloat48cmp|btfloat4cmp|btfloat84cmp|btfloat8cmp|btgetbitmap|btgettuple|" + + "btinsert|btint24cmp|btint28cmp|btint2cmp|btint42cmp|btint48cmp|btint4cmp|btint82cmp|" + + "btint84cmp|btint8cmp|btmarkpos|btnamecmp|btoidcmp|btoidvectorcmp|btoptions|btrecordcmp|" + + "btreltimecmp|btrescan|btrestrpos|btrim|bttext_pattern_cmp|bttextcmp|bttidcmp|" + + "bttintervalcmp|btvacuumcleanup|byteacat|byteacmp|byteaeq|byteage|byteagt|byteain|byteale|" + + "bytealike|bytealt|byteane|byteanlike|byteaout|bytearecv|byteasend|cash_cmp|cash_div_cash|" + + "cash_div_flt4|cash_div_flt8|cash_div_int2|cash_div_int4|cash_eq|cash_ge|cash_gt|cash_in|" + + "cash_le|cash_lt|cash_mi|cash_mul_flt4|cash_mul_flt8|cash_mul_int2|cash_mul_int4|cash_ne|" + + "cash_out|cash_pl|cash_recv|cash_send|cash_words|cashlarger|cashsmaller|cbrt|ceil|ceiling|" + + "center|char|char_length|character_length|chareq|charge|chargt|charin|charle|charlt|charne|" + + "charout|charrecv|charsend|chr|cideq|cidin|cidout|cidr|cidr_in|cidr_out|cidr_recv|cidr_send|" + + "cidrecv|cidsend|circle|circle_above|circle_add_pt|circle_below|circle_center|" + + "circle_contain|circle_contain_pt|circle_contained|circle_distance|circle_div_pt|" + + "circle_eq|circle_ge|circle_gt|circle_in|circle_le|circle_left|circle_lt|circle_mul_pt|" + + "circle_ne|circle_out|circle_overabove|circle_overbelow|circle_overlap|circle_overleft|" + + "circle_overright|circle_recv|circle_right|circle_same|circle_send|circle_sub_pt|" + + "clock_timestamp|close_lb|close_ls|close_lseg|close_pb|close_pl|close_ps|close_sb|" + + "close_sl|col_description|concat|concat_ws|contjoinsel|contsel|convert|convert_from|" + + "convert_to|corr|cos|cot|count|covar_pop|covar_samp|cstring_in|cstring_out|cstring_recv|" + + "cstring_send|cume_dist|current_database|current_query|current_schema|current_schemas|" + + "current_setting|current_user|currtid|currtid2|currval|cursor_to_xml|" + + "cursor_to_xmlschema|database_to_xml|database_to_xml_and_xmlschema|" + + "database_to_xmlschema|date|date_cmp|date_cmp_timestamp|date_cmp_timestamptz|date_eq|" + + "date_eq_timestamp|date_eq_timestamptz|date_ge|date_ge_timestamp|date_ge_timestamptz|" + + "date_gt|date_gt_timestamp|date_gt_timestamptz|date_in|date_larger|date_le|" + + "date_le_timestamp|date_le_timestamptz|date_lt|date_lt_timestamp|date_lt_timestamptz|" + + "date_mi|date_mi_interval|date_mii|date_ne|date_ne_timestamp|date_ne_timestamptz|" + + "date_out|date_part|date_pl_interval|date_pli|date_recv|date_send|date_smaller|" + + "date_trunc|datetime_pl|datetimetz_pl|dcbrt|decode|degrees|dense_rank|dexp|diagonal|" + + "diameter|dispell_init|dispell_lexize|dist_cpoly|dist_lb|dist_pb|dist_pc|dist_pl|" + + "dist_ppath|dist_ps|dist_sb|dist_sl|div|dlog1|dlog10|domain_in|domain_recv|dpow|dround|" + + "dsimple_init|dsimple_lexize|dsnowball_init|dsnowball_lexize|dsqrt|dsynonym_init|" + + "dsynonym_lexize|dtrunc|encode|enum_cmp|enum_eq|enum_first|enum_ge|enum_gt|enum_in|" + + "enum_larger|enum_last|enum_le|enum_lt|enum_ne|enum_out|enum_range|enum_recv|enum_send|" + + "enum_smaller|eqjoinsel|eqsel|euc_cn_to_mic|euc_cn_to_utf8|" + + "euc_jis_2004_to_shift_jis_2004|euc_jis_2004_to_utf8|euc_jp_to_mic|euc_jp_to_sjis|" + + "euc_jp_to_utf8|euc_kr_to_mic|euc_kr_to_utf8|euc_tw_to_big5|euc_tw_to_mic|" + + "euc_tw_to_utf8|every|exp|factorial|family|fdw_handler_in|fdw_handler_out|first_value|" + + "float4|float48div|float48eq|float48ge|float48gt|float48le|float48lt|float48mi|float48mul|" + + "float48ne|float48pl|float4_accum|float4abs|float4div|float4eq|float4ge|float4gt|float4in|" + + "float4larger|float4le|float4lt|float4mi|float4mul|float4ne|float4out|float4pl|float4recv|" + + "float4send|float4smaller|float4um|float4up|float8|float84div|float84eq|float84ge|" + + "float84gt|float84le|float84lt|float84mi|float84mul|float84ne|float84pl|float8_accum|" + + "float8_avg|float8_corr|float8_covar_pop|float8_covar_samp|float8_regr_accum|" + + "float8_regr_avgx|float8_regr_avgy|float8_regr_intercept|float8_regr_r2|" + + "float8_regr_slope|float8_regr_sxx|float8_regr_sxy|float8_regr_syy|float8_stddev_pop|" + + "float8_stddev_samp|float8_var_pop|float8_var_samp|float8abs|float8div|float8eq|" + + "float8ge|float8gt|float8in|float8larger|float8le|float8lt|float8mi|float8mul|float8ne|" + + "float8out|float8pl|float8recv|float8send|float8smaller|float8um|float8up|floor|" + + "flt4_mul_cash|flt8_mul_cash|fmgr_c_validator|fmgr_internal_validator|" + + "fmgr_sql_validator|format|format_type|gb18030_to_utf8|gbk_to_utf8|generate_series|" + + "generate_subscripts|get_bit|get_byte|get_current_ts_config|getdatabaseencoding|" + + "getpgusername|gin_cmp_prefix|gin_cmp_tslexeme|gin_extract_tsquery|" + + "gin_extract_tsvector|gin_tsquery_consistent|ginarrayconsistent|ginarrayextract|" + + "ginbeginscan|ginbuild|ginbuildempty|ginbulkdelete|gincostestimate|ginendscan|" + + "gingetbitmap|gininsert|ginmarkpos|ginoptions|ginqueryarrayextract|ginrescan|" + + "ginrestrpos|ginvacuumcleanup|gist_box_compress|gist_box_consistent|" + + "gist_box_decompress|gist_box_penalty|gist_box_picksplit|gist_box_same|gist_box_union|" + + "gist_circle_compress|gist_circle_consistent|gist_point_compress|" + + "gist_point_consistent|gist_point_distance|gist_poly_compress|gist_poly_consistent|" + + "gistbeginscan|gistbuild|gistbuildempty|gistbulkdelete|gistcostestimate|gistendscan|" + + "gistgetbitmap|gistgettuple|gistinsert|gistmarkpos|gistoptions|gistrescan|gistrestrpos|" + + "gistvacuumcleanup|gtsquery_compress|gtsquery_consistent|gtsquery_decompress|" + + "gtsquery_penalty|gtsquery_picksplit|gtsquery_same|gtsquery_union|gtsvector_compress|" + + "gtsvector_consistent|gtsvector_decompress|gtsvector_penalty|gtsvector_picksplit|" + + "gtsvector_same|gtsvector_union|gtsvectorin|gtsvectorout|has_any_column_privilege|" + + "has_column_privilege|has_database_privilege|has_foreign_data_wrapper_privilege|" + + "has_function_privilege|has_language_privilege|has_schema_privilege|" + + "has_sequence_privilege|has_server_privilege|has_table_privilege|" + + "has_tablespace_privilege|hash_aclitem|hash_array|hash_numeric|hashbeginscan|" + + "hashbpchar|hashbuild|hashbuildempty|hashbulkdelete|hashchar|hashcostestimate|" + + "hashendscan|hashenum|hashfloat4|hashfloat8|hashgetbitmap|hashgettuple|hashinet|" + + "hashinsert|hashint2|hashint2vector|hashint4|hashint8|hashmacaddr|hashmarkpos|hashname|" + + "hashoid|hashoidvector|hashoptions|hashrescan|hashrestrpos|hashtext|hashvacuumcleanup|" + + "hashvarlena|height|host|hostmask|iclikejoinsel|iclikesel|icnlikejoinsel|icnlikesel|" + + "icregexeqjoinsel|icregexeqsel|icregexnejoinsel|icregexnesel|inet_client_addr|" + + "inet_client_port|inet_in|inet_out|inet_recv|inet_send|inet_server_addr|" + + "inet_server_port|inetand|inetmi|inetmi_int8|inetnot|inetor|inetpl|initcap|int2|int24div|" + + "int24eq|int24ge|int24gt|int24le|int24lt|int24mi|int24mul|int24ne|int24pl|int28div|int28eq|" + + "int28ge|int28gt|int28le|int28lt|int28mi|int28mul|int28ne|int28pl|int2_accum|" + + "int2_avg_accum|int2_mul_cash|int2_sum|int2abs|int2and|int2div|int2eq|int2ge|int2gt|int2in|" + + "int2larger|int2le|int2lt|int2mi|int2mod|int2mul|int2ne|int2not|int2or|int2out|int2pl|" + + "int2recv|int2send|int2shl|int2shr|int2smaller|int2um|int2up|int2vectoreq|int2vectorin|" + + "int2vectorout|int2vectorrecv|int2vectorsend|int2xor|int4|int42div|int42eq|int42ge|" + + "int42gt|int42le|int42lt|int42mi|int42mul|int42ne|int42pl|int48div|int48eq|int48ge|int48gt|" + + "int48le|int48lt|int48mi|int48mul|int48ne|int48pl|int4_accum|int4_avg_accum|int4_mul_cash|" + + "int4_sum|int4abs|int4and|int4div|int4eq|int4ge|int4gt|int4in|int4inc|int4larger|int4le|" + + "int4lt|int4mi|int4mod|int4mul|int4ne|int4not|int4or|int4out|int4pl|int4recv|int4send|" + + "int4shl|int4shr|int4smaller|int4um|int4up|int4xor|int8|int82div|int82eq|int82ge|int82gt|" + + "int82le|int82lt|int82mi|int82mul|int82ne|int82pl|int84div|int84eq|int84ge|int84gt|int84le|" + + "int84lt|int84mi|int84mul|int84ne|int84pl|int8_accum|int8_avg|int8_avg_accum|int8_sum|" + + "int8abs|int8and|int8div|int8eq|int8ge|int8gt|int8in|int8inc|int8inc_any|" + + "int8inc_float8_float8|int8larger|int8le|int8lt|int8mi|int8mod|int8mul|int8ne|int8not|" + + "int8or|int8out|int8pl|int8pl_inet|int8recv|int8send|int8shl|int8shr|int8smaller|int8um|" + + "int8up|int8xor|integer_pl_date|inter_lb|inter_sb|inter_sl|internal_in|internal_out|" + + "interval_accum|interval_avg|interval_cmp|interval_div|interval_eq|interval_ge|" + + "interval_gt|interval_hash|interval_in|interval_larger|interval_le|interval_lt|" + + "interval_mi|interval_mul|interval_ne|interval_out|interval_pl|interval_pl_date|" + + "interval_pl_time|interval_pl_timestamp|interval_pl_timestamptz|interval_pl_timetz|" + + "interval_recv|interval_send|interval_smaller|interval_um|intervaltypmodin|" + + "intervaltypmodout|intinterval|isclosed|isfinite|ishorizontal|iso8859_1_to_utf8|" + + "iso8859_to_utf8|iso_to_koi8r|iso_to_mic|iso_to_win1251|iso_to_win866|isopen|isparallel|" + + "isperp|isvertical|johab_to_utf8|justify_days|justify_hours|justify_interval|" + + "koi8r_to_iso|koi8r_to_mic|koi8r_to_utf8|koi8r_to_win1251|koi8r_to_win866|" + + "koi8u_to_utf8|lag|language_handler_in|language_handler_out|last_value|lastval|" + + "latin1_to_mic|latin2_to_mic|latin2_to_win1250|latin3_to_mic|latin4_to_mic|lead|left|" + + "length|like|like_escape|likejoinsel|likesel|line|line_distance|line_eq|line_horizontal|" + + "line_in|line_interpt|line_intersect|line_out|line_parallel|line_perp|line_recv|" + + "line_send|line_vertical|ln|lo_close|lo_creat|lo_create|lo_export|lo_import|lo_lseek|" + + "lo_open|lo_tell|lo_truncate|lo_unlink|log|loread|lower|lowrite|lpad|lseg|lseg_center|" + + "lseg_distance|lseg_eq|lseg_ge|lseg_gt|lseg_horizontal|lseg_in|lseg_interpt|" + + "lseg_intersect|lseg_le|lseg_length|lseg_lt|lseg_ne|lseg_out|lseg_parallel|lseg_perp|" + + "lseg_recv|lseg_send|lseg_vertical|ltrim|macaddr_cmp|macaddr_eq|macaddr_ge|macaddr_gt|" + + "macaddr_in|macaddr_le|macaddr_lt|macaddr_ne|macaddr_out|macaddr_recv|macaddr_send|" + + "makeaclitem|masklen|max|md5|mic_to_ascii|mic_to_big5|mic_to_euc_cn|mic_to_euc_jp|" + + "mic_to_euc_kr|mic_to_euc_tw|mic_to_iso|mic_to_koi8r|mic_to_latin1|mic_to_latin2|" + + "mic_to_latin3|mic_to_latin4|mic_to_sjis|mic_to_win1250|mic_to_win1251|mic_to_win866|" + + "min|mktinterval|mod|money|mul_d_interval|name|nameeq|namege|namegt|nameiclike|nameicnlike|" + + "nameicregexeq|nameicregexne|namein|namele|namelike|namelt|namene|namenlike|nameout|" + + "namerecv|nameregexeq|nameregexne|namesend|neqjoinsel|neqsel|netmask|network|network_cmp|" + + "network_eq|network_ge|network_gt|network_le|network_lt|network_ne|network_sub|" + + "network_subeq|network_sup|network_supeq|nextval|nlikejoinsel|nlikesel|notlike|now|" + + "npoints|nth_value|ntile|numeric_abs|numeric_accum|numeric_add|numeric_avg|" + + "numeric_avg_accum|numeric_cmp|numeric_div|numeric_div_trunc|numeric_eq|numeric_exp|" + + "numeric_fac|numeric_ge|numeric_gt|numeric_in|numeric_inc|numeric_larger|numeric_le|" + + "numeric_ln|numeric_log|numeric_lt|numeric_mod|numeric_mul|numeric_ne|numeric_out|" + + "numeric_power|numeric_recv|numeric_send|numeric_smaller|numeric_sqrt|" + + "numeric_stddev_pop|numeric_stddev_samp|numeric_sub|numeric_uminus|numeric_uplus|" + + "numeric_var_pop|numeric_var_samp|numerictypmodin|numerictypmodout|numnode|" + + "obj_description|octet_length|oid|oideq|oidge|oidgt|oidin|oidlarger|oidle|oidlt|oidne|oidout|" + + "oidrecv|oidsend|oidsmaller|oidvectoreq|oidvectorge|oidvectorgt|oidvectorin|oidvectorle|" + + "oidvectorlt|oidvectorne|oidvectorout|oidvectorrecv|oidvectorsend|oidvectortypes|on_pb|" + + "on_pl|on_ppath|on_ps|on_sb|on_sl|opaque_in|opaque_out|overlaps|overlay|path|path_add|" + + "path_add_pt|path_center|path_contain_pt|path_distance|path_div_pt|path_in|path_inter|" + + "path_length|path_mul_pt|path_n_eq|path_n_ge|path_n_gt|path_n_le|path_n_lt|path_npoints|" + + "path_out|path_recv|path_send|path_sub_pt|pclose|percent_rank|pg_advisory_lock|" + + "pg_advisory_lock_shared|pg_advisory_unlock|pg_advisory_unlock_all|" + + "pg_advisory_unlock_shared|pg_advisory_xact_lock|pg_advisory_xact_lock_shared|" + + "pg_available_extension_versions|pg_available_extensions|pg_backend_pid|" + + "pg_cancel_backend|pg_char_to_encoding|pg_client_encoding|pg_collation_is_visible|" + + "pg_column_size|pg_conf_load_time|pg_conversion_is_visible|pg_create_restore_point|" + + "pg_current_xlog_insert_location|pg_current_xlog_location|pg_cursor|pg_database_size|" + + "pg_describe_object|pg_encoding_max_length|pg_encoding_to_char|" + + "pg_extension_config_dump|pg_extension_update_paths|pg_function_is_visible|" + + "pg_get_constraintdef|pg_get_expr|pg_get_function_arguments|" + + "pg_get_function_identity_arguments|pg_get_function_result|pg_get_functiondef|" + + "pg_get_indexdef|pg_get_keywords|pg_get_ruledef|pg_get_serial_sequence|" + + "pg_get_triggerdef|pg_get_userbyid|pg_get_viewdef|pg_has_role|pg_indexes_size|" + + "pg_is_in_recovery|pg_is_other_temp_schema|pg_is_xlog_replay_paused|" + + "pg_last_xact_replay_timestamp|pg_last_xlog_receive_location|" + + "pg_last_xlog_replay_location|pg_listening_channels|pg_lock_status|pg_ls_dir|" + + "pg_my_temp_schema|pg_node_tree_in|pg_node_tree_out|pg_node_tree_recv|" + + "pg_node_tree_send|pg_notify|pg_opclass_is_visible|pg_operator_is_visible|" + + "pg_options_to_table|pg_postmaster_start_time|pg_prepared_statement|pg_prepared_xact|" + + "pg_read_binary_file|pg_read_file|pg_relation_filenode|pg_relation_filepath|" + + "pg_relation_size|pg_reload_conf|pg_rotate_logfile|pg_sequence_parameters|" + + "pg_show_all_settings|pg_size_pretty|pg_sleep|pg_start_backup|pg_stat_clear_snapshot|" + + "pg_stat_file|pg_stat_get_activity|pg_stat_get_analyze_count|" + + "pg_stat_get_autoanalyze_count|pg_stat_get_autovacuum_count|" + + "pg_stat_get_backend_activity|pg_stat_get_backend_activity_start|" + + "pg_stat_get_backend_client_addr|pg_stat_get_backend_client_port|" + + "pg_stat_get_backend_dbid|pg_stat_get_backend_idset|pg_stat_get_backend_pid|" + + "pg_stat_get_backend_start|pg_stat_get_backend_userid|pg_stat_get_backend_waiting|" + + "pg_stat_get_backend_xact_start|pg_stat_get_bgwriter_buf_written_checkpoints|" + + "pg_stat_get_bgwriter_buf_written_clean|pg_stat_get_bgwriter_maxwritten_clean|" + + "pg_stat_get_bgwriter_requested_checkpoints|pg_stat_get_bgwriter_stat_reset_time|" + + "pg_stat_get_bgwriter_timed_checkpoints|pg_stat_get_blocks_fetched|" + + "pg_stat_get_blocks_hit|pg_stat_get_buf_alloc|pg_stat_get_buf_fsync_backend|" + + "pg_stat_get_buf_written_backend|pg_stat_get_db_blocks_fetched|" + + "pg_stat_get_db_blocks_hit|pg_stat_get_db_conflict_all|" + + "pg_stat_get_db_conflict_bufferpin|pg_stat_get_db_conflict_lock|" + + "pg_stat_get_db_conflict_snapshot|pg_stat_get_db_conflict_startup_deadlock|" + + "pg_stat_get_db_conflict_tablespace|pg_stat_get_db_numbackends|" + + "pg_stat_get_db_stat_reset_time|pg_stat_get_db_tuples_deleted|" + + "pg_stat_get_db_tuples_fetched|pg_stat_get_db_tuples_inserted|" + + "pg_stat_get_db_tuples_returned|pg_stat_get_db_tuples_updated|" + + "pg_stat_get_db_xact_commit|pg_stat_get_db_xact_rollback|pg_stat_get_dead_tuples|" + + "pg_stat_get_function_calls|pg_stat_get_function_self_time|" + + "pg_stat_get_function_time|pg_stat_get_last_analyze_time|" + + "pg_stat_get_last_autoanalyze_time|pg_stat_get_last_autovacuum_time|" + + "pg_stat_get_last_vacuum_time|pg_stat_get_live_tuples|pg_stat_get_numscans|" + + "pg_stat_get_tuples_deleted|pg_stat_get_tuples_fetched|" + + "pg_stat_get_tuples_hot_updated|pg_stat_get_tuples_inserted|" + + "pg_stat_get_tuples_returned|pg_stat_get_tuples_updated|pg_stat_get_vacuum_count|" + + "pg_stat_get_wal_senders|pg_stat_get_xact_blocks_fetched|" + + "pg_stat_get_xact_blocks_hit|pg_stat_get_xact_function_calls|" + + "pg_stat_get_xact_function_self_time|pg_stat_get_xact_function_time|" + + "pg_stat_get_xact_numscans|pg_stat_get_xact_tuples_deleted|" + + "pg_stat_get_xact_tuples_fetched|pg_stat_get_xact_tuples_hot_updated|" + + "pg_stat_get_xact_tuples_inserted|pg_stat_get_xact_tuples_returned|" + + "pg_stat_get_xact_tuples_updated|pg_stat_reset|pg_stat_reset_shared|" + + "pg_stat_reset_single_function_counters|pg_stat_reset_single_table_counters|" + + "pg_stop_backup|pg_switch_xlog|pg_table_is_visible|pg_table_size|" + + "pg_tablespace_databases|pg_tablespace_size|pg_terminate_backend|pg_timezone_abbrevs|" + + "pg_timezone_names|pg_total_relation_size|pg_try_advisory_lock|" + + "pg_try_advisory_lock_shared|pg_try_advisory_xact_lock|" + + "pg_try_advisory_xact_lock_shared|pg_ts_config_is_visible|pg_ts_dict_is_visible|" + + "pg_ts_parser_is_visible|pg_ts_template_is_visible|pg_type_is_visible|pg_typeof|" + + "pg_xlog_replay_pause|pg_xlog_replay_resume|pg_xlogfile_name|pg_xlogfile_name_offset|" + + "pi|plainto_tsquery|plpgsql_call_handler|plpgsql_inline_handler|plpgsql_validator|" + + "point|point_above|point_add|point_below|point_distance|point_div|point_eq|point_horiz|" + + "point_in|point_left|point_mul|point_ne|point_out|point_recv|point_right|point_send|" + + "point_sub|point_vert|poly_above|poly_below|poly_center|poly_contain|poly_contain_pt|" + + "poly_contained|poly_distance|poly_in|poly_left|poly_npoints|poly_out|poly_overabove|" + + "poly_overbelow|poly_overlap|poly_overleft|poly_overright|poly_recv|poly_right|" + + "poly_same|poly_send|polygon|popen|position|positionjoinsel|positionsel|" + + "postgresql_fdw_validator|pow|power|prsd_end|prsd_headline|prsd_lextype|prsd_nexttoken|" + + "prsd_start|pt_contained_circle|pt_contained_poly|query_to_xml|" + + "query_to_xml_and_xmlschema|query_to_xmlschema|querytree|quote_ident|quote_literal|" + + "quote_nullable|radians|radius|random|rank|record_eq|record_ge|record_gt|record_in|" + + "record_le|record_lt|record_ne|record_out|record_recv|record_send|regclass|regclassin|" + + "regclassout|regclassrecv|regclasssend|regconfigin|regconfigout|regconfigrecv|" + + "regconfigsend|regdictionaryin|regdictionaryout|regdictionaryrecv|regdictionarysend|" + + "regexeqjoinsel|regexeqsel|regexnejoinsel|regexnesel|regexp_matches|regexp_replace|" + + "regexp_split_to_array|regexp_split_to_table|regoperatorin|regoperatorout|" + + "regoperatorrecv|regoperatorsend|regoperin|regoperout|regoperrecv|regopersend|" + + "regprocedurein|regprocedureout|regprocedurerecv|regproceduresend|regprocin|regprocout|" + + "regprocrecv|regprocsend|regr_avgx|regr_avgy|regr_count|regr_intercept|regr_r2|" + + "regr_slope|regr_sxx|regr_sxy|regr_syy|regtypein|regtypeout|regtyperecv|regtypesend|" + + "reltime|reltimeeq|reltimege|reltimegt|reltimein|reltimele|reltimelt|reltimene|reltimeout|" + + "reltimerecv|reltimesend|repeat|replace|reverse|right|round|row_number|rpad|rtrim|" + + "scalargtjoinsel|scalargtsel|scalarltjoinsel|scalarltsel|schema_to_xml|" + + "schema_to_xml_and_xmlschema|schema_to_xmlschema|session_user|set_bit|set_byte|" + + "set_config|set_masklen|setseed|setval|setweight|shell_in|shell_out|" + + "shift_jis_2004_to_euc_jis_2004|shift_jis_2004_to_utf8|shobj_description|sign|" + + "similar_escape|sin|sjis_to_euc_jp|sjis_to_mic|sjis_to_utf8|slope|smgreq|smgrin|smgrne|" + + "smgrout|split_part|sqrt|statement_timestamp|stddev|stddev_pop|stddev_samp|string_agg|" + + "string_agg_finalfn|string_agg_transfn|string_to_array|strip|strpos|substr|substring|sum|" + + "suppress_redundant_updates_trigger|table_to_xml|table_to_xml_and_xmlschema|" + + "table_to_xmlschema|tan|text|text_ge|text_gt|text_larger|text_le|text_lt|text_pattern_ge|" + + "text_pattern_gt|text_pattern_le|text_pattern_lt|text_smaller|textanycat|textcat|texteq|" + + "texticlike|texticnlike|texticregexeq|texticregexne|textin|textlen|textlike|textne|" + + "textnlike|textout|textrecv|textregexeq|textregexne|textsend|thesaurus_init|" + + "thesaurus_lexize|tideq|tidge|tidgt|tidin|tidlarger|tidle|tidlt|tidne|tidout|tidrecv|tidsend|" + + "tidsmaller|time_cmp|time_eq|time_ge|time_gt|time_hash|time_in|time_larger|time_le|time_lt|" + + "time_mi_interval|time_mi_time|time_ne|time_out|time_pl_interval|time_recv|time_send|" + + "time_smaller|timedate_pl|timemi|timenow|timeofday|timepl|timestamp_cmp|" + + "timestamp_cmp_date|timestamp_cmp_timestamptz|timestamp_eq|timestamp_eq_date|" + + "timestamp_eq_timestamptz|timestamp_ge|timestamp_ge_date|timestamp_ge_timestamptz|" + + "timestamp_gt|timestamp_gt_date|timestamp_gt_timestamptz|timestamp_hash|timestamp_in|" + + "timestamp_larger|timestamp_le|timestamp_le_date|timestamp_le_timestamptz|" + + "timestamp_lt|timestamp_lt_date|timestamp_lt_timestamptz|timestamp_mi|" + + "timestamp_mi_interval|timestamp_ne|timestamp_ne_date|timestamp_ne_timestamptz|" + + "timestamp_out|timestamp_pl_interval|timestamp_recv|timestamp_send|timestamp_smaller|" + + "timestamptypmodin|timestamptypmodout|timestamptz_cmp|timestamptz_cmp_date|" + + "timestamptz_cmp_timestamp|timestamptz_eq|timestamptz_eq_date|" + + "timestamptz_eq_timestamp|timestamptz_ge|timestamptz_ge_date|" + + "timestamptz_ge_timestamp|timestamptz_gt|timestamptz_gt_date|" + + "timestamptz_gt_timestamp|timestamptz_in|timestamptz_larger|timestamptz_le|" + + "timestamptz_le_date|timestamptz_le_timestamp|timestamptz_lt|timestamptz_lt_date|" + + "timestamptz_lt_timestamp|timestamptz_mi|timestamptz_mi_interval|timestamptz_ne|" + + "timestamptz_ne_date|timestamptz_ne_timestamp|timestamptz_out|" + + "timestamptz_pl_interval|timestamptz_recv|timestamptz_send|timestamptz_smaller|" + + "timestamptztypmodin|timestamptztypmodout|timetypmodin|timetypmodout|timetz_cmp|" + + "timetz_eq|timetz_ge|timetz_gt|timetz_hash|timetz_in|timetz_larger|timetz_le|timetz_lt|" + + "timetz_mi_interval|timetz_ne|timetz_out|timetz_pl_interval|timetz_recv|timetz_send|" + + "timetz_smaller|timetzdate_pl|timetztypmodin|timetztypmodout|timezone|tinterval|" + + "tintervalct|tintervalend|tintervaleq|tintervalge|tintervalgt|tintervalin|tintervalle|" + + "tintervalleneq|tintervallenge|tintervallengt|tintervallenle|tintervallenlt|" + + "tintervallenne|tintervallt|tintervalne|tintervalout|tintervalov|tintervalrecv|" + + "tintervalrel|tintervalsame|tintervalsend|tintervalstart|to_ascii|to_char|to_date|to_hex|" + + "to_number|to_timestamp|to_tsquery|to_tsvector|transaction_timestamp|translate|" + + "trigger_in|trigger_out|trunc|ts_debug|ts_headline|ts_lexize|ts_match_qv|ts_match_tq|" + + "ts_match_tt|ts_match_vq|ts_parse|ts_rank|ts_rank_cd|ts_rewrite|ts_stat|ts_token_type|" + + "ts_typanalyze|tsmatchjoinsel|tsmatchsel|tsq_mcontained|tsq_mcontains|tsquery_and|" + + "tsquery_cmp|tsquery_eq|tsquery_ge|tsquery_gt|tsquery_le|tsquery_lt|tsquery_ne|" + + "tsquery_not|tsquery_or|tsqueryin|tsqueryout|tsqueryrecv|tsquerysend|tsvector_cmp|" + + "tsvector_concat|tsvector_eq|tsvector_ge|tsvector_gt|tsvector_le|tsvector_lt|" + + "tsvector_ne|tsvector_update_trigger|tsvector_update_trigger_column|tsvectorin|" + + "tsvectorout|tsvectorrecv|tsvectorsend|txid_current|txid_current_snapshot|" + + "txid_snapshot_in|txid_snapshot_out|txid_snapshot_recv|txid_snapshot_send|" + + "txid_snapshot_xip|txid_snapshot_xmax|txid_snapshot_xmin|txid_visible_in_snapshot|" + + "uhc_to_utf8|unique_key_recheck|unknownin|unknownout|unknownrecv|unknownsend|unnest|" + + "upper|utf8_to_ascii|utf8_to_big5|utf8_to_euc_cn|utf8_to_euc_jis_2004|utf8_to_euc_jp|" + + "utf8_to_euc_kr|utf8_to_euc_tw|utf8_to_gb18030|utf8_to_gbk|utf8_to_iso8859|" + + "utf8_to_iso8859_1|utf8_to_johab|utf8_to_koi8r|utf8_to_koi8u|utf8_to_shift_jis_2004|" + + "utf8_to_sjis|utf8_to_uhc|utf8_to_win|uuid_cmp|uuid_eq|uuid_ge|uuid_gt|uuid_hash|uuid_in|" + + "uuid_le|uuid_lt|uuid_ne|uuid_out|uuid_recv|uuid_send|var_pop|var_samp|varbit_in|" + + "varbit_out|varbit_recv|varbit_send|varbitcmp|varbiteq|varbitge|varbitgt|varbitle|" + + "varbitlt|varbitne|varbittypmodin|varbittypmodout|varcharin|varcharout|varcharrecv|" + + "varcharsend|varchartypmodin|varchartypmodout|variance|version|void_in|void_out|" + + "void_recv|void_send|width|width_bucket|win1250_to_latin2|win1250_to_mic|win1251_to_iso|" + + "win1251_to_koi8r|win1251_to_mic|win1251_to_win866|win866_to_iso|win866_to_koi8r|" + + "win866_to_mic|win866_to_win1251|win_to_utf8|xideq|xideqint4|xidin|xidout|xidrecv|xidsend|" + + "xml|xml_in|xml_is_well_formed|xml_is_well_formed_content|xml_is_well_formed_document|" + + "xml_out|xml_recv|xml_send|xmlagg|xmlcomment|xmlconcat2|xmlexists|xmlvalidate|xpath|" + + "xpath_exists" + ); + + var keywordMapper = this.createKeywordMapper({ + "support.function": builtinFunctions, + "keyword": keywords + }, "identifier", true); + + + var sqlRules = [{ + token : "string", // single line string -- assume dollar strings if multi-line for now + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" + }, { + token : "variable.language", // pg identifier + regex : '".*?"' + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : keywordMapper, + regex : "[a-zA-Z_][a-zA-Z0-9_$]*\\b" // TODO - Unicode in identifiers + }, { + token : "keyword.operator", + regex : "!|!!|!~|!~\\*|!~~|!~~\\*|#|##|#<|#<=|#<>|#=|#>|#>=|%|\\&|\\&\\&|\\&<|\\&<\\||\\&>|\\*|\\+|" + + "\\-|/|<|<#>|<\\->|<<|<<=|<<\\||<=|<>|<\\?>|<@|<\\^|=|>|>=|>>|>>=|>\\^|\\?#|\\?\\-|\\?\\-\\||" + + "\\?\\||\\?\\|\\||@|@\\-@|@>|@@|@@@|\\^|\\||\\|\\&>|\\|/|\\|>>|\\|\\||\\|\\|/|~|~\\*|~<=~|~<~|" + + "~=|~>=~|~>~|~~|~~\\*" + }, { + token : "paren.lparen", + regex : "[\\(]" + }, { + token : "paren.rparen", + regex : "[\\)]" + }, { + token : "text", + regex : "\\s+" + } + ]; + + + this.$rules = { + "start" : [{ + token : "comment", + regex : "--.*$" + }, + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi-line comment + regex : "\\/\\*", + next : "comment" + },{ + token : "keyword.statementBegin", + regex : "^[a-zA-Z]+", // Could enumerate starting keywords but this allows things to work when new statements are added. + next : "statement" + },{ + token : "support.buildin", // psql directive + regex : "^\\\\[\\S]+.*$" + } + ], + + "statement" : [{ + token : "comment", + regex : "--.*$" + }, { + token : "comment", // multi-line comment + regex : "\\/\\*", + next : "commentStatement" + }, { + token : "statementEnd", + regex : ";", + next : "start" + }, { + token : "string", // perl, python, tcl are in the pg default dist (no tcl highlighter) + regex : "\\$perl\\$", + next : "perl-start" + }, { + token : "string", + regex : "\\$python\\$", + next : "python-start" + },{ + token : "string", + regex : "\\$[\\w_0-9]*\\$$", // dollar quote at the end of a line + next : "dollarSql" + }, { + token : "string", + regex : "\\$[\\w_0-9]*\\$", + next : "dollarStatementString" + } + ].concat(sqlRules), + + "dollarSql" : [{ + token : "comment", + regex : "--.*$" + }, { + token : "comment", // multi-line comment + regex : "\\/\\*", + next : "commentDollarSql" + }, { + token : "string", // end quoting with dollar at the start of a line + regex : "^\\$[\\w_0-9]*\\$", + next : "statement" + }, { + token : "string", + regex : "\\$[\\w_0-9]*\\$", + next : "dollarSqlString" + } + ].concat(sqlRules), + + "comment" : [{ + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "start" + }, { + token : "comment", // comment spanning whole line + regex : ".+" + } + ], + + "commentStatement" : [{ + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "statement" + }, { + token : "comment", // comment spanning whole line + regex : ".+" + } + ], + + "commentDollarSql" : [{ + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "dollarSql" + }, { + token : "comment", // comment spanning whole line + regex : ".+" + } + ], + + "dollarStatementString" : [{ + token : "string", // closing dollarstring + regex : ".*?\\$[\\w_0-9]*\\$", + next : "statement" + }, { + token : "string", // dollarstring spanning whole line + regex : ".+" + } + ], + + "dollarSqlString" : [{ + token : "string", // closing dollarstring + regex : ".*?\\$[\\w_0-9]*\\$", + next : "dollarSql" + }, { + token : "string", // dollarstring spanning whole line + regex : ".+" + } + ] + }; + + this.embedRules(DocCommentHighlightRules, "doc-", [ DocCommentHighlightRules.getEndRule("start") ]); + this.embedRules(PerlHighlightRules, "perl-", [{token : "string", regex : "\\$perl\\$", next : "statement"}]); + this.embedRules(PythonHighlightRules, "python-", [{token : "string", regex : "\\$python\\$", next : "statement"}]); +}; + +oop.inherits(PgsqlHighlightRules, TextHighlightRules); + +exports.PgsqlHighlightRules = PgsqlHighlightRules; +}); + +ace.define('ace/mode/doc_comment_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, { + token : "comment.doc.tag", + regex : "\\bTODO\\b" + }, { + defaultToken : "comment.doc" + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define('ace/mode/perl_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var PerlHighlightRules = function() { + + var keywords = ( + "base|constant|continue|else|elsif|for|foreach|format|goto|if|last|local|my|next|" + + "no|package|parent|redo|require|scalar|sub|unless|until|while|use|vars" + ); + + var buildinConstants = ("ARGV|ENV|INC|SIG"); + + var builtinFunctions = ( + "getprotobynumber|getprotobyname|getservbyname|gethostbyaddr|" + + "gethostbyname|getservbyport|getnetbyaddr|getnetbyname|getsockname|" + + "getpeername|setpriority|getprotoent|setprotoent|getpriority|" + + "endprotoent|getservent|setservent|endservent|sethostent|socketpair|" + + "getsockopt|gethostent|endhostent|setsockopt|setnetent|quotemeta|" + + "localtime|prototype|getnetent|endnetent|rewinddir|wantarray|getpwuid|" + + "closedir|getlogin|readlink|endgrent|getgrgid|getgrnam|shmwrite|" + + "shutdown|readline|endpwent|setgrent|readpipe|formline|truncate|" + + "dbmclose|syswrite|setpwent|getpwnam|getgrent|getpwent|ucfirst|sysread|" + + "setpgrp|shmread|sysseek|sysopen|telldir|defined|opendir|connect|" + + "lcfirst|getppid|binmode|syscall|sprintf|getpgrp|readdir|seekdir|" + + "waitpid|reverse|unshift|symlink|dbmopen|semget|msgrcv|rename|listen|" + + "chroot|msgsnd|shmctl|accept|unpack|exists|fileno|shmget|system|" + + "unlink|printf|gmtime|msgctl|semctl|values|rindex|substr|splice|" + + "length|msgget|select|socket|return|caller|delete|alarm|ioctl|index|" + + "undef|lstat|times|srand|chown|fcntl|close|write|umask|rmdir|study|" + + "sleep|chomp|untie|print|utime|mkdir|atan2|split|crypt|flock|chmod|" + + "BEGIN|bless|chdir|semop|shift|reset|link|stat|chop|grep|fork|dump|" + + "join|open|tell|pipe|exit|glob|warn|each|bind|sort|pack|eval|push|" + + "keys|getc|kill|seek|sqrt|send|wait|rand|tied|read|time|exec|recv|" + + "eof|chr|int|ord|exp|pos|pop|sin|log|abs|oct|hex|tie|cos|vec|END|ref|" + + "map|die|uc|lc|do" + ); + + var keywordMapper = this.createKeywordMapper({ + "keyword": keywords, + "constant.language": buildinConstants, + "support.function": builtinFunctions + }, "identifier"); + + this.$rules = { + "start" : [ + { + token : "comment", + regex : "#.*$" + }, { + token : "comment.doc", + regex : "^=(?:begin|item)\\b", + next : "block_comment" + }, { + token : "string.regexp", + regex : "[/](?:(?:\\[(?:\\\\]|[^\\]])+\\])|(?:\\\\/|[^\\]/]))*[/]\\w*\\s*(?=[).,;]|$)" + }, { + token : "string", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' + }, { + token : "string", // multi line string start + regex : '["].*\\\\$', + next : "qqstring" + }, { + token : "string", // single line + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" + }, { + token : "string", // multi line string start + regex : "['].*\\\\$", + next : "qstring" + }, { + token : "constant.numeric", // hex + regex : "0x[0-9a-fA-F]+\\b" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "keyword.operator", + regex : "\\.\\.\\.|\\|\\|=|>>=|<<=|<=>|&&=|=>|!~|\\^=|&=|\\|=|\\.=|x=|%=|\\/=|\\*=|\\-=|\\+=|=~|\\*\\*|\\-\\-|\\.\\.|\\|\\||&&|\\+\\+|\\->|!=|==|>=|<=|>>|<<|,|=|\\?\\:|\\^|\\||x|%|\\/|\\*|<|&|\\\\|~|!|>|\\.|\\-|\\+|\\-C|\\-b|\\-S|\\-u|\\-t|\\-p|\\-l|\\-d|\\-f|\\-g|\\-s|\\-z|\\-k|\\-e|\\-O|\\-T|\\-B|\\-M|\\-A|\\-X|\\-W|\\-c|\\-R|\\-o|\\-x|\\-w|\\-r|\\b(?:and|cmp|eq|ge|gt|le|lt|ne|not|or|xor)" + }, { + token : "lparen", + regex : "[[({]" + }, { + token : "rparen", + regex : "[\\])}]" + }, { + token : "text", + regex : "\\s+" + } + ], + "qqstring" : [ + { + token : "string", + regex : '(?:(?:\\\\.)|(?:[^"\\\\]))*?"', + next : "start" + }, { + token : "string", + regex : '.+' + } + ], + "qstring" : [ + { + token : "string", + regex : "(?:(?:\\\\.)|(?:[^'\\\\]))*?'", + next : "start" + }, { + token : "string", + regex : '.+' + } + ], + "block_comment": [ + { + token: "comment.doc", + regex: "^=cut\\b", + next: "start" + }, + { + defaultToken: "comment.doc" + } + ] + }; +}; + +oop.inherits(PerlHighlightRules, TextHighlightRules); + +exports.PerlHighlightRules = PerlHighlightRules; +}); + +ace.define('ace/mode/python_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var PythonHighlightRules = function() { + + var keywords = ( + "and|as|assert|break|class|continue|def|del|elif|else|except|exec|" + + "finally|for|from|global|if|import|in|is|lambda|not|or|pass|print|" + + "raise|return|try|while|with|yield" + ); + + var builtinConstants = ( + "True|False|None|NotImplemented|Ellipsis|__debug__" + ); + + var builtinFunctions = ( + "abs|divmod|input|open|staticmethod|all|enumerate|int|ord|str|any|" + + "eval|isinstance|pow|sum|basestring|execfile|issubclass|print|super|" + + "binfile|iter|property|tuple|bool|filter|len|range|type|bytearray|" + + "float|list|raw_input|unichr|callable|format|locals|reduce|unicode|" + + "chr|frozenset|long|reload|vars|classmethod|getattr|map|repr|xrange|" + + "cmp|globals|max|reversed|zip|compile|hasattr|memoryview|round|" + + "__import__|complex|hash|min|set|apply|delattr|help|next|setattr|" + + "buffer|dict|hex|object|slice|coerce|dir|id|oct|sorted|intern" + ); + var keywordMapper = this.createKeywordMapper({ + "invalid.deprecated": "debugger", + "support.function": builtinFunctions, + "constant.language": builtinConstants, + "keyword": keywords + }, "identifier"); + + var strPre = "(?:r|u|ur|R|U|UR|Ur|uR)?"; + + var decimalInteger = "(?:(?:[1-9]\\d*)|(?:0))"; + var octInteger = "(?:0[oO]?[0-7]+)"; + var hexInteger = "(?:0[xX][\\dA-Fa-f]+)"; + var binInteger = "(?:0[bB][01]+)"; + var integer = "(?:" + decimalInteger + "|" + octInteger + "|" + hexInteger + "|" + binInteger + ")"; + + var exponent = "(?:[eE][+-]?\\d+)"; + var fraction = "(?:\\.\\d+)"; + var intPart = "(?:\\d+)"; + var pointFloat = "(?:(?:" + intPart + "?" + fraction + ")|(?:" + intPart + "\\.))"; + var exponentFloat = "(?:(?:" + pointFloat + "|" + intPart + ")" + exponent + ")"; + var floatNumber = "(?:" + exponentFloat + "|" + pointFloat + ")"; + + var stringEscape = "\\\\(x[0-9A-Fa-f]{2}|[0-7]{3}|[\\\\abfnrtv'\"]|U[0-9A-Fa-f]{8}|u[0-9A-Fa-f]{4})"; + + this.$rules = { + "start" : [ { + token : "comment", + regex : "#.*$" + }, { + token : "string", // multi line """ string start + regex : strPre + '"{3}', + next : "qqstring3" + }, { + token : "string", // " string + regex : strPre + '"(?=.)', + next : "qqstring" + }, { + token : "string", // multi line ''' string start + regex : strPre + "'{3}", + next : "qstring3" + }, { + token : "string", // ' string + regex : strPre + "'(?=.)", + next : "qstring" + }, { + token : "constant.numeric", // imaginary + regex : "(?:" + floatNumber + "|\\d+)[jJ]\\b" + }, { + token : "constant.numeric", // float + regex : floatNumber + }, { + token : "constant.numeric", // long integer + regex : integer + "[lL]\\b" + }, { + token : "constant.numeric", // integer + regex : integer + "\\b" + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "keyword.operator", + regex : "\\+|\\-|\\*|\\*\\*|\\/|\\/\\/|%|<<|>>|&|\\||\\^|~|<|>|<=|=>|==|!=|<>|=" + }, { + token : "paren.lparen", + regex : "[\\[\\(\\{]" + }, { + token : "paren.rparen", + regex : "[\\]\\)\\}]" + }, { + token : "text", + regex : "\\s+" + } ], + "qqstring3" : [ { + token : "constant.language.escape", + regex : stringEscape + }, { + token : "string", // multi line """ string end + regex : '"{3}', + next : "start" + }, { + defaultToken : "string" + } ], + "qstring3" : [ { + token : "constant.language.escape", + regex : stringEscape + }, { + token : "string", // multi line ''' string end + regex : "'{3}", + next : "start" + }, { + defaultToken : "string" + } ], + "qqstring" : [{ + token : "constant.language.escape", + regex : stringEscape + }, { + token : "string", + regex : "\\\\$", + next : "qqstring" + }, { + token : "string", + regex : '"|$', + next : "start" + }, { + defaultToken: "string" + }], + "qstring" : [{ + token : "constant.language.escape", + regex : stringEscape + }, { + token : "string", + regex : "\\\\$", + next : "qstring" + }, { + token : "string", + regex : "'|$", + next : "start" + }, { + defaultToken: "string" + }] + }; +}; + +oop.inherits(PythonHighlightRules, TextHighlightRules); + +exports.PythonHighlightRules = PythonHighlightRules; +}); diff --git a/0.0.3_0/ace/mode-php.js b/0.0.3_0/ace/mode-php.js new file mode 100644 index 0000000..f07ae9f --- /dev/null +++ b/0.0.3_0/ace/mode-php.js @@ -0,0 +1,2291 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2010, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/mode/php', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/php_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/range', 'ace/worker/worker_client', 'ace/mode/behaviour/cstyle', 'ace/mode/folding/cstyle', 'ace/unicode'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var PhpHighlightRules = require("./php_highlight_rules").PhpHighlightRules; +var PhpLangHighlightRules = require("./php_highlight_rules").PhpLangHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var Range = require("../range").Range; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; +var unicode = require("../unicode"); + +var Mode = function(opts) { + var inline = opts && opts.inline; + var HighlightRules = inline ? PhpLangHighlightRules : PhpHighlightRules; + this.$tokenizer = new Tokenizer(new HighlightRules().getRules()); + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.tokenRe = new RegExp("^[" + + unicode.packages.L + + unicode.packages.Mn + unicode.packages.Mc + + unicode.packages.Nd + + unicode.packages.Pc + "\_]+", "g" + ); + + this.nonTokenRe = new RegExp("^(?:[^" + + unicode.packages.L + + unicode.packages.Mn + unicode.packages.Mc + + unicode.packages.Nd + + unicode.packages.Pc + "\_]|\s])+", "g" + ); + + + this.lineCommentStart = ["//", "#"]; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.$tokenizer.getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "php-start") { + var match = line.match(/^.*[\{\(\[\:]\s*$/); + if (match) { + indent += tab; + } + } else if (state == "php-doc-start") { + if (endState != "php-doc-start") { + return ""; + } + var match = line.match(/^\s*(\/?)\*/); + if (match) { + if (match[1]) { + indent += " "; + } + indent += "* "; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/php_worker", "PhpWorker"); + worker.attachToDocument(session.getDocument()); + + worker.on("error", function(e) { + session.setAnnotations(e.data); + }); + + worker.on("ok", function() { + session.clearAnnotations(); + }); + + return worker; + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/php_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/doc_comment_highlight_rules', 'ace/mode/text_highlight_rules', 'ace/mode/html_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules; + +var PhpLangHighlightRules = function() { + var docComment = DocCommentHighlightRules; + var builtinFunctions = lang.arrayToMap( + ('abs|acos|acosh|addcslashes|addslashes|aggregate|aggregate_info|aggregate_methods|aggregate_methods_by_list|aggregate_methods_by_regexp|' + + 'aggregate_properties|aggregate_properties_by_list|aggregate_properties_by_regexp|aggregation_info|amqpconnection|amqpexchange|amqpqueue|' + + 'apache_child_terminate|apache_get_modules|apache_get_version|apache_getenv|apache_lookup_uri|apache_note|apache_request_headers|' + + 'apache_reset_timeout|apache_response_headers|apache_setenv|apc_add|apc_bin_dump|apc_bin_dumpfile|apc_bin_load|apc_bin_loadfile|' + + 'apc_cache_info|apc_cas|apc_clear_cache|apc_compile_file|apc_dec|apc_define_constants|apc_delete|apc_delete_file|apc_exists|apc_fetch|' + + 'apc_inc|apc_load_constants|apc_sma_info|apc_store|apciterator|apd_breakpoint|apd_callstack|apd_clunk|apd_continue|apd_croak|' + + 'apd_dump_function_table|apd_dump_persistent_resources|apd_dump_regular_resources|apd_echo|apd_get_active_symbols|apd_set_pprof_trace|' + + 'apd_set_session|apd_set_session_trace|apd_set_session_trace_socket|appenditerator|array|array_change_key_case|array_chunk|array_combine|' + + 'array_count_values|array_diff|array_diff_assoc|array_diff_key|array_diff_uassoc|array_diff_ukey|array_fill|array_fill_keys|array_filter|' + + 'array_flip|array_intersect|array_intersect_assoc|array_intersect_key|array_intersect_uassoc|array_intersect_ukey|array_key_exists|' + + 'array_keys|array_map|array_merge|array_merge_recursive|array_multisort|array_pad|array_pop|array_product|array_push|array_rand|' + + 'array_reduce|array_replace|array_replace_recursive|array_reverse|array_search|array_shift|array_slice|array_splice|array_sum|array_udiff|' + + 'array_udiff_assoc|array_udiff_uassoc|array_uintersect|array_uintersect_assoc|array_uintersect_uassoc|array_unique|array_unshift|' + + 'array_values|array_walk|array_walk_recursive|arrayaccess|arrayiterator|arrayobject|arsort|asin|asinh|asort|assert|assert_options|atan|' + + 'atan2|atanh|audioproperties|badfunctioncallexception|badmethodcallexception|base64_decode|base64_encode|base_convert|basename|' + + 'bbcode_add_element|bbcode_add_smiley|bbcode_create|bbcode_destroy|bbcode_parse|bbcode_set_arg_parser|bbcode_set_flags|bcadd|bccomp|bcdiv|' + + 'bcmod|bcmul|bcompiler_load|bcompiler_load_exe|bcompiler_parse_class|bcompiler_read|bcompiler_write_class|bcompiler_write_constant|' + + 'bcompiler_write_exe_footer|bcompiler_write_file|bcompiler_write_footer|bcompiler_write_function|bcompiler_write_functions_from_file|' + + 'bcompiler_write_header|bcompiler_write_included_filename|bcpow|bcpowmod|bcscale|bcsqrt|bcsub|bin2hex|bind_textdomain_codeset|bindec|' + + 'bindtextdomain|bson_decode|bson_encode|bumpValue|bzclose|bzcompress|bzdecompress|bzerrno|bzerror|bzerrstr|bzflush|bzopen|bzread|bzwrite|' + + 'cachingiterator|cairo|cairo_create|cairo_font_face_get_type|cairo_font_face_status|cairo_font_options_create|cairo_font_options_equal|' + + 'cairo_font_options_get_antialias|cairo_font_options_get_hint_metrics|cairo_font_options_get_hint_style|' + + 'cairo_font_options_get_subpixel_order|cairo_font_options_hash|cairo_font_options_merge|cairo_font_options_set_antialias|' + + 'cairo_font_options_set_hint_metrics|cairo_font_options_set_hint_style|cairo_font_options_set_subpixel_order|cairo_font_options_status|' + + 'cairo_format_stride_for_width|cairo_image_surface_create|cairo_image_surface_create_for_data|cairo_image_surface_create_from_png|' + + 'cairo_image_surface_get_data|cairo_image_surface_get_format|cairo_image_surface_get_height|cairo_image_surface_get_stride|' + + 'cairo_image_surface_get_width|cairo_matrix_create_scale|cairo_matrix_create_translate|cairo_matrix_invert|cairo_matrix_multiply|' + + 'cairo_matrix_rotate|cairo_matrix_transform_distance|cairo_matrix_transform_point|cairo_matrix_translate|cairo_pattern_add_color_stop_rgb|' + + 'cairo_pattern_add_color_stop_rgba|cairo_pattern_create_for_surface|cairo_pattern_create_linear|cairo_pattern_create_radial|' + + 'cairo_pattern_create_rgb|cairo_pattern_create_rgba|cairo_pattern_get_color_stop_count|cairo_pattern_get_color_stop_rgba|' + + 'cairo_pattern_get_extend|cairo_pattern_get_filter|cairo_pattern_get_linear_points|cairo_pattern_get_matrix|' + + 'cairo_pattern_get_radial_circles|cairo_pattern_get_rgba|cairo_pattern_get_surface|cairo_pattern_get_type|cairo_pattern_set_extend|' + + 'cairo_pattern_set_filter|cairo_pattern_set_matrix|cairo_pattern_status|cairo_pdf_surface_create|cairo_pdf_surface_set_size|' + + 'cairo_ps_get_levels|cairo_ps_level_to_string|cairo_ps_surface_create|cairo_ps_surface_dsc_begin_page_setup|' + + 'cairo_ps_surface_dsc_begin_setup|cairo_ps_surface_dsc_comment|cairo_ps_surface_get_eps|cairo_ps_surface_restrict_to_level|' + + 'cairo_ps_surface_set_eps|cairo_ps_surface_set_size|cairo_scaled_font_create|cairo_scaled_font_extents|cairo_scaled_font_get_ctm|' + + 'cairo_scaled_font_get_font_face|cairo_scaled_font_get_font_matrix|cairo_scaled_font_get_font_options|cairo_scaled_font_get_scale_matrix|' + + 'cairo_scaled_font_get_type|cairo_scaled_font_glyph_extents|cairo_scaled_font_status|cairo_scaled_font_text_extents|' + + 'cairo_surface_copy_page|cairo_surface_create_similar|cairo_surface_finish|cairo_surface_flush|cairo_surface_get_content|' + + 'cairo_surface_get_device_offset|cairo_surface_get_font_options|cairo_surface_get_type|cairo_surface_mark_dirty|' + + 'cairo_surface_mark_dirty_rectangle|cairo_surface_set_device_offset|cairo_surface_set_fallback_resolution|cairo_surface_show_page|' + + 'cairo_surface_status|cairo_surface_write_to_png|cairo_svg_surface_create|cairo_svg_surface_restrict_to_version|' + + 'cairo_svg_version_to_string|cairoantialias|cairocontent|cairocontext|cairoexception|cairoextend|cairofillrule|cairofilter|cairofontface|' + + 'cairofontoptions|cairofontslant|cairofonttype|cairofontweight|cairoformat|cairogradientpattern|cairohintmetrics|cairohintstyle|' + + 'cairoimagesurface|cairolineargradient|cairolinecap|cairolinejoin|cairomatrix|cairooperator|cairopath|cairopattern|cairopatterntype|' + + 'cairopdfsurface|cairopslevel|cairopssurface|cairoradialgradient|cairoscaledfont|cairosolidpattern|cairostatus|cairosubpixelorder|' + + 'cairosurface|cairosurfacepattern|cairosurfacetype|cairosvgsurface|cairosvgversion|cairotoyfontface|cal_days_in_month|cal_from_jd|cal_info|' + + 'cal_to_jd|calcul_hmac|calculhmac|call_user_func|call_user_func_array|call_user_method|call_user_method_array|callbackfilteriterator|ceil|' + + 'chdb|chdb_create|chdir|checkdate|checkdnsrr|chgrp|chmod|chop|chown|chr|chroot|chunk_split|class_alias|class_exists|class_implements|' + + 'class_parents|classkit_import|classkit_method_add|classkit_method_copy|classkit_method_redefine|classkit_method_remove|' + + 'classkit_method_rename|clearstatcache|clone|closedir|closelog|collator|com|com_addref|com_create_guid|com_event_sink|com_get|' + + 'com_get_active_object|com_invoke|com_isenum|com_load|com_load_typelib|com_message_pump|com_print_typeinfo|com_propget|com_propput|' + + 'com_propset|com_release|com_set|compact|connection_aborted|connection_status|connection_timeout|constant|construct|construct|construct|' + + 'convert_cyr_string|convert_uudecode|convert_uuencode|copy|cos|cosh|count|count_chars|countable|counter_bump|counter_bump_value|' + + 'counter_create|counter_get|counter_get_meta|counter_get_named|counter_get_value|counter_reset|counter_reset_value|crack_check|' + + 'crack_closedict|crack_getlastmessage|crack_opendict|crc32|create_function|crypt|ctype_alnum|ctype_alpha|ctype_cntrl|ctype_digit|' + + 'ctype_graph|ctype_lower|ctype_print|ctype_punct|ctype_space|ctype_upper|ctype_xdigit|cubrid_affected_rows|cubrid_bind|' + + 'cubrid_client_encoding|cubrid_close|cubrid_close_prepare|cubrid_close_request|cubrid_col_get|cubrid_col_size|cubrid_column_names|' + + 'cubrid_column_types|cubrid_commit|cubrid_connect|cubrid_connect_with_url|cubrid_current_oid|cubrid_data_seek|cubrid_db_name|' + + 'cubrid_disconnect|cubrid_drop|cubrid_errno|cubrid_error|cubrid_error_code|cubrid_error_code_facility|cubrid_error_msg|cubrid_execute|' + + 'cubrid_fetch|cubrid_fetch_array|cubrid_fetch_assoc|cubrid_fetch_field|cubrid_fetch_lengths|cubrid_fetch_object|cubrid_fetch_row|' + + 'cubrid_field_flags|cubrid_field_len|cubrid_field_name|cubrid_field_seek|cubrid_field_table|cubrid_field_type|cubrid_free_result|' + + 'cubrid_get|cubrid_get_autocommit|cubrid_get_charset|cubrid_get_class_name|cubrid_get_client_info|cubrid_get_db_parameter|' + + 'cubrid_get_server_info|cubrid_insert_id|cubrid_is_instance|cubrid_list_dbs|cubrid_load_from_glo|cubrid_lob_close|cubrid_lob_export|' + + 'cubrid_lob_get|cubrid_lob_send|cubrid_lob_size|cubrid_lock_read|cubrid_lock_write|cubrid_move_cursor|cubrid_new_glo|cubrid_next_result|' + + 'cubrid_num_cols|cubrid_num_fields|cubrid_num_rows|cubrid_ping|cubrid_prepare|cubrid_put|cubrid_query|cubrid_real_escape_string|' + + 'cubrid_result|cubrid_rollback|cubrid_save_to_glo|cubrid_schema|cubrid_send_glo|cubrid_seq_drop|cubrid_seq_insert|cubrid_seq_put|' + + 'cubrid_set_add|cubrid_set_autocommit|cubrid_set_db_parameter|cubrid_set_drop|cubrid_unbuffered_query|cubrid_version|curl_close|' + + 'curl_copy_handle|curl_errno|curl_error|curl_exec|curl_getinfo|curl_init|curl_multi_add_handle|curl_multi_close|curl_multi_exec|' + + 'curl_multi_getcontent|curl_multi_info_read|curl_multi_init|curl_multi_remove_handle|curl_multi_select|curl_setopt|curl_setopt_array|' + + 'curl_version|current|cyrus_authenticate|cyrus_bind|cyrus_close|cyrus_connect|cyrus_query|cyrus_unbind|date|date_add|date_create|' + + 'date_create_from_format|date_date_set|date_default_timezone_get|date_default_timezone_set|date_diff|date_format|date_get_last_errors|' + + 'date_interval_create_from_date_string|date_interval_format|date_isodate_set|date_modify|date_offset_get|date_parse|date_parse_from_format|' + + 'date_sub|date_sun_info|date_sunrise|date_sunset|date_time_set|date_timestamp_get|date_timestamp_set|date_timezone_get|date_timezone_set|' + + 'dateinterval|dateperiod|datetime|datetimezone|db2_autocommit|db2_bind_param|db2_client_info|db2_close|db2_column_privileges|db2_columns|' + + 'db2_commit|db2_conn_error|db2_conn_errormsg|db2_connect|db2_cursor_type|db2_escape_string|db2_exec|db2_execute|db2_fetch_array|' + + 'db2_fetch_assoc|db2_fetch_both|db2_fetch_object|db2_fetch_row|db2_field_display_size|db2_field_name|db2_field_num|db2_field_precision|' + + 'db2_field_scale|db2_field_type|db2_field_width|db2_foreign_keys|db2_free_result|db2_free_stmt|db2_get_option|db2_last_insert_id|' + + 'db2_lob_read|db2_next_result|db2_num_fields|db2_num_rows|db2_pclose|db2_pconnect|db2_prepare|db2_primary_keys|db2_procedure_columns|' + + 'db2_procedures|db2_result|db2_rollback|db2_server_info|db2_set_option|db2_special_columns|db2_statistics|db2_stmt_error|db2_stmt_errormsg|' + + 'db2_table_privileges|db2_tables|dba_close|dba_delete|dba_exists|dba_fetch|dba_firstkey|dba_handlers|dba_insert|dba_key_split|dba_list|' + + 'dba_nextkey|dba_open|dba_optimize|dba_popen|dba_replace|dba_sync|dbase_add_record|dbase_close|dbase_create|dbase_delete_record|' + + 'dbase_get_header_info|dbase_get_record|dbase_get_record_with_names|dbase_numfields|dbase_numrecords|dbase_open|dbase_pack|' + + 'dbase_replace_record|dbplus_add|dbplus_aql|dbplus_chdir|dbplus_close|dbplus_curr|dbplus_errcode|dbplus_errno|dbplus_find|dbplus_first|' + + 'dbplus_flush|dbplus_freealllocks|dbplus_freelock|dbplus_freerlocks|dbplus_getlock|dbplus_getunique|dbplus_info|dbplus_last|dbplus_lockrel|' + + 'dbplus_next|dbplus_open|dbplus_prev|dbplus_rchperm|dbplus_rcreate|dbplus_rcrtexact|dbplus_rcrtlike|dbplus_resolve|dbplus_restorepos|' + + 'dbplus_rkeys|dbplus_ropen|dbplus_rquery|dbplus_rrename|dbplus_rsecindex|dbplus_runlink|dbplus_rzap|dbplus_savepos|dbplus_setindex|' + + 'dbplus_setindexbynumber|dbplus_sql|dbplus_tcl|dbplus_tremove|dbplus_undo|dbplus_undoprepare|dbplus_unlockrel|dbplus_unselect|' + + 'dbplus_update|dbplus_xlockrel|dbplus_xunlockrel|dbx_close|dbx_compare|dbx_connect|dbx_error|dbx_escape_string|dbx_fetch_row|dbx_query|' + + 'dbx_sort|dcgettext|dcngettext|deaggregate|debug_backtrace|debug_print_backtrace|debug_zval_dump|decbin|dechex|decoct|define|' + + 'define_syslog_variables|defined|deg2rad|delete|dgettext|die|dio_close|dio_fcntl|dio_open|dio_read|dio_seek|dio_stat|dio_tcsetattr|' + + 'dio_truncate|dio_write|dir|directoryiterator|dirname|disk_free_space|disk_total_space|diskfreespace|dl|dngettext|dns_check_record|' + + 'dns_get_mx|dns_get_record|dom_import_simplexml|domainexception|domattr|domattribute_name|domattribute_set_value|domattribute_specified|' + + 'domattribute_value|domcharacterdata|domcomment|domdocument|domdocument_add_root|domdocument_create_attribute|' + + 'domdocument_create_cdata_section|domdocument_create_comment|domdocument_create_element|domdocument_create_element_ns|' + + 'domdocument_create_entity_reference|domdocument_create_processing_instruction|domdocument_create_text_node|domdocument_doctype|' + + 'domdocument_document_element|domdocument_dump_file|domdocument_dump_mem|domdocument_get_element_by_id|domdocument_get_elements_by_tagname|' + + 'domdocument_html_dump_mem|domdocument_xinclude|domdocumentfragment|domdocumenttype|domdocumenttype_entities|' + + 'domdocumenttype_internal_subset|domdocumenttype_name|domdocumenttype_notations|domdocumenttype_public_id|domdocumenttype_system_id|' + + 'domelement|domelement_get_attribute|domelement_get_attribute_node|domelement_get_elements_by_tagname|domelement_has_attribute|' + + 'domelement_remove_attribute|domelement_set_attribute|domelement_set_attribute_node|domelement_tagname|domentity|domentityreference|' + + 'domexception|domimplementation|domnamednodemap|domnode|domnode_add_namespace|domnode_append_child|domnode_append_sibling|' + + 'domnode_attributes|domnode_child_nodes|domnode_clone_node|domnode_dump_node|domnode_first_child|domnode_get_content|' + + 'domnode_has_attributes|domnode_has_child_nodes|domnode_insert_before|domnode_is_blank_node|domnode_last_child|domnode_next_sibling|' + + 'domnode_node_name|domnode_node_type|domnode_node_value|domnode_owner_document|domnode_parent_node|domnode_prefix|domnode_previous_sibling|' + + 'domnode_remove_child|domnode_replace_child|domnode_replace_node|domnode_set_content|domnode_set_name|domnode_set_namespace|' + + 'domnode_unlink_node|domnodelist|domnotation|domprocessinginstruction|domprocessinginstruction_data|domprocessinginstruction_target|' + + 'domtext|domxml_new_doc|domxml_open_file|domxml_open_mem|domxml_version|domxml_xmltree|domxml_xslt_stylesheet|domxml_xslt_stylesheet_doc|' + + 'domxml_xslt_stylesheet_file|domxml_xslt_version|domxpath|domxsltstylesheet_process|domxsltstylesheet_result_dump_file|' + + 'domxsltstylesheet_result_dump_mem|dotnet|dotnet_load|doubleval|each|easter_date|easter_days|echo|empty|emptyiterator|' + + 'enchant_broker_describe|enchant_broker_dict_exists|enchant_broker_free|enchant_broker_free_dict|enchant_broker_get_error|' + + 'enchant_broker_init|enchant_broker_list_dicts|enchant_broker_request_dict|enchant_broker_request_pwl_dict|enchant_broker_set_ordering|' + + 'enchant_dict_add_to_personal|enchant_dict_add_to_session|enchant_dict_check|enchant_dict_describe|enchant_dict_get_error|' + + 'enchant_dict_is_in_session|enchant_dict_quick_check|enchant_dict_store_replacement|enchant_dict_suggest|end|ereg|ereg_replace|eregi|' + + 'eregi_replace|error_get_last|error_log|error_reporting|errorexception|escapeshellarg|escapeshellcmd|eval|event_add|event_base_free|' + + 'event_base_loop|event_base_loopbreak|event_base_loopexit|event_base_new|event_base_priority_init|event_base_set|event_buffer_base_set|' + + 'event_buffer_disable|event_buffer_enable|event_buffer_fd_set|event_buffer_free|event_buffer_new|event_buffer_priority_set|' + + 'event_buffer_read|event_buffer_set_callback|event_buffer_timeout_set|event_buffer_watermark_set|event_buffer_write|event_del|event_free|' + + 'event_new|event_set|exception|exec|exif_imagetype|exif_read_data|exif_tagname|exif_thumbnail|exit|exp|expect_expectl|expect_popen|explode|' + + 'expm1|export|export|extension_loaded|extract|ezmlm_hash|fam_cancel_monitor|fam_close|fam_monitor_collection|fam_monitor_directory|' + + 'fam_monitor_file|fam_next_event|fam_open|fam_pending|fam_resume_monitor|fam_suspend_monitor|fbsql_affected_rows|fbsql_autocommit|' + + 'fbsql_blob_size|fbsql_change_user|fbsql_clob_size|fbsql_close|fbsql_commit|fbsql_connect|fbsql_create_blob|fbsql_create_clob|' + + 'fbsql_create_db|fbsql_data_seek|fbsql_database|fbsql_database_password|fbsql_db_query|fbsql_db_status|fbsql_drop_db|fbsql_errno|' + + 'fbsql_error|fbsql_fetch_array|fbsql_fetch_assoc|fbsql_fetch_field|fbsql_fetch_lengths|fbsql_fetch_object|fbsql_fetch_row|' + + 'fbsql_field_flags|fbsql_field_len|fbsql_field_name|fbsql_field_seek|fbsql_field_table|fbsql_field_type|fbsql_free_result|' + + 'fbsql_get_autostart_info|fbsql_hostname|fbsql_insert_id|fbsql_list_dbs|fbsql_list_fields|fbsql_list_tables|fbsql_next_result|' + + 'fbsql_num_fields|fbsql_num_rows|fbsql_password|fbsql_pconnect|fbsql_query|fbsql_read_blob|fbsql_read_clob|fbsql_result|fbsql_rollback|' + + 'fbsql_rows_fetched|fbsql_select_db|fbsql_set_characterset|fbsql_set_lob_mode|fbsql_set_password|fbsql_set_transaction|fbsql_start_db|' + + 'fbsql_stop_db|fbsql_table_name|fbsql_tablename|fbsql_username|fbsql_warnings|fclose|fdf_add_doc_javascript|fdf_add_template|fdf_close|' + + 'fdf_create|fdf_enum_values|fdf_errno|fdf_error|fdf_get_ap|fdf_get_attachment|fdf_get_encoding|fdf_get_file|fdf_get_flags|fdf_get_opt|' + + 'fdf_get_status|fdf_get_value|fdf_get_version|fdf_header|fdf_next_field_name|fdf_open|fdf_open_string|fdf_remove_item|fdf_save|' + + 'fdf_save_string|fdf_set_ap|fdf_set_encoding|fdf_set_file|fdf_set_flags|fdf_set_javascript_action|fdf_set_on_import_javascript|fdf_set_opt|' + + 'fdf_set_status|fdf_set_submit_form_action|fdf_set_target_frame|fdf_set_value|fdf_set_version|feof|fflush|fgetc|fgetcsv|fgets|fgetss|file|' + + 'file_exists|file_get_contents|file_put_contents|fileatime|filectime|filegroup|fileinode|filemtime|fileowner|fileperms|filepro|' + + 'filepro_fieldcount|filepro_fieldname|filepro_fieldtype|filepro_fieldwidth|filepro_retrieve|filepro_rowcount|filesize|filesystemiterator|' + + 'filetype|filter_has_var|filter_id|filter_input|filter_input_array|filter_list|filter_var|filter_var_array|filteriterator|finfo_buffer|' + + 'finfo_close|finfo_file|finfo_open|finfo_set_flags|floatval|flock|floor|flush|fmod|fnmatch|fopen|forward_static_call|' + + 'forward_static_call_array|fpassthru|fprintf|fputcsv|fputs|fread|frenchtojd|fribidi_log2vis|fscanf|fseek|fsockopen|fstat|ftell|ftok|' + + 'ftp_alloc|ftp_cdup|ftp_chdir|ftp_chmod|ftp_close|ftp_connect|ftp_delete|ftp_exec|ftp_fget|ftp_fput|ftp_get|ftp_get_option|ftp_login|' + + 'ftp_mdtm|ftp_mkdir|ftp_nb_continue|ftp_nb_fget|ftp_nb_fput|ftp_nb_get|ftp_nb_put|ftp_nlist|ftp_pasv|ftp_put|ftp_pwd|ftp_quit|ftp_raw|' + + 'ftp_rawlist|ftp_rename|ftp_rmdir|ftp_set_option|ftp_site|ftp_size|ftp_ssl_connect|ftp_systype|ftruncate|func_get_arg|func_get_args|' + + 'func_num_args|function_exists|fwrite|gc_collect_cycles|gc_disable|gc_enable|gc_enabled|gd_info|gearmanclient|gearmanjob|gearmantask|' + + 'gearmanworker|geoip_continent_code_by_name|geoip_country_code3_by_name|geoip_country_code_by_name|geoip_country_name_by_name|' + + 'geoip_database_info|geoip_db_avail|geoip_db_filename|geoip_db_get_all_info|geoip_id_by_name|geoip_isp_by_name|geoip_org_by_name|' + + 'geoip_record_by_name|geoip_region_by_name|geoip_region_name_by_code|geoip_time_zone_by_country_and_region|getMeta|getNamed|getValue|' + + 'get_browser|get_called_class|get_cfg_var|get_class|get_class_methods|get_class_vars|get_current_user|get_declared_classes|' + + 'get_declared_interfaces|get_defined_constants|get_defined_functions|get_defined_vars|get_extension_funcs|get_headers|' + + 'get_html_translation_table|get_include_path|get_included_files|get_loaded_extensions|get_magic_quotes_gpc|get_magic_quotes_runtime|' + + 'get_meta_tags|get_object_vars|get_parent_class|get_required_files|get_resource_type|getallheaders|getconstant|getconstants|getconstructor|' + + 'getcwd|getdate|getdefaultproperties|getdoccomment|getendline|getenv|getextension|getextensionname|getfilename|gethostbyaddr|gethostbyname|' + + 'gethostbynamel|gethostname|getimagesize|getinterfacenames|getinterfaces|getlastmod|getmethod|getmethods|getmodifiers|getmxrr|getmygid|' + + 'getmyinode|getmypid|getmyuid|getname|getnamespacename|getopt|getparentclass|getproperties|getproperty|getprotobyname|getprotobynumber|' + + 'getrandmax|getrusage|getservbyname|getservbyport|getshortname|getstartline|getstaticproperties|getstaticpropertyvalue|gettext|' + + 'gettimeofday|gettype|glob|globiterator|gmagick|gmagickdraw|gmagickpixel|gmdate|gmmktime|gmp_abs|gmp_add|gmp_and|gmp_clrbit|gmp_cmp|' + + 'gmp_com|gmp_div|gmp_div_q|gmp_div_qr|gmp_div_r|gmp_divexact|gmp_fact|gmp_gcd|gmp_gcdext|gmp_hamdist|gmp_init|gmp_intval|gmp_invert|' + + 'gmp_jacobi|gmp_legendre|gmp_mod|gmp_mul|gmp_neg|gmp_nextprime|gmp_or|gmp_perfect_square|gmp_popcount|gmp_pow|gmp_powm|gmp_prob_prime|' + + 'gmp_random|gmp_scan0|gmp_scan1|gmp_setbit|gmp_sign|gmp_sqrt|gmp_sqrtrem|gmp_strval|gmp_sub|gmp_testbit|gmp_xor|gmstrftime|' + + 'gnupg_adddecryptkey|gnupg_addencryptkey|gnupg_addsignkey|gnupg_cleardecryptkeys|gnupg_clearencryptkeys|gnupg_clearsignkeys|gnupg_decrypt|' + + 'gnupg_decryptverify|gnupg_encrypt|gnupg_encryptsign|gnupg_export|gnupg_geterror|gnupg_getprotocol|gnupg_import|gnupg_init|gnupg_keyinfo|' + + 'gnupg_setarmor|gnupg_seterrormode|gnupg_setsignmode|gnupg_sign|gnupg_verify|gopher_parsedir|grapheme_extract|grapheme_stripos|' + + 'grapheme_stristr|grapheme_strlen|grapheme_strpos|grapheme_strripos|grapheme_strrpos|grapheme_strstr|grapheme_substr|gregoriantojd|' + + 'gupnp_context_get_host_ip|gupnp_context_get_port|gupnp_context_get_subscription_timeout|gupnp_context_host_path|gupnp_context_new|' + + 'gupnp_context_set_subscription_timeout|gupnp_context_timeout_add|gupnp_context_unhost_path|gupnp_control_point_browse_start|' + + 'gupnp_control_point_browse_stop|gupnp_control_point_callback_set|gupnp_control_point_new|gupnp_device_action_callback_set|' + + 'gupnp_device_info_get|gupnp_device_info_get_service|gupnp_root_device_get_available|gupnp_root_device_get_relative_location|' + + 'gupnp_root_device_new|gupnp_root_device_set_available|gupnp_root_device_start|gupnp_root_device_stop|gupnp_service_action_get|' + + 'gupnp_service_action_return|gupnp_service_action_return_error|gupnp_service_action_set|gupnp_service_freeze_notify|gupnp_service_info_get|' + + 'gupnp_service_info_get_introspection|gupnp_service_introspection_get_state_variable|gupnp_service_notify|gupnp_service_proxy_action_get|' + + 'gupnp_service_proxy_action_set|gupnp_service_proxy_add_notify|gupnp_service_proxy_callback_set|gupnp_service_proxy_get_subscribed|' + + 'gupnp_service_proxy_remove_notify|gupnp_service_proxy_set_subscribed|gupnp_service_thaw_notify|gzclose|gzcompress|gzdecode|gzdeflate|' + + 'gzencode|gzeof|gzfile|gzgetc|gzgets|gzgetss|gzinflate|gzopen|gzpassthru|gzputs|gzread|gzrewind|gzseek|gztell|gzuncompress|gzwrite|' + + 'halt_compiler|haruannotation|haruannotation_setborderstyle|haruannotation_sethighlightmode|haruannotation_seticon|' + + 'haruannotation_setopened|harudestination|harudestination_setfit|harudestination_setfitb|harudestination_setfitbh|harudestination_setfitbv|' + + 'harudestination_setfith|harudestination_setfitr|harudestination_setfitv|harudestination_setxyz|harudoc|harudoc_addpage|' + + 'harudoc_addpagelabel|harudoc_construct|harudoc_createoutline|harudoc_getcurrentencoder|harudoc_getcurrentpage|harudoc_getencoder|' + + 'harudoc_getfont|harudoc_getinfoattr|harudoc_getpagelayout|harudoc_getpagemode|harudoc_getstreamsize|harudoc_insertpage|harudoc_loadjpeg|' + + 'harudoc_loadpng|harudoc_loadraw|harudoc_loadttc|harudoc_loadttf|harudoc_loadtype1|harudoc_output|harudoc_readfromstream|' + + 'harudoc_reseterror|harudoc_resetstream|harudoc_save|harudoc_savetostream|harudoc_setcompressionmode|harudoc_setcurrentencoder|' + + 'harudoc_setencryptionmode|harudoc_setinfoattr|harudoc_setinfodateattr|harudoc_setopenaction|harudoc_setpagelayout|harudoc_setpagemode|' + + 'harudoc_setpagesconfiguration|harudoc_setpassword|harudoc_setpermission|harudoc_usecnsencodings|harudoc_usecnsfonts|' + + 'harudoc_usecntencodings|harudoc_usecntfonts|harudoc_usejpencodings|harudoc_usejpfonts|harudoc_usekrencodings|harudoc_usekrfonts|' + + 'haruencoder|haruencoder_getbytetype|haruencoder_gettype|haruencoder_getunicode|haruencoder_getwritingmode|haruexception|harufont|' + + 'harufont_getascent|harufont_getcapheight|harufont_getdescent|harufont_getencodingname|harufont_getfontname|harufont_gettextwidth|' + + 'harufont_getunicodewidth|harufont_getxheight|harufont_measuretext|haruimage|haruimage_getbitspercomponent|haruimage_getcolorspace|' + + 'haruimage_getheight|haruimage_getsize|haruimage_getwidth|haruimage_setcolormask|haruimage_setmaskimage|haruoutline|' + + 'haruoutline_setdestination|haruoutline_setopened|harupage|harupage_arc|harupage_begintext|harupage_circle|harupage_closepath|' + + 'harupage_concat|harupage_createdestination|harupage_createlinkannotation|harupage_createtextannotation|harupage_createurlannotation|' + + 'harupage_curveto|harupage_curveto2|harupage_curveto3|harupage_drawimage|harupage_ellipse|harupage_endpath|harupage_endtext|' + + 'harupage_eofill|harupage_eofillstroke|harupage_fill|harupage_fillstroke|harupage_getcharspace|harupage_getcmykfill|harupage_getcmykstroke|' + + 'harupage_getcurrentfont|harupage_getcurrentfontsize|harupage_getcurrentpos|harupage_getcurrenttextpos|harupage_getdash|' + + 'harupage_getfillingcolorspace|harupage_getflatness|harupage_getgmode|harupage_getgrayfill|harupage_getgraystroke|harupage_getheight|' + + 'harupage_gethorizontalscaling|harupage_getlinecap|harupage_getlinejoin|harupage_getlinewidth|harupage_getmiterlimit|harupage_getrgbfill|' + + 'harupage_getrgbstroke|harupage_getstrokingcolorspace|harupage_gettextleading|harupage_gettextmatrix|harupage_gettextrenderingmode|' + + 'harupage_gettextrise|harupage_gettextwidth|harupage_gettransmatrix|harupage_getwidth|harupage_getwordspace|harupage_lineto|' + + 'harupage_measuretext|harupage_movetextpos|harupage_moveto|harupage_movetonextline|harupage_rectangle|harupage_setcharspace|' + + 'harupage_setcmykfill|harupage_setcmykstroke|harupage_setdash|harupage_setflatness|harupage_setfontandsize|harupage_setgrayfill|' + + 'harupage_setgraystroke|harupage_setheight|harupage_sethorizontalscaling|harupage_setlinecap|harupage_setlinejoin|harupage_setlinewidth|' + + 'harupage_setmiterlimit|harupage_setrgbfill|harupage_setrgbstroke|harupage_setrotate|harupage_setsize|harupage_setslideshow|' + + 'harupage_settextleading|harupage_settextmatrix|harupage_settextrenderingmode|harupage_settextrise|harupage_setwidth|harupage_setwordspace|' + + 'harupage_showtext|harupage_showtextnextline|harupage_stroke|harupage_textout|harupage_textrect|hasconstant|hash|hash_algos|hash_copy|' + + 'hash_file|hash_final|hash_hmac|hash_hmac_file|hash_init|hash_update|hash_update_file|hash_update_stream|hasmethod|hasproperty|header|' + + 'header_register_callback|header_remove|headers_list|headers_sent|hebrev|hebrevc|hex2bin|hexdec|highlight_file|highlight_string|' + + 'html_entity_decode|htmlentities|htmlspecialchars|htmlspecialchars_decode|http_build_cookie|http_build_query|http_build_str|http_build_url|' + + 'http_cache_etag|http_cache_last_modified|http_chunked_decode|http_date|http_deflate|http_get|http_get_request_body|' + + 'http_get_request_body_stream|http_get_request_headers|http_head|http_inflate|http_match_etag|http_match_modified|' + + 'http_match_request_header|http_negotiate_charset|http_negotiate_content_type|http_negotiate_language|http_parse_cookie|http_parse_headers|' + + 'http_parse_message|http_parse_params|http_persistent_handles_clean|http_persistent_handles_count|http_persistent_handles_ident|' + + 'http_post_data|http_post_fields|http_put_data|http_put_file|http_put_stream|http_redirect|http_request|http_request_body_encode|' + + 'http_request_method_exists|http_request_method_name|http_request_method_register|http_request_method_unregister|http_response_code|' + + 'http_send_content_disposition|http_send_content_type|http_send_data|http_send_file|http_send_last_modified|http_send_status|' + + 'http_send_stream|http_support|http_throttle|httpdeflatestream|httpdeflatestream_construct|httpdeflatestream_factory|' + + 'httpdeflatestream_finish|httpdeflatestream_flush|httpdeflatestream_update|httpinflatestream|httpinflatestream_construct|' + + 'httpinflatestream_factory|httpinflatestream_finish|httpinflatestream_flush|httpinflatestream_update|httpmessage|httpmessage_addheaders|' + + 'httpmessage_construct|httpmessage_detach|httpmessage_factory|httpmessage_fromenv|httpmessage_fromstring|httpmessage_getbody|' + + 'httpmessage_getheader|httpmessage_getheaders|httpmessage_gethttpversion|httpmessage_getparentmessage|httpmessage_getrequestmethod|' + + 'httpmessage_getrequesturl|httpmessage_getresponsecode|httpmessage_getresponsestatus|httpmessage_gettype|httpmessage_guesscontenttype|' + + 'httpmessage_prepend|httpmessage_reverse|httpmessage_send|httpmessage_setbody|httpmessage_setheaders|httpmessage_sethttpversion|' + + 'httpmessage_setrequestmethod|httpmessage_setrequesturl|httpmessage_setresponsecode|httpmessage_setresponsestatus|httpmessage_settype|' + + 'httpmessage_tomessagetypeobject|httpmessage_tostring|httpquerystring|httpquerystring_construct|httpquerystring_get|httpquerystring_mod|' + + 'httpquerystring_set|httpquerystring_singleton|httpquerystring_toarray|httpquerystring_tostring|httpquerystring_xlate|httprequest|' + + 'httprequest_addcookies|httprequest_addheaders|httprequest_addpostfields|httprequest_addpostfile|httprequest_addputdata|' + + 'httprequest_addquerydata|httprequest_addrawpostdata|httprequest_addssloptions|httprequest_clearhistory|httprequest_construct|' + + 'httprequest_enablecookies|httprequest_getcontenttype|httprequest_getcookies|httprequest_getheaders|httprequest_gethistory|' + + 'httprequest_getmethod|httprequest_getoptions|httprequest_getpostfields|httprequest_getpostfiles|httprequest_getputdata|' + + 'httprequest_getputfile|httprequest_getquerydata|httprequest_getrawpostdata|httprequest_getrawrequestmessage|' + + 'httprequest_getrawresponsemessage|httprequest_getrequestmessage|httprequest_getresponsebody|httprequest_getresponsecode|' + + 'httprequest_getresponsecookies|httprequest_getresponsedata|httprequest_getresponseheader|httprequest_getresponseinfo|' + + 'httprequest_getresponsemessage|httprequest_getresponsestatus|httprequest_getssloptions|httprequest_geturl|httprequest_resetcookies|' + + 'httprequest_send|httprequest_setcontenttype|httprequest_setcookies|httprequest_setheaders|httprequest_setmethod|httprequest_setoptions|' + + 'httprequest_setpostfields|httprequest_setpostfiles|httprequest_setputdata|httprequest_setputfile|httprequest_setquerydata|' + + 'httprequest_setrawpostdata|httprequest_setssloptions|httprequest_seturl|httprequestpool|httprequestpool_attach|httprequestpool_construct|' + + 'httprequestpool_destruct|httprequestpool_detach|httprequestpool_getattachedrequests|httprequestpool_getfinishedrequests|' + + 'httprequestpool_reset|httprequestpool_send|httprequestpool_socketperform|httprequestpool_socketselect|httpresponse|httpresponse_capture|' + + 'httpresponse_getbuffersize|httpresponse_getcache|httpresponse_getcachecontrol|httpresponse_getcontentdisposition|' + + 'httpresponse_getcontenttype|httpresponse_getdata|httpresponse_getetag|httpresponse_getfile|httpresponse_getgzip|httpresponse_getheader|' + + 'httpresponse_getlastmodified|httpresponse_getrequestbody|httpresponse_getrequestbodystream|httpresponse_getrequestheaders|' + + 'httpresponse_getstream|httpresponse_getthrottledelay|httpresponse_guesscontenttype|httpresponse_redirect|httpresponse_send|' + + 'httpresponse_setbuffersize|httpresponse_setcache|httpresponse_setcachecontrol|httpresponse_setcontentdisposition|' + + 'httpresponse_setcontenttype|httpresponse_setdata|httpresponse_setetag|httpresponse_setfile|httpresponse_setgzip|httpresponse_setheader|' + + 'httpresponse_setlastmodified|httpresponse_setstream|httpresponse_setthrottledelay|httpresponse_status|hw_array2objrec|hw_changeobject|' + + 'hw_children|hw_childrenobj|hw_close|hw_connect|hw_connection_info|hw_cp|hw_deleteobject|hw_docbyanchor|hw_docbyanchorobj|' + + 'hw_document_attributes|hw_document_bodytag|hw_document_content|hw_document_setcontent|hw_document_size|hw_dummy|hw_edittext|hw_error|' + + 'hw_errormsg|hw_free_document|hw_getanchors|hw_getanchorsobj|hw_getandlock|hw_getchildcoll|hw_getchildcollobj|hw_getchilddoccoll|' + + 'hw_getchilddoccollobj|hw_getobject|hw_getobjectbyquery|hw_getobjectbyquerycoll|hw_getobjectbyquerycollobj|hw_getobjectbyqueryobj|' + + 'hw_getparents|hw_getparentsobj|hw_getrellink|hw_getremote|hw_getremotechildren|hw_getsrcbydestobj|hw_gettext|hw_getusername|hw_identify|' + + 'hw_incollections|hw_info|hw_inscoll|hw_insdoc|hw_insertanchors|hw_insertdocument|hw_insertobject|hw_mapid|hw_modifyobject|hw_mv|' + + 'hw_new_document|hw_objrec2array|hw_output_document|hw_pconnect|hw_pipedocument|hw_root|hw_setlinkroot|hw_stat|hw_unlock|hw_who|' + + 'hwapi_attribute|hwapi_attribute_key|hwapi_attribute_langdepvalue|hwapi_attribute_value|hwapi_attribute_values|hwapi_checkin|' + + 'hwapi_checkout|hwapi_children|hwapi_content|hwapi_content_mimetype|hwapi_content_read|hwapi_copy|hwapi_dbstat|hwapi_dcstat|' + + 'hwapi_dstanchors|hwapi_dstofsrcanchor|hwapi_error_count|hwapi_error_reason|hwapi_find|hwapi_ftstat|hwapi_hgcsp|hwapi_hwstat|' + + 'hwapi_identify|hwapi_info|hwapi_insert|hwapi_insertanchor|hwapi_insertcollection|hwapi_insertdocument|hwapi_link|hwapi_lock|hwapi_move|' + + 'hwapi_new_content|hwapi_object|hwapi_object_assign|hwapi_object_attreditable|hwapi_object_count|hwapi_object_insert|hwapi_object_new|' + + 'hwapi_object_remove|hwapi_object_title|hwapi_object_value|hwapi_objectbyanchor|hwapi_parents|hwapi_reason_description|hwapi_reason_type|' + + 'hwapi_remove|hwapi_replace|hwapi_setcommittedversion|hwapi_srcanchors|hwapi_srcsofdst|hwapi_unlock|hwapi_user|hwapi_userlist|hypot|' + + 'ibase_add_user|ibase_affected_rows|ibase_backup|ibase_blob_add|ibase_blob_cancel|ibase_blob_close|ibase_blob_create|ibase_blob_echo|' + + 'ibase_blob_get|ibase_blob_import|ibase_blob_info|ibase_blob_open|ibase_close|ibase_commit|ibase_commit_ret|ibase_connect|ibase_db_info|' + + 'ibase_delete_user|ibase_drop_db|ibase_errcode|ibase_errmsg|ibase_execute|ibase_fetch_assoc|ibase_fetch_object|ibase_fetch_row|' + + 'ibase_field_info|ibase_free_event_handler|ibase_free_query|ibase_free_result|ibase_gen_id|ibase_maintain_db|ibase_modify_user|' + + 'ibase_name_result|ibase_num_fields|ibase_num_params|ibase_param_info|ibase_pconnect|ibase_prepare|ibase_query|ibase_restore|' + + 'ibase_rollback|ibase_rollback_ret|ibase_server_info|ibase_service_attach|ibase_service_detach|ibase_set_event_handler|ibase_timefmt|' + + 'ibase_trans|ibase_wait_event|iconv|iconv_get_encoding|iconv_mime_decode|iconv_mime_decode_headers|iconv_mime_encode|iconv_set_encoding|' + + 'iconv_strlen|iconv_strpos|iconv_strrpos|iconv_substr|id3_get_frame_long_name|id3_get_frame_short_name|id3_get_genre_id|id3_get_genre_list|' + + 'id3_get_genre_name|id3_get_tag|id3_get_version|id3_remove_tag|id3_set_tag|id3v2attachedpictureframe|id3v2frame|id3v2tag|idate|' + + 'idn_to_ascii|idn_to_unicode|idn_to_utf8|ifx_affected_rows|ifx_blobinfile_mode|ifx_byteasvarchar|ifx_close|ifx_connect|ifx_copy_blob|' + + 'ifx_create_blob|ifx_create_char|ifx_do|ifx_error|ifx_errormsg|ifx_fetch_row|ifx_fieldproperties|ifx_fieldtypes|ifx_free_blob|' + + 'ifx_free_char|ifx_free_result|ifx_get_blob|ifx_get_char|ifx_getsqlca|ifx_htmltbl_result|ifx_nullformat|ifx_num_fields|ifx_num_rows|' + + 'ifx_pconnect|ifx_prepare|ifx_query|ifx_textasvarchar|ifx_update_blob|ifx_update_char|ifxus_close_slob|ifxus_create_slob|ifxus_free_slob|' + + 'ifxus_open_slob|ifxus_read_slob|ifxus_seek_slob|ifxus_tell_slob|ifxus_write_slob|ignore_user_abort|iis_add_server|iis_get_dir_security|' + + 'iis_get_script_map|iis_get_server_by_comment|iis_get_server_by_path|iis_get_server_rights|iis_get_service_state|iis_remove_server|' + + 'iis_set_app_settings|iis_set_dir_security|iis_set_script_map|iis_set_server_rights|iis_start_server|iis_start_service|iis_stop_server|' + + 'iis_stop_service|image2wbmp|image_type_to_extension|image_type_to_mime_type|imagealphablending|imageantialias|imagearc|imagechar|' + + 'imagecharup|imagecolorallocate|imagecolorallocatealpha|imagecolorat|imagecolorclosest|imagecolorclosestalpha|imagecolorclosesthwb|' + + 'imagecolordeallocate|imagecolorexact|imagecolorexactalpha|imagecolormatch|imagecolorresolve|imagecolorresolvealpha|imagecolorset|' + + 'imagecolorsforindex|imagecolorstotal|imagecolortransparent|imageconvolution|imagecopy|imagecopymerge|imagecopymergegray|' + + 'imagecopyresampled|imagecopyresized|imagecreate|imagecreatefromgd|imagecreatefromgd2|imagecreatefromgd2part|imagecreatefromgif|' + + 'imagecreatefromjpeg|imagecreatefrompng|imagecreatefromstring|imagecreatefromwbmp|imagecreatefromxbm|imagecreatefromxpm|' + + 'imagecreatetruecolor|imagedashedline|imagedestroy|imageellipse|imagefill|imagefilledarc|imagefilledellipse|imagefilledpolygon|' + + 'imagefilledrectangle|imagefilltoborder|imagefilter|imagefontheight|imagefontwidth|imageftbbox|imagefttext|imagegammacorrect|imagegd|' + + 'imagegd2|imagegif|imagegrabscreen|imagegrabwindow|imageinterlace|imageistruecolor|imagejpeg|imagelayereffect|imageline|imageloadfont|' + + 'imagepalettecopy|imagepng|imagepolygon|imagepsbbox|imagepsencodefont|imagepsextendfont|imagepsfreefont|imagepsloadfont|imagepsslantfont|' + + 'imagepstext|imagerectangle|imagerotate|imagesavealpha|imagesetbrush|imagesetpixel|imagesetstyle|imagesetthickness|imagesettile|' + + 'imagestring|imagestringup|imagesx|imagesy|imagetruecolortopalette|imagettfbbox|imagettftext|imagetypes|imagewbmp|imagexbm|imagick|' + + 'imagick_adaptiveblurimage|imagick_adaptiveresizeimage|imagick_adaptivesharpenimage|imagick_adaptivethresholdimage|imagick_addimage|' + + 'imagick_addnoiseimage|imagick_affinetransformimage|imagick_animateimages|imagick_annotateimage|imagick_appendimages|imagick_averageimages|' + + 'imagick_blackthresholdimage|imagick_blurimage|imagick_borderimage|imagick_charcoalimage|imagick_chopimage|imagick_clear|imagick_clipimage|' + + 'imagick_clippathimage|imagick_clone|imagick_clutimage|imagick_coalesceimages|imagick_colorfloodfillimage|imagick_colorizeimage|' + + 'imagick_combineimages|imagick_commentimage|imagick_compareimagechannels|imagick_compareimagelayers|imagick_compareimages|' + + 'imagick_compositeimage|imagick_construct|imagick_contrastimage|imagick_contraststretchimage|imagick_convolveimage|imagick_cropimage|' + + 'imagick_cropthumbnailimage|imagick_current|imagick_cyclecolormapimage|imagick_decipherimage|imagick_deconstructimages|' + + 'imagick_deleteimageartifact|imagick_despeckleimage|imagick_destroy|imagick_displayimage|imagick_displayimages|imagick_distortimage|' + + 'imagick_drawimage|imagick_edgeimage|imagick_embossimage|imagick_encipherimage|imagick_enhanceimage|imagick_equalizeimage|' + + 'imagick_evaluateimage|imagick_extentimage|imagick_flattenimages|imagick_flipimage|imagick_floodfillpaintimage|imagick_flopimage|' + + 'imagick_frameimage|imagick_fximage|imagick_gammaimage|imagick_gaussianblurimage|imagick_getcolorspace|imagick_getcompression|' + + 'imagick_getcompressionquality|imagick_getcopyright|imagick_getfilename|imagick_getfont|imagick_getformat|imagick_getgravity|' + + 'imagick_gethomeurl|imagick_getimage|imagick_getimagealphachannel|imagick_getimageartifact|imagick_getimagebackgroundcolor|' + + 'imagick_getimageblob|imagick_getimageblueprimary|imagick_getimagebordercolor|imagick_getimagechanneldepth|' + + 'imagick_getimagechanneldistortion|imagick_getimagechanneldistortions|imagick_getimagechannelextrema|imagick_getimagechannelmean|' + + 'imagick_getimagechannelrange|imagick_getimagechannelstatistics|imagick_getimageclipmask|imagick_getimagecolormapcolor|' + + 'imagick_getimagecolors|imagick_getimagecolorspace|imagick_getimagecompose|imagick_getimagecompression|imagick_getimagecompressionquality|' + + 'imagick_getimagedelay|imagick_getimagedepth|imagick_getimagedispose|imagick_getimagedistortion|imagick_getimageextrema|' + + 'imagick_getimagefilename|imagick_getimageformat|imagick_getimagegamma|imagick_getimagegeometry|imagick_getimagegravity|' + + 'imagick_getimagegreenprimary|imagick_getimageheight|imagick_getimagehistogram|imagick_getimageindex|imagick_getimageinterlacescheme|' + + 'imagick_getimageinterpolatemethod|imagick_getimageiterations|imagick_getimagelength|imagick_getimagemagicklicense|imagick_getimagematte|' + + 'imagick_getimagemattecolor|imagick_getimageorientation|imagick_getimagepage|imagick_getimagepixelcolor|imagick_getimageprofile|' + + 'imagick_getimageprofiles|imagick_getimageproperties|imagick_getimageproperty|imagick_getimageredprimary|imagick_getimageregion|' + + 'imagick_getimagerenderingintent|imagick_getimageresolution|imagick_getimagesblob|imagick_getimagescene|imagick_getimagesignature|' + + 'imagick_getimagesize|imagick_getimagetickspersecond|imagick_getimagetotalinkdensity|imagick_getimagetype|imagick_getimageunits|' + + 'imagick_getimagevirtualpixelmethod|imagick_getimagewhitepoint|imagick_getimagewidth|imagick_getinterlacescheme|imagick_getiteratorindex|' + + 'imagick_getnumberimages|imagick_getoption|imagick_getpackagename|imagick_getpage|imagick_getpixeliterator|imagick_getpixelregioniterator|' + + 'imagick_getpointsize|imagick_getquantumdepth|imagick_getquantumrange|imagick_getreleasedate|imagick_getresource|imagick_getresourcelimit|' + + 'imagick_getsamplingfactors|imagick_getsize|imagick_getsizeoffset|imagick_getversion|imagick_hasnextimage|imagick_haspreviousimage|' + + 'imagick_identifyimage|imagick_implodeimage|imagick_labelimage|imagick_levelimage|imagick_linearstretchimage|imagick_liquidrescaleimage|' + + 'imagick_magnifyimage|imagick_mapimage|imagick_mattefloodfillimage|imagick_medianfilterimage|imagick_mergeimagelayers|imagick_minifyimage|' + + 'imagick_modulateimage|imagick_montageimage|imagick_morphimages|imagick_mosaicimages|imagick_motionblurimage|imagick_negateimage|' + + 'imagick_newimage|imagick_newpseudoimage|imagick_nextimage|imagick_normalizeimage|imagick_oilpaintimage|imagick_opaquepaintimage|' + + 'imagick_optimizeimagelayers|imagick_orderedposterizeimage|imagick_paintfloodfillimage|imagick_paintopaqueimage|' + + 'imagick_painttransparentimage|imagick_pingimage|imagick_pingimageblob|imagick_pingimagefile|imagick_polaroidimage|imagick_posterizeimage|' + + 'imagick_previewimages|imagick_previousimage|imagick_profileimage|imagick_quantizeimage|imagick_quantizeimages|imagick_queryfontmetrics|' + + 'imagick_queryfonts|imagick_queryformats|imagick_radialblurimage|imagick_raiseimage|imagick_randomthresholdimage|imagick_readimage|' + + 'imagick_readimageblob|imagick_readimagefile|imagick_recolorimage|imagick_reducenoiseimage|imagick_removeimage|imagick_removeimageprofile|' + + 'imagick_render|imagick_resampleimage|imagick_resetimagepage|imagick_resizeimage|imagick_rollimage|imagick_rotateimage|' + + 'imagick_roundcorners|imagick_sampleimage|imagick_scaleimage|imagick_separateimagechannel|imagick_sepiatoneimage|' + + 'imagick_setbackgroundcolor|imagick_setcolorspace|imagick_setcompression|imagick_setcompressionquality|imagick_setfilename|' + + 'imagick_setfirstiterator|imagick_setfont|imagick_setformat|imagick_setgravity|imagick_setimage|imagick_setimagealphachannel|' + + 'imagick_setimageartifact|imagick_setimagebackgroundcolor|imagick_setimagebias|imagick_setimageblueprimary|imagick_setimagebordercolor|' + + 'imagick_setimagechanneldepth|imagick_setimageclipmask|imagick_setimagecolormapcolor|imagick_setimagecolorspace|imagick_setimagecompose|' + + 'imagick_setimagecompression|imagick_setimagecompressionquality|imagick_setimagedelay|imagick_setimagedepth|imagick_setimagedispose|' + + 'imagick_setimageextent|imagick_setimagefilename|imagick_setimageformat|imagick_setimagegamma|imagick_setimagegravity|' + + 'imagick_setimagegreenprimary|imagick_setimageindex|imagick_setimageinterlacescheme|imagick_setimageinterpolatemethod|' + + 'imagick_setimageiterations|imagick_setimagematte|imagick_setimagemattecolor|imagick_setimageopacity|imagick_setimageorientation|' + + 'imagick_setimagepage|imagick_setimageprofile|imagick_setimageproperty|imagick_setimageredprimary|imagick_setimagerenderingintent|' + + 'imagick_setimageresolution|imagick_setimagescene|imagick_setimagetickspersecond|imagick_setimagetype|imagick_setimageunits|' + + 'imagick_setimagevirtualpixelmethod|imagick_setimagewhitepoint|imagick_setinterlacescheme|imagick_setiteratorindex|imagick_setlastiterator|' + + 'imagick_setoption|imagick_setpage|imagick_setpointsize|imagick_setresolution|imagick_setresourcelimit|imagick_setsamplingfactors|' + + 'imagick_setsize|imagick_setsizeoffset|imagick_settype|imagick_shadeimage|imagick_shadowimage|imagick_sharpenimage|imagick_shaveimage|' + + 'imagick_shearimage|imagick_sigmoidalcontrastimage|imagick_sketchimage|imagick_solarizeimage|imagick_spliceimage|imagick_spreadimage|' + + 'imagick_steganoimage|imagick_stereoimage|imagick_stripimage|imagick_swirlimage|imagick_textureimage|imagick_thresholdimage|' + + 'imagick_thumbnailimage|imagick_tintimage|imagick_transformimage|imagick_transparentpaintimage|imagick_transposeimage|' + + 'imagick_transverseimage|imagick_trimimage|imagick_uniqueimagecolors|imagick_unsharpmaskimage|imagick_valid|imagick_vignetteimage|' + + 'imagick_waveimage|imagick_whitethresholdimage|imagick_writeimage|imagick_writeimagefile|imagick_writeimages|imagick_writeimagesfile|' + + 'imagickdraw|imagickdraw_affine|imagickdraw_annotation|imagickdraw_arc|imagickdraw_bezier|imagickdraw_circle|imagickdraw_clear|' + + 'imagickdraw_clone|imagickdraw_color|imagickdraw_comment|imagickdraw_composite|imagickdraw_construct|imagickdraw_destroy|' + + 'imagickdraw_ellipse|imagickdraw_getclippath|imagickdraw_getcliprule|imagickdraw_getclipunits|imagickdraw_getfillcolor|' + + 'imagickdraw_getfillopacity|imagickdraw_getfillrule|imagickdraw_getfont|imagickdraw_getfontfamily|imagickdraw_getfontsize|' + + 'imagickdraw_getfontstyle|imagickdraw_getfontweight|imagickdraw_getgravity|imagickdraw_getstrokeantialias|imagickdraw_getstrokecolor|' + + 'imagickdraw_getstrokedasharray|imagickdraw_getstrokedashoffset|imagickdraw_getstrokelinecap|imagickdraw_getstrokelinejoin|' + + 'imagickdraw_getstrokemiterlimit|imagickdraw_getstrokeopacity|imagickdraw_getstrokewidth|imagickdraw_gettextalignment|' + + 'imagickdraw_gettextantialias|imagickdraw_gettextdecoration|imagickdraw_gettextencoding|imagickdraw_gettextundercolor|' + + 'imagickdraw_getvectorgraphics|imagickdraw_line|imagickdraw_matte|imagickdraw_pathclose|imagickdraw_pathcurvetoabsolute|' + + 'imagickdraw_pathcurvetoquadraticbezierabsolute|imagickdraw_pathcurvetoquadraticbezierrelative|' + + 'imagickdraw_pathcurvetoquadraticbeziersmoothabsolute|imagickdraw_pathcurvetoquadraticbeziersmoothrelative|imagickdraw_pathcurvetorelative|' + + 'imagickdraw_pathcurvetosmoothabsolute|imagickdraw_pathcurvetosmoothrelative|imagickdraw_pathellipticarcabsolute|' + + 'imagickdraw_pathellipticarcrelative|imagickdraw_pathfinish|imagickdraw_pathlinetoabsolute|imagickdraw_pathlinetohorizontalabsolute|' + + 'imagickdraw_pathlinetohorizontalrelative|imagickdraw_pathlinetorelative|imagickdraw_pathlinetoverticalabsolute|' + + 'imagickdraw_pathlinetoverticalrelative|imagickdraw_pathmovetoabsolute|imagickdraw_pathmovetorelative|imagickdraw_pathstart|' + + 'imagickdraw_point|imagickdraw_polygon|imagickdraw_polyline|imagickdraw_pop|imagickdraw_popclippath|imagickdraw_popdefs|' + + 'imagickdraw_poppattern|imagickdraw_push|imagickdraw_pushclippath|imagickdraw_pushdefs|imagickdraw_pushpattern|imagickdraw_rectangle|' + + 'imagickdraw_render|imagickdraw_rotate|imagickdraw_roundrectangle|imagickdraw_scale|imagickdraw_setclippath|imagickdraw_setcliprule|' + + 'imagickdraw_setclipunits|imagickdraw_setfillalpha|imagickdraw_setfillcolor|imagickdraw_setfillopacity|imagickdraw_setfillpatternurl|' + + 'imagickdraw_setfillrule|imagickdraw_setfont|imagickdraw_setfontfamily|imagickdraw_setfontsize|imagickdraw_setfontstretch|' + + 'imagickdraw_setfontstyle|imagickdraw_setfontweight|imagickdraw_setgravity|imagickdraw_setstrokealpha|imagickdraw_setstrokeantialias|' + + 'imagickdraw_setstrokecolor|imagickdraw_setstrokedasharray|imagickdraw_setstrokedashoffset|imagickdraw_setstrokelinecap|' + + 'imagickdraw_setstrokelinejoin|imagickdraw_setstrokemiterlimit|imagickdraw_setstrokeopacity|imagickdraw_setstrokepatternurl|' + + 'imagickdraw_setstrokewidth|imagickdraw_settextalignment|imagickdraw_settextantialias|imagickdraw_settextdecoration|' + + 'imagickdraw_settextencoding|imagickdraw_settextundercolor|imagickdraw_setvectorgraphics|imagickdraw_setviewbox|imagickdraw_skewx|' + + 'imagickdraw_skewy|imagickdraw_translate|imagickpixel|imagickpixel_clear|imagickpixel_construct|imagickpixel_destroy|imagickpixel_getcolor|' + + 'imagickpixel_getcolorasstring|imagickpixel_getcolorcount|imagickpixel_getcolorvalue|imagickpixel_gethsl|imagickpixel_issimilar|' + + 'imagickpixel_setcolor|imagickpixel_setcolorvalue|imagickpixel_sethsl|imagickpixeliterator|imagickpixeliterator_clear|' + + 'imagickpixeliterator_construct|imagickpixeliterator_destroy|imagickpixeliterator_getcurrentiteratorrow|' + + 'imagickpixeliterator_getiteratorrow|imagickpixeliterator_getnextiteratorrow|imagickpixeliterator_getpreviousiteratorrow|' + + 'imagickpixeliterator_newpixeliterator|imagickpixeliterator_newpixelregioniterator|imagickpixeliterator_resetiterator|' + + 'imagickpixeliterator_setiteratorfirstrow|imagickpixeliterator_setiteratorlastrow|imagickpixeliterator_setiteratorrow|' + + 'imagickpixeliterator_synciterator|imap_8bit|imap_alerts|imap_append|imap_base64|imap_binary|imap_body|imap_bodystruct|imap_check|' + + 'imap_clearflag_full|imap_close|imap_create|imap_createmailbox|imap_delete|imap_deletemailbox|imap_errors|imap_expunge|imap_fetch_overview|' + + 'imap_fetchbody|imap_fetchheader|imap_fetchmime|imap_fetchstructure|imap_fetchtext|imap_gc|imap_get_quota|imap_get_quotaroot|imap_getacl|' + + 'imap_getmailboxes|imap_getsubscribed|imap_header|imap_headerinfo|imap_headers|imap_last_error|imap_list|imap_listmailbox|imap_listscan|' + + 'imap_listsubscribed|imap_lsub|imap_mail|imap_mail_compose|imap_mail_copy|imap_mail_move|imap_mailboxmsginfo|imap_mime_header_decode|' + + 'imap_msgno|imap_num_msg|imap_num_recent|imap_open|imap_ping|imap_qprint|imap_rename|imap_renamemailbox|imap_reopen|' + + 'imap_rfc822_parse_adrlist|imap_rfc822_parse_headers|imap_rfc822_write_address|imap_savebody|imap_scan|imap_scanmailbox|imap_search|' + + 'imap_set_quota|imap_setacl|imap_setflag_full|imap_sort|imap_status|imap_subscribe|imap_thread|imap_timeout|imap_uid|imap_undelete|' + + 'imap_unsubscribe|imap_utf7_decode|imap_utf7_encode|imap_utf8|implementsinterface|implode|import_request_variables|in_array|include|' + + 'include_once|inclued_get_data|inet_ntop|inet_pton|infiniteiterator|ingres_autocommit|ingres_autocommit_state|ingres_charset|ingres_close|' + + 'ingres_commit|ingres_connect|ingres_cursor|ingres_errno|ingres_error|ingres_errsqlstate|ingres_escape_string|ingres_execute|' + + 'ingres_fetch_array|ingres_fetch_assoc|ingres_fetch_object|ingres_fetch_proc_return|ingres_fetch_row|ingres_field_length|ingres_field_name|' + + 'ingres_field_nullable|ingres_field_precision|ingres_field_scale|ingres_field_type|ingres_free_result|ingres_next_error|ingres_num_fields|' + + 'ingres_num_rows|ingres_pconnect|ingres_prepare|ingres_query|ingres_result_seek|ingres_rollback|ingres_set_environment|' + + 'ingres_unbuffered_query|ini_alter|ini_get|ini_get_all|ini_restore|ini_set|innamespace|inotify_add_watch|inotify_init|inotify_queue_len|' + + 'inotify_read|inotify_rm_watch|interface_exists|intl_error_name|intl_get_error_code|intl_get_error_message|intl_is_failure|' + + 'intldateformatter|intval|invalidargumentexception|invoke|invokeargs|ip2long|iptcembed|iptcparse|is_a|is_array|is_bool|is_callable|is_dir|' + + 'is_double|is_executable|is_file|is_finite|is_float|is_infinite|is_int|is_integer|is_link|is_long|is_nan|is_null|is_numeric|is_object|' + + 'is_readable|is_real|is_resource|is_scalar|is_soap_fault|is_string|is_subclass_of|is_uploaded_file|is_writable|is_writeable|isabstract|' + + 'iscloneable|isdisabled|isfinal|isinstance|isinstantiable|isinterface|isinternal|isiterateable|isset|issubclassof|isuserdefined|iterator|' + + 'iterator_apply|iterator_count|iterator_to_array|iteratoraggregate|iteratoriterator|java_last_exception_clear|java_last_exception_get|' + + 'jddayofweek|jdmonthname|jdtofrench|jdtogregorian|jdtojewish|jdtojulian|jdtounix|jewishtojd|join|jpeg2wbmp|json_decode|json_encode|' + + 'json_last_error|jsonserializable|judy|judy_type|judy_version|juliantojd|kadm5_chpass_principal|kadm5_create_principal|' + + 'kadm5_delete_principal|kadm5_destroy|kadm5_flush|kadm5_get_policies|kadm5_get_principal|kadm5_get_principals|kadm5_init_with_password|' + + 'kadm5_modify_principal|key|krsort|ksort|lcfirst|lcg_value|lchgrp|lchown|ldap_8859_to_t61|ldap_add|ldap_bind|ldap_close|ldap_compare|' + + 'ldap_connect|ldap_count_entries|ldap_delete|ldap_dn2ufn|ldap_err2str|ldap_errno|ldap_error|ldap_explode_dn|ldap_first_attribute|' + + 'ldap_first_entry|ldap_first_reference|ldap_free_result|ldap_get_attributes|ldap_get_dn|ldap_get_entries|ldap_get_option|ldap_get_values|' + + 'ldap_get_values_len|ldap_list|ldap_mod_add|ldap_mod_del|ldap_mod_replace|ldap_modify|ldap_next_attribute|ldap_next_entry|' + + 'ldap_next_reference|ldap_parse_reference|ldap_parse_result|ldap_read|ldap_rename|ldap_sasl_bind|ldap_search|ldap_set_option|' + + 'ldap_set_rebind_proc|ldap_sort|ldap_start_tls|ldap_t61_to_8859|ldap_unbind|lengthexception|levenshtein|libxml_clear_errors|' + + 'libxml_disable_entity_loader|libxml_get_errors|libxml_get_last_error|libxml_set_streams_context|libxml_use_internal_errors|libxmlerror|' + + 'limititerator|link|linkinfo|list|locale|localeconv|localtime|log|log10|log1p|logicexception|long2ip|lstat|ltrim|lzf_compress|' + + 'lzf_decompress|lzf_optimized_for|m_checkstatus|m_completeauthorizations|m_connect|m_connectionerror|m_deletetrans|m_destroyconn|' + + 'm_destroyengine|m_getcell|m_getcellbynum|m_getcommadelimited|m_getheader|m_initconn|m_initengine|m_iscommadelimited|m_maxconntimeout|' + + 'm_monitor|m_numcolumns|m_numrows|m_parsecommadelimited|m_responsekeys|m_responseparam|m_returnstatus|m_setblocking|m_setdropfile|m_setip|' + + 'm_setssl|m_setssl_cafile|m_setssl_files|m_settimeout|m_sslcert_gen_hash|m_transactionssent|m_transinqueue|m_transkeyval|m_transnew|' + + 'm_transsend|m_uwait|m_validateidentifier|m_verifyconnection|m_verifysslcert|magic_quotes_runtime|mail|' + + 'mailparse_determine_best_xfer_encoding|mailparse_msg_create|mailparse_msg_extract_part|mailparse_msg_extract_part_file|' + + 'mailparse_msg_extract_whole_part_file|mailparse_msg_free|mailparse_msg_get_part|mailparse_msg_get_part_data|mailparse_msg_get_structure|' + + 'mailparse_msg_parse|mailparse_msg_parse_file|mailparse_rfc822_parse_addresses|mailparse_stream_encode|mailparse_uudecode_all|main|max|' + + 'maxdb_affected_rows|maxdb_autocommit|maxdb_bind_param|maxdb_bind_result|maxdb_change_user|maxdb_character_set_name|maxdb_client_encoding|' + + 'maxdb_close|maxdb_close_long_data|maxdb_commit|maxdb_connect|maxdb_connect_errno|maxdb_connect_error|maxdb_data_seek|maxdb_debug|' + + 'maxdb_disable_reads_from_master|maxdb_disable_rpl_parse|maxdb_dump_debug_info|maxdb_embedded_connect|maxdb_enable_reads_from_master|' + + 'maxdb_enable_rpl_parse|maxdb_errno|maxdb_error|maxdb_escape_string|maxdb_execute|maxdb_fetch|maxdb_fetch_array|maxdb_fetch_assoc|' + + 'maxdb_fetch_field|maxdb_fetch_field_direct|maxdb_fetch_fields|maxdb_fetch_lengths|maxdb_fetch_object|maxdb_fetch_row|maxdb_field_count|' + + 'maxdb_field_seek|maxdb_field_tell|maxdb_free_result|maxdb_get_client_info|maxdb_get_client_version|maxdb_get_host_info|maxdb_get_metadata|' + + 'maxdb_get_proto_info|maxdb_get_server_info|maxdb_get_server_version|maxdb_info|maxdb_init|maxdb_insert_id|maxdb_kill|maxdb_master_query|' + + 'maxdb_more_results|maxdb_multi_query|maxdb_next_result|maxdb_num_fields|maxdb_num_rows|maxdb_options|maxdb_param_count|maxdb_ping|' + + 'maxdb_prepare|maxdb_query|maxdb_real_connect|maxdb_real_escape_string|maxdb_real_query|maxdb_report|maxdb_rollback|' + + 'maxdb_rpl_parse_enabled|maxdb_rpl_probe|maxdb_rpl_query_type|maxdb_select_db|maxdb_send_long_data|maxdb_send_query|maxdb_server_end|' + + 'maxdb_server_init|maxdb_set_opt|maxdb_sqlstate|maxdb_ssl_set|maxdb_stat|maxdb_stmt_affected_rows|maxdb_stmt_bind_param|' + + 'maxdb_stmt_bind_result|maxdb_stmt_close|maxdb_stmt_close_long_data|maxdb_stmt_data_seek|maxdb_stmt_errno|maxdb_stmt_error|' + + 'maxdb_stmt_execute|maxdb_stmt_fetch|maxdb_stmt_free_result|maxdb_stmt_init|maxdb_stmt_num_rows|maxdb_stmt_param_count|maxdb_stmt_prepare|' + + 'maxdb_stmt_reset|maxdb_stmt_result_metadata|maxdb_stmt_send_long_data|maxdb_stmt_sqlstate|maxdb_stmt_store_result|maxdb_store_result|' + + 'maxdb_thread_id|maxdb_thread_safe|maxdb_use_result|maxdb_warning_count|mb_check_encoding|mb_convert_case|mb_convert_encoding|' + + 'mb_convert_kana|mb_convert_variables|mb_decode_mimeheader|mb_decode_numericentity|mb_detect_encoding|mb_detect_order|mb_encode_mimeheader|' + + 'mb_encode_numericentity|mb_encoding_aliases|mb_ereg|mb_ereg_match|mb_ereg_replace|mb_ereg_search|mb_ereg_search_getpos|' + + 'mb_ereg_search_getregs|mb_ereg_search_init|mb_ereg_search_pos|mb_ereg_search_regs|mb_ereg_search_setpos|mb_eregi|mb_eregi_replace|' + + 'mb_get_info|mb_http_input|mb_http_output|mb_internal_encoding|mb_language|mb_list_encodings|mb_output_handler|mb_parse_str|' + + 'mb_preferred_mime_name|mb_regex_encoding|mb_regex_set_options|mb_send_mail|mb_split|mb_strcut|mb_strimwidth|mb_stripos|mb_stristr|' + + 'mb_strlen|mb_strpos|mb_strrchr|mb_strrichr|mb_strripos|mb_strrpos|mb_strstr|mb_strtolower|mb_strtoupper|mb_strwidth|' + + 'mb_substitute_character|mb_substr|mb_substr_count|mcrypt_cbc|mcrypt_cfb|mcrypt_create_iv|mcrypt_decrypt|mcrypt_ecb|' + + 'mcrypt_enc_get_algorithms_name|mcrypt_enc_get_block_size|mcrypt_enc_get_iv_size|mcrypt_enc_get_key_size|mcrypt_enc_get_modes_name|' + + 'mcrypt_enc_get_supported_key_sizes|mcrypt_enc_is_block_algorithm|mcrypt_enc_is_block_algorithm_mode|mcrypt_enc_is_block_mode|' + + 'mcrypt_enc_self_test|mcrypt_encrypt|mcrypt_generic|mcrypt_generic_deinit|mcrypt_generic_end|mcrypt_generic_init|mcrypt_get_block_size|' + + 'mcrypt_get_cipher_name|mcrypt_get_iv_size|mcrypt_get_key_size|mcrypt_list_algorithms|mcrypt_list_modes|mcrypt_module_close|' + + 'mcrypt_module_get_algo_block_size|mcrypt_module_get_algo_key_size|mcrypt_module_get_supported_key_sizes|mcrypt_module_is_block_algorithm|' + + 'mcrypt_module_is_block_algorithm_mode|mcrypt_module_is_block_mode|mcrypt_module_open|mcrypt_module_self_test|mcrypt_ofb|md5|md5_file|' + + 'mdecrypt_generic|memcache|memcache_debug|memcached|memory_get_peak_usage|memory_get_usage|messageformatter|metaphone|method_exists|mhash|' + + 'mhash_count|mhash_get_block_size|mhash_get_hash_name|mhash_keygen_s2k|microtime|mime_content_type|min|ming_keypress|' + + 'ming_setcubicthreshold|ming_setscale|ming_setswfcompression|ming_useconstants|ming_useswfversion|mkdir|mktime|money_format|mongo|' + + 'mongobindata|mongocode|mongocollection|mongoconnectionexception|mongocursor|mongocursorexception|mongocursortimeoutexception|mongodate|' + + 'mongodb|mongodbref|mongoexception|mongogridfs|mongogridfscursor|mongogridfsexception|mongogridfsfile|mongoid|mongoint32|mongoint64|' + + 'mongomaxkey|mongominkey|mongoregex|mongotimestamp|move_uploaded_file|mpegfile|mqseries_back|mqseries_begin|mqseries_close|mqseries_cmit|' + + 'mqseries_conn|mqseries_connx|mqseries_disc|mqseries_get|mqseries_inq|mqseries_open|mqseries_put|mqseries_put1|mqseries_set|' + + 'mqseries_strerror|msession_connect|msession_count|msession_create|msession_destroy|msession_disconnect|msession_find|msession_get|' + + 'msession_get_array|msession_get_data|msession_inc|msession_list|msession_listvar|msession_lock|msession_plugin|msession_randstr|' + + 'msession_set|msession_set_array|msession_set_data|msession_timeout|msession_uniq|msession_unlock|msg_get_queue|msg_queue_exists|' + + 'msg_receive|msg_remove_queue|msg_send|msg_set_queue|msg_stat_queue|msql|msql_affected_rows|msql_close|msql_connect|msql_create_db|' + + 'msql_createdb|msql_data_seek|msql_db_query|msql_dbname|msql_drop_db|msql_error|msql_fetch_array|msql_fetch_field|msql_fetch_object|' + + 'msql_fetch_row|msql_field_flags|msql_field_len|msql_field_name|msql_field_seek|msql_field_table|msql_field_type|msql_fieldflags|' + + 'msql_fieldlen|msql_fieldname|msql_fieldtable|msql_fieldtype|msql_free_result|msql_list_dbs|msql_list_fields|msql_list_tables|' + + 'msql_num_fields|msql_num_rows|msql_numfields|msql_numrows|msql_pconnect|msql_query|msql_regcase|msql_result|msql_select_db|msql_tablename|' + + 'mssql_bind|mssql_close|mssql_connect|mssql_data_seek|mssql_execute|mssql_fetch_array|mssql_fetch_assoc|mssql_fetch_batch|' + + 'mssql_fetch_field|mssql_fetch_object|mssql_fetch_row|mssql_field_length|mssql_field_name|mssql_field_seek|mssql_field_type|' + + 'mssql_free_result|mssql_free_statement|mssql_get_last_message|mssql_guid_string|mssql_init|mssql_min_error_severity|' + + 'mssql_min_message_severity|mssql_next_result|mssql_num_fields|mssql_num_rows|mssql_pconnect|mssql_query|mssql_result|mssql_rows_affected|' + + 'mssql_select_db|mt_getrandmax|mt_rand|mt_srand|multipleiterator|mysql_affected_rows|mysql_client_encoding|mysql_close|mysql_connect|' + + 'mysql_create_db|mysql_data_seek|mysql_db_name|mysql_db_query|mysql_drop_db|mysql_errno|mysql_error|mysql_escape_string|mysql_fetch_array|' + + 'mysql_fetch_assoc|mysql_fetch_field|mysql_fetch_lengths|mysql_fetch_object|mysql_fetch_row|mysql_field_flags|mysql_field_len|' + + 'mysql_field_name|mysql_field_seek|mysql_field_table|mysql_field_type|mysql_free_result|mysql_get_client_info|mysql_get_host_info|' + + 'mysql_get_proto_info|mysql_get_server_info|mysql_info|mysql_insert_id|mysql_list_dbs|mysql_list_fields|mysql_list_processes|' + + 'mysql_list_tables|mysql_num_fields|mysql_num_rows|mysql_pconnect|mysql_ping|mysql_query|mysql_real_escape_string|mysql_result|' + + 'mysql_select_db|mysql_set_charset|mysql_stat|mysql_tablename|mysql_thread_id|mysql_unbuffered_query|mysqli|mysqli_bind_param|' + + 'mysqli_bind_result|mysqli_client_encoding|mysqli_connect|mysqli_disable_reads_from_master|mysqli_disable_rpl_parse|mysqli_driver|' + + 'mysqli_enable_reads_from_master|mysqli_enable_rpl_parse|mysqli_escape_string|mysqli_execute|mysqli_fetch|mysqli_get_metadata|' + + 'mysqli_master_query|mysqli_param_count|mysqli_report|mysqli_result|mysqli_rpl_parse_enabled|mysqli_rpl_probe|mysqli_rpl_query_type|' + + 'mysqli_send_long_data|mysqli_send_query|mysqli_set_opt|mysqli_slave_query|mysqli_stmt|mysqli_warning|mysqlnd_ms_get_stats|' + + 'mysqlnd_ms_query_is_select|mysqlnd_ms_set_user_pick_server|mysqlnd_qc_change_handler|mysqlnd_qc_clear_cache|mysqlnd_qc_get_cache_info|' + + 'mysqlnd_qc_get_core_stats|mysqlnd_qc_get_handler|mysqlnd_qc_get_query_trace_log|mysqlnd_qc_set_user_handlers|natcasesort|natsort|' + + 'ncurses_addch|ncurses_addchnstr|ncurses_addchstr|ncurses_addnstr|ncurses_addstr|ncurses_assume_default_colors|ncurses_attroff|' + + 'ncurses_attron|ncurses_attrset|ncurses_baudrate|ncurses_beep|ncurses_bkgd|ncurses_bkgdset|ncurses_border|ncurses_bottom_panel|' + + 'ncurses_can_change_color|ncurses_cbreak|ncurses_clear|ncurses_clrtobot|ncurses_clrtoeol|ncurses_color_content|ncurses_color_set|' + + 'ncurses_curs_set|ncurses_def_prog_mode|ncurses_def_shell_mode|ncurses_define_key|ncurses_del_panel|ncurses_delay_output|ncurses_delch|' + + 'ncurses_deleteln|ncurses_delwin|ncurses_doupdate|ncurses_echo|ncurses_echochar|ncurses_end|ncurses_erase|ncurses_erasechar|ncurses_filter|' + + 'ncurses_flash|ncurses_flushinp|ncurses_getch|ncurses_getmaxyx|ncurses_getmouse|ncurses_getyx|ncurses_halfdelay|ncurses_has_colors|' + + 'ncurses_has_ic|ncurses_has_il|ncurses_has_key|ncurses_hide_panel|ncurses_hline|ncurses_inch|ncurses_init|ncurses_init_color|' + + 'ncurses_init_pair|ncurses_insch|ncurses_insdelln|ncurses_insertln|ncurses_insstr|ncurses_instr|ncurses_isendwin|ncurses_keyok|' + + 'ncurses_keypad|ncurses_killchar|ncurses_longname|ncurses_meta|ncurses_mouse_trafo|ncurses_mouseinterval|ncurses_mousemask|ncurses_move|' + + 'ncurses_move_panel|ncurses_mvaddch|ncurses_mvaddchnstr|ncurses_mvaddchstr|ncurses_mvaddnstr|ncurses_mvaddstr|ncurses_mvcur|' + + 'ncurses_mvdelch|ncurses_mvgetch|ncurses_mvhline|ncurses_mvinch|ncurses_mvvline|ncurses_mvwaddstr|ncurses_napms|ncurses_new_panel|' + + 'ncurses_newpad|ncurses_newwin|ncurses_nl|ncurses_nocbreak|ncurses_noecho|ncurses_nonl|ncurses_noqiflush|ncurses_noraw|' + + 'ncurses_pair_content|ncurses_panel_above|ncurses_panel_below|ncurses_panel_window|ncurses_pnoutrefresh|ncurses_prefresh|ncurses_putp|' + + 'ncurses_qiflush|ncurses_raw|ncurses_refresh|ncurses_replace_panel|ncurses_reset_prog_mode|ncurses_reset_shell_mode|ncurses_resetty|' + + 'ncurses_savetty|ncurses_scr_dump|ncurses_scr_init|ncurses_scr_restore|ncurses_scr_set|ncurses_scrl|ncurses_show_panel|ncurses_slk_attr|' + + 'ncurses_slk_attroff|ncurses_slk_attron|ncurses_slk_attrset|ncurses_slk_clear|ncurses_slk_color|ncurses_slk_init|ncurses_slk_noutrefresh|' + + 'ncurses_slk_refresh|ncurses_slk_restore|ncurses_slk_set|ncurses_slk_touch|ncurses_standend|ncurses_standout|ncurses_start_color|' + + 'ncurses_termattrs|ncurses_termname|ncurses_timeout|ncurses_top_panel|ncurses_typeahead|ncurses_ungetch|ncurses_ungetmouse|' + + 'ncurses_update_panels|ncurses_use_default_colors|ncurses_use_env|ncurses_use_extended_names|ncurses_vidattr|ncurses_vline|ncurses_waddch|' + + 'ncurses_waddstr|ncurses_wattroff|ncurses_wattron|ncurses_wattrset|ncurses_wborder|ncurses_wclear|ncurses_wcolor_set|ncurses_werase|' + + 'ncurses_wgetch|ncurses_whline|ncurses_wmouse_trafo|ncurses_wmove|ncurses_wnoutrefresh|ncurses_wrefresh|ncurses_wstandend|' + + 'ncurses_wstandout|ncurses_wvline|newinstance|newinstanceargs|newt_bell|newt_button|newt_button_bar|newt_centered_window|newt_checkbox|' + + 'newt_checkbox_get_value|newt_checkbox_set_flags|newt_checkbox_set_value|newt_checkbox_tree|newt_checkbox_tree_add_item|' + + 'newt_checkbox_tree_find_item|newt_checkbox_tree_get_current|newt_checkbox_tree_get_entry_value|newt_checkbox_tree_get_multi_selection|' + + 'newt_checkbox_tree_get_selection|newt_checkbox_tree_multi|newt_checkbox_tree_set_current|newt_checkbox_tree_set_entry|' + + 'newt_checkbox_tree_set_entry_value|newt_checkbox_tree_set_width|newt_clear_key_buffer|newt_cls|newt_compact_button|' + + 'newt_component_add_callback|newt_component_takes_focus|newt_create_grid|newt_cursor_off|newt_cursor_on|newt_delay|newt_draw_form|' + + 'newt_draw_root_text|newt_entry|newt_entry_get_value|newt_entry_set|newt_entry_set_filter|newt_entry_set_flags|newt_finished|newt_form|' + + 'newt_form_add_component|newt_form_add_components|newt_form_add_hot_key|newt_form_destroy|newt_form_get_current|newt_form_run|' + + 'newt_form_set_background|newt_form_set_height|newt_form_set_size|newt_form_set_timer|newt_form_set_width|newt_form_watch_fd|' + + 'newt_get_screen_size|newt_grid_add_components_to_form|newt_grid_basic_window|newt_grid_free|newt_grid_get_size|newt_grid_h_close_stacked|' + + 'newt_grid_h_stacked|newt_grid_place|newt_grid_set_field|newt_grid_simple_window|newt_grid_v_close_stacked|newt_grid_v_stacked|' + + 'newt_grid_wrapped_window|newt_grid_wrapped_window_at|newt_init|newt_label|newt_label_set_text|newt_listbox|newt_listbox_append_entry|' + + 'newt_listbox_clear|newt_listbox_clear_selection|newt_listbox_delete_entry|newt_listbox_get_current|newt_listbox_get_selection|' + + 'newt_listbox_insert_entry|newt_listbox_item_count|newt_listbox_select_item|newt_listbox_set_current|newt_listbox_set_current_by_key|' + + 'newt_listbox_set_data|newt_listbox_set_entry|newt_listbox_set_width|newt_listitem|newt_listitem_get_data|newt_listitem_set|' + + 'newt_open_window|newt_pop_help_line|newt_pop_window|newt_push_help_line|newt_radio_get_current|newt_radiobutton|newt_redraw_help_line|' + + 'newt_reflow_text|newt_refresh|newt_resize_screen|newt_resume|newt_run_form|newt_scale|newt_scale_set|newt_scrollbar_set|' + + 'newt_set_help_callback|newt_set_suspend_callback|newt_suspend|newt_textbox|newt_textbox_get_num_lines|newt_textbox_reflowed|' + + 'newt_textbox_set_height|newt_textbox_set_text|newt_vertical_scrollbar|newt_wait_for_key|newt_win_choice|newt_win_entries|newt_win_menu|' + + 'newt_win_message|newt_win_messagev|newt_win_ternary|next|ngettext|nl2br|nl_langinfo|norewinditerator|normalizer|notes_body|notes_copy_db|' + + 'notes_create_db|notes_create_note|notes_drop_db|notes_find_note|notes_header_info|notes_list_msgs|notes_mark_read|notes_mark_unread|' + + 'notes_nav_create|notes_search|notes_unread|notes_version|nsapi_request_headers|nsapi_response_headers|nsapi_virtual|nthmac|number_format|' + + 'numberformatter|oauth|oauth_get_sbs|oauth_urlencode|oauthexception|oauthprovider|ob_clean|ob_deflatehandler|ob_end_clean|ob_end_flush|' + + 'ob_etaghandler|ob_flush|ob_get_clean|ob_get_contents|ob_get_flush|ob_get_length|ob_get_level|ob_get_status|ob_gzhandler|ob_iconv_handler|' + + 'ob_implicit_flush|ob_inflatehandler|ob_list_handlers|ob_start|ob_tidyhandler|oci_bind_array_by_name|oci_bind_by_name|oci_cancel|' + + 'oci_client_version|oci_close|oci_collection_append|oci_collection_assign|oci_collection_element_assign|oci_collection_element_get|' + + 'oci_collection_free|oci_collection_max|oci_collection_size|oci_collection_trim|oci_commit|oci_connect|oci_define_by_name|oci_error|' + + 'oci_execute|oci_fetch|oci_fetch_all|oci_fetch_array|oci_fetch_assoc|oci_fetch_object|oci_fetch_row|oci_field_is_null|oci_field_name|' + + 'oci_field_precision|oci_field_scale|oci_field_size|oci_field_type|oci_field_type_raw|oci_free_statement|oci_internal_debug|oci_lob_append|' + + 'oci_lob_close|oci_lob_copy|oci_lob_eof|oci_lob_erase|oci_lob_export|oci_lob_flush|oci_lob_free|oci_lob_getbuffering|oci_lob_import|' + + 'oci_lob_is_equal|oci_lob_load|oci_lob_read|oci_lob_rewind|oci_lob_save|oci_lob_savefile|oci_lob_seek|oci_lob_setbuffering|oci_lob_size|' + + 'oci_lob_tell|oci_lob_truncate|oci_lob_write|oci_lob_writetemporary|oci_lob_writetofile|oci_new_collection|oci_new_connect|oci_new_cursor|' + + 'oci_new_descriptor|oci_num_fields|oci_num_rows|oci_parse|oci_password_change|oci_pconnect|oci_result|oci_rollback|oci_server_version|' + + 'oci_set_action|oci_set_client_identifier|oci_set_client_info|oci_set_edition|oci_set_module_name|oci_set_prefetch|oci_statement_type|' + + 'ocibindbyname|ocicancel|ocicloselob|ocicollappend|ocicollassign|ocicollassignelem|ocicollgetelem|ocicollmax|ocicollsize|ocicolltrim|' + + 'ocicolumnisnull|ocicolumnname|ocicolumnprecision|ocicolumnscale|ocicolumnsize|ocicolumntype|ocicolumntyperaw|ocicommit|ocidefinebyname|' + + 'ocierror|ociexecute|ocifetch|ocifetchinto|ocifetchstatement|ocifreecollection|ocifreecursor|ocifreedesc|ocifreestatement|ociinternaldebug|' + + 'ociloadlob|ocilogoff|ocilogon|ocinewcollection|ocinewcursor|ocinewdescriptor|ocinlogon|ocinumcols|ociparse|ociplogon|ociresult|' + + 'ocirollback|ocirowcount|ocisavelob|ocisavelobfile|ociserverversion|ocisetprefetch|ocistatementtype|ociwritelobtofile|ociwritetemporarylob|' + + 'octdec|odbc_autocommit|odbc_binmode|odbc_close|odbc_close_all|odbc_columnprivileges|odbc_columns|odbc_commit|odbc_connect|odbc_cursor|' + + 'odbc_data_source|odbc_do|odbc_error|odbc_errormsg|odbc_exec|odbc_execute|odbc_fetch_array|odbc_fetch_into|odbc_fetch_object|' + + 'odbc_fetch_row|odbc_field_len|odbc_field_name|odbc_field_num|odbc_field_precision|odbc_field_scale|odbc_field_type|odbc_foreignkeys|' + + 'odbc_free_result|odbc_gettypeinfo|odbc_longreadlen|odbc_next_result|odbc_num_fields|odbc_num_rows|odbc_pconnect|odbc_prepare|' + + 'odbc_primarykeys|odbc_procedurecolumns|odbc_procedures|odbc_result|odbc_result_all|odbc_rollback|odbc_setoption|odbc_specialcolumns|' + + 'odbc_statistics|odbc_tableprivileges|odbc_tables|openal_buffer_create|openal_buffer_data|openal_buffer_destroy|openal_buffer_get|' + + 'openal_buffer_loadwav|openal_context_create|openal_context_current|openal_context_destroy|openal_context_process|openal_context_suspend|' + + 'openal_device_close|openal_device_open|openal_listener_get|openal_listener_set|openal_source_create|openal_source_destroy|' + + 'openal_source_get|openal_source_pause|openal_source_play|openal_source_rewind|openal_source_set|openal_source_stop|openal_stream|opendir|' + + 'openlog|openssl_cipher_iv_length|openssl_csr_export|openssl_csr_export_to_file|openssl_csr_get_public_key|openssl_csr_get_subject|' + + 'openssl_csr_new|openssl_csr_sign|openssl_decrypt|openssl_dh_compute_key|openssl_digest|openssl_encrypt|openssl_error_string|' + + 'openssl_free_key|openssl_get_cipher_methods|openssl_get_md_methods|openssl_get_privatekey|openssl_get_publickey|openssl_open|' + + 'openssl_pkcs12_export|openssl_pkcs12_export_to_file|openssl_pkcs12_read|openssl_pkcs7_decrypt|openssl_pkcs7_encrypt|openssl_pkcs7_sign|' + + 'openssl_pkcs7_verify|openssl_pkey_export|openssl_pkey_export_to_file|openssl_pkey_free|openssl_pkey_get_details|openssl_pkey_get_private|' + + 'openssl_pkey_get_public|openssl_pkey_new|openssl_private_decrypt|openssl_private_encrypt|openssl_public_decrypt|openssl_public_encrypt|' + + 'openssl_random_pseudo_bytes|openssl_seal|openssl_sign|openssl_verify|openssl_x509_check_private_key|openssl_x509_checkpurpose|' + + 'openssl_x509_export|openssl_x509_export_to_file|openssl_x509_free|openssl_x509_parse|openssl_x509_read|ord|outeriterator|' + + 'outofboundsexception|outofrangeexception|output_add_rewrite_var|output_reset_rewrite_vars|overflowexception|overload|override_function|' + + 'ovrimos_close|ovrimos_commit|ovrimos_connect|ovrimos_cursor|ovrimos_exec|ovrimos_execute|ovrimos_fetch_into|ovrimos_fetch_row|' + + 'ovrimos_field_len|ovrimos_field_name|ovrimos_field_num|ovrimos_field_type|ovrimos_free_result|ovrimos_longreadlen|ovrimos_num_fields|' + + 'ovrimos_num_rows|ovrimos_prepare|ovrimos_result|ovrimos_result_all|ovrimos_rollback|pack|parentiterator|parse_ini_file|parse_ini_string|' + + 'parse_str|parse_url|parsekit_compile_file|parsekit_compile_string|parsekit_func_arginfo|passthru|pathinfo|pclose|pcntl_alarm|pcntl_exec|' + + 'pcntl_fork|pcntl_getpriority|pcntl_setpriority|pcntl_signal|pcntl_signal_dispatch|pcntl_sigprocmask|pcntl_sigtimedwait|pcntl_sigwaitinfo|' + + 'pcntl_wait|pcntl_waitpid|pcntl_wexitstatus|pcntl_wifexited|pcntl_wifsignaled|pcntl_wifstopped|pcntl_wstopsig|pcntl_wtermsig|' + + 'pdf_activate_item|pdf_add_annotation|pdf_add_bookmark|pdf_add_launchlink|pdf_add_locallink|pdf_add_nameddest|pdf_add_note|pdf_add_outline|' + + 'pdf_add_pdflink|pdf_add_table_cell|pdf_add_textflow|pdf_add_thumbnail|pdf_add_weblink|pdf_arc|pdf_arcn|pdf_attach_file|pdf_begin_document|' + + 'pdf_begin_font|pdf_begin_glyph|pdf_begin_item|pdf_begin_layer|pdf_begin_page|pdf_begin_page_ext|pdf_begin_pattern|pdf_begin_template|' + + 'pdf_begin_template_ext|pdf_circle|pdf_clip|pdf_close|pdf_close_image|pdf_close_pdi|pdf_close_pdi_page|pdf_closepath|' + + 'pdf_closepath_fill_stroke|pdf_closepath_stroke|pdf_concat|pdf_continue_text|pdf_create_3dview|pdf_create_action|pdf_create_annotation|' + + 'pdf_create_bookmark|pdf_create_field|pdf_create_fieldgroup|pdf_create_gstate|pdf_create_pvf|pdf_create_textflow|pdf_curveto|' + + 'pdf_define_layer|pdf_delete|pdf_delete_pvf|pdf_delete_table|pdf_delete_textflow|pdf_encoding_set_char|pdf_end_document|pdf_end_font|' + + 'pdf_end_glyph|pdf_end_item|pdf_end_layer|pdf_end_page|pdf_end_page_ext|pdf_end_pattern|pdf_end_template|pdf_endpath|pdf_fill|' + + 'pdf_fill_imageblock|pdf_fill_pdfblock|pdf_fill_stroke|pdf_fill_textblock|pdf_findfont|pdf_fit_image|pdf_fit_pdi_page|pdf_fit_table|' + + 'pdf_fit_textflow|pdf_fit_textline|pdf_get_apiname|pdf_get_buffer|pdf_get_errmsg|pdf_get_errnum|pdf_get_font|pdf_get_fontname|' + + 'pdf_get_fontsize|pdf_get_image_height|pdf_get_image_width|pdf_get_majorversion|pdf_get_minorversion|pdf_get_parameter|' + + 'pdf_get_pdi_parameter|pdf_get_pdi_value|pdf_get_value|pdf_info_font|pdf_info_matchbox|pdf_info_table|pdf_info_textflow|pdf_info_textline|' + + 'pdf_initgraphics|pdf_lineto|pdf_load_3ddata|pdf_load_font|pdf_load_iccprofile|pdf_load_image|pdf_makespotcolor|pdf_moveto|pdf_new|' + + 'pdf_open_ccitt|pdf_open_file|pdf_open_gif|pdf_open_image|pdf_open_image_file|pdf_open_jpeg|pdf_open_memory_image|pdf_open_pdi|' + + 'pdf_open_pdi_document|pdf_open_pdi_page|pdf_open_tiff|pdf_pcos_get_number|pdf_pcos_get_stream|pdf_pcos_get_string|pdf_place_image|' + + 'pdf_place_pdi_page|pdf_process_pdi|pdf_rect|pdf_restore|pdf_resume_page|pdf_rotate|pdf_save|pdf_scale|pdf_set_border_color|' + + 'pdf_set_border_dash|pdf_set_border_style|pdf_set_char_spacing|pdf_set_duration|pdf_set_gstate|pdf_set_horiz_scaling|pdf_set_info|' + + 'pdf_set_info_author|pdf_set_info_creator|pdf_set_info_keywords|pdf_set_info_subject|pdf_set_info_title|pdf_set_layer_dependency|' + + 'pdf_set_leading|pdf_set_parameter|pdf_set_text_matrix|pdf_set_text_pos|pdf_set_text_rendering|pdf_set_text_rise|pdf_set_value|' + + 'pdf_set_word_spacing|pdf_setcolor|pdf_setdash|pdf_setdashpattern|pdf_setflat|pdf_setfont|pdf_setgray|pdf_setgray_fill|pdf_setgray_stroke|' + + 'pdf_setlinecap|pdf_setlinejoin|pdf_setlinewidth|pdf_setmatrix|pdf_setmiterlimit|pdf_setpolydash|pdf_setrgbcolor|pdf_setrgbcolor_fill|' + + 'pdf_setrgbcolor_stroke|pdf_shading|pdf_shading_pattern|pdf_shfill|pdf_show|pdf_show_boxed|pdf_show_xy|pdf_skew|pdf_stringwidth|pdf_stroke|' + + 'pdf_suspend_page|pdf_translate|pdf_utf16_to_utf8|pdf_utf32_to_utf16|pdf_utf8_to_utf16|pdo|pdo_cubrid_schema|pdo_pgsqllobcreate|' + + 'pdo_pgsqllobopen|pdo_pgsqllobunlink|pdo_sqlitecreateaggregate|pdo_sqlitecreatefunction|pdoexception|pdostatement|pfsockopen|' + + 'pg_affected_rows|pg_cancel_query|pg_client_encoding|pg_close|pg_connect|pg_connection_busy|pg_connection_reset|pg_connection_status|' + + 'pg_convert|pg_copy_from|pg_copy_to|pg_dbname|pg_delete|pg_end_copy|pg_escape_bytea|pg_escape_string|pg_execute|pg_fetch_all|' + + 'pg_fetch_all_columns|pg_fetch_array|pg_fetch_assoc|pg_fetch_object|pg_fetch_result|pg_fetch_row|pg_field_is_null|pg_field_name|' + + 'pg_field_num|pg_field_prtlen|pg_field_size|pg_field_table|pg_field_type|pg_field_type_oid|pg_free_result|pg_get_notify|pg_get_pid|' + + 'pg_get_result|pg_host|pg_insert|pg_last_error|pg_last_notice|pg_last_oid|pg_lo_close|pg_lo_create|pg_lo_export|pg_lo_import|pg_lo_open|' + + 'pg_lo_read|pg_lo_read_all|pg_lo_seek|pg_lo_tell|pg_lo_unlink|pg_lo_write|pg_meta_data|pg_num_fields|pg_num_rows|pg_options|' + + 'pg_parameter_status|pg_pconnect|pg_ping|pg_port|pg_prepare|pg_put_line|pg_query|pg_query_params|pg_result_error|pg_result_error_field|' + + 'pg_result_seek|pg_result_status|pg_select|pg_send_execute|pg_send_prepare|pg_send_query|pg_send_query_params|pg_set_client_encoding|' + + 'pg_set_error_verbosity|pg_trace|pg_transaction_status|pg_tty|pg_unescape_bytea|pg_untrace|pg_update|pg_version|php_check_syntax|' + + 'php_ini_loaded_file|php_ini_scanned_files|php_logo_guid|php_sapi_name|php_strip_whitespace|php_uname|phpcredits|phpinfo|phpversion|pi|' + + 'png2wbmp|popen|pos|posix_access|posix_ctermid|posix_errno|posix_get_last_error|posix_getcwd|posix_getegid|posix_geteuid|posix_getgid|' + + 'posix_getgrgid|posix_getgrnam|posix_getgroups|posix_getlogin|posix_getpgid|posix_getpgrp|posix_getpid|posix_getppid|posix_getpwnam|' + + 'posix_getpwuid|posix_getrlimit|posix_getsid|posix_getuid|posix_initgroups|posix_isatty|posix_kill|posix_mkfifo|posix_mknod|posix_setegid|' + + 'posix_seteuid|posix_setgid|posix_setpgid|posix_setsid|posix_setuid|posix_strerror|posix_times|posix_ttyname|posix_uname|pow|preg_filter|' + + 'preg_grep|preg_last_error|preg_match|preg_match_all|preg_quote|preg_replace|preg_replace_callback|preg_split|prev|print|print_r|' + + 'printer_abort|printer_close|printer_create_brush|printer_create_dc|printer_create_font|printer_create_pen|printer_delete_brush|' + + 'printer_delete_dc|printer_delete_font|printer_delete_pen|printer_draw_bmp|printer_draw_chord|printer_draw_elipse|printer_draw_line|' + + 'printer_draw_pie|printer_draw_rectangle|printer_draw_roundrect|printer_draw_text|printer_end_doc|printer_end_page|printer_get_option|' + + 'printer_list|printer_logical_fontheight|printer_open|printer_select_brush|printer_select_font|printer_select_pen|printer_set_option|' + + 'printer_start_doc|printer_start_page|printer_write|printf|proc_close|proc_get_status|proc_nice|proc_open|proc_terminate|property_exists|' + + 'ps_add_bookmark|ps_add_launchlink|ps_add_locallink|ps_add_note|ps_add_pdflink|ps_add_weblink|ps_arc|ps_arcn|ps_begin_page|' + + 'ps_begin_pattern|ps_begin_template|ps_circle|ps_clip|ps_close|ps_close_image|ps_closepath|ps_closepath_stroke|ps_continue_text|ps_curveto|' + + 'ps_delete|ps_end_page|ps_end_pattern|ps_end_template|ps_fill|ps_fill_stroke|ps_findfont|ps_get_buffer|ps_get_parameter|ps_get_value|' + + 'ps_hyphenate|ps_include_file|ps_lineto|ps_makespotcolor|ps_moveto|ps_new|ps_open_file|ps_open_image|ps_open_image_file|' + + 'ps_open_memory_image|ps_place_image|ps_rect|ps_restore|ps_rotate|ps_save|ps_scale|ps_set_border_color|ps_set_border_dash|' + + 'ps_set_border_style|ps_set_info|ps_set_parameter|ps_set_text_pos|ps_set_value|ps_setcolor|ps_setdash|ps_setflat|ps_setfont|ps_setgray|' + + 'ps_setlinecap|ps_setlinejoin|ps_setlinewidth|ps_setmiterlimit|ps_setoverprintmode|ps_setpolydash|ps_shading|ps_shading_pattern|ps_shfill|' + + 'ps_show|ps_show2|ps_show_boxed|ps_show_xy|ps_show_xy2|ps_string_geometry|ps_stringwidth|ps_stroke|ps_symbol|ps_symbol_name|' + + 'ps_symbol_width|ps_translate|pspell_add_to_personal|pspell_add_to_session|pspell_check|pspell_clear_session|pspell_config_create|' + + 'pspell_config_data_dir|pspell_config_dict_dir|pspell_config_ignore|pspell_config_mode|pspell_config_personal|pspell_config_repl|' + + 'pspell_config_runtogether|pspell_config_save_repl|pspell_new|pspell_new_config|pspell_new_personal|pspell_save_wordlist|' + + 'pspell_store_replacement|pspell_suggest|putenv|px_close|px_create_fp|px_date2string|px_delete|px_delete_record|px_get_field|px_get_info|' + + 'px_get_parameter|px_get_record|px_get_schema|px_get_value|px_insert_record|px_new|px_numfields|px_numrecords|px_open_fp|px_put_record|' + + 'px_retrieve_record|px_set_blob_file|px_set_parameter|px_set_tablename|px_set_targetencoding|px_set_value|px_timestamp2string|' + + 'px_update_record|qdom_error|qdom_tree|quoted_printable_decode|quoted_printable_encode|quotemeta|rad2deg|radius_acct_open|' + + 'radius_add_server|radius_auth_open|radius_close|radius_config|radius_create_request|radius_cvt_addr|radius_cvt_int|radius_cvt_string|' + + 'radius_demangle|radius_demangle_mppe_key|radius_get_attr|radius_get_vendor_attr|radius_put_addr|radius_put_attr|radius_put_int|' + + 'radius_put_string|radius_put_vendor_addr|radius_put_vendor_attr|radius_put_vendor_int|radius_put_vendor_string|' + + 'radius_request_authenticator|radius_send_request|radius_server_secret|radius_strerror|rand|range|rangeexception|rar_wrapper_cache_stats|' + + 'rararchive|rarentry|rarexception|rawurldecode|rawurlencode|read_exif_data|readdir|readfile|readgzfile|readline|readline_add_history|' + + 'readline_callback_handler_install|readline_callback_handler_remove|readline_callback_read_char|readline_clear_history|' + + 'readline_completion_function|readline_info|readline_list_history|readline_on_new_line|readline_read_history|readline_redisplay|' + + 'readline_write_history|readlink|realpath|realpath_cache_get|realpath_cache_size|recode|recode_file|recode_string|recursivearrayiterator|' + + 'recursivecachingiterator|recursivecallbackfilteriterator|recursivedirectoryiterator|recursivefilteriterator|recursiveiterator|' + + 'recursiveiteratoriterator|recursiveregexiterator|recursivetreeiterator|reflection|reflectionclass|reflectionexception|reflectionextension|' + + 'reflectionfunction|reflectionfunctionabstract|reflectionmethod|reflectionobject|reflectionparameter|reflectionproperty|reflector|' + + 'regexiterator|register_shutdown_function|register_tick_function|rename|rename_function|require|require_once|reset|resetValue|' + + 'resourcebundle|restore_error_handler|restore_exception_handler|restore_include_path|return|rewind|rewinddir|rmdir|round|rpm_close|' + + 'rpm_get_tag|rpm_is_valid|rpm_open|rpm_version|rrd_create|rrd_error|rrd_fetch|rrd_first|rrd_graph|rrd_info|rrd_last|rrd_lastupdate|' + + 'rrd_restore|rrd_tune|rrd_update|rrd_xport|rrdcreator|rrdgraph|rrdupdater|rsort|rtrim|runkit_class_adopt|runkit_class_emancipate|' + + 'runkit_constant_add|runkit_constant_redefine|runkit_constant_remove|runkit_function_add|runkit_function_copy|runkit_function_redefine|' + + 'runkit_function_remove|runkit_function_rename|runkit_import|runkit_lint|runkit_lint_file|runkit_method_add|runkit_method_copy|' + + 'runkit_method_redefine|runkit_method_remove|runkit_method_rename|runkit_return_value_used|runkit_sandbox_output_handler|' + + 'runkit_superglobals|runtimeexception|samconnection_commit|samconnection_connect|samconnection_constructor|samconnection_disconnect|' + + 'samconnection_errno|samconnection_error|samconnection_isconnected|samconnection_peek|samconnection_peekall|samconnection_receive|' + + 'samconnection_remove|samconnection_rollback|samconnection_send|samconnection_setDebug|samconnection_subscribe|samconnection_unsubscribe|' + + 'sammessage_body|sammessage_constructor|sammessage_header|sca_createdataobject|sca_getservice|sca_localproxy_createdataobject|' + + 'sca_soapproxy_createdataobject|scandir|sdo_das_changesummary_beginlogging|sdo_das_changesummary_endlogging|' + + 'sdo_das_changesummary_getchangeddataobjects|sdo_das_changesummary_getchangetype|sdo_das_changesummary_getoldcontainer|' + + 'sdo_das_changesummary_getoldvalues|sdo_das_changesummary_islogging|sdo_das_datafactory_addpropertytotype|sdo_das_datafactory_addtype|' + + 'sdo_das_datafactory_getdatafactory|sdo_das_dataobject_getchangesummary|sdo_das_relational_applychanges|sdo_das_relational_construct|' + + 'sdo_das_relational_createrootdataobject|sdo_das_relational_executepreparedquery|sdo_das_relational_executequery|' + + 'sdo_das_setting_getlistindex|sdo_das_setting_getpropertyindex|sdo_das_setting_getpropertyname|sdo_das_setting_getvalue|' + + 'sdo_das_setting_isset|sdo_das_xml_addtypes|sdo_das_xml_create|sdo_das_xml_createdataobject|sdo_das_xml_createdocument|' + + 'sdo_das_xml_document_getrootdataobject|sdo_das_xml_document_getrootelementname|sdo_das_xml_document_getrootelementuri|' + + 'sdo_das_xml_document_setencoding|sdo_das_xml_document_setxmldeclaration|sdo_das_xml_document_setxmlversion|sdo_das_xml_loadfile|' + + 'sdo_das_xml_loadstring|sdo_das_xml_savefile|sdo_das_xml_savestring|sdo_datafactory_create|sdo_dataobject_clear|' + + 'sdo_dataobject_createdataobject|sdo_dataobject_getcontainer|sdo_dataobject_getsequence|sdo_dataobject_gettypename|' + + 'sdo_dataobject_gettypenamespaceuri|sdo_exception_getcause|sdo_list_insert|sdo_model_property_getcontainingtype|' + + 'sdo_model_property_getdefault|sdo_model_property_getname|sdo_model_property_gettype|sdo_model_property_iscontainment|' + + 'sdo_model_property_ismany|sdo_model_reflectiondataobject_construct|sdo_model_reflectiondataobject_export|' + + 'sdo_model_reflectiondataobject_getcontainmentproperty|sdo_model_reflectiondataobject_getinstanceproperties|' + + 'sdo_model_reflectiondataobject_gettype|sdo_model_type_getbasetype|sdo_model_type_getname|sdo_model_type_getnamespaceuri|' + + 'sdo_model_type_getproperties|sdo_model_type_getproperty|sdo_model_type_isabstracttype|sdo_model_type_isdatatype|sdo_model_type_isinstance|' + + 'sdo_model_type_isopentype|sdo_model_type_issequencedtype|sdo_sequence_getproperty|sdo_sequence_insert|sdo_sequence_move|seekableiterator|' + + 'sem_acquire|sem_get|sem_release|sem_remove|serializable|serialize|session_cache_expire|session_cache_limiter|session_commit|' + + 'session_decode|session_destroy|session_encode|session_get_cookie_params|session_id|session_is_registered|session_module_name|session_name|' + + 'session_pgsql_add_error|session_pgsql_get_error|session_pgsql_get_field|session_pgsql_reset|session_pgsql_set_field|session_pgsql_status|' + + 'session_regenerate_id|session_register|session_save_path|session_set_cookie_params|session_set_save_handler|session_start|' + + 'session_unregister|session_unset|session_write_close|setCounterClass|set_error_handler|set_exception_handler|set_file_buffer|' + + 'set_include_path|set_magic_quotes_runtime|set_socket_blocking|set_time_limit|setcookie|setlocale|setproctitle|setrawcookie|' + + 'setstaticpropertyvalue|setthreadtitle|settype|sha1|sha1_file|shell_exec|shm_attach|shm_detach|shm_get_var|shm_has_var|shm_put_var|' + + 'shm_remove|shm_remove_var|shmop_close|shmop_delete|shmop_open|shmop_read|shmop_size|shmop_write|show_source|shuffle|signeurlpaiement|' + + 'similar_text|simplexml_import_dom|simplexml_load_file|simplexml_load_string|simplexmlelement|simplexmliterator|sin|sinh|sizeof|sleep|snmp|' + + 'snmp2_get|snmp2_getnext|snmp2_real_walk|snmp2_set|snmp2_walk|snmp3_get|snmp3_getnext|snmp3_real_walk|snmp3_set|snmp3_walk|' + + 'snmp_get_quick_print|snmp_get_valueretrieval|snmp_read_mib|snmp_set_enum_print|snmp_set_oid_numeric_print|snmp_set_oid_output_format|' + + 'snmp_set_quick_print|snmp_set_valueretrieval|snmpget|snmpgetnext|snmprealwalk|snmpset|snmpwalk|snmpwalkoid|soapclient|soapfault|' + + 'soapheader|soapparam|soapserver|soapvar|socket_accept|socket_bind|socket_clear_error|socket_close|socket_connect|socket_create|' + + 'socket_create_listen|socket_create_pair|socket_get_option|socket_get_status|socket_getpeername|socket_getsockname|socket_last_error|' + + 'socket_listen|socket_read|socket_recv|socket_recvfrom|socket_select|socket_send|socket_sendto|socket_set_block|socket_set_blocking|' + + 'socket_set_nonblock|socket_set_option|socket_set_timeout|socket_shutdown|socket_strerror|socket_write|solr_get_version|solrclient|' + + 'solrclientexception|solrdocument|solrdocumentfield|solrexception|solrgenericresponse|solrillegalargumentexception|' + + 'solrillegaloperationexception|solrinputdocument|solrmodifiableparams|solrobject|solrparams|solrpingresponse|solrquery|solrqueryresponse|' + + 'solrresponse|solrupdateresponse|solrutils|sort|soundex|sphinxclient|spl_autoload|spl_autoload_call|spl_autoload_extensions|' + + 'spl_autoload_functions|spl_autoload_register|spl_autoload_unregister|spl_classes|spl_object_hash|splbool|spldoublylinkedlist|splenum|' + + 'splfileinfo|splfileobject|splfixedarray|splfloat|splheap|splint|split|spliti|splmaxheap|splminheap|splobjectstorage|splobserver|' + + 'splpriorityqueue|splqueue|splstack|splstring|splsubject|spltempfileobject|spoofchecker|sprintf|sql_regcase|sqlite3|sqlite3result|' + + 'sqlite3stmt|sqlite_array_query|sqlite_busy_timeout|sqlite_changes|sqlite_close|sqlite_column|sqlite_create_aggregate|' + + 'sqlite_create_function|sqlite_current|sqlite_error_string|sqlite_escape_string|sqlite_exec|sqlite_factory|sqlite_fetch_all|' + + 'sqlite_fetch_array|sqlite_fetch_column_types|sqlite_fetch_object|sqlite_fetch_single|sqlite_fetch_string|sqlite_field_name|' + + 'sqlite_has_more|sqlite_has_prev|sqlite_key|sqlite_last_error|sqlite_last_insert_rowid|sqlite_libencoding|sqlite_libversion|sqlite_next|' + + 'sqlite_num_fields|sqlite_num_rows|sqlite_open|sqlite_popen|sqlite_prev|sqlite_query|sqlite_rewind|sqlite_seek|sqlite_single_query|' + + 'sqlite_udf_decode_binary|sqlite_udf_encode_binary|sqlite_unbuffered_query|sqlite_valid|sqrt|srand|sscanf|ssdeep_fuzzy_compare|' + + 'ssdeep_fuzzy_hash|ssdeep_fuzzy_hash_filename|ssh2_auth_hostbased_file|ssh2_auth_none|ssh2_auth_password|ssh2_auth_pubkey_file|' + + 'ssh2_connect|ssh2_exec|ssh2_fetch_stream|ssh2_fingerprint|ssh2_methods_negotiated|ssh2_publickey_add|ssh2_publickey_init|' + + 'ssh2_publickey_list|ssh2_publickey_remove|ssh2_scp_recv|ssh2_scp_send|ssh2_sftp|ssh2_sftp_lstat|ssh2_sftp_mkdir|ssh2_sftp_readlink|' + + 'ssh2_sftp_realpath|ssh2_sftp_rename|ssh2_sftp_rmdir|ssh2_sftp_stat|ssh2_sftp_symlink|ssh2_sftp_unlink|ssh2_shell|ssh2_tunnel|stat|' + + 'stats_absolute_deviation|stats_cdf_beta|stats_cdf_binomial|stats_cdf_cauchy|stats_cdf_chisquare|stats_cdf_exponential|stats_cdf_f|' + + 'stats_cdf_gamma|stats_cdf_laplace|stats_cdf_logistic|stats_cdf_negative_binomial|stats_cdf_noncentral_chisquare|stats_cdf_noncentral_f|' + + 'stats_cdf_poisson|stats_cdf_t|stats_cdf_uniform|stats_cdf_weibull|stats_covariance|stats_den_uniform|stats_dens_beta|stats_dens_cauchy|' + + 'stats_dens_chisquare|stats_dens_exponential|stats_dens_f|stats_dens_gamma|stats_dens_laplace|stats_dens_logistic|' + + 'stats_dens_negative_binomial|stats_dens_normal|stats_dens_pmf_binomial|stats_dens_pmf_hypergeometric|stats_dens_pmf_poisson|stats_dens_t|' + + 'stats_dens_weibull|stats_harmonic_mean|stats_kurtosis|stats_rand_gen_beta|stats_rand_gen_chisquare|stats_rand_gen_exponential|' + + 'stats_rand_gen_f|stats_rand_gen_funiform|stats_rand_gen_gamma|stats_rand_gen_ibinomial|stats_rand_gen_ibinomial_negative|' + + 'stats_rand_gen_int|stats_rand_gen_ipoisson|stats_rand_gen_iuniform|stats_rand_gen_noncenral_chisquare|stats_rand_gen_noncentral_f|' + + 'stats_rand_gen_noncentral_t|stats_rand_gen_normal|stats_rand_gen_t|stats_rand_get_seeds|stats_rand_phrase_to_seeds|stats_rand_ranf|' + + 'stats_rand_setall|stats_skew|stats_standard_deviation|stats_stat_binomial_coef|stats_stat_correlation|stats_stat_gennch|' + + 'stats_stat_independent_t|stats_stat_innerproduct|stats_stat_noncentral_t|stats_stat_paired_t|stats_stat_percentile|stats_stat_powersum|' + + 'stats_variance|stomp|stomp_connect_error|stomp_version|stompexception|stompframe|str_getcsv|str_ireplace|str_pad|str_repeat|str_replace|' + + 'str_rot13|str_shuffle|str_split|str_word_count|strcasecmp|strchr|strcmp|strcoll|strcspn|stream_bucket_append|stream_bucket_make_writeable|' + + 'stream_bucket_new|stream_bucket_prepend|stream_context_create|stream_context_get_default|stream_context_get_options|' + + 'stream_context_get_params|stream_context_set_default|stream_context_set_option|stream_context_set_params|stream_copy_to_stream|' + + 'stream_encoding|stream_filter_append|stream_filter_prepend|stream_filter_register|stream_filter_remove|stream_get_contents|' + + 'stream_get_filters|stream_get_line|stream_get_meta_data|stream_get_transports|stream_get_wrappers|stream_is_local|' + + 'stream_notification_callback|stream_register_wrapper|stream_resolve_include_path|stream_select|stream_set_blocking|stream_set_read_buffer|' + + 'stream_set_timeout|stream_set_write_buffer|stream_socket_accept|stream_socket_client|stream_socket_enable_crypto|stream_socket_get_name|' + + 'stream_socket_pair|stream_socket_recvfrom|stream_socket_sendto|stream_socket_server|stream_socket_shutdown|stream_supports_lock|' + + 'stream_wrapper_register|stream_wrapper_restore|stream_wrapper_unregister|streamwrapper|strftime|strip_tags|stripcslashes|stripos|' + + 'stripslashes|stristr|strlen|strnatcasecmp|strnatcmp|strncasecmp|strncmp|strpbrk|strpos|strptime|strrchr|strrev|strripos|strrpos|strspn|' + + 'strstr|strtok|strtolower|strtotime|strtoupper|strtr|strval|substr|substr_compare|substr_count|substr_replace|svm|svmmodel|svn_add|' + + 'svn_auth_get_parameter|svn_auth_set_parameter|svn_blame|svn_cat|svn_checkout|svn_cleanup|svn_client_version|svn_commit|svn_delete|' + + 'svn_diff|svn_export|svn_fs_abort_txn|svn_fs_apply_text|svn_fs_begin_txn2|svn_fs_change_node_prop|svn_fs_check_path|' + + 'svn_fs_contents_changed|svn_fs_copy|svn_fs_delete|svn_fs_dir_entries|svn_fs_file_contents|svn_fs_file_length|svn_fs_is_dir|svn_fs_is_file|' + + 'svn_fs_make_dir|svn_fs_make_file|svn_fs_node_created_rev|svn_fs_node_prop|svn_fs_props_changed|svn_fs_revision_prop|svn_fs_revision_root|' + + 'svn_fs_txn_root|svn_fs_youngest_rev|svn_import|svn_log|svn_ls|svn_mkdir|svn_repos_create|svn_repos_fs|svn_repos_fs_begin_txn_for_commit|' + + 'svn_repos_fs_commit_txn|svn_repos_hotcopy|svn_repos_open|svn_repos_recover|svn_revert|svn_status|svn_update|swf_actiongeturl|' + + 'swf_actiongotoframe|swf_actiongotolabel|swf_actionnextframe|swf_actionplay|swf_actionprevframe|swf_actionsettarget|swf_actionstop|' + + 'swf_actiontogglequality|swf_actionwaitforframe|swf_addbuttonrecord|swf_addcolor|swf_closefile|swf_definebitmap|swf_definefont|' + + 'swf_defineline|swf_definepoly|swf_definerect|swf_definetext|swf_endbutton|swf_enddoaction|swf_endshape|swf_endsymbol|swf_fontsize|' + + 'swf_fontslant|swf_fonttracking|swf_getbitmapinfo|swf_getfontinfo|swf_getframe|swf_labelframe|swf_lookat|swf_modifyobject|swf_mulcolor|' + + 'swf_nextid|swf_oncondition|swf_openfile|swf_ortho|swf_ortho2|swf_perspective|swf_placeobject|swf_polarview|swf_popmatrix|swf_posround|' + + 'swf_pushmatrix|swf_removeobject|swf_rotate|swf_scale|swf_setfont|swf_setframe|swf_shapearc|swf_shapecurveto|swf_shapecurveto3|' + + 'swf_shapefillbitmapclip|swf_shapefillbitmaptile|swf_shapefilloff|swf_shapefillsolid|swf_shapelinesolid|swf_shapelineto|swf_shapemoveto|' + + 'swf_showframe|swf_startbutton|swf_startdoaction|swf_startshape|swf_startsymbol|swf_textwidth|swf_translate|swf_viewport|swfaction|' + + 'swfbitmap|swfbutton|swfdisplayitem|swffill|swffont|swffontchar|swfgradient|swfmorph|swfmovie|swfprebuiltclip|swfshape|swfsound|' + + 'swfsoundinstance|swfsprite|swftext|swftextfield|swfvideostream|swish_construct|swish_getmetalist|swish_getpropertylist|swish_prepare|' + + 'swish_query|swishresult_getmetalist|swishresult_stem|swishresults_getparsedwords|swishresults_getremovedstopwords|swishresults_nextresult|' + + 'swishresults_seekresult|swishsearch_execute|swishsearch_resetlimit|swishsearch_setlimit|swishsearch_setphrasedelimiter|' + + 'swishsearch_setsort|swishsearch_setstructure|sybase_affected_rows|sybase_close|sybase_connect|sybase_data_seek|' + + 'sybase_deadlock_retry_count|sybase_fetch_array|sybase_fetch_assoc|sybase_fetch_field|sybase_fetch_object|sybase_fetch_row|' + + 'sybase_field_seek|sybase_free_result|sybase_get_last_message|sybase_min_client_severity|sybase_min_error_severity|' + + 'sybase_min_message_severity|sybase_min_server_severity|sybase_num_fields|sybase_num_rows|sybase_pconnect|sybase_query|sybase_result|' + + 'sybase_select_db|sybase_set_message_handler|sybase_unbuffered_query|symlink|sys_get_temp_dir|sys_getloadavg|syslog|system|tag|tan|tanh|' + + 'tcpwrap_check|tempnam|textdomain|tidy|tidy_access_count|tidy_config_count|tidy_diagnose|tidy_error_count|tidy_get_error_buffer|' + + 'tidy_get_output|tidy_load_config|tidy_reset_config|tidy_save_config|tidy_set_encoding|tidy_setopt|tidy_warning_count|tidynode|time|' + + 'time_nanosleep|time_sleep_until|timezone_abbreviations_list|timezone_identifiers_list|timezone_location_get|timezone_name_from_abbr|' + + 'timezone_name_get|timezone_offset_get|timezone_open|timezone_transitions_get|timezone_version_get|tmpfile|token_get_all|token_name|' + + 'tokyotyrant|tokyotyrantquery|tokyotyranttable|tostring|tostring|touch|transliterator|traversable|trigger_error|trim|uasort|ucfirst|' + + 'ucwords|udm_add_search_limit|udm_alloc_agent|udm_alloc_agent_array|udm_api_version|udm_cat_list|udm_cat_path|udm_check_charset|' + + 'udm_check_stored|udm_clear_search_limits|udm_close_stored|udm_crc32|udm_errno|udm_error|udm_find|udm_free_agent|udm_free_ispell_data|' + + 'udm_free_res|udm_get_doc_count|udm_get_res_field|udm_get_res_param|udm_hash32|udm_load_ispell_data|udm_open_stored|udm_set_agent_param|' + + 'uksort|umask|underflowexception|unexpectedvalueexception|uniqid|unixtojd|unlink|unpack|unregister_tick_function|unserialize|unset|' + + 'urldecode|urlencode|use_soap_error_handler|user_error|usleep|usort|utf8_decode|utf8_encode|v8js|v8jsexception|var_dump|var_export|variant|' + + 'variant_abs|variant_add|variant_and|variant_cast|variant_cat|variant_cmp|variant_date_from_timestamp|variant_date_to_timestamp|' + + 'variant_div|variant_eqv|variant_fix|variant_get_type|variant_idiv|variant_imp|variant_int|variant_mod|variant_mul|variant_neg|variant_not|' + + 'variant_or|variant_pow|variant_round|variant_set|variant_set_type|variant_sub|variant_xor|version_compare|vfprintf|virtual|' + + 'vpopmail_add_alias_domain|vpopmail_add_alias_domain_ex|vpopmail_add_domain|vpopmail_add_domain_ex|vpopmail_add_user|vpopmail_alias_add|' + + 'vpopmail_alias_del|vpopmail_alias_del_domain|vpopmail_alias_get|vpopmail_alias_get_all|vpopmail_auth_user|vpopmail_del_domain|' + + 'vpopmail_del_domain_ex|vpopmail_del_user|vpopmail_error|vpopmail_passwd|vpopmail_set_user_quota|vprintf|vsprintf|w32api_deftype|' + + 'w32api_init_dtype|w32api_invoke_function|w32api_register_function|w32api_set_call_method|wddx_add_vars|wddx_deserialize|wddx_packet_end|' + + 'wddx_packet_start|wddx_serialize_value|wddx_serialize_vars|win32_continue_service|win32_create_service|win32_delete_service|' + + 'win32_get_last_control_message|win32_pause_service|win32_ps_list_procs|win32_ps_stat_mem|win32_ps_stat_proc|win32_query_service_status|' + + 'win32_set_service_status|win32_start_service|win32_start_service_ctrl_dispatcher|win32_stop_service|wincache_fcache_fileinfo|' + + 'wincache_fcache_meminfo|wincache_lock|wincache_ocache_fileinfo|wincache_ocache_meminfo|wincache_refresh_if_changed|' + + 'wincache_rplist_fileinfo|wincache_rplist_meminfo|wincache_scache_info|wincache_scache_meminfo|wincache_ucache_add|wincache_ucache_cas|' + + 'wincache_ucache_clear|wincache_ucache_dec|wincache_ucache_delete|wincache_ucache_exists|wincache_ucache_get|wincache_ucache_inc|' + + 'wincache_ucache_info|wincache_ucache_meminfo|wincache_ucache_set|wincache_unlock|wordwrap|xattr_get|xattr_list|xattr_remove|xattr_set|' + + 'xattr_supported|xdiff_file_bdiff|xdiff_file_bdiff_size|xdiff_file_bpatch|xdiff_file_diff|xdiff_file_diff_binary|xdiff_file_merge3|' + + 'xdiff_file_patch|xdiff_file_patch_binary|xdiff_file_rabdiff|xdiff_string_bdiff|xdiff_string_bdiff_size|xdiff_string_bpatch|' + + 'xdiff_string_diff|xdiff_string_diff_binary|xdiff_string_merge3|xdiff_string_patch|xdiff_string_patch_binary|xdiff_string_rabdiff|' + + 'xhprof_disable|xhprof_enable|xhprof_sample_disable|xhprof_sample_enable|xml_error_string|xml_get_current_byte_index|' + + 'xml_get_current_column_number|xml_get_current_line_number|xml_get_error_code|xml_parse|xml_parse_into_struct|xml_parser_create|' + + 'xml_parser_create_ns|xml_parser_free|xml_parser_get_option|xml_parser_set_option|xml_set_character_data_handler|xml_set_default_handler|' + + 'xml_set_element_handler|xml_set_end_namespace_decl_handler|xml_set_external_entity_ref_handler|xml_set_notation_decl_handler|' + + 'xml_set_object|xml_set_processing_instruction_handler|xml_set_start_namespace_decl_handler|xml_set_unparsed_entity_decl_handler|xmlreader|' + + 'xmlrpc_decode|xmlrpc_decode_request|xmlrpc_encode|xmlrpc_encode_request|xmlrpc_get_type|xmlrpc_is_fault|xmlrpc_parse_method_descriptions|' + + 'xmlrpc_server_add_introspection_data|xmlrpc_server_call_method|xmlrpc_server_create|xmlrpc_server_destroy|' + + 'xmlrpc_server_register_introspection_callback|xmlrpc_server_register_method|xmlrpc_set_type|xmlwriter_end_attribute|xmlwriter_end_cdata|' + + 'xmlwriter_end_comment|xmlwriter_end_document|xmlwriter_end_dtd|xmlwriter_end_dtd_attlist|xmlwriter_end_dtd_element|' + + 'xmlwriter_end_dtd_entity|xmlwriter_end_element|xmlwriter_end_pi|xmlwriter_flush|xmlwriter_full_end_element|xmlwriter_open_memory|' + + 'xmlwriter_open_uri|xmlwriter_output_memory|xmlwriter_set_indent|xmlwriter_set_indent_string|xmlwriter_start_attribute|' + + 'xmlwriter_start_attribute_ns|xmlwriter_start_cdata|xmlwriter_start_comment|xmlwriter_start_document|xmlwriter_start_dtd|' + + 'xmlwriter_start_dtd_attlist|xmlwriter_start_dtd_element|xmlwriter_start_dtd_entity|xmlwriter_start_element|xmlwriter_start_element_ns|' + + 'xmlwriter_start_pi|xmlwriter_text|xmlwriter_write_attribute|xmlwriter_write_attribute_ns|xmlwriter_write_cdata|xmlwriter_write_comment|' + + 'xmlwriter_write_dtd|xmlwriter_write_dtd_attlist|xmlwriter_write_dtd_element|xmlwriter_write_dtd_entity|xmlwriter_write_element|' + + 'xmlwriter_write_element_ns|xmlwriter_write_pi|xmlwriter_write_raw|xpath_eval|xpath_eval_expression|xpath_new_context|xpath_register_ns|' + + 'xpath_register_ns_auto|xptr_eval|xptr_new_context|xslt_backend_info|xslt_backend_name|xslt_backend_version|xslt_create|xslt_errno|' + + 'xslt_error|xslt_free|xslt_getopt|xslt_process|xslt_set_base|xslt_set_encoding|xslt_set_error_handler|xslt_set_log|xslt_set_object|' + + 'xslt_set_sax_handler|xslt_set_sax_handlers|xslt_set_scheme_handler|xslt_set_scheme_handlers|xslt_setopt|xsltprocessor|yaml_emit|' + + 'yaml_emit_file|yaml_parse|yaml_parse_file|yaml_parse_url|yaz_addinfo|yaz_ccl_conf|yaz_ccl_parse|yaz_close|yaz_connect|yaz_database|' + + 'yaz_element|yaz_errno|yaz_error|yaz_es|yaz_es_result|yaz_get_option|yaz_hits|yaz_itemorder|yaz_present|yaz_range|yaz_record|yaz_scan|' + + 'yaz_scan_result|yaz_schema|yaz_search|yaz_set_option|yaz_sort|yaz_syntax|yaz_wait|yp_all|yp_cat|yp_err_string|yp_errno|yp_first|' + + 'yp_get_default_domain|yp_master|yp_match|yp_next|yp_order|zend_logo_guid|zend_thread_id|zend_version|zip_close|zip_entry_close|' + + 'zip_entry_compressedsize|zip_entry_compressionmethod|zip_entry_filesize|zip_entry_name|zip_entry_open|zip_entry_read|zip_open|zip_read|' + + 'ziparchive|ziparchive_addemptydir|ziparchive_addfile|ziparchive_addfromstring|ziparchive_close|ziparchive_deleteindex|' + + 'ziparchive_deletename|ziparchive_extractto|ziparchive_getarchivecomment|ziparchive_getcommentindex|ziparchive_getcommentname|' + + 'ziparchive_getfromindex|ziparchive_getfromname|ziparchive_getnameindex|ziparchive_getstatusstring|ziparchive_getstream|' + + 'ziparchive_locatename|ziparchive_open|ziparchive_renameindex|ziparchive_renamename|ziparchive_setCommentName|ziparchive_setarchivecomment|' + + 'ziparchive_setcommentindex|ziparchive_statindex|ziparchive_statname|ziparchive_unchangeall|ziparchive_unchangearchive|' + + 'ziparchive_unchangeindex|ziparchive_unchangename|zlib_get_coding_type').split('|') + ); + var keywords = lang.arrayToMap( + ('abstract|and|array|as|break|case|catch|class|clone|const|continue|declare|default|do|else|elseif|enddeclare|endfor|endforeach|endif|' + + 'endswitch|endwhile|extends|final|for|foreach|function|global|goto|if|implements|interface|instanceof|namespace|new|or|private|protected|' + + 'public|static|switch|throw|try|use|var|while|xor').split('|') + ); + var languageConstructs = lang.arrayToMap( + ('die|echo|empty|exit|eval|include|include_once|isset|list|require|require_once|return|print|unset').split('|') + ); + + var builtinConstants = lang.arrayToMap( + ('true|false|null|__CLASS__|__DIR__|__FILE__|__LINE__|__METHOD__|__FUNCTION__|__NAMESPACE__').split('|') + ); + + var builtinVariables = lang.arrayToMap( + ('$GLOBALS|$_SERVER|$_GET|$_POST|$_FILES|$_REQUEST|$_SESSION|$_ENV|$_COOKIE|$php_errormsg|$HTTP_RAW_POST_DATA|' + + '$http_response_header|$argc|$argv').split('|') + ); + var builtinFunctionsDeprecated = lang.arrayToMap( + ('key_exists|cairo_matrix_create_scale|cairo_matrix_create_translate|call_user_method|call_user_method_array|com_addref|com_get|' + + 'com_invoke|com_isenum|com_load|com_release|com_set|connection_timeout|cubrid_load_from_glo|cubrid_new_glo|cubrid_save_to_glo|' + + 'cubrid_send_glo|define_syslog_variables|dl|ereg|ereg_replace|eregi|eregi_replace|hw_documentattributes|hw_documentbodytag|' + + 'hw_documentsize|hw_outputdocument|imagedashedline|maxdb_bind_param|maxdb_bind_result|maxdb_client_encoding|maxdb_close_long_data|' + + 'maxdb_execute|maxdb_fetch|maxdb_get_metadata|maxdb_param_count|maxdb_send_long_data|mcrypt_ecb|mcrypt_generic_end|mime_content_type|' + + 'mysql_createdb|mysql_dbname|mysql_db_query|mysql_drop_db|mysql_dropdb|mysql_escape_string|mysql_fieldflags|mysql_fieldflags|' + + 'mysql_fieldname|mysql_fieldtable|mysql_fieldtype|mysql_freeresult|mysql_listdbs|mysql_list_fields|mysql_listfields|mysql_list_tables|' + + 'mysql_listtables|mysql_numfields|mysql_numrows|mysql_selectdb|mysql_tablename|mysqli_bind_param|mysqli_bind_result|' + + 'mysqli_disable_reads_from_master|mysqli_disable_rpl_parse|mysqli_enable_reads_from_master|mysqli_enable_rpl_parse|mysqli_execute|' + + 'mysqli_fetch|mysqli_get_metadata|mysqli_master_query|mysqli_param_count|mysqli_rpl_parse_enabled|mysqli_rpl_probe|mysqli_rpl_query_type|' + + 'mysqli_send_long_data|mysqli_send_query|mysqli_slave_query|ocibindbyname|ocicancel|ocicloselob|ocicollappend|ocicollassign|' + + 'ocicollassignelem|ocicollgetelem|ocicollmax|ocicollsize|ocicolltrim|ocicolumnisnull|ocicolumnname|ocicolumnprecision|ocicolumnscale|' + + 'ocicolumnsize|ocicolumntype|ocicolumntyperaw|ocicommit|ocidefinebyname|ocierror|ociexecute|ocifetch|ocifetchinto|ocifetchstatement|' + + 'ocifreecollection|ocifreecursor|ocifreedesc|ocifreestatement|ociinternaldebug|ociloadlob|ocilogoff|ocilogon|ocinewcollection|' + + 'ocinewcursor|ocinewdescriptor|ocinlogon|ocinumcols|ociparse|ociplogon|ociresult|ocirollback|ocirowcount|ocisavelob|ocisavelobfile|' + + 'ociserverversion|ocisetprefetch|ocistatementtype|ociwritelobtofile|ociwritetemporarylob|PDF_add_annotation|PDF_add_bookmark|' + + 'PDF_add_launchlink|PDF_add_locallink|PDF_add_note|PDF_add_outline|PDF_add_pdflink|PDF_add_weblink|PDF_attach_file|PDF_begin_page|' + + 'PDF_begin_template|PDF_close_pdi|PDF_close|PDF_findfont|PDF_get_font|PDF_get_fontname|PDF_get_fontsize|PDF_get_image_height|' + + 'PDF_get_image_width|PDF_get_majorversion|PDF_get_minorversion|PDF_get_pdi_parameter|PDF_get_pdi_value|PDF_open_ccitt|PDF_open_file|' + + 'PDF_open_gif|PDF_open_image_file|PDF_open_image|PDF_open_jpeg|PDF_open_pdi|PDF_open_tiff|PDF_place_image|PDF_place_pdi_page|' + + 'PDF_set_border_color|PDF_set_border_dash|PDF_set_border_style|PDF_set_char_spacing|PDF_set_duration|PDF_set_horiz_scaling|' + + 'PDF_set_info_author|PDF_set_info_creator|PDF_set_info_keywords|PDF_set_info_subject|PDF_set_info_title|PDF_set_leading|' + + 'PDF_set_text_matrix|PDF_set_text_rendering|PDF_set_text_rise|PDF_set_word_spacing|PDF_setgray_fill|PDF_setgray_stroke|PDF_setgray|' + + 'PDF_setpolydash|PDF_setrgbcolor_fill|PDF_setrgbcolor_stroke|PDF_setrgbcolor|PDF_show_boxed|php_check_syntax|px_set_tablename|' + + 'px_set_targetencoding|runkit_sandbox_output_handler|session_is_registered|session_register|session_unregister' + + 'set_magic_quotes_runtime|magic_quotes_runtime|set_socket_blocking|socket_set_blocking|set_socket_timeout|socket_set_timeout|split|spliti|' + + 'sql_regcase').split('|') + ); + + var keywordsDeprecated = lang.arrayToMap( + ('cfunction|old_function').split('|') + ); + + var futureReserved = lang.arrayToMap([]); + + this.$rules = { + "start" : [ + { + token : "comment", + regex : /(?:#|\/\/)(?:[^?]|\?[^>])*/ + }, + docComment.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment" + }, { + token : "string.regexp", + regex : "[/](?:(?:\\[(?:\\\\]|[^\\]])+\\])|(?:\\\\/|[^\\]/]))*[/][gimy]*\\s*(?=[).,;]|$)" + }, { + token : "string", // " string start + regex : '"', + next : "qqstring" + }, { + token : "string", // ' string start + regex : "'", + next : "qstring" + }, { + token : "constant.numeric", // hex + regex : "0[xX][0-9a-fA-F]+\\b" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : "constant.language", // constants + regex : "\\b(?:DEFAULT_INCLUDE_PATH|E_(?:ALL|CO(?:MPILE_(?:ERROR|WARNING)|RE_(?:ERROR|WARNING))|" + + "ERROR|NOTICE|PARSE|STRICT|USER_(?:ERROR|NOTICE|WARNING)|WARNING)|P(?:EAR_(?:EXTENSION_DIR|INSTALL_DIR)|" + + "HP_(?:BINDIR|CONFIG_FILE_(?:PATH|SCAN_DIR)|DATADIR|E(?:OL|XTENSION_DIR)|INT_(?:MAX|SIZE)|" + + "L(?:IBDIR|OCALSTATEDIR)|O(?:S|UTPUT_HANDLER_(?:CONT|END|START))|PREFIX|S(?:API|HLIB_SUFFIX|YSCONFDIR)|" + + "VERSION))|__COMPILER_HALT_OFFSET__)\\b" + }, { + token : ["keyword", "text", "support.class"], + regex : "\\b(new)(\\s+)(\\w+)" + }, { + token : ["support.class", "keyword.operator"], + regex : "\\b(\\w+)(::)" + }, { + token : "constant.language", // constants + regex : "\\b(?:A(?:B(?:DAY_(?:1|2|3|4|5|6|7)|MON_(?:1(?:0|1|2|)|2|3|4|5|6|7|8|9))|LT_DIGITS|M_STR|" + + "SSERT_(?:ACTIVE|BAIL|CALLBACK|QUIET_EVAL|WARNING))|C(?:ASE_(?:LOWER|UPPER)|HAR_MAX|" + + "O(?:DESET|NNECTION_(?:ABORTED|NORMAL|TIMEOUT)|UNT_(?:NORMAL|RECURSIVE))|" + + "R(?:EDITS_(?:ALL|DOCS|FULLPAGE|G(?:ENERAL|ROUP)|MODULES|QA|SAPI)|NCYSTR|" + + "YPT_(?:BLOWFISH|EXT_DES|MD5|S(?:ALT_LENGTH|TD_DES)))|URRENCY_SYMBOL)|D(?:AY_(?:1|2|3|4|5|6|7)|" + + "ECIMAL_POINT|IRECTORY_SEPARATOR|_(?:FMT|T_FMT))|E(?:NT_(?:COMPAT|NOQUOTES|QUOTES)|RA(?:_(?:D_(?:FMT|T_FMT)|" + + "T_FMT|YEAR)|)|XTR_(?:IF_EXISTS|OVERWRITE|PREFIX_(?:ALL|I(?:F_EXISTS|NVALID)|SAME)|SKIP))|FRAC_DIGITS|GROUPING|" + + "HTML_(?:ENTITIES|SPECIALCHARS)|IN(?:FO_(?:ALL|C(?:ONFIGURATION|REDITS)|ENVIRONMENT|GENERAL|LICENSE|MODULES|VARIABLES)|" + + "I_(?:ALL|PERDIR|SYSTEM|USER)|T_(?:CURR_SYMBOL|FRAC_DIGITS))|L(?:C_(?:ALL|C(?:OLLATE|TYPE)|M(?:ESSAGES|ONETARY)|NUMERIC|TIME)|" + + "O(?:CK_(?:EX|NB|SH|UN)|G_(?:A(?:LERT|UTH(?:PRIV|))|C(?:ONS|R(?:IT|ON))|D(?:AEMON|EBUG)|E(?:MERG|RR)|INFO|KERN|" + + "L(?:OCAL(?:0|1|2|3|4|5|6|7)|PR)|MAIL|N(?:DELAY|EWS|O(?:TICE|WAIT))|ODELAY|P(?:ERROR|ID)|SYSLOG|U(?:SER|UCP)|WARNING)))|" + + "M(?:ON_(?:1(?:0|1|2|)|2|3|4|5|6|7|8|9|DECIMAL_POINT|GROUPING|THOUSANDS_SEP)|_(?:1_PI|2_(?:PI|SQRTPI)|E|L(?:N(?:10|2)|" + + "OG(?:10E|2E))|PI(?:_(?:2|4)|)|SQRT(?:1_2|2)))|N(?:EGATIVE_SIGN|O(?:EXPR|STR)|_(?:CS_PRECEDES|S(?:EP_BY_SPACE|IGN_POSN)))|" + + "P(?:ATH(?:INFO_(?:BASENAME|DIRNAME|EXTENSION)|_SEPARATOR)|M_STR|OSITIVE_SIGN|_(?:CS_PRECEDES|S(?:EP_BY_SPACE|IGN_POSN)))|" + + "RADIXCHAR|S(?:EEK_(?:CUR|END|SET)|ORT_(?:ASC|DESC|NUMERIC|REGULAR|STRING)|TR_PAD_(?:BOTH|LEFT|RIGHT))|" + + "T(?:HOUS(?:ANDS_SEP|EP)|_FMT(?:_AMPM|))|YES(?:EXPR|STR)|STD(?:IN|OUT|ERR))\\b" + }, { + token : function(value) { + if (keywords.hasOwnProperty(value)) + return "keyword"; + else if (builtinConstants.hasOwnProperty(value)) + return "constant.language"; + else if (builtinVariables.hasOwnProperty(value)) + return "variable.language"; + else if (futureReserved.hasOwnProperty(value)) + return "invalid.illegal"; + else if (builtinFunctions.hasOwnProperty(value)) + return "support.function"; + else if (value == "debugger") + return "invalid.deprecated"; + else + if(value.match(/^(\$[a-zA-Z][a-zA-Z0-9_]*|self|parent)$/)) + return "variable"; + return "identifier"; + }, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + onMatch : function(value, currentSate, state) { + value = value.substr(3); + if (value[0] == "'" || value[0] == '"') + value = value.slice(1, -1); + state.unshift(this.next, value); + return "markup.list"; + }, + regex : /<<<(?:\w+|'\w+'|"\w+")$/, + next: "heredoc" + }, { + token : "keyword.operator", + regex : "::|!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)" + }, { + token : "paren.lparen", + regex : "[[({]" + }, { + token : "paren.rparen", + regex : "[\\])}]" + }, { + token : "text", + regex : "\\s+" + } + ], + "heredoc" : [ + { + onMatch : function(value, currentSate, stack) { + if (stack[1] + ";" != value) + return "string"; + stack.shift(); + stack.shift(); + return "markup.list" + }, + regex : "^\\w+;$", + next: "start" + }, { + token: "string", + regex : ".*", + } + ], + "comment" : [ + { + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "start" + }, { + token : "comment", // comment spanning whole line + regex : ".+" + } + ], + "qqstring" : [ + { + token : "constant.language.escape", + regex : '\\\\(?:[nrtvef\\\\"$]|[0-7]{1,3}|x[0-9A-Fa-f]{1,2})' + }, { + token : "constant.language.escape", + regex : /\$[\w]+(?:\[[\w\]+]|=>\w+)?/ + }, { + token : "constant.language.escape", + regex : /\$\{[^"\}]+\}?/ // this is wrong but ok for now + }, + {token : "string", regex : '"', next : "start"}, + {defaultToken : "string"} + ], + "qstring" : [ + {token : "constant.language.escape", regex : /\\['\\]/}, + {token : "string", regex : "'", next : "start"}, + {defaultToken : "string"} + ] + }; + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("start") ]); +}; + +oop.inherits(PhpLangHighlightRules, TextHighlightRules); + + +var PhpHighlightRules = function() { + HtmlHighlightRules.call(this); + + for (var i in this.$rules) { + this.$rules[i].unshift({ + token : "support.php_tag", // php open tag + regex : "<\\?(?:php|=)?", + push : "php-start" + }); + } + + this.embedRules(PhpLangHighlightRules, "php-"); + + this.$rules["php-start"].unshift({ + token : "support.php_tag", // php close tag + regex : "\\?>", + next : "pop" + }); + this.normalizeRules(); +}; + +oop.inherits(PhpHighlightRules, HtmlHighlightRules); + +exports.PhpHighlightRules = PhpHighlightRules; +exports.PhpLangHighlightRules = PhpLangHighlightRules; +}); + +ace.define('ace/mode/doc_comment_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, { + token : "comment.doc.tag", + regex : "\\bTODO\\b" + }, { + defaultToken : "comment.doc" + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.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_util', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var xmlUtil = require("./xml_util"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var tagMap = lang.createMap({ + a : 'anchor', + button : 'form', + form : 'form', + img : 'image', + input : 'form', + label : 'form', + script : 'script', + select : 'form', + textarea : 'form', + style : 'style', + table : 'table', + tbody : 'table', + td : 'table', + tfoot : 'table', + th : 'table', + tr : 'table' +}); + +var HtmlHighlightRules = function() { + this.$rules = { + start : [{ + token : "text", + regex : "<\\!\\[CDATA\\[", + next : "cdata" + }, { + token : "xml-pe", + regex : "<\\?.*?\\?>" + }, { + token : "comment", + regex : "<\\!--", + next : "comment" + }, { + token : "xml-pe", + regex : "<\\!.*?>" + }, { + token : "meta.tag", + regex : "<(?=script\\b)", + next : "script" + }, { + token : "meta.tag", + regex : "<(?=style\\b)", + next : "style" + }, { + token : "meta.tag", // opening tag + regex : "<\\/?(?=\\S)", + next : "tag" + }, { + token : "text", + regex : "\\s+" + }, { + token : "constant.character.entity", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }], + + cdata : [ { + token : "text", + regex : "\\]\\]>", + next : "start" + } ], + + comment : [ { + token : "comment", + regex : ".*?-->", + next : "start" + }, { + defaultToken : "comment" + } ] + }; + + xmlUtil.tag(this.$rules, "tag", "start", tagMap); + xmlUtil.tag(this.$rules, "style", "css-start", tagMap); + xmlUtil.tag(this.$rules, "script", "js-start", tagMap); + + this.embedRules(JavaScriptHighlightRules, "js-", [{ + token: "comment", + regex: "\\/\\/.*(?=<\\/script>)", + next: "tag" + }, { + token: "meta.tag", + regex: "<\\/(?=script)", + next: "tag" + }]); + + this.embedRules(CssHighlightRules, "css-", [{ + token: "meta.tag", + regex: "<\\/(?=style)", + next: "tag" + }]); +}; + +oop.inherits(HtmlHighlightRules, TextHighlightRules); + +exports.HtmlHighlightRules = HtmlHighlightRules; +}); + +ace.define('ace/mode/css_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var supportType = exports.supportType = "animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|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|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|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|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index"; +var supportFunction = exports.supportFunction = "rgb|rgba|url|attr|counter|counters"; +var supportConstant = exports.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"; +var supportConstantColor = exports.supportConstantColor = "aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow"; +var supportConstantFonts = exports.supportConstantFonts = "arial|century|comic|courier|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace"; + +var numRe = exports.numRe = "\\-?(?:(?:[0-9]+)|(?:[0-9]*\\.[0-9]+))"; +var pseudoElements = exports.pseudoElements = "(\\:+)\\b(after|before|first-letter|first-line|moz-selection|selection)\\b"; +var pseudoClasses = exports.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"; + +var CssHighlightRules = function() { + + var keywordMapper = this.createKeywordMapper({ + "support.function": supportFunction, + "support.constant": supportConstant, + "support.type": supportType, + "support.constant.color": supportConstantColor, + "support.constant.fonts": supportConstantFonts + }, "text", true); + + var base_ruleset = [ + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "ruleset_comment" + }, { + token : "string", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' + }, { + token : "string", // single line + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" + }, { + token : ["constant.numeric", "keyword"], + regex : "(" + numRe + ")(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 : numRe + }, { + token : "constant.numeric", // hex6 color + regex : "#[a-f0-9]{6}" + }, { + token : "constant.numeric", // hex3 color + regex : "#[a-f0-9]{3}" + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"], + regex : pseudoElements + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"], + regex : pseudoClasses + }, { + token : ["support.function", "string", "support.function"], + regex : "(url\\()(.*)(\\))" + }, { + token : keywordMapper, + regex : "\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*" + }, { + caseInsensitive: true + } + ]; + + var ruleset = lang.copyArray(base_ruleset); + ruleset.unshift({ + token : "paren.rparen", + regex : "\\}", + next: "start" + }); + + var media_ruleset = lang.copyArray( base_ruleset ); + media_ruleset.unshift({ + token : "paren.rparen", + regex : "\\}", + next: "media" + }); + + var base_comment = [{ + token : "comment", // comment spanning whole line + regex : ".+" + }]; + + var comment = lang.copyArray(base_comment); + comment.unshift({ + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "start" + }); + + var media_comment = lang.copyArray(base_comment); + media_comment.unshift({ + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "media" + }); + + var ruleset_comment = lang.copyArray(base_comment); + ruleset_comment.unshift({ + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "ruleset" + }); + + this.$rules = { + "start" : [{ + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment" + }, { + token: "paren.lparen", + regex: "\\{", + next: "ruleset" + }, { + token: "string", + regex: "@.*?{", + next: "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: true + }], + + "media" : [ { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "media_comment" + }, { + token: "paren.lparen", + regex: "\\{", + next: "media_ruleset" + },{ + token: "string", + regex: "\\}", + next: "start" + },{ + 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: true + }], + + "comment" : comment, + + "ruleset" : ruleset, + "ruleset_comment" : ruleset_comment, + + "media_ruleset" : media_ruleset, + "media_comment" : media_comment + }; +}; + +oop.inherits(CssHighlightRules, TextHighlightRules); + +exports.CssHighlightRules = CssHighlightRules; + +}); + +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(require, exports, module) { + + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var JavaScriptHighlightRules = function() { + var keywordMapper = this.createKeywordMapper({ + "variable.language": + "Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|" + // Constructors + "Namespace|QName|XML|XMLList|" + // E4X + "ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|" + + "Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|" + + "Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|" + // Errors + "SyntaxError|TypeError|URIError|" + + "decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|" + // Non-constructor functions + "isNaN|parseFloat|parseInt|" + + "JSON|Math|" + // Other + "this|arguments|prototype|window|document" , // Pseudo + "keyword": + "const|yield|import|get|set|" + + "break|case|catch|continue|default|delete|do|else|finally|for|function|" + + "if|in|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"); + var kwBeforeRe = "case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void"; + var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*\\b"; + + var escapedRe = "\\\\(?:x[0-9a-fA-F]{2}|" + // hex + "u[0-9a-fA-F]{4}|" + // unicode + "[0-2][0-7]{0,2}|" + // oct + "3[0-6][0-7]?|" + // oct + "37[0-7]?|" + // oct + "[4-7][0-7]?|" + //oct + ".)"; + + this.$rules = { + "no_regex" : [ + { + token : "comment", + regex : /\/\/.*$/ + }, + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : /\/\*/, + next : "comment" + }, { + token : "string", + regex : "'(?=.)", + next : "qstring" + }, { + token : "string", + regex : '"(?=.)', + next : "qqstring" + }, { + token : "constant.numeric", // hex + regex : /0[xX][0-9a-fA-F]+\b/ + }, { + token : "constant.numeric", // float + regex : /[+-]?\d+(?:(?:\.\d*)?(?:[eE][+-]?\d+)?)?\b/ + }, { + token : [ + "storage.type", "punctuation.operator", "support.function", + "punctuation.operator", "entity.name.function", "text","keyword.operator" + ], + regex : "(" + identifierRe + ")(\\.)(prototype)(\\.)(" + identifierRe +")(\\s*)(=)", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "keyword.operator", "text", "storage.type", + "text", "paren.lparen" + ], + regex : "(" + identifierRe +")(\\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 : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(function)(\\s+)(" + identifierRe + ")(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "punctuation.operator", + "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\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 : "(?:" + kwBeforeRe + ")\\b", + next : "start" + }, { + token : ["punctuation.operator", "support.function"], + regex : /(\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:opzzzz|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 : ["punctuation.operator", "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)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/ + }, { + token : ["punctuation.operator", "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 : ["storage.type", "punctuation.operator", "support.function.firebug"], + regex : /(console)(\.)(warn|info|log|error|time|timeEnd|assert)\b/ + }, { + token : keywordMapper, + regex : identifierRe + }, { + token : "keyword.operator", + regex : /--|\+\+|[!$%&*+\-~]|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\|\||\?\:|\*=|%=|\+=|\-=|&=|\^=/, + next : "start" + }, { + token : "punctuation.operator", + regex : /\?|\:|\,|\;|\./, + next : "start" + }, { + token : "paren.lparen", + regex : /[\[({]/, + next : "start" + }, { + token : "paren.rparen", + regex : /[\])}]/ + }, { + token : "keyword.operator", + regex : /\/=?/, + next : "start" + }, { + token: "comment", + regex: /^#!.*$/ + } + ], + "start": [ + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment_regex_allowed" + }, { + token : "comment", + regex : "\\/\\/.*$", + next : "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: "/\\w*", + 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.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: identifierRe + }, { + token: "punctuation.operator", + regex: "[, ]+" + }, { + token: "punctuation.operator", + regex: "$" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "comment_regex_allowed" : [ + {token : "comment", regex : "\\*\\/", next : "start"}, + {defaultToken : "comment"} + ], + "comment" : [ + {token : "comment", regex : "\\*\\/", next : "no_regex"}, + {defaultToken : "comment"} + ], + "qqstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + next : "qqstring" + }, { + token : "string", + regex : '"|$', + next : "no_regex" + }, { + defaultToken: "string" + } + ], + "qstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + next : "qstring" + }, { + token : "string", + regex : "'|$", + next : "no_regex" + }, { + defaultToken: "string" + } + ] + }; + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("no_regex") ]); +}; + +oop.inherits(JavaScriptHighlightRules, TextHighlightRules); + +exports.JavaScriptHighlightRules = JavaScriptHighlightRules; +}); + +ace.define('ace/mode/xml_util', ['require', 'exports', 'module' ], function(require, exports, module) { + + +function string(state) { + return [{ + token : "string", + regex : '"', + next : state + "_qqstring" + }, { + token : "string", + regex : "'", + next : state + "_qstring" + }]; +} + +function multiLineString(quote, state) { + return [ + {token : "string", regex : quote, next : state}, + { + token : "constant.language.escape", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }, + {defaultToken : "string"} + ]; +} + +exports.tag = function(states, name, nextState, tagMap) { + states[name] = [{ + token : "text", + regex : "\\s+" + }, { + + token : !tagMap ? "meta.tag.tag-name" : function(value) { + if (tagMap[value]) + return "meta.tag.tag-name." + tagMap[value]; + else + return "meta.tag.tag-name"; + }, + regex : "[-_a-zA-Z0-9:]+", + next : name + "_embed_attribute_list" + }, { + token: "empty", + regex: "", + next : name + "_embed_attribute_list" + }]; + + states[name + "_qstring"] = multiLineString("'", name + "_embed_attribute_list"); + states[name + "_qqstring"] = multiLineString("\"", name + "_embed_attribute_list"); + + states[name + "_embed_attribute_list"] = [{ + token : "meta.tag.r", + regex : "/?>", + next : nextState + }, { + token : "keyword.operator", + regex : "=" + }, { + token : "entity.other.attribute-name", + regex : "[-_a-zA-Z0-9:]+" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : "text", + regex : "\\s+" + }].concat(string(name)); +}; + +}); + +ace.define('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) { + + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define('ace/mode/behaviour/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/token_iterator', 'ace/lib/lang'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; +var lang = require("../../lib/lang"); + +var SAFE_INSERT_IN_TOKENS = + ["text", "paren.rparen", "punctuation.operator"]; +var SAFE_INSERT_BEFORE_TOKENS = + ["text", "paren.rparen", "punctuation.operator", "comment"]; + + +var autoInsertedBrackets = 0; +var autoInsertedRow = -1; +var autoInsertedLineEnd = ""; +var maybeInsertedBrackets = 0; +var maybeInsertedRow = -1; +var maybeInsertedLineStart = ""; +var maybeInsertedLineEnd = ""; + +var CstyleBehaviour = function () { + + CstyleBehaviour.isSaneInsertion = function(editor, session) { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + if (!this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) { + var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1); + if (!this.$matchTokenType(iterator2.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) + return false; + } + iterator.stepForward(); + return iterator.getCurrentTokenRow() !== cursor.row || + this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_BEFORE_TOKENS); + }; + + CstyleBehaviour.$matchTokenType = function(token, types) { + return types.indexOf(token.type || token) > -1; + }; + + CstyleBehaviour.recordAutoInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isAutoInsertedClosing(cursor, line, autoInsertedLineEnd[0])) + autoInsertedBrackets = 0; + autoInsertedRow = cursor.row; + autoInsertedLineEnd = bracket + line.substr(cursor.column); + autoInsertedBrackets++; + }; + + CstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isMaybeInsertedClosing(cursor, line)) + maybeInsertedBrackets = 0; + maybeInsertedRow = cursor.row; + maybeInsertedLineStart = line.substr(0, cursor.column) + bracket; + maybeInsertedLineEnd = line.substr(cursor.column); + maybeInsertedBrackets++; + }; + + CstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) { + return autoInsertedBrackets > 0 && + cursor.row === autoInsertedRow && + bracket === autoInsertedLineEnd[0] && + line.substr(cursor.column) === autoInsertedLineEnd; + }; + + CstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) { + return maybeInsertedBrackets > 0 && + cursor.row === maybeInsertedRow && + line.substr(cursor.column) === maybeInsertedLineEnd && + line.substr(0, cursor.column) == maybeInsertedLineStart; + }; + + CstyleBehaviour.popAutoInsertedClosing = function() { + autoInsertedLineEnd = autoInsertedLineEnd.substr(1); + autoInsertedBrackets--; + }; + + CstyleBehaviour.clearMaybeInsertedClosing = function() { + maybeInsertedBrackets = 0; + maybeInsertedRow = -1; + }; + + this.add("braces", "insertion", function (state, action, editor, session, text) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (text == '{') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "{" && editor.getWrapBehavioursEnabled()) { + return { + text: '{' + selected + '}', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + if (/[\]\}\)]/.test(line[cursor.column])) { + CstyleBehaviour.recordAutoInsert(editor, session, "}"); + return { + text: '{}', + selection: [1, 1] + }; + } else { + CstyleBehaviour.recordMaybeInsert(editor, session, "{"); + return { + text: '{', + selection: [1, 1] + }; + } + } + } else if (text == '}') { + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}') { + var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } else if (text == "\n" || text == "\r\n") { + var closing = ""; + if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) { + closing = lang.stringRepeat("}", maybeInsertedBrackets); + CstyleBehaviour.clearMaybeInsertedClosing(); + } + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}' || closing !== "") { + var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column}, '}'); + if (!openBracePos) + return null; + + var indent = this.getNextLineIndent(state, line.substring(0, cursor.column), session.getTabString()); + var next_indent = this.$getIndent(line); + + return { + text: '\n' + indent + '\n' + next_indent + closing, + selection: [1, indent.length, 1, indent.length] + }; + } + } + }); + + this.add("braces", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '{') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar == '}') { + range.end.column++; + return range; + } else { + maybeInsertedBrackets--; + } + } + }); + + this.add("parens", "insertion", function (state, action, editor, session, text) { + if (text == '(') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return { + text: '(' + selected + ')', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, ")"); + return { + text: '()', + selection: [1, 1] + }; + } + } else if (text == ')') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ')') { + var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("parens", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '(') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ')') { + range.end.column++; + return range; + } + } + }); + + this.add("brackets", "insertion", function (state, action, editor, session, text) { + if (text == '[') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return { + text: '[' + selected + ']', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, "]"); + return { + text: '[]', + selection: [1, 1] + }; + } + } else if (text == ']') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ']') { + var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("brackets", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '[') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ']') { + range.end.column++; + return range; + } + } + }); + + this.add("string_dquotes", "insertion", function (state, action, editor, session, text) { + if (text == '"' || text == "'") { + var quote = text; + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "'" && selected != '"' && editor.getWrapBehavioursEnabled()) { + return { + text: quote + selected + quote, + selection: false + }; + } else { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var leftChar = line.substring(cursor.column-1, cursor.column); + if (leftChar == '\\') { + return null; + } + var tokens = session.getTokens(selection.start.row); + var col = 0, token; + var quotepos = -1; // Track whether we're inside an open quote. + + for (var x = 0; x < tokens.length; x++) { + token = tokens[x]; + if (token.type == "string") { + quotepos = -1; + } else if (quotepos < 0) { + quotepos = token.value.indexOf(quote); + } + if ((token.value.length + col) > selection.start.column) { + break; + } + col += tokens[x].value.length; + } + if (!token || (quotepos < 0 && token.type !== "comment" && (token.type !== "string" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) { + if (!CstyleBehaviour.isSaneInsertion(editor, session)) + return; + return { + text: quote + quote, + selection: [1,1] + }; + } else if (token && token.type === "string") { + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == quote) { + return { + text: '', + selection: [1, 1] + }; + } + } + } + } + }); + + this.add("string_dquotes", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && (selected == '"' || selected == "'")) { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == selected) { + range.end.column++; + return range; + } + } + }); + +}; + +oop.inherits(CstyleBehaviour, Behaviour); + +exports.CstyleBehaviour = CstyleBehaviour; +}); + +ace.define('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var line = session.getLine(row); + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i + match[0].length, 1); + } + + if (foldStyle !== "markbeginend") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + +}).call(FoldMode.prototype); + +}); diff --git a/0.0.3_0/ace/mode-powershell.js b/0.0.3_0/ace/mode-powershell.js new file mode 100644 index 0000000..a276073 --- /dev/null +++ b/0.0.3_0/ace/mode-powershell.js @@ -0,0 +1,618 @@ +ace.define('ace/mode/powershell', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/powershell_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/mode/behaviour/cstyle', 'ace/mode/folding/cstyle'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var PowershellHighlightRules = require("./powershell_highlight_rules").PowershellHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new PowershellHighlightRules().getRules()); + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new CStyleFoldMode({start: "^\\s*(<#)", end: "^[#\\s]>\\s*$"}); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "#"; + this.blockComment = {start: "<#", end: "#>"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.$tokenizer.getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start") { + var match = line.match(/^.*[\{\(\[]\s*$/); + if (match) { + indent += tab; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + + this.createWorker = function(session) { + return null; + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); +ace.define('ace/mode/powershell_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var PowershellHighlightRules = function() { + + var keywords = ( + "function|if|else|elseif|switch|while|default|for|do|until|break|continue|" + + "foreach|return|filter|in|trap|throw|param|begin|process|end" + ); + + var builtinFunctions = ( + "Get-Alias|Import-Alias|New-Alias|Set-Alias|Get-AuthenticodeSignature|Set-AuthenticodeSignature|" + + "Set-Location|Get-ChildItem|Clear-Item|Get-Command|Measure-Command|Trace-Command|" + + "Add-Computer|Checkpoint-Computer|Remove-Computer|Restart-Computer|Restore-Computer|Stop-Computer|" + + "Reset-ComputerMachinePassword|Test-ComputerSecureChannel|Add-Content|Get-Content|Set-Content|Clear-Content|" + + "Get-Command|Invoke-Command|Enable-ComputerRestore|Disable-ComputerRestore|Get-ComputerRestorePoint|Test-Connection|" + + "ConvertFrom-CSV|ConvertTo-CSV|ConvertTo-Html|ConvertTo-Xml|ConvertFrom-SecureString|ConvertTo-SecureString|" + + "Copy-Item|Export-Counter|Get-Counter|Import-Counter|Get-Credential|Get-Culture|" + + "Get-ChildItem|Get-Date|Set-Date|Remove-Item|Compare-Object|Get-Event|" + + "Get-WinEvent|New-Event|Remove-Event|Unregister-Event|Wait-Event|Clear-EventLog|" + + "Get-Eventlog|Limit-EventLog|New-Eventlog|Remove-EventLog|Show-EventLog|Write-EventLog|" + + "Get-EventSubscriber|Register-EngineEvent|Register-ObjectEvent|Register-WmiEvent|Get-ExecutionPolicy|Set-ExecutionPolicy|" + + "Export-Alias|Export-Clixml|Export-Console|Export-Csv|ForEach-Object|Format-Custom|" + + "Format-List|Format-Table|Format-Wide|Export-FormatData|Get-FormatData|Get-Item|" + + "Get-ChildItem|Get-Help|Add-History|Clear-History|Get-History|Invoke-History|" + + "Get-Host|Read-Host|Write-Host|Get-HotFix|Import-Clixml|Import-Csv|" + + "Invoke-Command|Invoke-Expression|Get-Item|Invoke-Item|New-Item|Remove-Item|" + + "Set-Item|Clear-ItemProperty|Copy-ItemProperty|Get-ItemProperty|Move-ItemProperty|New-ItemProperty|" + + "Remove-ItemProperty|Rename-ItemProperty|Set-ItemProperty|Get-Job|Receive-Job|Remove-Job|" + + "Start-Job|Stop-Job|Wait-Job|Stop-Process|Update-List|Get-Location|" + + "Pop-Location|Push-Location|Set-Location|Send-MailMessage|Add-Member|Get-Member|" + + "Move-Item|Compare-Object|Group-Object|Measure-Object|New-Object|Select-Object|" + + "Sort-Object|Where-Object|Out-Default|Out-File|Out-GridView|Out-Host|" + + "Out-Null|Out-Printer|Out-String|Convert-Path|Join-Path|Resolve-Path|" + + "Split-Path|Test-Path|Get-Pfxcertificate|Pop-Location|Push-Location|Get-Process|" + + "Start-Process|Stop-Process|Wait-Process|Enable-PSBreakpoint|Disable-PSBreakpoint|Get-PSBreakpoint|" + + "Set-PSBreakpoint|Remove-PSBreakpoint|Get-PSDrive|New-PSDrive|Remove-PSDrive|Get-PSProvider|" + + "Set-PSdebug|Enter-PSSession|Exit-PSSession|Export-PSSession|Get-PSSession|Import-PSSession|" + + "New-PSSession|Remove-PSSession|Disable-PSSessionConfiguration|Enable-PSSessionConfiguration|Get-PSSessionConfiguration|Register-PSSessionConfiguration|" + + "Set-PSSessionConfiguration|Unregister-PSSessionConfiguration|New-PSSessionOption|Add-PsSnapIn|Get-PsSnapin|Remove-PSSnapin|" + + "Get-Random|Read-Host|Remove-Item|Rename-Item|Rename-ItemProperty|Select-Object|" + + "Select-XML|Send-MailMessage|Get-Service|New-Service|Restart-Service|Resume-Service|" + + "Set-Service|Start-Service|Stop-Service|Suspend-Service|Sort-Object|Start-Sleep|" + + "ConvertFrom-StringData|Select-String|Tee-Object|New-Timespan|Trace-Command|Get-Tracesource|" + + "Set-Tracesource|Start-Transaction|Complete-Transaction|Get-Transaction|Use-Transaction|Undo-Transaction|" + + "Start-Transcript|Stop-Transcript|Add-Type|Update-TypeData|Get-Uiculture|Get-Unique|" + + "Update-Formatdata|Update-Typedata|Clear-Variable|Get-Variable|New-Variable|Remove-Variable|" + + "Set-Variable|New-WebServiceProxy|Where-Object|Write-Debug|Write-Error|Write-Host|" + + "Write-Output|Write-Progress|Write-Verbose|Write-Warning|Set-WmiInstance|Invoke-WmiMethod|" + + "Get-WmiObject|Remove-WmiObject|Connect-WSMan|Disconnect-WSMan|Test-WSMan|Invoke-WSManAction|" + + "Disable-WSManCredSSP|Enable-WSManCredSSP|Get-WSManCredSSP|New-WSManInstance|Get-WSManInstance|Set-WSManInstance|" + + "Remove-WSManInstance|Set-WSManQuickConfig|New-WSManSessionOption" + ); + + var keywordMapper = this.createKeywordMapper({ + "support.function": builtinFunctions, + "keyword": keywords + }, "identifier"); + + var binaryOperatorsRe = "eq|ne|ge|gt|lt|le|like|notlike|match|notmatch|replace|contains|notcontains|" + + "ieq|ine|ige|igt|ile|ilt|ilike|inotlike|imatch|inotmatch|ireplace|icontains|inotcontains|" + + "is|isnot|as|" + + "and|or|band|bor|not"; + + this.$rules = { + "start" : [ + { + token : "comment", + regex : "#.*$" + }, { + token : "comment.start", + regex : "<#", + next : "comment" + }, { + token : "string", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' + }, { + token : "string", // single line + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" + }, { + token : "constant.numeric", // hex + regex : "0[xX][0-9a-fA-F]+\\b" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : "constant.language.boolean", + regex : "[$](?:[Tt]rue|[Ff]alse)\\b" + }, { + token : "constant.language", + regex : "[$][Nn]ull\\b" + }, { + token : "variable.instance", + regex : "[$][a-zA-Z][a-zA-Z0-9_]*\\b" + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$\\-]*\\b" + }, { + token : "keyword.operator", + regex : "\\-(?:" + binaryOperatorsRe + ")" + }, { + token : "keyword.operator", + regex : "&|\\*|\\+|\\-|\\=|\\+=|\\-=" + }, { + token : "lparen", + regex : "[[({]" + }, { + token : "rparen", + regex : "[\\])}]" + }, { + token : "text", + regex : "\\s+" + } + ], + "comment" : [ + { + token : "comment.end", + regex : "#>", + next : "start" + }, { + token : "doc.comment.tag", + regex : "^\\.\\w+" + }, { + token : "comment", + regex : "\\w+" + }, { + token : "comment", + regex : "." + } + ] + }; +}; + +oop.inherits(PowershellHighlightRules, TextHighlightRules); + +exports.PowershellHighlightRules = PowershellHighlightRules; +}); + +ace.define('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) { + + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define('ace/mode/behaviour/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/token_iterator', 'ace/lib/lang'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; +var lang = require("../../lib/lang"); + +var SAFE_INSERT_IN_TOKENS = + ["text", "paren.rparen", "punctuation.operator"]; +var SAFE_INSERT_BEFORE_TOKENS = + ["text", "paren.rparen", "punctuation.operator", "comment"]; + + +var autoInsertedBrackets = 0; +var autoInsertedRow = -1; +var autoInsertedLineEnd = ""; +var maybeInsertedBrackets = 0; +var maybeInsertedRow = -1; +var maybeInsertedLineStart = ""; +var maybeInsertedLineEnd = ""; + +var CstyleBehaviour = function () { + + CstyleBehaviour.isSaneInsertion = function(editor, session) { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + if (!this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) { + var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1); + if (!this.$matchTokenType(iterator2.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) + return false; + } + iterator.stepForward(); + return iterator.getCurrentTokenRow() !== cursor.row || + this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_BEFORE_TOKENS); + }; + + CstyleBehaviour.$matchTokenType = function(token, types) { + return types.indexOf(token.type || token) > -1; + }; + + CstyleBehaviour.recordAutoInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isAutoInsertedClosing(cursor, line, autoInsertedLineEnd[0])) + autoInsertedBrackets = 0; + autoInsertedRow = cursor.row; + autoInsertedLineEnd = bracket + line.substr(cursor.column); + autoInsertedBrackets++; + }; + + CstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isMaybeInsertedClosing(cursor, line)) + maybeInsertedBrackets = 0; + maybeInsertedRow = cursor.row; + maybeInsertedLineStart = line.substr(0, cursor.column) + bracket; + maybeInsertedLineEnd = line.substr(cursor.column); + maybeInsertedBrackets++; + }; + + CstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) { + return autoInsertedBrackets > 0 && + cursor.row === autoInsertedRow && + bracket === autoInsertedLineEnd[0] && + line.substr(cursor.column) === autoInsertedLineEnd; + }; + + CstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) { + return maybeInsertedBrackets > 0 && + cursor.row === maybeInsertedRow && + line.substr(cursor.column) === maybeInsertedLineEnd && + line.substr(0, cursor.column) == maybeInsertedLineStart; + }; + + CstyleBehaviour.popAutoInsertedClosing = function() { + autoInsertedLineEnd = autoInsertedLineEnd.substr(1); + autoInsertedBrackets--; + }; + + CstyleBehaviour.clearMaybeInsertedClosing = function() { + maybeInsertedBrackets = 0; + maybeInsertedRow = -1; + }; + + this.add("braces", "insertion", function (state, action, editor, session, text) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (text == '{') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "{" && editor.getWrapBehavioursEnabled()) { + return { + text: '{' + selected + '}', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + if (/[\]\}\)]/.test(line[cursor.column])) { + CstyleBehaviour.recordAutoInsert(editor, session, "}"); + return { + text: '{}', + selection: [1, 1] + }; + } else { + CstyleBehaviour.recordMaybeInsert(editor, session, "{"); + return { + text: '{', + selection: [1, 1] + }; + } + } + } else if (text == '}') { + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}') { + var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } else if (text == "\n" || text == "\r\n") { + var closing = ""; + if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) { + closing = lang.stringRepeat("}", maybeInsertedBrackets); + CstyleBehaviour.clearMaybeInsertedClosing(); + } + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}' || closing !== "") { + var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column}, '}'); + if (!openBracePos) + return null; + + var indent = this.getNextLineIndent(state, line.substring(0, cursor.column), session.getTabString()); + var next_indent = this.$getIndent(line); + + return { + text: '\n' + indent + '\n' + next_indent + closing, + selection: [1, indent.length, 1, indent.length] + }; + } + } + }); + + this.add("braces", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '{') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar == '}') { + range.end.column++; + return range; + } else { + maybeInsertedBrackets--; + } + } + }); + + this.add("parens", "insertion", function (state, action, editor, session, text) { + if (text == '(') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return { + text: '(' + selected + ')', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, ")"); + return { + text: '()', + selection: [1, 1] + }; + } + } else if (text == ')') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ')') { + var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("parens", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '(') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ')') { + range.end.column++; + return range; + } + } + }); + + this.add("brackets", "insertion", function (state, action, editor, session, text) { + if (text == '[') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return { + text: '[' + selected + ']', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, "]"); + return { + text: '[]', + selection: [1, 1] + }; + } + } else if (text == ']') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ']') { + var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("brackets", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '[') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ']') { + range.end.column++; + return range; + } + } + }); + + this.add("string_dquotes", "insertion", function (state, action, editor, session, text) { + if (text == '"' || text == "'") { + var quote = text; + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "'" && selected != '"' && editor.getWrapBehavioursEnabled()) { + return { + text: quote + selected + quote, + selection: false + }; + } else { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var leftChar = line.substring(cursor.column-1, cursor.column); + if (leftChar == '\\') { + return null; + } + var tokens = session.getTokens(selection.start.row); + var col = 0, token; + var quotepos = -1; // Track whether we're inside an open quote. + + for (var x = 0; x < tokens.length; x++) { + token = tokens[x]; + if (token.type == "string") { + quotepos = -1; + } else if (quotepos < 0) { + quotepos = token.value.indexOf(quote); + } + if ((token.value.length + col) > selection.start.column) { + break; + } + col += tokens[x].value.length; + } + if (!token || (quotepos < 0 && token.type !== "comment" && (token.type !== "string" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) { + if (!CstyleBehaviour.isSaneInsertion(editor, session)) + return; + return { + text: quote + quote, + selection: [1,1] + }; + } else if (token && token.type === "string") { + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == quote) { + return { + text: '', + selection: [1, 1] + }; + } + } + } + } + }); + + this.add("string_dquotes", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && (selected == '"' || selected == "'")) { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == selected) { + range.end.column++; + return range; + } + } + }); + +}; + +oop.inherits(CstyleBehaviour, Behaviour); + +exports.CstyleBehaviour = CstyleBehaviour; +}); + +ace.define('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var line = session.getLine(row); + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i + match[0].length, 1); + } + + if (foldStyle !== "markbeginend") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + +}).call(FoldMode.prototype); + +}); diff --git a/0.0.3_0/ace/mode-prolog.js b/0.0.3_0/ace/mode-prolog.js new file mode 100644 index 0000000..2f80065 --- /dev/null +++ b/0.0.3_0/ace/mode-prolog.js @@ -0,0 +1,313 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2012, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * + * Contributor(s): + * + * + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/mode/prolog', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/prolog_highlight_rules', 'ace/mode/folding/cstyle'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var PrologHighlightRules = require("./prolog_highlight_rules").PrologHighlightRules; +var FoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + var highlighter = new PrologHighlightRules(); + this.foldingRules = new FoldMode(); + this.$tokenizer = new Tokenizer(highlighter.getRules()); +}; +oop.inherits(Mode, TextMode); + +(function() { + this.lineCommentStart = "/\\*"; + this.blockComment = {start: "/*", end: "*/"}; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/prolog_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var PrologHighlightRules = function() { + + this.$rules = { start: + [ { include: '#comment' }, + { include: '#basic_fact' }, + { include: '#rule' }, + { include: '#directive' }, + { include: '#fact' } ], + '#atom': + [ { token: 'constant.other.atom.prolog', + regex: '\\b[a-z][a-zA-Z0-9_]*\\b' }, + { token: 'constant.numeric.prolog', + regex: '-?\\d+(?:\\.\\d+)?' }, + { include: '#string' } ], + '#basic_elem': + [ { include: '#comment' }, + { include: '#statement' }, + { include: '#constants' }, + { include: '#operators' }, + { include: '#builtins' }, + { include: '#list' }, + { include: '#atom' }, + { include: '#variable' } ], + '#basic_fact': + [ { token: + [ 'entity.name.function.fact.basic.prolog', + 'punctuation.end.fact.basic.prolog' ], + regex: '([a-z]\\w*)(\\.)' } ], + '#builtins': + [ { token: 'support.function.builtin.prolog', + regex: '\\b(?:\n\t\t\t\t\t\tabolish|abort|ancestors|arg|ascii|assert[az]|\n\t\t\t\t\t\tatom(?:ic)?|body|char|close|conc|concat|consult|\n\t\t\t\t\t\tdefine|definition|dynamic|dump|fail|file|free|\n\t\t\t\t\t\tfree_proc|functor|getc|goal|halt|head|head|integer|\n\t\t\t\t\t\tlength|listing|match_args|member|next_clause|nl|\n\t\t\t\t\t\tnonvar|nth|number|cvars|nvars|offset|op|\n\t\t\t\t\t\tprint?|prompt|putc|quoted|ratom|read|redefine|\n\t\t\t\t\t\trename|retract(?:all)?|see|seeing|seen|skip|spy|\n\t\t\t\t\t\tstatistics|system|tab|tell|telling|term|\n\t\t\t\t\t\ttime|told|univ|unlink_clause|unspy_predicate|\n\t\t\t\t\t\tvar|write\n\t\t\t\t\t)\\b' } ], + '#comment': + [ { token: + [ 'punctuation.definition.comment.prolog', + 'comment.line.percentage.prolog' ], + regex: '(%)(.*$)' }, + { token: 'punctuation.definition.comment.prolog', + regex: '/\\*', + push: + [ { token: 'punctuation.definition.comment.prolog', + regex: '\\*/', + next: 'pop' }, + { defaultToken: 'comment.block.prolog' } ] } ], + '#constants': + [ { token: 'constant.language.prolog', + regex: '\\b(?:true|false|yes|no)\\b' } ], + '#directive': + [ { token: 'keyword.operator.directive.prolog', + regex: ':-', + push: + [ { token: 'meta.directive.prolog', regex: '\\.', next: 'pop' }, + { include: '#comment' }, + { include: '#statement' }, + { defaultToken: 'meta.directive.prolog' } ] } ], + '#expr': + [ { include: '#comments' }, + { token: 'meta.expression.prolog', + regex: '\\(', + push: + [ { token: 'meta.expression.prolog', regex: '\\)', next: 'pop' }, + { include: '#expr' }, + { defaultToken: 'meta.expression.prolog' } ] }, + { token: 'keyword.control.cutoff.prolog', regex: '!' }, + { token: 'punctuation.control.and.prolog', regex: ',' }, + { token: 'punctuation.control.or.prolog', regex: ';' }, + { include: '#basic_elem' } ], + '#fact': + [ { token: + [ 'entity.name.function.fact.prolog', + 'punctuation.begin.fact.parameters.prolog' ], + regex: '([a-z]\\w*)(\\()(?!.*:-)', + push: + [ { token: + [ 'punctuation.end.fact.parameters.prolog', + 'punctuation.end.fact.prolog' ], + regex: '(\\))(\\.)', + next: 'pop' }, + { include: '#parameter' }, + { defaultToken: 'meta.fact.prolog' } ] } ], + '#list': + [ { token: 'punctuation.begin.list.prolog', + regex: '\\[(?=.*\\])', + push: + [ { token: 'punctuation.end.list.prolog', + regex: '\\]', + next: 'pop' }, + { include: '#comment' }, + { token: 'punctuation.separator.list.prolog', regex: ',' }, + { token: 'punctuation.concat.list.prolog', + regex: '\\|', + push: + [ { token: 'meta.list.concat.prolog', + regex: '(?=\\s*\\])', + next: 'pop' }, + { include: '#basic_elem' }, + { defaultToken: 'meta.list.concat.prolog' } ] }, + { include: '#basic_elem' }, + { defaultToken: 'meta.list.prolog' } ] } ], + '#operators': + [ { token: 'keyword.operator.prolog', + regex: '\\\\\\+|\\bnot\\b|\\bis\\b|->|[><]|[><\\\\:=]?=|(?:=\\\\|\\\\=)=' } ], + '#parameter': + [ { token: 'variable.language.anonymous.prolog', + regex: '\\b_\\b' }, + { token: 'variable.parameter.prolog', + regex: '\\b[A-Z_]\\w*\\b' }, + { token: 'punctuation.separator.parameters.prolog', regex: ',' }, + { include: '#basic_elem' }, + { token: 'invalid.illegal.invalidchar.prolog', regex: '[^\\s]' } ], + '#rule': + [ { token: 'meta.rule.prolog', + regex: '(?=[a-z]\\w*.*:-)', + push: + [ { token: 'punctuation.rule.end.prolog', + regex: '\\.', + next: 'pop' }, + { token: 'meta.rule.signature.prolog', + regex: '(?=[a-z]\\w*.*:-)', + push: + [ { token: 'meta.rule.signature.prolog', + regex: '(?=:-)', + next: 'pop' }, + { token: 'entity.name.function.rule.prolog', + regex: '[a-z]\\w*(?=\\(|\\s*:-)' }, + { token: 'punctuation.rule.parameters.begin.prolog', + regex: '\\(', + push: + [ { token: 'punctuation.rule.parameters.end.prolog', + regex: '\\)', + next: 'pop' }, + { include: '#parameter' }, + { defaultToken: 'meta.rule.parameters.prolog' } ] }, + { defaultToken: 'meta.rule.signature.prolog' } ] }, + { token: 'keyword.operator.definition.prolog', + regex: ':-', + push: + [ { token: 'meta.rule.definition.prolog', + regex: '(?=\\.)', + next: 'pop' }, + { include: '#comment' }, + { include: '#expr' }, + { defaultToken: 'meta.rule.definition.prolog' } ] }, + { defaultToken: 'meta.rule.prolog' } ] } ], + '#statement': + [ { token: 'meta.statement.prolog', + regex: '(?=[a-z]\\w*\\()', + push: + [ { token: 'punctuation.end.statement.parameters.prolog', + regex: '\\)', + next: 'pop' }, + { include: '#builtins' }, + { include: '#atom' }, + { token: 'punctuation.begin.statement.parameters.prolog', + regex: '\\(', + push: + [ { token: 'meta.statement.parameters.prolog', + regex: '(?=\\))', + next: 'pop' }, + { token: 'punctuation.separator.statement.prolog', regex: ',' }, + { include: '#basic_elem' }, + { defaultToken: 'meta.statement.parameters.prolog' } ] }, + { defaultToken: 'meta.statement.prolog' } ] } ], + '#string': + [ { token: 'punctuation.definition.string.begin.prolog', + regex: '\'', + push: + [ { token: 'punctuation.definition.string.end.prolog', + regex: '\'', + next: 'pop' }, + { token: 'constant.character.escape.prolog', regex: '\\\\.' }, + { token: 'constant.character.escape.quote.prolog', + regex: '\'\'' }, + { defaultToken: 'string.quoted.single.prolog' } ] } ], + '#variable': + [ { token: 'variable.language.anonymous.prolog', + regex: '\\b_\\b' }, + { token: 'variable.other.prolog', + regex: '\\b[A-Z_][a-zA-Z0-9_]*\\b' } ] } + + this.normalizeRules(); +}; + +PrologHighlightRules.metaData = { fileTypes: [ 'plg', 'prolog' ], + foldingStartMarker: '(%\\s*region \\w*)|([a-z]\\w*.*:- ?)', + foldingStopMarker: '(%\\s*end(\\s*region)?)|(?=\\.)', + keyEquivalent: '^~P', + name: 'Prolog', + scopeName: 'source.prolog' } + + +oop.inherits(PrologHighlightRules, TextHighlightRules); + +exports.PrologHighlightRules = PrologHighlightRules; +}); + +ace.define('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var line = session.getLine(row); + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i + match[0].length, 1); + } + + if (foldStyle !== "markbeginend") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + +}).call(FoldMode.prototype); + +}); diff --git a/0.0.3_0/ace/mode-properties.js b/0.0.3_0/ace/mode-properties.js new file mode 100644 index 0000000..143f417 --- /dev/null +++ b/0.0.3_0/ace/mode-properties.js @@ -0,0 +1,101 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2010, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/mode/properties', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/properties_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var PropertiesHighlightRules = require("./properties_highlight_rules").PropertiesHighlightRules; + +var Mode = function() { + var highlighter = new PropertiesHighlightRules(); + this.$tokenizer = new Tokenizer(highlighter.getRules()); +}; +oop.inherits(Mode, TextMode); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/properties_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var PropertiesHighlightRules = function() { + + var escapeRe = /\\u[0-9a-fA-F]{4}|\\/; + + this.$rules = { + "start" : [ + { + token : "comment", + regex : /[!#].*$/ + }, { + token : "keyword", + regex : /[=:]$/ + }, { + token : "keyword", + regex : /[=:]/, + next : "value" + }, { + token : "constant.language.escape", + regex : escapeRe, + }, { + defaultToken: "variable" + } + ], + "value" : [ + { + regex : /\\$/, + token : "string", + next : "value" + }, { + regex : /$/, + token : "string", + next : "start" + }, { + token : "constant.language.escape", + regex : escapeRe + }, { + defaultToken: "string" + } + ] + }; + +}; + +oop.inherits(PropertiesHighlightRules, TextHighlightRules); + +exports.PropertiesHighlightRules = PropertiesHighlightRules; +}); + diff --git a/0.0.3_0/ace/mode-python.js b/0.0.3_0/ace/mode-python.js new file mode 100644 index 0000000..2e58b25 --- /dev/null +++ b/0.0.3_0/ace/mode-python.js @@ -0,0 +1,294 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2010, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/mode/python', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/python_highlight_rules', 'ace/mode/folding/pythonic', 'ace/range'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var PythonHighlightRules = require("./python_highlight_rules").PythonHighlightRules; +var PythonFoldMode = require("./folding/pythonic").FoldMode; +var Range = require("../range").Range; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new PythonHighlightRules().getRules()); + this.foldingRules = new PythonFoldMode("\\:"); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "#"; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.$tokenizer.getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start") { + var match = line.match(/^.*[\{\(\[\:]\s*$/); + if (match) { + indent += tab; + } + } + + return indent; + }; + + var outdents = { + "pass": 1, + "return": 1, + "raise": 1, + "break": 1, + "continue": 1 + }; + + this.checkOutdent = function(state, line, input) { + if (input !== "\r\n" && input !== "\r" && input !== "\n") + return false; + + var tokens = this.$tokenizer.getLineTokens(line.trim(), state).tokens; + + if (!tokens) + return false; + do { + var last = tokens.pop(); + } while (last && (last.type == "comment" || (last.type == "text" && last.value.match(/^\s+$/)))); + + if (!last) + return false; + + return (last.type == "keyword" && outdents[last.value]); + }; + + this.autoOutdent = function(state, doc, row) { + + row += 1; + var indent = this.$getIndent(doc.getLine(row)); + var tab = doc.getTabString(); + if (indent.slice(-tab.length) == tab) + doc.remove(new Range(row, indent.length-tab.length, row, indent.length)); + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/python_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var PythonHighlightRules = function() { + + var keywords = ( + "and|as|assert|break|class|continue|def|del|elif|else|except|exec|" + + "finally|for|from|global|if|import|in|is|lambda|not|or|pass|print|" + + "raise|return|try|while|with|yield" + ); + + var builtinConstants = ( + "True|False|None|NotImplemented|Ellipsis|__debug__" + ); + + var builtinFunctions = ( + "abs|divmod|input|open|staticmethod|all|enumerate|int|ord|str|any|" + + "eval|isinstance|pow|sum|basestring|execfile|issubclass|print|super|" + + "binfile|iter|property|tuple|bool|filter|len|range|type|bytearray|" + + "float|list|raw_input|unichr|callable|format|locals|reduce|unicode|" + + "chr|frozenset|long|reload|vars|classmethod|getattr|map|repr|xrange|" + + "cmp|globals|max|reversed|zip|compile|hasattr|memoryview|round|" + + "__import__|complex|hash|min|set|apply|delattr|help|next|setattr|" + + "buffer|dict|hex|object|slice|coerce|dir|id|oct|sorted|intern" + ); + var keywordMapper = this.createKeywordMapper({ + "invalid.deprecated": "debugger", + "support.function": builtinFunctions, + "constant.language": builtinConstants, + "keyword": keywords + }, "identifier"); + + var strPre = "(?:r|u|ur|R|U|UR|Ur|uR)?"; + + var decimalInteger = "(?:(?:[1-9]\\d*)|(?:0))"; + var octInteger = "(?:0[oO]?[0-7]+)"; + var hexInteger = "(?:0[xX][\\dA-Fa-f]+)"; + var binInteger = "(?:0[bB][01]+)"; + var integer = "(?:" + decimalInteger + "|" + octInteger + "|" + hexInteger + "|" + binInteger + ")"; + + var exponent = "(?:[eE][+-]?\\d+)"; + var fraction = "(?:\\.\\d+)"; + var intPart = "(?:\\d+)"; + var pointFloat = "(?:(?:" + intPart + "?" + fraction + ")|(?:" + intPart + "\\.))"; + var exponentFloat = "(?:(?:" + pointFloat + "|" + intPart + ")" + exponent + ")"; + var floatNumber = "(?:" + exponentFloat + "|" + pointFloat + ")"; + + var stringEscape = "\\\\(x[0-9A-Fa-f]{2}|[0-7]{3}|[\\\\abfnrtv'\"]|U[0-9A-Fa-f]{8}|u[0-9A-Fa-f]{4})"; + + this.$rules = { + "start" : [ { + token : "comment", + regex : "#.*$" + }, { + token : "string", // multi line """ string start + regex : strPre + '"{3}', + next : "qqstring3" + }, { + token : "string", // " string + regex : strPre + '"(?=.)', + next : "qqstring" + }, { + token : "string", // multi line ''' string start + regex : strPre + "'{3}", + next : "qstring3" + }, { + token : "string", // ' string + regex : strPre + "'(?=.)", + next : "qstring" + }, { + token : "constant.numeric", // imaginary + regex : "(?:" + floatNumber + "|\\d+)[jJ]\\b" + }, { + token : "constant.numeric", // float + regex : floatNumber + }, { + token : "constant.numeric", // long integer + regex : integer + "[lL]\\b" + }, { + token : "constant.numeric", // integer + regex : integer + "\\b" + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "keyword.operator", + regex : "\\+|\\-|\\*|\\*\\*|\\/|\\/\\/|%|<<|>>|&|\\||\\^|~|<|>|<=|=>|==|!=|<>|=" + }, { + token : "paren.lparen", + regex : "[\\[\\(\\{]" + }, { + token : "paren.rparen", + regex : "[\\]\\)\\}]" + }, { + token : "text", + regex : "\\s+" + } ], + "qqstring3" : [ { + token : "constant.language.escape", + regex : stringEscape + }, { + token : "string", // multi line """ string end + regex : '"{3}', + next : "start" + }, { + defaultToken : "string" + } ], + "qstring3" : [ { + token : "constant.language.escape", + regex : stringEscape + }, { + token : "string", // multi line ''' string end + regex : "'{3}", + next : "start" + }, { + defaultToken : "string" + } ], + "qqstring" : [{ + token : "constant.language.escape", + regex : stringEscape + }, { + token : "string", + regex : "\\\\$", + next : "qqstring" + }, { + token : "string", + regex : '"|$', + next : "start" + }, { + defaultToken: "string" + }], + "qstring" : [{ + token : "constant.language.escape", + regex : stringEscape + }, { + token : "string", + regex : "\\\\$", + next : "qstring" + }, { + token : "string", + regex : "'|$", + next : "start" + }, { + defaultToken: "string" + }] + }; +}; + +oop.inherits(PythonHighlightRules, TextHighlightRules); + +exports.PythonHighlightRules = PythonHighlightRules; +}); + +ace.define('ace/mode/folding/pythonic', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/folding/fold_mode'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(markers) { + this.foldingStartMarker = new RegExp("([\\[{])(?:\\s*)$|(" + markers + ")(?:\\s*)(?:#.*)?$"); +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var line = session.getLine(row); + var match = line.match(this.foldingStartMarker); + if (match) { + if (match[1]) + return this.openingBracketBlock(session, match[1], row, match.index); + if (match[2]) + return this.indentationBlock(session, row, match.index + match[2].length); + return this.indentationBlock(session, row); + } + } + +}).call(FoldMode.prototype); + +}); diff --git a/0.0.3_0/ace/mode-r.js b/0.0.3_0/ace/mode-r.js new file mode 100644 index 0000000..f39de3f --- /dev/null +++ b/0.0.3_0/ace/mode-r.js @@ -0,0 +1,316 @@ +/* + * r.js + * + * Copyright (C) 2009-11 by RStudio, Inc. + * + * The Initial Developer of the Original Code is + * Ajax.org B.V. + * Portions created by the Initial Developer are Copyright (C) 2010 + * the Initial Developer. All Rights Reserved. + * + * This program is licensed to you under the terms of version 3 of the + * GNU Affero General Public License. This program is distributed WITHOUT + * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT, + * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the + * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details. + * + */ +ace.define('ace/mode/r', ['require', 'exports', 'module' , 'ace/range', 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/text_highlight_rules', 'ace/mode/r_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/unicode'], function(require, exports, module) { + + + var Range = require("../range").Range; + var oop = require("../lib/oop"); + var TextMode = require("./text").Mode; + var Tokenizer = require("../tokenizer").Tokenizer; + var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + var RHighlightRules = require("./r_highlight_rules").RHighlightRules; + var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; + var unicode = require("../unicode"); + + var Mode = function() + { + this.$tokenizer = new Tokenizer(new RHighlightRules().getRules()); + this.$outdent = new MatchingBraceOutdent(); + }; + oop.inherits(Mode, TextMode); + + (function() + { + this.lineCommentStart = "#"; + }).call(Mode.prototype); + exports.Mode = Mode; +}); +ace.define('ace/mode/r_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/text_highlight_rules', 'ace/mode/tex_highlight_rules'], function(require, exports, module) { + + var oop = require("../lib/oop"); + var lang = require("../lib/lang"); + var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + var TexHighlightRules = require("./tex_highlight_rules").TexHighlightRules; + + var RHighlightRules = function() + { + + var keywords = lang.arrayToMap( + ("function|if|in|break|next|repeat|else|for|return|switch|while|try|tryCatch|stop|warning|require|library|attach|detach|source|setMethod|setGeneric|setGroupGeneric|setClass") + .split("|") + ); + + var buildinConstants = lang.arrayToMap( + ("NULL|NA|TRUE|FALSE|T|F|Inf|NaN|NA_integer_|NA_real_|NA_character_|" + + "NA_complex_").split("|") + ); + + this.$rules = { + "start" : [ + { + token : "comment.sectionhead", + regex : "#+(?!').*(?:----|====|####)\\s*$" + }, + { + token : "comment", + regex : "#+'", + next : "rd-start" + }, + { + token : "comment", + regex : "#.*$" + }, + { + token : "string", // multi line string start + regex : '["]', + next : "qqstring" + }, + { + token : "string", // multi line string start + regex : "[']", + next : "qstring" + }, + { + token : "constant.numeric", // hex + regex : "0[xX][0-9a-fA-F]+[Li]?\\b" + }, + { + token : "constant.numeric", // explicit integer + regex : "\\d+L\\b" + }, + { + token : "constant.numeric", // number + regex : "\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d*)?i?\\b" + }, + { + token : "constant.numeric", // number with leading decimal + regex : "\\.\\d+(?:[eE][+\\-]?\\d*)?i?\\b" + }, + { + token : "constant.language.boolean", + regex : "(?:TRUE|FALSE|T|F)\\b" + }, + { + token : "identifier", + regex : "`.*?`" + }, + { + onMatch : function(value) { + if (keywords[value]) + return "keyword"; + else if (buildinConstants[value]) + return "constant.language"; + else if (value == '...' || value.match(/^\.\.\d+$/)) + return "variable.language"; + else + return "identifier"; + }, + regex : "[a-zA-Z.][a-zA-Z0-9._]*\\b" + }, + { + token : "keyword.operator", + regex : "%%|>=|<=|==|!=|\\->|<\\-|\\|\\||&&|=|\\+|\\-|\\*|/|\\^|>|<|!|&|\\||~|\\$|:" + }, + { + token : "keyword.operator", // infix operators + regex : "%.*?%" + }, + { + token : "paren.keyword.operator", + regex : "[[({]" + }, + { + token : "paren.keyword.operator", + regex : "[\\])}]" + }, + { + token : "text", + regex : "\\s+" + } + ], + "qqstring" : [ + { + token : "string", + regex : '(?:(?:\\\\.)|(?:[^"\\\\]))*?"', + next : "start" + }, + { + token : "string", + regex : '.+' + } + ], + "qstring" : [ + { + token : "string", + regex : "(?:(?:\\\\.)|(?:[^'\\\\]))*?'", + next : "start" + }, + { + token : "string", + regex : '.+' + } + ] + }; + + var rdRules = new TexHighlightRules("comment").getRules(); + for (var i = 0; i < rdRules["start"].length; i++) { + rdRules["start"][i].token += ".virtual-comment"; + } + + this.addRules(rdRules, "rd-"); + this.$rules["rd-start"].unshift({ + token: "text", + regex: "^", + next: "start" + }); + this.$rules["rd-start"].unshift({ + token : "keyword", + regex : "@(?!@)[^ ]*" + }); + this.$rules["rd-start"].unshift({ + token : "comment", + regex : "@@" + }); + this.$rules["rd-start"].push({ + token : "comment", + regex : "[^%\\\\[({\\])}]+" + }); + }; + + oop.inherits(RHighlightRules, TextHighlightRules); + + exports.RHighlightRules = RHighlightRules; +}); +ace.define('ace/mode/tex_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var TexHighlightRules = function(textClass) { + + if (!textClass) + textClass = "text"; + + this.$rules = { + "start" : [ + { + token : "comment", + regex : "%.*$" + }, { + token : textClass, // non-command + regex : "\\\\[$&%#\\{\\}]" + }, { + token : "keyword", // command + regex : "\\\\(?:documentclass|usepackage|newcounter|setcounter|addtocounter|value|arabic|stepcounter|newenvironment|renewenvironment|ref|vref|eqref|pageref|label|cite[a-zA-Z]*|tag|begin|end|bibitem)\\b", + next : "nospell" + }, { + token : "keyword", // command + regex : "\\\\(?:[a-zA-z0-9]+|[^a-zA-z0-9])" + }, { + token : "paren.keyword.operator", + regex : "[[({]" + }, { + token : "paren.keyword.operator", + regex : "[\\])}]" + }, { + token : textClass, + regex : "\\s+" + } + ], + "nospell" : [ + { + token : "comment", + regex : "%.*$", + next : "start" + }, { + token : "nospell." + textClass, // non-command + regex : "\\\\[$&%#\\{\\}]" + }, { + token : "keyword", // command + regex : "\\\\(?:documentclass|usepackage|newcounter|setcounter|addtocounter|value|arabic|stepcounter|newenvironment|renewenvironment|ref|vref|eqref|pageref|label|cite[a-zA-Z]*|tag|begin|end|bibitem)\\b" + }, { + token : "keyword", // command + regex : "\\\\(?:[a-zA-z0-9]+|[^a-zA-z0-9])", + next : "start" + }, { + token : "paren.keyword.operator", + regex : "[[({]" + }, { + token : "paren.keyword.operator", + regex : "[\\])]" + }, { + token : "paren.keyword.operator", + regex : "}", + next : "start" + }, { + token : "nospell." + textClass, + regex : "\\s+" + }, { + token : "nospell." + textClass, + regex : "\\w+" + } + ] + }; +}; + +oop.inherits(TexHighlightRules, TextHighlightRules); + +exports.TexHighlightRules = TexHighlightRules; +}); + +ace.define('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) { + + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); diff --git a/0.0.3_0/ace/mode-rdoc.js b/0.0.3_0/ace/mode-rdoc.js new file mode 100644 index 0000000..f1bd9e9 --- /dev/null +++ b/0.0.3_0/ace/mode-rdoc.js @@ -0,0 +1,184 @@ +/* + * rdoc.js + * + * Copyright (C) 2009-11 by RStudio, Inc. + * + * This program is licensed to you under the terms of version 3 of the + * GNU Affero General Public License. This program is distributed WITHOUT + * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT, + * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the + * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details. + * + */ +ace.define('ace/mode/rdoc', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/text_highlight_rules', 'ace/mode/rdoc_highlight_rules', 'ace/mode/matching_brace_outdent'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var RDocHighlightRules = require("./rdoc_highlight_rules").RDocHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; + +var Mode = function(suppressHighlighting) { + this.$tokenizer = new Tokenizer(new RDocHighlightRules().getRules()); + this.$outdent = new MatchingBraceOutdent(); +}; +oop.inherits(Mode, TextMode); + +(function() { + this.getNextLineIndent = function(state, line, tab) { + return this.$getIndent(line); + }; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); +ace.define('ace/mode/rdoc_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/text_highlight_rules', 'ace/mode/latex_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var LaTeXHighlightRules = require("./latex_highlight_rules"); + +var RDocHighlightRules = function() { + + this.$rules = { + "start" : [ + { + token : "comment", + regex : "%.*$" + }, { + token : "text", // non-command + regex : "\\\\[$&%#\\{\\}]" + }, { + token : "keyword", // command + regex : "\\\\(?:name|alias|method|S3method|S4method|item|code|preformatted|kbd|pkg|var|env|option|command|author|email|url|source|cite|acronym|href|code|preformatted|link|eqn|deqn|keyword|usage|examples|dontrun|dontshow|figure|if|ifelse|Sexpr|RdOpts|inputencoding|usepackage)\\b", + next : "nospell" + }, { + token : "keyword", // command + regex : "\\\\(?:[a-zA-z0-9]+|[^a-zA-z0-9])" + }, { + token : "paren.keyword.operator", + regex : "[[({]" + }, { + token : "paren.keyword.operator", + regex : "[\\])}]" + }, { + token : "text", + regex : "\\s+" + } + ], + "nospell" : [ + { + token : "comment", + regex : "%.*$", + next : "start" + }, { + token : "nospell.text", // non-command + regex : "\\\\[$&%#\\{\\}]" + }, { + token : "keyword", // command + regex : "\\\\(?:name|alias|method|S3method|S4method|item|code|preformatted|kbd|pkg|var|env|option|command|author|email|url|source|cite|acronym|href|code|preformatted|link|eqn|deqn|keyword|usage|examples|dontrun|dontshow|figure|if|ifelse|Sexpr|RdOpts|inputencoding|usepackage)\\b" + }, { + token : "keyword", // command + regex : "\\\\(?:[a-zA-z0-9]+|[^a-zA-z0-9])", + next : "start" + }, { + token : "paren.keyword.operator", + regex : "[[({]" + }, { + token : "paren.keyword.operator", + regex : "[\\])]" + }, { + token : "paren.keyword.operator", + regex : "}", + next : "start" + }, { + token : "nospell.text", + regex : "\\s+" + }, { + token : "nospell.text", + regex : "\\w+" + } + ] + }; +}; + +oop.inherits(RDocHighlightRules, TextHighlightRules); + +exports.RDocHighlightRules = RDocHighlightRules; +}); +ace.define('ace/mode/latex_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var LatexHighlightRules = function() { + this.$rules = { + "start" : [{ + token : "keyword", + regex : "\\\\(?:[^a-zA-Z]|[a-zA-Z]+)" + }, { + token : "lparen", + regex : "[[({]" + }, { + token : "rparen", + regex : "[\\])}]" + }, { + token : "string", + regex : "\\$(?:(?:\\\\.)|(?:[^\\$\\\\]))*?\\$" + }, { + token : "comment", + regex : "%.*$" + }] + }; +}; + +oop.inherits(LatexHighlightRules, TextHighlightRules); + +exports.LatexHighlightRules = LatexHighlightRules; + +}); + +ace.define('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) { + + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); diff --git a/0.0.3_0/ace/mode-rhtml.js b/0.0.3_0/ace/mode-rhtml.js new file mode 100644 index 0000000..5523746 --- /dev/null +++ b/0.0.3_0/ace/mode-rhtml.js @@ -0,0 +1,2165 @@ +/* + * rhtml.js + * + * Copyright (C) 2009-11 by RStudio, Inc. + * + * The Initial Developer of the Original Code is + * Ajax.org B.V. + * Portions created by the Initial Developer are Copyright (C) 2010 + * the Initial Developer. All Rights Reserved. + * + * This program is licensed to you under the terms of version 3 of the + * GNU Affero General Public License. This program is distributed WITHOUT + * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT, + * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the + * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details. + * + */ + +ace.define('ace/mode/rhtml', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/html', 'ace/tokenizer', 'ace/mode/rhtml_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var HtmlMode = require("./html").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; + +var RHtmlHighlightRules = require("./rhtml_highlight_rules").RHtmlHighlightRules; + +var Mode = function(doc, session) { + this.$session = session; + this.$tokenizer = new Tokenizer(new RHtmlHighlightRules().getRules()); +}; +oop.inherits(Mode, HtmlMode); + +(function() { + this.insertChunkInfo = { + value: "\n", + position: {row: 0, column: 15} + }; + + this.getLanguageMode = function(position) + { + return this.$session.getState(position.row).match(/^r-/) ? 'R' : 'HTML'; + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/html', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/mode/javascript', 'ace/mode/css', 'ace/tokenizer', 'ace/mode/html_highlight_rules', 'ace/mode/behaviour/html', 'ace/mode/folding/html'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var JavaScriptMode = require("./javascript").Mode; +var CssMode = require("./css").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules; +var HtmlBehaviour = require("./behaviour/html").HtmlBehaviour; +var HtmlFoldMode = require("./folding/html").FoldMode; + +var Mode = function() { + var highlighter = new HtmlHighlightRules(); + this.$tokenizer = new Tokenizer(highlighter.getRules()); + this.$behaviour = new HtmlBehaviour(); + + this.$embeds = highlighter.getEmbeds(); + this.createModeDelegates({ + "js-": JavaScriptMode, + "css-": CssMode + }); + + this.foldingRules = new HtmlFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.blockComment = {start: ""}; + + this.getNextLineIndent = function(state, line, tab) { + return this.$getIndent(line); + }; + + this.checkOutdent = function(state, line, input) { + return false; + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/javascript', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/javascript_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/range', 'ace/worker/worker_client', 'ace/mode/behaviour/cstyle', 'ace/mode/folding/cstyle'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var Range = require("../range").Range; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new JavaScriptHighlightRules().getRules()); + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.$tokenizer.getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start" || state == "no_regex") { + var match = line.match(/^.*(?:\bcase\b.*\:|[\{\(\[])\s*$/); + if (match) { + indent += tab; + } + } else if (state == "doc-start") { + if (endState == "start" || endState == "no_regex") { + return ""; + } + var match = line.match(/^\s*(\/?)\*/); + if (match) { + if (match[1]) { + indent += " "; + } + indent += "* "; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/javascript_worker", "JavaScriptWorker"); + worker.attachToDocument(session.getDocument()); + + worker.on("jslint", function(results) { + session.setAnnotations(results.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +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(require, exports, module) { + + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var JavaScriptHighlightRules = function() { + var keywordMapper = this.createKeywordMapper({ + "variable.language": + "Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|" + // Constructors + "Namespace|QName|XML|XMLList|" + // E4X + "ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|" + + "Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|" + + "Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|" + // Errors + "SyntaxError|TypeError|URIError|" + + "decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|" + // Non-constructor functions + "isNaN|parseFloat|parseInt|" + + "JSON|Math|" + // Other + "this|arguments|prototype|window|document" , // Pseudo + "keyword": + "const|yield|import|get|set|" + + "break|case|catch|continue|default|delete|do|else|finally|for|function|" + + "if|in|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"); + var kwBeforeRe = "case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void"; + var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*\\b"; + + var escapedRe = "\\\\(?:x[0-9a-fA-F]{2}|" + // hex + "u[0-9a-fA-F]{4}|" + // unicode + "[0-2][0-7]{0,2}|" + // oct + "3[0-6][0-7]?|" + // oct + "37[0-7]?|" + // oct + "[4-7][0-7]?|" + //oct + ".)"; + + this.$rules = { + "no_regex" : [ + { + token : "comment", + regex : /\/\/.*$/ + }, + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : /\/\*/, + next : "comment" + }, { + token : "string", + regex : "'(?=.)", + next : "qstring" + }, { + token : "string", + regex : '"(?=.)', + next : "qqstring" + }, { + token : "constant.numeric", // hex + regex : /0[xX][0-9a-fA-F]+\b/ + }, { + token : "constant.numeric", // float + regex : /[+-]?\d+(?:(?:\.\d*)?(?:[eE][+-]?\d+)?)?\b/ + }, { + token : [ + "storage.type", "punctuation.operator", "support.function", + "punctuation.operator", "entity.name.function", "text","keyword.operator" + ], + regex : "(" + identifierRe + ")(\\.)(prototype)(\\.)(" + identifierRe +")(\\s*)(=)", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "keyword.operator", "text", "storage.type", + "text", "paren.lparen" + ], + regex : "(" + identifierRe +")(\\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 : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(function)(\\s+)(" + identifierRe + ")(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "punctuation.operator", + "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\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 : "(?:" + kwBeforeRe + ")\\b", + next : "start" + }, { + token : ["punctuation.operator", "support.function"], + regex : /(\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:opzzzz|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 : ["punctuation.operator", "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)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/ + }, { + token : ["punctuation.operator", "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 : ["storage.type", "punctuation.operator", "support.function.firebug"], + regex : /(console)(\.)(warn|info|log|error|time|timeEnd|assert)\b/ + }, { + token : keywordMapper, + regex : identifierRe + }, { + token : "keyword.operator", + regex : /--|\+\+|[!$%&*+\-~]|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\|\||\?\:|\*=|%=|\+=|\-=|&=|\^=/, + next : "start" + }, { + token : "punctuation.operator", + regex : /\?|\:|\,|\;|\./, + next : "start" + }, { + token : "paren.lparen", + regex : /[\[({]/, + next : "start" + }, { + token : "paren.rparen", + regex : /[\])}]/ + }, { + token : "keyword.operator", + regex : /\/=?/, + next : "start" + }, { + token: "comment", + regex: /^#!.*$/ + } + ], + "start": [ + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment_regex_allowed" + }, { + token : "comment", + regex : "\\/\\/.*$", + next : "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: "/\\w*", + 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.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: identifierRe + }, { + token: "punctuation.operator", + regex: "[, ]+" + }, { + token: "punctuation.operator", + regex: "$" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "comment_regex_allowed" : [ + {token : "comment", regex : "\\*\\/", next : "start"}, + {defaultToken : "comment"} + ], + "comment" : [ + {token : "comment", regex : "\\*\\/", next : "no_regex"}, + {defaultToken : "comment"} + ], + "qqstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + next : "qqstring" + }, { + token : "string", + regex : '"|$', + next : "no_regex" + }, { + defaultToken: "string" + } + ], + "qstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + next : "qstring" + }, { + token : "string", + regex : "'|$", + next : "no_regex" + }, { + defaultToken: "string" + } + ] + }; + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("no_regex") ]); +}; + +oop.inherits(JavaScriptHighlightRules, TextHighlightRules); + +exports.JavaScriptHighlightRules = JavaScriptHighlightRules; +}); + +ace.define('ace/mode/doc_comment_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, { + token : "comment.doc.tag", + regex : "\\bTODO\\b" + }, { + defaultToken : "comment.doc" + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) { + + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define('ace/mode/behaviour/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/token_iterator', 'ace/lib/lang'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; +var lang = require("../../lib/lang"); + +var SAFE_INSERT_IN_TOKENS = + ["text", "paren.rparen", "punctuation.operator"]; +var SAFE_INSERT_BEFORE_TOKENS = + ["text", "paren.rparen", "punctuation.operator", "comment"]; + + +var autoInsertedBrackets = 0; +var autoInsertedRow = -1; +var autoInsertedLineEnd = ""; +var maybeInsertedBrackets = 0; +var maybeInsertedRow = -1; +var maybeInsertedLineStart = ""; +var maybeInsertedLineEnd = ""; + +var CstyleBehaviour = function () { + + CstyleBehaviour.isSaneInsertion = function(editor, session) { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + if (!this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) { + var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1); + if (!this.$matchTokenType(iterator2.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) + return false; + } + iterator.stepForward(); + return iterator.getCurrentTokenRow() !== cursor.row || + this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_BEFORE_TOKENS); + }; + + CstyleBehaviour.$matchTokenType = function(token, types) { + return types.indexOf(token.type || token) > -1; + }; + + CstyleBehaviour.recordAutoInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isAutoInsertedClosing(cursor, line, autoInsertedLineEnd[0])) + autoInsertedBrackets = 0; + autoInsertedRow = cursor.row; + autoInsertedLineEnd = bracket + line.substr(cursor.column); + autoInsertedBrackets++; + }; + + CstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isMaybeInsertedClosing(cursor, line)) + maybeInsertedBrackets = 0; + maybeInsertedRow = cursor.row; + maybeInsertedLineStart = line.substr(0, cursor.column) + bracket; + maybeInsertedLineEnd = line.substr(cursor.column); + maybeInsertedBrackets++; + }; + + CstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) { + return autoInsertedBrackets > 0 && + cursor.row === autoInsertedRow && + bracket === autoInsertedLineEnd[0] && + line.substr(cursor.column) === autoInsertedLineEnd; + }; + + CstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) { + return maybeInsertedBrackets > 0 && + cursor.row === maybeInsertedRow && + line.substr(cursor.column) === maybeInsertedLineEnd && + line.substr(0, cursor.column) == maybeInsertedLineStart; + }; + + CstyleBehaviour.popAutoInsertedClosing = function() { + autoInsertedLineEnd = autoInsertedLineEnd.substr(1); + autoInsertedBrackets--; + }; + + CstyleBehaviour.clearMaybeInsertedClosing = function() { + maybeInsertedBrackets = 0; + maybeInsertedRow = -1; + }; + + this.add("braces", "insertion", function (state, action, editor, session, text) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (text == '{') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "{" && editor.getWrapBehavioursEnabled()) { + return { + text: '{' + selected + '}', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + if (/[\]\}\)]/.test(line[cursor.column])) { + CstyleBehaviour.recordAutoInsert(editor, session, "}"); + return { + text: '{}', + selection: [1, 1] + }; + } else { + CstyleBehaviour.recordMaybeInsert(editor, session, "{"); + return { + text: '{', + selection: [1, 1] + }; + } + } + } else if (text == '}') { + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}') { + var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } else if (text == "\n" || text == "\r\n") { + var closing = ""; + if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) { + closing = lang.stringRepeat("}", maybeInsertedBrackets); + CstyleBehaviour.clearMaybeInsertedClosing(); + } + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}' || closing !== "") { + var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column}, '}'); + if (!openBracePos) + return null; + + var indent = this.getNextLineIndent(state, line.substring(0, cursor.column), session.getTabString()); + var next_indent = this.$getIndent(line); + + return { + text: '\n' + indent + '\n' + next_indent + closing, + selection: [1, indent.length, 1, indent.length] + }; + } + } + }); + + this.add("braces", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '{') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar == '}') { + range.end.column++; + return range; + } else { + maybeInsertedBrackets--; + } + } + }); + + this.add("parens", "insertion", function (state, action, editor, session, text) { + if (text == '(') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return { + text: '(' + selected + ')', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, ")"); + return { + text: '()', + selection: [1, 1] + }; + } + } else if (text == ')') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ')') { + var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("parens", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '(') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ')') { + range.end.column++; + return range; + } + } + }); + + this.add("brackets", "insertion", function (state, action, editor, session, text) { + if (text == '[') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return { + text: '[' + selected + ']', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, "]"); + return { + text: '[]', + selection: [1, 1] + }; + } + } else if (text == ']') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ']') { + var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("brackets", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '[') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ']') { + range.end.column++; + return range; + } + } + }); + + this.add("string_dquotes", "insertion", function (state, action, editor, session, text) { + if (text == '"' || text == "'") { + var quote = text; + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "'" && selected != '"' && editor.getWrapBehavioursEnabled()) { + return { + text: quote + selected + quote, + selection: false + }; + } else { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var leftChar = line.substring(cursor.column-1, cursor.column); + if (leftChar == '\\') { + return null; + } + var tokens = session.getTokens(selection.start.row); + var col = 0, token; + var quotepos = -1; // Track whether we're inside an open quote. + + for (var x = 0; x < tokens.length; x++) { + token = tokens[x]; + if (token.type == "string") { + quotepos = -1; + } else if (quotepos < 0) { + quotepos = token.value.indexOf(quote); + } + if ((token.value.length + col) > selection.start.column) { + break; + } + col += tokens[x].value.length; + } + if (!token || (quotepos < 0 && token.type !== "comment" && (token.type !== "string" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) { + if (!CstyleBehaviour.isSaneInsertion(editor, session)) + return; + return { + text: quote + quote, + selection: [1,1] + }; + } else if (token && token.type === "string") { + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == quote) { + return { + text: '', + selection: [1, 1] + }; + } + } + } + } + }); + + this.add("string_dquotes", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && (selected == '"' || selected == "'")) { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == selected) { + range.end.column++; + return range; + } + } + }); + +}; + +oop.inherits(CstyleBehaviour, Behaviour); + +exports.CstyleBehaviour = CstyleBehaviour; +}); + +ace.define('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var line = session.getLine(row); + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i + match[0].length, 1); + } + + if (foldStyle !== "markbeginend") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define('ace/mode/css', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/css_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/worker/worker_client', 'ace/mode/behaviour/css', 'ace/mode/folding/cstyle'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CssBehaviour = require("./behaviour/css").CssBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new CssHighlightRules().getRules()); + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CssBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.foldingRules = "cStyle"; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + var tokens = this.$tokenizer.getLineTokens(line, state).tokens; + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + var match = line.match(/^.*\{\s*$/); + if (match) { + indent += tab; + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/css_worker", "Worker"); + worker.attachToDocument(session.getDocument()); + + worker.on("csslint", function(e) { + session.setAnnotations(e.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; + +}); + +ace.define('ace/mode/css_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var supportType = exports.supportType = "animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|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|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|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|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index"; +var supportFunction = exports.supportFunction = "rgb|rgba|url|attr|counter|counters"; +var supportConstant = exports.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"; +var supportConstantColor = exports.supportConstantColor = "aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow"; +var supportConstantFonts = exports.supportConstantFonts = "arial|century|comic|courier|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace"; + +var numRe = exports.numRe = "\\-?(?:(?:[0-9]+)|(?:[0-9]*\\.[0-9]+))"; +var pseudoElements = exports.pseudoElements = "(\\:+)\\b(after|before|first-letter|first-line|moz-selection|selection)\\b"; +var pseudoClasses = exports.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"; + +var CssHighlightRules = function() { + + var keywordMapper = this.createKeywordMapper({ + "support.function": supportFunction, + "support.constant": supportConstant, + "support.type": supportType, + "support.constant.color": supportConstantColor, + "support.constant.fonts": supportConstantFonts + }, "text", true); + + var base_ruleset = [ + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "ruleset_comment" + }, { + token : "string", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' + }, { + token : "string", // single line + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" + }, { + token : ["constant.numeric", "keyword"], + regex : "(" + numRe + ")(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 : numRe + }, { + token : "constant.numeric", // hex6 color + regex : "#[a-f0-9]{6}" + }, { + token : "constant.numeric", // hex3 color + regex : "#[a-f0-9]{3}" + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"], + regex : pseudoElements + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"], + regex : pseudoClasses + }, { + token : ["support.function", "string", "support.function"], + regex : "(url\\()(.*)(\\))" + }, { + token : keywordMapper, + regex : "\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*" + }, { + caseInsensitive: true + } + ]; + + var ruleset = lang.copyArray(base_ruleset); + ruleset.unshift({ + token : "paren.rparen", + regex : "\\}", + next: "start" + }); + + var media_ruleset = lang.copyArray( base_ruleset ); + media_ruleset.unshift({ + token : "paren.rparen", + regex : "\\}", + next: "media" + }); + + var base_comment = [{ + token : "comment", // comment spanning whole line + regex : ".+" + }]; + + var comment = lang.copyArray(base_comment); + comment.unshift({ + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "start" + }); + + var media_comment = lang.copyArray(base_comment); + media_comment.unshift({ + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "media" + }); + + var ruleset_comment = lang.copyArray(base_comment); + ruleset_comment.unshift({ + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "ruleset" + }); + + this.$rules = { + "start" : [{ + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment" + }, { + token: "paren.lparen", + regex: "\\{", + next: "ruleset" + }, { + token: "string", + regex: "@.*?{", + next: "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: true + }], + + "media" : [ { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "media_comment" + }, { + token: "paren.lparen", + regex: "\\{", + next: "media_ruleset" + },{ + token: "string", + regex: "\\}", + next: "start" + },{ + 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: true + }], + + "comment" : comment, + + "ruleset" : ruleset, + "ruleset_comment" : ruleset_comment, + + "media_ruleset" : media_ruleset, + "media_comment" : media_comment + }; +}; + +oop.inherits(CssHighlightRules, TextHighlightRules); + +exports.CssHighlightRules = CssHighlightRules; + +}); + +ace.define('ace/mode/behaviour/css', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/mode/behaviour/cstyle', 'ace/token_iterator'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var CstyleBehaviour = require("./cstyle").CstyleBehaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; + +var CssBehaviour = function () { + + this.inherit(CstyleBehaviour); + + this.add("colon", "insertion", function (state, action, editor, session, text) { + if (text === ':') { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + if (token && token.value.match(/\s+/)) { + token = iterator.stepBackward(); + } + if (token && token.type === 'support.type') { + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar === ':') { + return { + text: '', + selection: [1, 1] + } + } + if (!line.substring(cursor.column).match(/^\s*;/)) { + return { + text: ':;', + selection: [1, 1] + } + } + } + } + }); + + this.add("colon", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected === ':') { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + if (token && token.value.match(/\s+/)) { + token = iterator.stepBackward(); + } + if (token && token.type === 'support.type') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar === ';') { + range.end.column ++; + return range; + } + } + } + }); + + this.add("semicolon", "insertion", function (state, action, editor, session, text) { + if (text === ';') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar === ';') { + return { + text: '', + selection: [1, 1] + } + } + } + }); + +} +oop.inherits(CssBehaviour, CstyleBehaviour); + +exports.CssBehaviour = CssBehaviour; +}); + +ace.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_util', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var xmlUtil = require("./xml_util"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var tagMap = lang.createMap({ + a : 'anchor', + button : 'form', + form : 'form', + img : 'image', + input : 'form', + label : 'form', + script : 'script', + select : 'form', + textarea : 'form', + style : 'style', + table : 'table', + tbody : 'table', + td : 'table', + tfoot : 'table', + th : 'table', + tr : 'table' +}); + +var HtmlHighlightRules = function() { + this.$rules = { + start : [{ + token : "text", + regex : "<\\!\\[CDATA\\[", + next : "cdata" + }, { + token : "xml-pe", + regex : "<\\?.*?\\?>" + }, { + token : "comment", + regex : "<\\!--", + next : "comment" + }, { + token : "xml-pe", + regex : "<\\!.*?>" + }, { + token : "meta.tag", + regex : "<(?=script\\b)", + next : "script" + }, { + token : "meta.tag", + regex : "<(?=style\\b)", + next : "style" + }, { + token : "meta.tag", // opening tag + regex : "<\\/?(?=\\S)", + next : "tag" + }, { + token : "text", + regex : "\\s+" + }, { + token : "constant.character.entity", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }], + + cdata : [ { + token : "text", + regex : "\\]\\]>", + next : "start" + } ], + + comment : [ { + token : "comment", + regex : ".*?-->", + next : "start" + }, { + defaultToken : "comment" + } ] + }; + + xmlUtil.tag(this.$rules, "tag", "start", tagMap); + xmlUtil.tag(this.$rules, "style", "css-start", tagMap); + xmlUtil.tag(this.$rules, "script", "js-start", tagMap); + + this.embedRules(JavaScriptHighlightRules, "js-", [{ + token: "comment", + regex: "\\/\\/.*(?=<\\/script>)", + next: "tag" + }, { + token: "meta.tag", + regex: "<\\/(?=script)", + next: "tag" + }]); + + this.embedRules(CssHighlightRules, "css-", [{ + token: "meta.tag", + regex: "<\\/(?=style)", + next: "tag" + }]); +}; + +oop.inherits(HtmlHighlightRules, TextHighlightRules); + +exports.HtmlHighlightRules = HtmlHighlightRules; +}); + +ace.define('ace/mode/xml_util', ['require', 'exports', 'module' ], function(require, exports, module) { + + +function string(state) { + return [{ + token : "string", + regex : '"', + next : state + "_qqstring" + }, { + token : "string", + regex : "'", + next : state + "_qstring" + }]; +} + +function multiLineString(quote, state) { + return [ + {token : "string", regex : quote, next : state}, + { + token : "constant.language.escape", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }, + {defaultToken : "string"} + ]; +} + +exports.tag = function(states, name, nextState, tagMap) { + states[name] = [{ + token : "text", + regex : "\\s+" + }, { + + token : !tagMap ? "meta.tag.tag-name" : function(value) { + if (tagMap[value]) + return "meta.tag.tag-name." + tagMap[value]; + else + return "meta.tag.tag-name"; + }, + regex : "[-_a-zA-Z0-9:]+", + next : name + "_embed_attribute_list" + }, { + token: "empty", + regex: "", + next : name + "_embed_attribute_list" + }]; + + states[name + "_qstring"] = multiLineString("'", name + "_embed_attribute_list"); + states[name + "_qqstring"] = multiLineString("\"", name + "_embed_attribute_list"); + + states[name + "_embed_attribute_list"] = [{ + token : "meta.tag.r", + regex : "/?>", + next : nextState + }, { + token : "keyword.operator", + regex : "=" + }, { + token : "entity.other.attribute-name", + regex : "[-_a-zA-Z0-9:]+" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : "text", + regex : "\\s+" + }].concat(string(name)); +}; + +}); + +ace.define('ace/mode/behaviour/html', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour/xml', 'ace/mode/behaviour/cstyle', 'ace/token_iterator'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var XmlBehaviour = require("../behaviour/xml").XmlBehaviour; +var CstyleBehaviour = require("./cstyle").CstyleBehaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; +var voidElements = ['area', 'base', 'br', 'col', 'command', 'embed', 'hr', 'img', 'input', 'keygen', 'link', 'meta', 'param', 'source', 'track', 'wbr']; + +function hasType(token, type) { + var hasType = true; + var typeList = token.type.split('.'); + var needleList = type.split('.'); + needleList.forEach(function(needle){ + if (typeList.indexOf(needle) == -1) { + hasType = false; + return false; + } + }); + return hasType; +} + +var HtmlBehaviour = function () { + + this.inherit(XmlBehaviour); // Get xml behaviour + + this.add("autoclosing", "insertion", function (state, action, editor, session, text) { + if (text == '>') { + var position = editor.getCursorPosition(); + var iterator = new TokenIterator(session, position.row, position.column); + var token = iterator.getCurrentToken(); + + if (hasType(token, 'string') && iterator.getCurrentTokenColumn() + token.value.length > position.column) + return; + var atCursor = false; + if (!token || !hasType(token, 'meta.tag') && !(hasType(token, 'text') && token.value.match('/'))){ + do { + token = iterator.stepBackward(); + } while (token && (hasType(token, 'string') || hasType(token, 'keyword.operator') || hasType(token, 'entity.attribute-name') || hasType(token, 'text'))); + } else { + atCursor = true; + } + if (!token || !hasType(token, 'meta.tag-name') || iterator.stepBackward().value.match('/')) { + return + } + var element = token.value; + if (atCursor){ + var element = element.substring(0, position.column - token.start); + } + if (voidElements.indexOf(element) !== -1){ + return; + } + return { + text: '>' + '', + selection: [1, 1] + } + } + }); +} +oop.inherits(HtmlBehaviour, XmlBehaviour); + +exports.HtmlBehaviour = HtmlBehaviour; +}); + +ace.define('ace/mode/behaviour/xml', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/mode/behaviour/cstyle', 'ace/token_iterator'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var CstyleBehaviour = require("./cstyle").CstyleBehaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; + +function hasType(token, type) { + var hasType = true; + var typeList = token.type.split('.'); + var needleList = type.split('.'); + needleList.forEach(function(needle){ + if (typeList.indexOf(needle) == -1) { + hasType = false; + return false; + } + }); + return hasType; +} + +var XmlBehaviour = function () { + + this.inherit(CstyleBehaviour, ["string_dquotes"]); // Get string behaviour + + this.add("autoclosing", "insertion", function (state, action, editor, session, text) { + if (text == '>') { + var position = editor.getCursorPosition(); + var iterator = new TokenIterator(session, position.row, position.column); + var token = iterator.getCurrentToken(); + var atCursor = false; + if (!token || !hasType(token, 'meta.tag') && !(hasType(token, 'text') && token.value.match('/'))){ + do { + token = iterator.stepBackward(); + } while (token && (hasType(token, 'string') || hasType(token, 'keyword.operator') || hasType(token, 'entity.attribute-name') || hasType(token, 'text'))); + } else { + atCursor = true; + } + if (!token || !hasType(token, 'meta.tag-name') || iterator.stepBackward().value.match('/')) { + return + } + var tag = token.value; + if (atCursor){ + var tag = tag.substring(0, position.column - token.start); + } + + return { + text: '>' + '', + selection: [1, 1] + } + } + }); + + this.add('autoindent', 'insertion', function (state, action, editor, session, text) { + if (text == "\n") { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChars = line.substring(cursor.column, cursor.column + 2); + if (rightChars == '?)/; + this._parseTag = function(tag) { + + var match = tag.match(this.tagRe); + var column = 0; + + return { + value: tag, + match: match ? match[2] : "", + closing: match ? !!match[3] : false, + selfClosing: match ? !!match[5] || match[2] == "/>" : false, + tagName: match ? match[4] : "", + column: match[1] ? column + match[1].length : column + }; + }; + this._readTagForward = function(iterator) { + var token = iterator.getCurrentToken(); + if (!token) + return null; + + var value = ""; + var start; + + do { + if (token.type.indexOf("meta.tag") === 0) { + if (!start) { + var start = { + row: iterator.getCurrentTokenRow(), + column: iterator.getCurrentTokenColumn() + }; + } + value += token.value; + if (value.indexOf(">") !== -1) { + var tag = this._parseTag(value); + tag.start = start; + tag.end = { + row: iterator.getCurrentTokenRow(), + column: iterator.getCurrentTokenColumn() + token.value.length + }; + iterator.stepForward(); + return tag; + } + } + } while(token = iterator.stepForward()); + + return null; + }; + + this._readTagBackward = function(iterator) { + var token = iterator.getCurrentToken(); + if (!token) + return null; + + var value = ""; + var end; + + do { + if (token.type.indexOf("meta.tag") === 0) { + if (!end) { + end = { + row: iterator.getCurrentTokenRow(), + column: iterator.getCurrentTokenColumn() + token.value.length + }; + } + value = token.value + value; + if (value.indexOf("<") !== -1) { + var tag = this._parseTag(value); + tag.end = end; + tag.start = { + row: iterator.getCurrentTokenRow(), + column: iterator.getCurrentTokenColumn() + }; + iterator.stepBackward(); + return tag; + } + } + } while(token = iterator.stepBackward()); + + return null; + }; + + this._pop = function(stack, tag) { + while (stack.length) { + + var top = stack[stack.length-1]; + if (!tag || top.tagName == tag.tagName) { + return stack.pop(); + } + else if (this.voidElements[tag.tagName]) { + return; + } + else if (this.voidElements[top.tagName]) { + stack.pop(); + continue; + } else { + return null; + } + } + }; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var firstTag = this._getFirstTagInLine(session, row); + + if (!firstTag.match) + return null; + + var isBackward = firstTag.closing || firstTag.selfClosing; + var stack = []; + var tag; + + if (!isBackward) { + var iterator = new TokenIterator(session, row, firstTag.column); + var start = { + row: row, + column: firstTag.column + firstTag.tagName.length + 2 + }; + while (tag = this._readTagForward(iterator)) { + if (tag.selfClosing) { + if (!stack.length) { + tag.start.column += tag.tagName.length + 2; + tag.end.column -= 2; + return Range.fromPoints(tag.start, tag.end); + } else + continue; + } + + if (tag.closing) { + this._pop(stack, tag); + if (stack.length == 0) + return Range.fromPoints(start, tag.start); + } + else { + stack.push(tag) + } + } + } + else { + var iterator = new TokenIterator(session, row, firstTag.column + firstTag.match.length); + var end = { + row: row, + column: firstTag.column + }; + + while (tag = this._readTagBackward(iterator)) { + if (tag.selfClosing) { + if (!stack.length) { + tag.start.column += tag.tagName.length + 2; + tag.end.column -= 2; + return Range.fromPoints(tag.start, tag.end); + } else + continue; + } + + if (!tag.closing) { + this._pop(stack, tag); + if (stack.length == 0) { + tag.start.column += tag.tagName.length + 2; + return Range.fromPoints(tag.start, end); + } + } + else { + stack.push(tag) + } + } + } + + }; + +}).call(FoldMode.prototype); + +}); +ace.define('ace/mode/rhtml_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/r_highlight_rules', 'ace/mode/html_highlight_rules', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var RHighlightRules = require("./r_highlight_rules").RHighlightRules; +var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var RHtmlHighlightRules = function() { + + this.$rules = new HtmlHighlightRules().getRules(); + this.$rules["start"].unshift({ + token: "support.function.codebegin", + regex: "^<" + "!--\\s*begin.rcode\\s*(?:.*)", + next: "r-start" + }); + + var rRules = new RHighlightRules().getRules(); + this.addRules(rRules, "r-"); + this.$rules["r-start"].unshift({ + token: "support.function.codeend", + regex: "^\\s*end.rcode\\s*-->", + next: "start" + }); +}; +oop.inherits(RHtmlHighlightRules, TextHighlightRules); + +exports.RHtmlHighlightRules = RHtmlHighlightRules; +}); +ace.define('ace/mode/r_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/text_highlight_rules', 'ace/mode/tex_highlight_rules'], function(require, exports, module) { + + var oop = require("../lib/oop"); + var lang = require("../lib/lang"); + var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + var TexHighlightRules = require("./tex_highlight_rules").TexHighlightRules; + + var RHighlightRules = function() + { + + var keywords = lang.arrayToMap( + ("function|if|in|break|next|repeat|else|for|return|switch|while|try|tryCatch|stop|warning|require|library|attach|detach|source|setMethod|setGeneric|setGroupGeneric|setClass") + .split("|") + ); + + var buildinConstants = lang.arrayToMap( + ("NULL|NA|TRUE|FALSE|T|F|Inf|NaN|NA_integer_|NA_real_|NA_character_|" + + "NA_complex_").split("|") + ); + + this.$rules = { + "start" : [ + { + token : "comment.sectionhead", + regex : "#+(?!').*(?:----|====|####)\\s*$" + }, + { + token : "comment", + regex : "#+'", + next : "rd-start" + }, + { + token : "comment", + regex : "#.*$" + }, + { + token : "string", // multi line string start + regex : '["]', + next : "qqstring" + }, + { + token : "string", // multi line string start + regex : "[']", + next : "qstring" + }, + { + token : "constant.numeric", // hex + regex : "0[xX][0-9a-fA-F]+[Li]?\\b" + }, + { + token : "constant.numeric", // explicit integer + regex : "\\d+L\\b" + }, + { + token : "constant.numeric", // number + regex : "\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d*)?i?\\b" + }, + { + token : "constant.numeric", // number with leading decimal + regex : "\\.\\d+(?:[eE][+\\-]?\\d*)?i?\\b" + }, + { + token : "constant.language.boolean", + regex : "(?:TRUE|FALSE|T|F)\\b" + }, + { + token : "identifier", + regex : "`.*?`" + }, + { + onMatch : function(value) { + if (keywords[value]) + return "keyword"; + else if (buildinConstants[value]) + return "constant.language"; + else if (value == '...' || value.match(/^\.\.\d+$/)) + return "variable.language"; + else + return "identifier"; + }, + regex : "[a-zA-Z.][a-zA-Z0-9._]*\\b" + }, + { + token : "keyword.operator", + regex : "%%|>=|<=|==|!=|\\->|<\\-|\\|\\||&&|=|\\+|\\-|\\*|/|\\^|>|<|!|&|\\||~|\\$|:" + }, + { + token : "keyword.operator", // infix operators + regex : "%.*?%" + }, + { + token : "paren.keyword.operator", + regex : "[[({]" + }, + { + token : "paren.keyword.operator", + regex : "[\\])}]" + }, + { + token : "text", + regex : "\\s+" + } + ], + "qqstring" : [ + { + token : "string", + regex : '(?:(?:\\\\.)|(?:[^"\\\\]))*?"', + next : "start" + }, + { + token : "string", + regex : '.+' + } + ], + "qstring" : [ + { + token : "string", + regex : "(?:(?:\\\\.)|(?:[^'\\\\]))*?'", + next : "start" + }, + { + token : "string", + regex : '.+' + } + ] + }; + + var rdRules = new TexHighlightRules("comment").getRules(); + for (var i = 0; i < rdRules["start"].length; i++) { + rdRules["start"][i].token += ".virtual-comment"; + } + + this.addRules(rdRules, "rd-"); + this.$rules["rd-start"].unshift({ + token: "text", + regex: "^", + next: "start" + }); + this.$rules["rd-start"].unshift({ + token : "keyword", + regex : "@(?!@)[^ ]*" + }); + this.$rules["rd-start"].unshift({ + token : "comment", + regex : "@@" + }); + this.$rules["rd-start"].push({ + token : "comment", + regex : "[^%\\\\[({\\])}]+" + }); + }; + + oop.inherits(RHighlightRules, TextHighlightRules); + + exports.RHighlightRules = RHighlightRules; +}); +ace.define('ace/mode/tex_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var TexHighlightRules = function(textClass) { + + if (!textClass) + textClass = "text"; + + this.$rules = { + "start" : [ + { + token : "comment", + regex : "%.*$" + }, { + token : textClass, // non-command + regex : "\\\\[$&%#\\{\\}]" + }, { + token : "keyword", // command + regex : "\\\\(?:documentclass|usepackage|newcounter|setcounter|addtocounter|value|arabic|stepcounter|newenvironment|renewenvironment|ref|vref|eqref|pageref|label|cite[a-zA-Z]*|tag|begin|end|bibitem)\\b", + next : "nospell" + }, { + token : "keyword", // command + regex : "\\\\(?:[a-zA-z0-9]+|[^a-zA-z0-9])" + }, { + token : "paren.keyword.operator", + regex : "[[({]" + }, { + token : "paren.keyword.operator", + regex : "[\\])}]" + }, { + token : textClass, + regex : "\\s+" + } + ], + "nospell" : [ + { + token : "comment", + regex : "%.*$", + next : "start" + }, { + token : "nospell." + textClass, // non-command + regex : "\\\\[$&%#\\{\\}]" + }, { + token : "keyword", // command + regex : "\\\\(?:documentclass|usepackage|newcounter|setcounter|addtocounter|value|arabic|stepcounter|newenvironment|renewenvironment|ref|vref|eqref|pageref|label|cite[a-zA-Z]*|tag|begin|end|bibitem)\\b" + }, { + token : "keyword", // command + regex : "\\\\(?:[a-zA-z0-9]+|[^a-zA-z0-9])", + next : "start" + }, { + token : "paren.keyword.operator", + regex : "[[({]" + }, { + token : "paren.keyword.operator", + regex : "[\\])]" + }, { + token : "paren.keyword.operator", + regex : "}", + next : "start" + }, { + token : "nospell." + textClass, + regex : "\\s+" + }, { + token : "nospell." + textClass, + regex : "\\w+" + } + ] + }; +}; + +oop.inherits(TexHighlightRules, TextHighlightRules); + +exports.TexHighlightRules = TexHighlightRules; +}); diff --git a/0.0.3_0/ace/mode-ruby.js b/0.0.3_0/ace/mode-ruby.js new file mode 100644 index 0000000..3ab7585 --- /dev/null +++ b/0.0.3_0/ace/mode-ruby.js @@ -0,0 +1,431 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2010, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/mode/ruby', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/ruby_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/range', 'ace/mode/folding/coffee'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var RubyHighlightRules = require("./ruby_highlight_rules").RubyHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var Range = require("../range").Range; +var FoldMode = require("./folding/coffee").FoldMode; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new RubyHighlightRules().getRules()); + this.$outdent = new MatchingBraceOutdent(); + this.foldingRules = new FoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + + this.lineCommentStart = "#"; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.$tokenizer.getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start") { + var match = line.match(/^.*[\{\(\[]\s*$/); + var startingClassOrMethod = line.match(/^\s*(class|def)\s.*$/); + var startingDoBlock = line.match(/.*do(\s*|\s+\|.*\|\s*)$/); + var startingConditional = line.match(/^\s*(if|else)\s*/) + if (match || startingClassOrMethod || startingDoBlock || startingConditional) { + indent += tab; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return /^\s+end$/.test(line + input) || /^\s+}$/.test(line + input) || /^\s+else$/.test(line + input); + }; + + this.autoOutdent = function(state, doc, row) { + var indent = this.$getIndent(doc.getLine(row)); + var tab = doc.getTabString(); + if (indent.slice(-tab.length) == tab) + doc.remove(new Range(row, indent.length-tab.length, row, indent.length)); + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/ruby_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var constantOtherSymbol = exports.constantOtherSymbol = { + token : "constant.other.symbol.ruby", // symbol + regex : "[:](?:[A-Za-z_]|[@$](?=[a-zA-Z0-9_]))[a-zA-Z0-9_]*[!=?]?" +}; + +var qString = exports.qString = { + token : "string", // single line + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" +}; + +var qqString = exports.qqString = { + token : "string", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' +}; + +var tString = exports.tString = { + token : "string", // backtick string + regex : "[`](?:(?:\\\\.)|(?:[^'\\\\]))*?[`]" +}; + +var constantNumericHex = exports.constantNumericHex = { + token : "constant.numeric", // hex + regex : "0[xX][0-9a-fA-F](?:[0-9a-fA-F]|_(?=[0-9a-fA-F]))*\\b" +}; + +var constantNumericFloat = exports.constantNumericFloat = { + token : "constant.numeric", // float + regex : "[+-]?\\d(?:\\d|_(?=\\d))*(?:(?:\\.\\d(?:\\d|_(?=\\d))*)?(?:[eE][+-]?\\d+)?)?\\b" +}; + +var RubyHighlightRules = function() { + + var builtinFunctions = ( + "abort|Array|assert|assert_equal|assert_not_equal|assert_same|assert_not_same|" + + "assert_nil|assert_not_nil|assert_match|assert_no_match|assert_in_delta|assert_throws|" + + "assert_raise|assert_nothing_raised|assert_instance_of|assert_kind_of|assert_respond_to|" + + "assert_operator|assert_send|assert_difference|assert_no_difference|assert_recognizes|" + + "assert_generates|assert_response|assert_redirected_to|assert_template|assert_select|" + + "assert_select_email|assert_select_rjs|assert_select_encoded|css_select|at_exit|" + + "attr|attr_writer|attr_reader|attr_accessor|attr_accessible|autoload|binding|block_given?|callcc|" + + "caller|catch|chomp|chomp!|chop|chop!|defined?|delete_via_redirect|eval|exec|exit|" + + "exit!|fail|Float|flunk|follow_redirect!|fork|form_for|form_tag|format|gets|global_variables|gsub|" + + "gsub!|get_via_redirect|host!|https?|https!|include|Integer|lambda|link_to|" + + "link_to_unless_current|link_to_function|link_to_remote|load|local_variables|loop|open|open_session|" + + "p|print|printf|proc|putc|puts|post_via_redirect|put_via_redirect|raise|rand|" + + "raw|readline|readlines|redirect?|request_via_redirect|require|scan|select|" + + "set_trace_func|sleep|split|sprintf|srand|String|stylesheet_link_tag|syscall|system|sub|sub!|test|" + + "throw|trace_var|trap|untrace_var|atan2|cos|exp|frexp|ldexp|log|log10|sin|sqrt|tan|" + + "render|javascript_include_tag|csrf_meta_tag|label_tag|text_field_tag|submit_tag|check_box_tag|" + + "content_tag|radio_button_tag|text_area_tag|password_field_tag|hidden_field_tag|" + + "fields_for|select_tag|options_for_select|options_from_collection_for_select|collection_select|" + + "time_zone_select|select_date|select_time|select_datetime|date_select|time_select|datetime_select|" + + "select_year|select_month|select_day|select_hour|select_minute|select_second|file_field_tag|" + + "file_field|respond_to|skip_before_filter|around_filter|after_filter|verify|" + + "protect_from_forgery|rescue_from|helper_method|redirect_to|before_filter|" + + "send_data|send_file|validates_presence_of|validates_uniqueness_of|validates_length_of|" + + "validates_format_of|validates_acceptance_of|validates_associated|validates_exclusion_of|" + + "validates_inclusion_of|validates_numericality_of|validates_with|validates_each|" + + "authenticate_or_request_with_http_basic|authenticate_or_request_with_http_digest|" + + "filter_parameter_logging|match|get|post|resources|redirect|scope|assert_routing|" + + "translate|localize|extract_locale_from_tld|caches_page|expire_page|caches_action|expire_action|" + + "cache|expire_fragment|expire_cache_for|observe|cache_sweeper|" + + "has_many|has_one|belongs_to|has_and_belongs_to_many" + ); + + var keywords = ( + "alias|and|BEGIN|begin|break|case|class|def|defined|do|else|elsif|END|end|ensure|" + + "__FILE__|finally|for|gem|if|in|__LINE__|module|next|not|or|private|protected|public|" + + "redo|rescue|retry|return|super|then|undef|unless|until|when|while|yield" + ); + + var buildinConstants = ( + "true|TRUE|false|FALSE|nil|NIL|ARGF|ARGV|DATA|ENV|RUBY_PLATFORM|RUBY_RELEASE_DATE|" + + "RUBY_VERSION|STDERR|STDIN|STDOUT|TOPLEVEL_BINDING" + ); + + var builtinVariables = ( + "\$DEBUG|\$defout|\$FILENAME|\$LOAD_PATH|\$SAFE|\$stdin|\$stdout|\$stderr|\$VERBOSE|" + + "$!|root_url|flash|session|cookies|params|request|response|logger|self" + ); + + var keywordMapper = this.$keywords = this.createKeywordMapper({ + "keyword": keywords, + "constant.language": buildinConstants, + "variable.language": builtinVariables, + "support.function": builtinFunctions, + "invalid.deprecated": "debugger" // TODO is this a remnant from js mode? + }, "identifier"); + + this.$rules = { + "start" : [ + { + token : "comment", + regex : "#.*$" + }, { + token : "comment", // multi line comment + regex : "^=begin(?:$|\\s.*$)", + next : "comment" + }, { + token : "string.regexp", + regex : "[/](?:(?:\\[(?:\\\\]|[^\\]])+\\])|(?:\\\\/|[^\\]/]))*[/]\\w*\\s*(?=[).,;]|$)" + }, + + qString, + qqString, + tString, + + { + token : "text", // namespaces aren't symbols + regex : "::" + }, { + token : "variable.instance", // instance variable + regex : "@{1,2}[a-zA-Z_\\d]+" + }, { + token : "support.class", // class name + regex : "[A-Z][a-zA-Z_\\d]+" + }, + + constantOtherSymbol, + constantNumericHex, + constantNumericFloat, + + { + token : "constant.language.boolean", + regex : "(?:true|false)\\b" + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "punctuation.separator.key-value", + regex : "=>" + }, { + stateName: "heredoc", + onMatch : function(value, currentState, stack) { + var next = value[2] == '-' ? "indentedHeredoc" : "heredoc"; + var tokens = value.split(this.splitRegex); + stack.push(next, tokens[3]); + return [ + {type:"constant", value: tokens[1]}, + {type:"string", value: tokens[2]}, + {type:"support.class", value: tokens[3]}, + {type:"string", value: tokens[4]} + ]; + }, + regex : "(<<-?)(['\"`]?)([\\w]+)(['\"`]?)", + rules: { + heredoc: [{ + onMatch: function(value, currentState, stack) { + if (value == stack[1]) { + stack.shift(); + stack.shift(); + return "support.class"; + } + return "string"; + }, + regex: ".*$", + next: "start" + }], + indentedHeredoc: [{ + token: "string", + regex: "^ +" + }, { + onMatch: function(value, currentState, stack) { + if (value == stack[1]) { + stack.shift(); + stack.shift(); + return "support.class"; + } + return "string"; + }, + regex: ".*$", + next: "start" + }] + } + }, { + token : "keyword.operator", + regex : "!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)" + }, { + token : "paren.lparen", + regex : "[[({]" + }, { + token : "paren.rparen", + regex : "[\\])}]" + }, { + token : "text", + regex : "\\s+" + } + ], + "comment" : [ + { + token : "comment", // closing comment + regex : "^=end(?:$|\\s.*$)", + next : "start" + }, { + token : "comment", // comment spanning whole line + regex : ".+" + } + ] + }; + + this.normalizeRules(); +}; + +oop.inherits(RubyHighlightRules, TextHighlightRules); + +exports.RubyHighlightRules = RubyHighlightRules; +}); + +ace.define('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) { + + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define('ace/mode/folding/coffee', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/folding/fold_mode', 'ace/range'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var BaseFoldMode = require("./fold_mode").FoldMode; +var Range = require("../../range").Range; + +var FoldMode = exports.FoldMode = function() {}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var range = this.indentationBlock(session, row); + if (range) + return range; + + var re = /\S/; + var line = session.getLine(row); + var startLevel = line.search(re); + if (startLevel == -1 || line[startLevel] != "#") + return; + + var startColumn = line.length; + var maxRow = session.getLength(); + var startRow = row; + var endRow = row; + + while (++row < maxRow) { + line = session.getLine(row); + var level = line.search(re); + + if (level == -1) + continue; + + if (line[level] != "#") + break; + + endRow = row; + } + + if (endRow > startRow) { + var endColumn = session.getLine(endRow).length; + return new Range(startRow, startColumn, endRow, endColumn); + } + }; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + var indent = line.search(/\S/); + var next = session.getLine(row + 1); + var prev = session.getLine(row - 1); + var prevIndent = prev.search(/\S/); + var nextIndent = next.search(/\S/); + + if (indent == -1) { + session.foldWidgets[row - 1] = prevIndent!= -1 && prevIndent < nextIndent ? "start" : ""; + return ""; + } + if (prevIndent == -1) { + if (indent == nextIndent && line[indent] == "#" && next[indent] == "#") { + session.foldWidgets[row - 1] = ""; + session.foldWidgets[row + 1] = ""; + return "start"; + } + } else if (prevIndent == indent && line[indent] == "#" && prev[indent] == "#") { + if (session.getLine(row - 2).search(/\S/) == -1) { + session.foldWidgets[row - 1] = "start"; + session.foldWidgets[row + 1] = ""; + return ""; + } + } + + if (prevIndent!= -1 && prevIndent < indent) + session.foldWidgets[row - 1] = "start"; + else + session.foldWidgets[row - 1] = ""; + + if (indent < nextIndent) + return "start"; + else + return ""; + }; + +}).call(FoldMode.prototype); + +}); diff --git a/0.0.3_0/ace/mode-rust.js b/0.0.3_0/ace/mode-rust.js new file mode 100644 index 0000000..3c9e776 --- /dev/null +++ b/0.0.3_0/ace/mode-rust.js @@ -0,0 +1,204 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2012, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * + * Contributor(s): + * + * + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/mode/rust', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/rust_highlight_rules', 'ace/mode/folding/cstyle'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var RustHighlightRules = require("./rust_highlight_rules").RustHighlightRules; +var FoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + var highlighter = new RustHighlightRules(); + this.foldingRules = new FoldMode(); + this.$tokenizer = new Tokenizer(highlighter.getRules()); +}; +oop.inherits(Mode, TextMode); + +(function() { + this.lineCommentStart = "/\\*"; + this.blockComment = {start: "/*", end: "*/"}; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/rust_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var RustHighlightRules = function() { + + this.$rules = { start: + [ { token: 'variable.other.source.rust', + regex: '\'[a-zA-Z_][a-zA-Z0-9_]*[^\\\']' }, + { token: 'string.quoted.single.source.rust', + regex: '\'', + push: + [ { token: 'string.quoted.single.source.rust', + regex: '\'', + next: 'pop' }, + { include: '#rust_escaped_character' }, + { defaultToken: 'string.quoted.single.source.rust' } ] }, + { token: 'string.quoted.double.source.rust', + regex: '"', + push: + [ { token: 'string.quoted.double.source.rust', + regex: '"', + next: 'pop' }, + { include: '#rust_escaped_character' }, + { defaultToken: 'string.quoted.double.source.rust' } ] }, + { token: [ 'keyword.source.rust', 'meta.function.source.rust', + 'entity.name.function.source.rust', 'meta.function.source.rust' ], + regex: '\\b(fn)(\\s+)([a-zA-Z_][a-zA-Z0-9_][\\w\\:,+ \\\'<>]*)(\\s*\\()' }, + { token: 'support.constant', regex: '\\b[a-zA-Z_][\\w\\d]*::' }, + { token: 'keyword.source.rust', + regex: '\\b(?:as|assert|break|claim|const|copy|Copy|do|drop|else|extern|fail|for|if|impl|in|let|log|loop|match|mod|module|move|mut|Owned|priv|pub|pure|ref|return|unchecked|unsafe|use|while|mod|Send|static|trait|class|struct|enum|type)\\b' }, + { token: 'storage.type.source.rust', + regex: '\\b(?:Self|m32|m64|m128|f80|f16|f128|int|uint|float|char|bool|u8|u16|u32|u64|f32|f64|i8|i16|i32|i64|str|option|either|c_float|c_double|c_void|FILE|fpos_t|DIR|dirent|c_char|c_schar|c_uchar|c_short|c_ushort|c_int|c_uint|c_long|c_ulong|size_t|ptrdiff_t|clock_t|time_t|c_longlong|c_ulonglong|intptr_t|uintptr_t|off_t|dev_t|ino_t|pid_t|mode_t|ssize_t)\\b' }, + { token: 'variable.language.source.rust', regex: '\\bself\\b' }, + { token: 'keyword.operator', + regex: '!|\\$|\\*|\\-\\-|\\-|\\+\\+|\\+|-->|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|/=|%=|\\+=|\\-=|&=|\\^=|,|;' }, + { token: 'constant.language.source.rust', + regex: '\\b(?:true|false|Some|None|Left|Right|Ok|Err)\\b' }, + { token: 'support.constant.source.rust', + regex: '\\b(?:EXIT_FAILURE|EXIT_SUCCESS|RAND_MAX|EOF|SEEK_SET|SEEK_CUR|SEEK_END|_IOFBF|_IONBF|_IOLBF|BUFSIZ|FOPEN_MAX|FILENAME_MAX|L_tmpnam|TMP_MAX|O_RDONLY|O_WRONLY|O_RDWR|O_APPEND|O_CREAT|O_EXCL|O_TRUNC|S_IFIFO|S_IFCHR|S_IFBLK|S_IFDIR|S_IFREG|S_IFMT|S_IEXEC|S_IWRITE|S_IREAD|S_IRWXU|S_IXUSR|S_IWUSR|S_IRUSR|F_OK|R_OK|W_OK|X_OK|STDIN_FILENO|STDOUT_FILENO|STDERR_FILENO)\\b' }, + { token: 'meta.preprocessor.source.rust', + regex: '\\b\\w\\(\\w\\)*!|#\\[[\\w=\\(\\)_]+\\]\\b' }, + { token: 'constant.numeric.integer.source.rust', + regex: '\\b(?:[0-9][0-9_]*|[0-9][0-9_]*(?:u|u8|u16|u32|u64)|[0-9][0-9_]*(?:i|i8|i16|i32|i64))\\b' }, + { token: 'constant.numeric.hex.source.rust', + regex: '\\b(?:0x[a-fA-F0-9_]+|0x[a-fA-F0-9_]+(?:u|u8|u16|u32|u64)|0x[a-fA-F0-9_]+(?:i|i8|i16|i32|i64))\\b' }, + { token: 'constant.numeric.binary.source.rust', + regex: '\\b(?:0b[01_]+|0b[01_]+(?:u|u8|u16|u32|u64)|0b[01_]+(?:i|i8|i16|i32|i64))\\b' }, + { token: 'constant.numeric.float.source.rust', + regex: '[0-9][0-9_]*(?:f32|f64|f)|[0-9][0-9_]*[eE][+-]=[0-9_]+|[0-9][0-9_]*[eE][+-]=[0-9_]+(?:f32|f64|f)|[0-9][0-9_]*\\.[0-9_]+|[0-9][0-9_]*\\.[0-9_]+(?:f32|f64|f)|[0-9][0-9_]*\\.[0-9_]+%[eE][+-]=[0-9_]+|[0-9][0-9_]*\\.[0-9_]+%[eE][+-]=[0-9_]+(?:f32|f64|f)' }, + { token: 'comment.line.documentation.source.rust', + regex: '//!.*$', + push_: + [ { token: 'comment.line.documentation.source.rust', + regex: '$', + next: 'pop' }, + { defaultToken: 'comment.line.documentation.source.rust' } ] }, + { token: 'comment.line.double-dash.source.rust', + regex: '//.*$', + push_: + [ { token: 'comment.line.double-dash.source.rust', + regex: '$', + next: 'pop' }, + { defaultToken: 'comment.line.double-dash.source.rust' } ] }, + { token: 'comment.block.source.rust', + regex: '/\\*', + push: + [ { token: 'comment.block.source.rust', + regex: '\\*/', + next: 'pop' }, + { defaultToken: 'comment.block.source.rust' } ] } ], + '#rust_escaped_character': + [ { token: 'constant.character.escape.source.rust', + regex: '\\\\(?:x[\\da-fA-F]{2}|[0-2][0-7]{,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.)' } ] } + + this.normalizeRules(); +}; + +RustHighlightRules.metaData = { fileTypes: [ 'rs', 'rc' ], + foldingStartMarker: '^.*\\bfn\\s*(\\w+\\s*)?\\([^\\)]*\\)(\\s*\\{[^\\}]*)?\\s*$', + foldingStopMarker: '^\\s*\\}', + name: 'Rust', + scopeName: 'source.rust' } + + +oop.inherits(RustHighlightRules, TextHighlightRules); + +exports.RustHighlightRules = RustHighlightRules; +}); + +ace.define('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var line = session.getLine(row); + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i + match[0].length, 1); + } + + if (foldStyle !== "markbeginend") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + +}).call(FoldMode.prototype); + +}); diff --git a/0.0.3_0/ace/mode-sass.js b/0.0.3_0/ace/mode-sass.js new file mode 100644 index 0000000..90a557d --- /dev/null +++ b/0.0.3_0/ace/mode-sass.js @@ -0,0 +1,442 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2010, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/mode/sass', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/sass_highlight_rules', 'ace/mode/folding/coffee'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var SassHighlightRules = require("./sass_highlight_rules").SassHighlightRules; +var FoldMode = require("./folding/coffee").FoldMode; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new SassHighlightRules().getRules()); + this.foldingRules = new FoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + this.lineCommentStart = "//"; +}).call(Mode.prototype); + +exports.Mode = Mode; + +}); + +ace.define('ace/mode/sass_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/scss_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var ScssHighlightRules = require("./scss_highlight_rules").ScssHighlightRules; + +var SassHighlightRules = function() { + ScssHighlightRules.call(this); + var start = this.$rules.start; + if (start[1].token == "comment") { + start.splice(1, 1, { + onMatch: function(value, currentState, stack) { + stack.unshift(this.next, -1, value.length - 2, currentState); + return "comment"; + }, + regex: /^\s*\/\*/, + next: "comment" + }, { + token: "error.invalid", + regex: "/\\*|[{;}]" + }, { + token: "support.type", + regex: /^\s*:[\w\-]+\s/ + }); + + this.$rules.comment = [ + {regex: /^\s*/, onMatch: function(value, currentState, stack) { + if (stack[1] === -1) + stack[1] = Math.max(stack[2], value.length - 1); + if (value.length <= stack[1]) {stack.shift();stack.shift();stack.shift(); + this.next = stack.shift(); + return "text"; + } else { + this.next = ""; + return "comment"; + } + }, next: "start"}, + {defaultToken: "comment"} + ] + } +}; + +oop.inherits(SassHighlightRules, ScssHighlightRules); + +exports.SassHighlightRules = SassHighlightRules; + +}); + +ace.define('ace/mode/scss_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var ScssHighlightRules = function() { + + var properties = lang.arrayToMap( (function () { + + var browserPrefix = ("-webkit-|-moz-|-o-|-ms-|-svg-|-pie-|-khtml-").split("|"); + + var prefixProperties = ("appearance|background-clip|background-inline-policy|background-origin|" + + "background-size|binding|border-bottom-colors|border-left-colors|" + + "border-right-colors|border-top-colors|border-end|border-end-color|" + + "border-end-style|border-end-width|border-image|border-start|" + + "border-start-color|border-start-style|border-start-width|box-align|" + + "box-direction|box-flex|box-flexgroup|box-ordinal-group|box-orient|" + + "box-pack|box-sizing|column-count|column-gap|column-width|column-rule|" + + "column-rule-width|column-rule-style|column-rule-color|float-edge|" + + "font-feature-settings|font-language-override|force-broken-image-icon|" + + "image-region|margin-end|margin-start|opacity|outline|outline-color|" + + "outline-offset|outline-radius|outline-radius-bottomleft|" + + "outline-radius-bottomright|outline-radius-topleft|outline-radius-topright|" + + "outline-style|outline-width|padding-end|padding-start|stack-sizing|" + + "tab-size|text-blink|text-decoration-color|text-decoration-line|" + + "text-decoration-style|transform|transform-origin|transition|" + + "transition-delay|transition-duration|transition-property|" + + "transition-timing-function|user-focus|user-input|user-modify|user-select|" + + "window-shadow|border-radius").split("|"); + + var properties = ("azimuth|background-attachment|background-color|background-image|" + + "background-position|background-repeat|background|border-bottom-color|" + + "border-bottom-style|border-bottom-width|border-bottom|border-collapse|" + + "border-color|border-left-color|border-left-style|border-left-width|" + + "border-left|border-right-color|border-right-style|border-right-width|" + + "border-right|border-spacing|border-style|border-top-color|" + + "border-top-style|border-top-width|border-top|border-width|border|bottom|" + + "box-shadow|box-sizing|caption-side|clear|clip|color|content|counter-increment|" + + "counter-reset|cue-after|cue-before|cue|cursor|direction|display|" + + "elevation|empty-cells|float|font-family|font-size-adjust|font-size|" + + "font-stretch|font-style|font-variant|font-weight|font|height|left|" + + "letter-spacing|line-height|list-style-image|list-style-position|" + + "list-style-type|list-style|margin-bottom|margin-left|margin-right|" + + "margin-top|marker-offset|margin|marks|max-height|max-width|min-height|" + + "min-width|opacity|orphans|outline-color|" + + "outline-style|outline-width|outline|overflow|overflow-x|overflow-y|padding-bottom|" + + "padding-left|padding-right|padding-top|padding|page-break-after|" + + "page-break-before|page-break-inside|page|pause-after|pause-before|" + + "pause|pitch-range|pitch|play-during|position|quotes|richness|right|" + + "size|speak-header|speak-numeral|speak-punctuation|speech-rate|speak|" + + "stress|table-layout|text-align|text-decoration|text-indent|" + + "text-shadow|text-transform|top|unicode-bidi|vertical-align|" + + "visibility|voice-family|volume|white-space|widows|width|word-spacing|" + + "z-index").split("|"); + var ret = []; + for (var i=0, ln=browserPrefix.length; i|<=|>=|==|!=|-|%|#|\\+|\\$|\\+|\\*" + }, { + token : "paren.lparen", + regex : "[[({]" + }, { + token : "paren.rparen", + regex : "[\\])}]" + }, { + token : "text", + regex : "\\s+" + }, { + caseInsensitive: true + } + ], + "comment" : [ + { + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "start" + }, { + token : "comment", // comment spanning whole line + regex : ".+" + } + ], + "qqstring" : [ + { + token : "string", + regex : '(?:(?:\\\\.)|(?:[^"\\\\]))*?"', + next : "start" + }, { + token : "string", + regex : '.+' + } + ], + "qstring" : [ + { + token : "string", + regex : "(?:(?:\\\\.)|(?:[^'\\\\]))*?'", + next : "start" + }, { + token : "string", + regex : '.+' + } + ] + }; +}; + +oop.inherits(ScssHighlightRules, TextHighlightRules); + +exports.ScssHighlightRules = ScssHighlightRules; + +}); + +ace.define('ace/mode/folding/coffee', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/folding/fold_mode', 'ace/range'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var BaseFoldMode = require("./fold_mode").FoldMode; +var Range = require("../../range").Range; + +var FoldMode = exports.FoldMode = function() {}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var range = this.indentationBlock(session, row); + if (range) + return range; + + var re = /\S/; + var line = session.getLine(row); + var startLevel = line.search(re); + if (startLevel == -1 || line[startLevel] != "#") + return; + + var startColumn = line.length; + var maxRow = session.getLength(); + var startRow = row; + var endRow = row; + + while (++row < maxRow) { + line = session.getLine(row); + var level = line.search(re); + + if (level == -1) + continue; + + if (line[level] != "#") + break; + + endRow = row; + } + + if (endRow > startRow) { + var endColumn = session.getLine(endRow).length; + return new Range(startRow, startColumn, endRow, endColumn); + } + }; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + var indent = line.search(/\S/); + var next = session.getLine(row + 1); + var prev = session.getLine(row - 1); + var prevIndent = prev.search(/\S/); + var nextIndent = next.search(/\S/); + + if (indent == -1) { + session.foldWidgets[row - 1] = prevIndent!= -1 && prevIndent < nextIndent ? "start" : ""; + return ""; + } + if (prevIndent == -1) { + if (indent == nextIndent && line[indent] == "#" && next[indent] == "#") { + session.foldWidgets[row - 1] = ""; + session.foldWidgets[row + 1] = ""; + return "start"; + } + } else if (prevIndent == indent && line[indent] == "#" && prev[indent] == "#") { + if (session.getLine(row - 2).search(/\S/) == -1) { + session.foldWidgets[row - 1] = "start"; + session.foldWidgets[row + 1] = ""; + return ""; + } + } + + if (prevIndent!= -1 && prevIndent < indent) + session.foldWidgets[row - 1] = "start"; + else + session.foldWidgets[row - 1] = ""; + + if (indent < nextIndent) + return "start"; + else + return ""; + }; + +}).call(FoldMode.prototype); + +}); diff --git a/0.0.3_0/ace/mode-scad.js b/0.0.3_0/ace/mode-scad.js new file mode 100644 index 0000000..2fc5d96 --- /dev/null +++ b/0.0.3_0/ace/mode-scad.js @@ -0,0 +1,670 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2010, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/mode/scad', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/scad_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/range', 'ace/mode/behaviour/cstyle', 'ace/mode/folding/cstyle'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var scadHighlightRules = require("./scad_highlight_rules").scadHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var Range = require("../range").Range; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new scadHighlightRules().getRules()); + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.$tokenizer.getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start") { + var match = line.match(/^.*[\{\(\[]\s*$/); + if (match) { + indent += tab; + } + } else if (state == "doc-start") { + if (endState == "start") { + return ""; + } + var match = line.match(/^\s*(\/?)\*/); + if (match) { + if (match[1]) { + indent += " "; + } + indent += "* "; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/scad_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/doc_comment_highlight_rules', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var scadHighlightRules = function() { + var keywordMapper = this.createKeywordMapper({ + "variable.language": "this", + "keyword": "module|if|else|for", + "constant.language": "NULL" + }, "identifier"); + + this.$rules = { + "start" : [ + { + token : "comment", + regex : "\\/\\/.*$" + }, + DocCommentHighlightRules.getStartRule("start"), + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment" + }, { + token : "string", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' + }, { + token : "string", // multi line string start + regex : '["].*\\\\$', + next : "qqstring" + }, { + token : "string", // single line + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" + }, { + token : "string", // multi line string start + regex : "['].*\\\\$", + next : "qstring" + }, { + token : "constant.numeric", // hex + regex : "0[xX][0-9a-fA-F]+\\b" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : "constant", // + regex : "<[a-zA-Z0-9.]+>" + }, { + token : "keyword", // pre-compiler directivs + regex : "(?:use|include)" + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "keyword.operator", + regex : "!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|==|=|!=|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|new|delete|typeof|void)" + }, { + token : "paren.lparen", + regex : "[[({]" + }, { + token : "paren.rparen", + regex : "[\\])}]" + }, { + token : "text", + regex : "\\s+" + } + ], + "comment" : [ + { + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "start" + }, { + token : "comment", // comment spanning whole line + regex : ".+" + } + ], + "qqstring" : [ + { + token : "string", + regex : '(?:(?:\\\\.)|(?:[^"\\\\]))*?"', + next : "start" + }, { + token : "string", + regex : '.+' + } + ], + "qstring" : [ + { + token : "string", + regex : "(?:(?:\\\\.)|(?:[^'\\\\]))*?'", + next : "start" + }, { + token : "string", + regex : '.+' + } + ] + }; + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("start") ]); +}; + +oop.inherits(scadHighlightRules, TextHighlightRules); + +exports.scadHighlightRules = scadHighlightRules; +}); + +ace.define('ace/mode/doc_comment_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, { + token : "comment.doc.tag", + regex : "\\bTODO\\b" + }, { + defaultToken : "comment.doc" + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) { + + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define('ace/mode/behaviour/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/token_iterator', 'ace/lib/lang'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; +var lang = require("../../lib/lang"); + +var SAFE_INSERT_IN_TOKENS = + ["text", "paren.rparen", "punctuation.operator"]; +var SAFE_INSERT_BEFORE_TOKENS = + ["text", "paren.rparen", "punctuation.operator", "comment"]; + + +var autoInsertedBrackets = 0; +var autoInsertedRow = -1; +var autoInsertedLineEnd = ""; +var maybeInsertedBrackets = 0; +var maybeInsertedRow = -1; +var maybeInsertedLineStart = ""; +var maybeInsertedLineEnd = ""; + +var CstyleBehaviour = function () { + + CstyleBehaviour.isSaneInsertion = function(editor, session) { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + if (!this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) { + var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1); + if (!this.$matchTokenType(iterator2.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) + return false; + } + iterator.stepForward(); + return iterator.getCurrentTokenRow() !== cursor.row || + this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_BEFORE_TOKENS); + }; + + CstyleBehaviour.$matchTokenType = function(token, types) { + return types.indexOf(token.type || token) > -1; + }; + + CstyleBehaviour.recordAutoInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isAutoInsertedClosing(cursor, line, autoInsertedLineEnd[0])) + autoInsertedBrackets = 0; + autoInsertedRow = cursor.row; + autoInsertedLineEnd = bracket + line.substr(cursor.column); + autoInsertedBrackets++; + }; + + CstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isMaybeInsertedClosing(cursor, line)) + maybeInsertedBrackets = 0; + maybeInsertedRow = cursor.row; + maybeInsertedLineStart = line.substr(0, cursor.column) + bracket; + maybeInsertedLineEnd = line.substr(cursor.column); + maybeInsertedBrackets++; + }; + + CstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) { + return autoInsertedBrackets > 0 && + cursor.row === autoInsertedRow && + bracket === autoInsertedLineEnd[0] && + line.substr(cursor.column) === autoInsertedLineEnd; + }; + + CstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) { + return maybeInsertedBrackets > 0 && + cursor.row === maybeInsertedRow && + line.substr(cursor.column) === maybeInsertedLineEnd && + line.substr(0, cursor.column) == maybeInsertedLineStart; + }; + + CstyleBehaviour.popAutoInsertedClosing = function() { + autoInsertedLineEnd = autoInsertedLineEnd.substr(1); + autoInsertedBrackets--; + }; + + CstyleBehaviour.clearMaybeInsertedClosing = function() { + maybeInsertedBrackets = 0; + maybeInsertedRow = -1; + }; + + this.add("braces", "insertion", function (state, action, editor, session, text) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (text == '{') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "{" && editor.getWrapBehavioursEnabled()) { + return { + text: '{' + selected + '}', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + if (/[\]\}\)]/.test(line[cursor.column])) { + CstyleBehaviour.recordAutoInsert(editor, session, "}"); + return { + text: '{}', + selection: [1, 1] + }; + } else { + CstyleBehaviour.recordMaybeInsert(editor, session, "{"); + return { + text: '{', + selection: [1, 1] + }; + } + } + } else if (text == '}') { + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}') { + var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } else if (text == "\n" || text == "\r\n") { + var closing = ""; + if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) { + closing = lang.stringRepeat("}", maybeInsertedBrackets); + CstyleBehaviour.clearMaybeInsertedClosing(); + } + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}' || closing !== "") { + var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column}, '}'); + if (!openBracePos) + return null; + + var indent = this.getNextLineIndent(state, line.substring(0, cursor.column), session.getTabString()); + var next_indent = this.$getIndent(line); + + return { + text: '\n' + indent + '\n' + next_indent + closing, + selection: [1, indent.length, 1, indent.length] + }; + } + } + }); + + this.add("braces", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '{') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar == '}') { + range.end.column++; + return range; + } else { + maybeInsertedBrackets--; + } + } + }); + + this.add("parens", "insertion", function (state, action, editor, session, text) { + if (text == '(') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return { + text: '(' + selected + ')', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, ")"); + return { + text: '()', + selection: [1, 1] + }; + } + } else if (text == ')') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ')') { + var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("parens", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '(') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ')') { + range.end.column++; + return range; + } + } + }); + + this.add("brackets", "insertion", function (state, action, editor, session, text) { + if (text == '[') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return { + text: '[' + selected + ']', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, "]"); + return { + text: '[]', + selection: [1, 1] + }; + } + } else if (text == ']') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ']') { + var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("brackets", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '[') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ']') { + range.end.column++; + return range; + } + } + }); + + this.add("string_dquotes", "insertion", function (state, action, editor, session, text) { + if (text == '"' || text == "'") { + var quote = text; + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "'" && selected != '"' && editor.getWrapBehavioursEnabled()) { + return { + text: quote + selected + quote, + selection: false + }; + } else { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var leftChar = line.substring(cursor.column-1, cursor.column); + if (leftChar == '\\') { + return null; + } + var tokens = session.getTokens(selection.start.row); + var col = 0, token; + var quotepos = -1; // Track whether we're inside an open quote. + + for (var x = 0; x < tokens.length; x++) { + token = tokens[x]; + if (token.type == "string") { + quotepos = -1; + } else if (quotepos < 0) { + quotepos = token.value.indexOf(quote); + } + if ((token.value.length + col) > selection.start.column) { + break; + } + col += tokens[x].value.length; + } + if (!token || (quotepos < 0 && token.type !== "comment" && (token.type !== "string" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) { + if (!CstyleBehaviour.isSaneInsertion(editor, session)) + return; + return { + text: quote + quote, + selection: [1,1] + }; + } else if (token && token.type === "string") { + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == quote) { + return { + text: '', + selection: [1, 1] + }; + } + } + } + } + }); + + this.add("string_dquotes", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && (selected == '"' || selected == "'")) { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == selected) { + range.end.column++; + return range; + } + } + }); + +}; + +oop.inherits(CstyleBehaviour, Behaviour); + +exports.CstyleBehaviour = CstyleBehaviour; +}); + +ace.define('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var line = session.getLine(row); + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i + match[0].length, 1); + } + + if (foldStyle !== "markbeginend") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + +}).call(FoldMode.prototype); + +}); diff --git a/0.0.3_0/ace/mode-scala.js b/0.0.3_0/ace/mode-scala.js new file mode 100644 index 0000000..9210041 --- /dev/null +++ b/0.0.3_0/ace/mode-scala.js @@ -0,0 +1,1025 @@ +ace.define('ace/mode/scala', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/javascript', 'ace/tokenizer', 'ace/mode/scala_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var JavaScriptMode = require("./javascript").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var ScalaHighlightRules = require("./scala_highlight_rules").ScalaHighlightRules; + +var Mode = function() { + JavaScriptMode.call(this); + + this.$tokenizer = new Tokenizer(new ScalaHighlightRules().getRules()); +}; +oop.inherits(Mode, JavaScriptMode); + +(function() { + + this.createWorker = function(session) { + return null; + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/javascript', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/javascript_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/range', 'ace/worker/worker_client', 'ace/mode/behaviour/cstyle', 'ace/mode/folding/cstyle'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var Range = require("../range").Range; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new JavaScriptHighlightRules().getRules()); + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.$tokenizer.getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start" || state == "no_regex") { + var match = line.match(/^.*(?:\bcase\b.*\:|[\{\(\[])\s*$/); + if (match) { + indent += tab; + } + } else if (state == "doc-start") { + if (endState == "start" || endState == "no_regex") { + return ""; + } + var match = line.match(/^\s*(\/?)\*/); + if (match) { + if (match[1]) { + indent += " "; + } + indent += "* "; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/javascript_worker", "JavaScriptWorker"); + worker.attachToDocument(session.getDocument()); + + worker.on("jslint", function(results) { + session.setAnnotations(results.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +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(require, exports, module) { + + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var JavaScriptHighlightRules = function() { + var keywordMapper = this.createKeywordMapper({ + "variable.language": + "Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|" + // Constructors + "Namespace|QName|XML|XMLList|" + // E4X + "ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|" + + "Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|" + + "Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|" + // Errors + "SyntaxError|TypeError|URIError|" + + "decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|" + // Non-constructor functions + "isNaN|parseFloat|parseInt|" + + "JSON|Math|" + // Other + "this|arguments|prototype|window|document" , // Pseudo + "keyword": + "const|yield|import|get|set|" + + "break|case|catch|continue|default|delete|do|else|finally|for|function|" + + "if|in|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"); + var kwBeforeRe = "case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void"; + var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*\\b"; + + var escapedRe = "\\\\(?:x[0-9a-fA-F]{2}|" + // hex + "u[0-9a-fA-F]{4}|" + // unicode + "[0-2][0-7]{0,2}|" + // oct + "3[0-6][0-7]?|" + // oct + "37[0-7]?|" + // oct + "[4-7][0-7]?|" + //oct + ".)"; + + this.$rules = { + "no_regex" : [ + { + token : "comment", + regex : /\/\/.*$/ + }, + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : /\/\*/, + next : "comment" + }, { + token : "string", + regex : "'(?=.)", + next : "qstring" + }, { + token : "string", + regex : '"(?=.)', + next : "qqstring" + }, { + token : "constant.numeric", // hex + regex : /0[xX][0-9a-fA-F]+\b/ + }, { + token : "constant.numeric", // float + regex : /[+-]?\d+(?:(?:\.\d*)?(?:[eE][+-]?\d+)?)?\b/ + }, { + token : [ + "storage.type", "punctuation.operator", "support.function", + "punctuation.operator", "entity.name.function", "text","keyword.operator" + ], + regex : "(" + identifierRe + ")(\\.)(prototype)(\\.)(" + identifierRe +")(\\s*)(=)", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "keyword.operator", "text", "storage.type", + "text", "paren.lparen" + ], + regex : "(" + identifierRe +")(\\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 : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(function)(\\s+)(" + identifierRe + ")(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "punctuation.operator", + "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\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 : "(?:" + kwBeforeRe + ")\\b", + next : "start" + }, { + token : ["punctuation.operator", "support.function"], + regex : /(\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:opzzzz|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 : ["punctuation.operator", "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)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/ + }, { + token : ["punctuation.operator", "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 : ["storage.type", "punctuation.operator", "support.function.firebug"], + regex : /(console)(\.)(warn|info|log|error|time|timeEnd|assert)\b/ + }, { + token : keywordMapper, + regex : identifierRe + }, { + token : "keyword.operator", + regex : /--|\+\+|[!$%&*+\-~]|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\|\||\?\:|\*=|%=|\+=|\-=|&=|\^=/, + next : "start" + }, { + token : "punctuation.operator", + regex : /\?|\:|\,|\;|\./, + next : "start" + }, { + token : "paren.lparen", + regex : /[\[({]/, + next : "start" + }, { + token : "paren.rparen", + regex : /[\])}]/ + }, { + token : "keyword.operator", + regex : /\/=?/, + next : "start" + }, { + token: "comment", + regex: /^#!.*$/ + } + ], + "start": [ + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment_regex_allowed" + }, { + token : "comment", + regex : "\\/\\/.*$", + next : "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: "/\\w*", + 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.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: identifierRe + }, { + token: "punctuation.operator", + regex: "[, ]+" + }, { + token: "punctuation.operator", + regex: "$" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "comment_regex_allowed" : [ + {token : "comment", regex : "\\*\\/", next : "start"}, + {defaultToken : "comment"} + ], + "comment" : [ + {token : "comment", regex : "\\*\\/", next : "no_regex"}, + {defaultToken : "comment"} + ], + "qqstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + next : "qqstring" + }, { + token : "string", + regex : '"|$', + next : "no_regex" + }, { + defaultToken: "string" + } + ], + "qstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + next : "qstring" + }, { + token : "string", + regex : "'|$", + next : "no_regex" + }, { + defaultToken: "string" + } + ] + }; + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("no_regex") ]); +}; + +oop.inherits(JavaScriptHighlightRules, TextHighlightRules); + +exports.JavaScriptHighlightRules = JavaScriptHighlightRules; +}); + +ace.define('ace/mode/doc_comment_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, { + token : "comment.doc.tag", + regex : "\\bTODO\\b" + }, { + defaultToken : "comment.doc" + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) { + + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define('ace/mode/behaviour/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/token_iterator', 'ace/lib/lang'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; +var lang = require("../../lib/lang"); + +var SAFE_INSERT_IN_TOKENS = + ["text", "paren.rparen", "punctuation.operator"]; +var SAFE_INSERT_BEFORE_TOKENS = + ["text", "paren.rparen", "punctuation.operator", "comment"]; + + +var autoInsertedBrackets = 0; +var autoInsertedRow = -1; +var autoInsertedLineEnd = ""; +var maybeInsertedBrackets = 0; +var maybeInsertedRow = -1; +var maybeInsertedLineStart = ""; +var maybeInsertedLineEnd = ""; + +var CstyleBehaviour = function () { + + CstyleBehaviour.isSaneInsertion = function(editor, session) { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + if (!this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) { + var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1); + if (!this.$matchTokenType(iterator2.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) + return false; + } + iterator.stepForward(); + return iterator.getCurrentTokenRow() !== cursor.row || + this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_BEFORE_TOKENS); + }; + + CstyleBehaviour.$matchTokenType = function(token, types) { + return types.indexOf(token.type || token) > -1; + }; + + CstyleBehaviour.recordAutoInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isAutoInsertedClosing(cursor, line, autoInsertedLineEnd[0])) + autoInsertedBrackets = 0; + autoInsertedRow = cursor.row; + autoInsertedLineEnd = bracket + line.substr(cursor.column); + autoInsertedBrackets++; + }; + + CstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isMaybeInsertedClosing(cursor, line)) + maybeInsertedBrackets = 0; + maybeInsertedRow = cursor.row; + maybeInsertedLineStart = line.substr(0, cursor.column) + bracket; + maybeInsertedLineEnd = line.substr(cursor.column); + maybeInsertedBrackets++; + }; + + CstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) { + return autoInsertedBrackets > 0 && + cursor.row === autoInsertedRow && + bracket === autoInsertedLineEnd[0] && + line.substr(cursor.column) === autoInsertedLineEnd; + }; + + CstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) { + return maybeInsertedBrackets > 0 && + cursor.row === maybeInsertedRow && + line.substr(cursor.column) === maybeInsertedLineEnd && + line.substr(0, cursor.column) == maybeInsertedLineStart; + }; + + CstyleBehaviour.popAutoInsertedClosing = function() { + autoInsertedLineEnd = autoInsertedLineEnd.substr(1); + autoInsertedBrackets--; + }; + + CstyleBehaviour.clearMaybeInsertedClosing = function() { + maybeInsertedBrackets = 0; + maybeInsertedRow = -1; + }; + + this.add("braces", "insertion", function (state, action, editor, session, text) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (text == '{') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "{" && editor.getWrapBehavioursEnabled()) { + return { + text: '{' + selected + '}', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + if (/[\]\}\)]/.test(line[cursor.column])) { + CstyleBehaviour.recordAutoInsert(editor, session, "}"); + return { + text: '{}', + selection: [1, 1] + }; + } else { + CstyleBehaviour.recordMaybeInsert(editor, session, "{"); + return { + text: '{', + selection: [1, 1] + }; + } + } + } else if (text == '}') { + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}') { + var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } else if (text == "\n" || text == "\r\n") { + var closing = ""; + if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) { + closing = lang.stringRepeat("}", maybeInsertedBrackets); + CstyleBehaviour.clearMaybeInsertedClosing(); + } + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}' || closing !== "") { + var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column}, '}'); + if (!openBracePos) + return null; + + var indent = this.getNextLineIndent(state, line.substring(0, cursor.column), session.getTabString()); + var next_indent = this.$getIndent(line); + + return { + text: '\n' + indent + '\n' + next_indent + closing, + selection: [1, indent.length, 1, indent.length] + }; + } + } + }); + + this.add("braces", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '{') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar == '}') { + range.end.column++; + return range; + } else { + maybeInsertedBrackets--; + } + } + }); + + this.add("parens", "insertion", function (state, action, editor, session, text) { + if (text == '(') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return { + text: '(' + selected + ')', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, ")"); + return { + text: '()', + selection: [1, 1] + }; + } + } else if (text == ')') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ')') { + var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("parens", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '(') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ')') { + range.end.column++; + return range; + } + } + }); + + this.add("brackets", "insertion", function (state, action, editor, session, text) { + if (text == '[') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return { + text: '[' + selected + ']', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, "]"); + return { + text: '[]', + selection: [1, 1] + }; + } + } else if (text == ']') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ']') { + var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("brackets", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '[') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ']') { + range.end.column++; + return range; + } + } + }); + + this.add("string_dquotes", "insertion", function (state, action, editor, session, text) { + if (text == '"' || text == "'") { + var quote = text; + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "'" && selected != '"' && editor.getWrapBehavioursEnabled()) { + return { + text: quote + selected + quote, + selection: false + }; + } else { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var leftChar = line.substring(cursor.column-1, cursor.column); + if (leftChar == '\\') { + return null; + } + var tokens = session.getTokens(selection.start.row); + var col = 0, token; + var quotepos = -1; // Track whether we're inside an open quote. + + for (var x = 0; x < tokens.length; x++) { + token = tokens[x]; + if (token.type == "string") { + quotepos = -1; + } else if (quotepos < 0) { + quotepos = token.value.indexOf(quote); + } + if ((token.value.length + col) > selection.start.column) { + break; + } + col += tokens[x].value.length; + } + if (!token || (quotepos < 0 && token.type !== "comment" && (token.type !== "string" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) { + if (!CstyleBehaviour.isSaneInsertion(editor, session)) + return; + return { + text: quote + quote, + selection: [1,1] + }; + } else if (token && token.type === "string") { + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == quote) { + return { + text: '', + selection: [1, 1] + }; + } + } + } + } + }); + + this.add("string_dquotes", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && (selected == '"' || selected == "'")) { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == selected) { + range.end.column++; + return range; + } + } + }); + +}; + +oop.inherits(CstyleBehaviour, Behaviour); + +exports.CstyleBehaviour = CstyleBehaviour; +}); + +ace.define('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var line = session.getLine(row); + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i + match[0].length, 1); + } + + if (foldStyle !== "markbeginend") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + +}).call(FoldMode.prototype); + +}); +ace.define('ace/mode/scala_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/doc_comment_highlight_rules', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var ScalaHighlightRules = function() { + var keywords = ( + "case|default|do|else|for|if|match|while|throw|return|try|catch|finally|yield|" + + "abstract|class|def|extends|final|forSome|implicit|implicits|import|lazy|new|object|" + + "override|package|private|protected|sealed|super|this|trait|type|val|var|with" + ); + + var buildinConstants = ("true|false"); + + var langClasses = ( + "AbstractMethodError|AssertionError|ClassCircularityError|"+ + "ClassFormatError|Deprecated|EnumConstantNotPresentException|"+ + "ExceptionInInitializerError|IllegalAccessError|"+ + "IllegalThreadStateException|InstantiationError|InternalError|"+ + + "NegativeArraySizeException|NoSuchFieldError|Override|Process|"+ + "ProcessBuilder|SecurityManager|StringIndexOutOfBoundsException|"+ + "SuppressWarnings|TypeNotPresentException|UnknownError|"+ + "UnsatisfiedLinkError|UnsupportedClassVersionError|VerifyError|"+ + "InstantiationException|IndexOutOfBoundsException|"+ + "ArrayIndexOutOfBoundsException|CloneNotSupportedException|"+ + "NoSuchFieldException|IllegalArgumentException|NumberFormatException|"+ + "SecurityException|Void|InheritableThreadLocal|IllegalStateException|"+ + "InterruptedException|NoSuchMethodException|IllegalAccessException|"+ + "UnsupportedOperationException|Enum|StrictMath|Package|Compiler|"+ + "Readable|Runtime|StringBuilder|Math|IncompatibleClassChangeError|"+ + "NoSuchMethodError|ThreadLocal|RuntimePermission|ArithmeticException|"+ + "NullPointerException|Long|Integer|Short|Byte|Double|Number|Float|"+ + "Character|Boolean|StackTraceElement|Appendable|StringBuffer|"+ + "Iterable|ThreadGroup|Runnable|Thread|IllegalMonitorStateException|"+ + "StackOverflowError|OutOfMemoryError|VirtualMachineError|"+ + "ArrayStoreException|ClassCastException|LinkageError|"+ + "NoClassDefFoundError|ClassNotFoundException|RuntimeException|"+ + "Exception|ThreadDeath|Error|Throwable|System|ClassLoader|"+ + "Cloneable|Class|CharSequence|Comparable|String|Object|" + + "Unit|Any|AnyVal|AnyRef|Null|ScalaObject|Singleton|Seq|Iterable|List|" + + "Option|Array|Char|Byte|Short|Int|Long|Nothing" + + + ); + + var keywordMapper = this.createKeywordMapper({ + "variable.language": "this", + "keyword": keywords, + "support.function": langClasses, + "constant.language": buildinConstants + }, "identifier"); + + this.$rules = { + "start" : [ + { + token : "comment", + regex : "\\/\\/.*$" + }, + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment" + }, { + token : "string.regexp", + regex : "[/](?:(?:\\[(?:\\\\]|[^\\]])+\\])|(?:\\\\/|[^\\]/]))*[/]\\w*\\s*(?=[).,;]|$)" + }, { + token : "string", + regex : '"""', + next : "tstring" + }, { + token : "string", + regex : '"(?=.)', // " strings can't span multiple lines + next : "string" + }, { + token : "symbol.constant", // single line + regex : "'[\\w\\d_]+" + }, { + token : "constant.numeric", // hex + regex : "0[xX][0-9a-fA-F]+\\b" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : "constant.language.boolean", + regex : "(?:true|false)\\b" + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "keyword.operator", + regex : "!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)" + }, { + token : "paren.lparen", + regex : "[[({]" + }, { + token : "paren.rparen", + regex : "[\\])}]" + }, { + token : "text", + regex : "\\s+" + } + ], + "comment" : [ + { + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "start" + }, { + token : "comment", // comment spanning whole line + regex : ".+" + } + ], + "string" : [ + { + token : "escape", + regex : '\\\\"' + }, { + token : "string", + regex : '"', + next : "start" + }, { + token : "string.invalid", + regex : '[^"\\\\]*$', + next : "start" + }, { + token : "string", + regex : '[^"\\\\]+' + } + ], + "tstring" : [ + { + token : "string", // closing comment + regex : '"{3,5}', + next : "start" + }, { + token : "string", // comment spanning whole line + regex : ".+?" + } + ] + }; + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("start") ]); +}; + +oop.inherits(ScalaHighlightRules, TextHighlightRules); + +exports.ScalaHighlightRules = ScalaHighlightRules; +}); diff --git a/0.0.3_0/ace/mode-scheme.js b/0.0.3_0/ace/mode-scheme.js new file mode 100644 index 0000000..90ce659 --- /dev/null +++ b/0.0.3_0/ace/mode-scheme.js @@ -0,0 +1,144 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2012, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * + * Contributor(s): + * + * NalaGinrut@gmail.com + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/mode/scheme', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/scheme_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var SchemeHighlightRules = require("./scheme_highlight_rules").SchemeHighlightRules; + +var Mode = function() { + var highlighter = new SchemeHighlightRules(); + + this.$tokenizer = new Tokenizer(highlighter.getRules()); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = ";"; + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/scheme_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var SchemeHighlightRules = function() { + var keywordControl = "case|do|let|loop|if|else|when"; + var keywordOperator = "eq?|eqv?|equal?|and|or|not|null?"; + var constantLanguage = "#t|#f"; + var supportFunctions = "cons|car|cdr|cond|lambda|lambda*|syntax-rules|format|set!|quote|eval|append|list|list?|member?|load"; + + var keywordMapper = this.createKeywordMapper({ + "keyword.control": keywordControl, + "keyword.operator": keywordOperator, + "constant.language": constantLanguage, + "support.function": supportFunctions + }, "identifier", true); + + this.$rules = + { + "start": [ + { + token : "comment", + regex : ";.*$" + }, + { + "token": ["storage.type.function-type.scheme", "text", "entity.name.function.scheme"], + "regex": "(?:\\b(?:(define|define-syntax|define-macro))\\b)(\\s+)((?:\\w|\\-|\\!|\\?)*)" + }, + { + "token": "punctuation.definition.constant.character.scheme", + "regex": "#:\\S+" + }, + { + "token": ["punctuation.definition.variable.scheme", "variable.other.global.scheme", "punctuation.definition.variable.scheme"], + "regex": "(\\*)(\\S*)(\\*)" + }, + { + "token" : "constant.numeric", // hex + "regex" : "#[xXoObB][0-9a-fA-F]+" + }, + { + "token" : "constant.numeric", // float + "regex" : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?" + }, + { + "token" : keywordMapper, + "regex" : "[a-zA-Z_#][a-zA-Z0-9_\\-\\?\\!\\*]*" + }, + { + "token" : "string", + "regex" : '"(?=.)', + "next" : "qqstring" + } + ], + "qqstring": [ + { + "token": "constant.character.escape.scheme", + "regex": "\\\\." + }, + { + "token" : "string", + "regex" : '[^"\\\\]+', + "merge" : true + }, { + "token" : "string", + "regex" : "\\\\$", + "next" : "qqstring", + "merge" : true + }, { + "token" : "string", + "regex" : '"|$', + "next" : "start", + "merge" : true + } + ] +} + +}; + +oop.inherits(SchemeHighlightRules, TextHighlightRules); + +exports.SchemeHighlightRules = SchemeHighlightRules; +}); diff --git a/0.0.3_0/ace/mode-scss.js b/0.0.3_0/ace/mode-scss.js new file mode 100644 index 0000000..c671daf --- /dev/null +++ b/0.0.3_0/ace/mode-scss.js @@ -0,0 +1,832 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2010, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/mode/scss', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/scss_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/mode/behaviour/css', 'ace/mode/folding/cstyle'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var ScssHighlightRules = require("./scss_highlight_rules").ScssHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var CssBehaviour = require("./behaviour/css").CssBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new ScssHighlightRules().getRules()); + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CssBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + var tokens = this.$tokenizer.getLineTokens(line, state).tokens; + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + var match = line.match(/^.*\{\s*$/); + if (match) { + indent += tab; + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; + +}); + +ace.define('ace/mode/scss_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var ScssHighlightRules = function() { + + var properties = lang.arrayToMap( (function () { + + var browserPrefix = ("-webkit-|-moz-|-o-|-ms-|-svg-|-pie-|-khtml-").split("|"); + + var prefixProperties = ("appearance|background-clip|background-inline-policy|background-origin|" + + "background-size|binding|border-bottom-colors|border-left-colors|" + + "border-right-colors|border-top-colors|border-end|border-end-color|" + + "border-end-style|border-end-width|border-image|border-start|" + + "border-start-color|border-start-style|border-start-width|box-align|" + + "box-direction|box-flex|box-flexgroup|box-ordinal-group|box-orient|" + + "box-pack|box-sizing|column-count|column-gap|column-width|column-rule|" + + "column-rule-width|column-rule-style|column-rule-color|float-edge|" + + "font-feature-settings|font-language-override|force-broken-image-icon|" + + "image-region|margin-end|margin-start|opacity|outline|outline-color|" + + "outline-offset|outline-radius|outline-radius-bottomleft|" + + "outline-radius-bottomright|outline-radius-topleft|outline-radius-topright|" + + "outline-style|outline-width|padding-end|padding-start|stack-sizing|" + + "tab-size|text-blink|text-decoration-color|text-decoration-line|" + + "text-decoration-style|transform|transform-origin|transition|" + + "transition-delay|transition-duration|transition-property|" + + "transition-timing-function|user-focus|user-input|user-modify|user-select|" + + "window-shadow|border-radius").split("|"); + + var properties = ("azimuth|background-attachment|background-color|background-image|" + + "background-position|background-repeat|background|border-bottom-color|" + + "border-bottom-style|border-bottom-width|border-bottom|border-collapse|" + + "border-color|border-left-color|border-left-style|border-left-width|" + + "border-left|border-right-color|border-right-style|border-right-width|" + + "border-right|border-spacing|border-style|border-top-color|" + + "border-top-style|border-top-width|border-top|border-width|border|bottom|" + + "box-shadow|box-sizing|caption-side|clear|clip|color|content|counter-increment|" + + "counter-reset|cue-after|cue-before|cue|cursor|direction|display|" + + "elevation|empty-cells|float|font-family|font-size-adjust|font-size|" + + "font-stretch|font-style|font-variant|font-weight|font|height|left|" + + "letter-spacing|line-height|list-style-image|list-style-position|" + + "list-style-type|list-style|margin-bottom|margin-left|margin-right|" + + "margin-top|marker-offset|margin|marks|max-height|max-width|min-height|" + + "min-width|opacity|orphans|outline-color|" + + "outline-style|outline-width|outline|overflow|overflow-x|overflow-y|padding-bottom|" + + "padding-left|padding-right|padding-top|padding|page-break-after|" + + "page-break-before|page-break-inside|page|pause-after|pause-before|" + + "pause|pitch-range|pitch|play-during|position|quotes|richness|right|" + + "size|speak-header|speak-numeral|speak-punctuation|speech-rate|speak|" + + "stress|table-layout|text-align|text-decoration|text-indent|" + + "text-shadow|text-transform|top|unicode-bidi|vertical-align|" + + "visibility|voice-family|volume|white-space|widows|width|word-spacing|" + + "z-index").split("|"); + var ret = []; + for (var i=0, ln=browserPrefix.length; i|<=|>=|==|!=|-|%|#|\\+|\\$|\\+|\\*" + }, { + token : "paren.lparen", + regex : "[[({]" + }, { + token : "paren.rparen", + regex : "[\\])}]" + }, { + token : "text", + regex : "\\s+" + }, { + caseInsensitive: true + } + ], + "comment" : [ + { + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "start" + }, { + token : "comment", // comment spanning whole line + regex : ".+" + } + ], + "qqstring" : [ + { + token : "string", + regex : '(?:(?:\\\\.)|(?:[^"\\\\]))*?"', + next : "start" + }, { + token : "string", + regex : '.+' + } + ], + "qstring" : [ + { + token : "string", + regex : "(?:(?:\\\\.)|(?:[^'\\\\]))*?'", + next : "start" + }, { + token : "string", + regex : '.+' + } + ] + }; +}; + +oop.inherits(ScssHighlightRules, TextHighlightRules); + +exports.ScssHighlightRules = ScssHighlightRules; + +}); + +ace.define('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) { + + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define('ace/mode/behaviour/css', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/mode/behaviour/cstyle', 'ace/token_iterator'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var CstyleBehaviour = require("./cstyle").CstyleBehaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; + +var CssBehaviour = function () { + + this.inherit(CstyleBehaviour); + + this.add("colon", "insertion", function (state, action, editor, session, text) { + if (text === ':') { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + if (token && token.value.match(/\s+/)) { + token = iterator.stepBackward(); + } + if (token && token.type === 'support.type') { + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar === ':') { + return { + text: '', + selection: [1, 1] + } + } + if (!line.substring(cursor.column).match(/^\s*;/)) { + return { + text: ':;', + selection: [1, 1] + } + } + } + } + }); + + this.add("colon", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected === ':') { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + if (token && token.value.match(/\s+/)) { + token = iterator.stepBackward(); + } + if (token && token.type === 'support.type') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar === ';') { + range.end.column ++; + return range; + } + } + } + }); + + this.add("semicolon", "insertion", function (state, action, editor, session, text) { + if (text === ';') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar === ';') { + return { + text: '', + selection: [1, 1] + } + } + } + }); + +} +oop.inherits(CssBehaviour, CstyleBehaviour); + +exports.CssBehaviour = CssBehaviour; +}); + +ace.define('ace/mode/behaviour/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/token_iterator', 'ace/lib/lang'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; +var lang = require("../../lib/lang"); + +var SAFE_INSERT_IN_TOKENS = + ["text", "paren.rparen", "punctuation.operator"]; +var SAFE_INSERT_BEFORE_TOKENS = + ["text", "paren.rparen", "punctuation.operator", "comment"]; + + +var autoInsertedBrackets = 0; +var autoInsertedRow = -1; +var autoInsertedLineEnd = ""; +var maybeInsertedBrackets = 0; +var maybeInsertedRow = -1; +var maybeInsertedLineStart = ""; +var maybeInsertedLineEnd = ""; + +var CstyleBehaviour = function () { + + CstyleBehaviour.isSaneInsertion = function(editor, session) { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + if (!this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) { + var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1); + if (!this.$matchTokenType(iterator2.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) + return false; + } + iterator.stepForward(); + return iterator.getCurrentTokenRow() !== cursor.row || + this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_BEFORE_TOKENS); + }; + + CstyleBehaviour.$matchTokenType = function(token, types) { + return types.indexOf(token.type || token) > -1; + }; + + CstyleBehaviour.recordAutoInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isAutoInsertedClosing(cursor, line, autoInsertedLineEnd[0])) + autoInsertedBrackets = 0; + autoInsertedRow = cursor.row; + autoInsertedLineEnd = bracket + line.substr(cursor.column); + autoInsertedBrackets++; + }; + + CstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isMaybeInsertedClosing(cursor, line)) + maybeInsertedBrackets = 0; + maybeInsertedRow = cursor.row; + maybeInsertedLineStart = line.substr(0, cursor.column) + bracket; + maybeInsertedLineEnd = line.substr(cursor.column); + maybeInsertedBrackets++; + }; + + CstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) { + return autoInsertedBrackets > 0 && + cursor.row === autoInsertedRow && + bracket === autoInsertedLineEnd[0] && + line.substr(cursor.column) === autoInsertedLineEnd; + }; + + CstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) { + return maybeInsertedBrackets > 0 && + cursor.row === maybeInsertedRow && + line.substr(cursor.column) === maybeInsertedLineEnd && + line.substr(0, cursor.column) == maybeInsertedLineStart; + }; + + CstyleBehaviour.popAutoInsertedClosing = function() { + autoInsertedLineEnd = autoInsertedLineEnd.substr(1); + autoInsertedBrackets--; + }; + + CstyleBehaviour.clearMaybeInsertedClosing = function() { + maybeInsertedBrackets = 0; + maybeInsertedRow = -1; + }; + + this.add("braces", "insertion", function (state, action, editor, session, text) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (text == '{') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "{" && editor.getWrapBehavioursEnabled()) { + return { + text: '{' + selected + '}', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + if (/[\]\}\)]/.test(line[cursor.column])) { + CstyleBehaviour.recordAutoInsert(editor, session, "}"); + return { + text: '{}', + selection: [1, 1] + }; + } else { + CstyleBehaviour.recordMaybeInsert(editor, session, "{"); + return { + text: '{', + selection: [1, 1] + }; + } + } + } else if (text == '}') { + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}') { + var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } else if (text == "\n" || text == "\r\n") { + var closing = ""; + if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) { + closing = lang.stringRepeat("}", maybeInsertedBrackets); + CstyleBehaviour.clearMaybeInsertedClosing(); + } + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}' || closing !== "") { + var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column}, '}'); + if (!openBracePos) + return null; + + var indent = this.getNextLineIndent(state, line.substring(0, cursor.column), session.getTabString()); + var next_indent = this.$getIndent(line); + + return { + text: '\n' + indent + '\n' + next_indent + closing, + selection: [1, indent.length, 1, indent.length] + }; + } + } + }); + + this.add("braces", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '{') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar == '}') { + range.end.column++; + return range; + } else { + maybeInsertedBrackets--; + } + } + }); + + this.add("parens", "insertion", function (state, action, editor, session, text) { + if (text == '(') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return { + text: '(' + selected + ')', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, ")"); + return { + text: '()', + selection: [1, 1] + }; + } + } else if (text == ')') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ')') { + var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("parens", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '(') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ')') { + range.end.column++; + return range; + } + } + }); + + this.add("brackets", "insertion", function (state, action, editor, session, text) { + if (text == '[') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return { + text: '[' + selected + ']', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, "]"); + return { + text: '[]', + selection: [1, 1] + }; + } + } else if (text == ']') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ']') { + var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("brackets", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '[') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ']') { + range.end.column++; + return range; + } + } + }); + + this.add("string_dquotes", "insertion", function (state, action, editor, session, text) { + if (text == '"' || text == "'") { + var quote = text; + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "'" && selected != '"' && editor.getWrapBehavioursEnabled()) { + return { + text: quote + selected + quote, + selection: false + }; + } else { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var leftChar = line.substring(cursor.column-1, cursor.column); + if (leftChar == '\\') { + return null; + } + var tokens = session.getTokens(selection.start.row); + var col = 0, token; + var quotepos = -1; // Track whether we're inside an open quote. + + for (var x = 0; x < tokens.length; x++) { + token = tokens[x]; + if (token.type == "string") { + quotepos = -1; + } else if (quotepos < 0) { + quotepos = token.value.indexOf(quote); + } + if ((token.value.length + col) > selection.start.column) { + break; + } + col += tokens[x].value.length; + } + if (!token || (quotepos < 0 && token.type !== "comment" && (token.type !== "string" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) { + if (!CstyleBehaviour.isSaneInsertion(editor, session)) + return; + return { + text: quote + quote, + selection: [1,1] + }; + } else if (token && token.type === "string") { + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == quote) { + return { + text: '', + selection: [1, 1] + }; + } + } + } + } + }); + + this.add("string_dquotes", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && (selected == '"' || selected == "'")) { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == selected) { + range.end.column++; + return range; + } + } + }); + +}; + +oop.inherits(CstyleBehaviour, Behaviour); + +exports.CstyleBehaviour = CstyleBehaviour; +}); + +ace.define('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var line = session.getLine(row); + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i + match[0].length, 1); + } + + if (foldStyle !== "markbeginend") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + +}).call(FoldMode.prototype); + +}); diff --git a/0.0.3_0/ace/mode-sh.js b/0.0.3_0/ace/mode-sh.js new file mode 100644 index 0000000..7edf7bc --- /dev/null +++ b/0.0.3_0/ace/mode-sh.js @@ -0,0 +1,204 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2010, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/mode/sh', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/sh_highlight_rules', 'ace/range'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var ShHighlightRules = require("./sh_highlight_rules").ShHighlightRules; +var Range = require("../range").Range; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new ShHighlightRules().getRules()); +}; +oop.inherits(Mode, TextMode); + +(function() { + + + this.lineCommentStart = "#"; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.$tokenizer.getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start") { + var match = line.match(/^.*[\{\(\[\:]\s*$/); + if (match) { + indent += tab; + } + } + + return indent; + }; + + var outdents = { + "pass": 1, + "return": 1, + "raise": 1, + "break": 1, + "continue": 1 + }; + + this.checkOutdent = function(state, line, input) { + if (input !== "\r\n" && input !== "\r" && input !== "\n") + return false; + + var tokens = this.$tokenizer.getLineTokens(line.trim(), state).tokens; + + if (!tokens) + return false; + do { + var last = tokens.pop(); + } while (last && (last.type == "comment" || (last.type == "text" && last.value.match(/^\s+$/)))); + + if (!last) + return false; + + return (last.type == "keyword" && outdents[last.value]); + }; + + this.autoOutdent = function(state, doc, row) { + + row += 1; + var indent = this.$getIndent(doc.getLine(row)); + var tab = doc.getTabString(); + if (indent.slice(-tab.length) == tab) + doc.remove(new Range(row, indent.length-tab.length, row, indent.length)); + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/sh_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var reservedKeywords = exports.reservedKeywords = ( + '!|{|}|case|do|done|elif|else|'+ + 'esac|fi|for|if|in|then|until|while|'+ + '&|;|export|local|read|typeset|unset|'+ + 'elif|select|set' + ); + +var languageConstructs = exports.languageConstructs = ( + '[|]|alias|bg|bind|break|builtin|'+ + 'cd|command|compgen|complete|continue|'+ + 'dirs|disown|echo|enable|eval|exec|'+ + 'exit|fc|fg|getopts|hash|help|history|'+ + 'jobs|kill|let|logout|popd|printf|pushd|'+ + 'pwd|return|set|shift|shopt|source|'+ + 'suspend|test|times|trap|type|ulimit|'+ + 'umask|unalias|wait' +); + +var ShHighlightRules = function() { + var keywordMapper = this.createKeywordMapper({ + "keyword": reservedKeywords, + "support.function.builtin": languageConstructs, + "invalid.deprecated": "debugger" + }, "identifier"); + + var integer = "(?:(?:[1-9]\\d*)|(?:0))"; + + var fraction = "(?:\\.\\d+)"; + var intPart = "(?:\\d+)"; + var pointFloat = "(?:(?:" + intPart + "?" + fraction + ")|(?:" + intPart + "\\.))"; + var exponentFloat = "(?:(?:" + pointFloat + "|" + intPart + ")" + ")"; + var floatNumber = "(?:" + exponentFloat + "|" + pointFloat + ")"; + var fileDescriptor = "(?:&" + intPart + ")"; + + var variableName = "[a-zA-Z][a-zA-Z0-9_]*"; + var variable = "(?:(?:\\$" + variableName + ")|(?:" + variableName + "=))"; + + var builtinVariable = "(?:\\$(?:SHLVL|\\$|\\!|\\?))"; + + var func = "(?:" + variableName + "\\s*\\(\\))"; + + this.$rules = { + "start" : [ { + token : ["text", "comment"], + regex : /(^|\s)(#.*)$/ + }, { + token : "string", // " string + regex : '"(?:[^\\\\]|\\\\.)*?"' + }, { + token : "variable.language", + regex : builtinVariable + }, { + token : "variable", + regex : variable + }, { + token : "support.function", + regex : func + }, { + token : "support.function", + regex : fileDescriptor + }, { + token : "string", // ' string + regex : "'(?:[^\\\\]|\\\\.)*?'" + }, { + token : "constant.numeric", // float + regex : floatNumber + }, { + token : "constant.numeric", // integer + regex : integer + "\\b" + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "keyword.operator", + regex : "\\+|\\-|\\*|\\*\\*|\\/|\\/\\/|~|<|>|<=|=>|=|!=" + }, { + token : "paren.lparen", + regex : "[\\[\\(\\{]" + }, { + token : "paren.rparen", + regex : "[\\]\\)\\}]" + } ] + }; +}; + +oop.inherits(ShHighlightRules, TextHighlightRules); + +exports.ShHighlightRules = ShHighlightRules; +}); diff --git a/0.0.3_0/ace/mode-snippets.js b/0.0.3_0/ace/mode-snippets.js new file mode 100644 index 0000000..e85051e --- /dev/null +++ b/0.0.3_0/ace/mode-snippets.js @@ -0,0 +1,200 @@ +ace.define('ace/mode/snippets', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/text_highlight_rules', 'ace/mode/folding/coffee'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var SnippetHighlightRules = function() { + + var builtins = "SELECTION|CURRENT_WORD|SELECTED_TEXT|CURRENT_LINE|LINE_INDEX|" + + "LINE_NUMBER|SOFT_TABS|TAB_SIZE|FILENAME|FILEPATH|FULLNAME"; + + this.$rules = { + "start" : [ + {token:"constant.language.escape", regex: /\\[\$}`\\]/}, + {token:"keyword", regex: "\\$(?:TM_)?(?:" + builtins + ")\\b"}, + {token:"variable", regex: "\\$\\w+"}, + {onMatch: function(value, state, stack) { + if (stack[1]) + stack[1]++; + else + stack.unshift(state, 1); + return this.tokenName; + }, tokenName: "markup.list", regex: "\\${", next: "varDecl"}, + {onMatch: function(value, state, stack) { + if (!stack[1]) + return "text"; + stack[1]--; + if (!stack[1]) + stack.splice(0,2); + return this.tokenName; + }, tokenName: "markup.list", regex: "}"}, + {token: "doc.comment", regex:/^\${2}-{5,}$/} + ], + "varDecl" : [ + {regex: /\d+\b/, token: "constant.numeric"}, + {token:"keyword", regex: "(?:TM_)?(?:" + builtins + ")\\b"}, + {token:"variable", regex: "\\w+"}, + {regex: /:/, token: "punctuation.operator", next: "start"}, + {regex: /\//, token: "string.regex", next: "regexp"}, + {regex: "", next: "start"} + ], + "regexp" : [ + {regex: /\\./, token: "escape"}, + {regex: /\[/, token: "regex.start", next: "charClass"}, + {regex: "/", token: "string.regex", next: "format"}, + {"token": "string.regex", regex:"."} + ], + charClass : [ + {regex: "\\.", token: "escape"}, + {regex: "\\]", token: "regex.end", next: "regexp"}, + {"token": "string.regex", regex:"."} + ], + "format" : [ + {regex: /\\[ulULE]/, token: "keyword"}, + {regex: /\$\d+/, token: "variable"}, + {regex: "/[gim]*:?", token: "string.regex", next: "start"}, + {"token": "string", regex:"."} + ] + }; +}; +oop.inherits(SnippetHighlightRules, TextHighlightRules); + +exports.SnippetHighlightRules = SnippetHighlightRules; + +var SnippetGroupHighlightRules = function() { + this.$rules = { + "start" : [ + {token: "text", regex: "^\\t", next: "sn-start"}, + {token:"invalid", regex: /^ \s*/}, + {token:"comment", regex: /^#.*/}, + {token:"constant.language.escape", regex: "^regex ", next: "regex"}, + {token:"constant.language.escape", regex: "^(trigger|endTrigger|name|snippet|guard|endGuard|tabTrigger|key)\\b"} + ], + "regex" : [ + {token:"text", regex: "\\."}, + {token:"keyword", regex: "/"}, + {token:"empty", regex: "$", next: "start"} + ] + }; + this.embedRules(SnippetHighlightRules, "sn-", [ + {token: "text", regex: "^\\t", next: "sn-start"}, + {onMatch: function(value, state, stack) { + stack.splice(stack.length); + return this.tokenName; + }, tokenName: "text", regex: "^(?!\t)", next: "start"}, + ]) + +}; + +oop.inherits(SnippetGroupHighlightRules, TextHighlightRules); + +exports.SnippetGroupHighlightRules = SnippetGroupHighlightRules; + +var FoldMode = require("./folding/coffee").FoldMode; + +var Mode = function() { + var highlighter = new SnippetGroupHighlightRules(); + this.foldingRules = new FoldMode(); + this.$tokenizer = new Tokenizer(highlighter.getRules()); +}; +oop.inherits(Mode, TextMode); + +(function() { + this.getNextLineIndent = function(state, line, tab) { + return this.$getIndent(line); + }; +}).call(Mode.prototype); +exports.Mode = Mode; + + +}); + +ace.define('ace/mode/folding/coffee', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/folding/fold_mode', 'ace/range'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var BaseFoldMode = require("./fold_mode").FoldMode; +var Range = require("../../range").Range; + +var FoldMode = exports.FoldMode = function() {}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var range = this.indentationBlock(session, row); + if (range) + return range; + + var re = /\S/; + var line = session.getLine(row); + var startLevel = line.search(re); + if (startLevel == -1 || line[startLevel] != "#") + return; + + var startColumn = line.length; + var maxRow = session.getLength(); + var startRow = row; + var endRow = row; + + while (++row < maxRow) { + line = session.getLine(row); + var level = line.search(re); + + if (level == -1) + continue; + + if (line[level] != "#") + break; + + endRow = row; + } + + if (endRow > startRow) { + var endColumn = session.getLine(endRow).length; + return new Range(startRow, startColumn, endRow, endColumn); + } + }; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + var indent = line.search(/\S/); + var next = session.getLine(row + 1); + var prev = session.getLine(row - 1); + var prevIndent = prev.search(/\S/); + var nextIndent = next.search(/\S/); + + if (indent == -1) { + session.foldWidgets[row - 1] = prevIndent!= -1 && prevIndent < nextIndent ? "start" : ""; + return ""; + } + if (prevIndent == -1) { + if (indent == nextIndent && line[indent] == "#" && next[indent] == "#") { + session.foldWidgets[row - 1] = ""; + session.foldWidgets[row + 1] = ""; + return "start"; + } + } else if (prevIndent == indent && line[indent] == "#" && prev[indent] == "#") { + if (session.getLine(row - 2).search(/\S/) == -1) { + session.foldWidgets[row - 1] = "start"; + session.foldWidgets[row + 1] = ""; + return ""; + } + } + + if (prevIndent!= -1 && prevIndent < indent) + session.foldWidgets[row - 1] = "start"; + else + session.foldWidgets[row - 1] = ""; + + if (indent < nextIndent) + return "start"; + else + return ""; + }; + +}).call(FoldMode.prototype); + +}); diff --git a/0.0.3_0/ace/mode-sql.js b/0.0.3_0/ace/mode-sql.js new file mode 100644 index 0000000..43a02cb --- /dev/null +++ b/0.0.3_0/ace/mode-sql.js @@ -0,0 +1,118 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2010, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/mode/sql', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/sql_highlight_rules', 'ace/range'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var SqlHighlightRules = require("./sql_highlight_rules").SqlHighlightRules; +var Range = require("../range").Range; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new SqlHighlightRules().getRules()); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "--"; + +}).call(Mode.prototype); + +exports.Mode = Mode; + +}); + +ace.define('ace/mode/sql_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var SqlHighlightRules = function() { + + var keywords = ( + "select|insert|update|delete|from|where|and|or|group|by|order|limit|offset|having|as|case|" + + "when|else|end|type|left|right|join|on|outer|desc|asc" + ); + + var builtinConstants = ( + "true|false|null" + ); + + var builtinFunctions = ( + "count|min|max|avg|sum|rank|now|coalesce" + ); + + var keywordMapper = this.createKeywordMapper({ + "support.function": builtinFunctions, + "keyword": keywords, + "constant.language": builtinConstants + }, "identifier", true); + + this.$rules = { + "start" : [ { + token : "comment", + regex : "--.*$" + }, { + token : "string", // " string + regex : '".*?"' + }, { + token : "string", // ' string + regex : "'.*?'" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "keyword.operator", + regex : "\\+|\\-|\\/|\\/\\/|%|<@>|@>|<@|&|\\^|~|<|>|<=|=>|==|!=|<>|=" + }, { + token : "paren.lparen", + regex : "[\\(]" + }, { + token : "paren.rparen", + regex : "[\\)]" + }, { + token : "text", + regex : "\\s+" + } ] + }; +}; + +oop.inherits(SqlHighlightRules, TextHighlightRules); + +exports.SqlHighlightRules = SqlHighlightRules; +}); + diff --git a/0.0.3_0/ace/mode-stylus.js b/0.0.3_0/ace/mode-stylus.js new file mode 100644 index 0000000..97d75b4 --- /dev/null +++ b/0.0.3_0/ace/mode-stylus.js @@ -0,0 +1,483 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2012, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * + * Contributor(s): + * + * + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/mode/stylus', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/stylus_highlight_rules', 'ace/mode/folding/coffee'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var StylusHighlightRules = require("./stylus_highlight_rules").StylusHighlightRules; +var FoldMode = require("./folding/coffee").FoldMode; + +var Mode = function() { + var highlighter = new StylusHighlightRules(); + this.foldingRules = new FoldMode(); + + this.$tokenizer = new Tokenizer(highlighter.getRules()); +}; +oop.inherits(Mode, TextMode); + +(function() { +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/stylus_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules', 'ace/mode/css_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var CssHighlightRules = require("./css_highlight_rules"); + +var StylusHighlightRules = function() { + + var keywordMapper = this.createKeywordMapper({ + "support.type": CssHighlightRules.supportType, + "support.function": CssHighlightRules.supportFunction, + "support.constant": CssHighlightRules.supportConstant, + "support.constant.color": CssHighlightRules.supportConstantColor, + "support.constant.fonts": CssHighlightRules.supportConstantFonts + }, "text", true); + + this.$rules = { + start: [ + { + token : "comment", + regex : /\/\/.*$/ + }, + { + token : "comment", // multi line comment + regex : /\/\*/, + next : "comment" + }, + { + token: ["entity.name.function.stylus", "text"], + regex: "^([-a-zA-Z_][-\\w]*)?(\\()" + }, + { + token: ["entity.other.attribute-name.class.stylus"], + regex: "\\.-?[_a-zA-Z]+[_a-zA-Z0-9-]*" + }, + { + token: ["entity.language.stylus"], + regex: "^ *&" + }, + { + token: ["variable.language.stylus"], + regex: "(arguments)" + }, + { + token: ["keyword.stylus"], + regex: "@[-\\w]+" + }, + { + token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"], + regex : CssHighlightRules.pseudoElements + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"], + regex : CssHighlightRules.pseudoClasses + }, + { + token: ["entity.name.tag.stylus"], + regex: "(?:\\b)(a|abbr|acronym|address|area|article|aside|audio|b|base|big|blockquote|body|br|button|canvas|caption|cite|code|col|colgroup|datalist|dd|del|details|dfn|dialog|div|dl|dt|em|eventsource|fieldset|figure|figcaption|footer|form|frame|frameset|(?:h[1-6])|head|header|hgroup|hr|html|i|iframe|img|input|ins|kbd|label|legend|li|link|map|mark|menu|meta|meter|nav|noframes|noscript|object|ol|optgroup|option|output|p|param|pre|progress|q|samp|script|section|select|small|span|strike|strong|style|sub|summary|sup|table|tbody|td|textarea|tfoot|th|thead|time|title|tr|tt|ul|var|video)(?:\\b)" + }, + { + token : "constant.numeric", // hex6 color + regex : "#[a-f0-9]{6}" + }, + { + token : "constant.numeric", // hex3 color + regex : "#[a-f0-9]{3}" + }, + { + token: ["punctuation.definition.entity.stylus", "entity.other.attribute-name.id.stylus"], + regex: "(#)([a-zA-Z][a-zA-Z0-9_-]*)" + }, + { + token: "meta.vendor-prefix.stylus", + regex: "-webkit-|-moz\\-|-ms-|-o-" + }, + { + token: "keyword.control.stylus", + regex: "(?:!important|for|in|return|true|false|null|if|else|unless|return)\\b" + }, + { + token: "keyword.operator.stylus", + regex: "!|~|\\+|-|(?:\\*)?\\*|\\/|%|(?:\\.)\\.\\.|<|>|(?:=|:|\\?|\\+|-|\\*|\\/|%|<|>)?=|!=" + }, + { + token: "keyword.operator.stylus", + regex: "(?:in|is(?:nt)?|not)\\b" + }, + { + token : "string", + regex : "'(?=.)", + next : "qstring" + }, { + token : "string", + regex : '"(?=.)', + next : "qqstring" + }, + { + token : "constant.numeric", + regex : CssHighlightRules.numRe + }, + { + token : "keyword", + regex : "(?:ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)\\b" + }, + { + token : keywordMapper, + regex : "\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*" + } + ], + "comment" : [ + { + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "start" + }, { + token : "comment", // comment spanning whole line + regex : ".+" + } + ], + "qqstring" : [ + { + token : "string", + regex : '[^"\\\\]+' + }, + { + token : "string", + regex : "\\\\$", + next : "qqstring" + }, + { + token : "string", + regex : '"|$', + next : "start" + } + ], + "qstring" : [ + { + token : "string", + regex : "[^'\\\\]+" + }, + { + token : "string", + regex : "\\\\$", + next : "qstring" + }, + { + token : "string", + regex : "'|$", + next : "start" + } + ] +} + +}; + +oop.inherits(StylusHighlightRules, TextHighlightRules); + +exports.StylusHighlightRules = StylusHighlightRules; +}); + +ace.define('ace/mode/css_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var supportType = exports.supportType = "animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|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|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|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|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index"; +var supportFunction = exports.supportFunction = "rgb|rgba|url|attr|counter|counters"; +var supportConstant = exports.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"; +var supportConstantColor = exports.supportConstantColor = "aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow"; +var supportConstantFonts = exports.supportConstantFonts = "arial|century|comic|courier|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace"; + +var numRe = exports.numRe = "\\-?(?:(?:[0-9]+)|(?:[0-9]*\\.[0-9]+))"; +var pseudoElements = exports.pseudoElements = "(\\:+)\\b(after|before|first-letter|first-line|moz-selection|selection)\\b"; +var pseudoClasses = exports.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"; + +var CssHighlightRules = function() { + + var keywordMapper = this.createKeywordMapper({ + "support.function": supportFunction, + "support.constant": supportConstant, + "support.type": supportType, + "support.constant.color": supportConstantColor, + "support.constant.fonts": supportConstantFonts + }, "text", true); + + var base_ruleset = [ + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "ruleset_comment" + }, { + token : "string", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' + }, { + token : "string", // single line + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" + }, { + token : ["constant.numeric", "keyword"], + regex : "(" + numRe + ")(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 : numRe + }, { + token : "constant.numeric", // hex6 color + regex : "#[a-f0-9]{6}" + }, { + token : "constant.numeric", // hex3 color + regex : "#[a-f0-9]{3}" + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"], + regex : pseudoElements + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"], + regex : pseudoClasses + }, { + token : ["support.function", "string", "support.function"], + regex : "(url\\()(.*)(\\))" + }, { + token : keywordMapper, + regex : "\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*" + }, { + caseInsensitive: true + } + ]; + + var ruleset = lang.copyArray(base_ruleset); + ruleset.unshift({ + token : "paren.rparen", + regex : "\\}", + next: "start" + }); + + var media_ruleset = lang.copyArray( base_ruleset ); + media_ruleset.unshift({ + token : "paren.rparen", + regex : "\\}", + next: "media" + }); + + var base_comment = [{ + token : "comment", // comment spanning whole line + regex : ".+" + }]; + + var comment = lang.copyArray(base_comment); + comment.unshift({ + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "start" + }); + + var media_comment = lang.copyArray(base_comment); + media_comment.unshift({ + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "media" + }); + + var ruleset_comment = lang.copyArray(base_comment); + ruleset_comment.unshift({ + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "ruleset" + }); + + this.$rules = { + "start" : [{ + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment" + }, { + token: "paren.lparen", + regex: "\\{", + next: "ruleset" + }, { + token: "string", + regex: "@.*?{", + next: "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: true + }], + + "media" : [ { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "media_comment" + }, { + token: "paren.lparen", + regex: "\\{", + next: "media_ruleset" + },{ + token: "string", + regex: "\\}", + next: "start" + },{ + 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: true + }], + + "comment" : comment, + + "ruleset" : ruleset, + "ruleset_comment" : ruleset_comment, + + "media_ruleset" : media_ruleset, + "media_comment" : media_comment + }; +}; + +oop.inherits(CssHighlightRules, TextHighlightRules); + +exports.CssHighlightRules = CssHighlightRules; + +}); + +ace.define('ace/mode/folding/coffee', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/folding/fold_mode', 'ace/range'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var BaseFoldMode = require("./fold_mode").FoldMode; +var Range = require("../../range").Range; + +var FoldMode = exports.FoldMode = function() {}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var range = this.indentationBlock(session, row); + if (range) + return range; + + var re = /\S/; + var line = session.getLine(row); + var startLevel = line.search(re); + if (startLevel == -1 || line[startLevel] != "#") + return; + + var startColumn = line.length; + var maxRow = session.getLength(); + var startRow = row; + var endRow = row; + + while (++row < maxRow) { + line = session.getLine(row); + var level = line.search(re); + + if (level == -1) + continue; + + if (line[level] != "#") + break; + + endRow = row; + } + + if (endRow > startRow) { + var endColumn = session.getLine(endRow).length; + return new Range(startRow, startColumn, endRow, endColumn); + } + }; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + var indent = line.search(/\S/); + var next = session.getLine(row + 1); + var prev = session.getLine(row - 1); + var prevIndent = prev.search(/\S/); + var nextIndent = next.search(/\S/); + + if (indent == -1) { + session.foldWidgets[row - 1] = prevIndent!= -1 && prevIndent < nextIndent ? "start" : ""; + return ""; + } + if (prevIndent == -1) { + if (indent == nextIndent && line[indent] == "#" && next[indent] == "#") { + session.foldWidgets[row - 1] = ""; + session.foldWidgets[row + 1] = ""; + return "start"; + } + } else if (prevIndent == indent && line[indent] == "#" && prev[indent] == "#") { + if (session.getLine(row - 2).search(/\S/) == -1) { + session.foldWidgets[row - 1] = "start"; + session.foldWidgets[row + 1] = ""; + return ""; + } + } + + if (prevIndent!= -1 && prevIndent < indent) + session.foldWidgets[row - 1] = "start"; + else + session.foldWidgets[row - 1] = ""; + + if (indent < nextIndent) + return "start"; + else + return ""; + }; + +}).call(FoldMode.prototype); + +}); diff --git a/0.0.3_0/ace/mode-svg.js b/0.0.3_0/ace/mode-svg.js new file mode 100644 index 0000000..f5896a7 --- /dev/null +++ b/0.0.3_0/ace/mode-svg.js @@ -0,0 +1,1441 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2010, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/mode/svg', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/xml', 'ace/mode/javascript', 'ace/tokenizer', 'ace/mode/svg_highlight_rules', 'ace/mode/folding/mixed', 'ace/mode/folding/xml', 'ace/mode/folding/cstyle'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var XmlMode = require("./xml").Mode; +var JavaScriptMode = require("./javascript").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var SvgHighlightRules = require("./svg_highlight_rules").SvgHighlightRules; +var MixedFoldMode = require("./folding/mixed").FoldMode; +var XmlFoldMode = require("./folding/xml").FoldMode; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + XmlMode.call(this); + + this.highlighter = new SvgHighlightRules(); + this.$tokenizer = new Tokenizer(this.highlighter.getRules()); + + this.$embeds = this.highlighter.getEmbeds(); + this.createModeDelegates({ + "js-": JavaScriptMode + }); + + this.foldingRules = new MixedFoldMode(new XmlFoldMode({}), { + "js-": new CStyleFoldMode() + }); +}; + +oop.inherits(Mode, XmlMode); + +(function() { + + this.getNextLineIndent = function(state, line, tab) { + return this.$getIndent(line); + }; + + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/xml', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/xml_highlight_rules', 'ace/mode/behaviour/xml', 'ace/mode/folding/xml'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var XmlHighlightRules = require("./xml_highlight_rules").XmlHighlightRules; +var XmlBehaviour = require("./behaviour/xml").XmlBehaviour; +var XmlFoldMode = require("./folding/xml").FoldMode; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new XmlHighlightRules().getRules()); + this.$behaviour = new XmlBehaviour(); + this.foldingRules = new XmlFoldMode(); +}; + +oop.inherits(Mode, TextMode); + +(function() { + + this.blockComment = {start: ""}; + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/xml_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/xml_util', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var xmlUtil = require("./xml_util"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var XmlHighlightRules = function() { + this.$rules = { + start : [ + {token : "text", regex : "<\\!\\[CDATA\\[", next : "cdata"}, + {token : "xml-pe", regex : "<\\?.*?\\?>"}, + {token : "comment", regex : "<\\!--", next : "comment"}, + {token : "xml-pe", regex : "<\\!.*?>"}, + {token : "meta.tag", regex : "<\\/?", next : "tag"}, + {token : "text", regex : "\\s+"}, + { + token : "constant.character.entity", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + } + ], + + cdata : [ + {token : "text", regex : "\\]\\]>", next : "start"}, + {token : "text", regex : "\\s+"}, + {token : "text", regex : "(?:[^\\]]|\\](?!\\]>))+"} + ], + + comment : [ + {token : "comment", regex : ".*?-->", next : "start"}, + {token : "comment", regex : ".+"} + ] + }; + + xmlUtil.tag(this.$rules, "tag", "start"); +}; + +oop.inherits(XmlHighlightRules, TextHighlightRules); + +exports.XmlHighlightRules = XmlHighlightRules; +}); + +ace.define('ace/mode/xml_util', ['require', 'exports', 'module' ], function(require, exports, module) { + + +function string(state) { + return [{ + token : "string", + regex : '"', + next : state + "_qqstring" + }, { + token : "string", + regex : "'", + next : state + "_qstring" + }]; +} + +function multiLineString(quote, state) { + return [ + {token : "string", regex : quote, next : state}, + { + token : "constant.language.escape", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }, + {defaultToken : "string"} + ]; +} + +exports.tag = function(states, name, nextState, tagMap) { + states[name] = [{ + token : "text", + regex : "\\s+" + }, { + + token : !tagMap ? "meta.tag.tag-name" : function(value) { + if (tagMap[value]) + return "meta.tag.tag-name." + tagMap[value]; + else + return "meta.tag.tag-name"; + }, + regex : "[-_a-zA-Z0-9:]+", + next : name + "_embed_attribute_list" + }, { + token: "empty", + regex: "", + next : name + "_embed_attribute_list" + }]; + + states[name + "_qstring"] = multiLineString("'", name + "_embed_attribute_list"); + states[name + "_qqstring"] = multiLineString("\"", name + "_embed_attribute_list"); + + states[name + "_embed_attribute_list"] = [{ + token : "meta.tag.r", + regex : "/?>", + next : nextState + }, { + token : "keyword.operator", + regex : "=" + }, { + token : "entity.other.attribute-name", + regex : "[-_a-zA-Z0-9:]+" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : "text", + regex : "\\s+" + }].concat(string(name)); +}; + +}); + +ace.define('ace/mode/behaviour/xml', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/mode/behaviour/cstyle', 'ace/token_iterator'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var CstyleBehaviour = require("./cstyle").CstyleBehaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; + +function hasType(token, type) { + var hasType = true; + var typeList = token.type.split('.'); + var needleList = type.split('.'); + needleList.forEach(function(needle){ + if (typeList.indexOf(needle) == -1) { + hasType = false; + return false; + } + }); + return hasType; +} + +var XmlBehaviour = function () { + + this.inherit(CstyleBehaviour, ["string_dquotes"]); // Get string behaviour + + this.add("autoclosing", "insertion", function (state, action, editor, session, text) { + if (text == '>') { + var position = editor.getCursorPosition(); + var iterator = new TokenIterator(session, position.row, position.column); + var token = iterator.getCurrentToken(); + var atCursor = false; + if (!token || !hasType(token, 'meta.tag') && !(hasType(token, 'text') && token.value.match('/'))){ + do { + token = iterator.stepBackward(); + } while (token && (hasType(token, 'string') || hasType(token, 'keyword.operator') || hasType(token, 'entity.attribute-name') || hasType(token, 'text'))); + } else { + atCursor = true; + } + if (!token || !hasType(token, 'meta.tag-name') || iterator.stepBackward().value.match('/')) { + return + } + var tag = token.value; + if (atCursor){ + var tag = tag.substring(0, position.column - token.start); + } + + return { + text: '>' + '', + selection: [1, 1] + } + } + }); + + this.add('autoindent', 'insertion', function (state, action, editor, session, text) { + if (text == "\n") { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChars = line.substring(cursor.column, cursor.column + 2); + if (rightChars == ' -1; + }; + + CstyleBehaviour.recordAutoInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isAutoInsertedClosing(cursor, line, autoInsertedLineEnd[0])) + autoInsertedBrackets = 0; + autoInsertedRow = cursor.row; + autoInsertedLineEnd = bracket + line.substr(cursor.column); + autoInsertedBrackets++; + }; + + CstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isMaybeInsertedClosing(cursor, line)) + maybeInsertedBrackets = 0; + maybeInsertedRow = cursor.row; + maybeInsertedLineStart = line.substr(0, cursor.column) + bracket; + maybeInsertedLineEnd = line.substr(cursor.column); + maybeInsertedBrackets++; + }; + + CstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) { + return autoInsertedBrackets > 0 && + cursor.row === autoInsertedRow && + bracket === autoInsertedLineEnd[0] && + line.substr(cursor.column) === autoInsertedLineEnd; + }; + + CstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) { + return maybeInsertedBrackets > 0 && + cursor.row === maybeInsertedRow && + line.substr(cursor.column) === maybeInsertedLineEnd && + line.substr(0, cursor.column) == maybeInsertedLineStart; + }; + + CstyleBehaviour.popAutoInsertedClosing = function() { + autoInsertedLineEnd = autoInsertedLineEnd.substr(1); + autoInsertedBrackets--; + }; + + CstyleBehaviour.clearMaybeInsertedClosing = function() { + maybeInsertedBrackets = 0; + maybeInsertedRow = -1; + }; + + this.add("braces", "insertion", function (state, action, editor, session, text) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (text == '{') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "{" && editor.getWrapBehavioursEnabled()) { + return { + text: '{' + selected + '}', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + if (/[\]\}\)]/.test(line[cursor.column])) { + CstyleBehaviour.recordAutoInsert(editor, session, "}"); + return { + text: '{}', + selection: [1, 1] + }; + } else { + CstyleBehaviour.recordMaybeInsert(editor, session, "{"); + return { + text: '{', + selection: [1, 1] + }; + } + } + } else if (text == '}') { + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}') { + var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } else if (text == "\n" || text == "\r\n") { + var closing = ""; + if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) { + closing = lang.stringRepeat("}", maybeInsertedBrackets); + CstyleBehaviour.clearMaybeInsertedClosing(); + } + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}' || closing !== "") { + var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column}, '}'); + if (!openBracePos) + return null; + + var indent = this.getNextLineIndent(state, line.substring(0, cursor.column), session.getTabString()); + var next_indent = this.$getIndent(line); + + return { + text: '\n' + indent + '\n' + next_indent + closing, + selection: [1, indent.length, 1, indent.length] + }; + } + } + }); + + this.add("braces", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '{') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar == '}') { + range.end.column++; + return range; + } else { + maybeInsertedBrackets--; + } + } + }); + + this.add("parens", "insertion", function (state, action, editor, session, text) { + if (text == '(') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return { + text: '(' + selected + ')', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, ")"); + return { + text: '()', + selection: [1, 1] + }; + } + } else if (text == ')') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ')') { + var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("parens", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '(') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ')') { + range.end.column++; + return range; + } + } + }); + + this.add("brackets", "insertion", function (state, action, editor, session, text) { + if (text == '[') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return { + text: '[' + selected + ']', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, "]"); + return { + text: '[]', + selection: [1, 1] + }; + } + } else if (text == ']') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ']') { + var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("brackets", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '[') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ']') { + range.end.column++; + return range; + } + } + }); + + this.add("string_dquotes", "insertion", function (state, action, editor, session, text) { + if (text == '"' || text == "'") { + var quote = text; + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "'" && selected != '"' && editor.getWrapBehavioursEnabled()) { + return { + text: quote + selected + quote, + selection: false + }; + } else { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var leftChar = line.substring(cursor.column-1, cursor.column); + if (leftChar == '\\') { + return null; + } + var tokens = session.getTokens(selection.start.row); + var col = 0, token; + var quotepos = -1; // Track whether we're inside an open quote. + + for (var x = 0; x < tokens.length; x++) { + token = tokens[x]; + if (token.type == "string") { + quotepos = -1; + } else if (quotepos < 0) { + quotepos = token.value.indexOf(quote); + } + if ((token.value.length + col) > selection.start.column) { + break; + } + col += tokens[x].value.length; + } + if (!token || (quotepos < 0 && token.type !== "comment" && (token.type !== "string" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) { + if (!CstyleBehaviour.isSaneInsertion(editor, session)) + return; + return { + text: quote + quote, + selection: [1,1] + }; + } else if (token && token.type === "string") { + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == quote) { + return { + text: '', + selection: [1, 1] + }; + } + } + } + } + }); + + this.add("string_dquotes", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && (selected == '"' || selected == "'")) { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == selected) { + range.end.column++; + return range; + } + } + }); + +}; + +oop.inherits(CstyleBehaviour, Behaviour); + +exports.CstyleBehaviour = CstyleBehaviour; +}); + +ace.define('ace/mode/folding/xml', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/range', 'ace/mode/folding/fold_mode', 'ace/token_iterator'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var lang = require("../../lib/lang"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; +var TokenIterator = require("../../token_iterator").TokenIterator; + +var FoldMode = exports.FoldMode = function(voidElements) { + BaseFoldMode.call(this); + this.voidElements = voidElements || {}; +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.getFoldWidget = function(session, foldStyle, row) { + var tag = this._getFirstTagInLine(session, row); + + if (tag.closing) + return foldStyle == "markbeginend" ? "end" : ""; + + if (!tag.tagName || this.voidElements[tag.tagName.toLowerCase()]) + return ""; + + if (tag.selfClosing) + return ""; + + if (tag.value.indexOf("/" + tag.tagName) !== -1) + return ""; + + return "start"; + }; + + this._getFirstTagInLine = function(session, row) { + var tokens = session.getTokens(row); + var value = ""; + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i]; + if (token.type.indexOf("meta.tag") === 0) + value += token.value; + else + value += lang.stringRepeat(" ", token.value.length); + } + + return this._parseTag(value); + }; + + this.tagRe = /^(\s*)(?)/; + this._parseTag = function(tag) { + + var match = tag.match(this.tagRe); + var column = 0; + + return { + value: tag, + match: match ? match[2] : "", + closing: match ? !!match[3] : false, + selfClosing: match ? !!match[5] || match[2] == "/>" : false, + tagName: match ? match[4] : "", + column: match[1] ? column + match[1].length : column + }; + }; + this._readTagForward = function(iterator) { + var token = iterator.getCurrentToken(); + if (!token) + return null; + + var value = ""; + var start; + + do { + if (token.type.indexOf("meta.tag") === 0) { + if (!start) { + var start = { + row: iterator.getCurrentTokenRow(), + column: iterator.getCurrentTokenColumn() + }; + } + value += token.value; + if (value.indexOf(">") !== -1) { + var tag = this._parseTag(value); + tag.start = start; + tag.end = { + row: iterator.getCurrentTokenRow(), + column: iterator.getCurrentTokenColumn() + token.value.length + }; + iterator.stepForward(); + return tag; + } + } + } while(token = iterator.stepForward()); + + return null; + }; + + this._readTagBackward = function(iterator) { + var token = iterator.getCurrentToken(); + if (!token) + return null; + + var value = ""; + var end; + + do { + if (token.type.indexOf("meta.tag") === 0) { + if (!end) { + end = { + row: iterator.getCurrentTokenRow(), + column: iterator.getCurrentTokenColumn() + token.value.length + }; + } + value = token.value + value; + if (value.indexOf("<") !== -1) { + var tag = this._parseTag(value); + tag.end = end; + tag.start = { + row: iterator.getCurrentTokenRow(), + column: iterator.getCurrentTokenColumn() + }; + iterator.stepBackward(); + return tag; + } + } + } while(token = iterator.stepBackward()); + + return null; + }; + + this._pop = function(stack, tag) { + while (stack.length) { + + var top = stack[stack.length-1]; + if (!tag || top.tagName == tag.tagName) { + return stack.pop(); + } + else if (this.voidElements[tag.tagName]) { + return; + } + else if (this.voidElements[top.tagName]) { + stack.pop(); + continue; + } else { + return null; + } + } + }; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var firstTag = this._getFirstTagInLine(session, row); + + if (!firstTag.match) + return null; + + var isBackward = firstTag.closing || firstTag.selfClosing; + var stack = []; + var tag; + + if (!isBackward) { + var iterator = new TokenIterator(session, row, firstTag.column); + var start = { + row: row, + column: firstTag.column + firstTag.tagName.length + 2 + }; + while (tag = this._readTagForward(iterator)) { + if (tag.selfClosing) { + if (!stack.length) { + tag.start.column += tag.tagName.length + 2; + tag.end.column -= 2; + return Range.fromPoints(tag.start, tag.end); + } else + continue; + } + + if (tag.closing) { + this._pop(stack, tag); + if (stack.length == 0) + return Range.fromPoints(start, tag.start); + } + else { + stack.push(tag) + } + } + } + else { + var iterator = new TokenIterator(session, row, firstTag.column + firstTag.match.length); + var end = { + row: row, + column: firstTag.column + }; + + while (tag = this._readTagBackward(iterator)) { + if (tag.selfClosing) { + if (!stack.length) { + tag.start.column += tag.tagName.length + 2; + tag.end.column -= 2; + return Range.fromPoints(tag.start, tag.end); + } else + continue; + } + + if (!tag.closing) { + this._pop(stack, tag); + if (stack.length == 0) { + tag.start.column += tag.tagName.length + 2; + return Range.fromPoints(tag.start, end); + } + } + else { + stack.push(tag) + } + } + } + + }; + +}).call(FoldMode.prototype); + +}); + +ace.define('ace/mode/javascript', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/javascript_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/range', 'ace/worker/worker_client', 'ace/mode/behaviour/cstyle', 'ace/mode/folding/cstyle'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var Range = require("../range").Range; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new JavaScriptHighlightRules().getRules()); + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.$tokenizer.getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start" || state == "no_regex") { + var match = line.match(/^.*(?:\bcase\b.*\:|[\{\(\[])\s*$/); + if (match) { + indent += tab; + } + } else if (state == "doc-start") { + if (endState == "start" || endState == "no_regex") { + return ""; + } + var match = line.match(/^\s*(\/?)\*/); + if (match) { + if (match[1]) { + indent += " "; + } + indent += "* "; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/javascript_worker", "JavaScriptWorker"); + worker.attachToDocument(session.getDocument()); + + worker.on("jslint", function(results) { + session.setAnnotations(results.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +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(require, exports, module) { + + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var JavaScriptHighlightRules = function() { + var keywordMapper = this.createKeywordMapper({ + "variable.language": + "Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|" + // Constructors + "Namespace|QName|XML|XMLList|" + // E4X + "ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|" + + "Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|" + + "Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|" + // Errors + "SyntaxError|TypeError|URIError|" + + "decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|" + // Non-constructor functions + "isNaN|parseFloat|parseInt|" + + "JSON|Math|" + // Other + "this|arguments|prototype|window|document" , // Pseudo + "keyword": + "const|yield|import|get|set|" + + "break|case|catch|continue|default|delete|do|else|finally|for|function|" + + "if|in|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"); + var kwBeforeRe = "case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void"; + var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*\\b"; + + var escapedRe = "\\\\(?:x[0-9a-fA-F]{2}|" + // hex + "u[0-9a-fA-F]{4}|" + // unicode + "[0-2][0-7]{0,2}|" + // oct + "3[0-6][0-7]?|" + // oct + "37[0-7]?|" + // oct + "[4-7][0-7]?|" + //oct + ".)"; + + this.$rules = { + "no_regex" : [ + { + token : "comment", + regex : /\/\/.*$/ + }, + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : /\/\*/, + next : "comment" + }, { + token : "string", + regex : "'(?=.)", + next : "qstring" + }, { + token : "string", + regex : '"(?=.)', + next : "qqstring" + }, { + token : "constant.numeric", // hex + regex : /0[xX][0-9a-fA-F]+\b/ + }, { + token : "constant.numeric", // float + regex : /[+-]?\d+(?:(?:\.\d*)?(?:[eE][+-]?\d+)?)?\b/ + }, { + token : [ + "storage.type", "punctuation.operator", "support.function", + "punctuation.operator", "entity.name.function", "text","keyword.operator" + ], + regex : "(" + identifierRe + ")(\\.)(prototype)(\\.)(" + identifierRe +")(\\s*)(=)", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "keyword.operator", "text", "storage.type", + "text", "paren.lparen" + ], + regex : "(" + identifierRe +")(\\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 : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(function)(\\s+)(" + identifierRe + ")(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "punctuation.operator", + "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\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 : "(?:" + kwBeforeRe + ")\\b", + next : "start" + }, { + token : ["punctuation.operator", "support.function"], + regex : /(\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:opzzzz|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 : ["punctuation.operator", "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)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/ + }, { + token : ["punctuation.operator", "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 : ["storage.type", "punctuation.operator", "support.function.firebug"], + regex : /(console)(\.)(warn|info|log|error|time|timeEnd|assert)\b/ + }, { + token : keywordMapper, + regex : identifierRe + }, { + token : "keyword.operator", + regex : /--|\+\+|[!$%&*+\-~]|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\|\||\?\:|\*=|%=|\+=|\-=|&=|\^=/, + next : "start" + }, { + token : "punctuation.operator", + regex : /\?|\:|\,|\;|\./, + next : "start" + }, { + token : "paren.lparen", + regex : /[\[({]/, + next : "start" + }, { + token : "paren.rparen", + regex : /[\])}]/ + }, { + token : "keyword.operator", + regex : /\/=?/, + next : "start" + }, { + token: "comment", + regex: /^#!.*$/ + } + ], + "start": [ + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment_regex_allowed" + }, { + token : "comment", + regex : "\\/\\/.*$", + next : "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: "/\\w*", + 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.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: identifierRe + }, { + token: "punctuation.operator", + regex: "[, ]+" + }, { + token: "punctuation.operator", + regex: "$" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "comment_regex_allowed" : [ + {token : "comment", regex : "\\*\\/", next : "start"}, + {defaultToken : "comment"} + ], + "comment" : [ + {token : "comment", regex : "\\*\\/", next : "no_regex"}, + {defaultToken : "comment"} + ], + "qqstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + next : "qqstring" + }, { + token : "string", + regex : '"|$', + next : "no_regex" + }, { + defaultToken: "string" + } + ], + "qstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + next : "qstring" + }, { + token : "string", + regex : "'|$", + next : "no_regex" + }, { + defaultToken: "string" + } + ] + }; + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("no_regex") ]); +}; + +oop.inherits(JavaScriptHighlightRules, TextHighlightRules); + +exports.JavaScriptHighlightRules = JavaScriptHighlightRules; +}); + +ace.define('ace/mode/doc_comment_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, { + token : "comment.doc.tag", + regex : "\\bTODO\\b" + }, { + defaultToken : "comment.doc" + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) { + + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var line = session.getLine(row); + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i + match[0].length, 1); + } + + if (foldStyle !== "markbeginend") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define('ace/mode/svg_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/javascript_highlight_rules', 'ace/mode/xml_highlight_rules', 'ace/mode/xml_util'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var XmlHighlightRules = require("./xml_highlight_rules").XmlHighlightRules; +var xmlUtil = require("./xml_util"); + +var SvgHighlightRules = function() { + XmlHighlightRules.call(this); + + this.$rules.start.splice(3, 0, { + token : "meta.tag", + regex : "<(?=script)", + next : "script" + }); + + xmlUtil.tag(this.$rules, "script", "js-start"); + + this.embedRules(JavaScriptHighlightRules, "js-", [{ + token: "comment", + regex: "\\/\\/.*(?=<\\/script>)", + next: "tag" + }, { + token: "meta.tag", + regex: "<\\/(?=script)", + next: "tag" + }]); +}; + +oop.inherits(SvgHighlightRules, XmlHighlightRules); + +exports.SvgHighlightRules = SvgHighlightRules; +}); + +ace.define('ace/mode/folding/mixed', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/folding/fold_mode'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(defaultMode, subModes) { + this.defaultMode = defaultMode; + this.subModes = subModes; +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + + this.$getMode = function(state) { + for (var key in this.subModes) { + if (state.indexOf(key) === 0) + return this.subModes[key]; + } + return null; + }; + + this.$tryMode = function(state, session, foldStyle, row) { + var mode = this.$getMode(state); + return (mode ? mode.getFoldWidget(session, foldStyle, row) : ""); + }; + + this.getFoldWidget = function(session, foldStyle, row) { + return ( + this.$tryMode(session.getState(row-1), session, foldStyle, row) || + this.$tryMode(session.getState(row), session, foldStyle, row) || + this.defaultMode.getFoldWidget(session, foldStyle, row) + ); + }; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var mode = this.$getMode(session.getState(row-1)); + + if (!mode || !mode.getFoldWidget(session, foldStyle, row)) + mode = this.$getMode(session.getState(row)); + + if (!mode || !mode.getFoldWidget(session, foldStyle, row)) + mode = this.defaultMode; + + return mode.getFoldWidgetRange(session, foldStyle, row); + }; + +}).call(FoldMode.prototype); + +}); diff --git a/0.0.3_0/ace/mode-tcl.js b/0.0.3_0/ace/mode-tcl.js new file mode 100644 index 0000000..dc4d6cb --- /dev/null +++ b/0.0.3_0/ace/mode-tcl.js @@ -0,0 +1,319 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2010, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/mode/tcl', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/folding/cstyle', 'ace/mode/tcl_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/range'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; +var TclHighlightRules = require("./tcl_highlight_rules").TclHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var Range = require("../range").Range; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new TclHighlightRules().getRules()); + this.$outdent = new MatchingBraceOutdent(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "#"; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.$tokenizer.getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start") { + var match = line.match(/^.*[\{\(\[]\s*$/); + if (match) { + indent += tab; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var line = session.getLine(row); + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i + match[0].length, 1); + } + + if (foldStyle !== "markbeginend") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define('ace/mode/tcl_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var TclHighlightRules = function() { + + this.$rules = { + "start" : [ + { + token : "comment", + regex : "#.*\\\\$", + next : "commentfollow" + }, { + token : "comment", + regex : "#.*$" + }, { + token : "support.function", + regex : '[\\\\]$', + next : "splitlineStart" + }, { + token : "text", + regex : '[\\\\](?:["]|[{]|[}]|[[]|[]]|[$]|[\])' + }, { + token : "text", // last value before command + regex : '^|[^{][;][^}]|[/\r/]', + next : "commandItem" + }, { + token : "string", // single line + regex : '[ ]*["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' + }, { + token : "string", // multi line """ string start + regex : '[ ]*["]', + next : "qqstring" + }, { + token : "variable.instance", + regex : "[$]", + next : "variable" + }, { + token : "support.function", + regex : "!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|{\\*}|;|::" + }, { + token : "identifier", + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "paren.lparen", + regex : "[[{]", + next : "commandItem" + }, { + token : "paren.lparen", + regex : "[(]" + }, { + token : "paren.rparen", + regex : "[\\])}]" + }, { + token : "text", + regex : "\\s+" + } + ], + "commandItem" : [ + { + token : "comment", + regex : "#.*\\\\$", + next : "commentfollow" + }, { + token : "comment", + regex : "#.*$", + next : "start" + }, { + token : "string", // single line + regex : '[ ]*["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' + }, { + token : "variable.instance", + regex : "[$]", + next : "variable" + }, { + token : "support.function", + regex : "(?:[:][:])[a-zA-Z0-9_/]+(?:[:][:])", + next : "commandItem" + }, { + token : "support.function", + regex : "[a-zA-Z0-9_/]+(?:[:][:])", + next : "commandItem" + }, { + token : "support.function", + regex : "(?:[:][:])", + next : "commandItem" + }, { + token : "paren.rparen", + regex : "[\\])}]" + }, { + token : "support.function", + regex : "!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|{\\*}|;|::" + }, { + token : "keyword", + regex : "[a-zA-Z0-9_/]+", + next : "start" + } ], + "commentfollow" : [ + { + token : "comment", + regex : ".*\\\\$", + next : "commentfollow" + }, { + token : "comment", + regex : '.+', + next : "start" + } ], + "splitlineStart" : [ + { + token : "text", + regex : "^.", + next : "start" + }], + "variable" : [ + { + token : "variable.instance", // variable tcl + regex : "[a-zA-Z_\\d]+(?:[(][a-zA-Z_\\d]+[)])?", + next : "start" + }, { + token : "variable.instance", // variable tcl with braces + regex : "{?[a-zA-Z_\\d]+}?", + next : "start" + }], + "qqstring" : [ { + token : "string", // multi line """ string end + regex : '(?:[^\\\\]|\\\\.)*?["]', + next : "start" + }, { + token : "string", + regex : '.+' + } ] + }; +}; + +oop.inherits(TclHighlightRules, TextHighlightRules); + +exports.TclHighlightRules = TclHighlightRules; +}); + +ace.define('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) { + + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); diff --git a/0.0.3_0/ace/mode-tex.js b/0.0.3_0/ace/mode-tex.js new file mode 100644 index 0000000..b397c70 --- /dev/null +++ b/0.0.3_0/ace/mode-tex.js @@ -0,0 +1,166 @@ +/* + * tex.js + * + * Copyright (C) 2009-11 by RStudio, Inc. + * + * The Initial Developer of the Original Code is + * Ajax.org B.V. + * Portions created by the Initial Developer are Copyright (C) 2010 + * the Initial Developer. All Rights Reserved. + * + * This program is licensed to you under the terms of version 3 of the + * GNU Affero General Public License. This program is distributed WITHOUT + * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT, + * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the + * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details. + * + */ +ace.define('ace/mode/tex', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/text_highlight_rules', 'ace/mode/tex_highlight_rules', 'ace/mode/matching_brace_outdent'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var TexHighlightRules = require("./tex_highlight_rules").TexHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; + +var Mode = function(suppressHighlighting) { + if (suppressHighlighting) + this.$tokenizer = new Tokenizer(new TextHighlightRules().getRules()); + else + this.$tokenizer = new Tokenizer(new TexHighlightRules().getRules()); + this.$outdent = new MatchingBraceOutdent(); +}; +oop.inherits(Mode, TextMode); + +(function() { + this.getNextLineIndent = function(state, line, tab) { + return this.$getIndent(line); + }; + + this.allowAutoInsert = function() { + return false; + }; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); +ace.define('ace/mode/tex_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var TexHighlightRules = function(textClass) { + + if (!textClass) + textClass = "text"; + + this.$rules = { + "start" : [ + { + token : "comment", + regex : "%.*$" + }, { + token : textClass, // non-command + regex : "\\\\[$&%#\\{\\}]" + }, { + token : "keyword", // command + regex : "\\\\(?:documentclass|usepackage|newcounter|setcounter|addtocounter|value|arabic|stepcounter|newenvironment|renewenvironment|ref|vref|eqref|pageref|label|cite[a-zA-Z]*|tag|begin|end|bibitem)\\b", + next : "nospell" + }, { + token : "keyword", // command + regex : "\\\\(?:[a-zA-z0-9]+|[^a-zA-z0-9])" + }, { + token : "paren.keyword.operator", + regex : "[[({]" + }, { + token : "paren.keyword.operator", + regex : "[\\])}]" + }, { + token : textClass, + regex : "\\s+" + } + ], + "nospell" : [ + { + token : "comment", + regex : "%.*$", + next : "start" + }, { + token : "nospell." + textClass, // non-command + regex : "\\\\[$&%#\\{\\}]" + }, { + token : "keyword", // command + regex : "\\\\(?:documentclass|usepackage|newcounter|setcounter|addtocounter|value|arabic|stepcounter|newenvironment|renewenvironment|ref|vref|eqref|pageref|label|cite[a-zA-Z]*|tag|begin|end|bibitem)\\b" + }, { + token : "keyword", // command + regex : "\\\\(?:[a-zA-z0-9]+|[^a-zA-z0-9])", + next : "start" + }, { + token : "paren.keyword.operator", + regex : "[[({]" + }, { + token : "paren.keyword.operator", + regex : "[\\])]" + }, { + token : "paren.keyword.operator", + regex : "}", + next : "start" + }, { + token : "nospell." + textClass, + regex : "\\s+" + }, { + token : "nospell." + textClass, + regex : "\\w+" + } + ] + }; +}; + +oop.inherits(TexHighlightRules, TextHighlightRules); + +exports.TexHighlightRules = TexHighlightRules; +}); + +ace.define('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) { + + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); diff --git a/0.0.3_0/ace/mode-text.js b/0.0.3_0/ace/mode-text.js new file mode 100644 index 0000000..e69de29 diff --git a/0.0.3_0/ace/mode-textile.js b/0.0.3_0/ace/mode-textile.js new file mode 100644 index 0000000..1dbbcd5 --- /dev/null +++ b/0.0.3_0/ace/mode-textile.js @@ -0,0 +1,170 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2010, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/mode/textile', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/textile_highlight_rules', 'ace/mode/matching_brace_outdent'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var TextileHighlightRules = require("./textile_highlight_rules").TextileHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new TextileHighlightRules().getRules()); + this.$outdent = new MatchingBraceOutdent(); +}; +oop.inherits(Mode, TextMode); + +(function() { + this.getNextLineIndent = function(state, line, tab) { + if (state == "intag") + return tab; + + return ""; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; + +}); + +ace.define('ace/mode/textile_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var TextileHighlightRules = function() { + this.$rules = { + "start" : [ + { + token : function(value) { + if (value.charAt(0) == "h") + return "markup.heading." + value.charAt(1); + else + return "markup.heading"; + }, + regex : "h1|h2|h3|h4|h5|h6|bq|p|bc|pre", + next : "blocktag" + }, + { + token : "keyword", + regex : "[\\*]+|[#]+" + }, + { + token : "text", + regex : ".+" + } + ], + "blocktag" : [ + { + token : "keyword", + regex : "\\. ", + next : "start" + }, + { + token : "keyword", + regex : "\\(", + next : "blocktagproperties" + } + ], + "blocktagproperties" : [ + { + token : "keyword", + regex : "\\)", + next : "blocktag" + }, + { + token : "string", + regex : "[a-zA-Z0-9\\-_]+" + }, + { + token : "keyword", + regex : "#" + } + ] + }; +}; + +oop.inherits(TextileHighlightRules, TextHighlightRules); + +exports.TextileHighlightRules = TextileHighlightRules; + +}); + +ace.define('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) { + + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); diff --git a/0.0.3_0/ace/mode-tmsnippet.js b/0.0.3_0/ace/mode-tmsnippet.js new file mode 100644 index 0000000..6dbc79a --- /dev/null +++ b/0.0.3_0/ace/mode-tmsnippet.js @@ -0,0 +1,200 @@ +ace.define('ace/mode/tmsnippet', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/text_highlight_rules', 'ace/mode/folding/coffee'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var SnippetHighlightRules = function() { + + var builtins = "SELECTION|CURRENT_WORD|SELECTED_TEXT|CURRENT_LINE|LINE_INDEX|" + + "LINE_NUMBER|SOFT_TABS|TAB_SIZE|FILENAME|FILEPATH|FULLNAME"; + + this.$rules = { + "start" : [ + {token:"constant.language.escape", regex: /\\[\$}`\\]/}, + {token:"keyword", regex: "\\$(?:TM_)?(?:" + builtins + ")\\b"}, + {token:"variable", regex: "\\$\\w+"}, + {onMatch: function(value, state, stack) { + if (stack[1]) + stack[1]++; + else + stack.unshift(state, 1); + return this.tokenName; + }, tokenName: "markup.list", regex: "\\${", next: "varDecl"}, + {onMatch: function(value, state, stack) { + if (!stack[1]) + return "text"; + stack[1]--; + if (!stack[1]) + stack.splice(0,2); + return this.tokenName; + }, tokenName: "markup.list", regex: "}"}, + {token: "doc.comment", regex:/^\${2}-{5,}$/} + ], + "varDecl" : [ + {regex: /\d+\b/, token: "constant.numeric"}, + {token:"keyword", regex: "(?:TM_)?(?:" + builtins + ")\\b"}, + {token:"variable", regex: "\\w+"}, + {regex: /:/, token: "punctuation.operator", next: "start"}, + {regex: /\//, token: "string.regex", next: "regexp"}, + {regex: "", next: "start"} + ], + "regexp" : [ + {regex: /\\./, token: "escape"}, + {regex: /\[/, token: "regex.start", next: "charClass"}, + {regex: "/", token: "string.regex", next: "format"}, + {"token": "string.regex", regex:"."} + ], + charClass : [ + {regex: "\\.", token: "escape"}, + {regex: "\\]", token: "regex.end", next: "regexp"}, + {"token": "string.regex", regex:"."} + ], + "format" : [ + {regex: /\\[ulULE]/, token: "keyword"}, + {regex: /\$\d+/, token: "variable"}, + {regex: "/[gim]*:?", token: "string.regex", next: "start"}, + {"token": "string", regex:"."} + ] + }; +}; +oop.inherits(SnippetHighlightRules, TextHighlightRules); + +exports.SnippetHighlightRules = SnippetHighlightRules; + +var SnippetGroupHighlightRules = function() { + this.$rules = { + "start" : [ + {token: "text", regex: "^\\t", next: "sn-start"}, + {token:"invalid", regex: /^ \s*/}, + {token:"comment", regex: /^#.*/}, + {token:"constant.language.escape", regex: "^regex ", next: "regex"}, + {token:"constant.language.escape", regex: "^(trigger|endTrigger|name|snippet|guard|endGuard|tabTrigger|key)\\b"} + ], + "regex" : [ + {token:"text", regex: "\\."}, + {token:"keyword", regex: "/"}, + {token:"empty", regex: "$", next: "start"} + ] + }; + this.embedRules(SnippetHighlightRules, "sn-", [ + {token: "text", regex: "^\\t", next: "sn-start"}, + {onMatch: function(value, state, stack) { + stack.splice(stack.length); + return this.tokenName; + }, tokenName: "text", regex: "^(?!\t)", next: "start"}, + ]) + +}; + +oop.inherits(SnippetGroupHighlightRules, TextHighlightRules); + +exports.SnippetGroupHighlightRules = SnippetGroupHighlightRules; + +var FoldMode = require("./folding/coffee").FoldMode; + +var Mode = function() { + var highlighter = new SnippetGroupHighlightRules(); + this.foldingRules = new FoldMode(); + this.$tokenizer = new Tokenizer(highlighter.getRules()); +}; +oop.inherits(Mode, TextMode); + +(function() { + this.getNextLineIndent = function(state, line, tab) { + return this.$getIndent(line); + }; +}).call(Mode.prototype); +exports.Mode = Mode; + + +}); + +ace.define('ace/mode/folding/coffee', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/folding/fold_mode', 'ace/range'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var BaseFoldMode = require("./fold_mode").FoldMode; +var Range = require("../../range").Range; + +var FoldMode = exports.FoldMode = function() {}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var range = this.indentationBlock(session, row); + if (range) + return range; + + var re = /\S/; + var line = session.getLine(row); + var startLevel = line.search(re); + if (startLevel == -1 || line[startLevel] != "#") + return; + + var startColumn = line.length; + var maxRow = session.getLength(); + var startRow = row; + var endRow = row; + + while (++row < maxRow) { + line = session.getLine(row); + var level = line.search(re); + + if (level == -1) + continue; + + if (line[level] != "#") + break; + + endRow = row; + } + + if (endRow > startRow) { + var endColumn = session.getLine(endRow).length; + return new Range(startRow, startColumn, endRow, endColumn); + } + }; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + var indent = line.search(/\S/); + var next = session.getLine(row + 1); + var prev = session.getLine(row - 1); + var prevIndent = prev.search(/\S/); + var nextIndent = next.search(/\S/); + + if (indent == -1) { + session.foldWidgets[row - 1] = prevIndent!= -1 && prevIndent < nextIndent ? "start" : ""; + return ""; + } + if (prevIndent == -1) { + if (indent == nextIndent && line[indent] == "#" && next[indent] == "#") { + session.foldWidgets[row - 1] = ""; + session.foldWidgets[row + 1] = ""; + return "start"; + } + } else if (prevIndent == indent && line[indent] == "#" && prev[indent] == "#") { + if (session.getLine(row - 2).search(/\S/) == -1) { + session.foldWidgets[row - 1] = "start"; + session.foldWidgets[row + 1] = ""; + return ""; + } + } + + if (prevIndent!= -1 && prevIndent < indent) + session.foldWidgets[row - 1] = "start"; + else + session.foldWidgets[row - 1] = ""; + + if (indent < nextIndent) + return "start"; + else + return ""; + }; + +}).call(FoldMode.prototype); + +}); diff --git a/0.0.3_0/ace/mode-toml.js b/0.0.3_0/ace/mode-toml.js new file mode 100644 index 0000000..af71c45 --- /dev/null +++ b/0.0.3_0/ace/mode-toml.js @@ -0,0 +1,180 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2013, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * + * Contributor(s): + * + * Garen J. Torikian + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/mode/toml', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/toml_highlight_rules', 'ace/mode/folding/cstyle'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var TomlHighlightRules = require("./toml_highlight_rules").TomlHighlightRules; +var FoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + var highlighter = new TomlHighlightRules(); + this.foldingRules = new FoldMode(); + this.$tokenizer = new Tokenizer(highlighter.getRules()); +}; +oop.inherits(Mode, TextMode); + +(function() { + this.lineCommentStart = "#"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/toml_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var TomlHighlightRules = function() { + var keywordMapper = this.createKeywordMapper({ + "constant.language.boolean": "true|false" + }, "identifier"); + + var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*\\b"; + + this.$rules = { + "start": [ + { + token: "comment.toml", + regex: /#.*$/ + }, + { + token : "string", + regex : '"(?=.)', + next : "qqstring" + }, + { + token: ["variable.keygroup.toml"], + regex: "(?:^\\s*)(\\[([^\\]]+)\\])" + }, + { + token : keywordMapper, + regex : identifierRe + }, + { + token : "support.date.toml", + regex: "\\d{4}-\\d{2}-\\d{2}(T)\\d{2}:\\d{2}:\\d{2}(Z)" + }, + { + token: "constant.numeric.toml", + regex: "-?\\d+(\\.?\\d+)?" + } + ], + "qqstring" : [ + { + token : "string", + regex : "\\\\$", + next : "qqstring" + }, + { + token : "constant.language.escape", + regex : '\\\\[0tnr"\\\\]' + }, + { + token : "string", + regex : '"|$', + next : "start" + }, + { + defaultToken: "string" + } + ] + } + +}; + +oop.inherits(TomlHighlightRules, TextHighlightRules); + +exports.TomlHighlightRules = TomlHighlightRules; +}); + +ace.define('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var line = session.getLine(row); + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i + match[0].length, 1); + } + + if (foldStyle !== "markbeginend") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + +}).call(FoldMode.prototype); + +}); diff --git a/0.0.3_0/ace/mode-twig.js b/0.0.3_0/ace/mode-twig.js new file mode 100644 index 0000000..139eab0 --- /dev/null +++ b/0.0.3_0/ace/mode-twig.js @@ -0,0 +1,2034 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2013, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/mode/twig', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/mode/javascript', 'ace/mode/css', 'ace/tokenizer', 'ace/mode/twig_highlight_rules', 'ace/mode/behaviour/html', 'ace/mode/folding/html', 'ace/mode/matching_brace_outdent'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var JavaScriptMode = require("./javascript").Mode; +var CssMode = require("./css").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var TwigHighlightRules = require("./twig_highlight_rules").TwigHighlightRules; +var HtmlBehaviour = require("./behaviour/html").HtmlBehaviour; +var HtmlFoldMode = require("./folding/html").FoldMode; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; + +var Mode = function() { + var highlighter = new TwigHighlightRules(); + this.$tokenizer = new Tokenizer(highlighter.getRules()); + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new HtmlBehaviour(); + + this.$embeds = highlighter.getEmbeds(); + this.createModeDelegates({ + "js-": JavaScriptMode, + "css-": CssMode + }); + + this.foldingRules = new HtmlFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + this.blockComment = {start: "{#", end: "#}"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.$tokenizer.getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start") { + var match = line.match(/^.*[\{\(\[]\s*$/); + if (match) { + indent += tab; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/javascript', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/javascript_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/range', 'ace/worker/worker_client', 'ace/mode/behaviour/cstyle', 'ace/mode/folding/cstyle'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var Range = require("../range").Range; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new JavaScriptHighlightRules().getRules()); + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.$tokenizer.getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start" || state == "no_regex") { + var match = line.match(/^.*(?:\bcase\b.*\:|[\{\(\[])\s*$/); + if (match) { + indent += tab; + } + } else if (state == "doc-start") { + if (endState == "start" || endState == "no_regex") { + return ""; + } + var match = line.match(/^\s*(\/?)\*/); + if (match) { + if (match[1]) { + indent += " "; + } + indent += "* "; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/javascript_worker", "JavaScriptWorker"); + worker.attachToDocument(session.getDocument()); + + worker.on("jslint", function(results) { + session.setAnnotations(results.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +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(require, exports, module) { + + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var JavaScriptHighlightRules = function() { + var keywordMapper = this.createKeywordMapper({ + "variable.language": + "Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|" + // Constructors + "Namespace|QName|XML|XMLList|" + // E4X + "ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|" + + "Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|" + + "Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|" + // Errors + "SyntaxError|TypeError|URIError|" + + "decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|" + // Non-constructor functions + "isNaN|parseFloat|parseInt|" + + "JSON|Math|" + // Other + "this|arguments|prototype|window|document" , // Pseudo + "keyword": + "const|yield|import|get|set|" + + "break|case|catch|continue|default|delete|do|else|finally|for|function|" + + "if|in|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"); + var kwBeforeRe = "case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void"; + var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*\\b"; + + var escapedRe = "\\\\(?:x[0-9a-fA-F]{2}|" + // hex + "u[0-9a-fA-F]{4}|" + // unicode + "[0-2][0-7]{0,2}|" + // oct + "3[0-6][0-7]?|" + // oct + "37[0-7]?|" + // oct + "[4-7][0-7]?|" + //oct + ".)"; + + this.$rules = { + "no_regex" : [ + { + token : "comment", + regex : /\/\/.*$/ + }, + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : /\/\*/, + next : "comment" + }, { + token : "string", + regex : "'(?=.)", + next : "qstring" + }, { + token : "string", + regex : '"(?=.)', + next : "qqstring" + }, { + token : "constant.numeric", // hex + regex : /0[xX][0-9a-fA-F]+\b/ + }, { + token : "constant.numeric", // float + regex : /[+-]?\d+(?:(?:\.\d*)?(?:[eE][+-]?\d+)?)?\b/ + }, { + token : [ + "storage.type", "punctuation.operator", "support.function", + "punctuation.operator", "entity.name.function", "text","keyword.operator" + ], + regex : "(" + identifierRe + ")(\\.)(prototype)(\\.)(" + identifierRe +")(\\s*)(=)", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "keyword.operator", "text", "storage.type", + "text", "paren.lparen" + ], + regex : "(" + identifierRe +")(\\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 : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(function)(\\s+)(" + identifierRe + ")(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "punctuation.operator", + "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\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 : "(?:" + kwBeforeRe + ")\\b", + next : "start" + }, { + token : ["punctuation.operator", "support.function"], + regex : /(\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:opzzzz|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 : ["punctuation.operator", "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)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/ + }, { + token : ["punctuation.operator", "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 : ["storage.type", "punctuation.operator", "support.function.firebug"], + regex : /(console)(\.)(warn|info|log|error|time|timeEnd|assert)\b/ + }, { + token : keywordMapper, + regex : identifierRe + }, { + token : "keyword.operator", + regex : /--|\+\+|[!$%&*+\-~]|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\|\||\?\:|\*=|%=|\+=|\-=|&=|\^=/, + next : "start" + }, { + token : "punctuation.operator", + regex : /\?|\:|\,|\;|\./, + next : "start" + }, { + token : "paren.lparen", + regex : /[\[({]/, + next : "start" + }, { + token : "paren.rparen", + regex : /[\])}]/ + }, { + token : "keyword.operator", + regex : /\/=?/, + next : "start" + }, { + token: "comment", + regex: /^#!.*$/ + } + ], + "start": [ + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment_regex_allowed" + }, { + token : "comment", + regex : "\\/\\/.*$", + next : "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: "/\\w*", + 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.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: identifierRe + }, { + token: "punctuation.operator", + regex: "[, ]+" + }, { + token: "punctuation.operator", + regex: "$" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "comment_regex_allowed" : [ + {token : "comment", regex : "\\*\\/", next : "start"}, + {defaultToken : "comment"} + ], + "comment" : [ + {token : "comment", regex : "\\*\\/", next : "no_regex"}, + {defaultToken : "comment"} + ], + "qqstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + next : "qqstring" + }, { + token : "string", + regex : '"|$', + next : "no_regex" + }, { + defaultToken: "string" + } + ], + "qstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + next : "qstring" + }, { + token : "string", + regex : "'|$", + next : "no_regex" + }, { + defaultToken: "string" + } + ] + }; + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("no_regex") ]); +}; + +oop.inherits(JavaScriptHighlightRules, TextHighlightRules); + +exports.JavaScriptHighlightRules = JavaScriptHighlightRules; +}); + +ace.define('ace/mode/doc_comment_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, { + token : "comment.doc.tag", + regex : "\\bTODO\\b" + }, { + defaultToken : "comment.doc" + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) { + + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define('ace/mode/behaviour/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/token_iterator', 'ace/lib/lang'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; +var lang = require("../../lib/lang"); + +var SAFE_INSERT_IN_TOKENS = + ["text", "paren.rparen", "punctuation.operator"]; +var SAFE_INSERT_BEFORE_TOKENS = + ["text", "paren.rparen", "punctuation.operator", "comment"]; + + +var autoInsertedBrackets = 0; +var autoInsertedRow = -1; +var autoInsertedLineEnd = ""; +var maybeInsertedBrackets = 0; +var maybeInsertedRow = -1; +var maybeInsertedLineStart = ""; +var maybeInsertedLineEnd = ""; + +var CstyleBehaviour = function () { + + CstyleBehaviour.isSaneInsertion = function(editor, session) { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + if (!this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) { + var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1); + if (!this.$matchTokenType(iterator2.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) + return false; + } + iterator.stepForward(); + return iterator.getCurrentTokenRow() !== cursor.row || + this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_BEFORE_TOKENS); + }; + + CstyleBehaviour.$matchTokenType = function(token, types) { + return types.indexOf(token.type || token) > -1; + }; + + CstyleBehaviour.recordAutoInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isAutoInsertedClosing(cursor, line, autoInsertedLineEnd[0])) + autoInsertedBrackets = 0; + autoInsertedRow = cursor.row; + autoInsertedLineEnd = bracket + line.substr(cursor.column); + autoInsertedBrackets++; + }; + + CstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isMaybeInsertedClosing(cursor, line)) + maybeInsertedBrackets = 0; + maybeInsertedRow = cursor.row; + maybeInsertedLineStart = line.substr(0, cursor.column) + bracket; + maybeInsertedLineEnd = line.substr(cursor.column); + maybeInsertedBrackets++; + }; + + CstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) { + return autoInsertedBrackets > 0 && + cursor.row === autoInsertedRow && + bracket === autoInsertedLineEnd[0] && + line.substr(cursor.column) === autoInsertedLineEnd; + }; + + CstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) { + return maybeInsertedBrackets > 0 && + cursor.row === maybeInsertedRow && + line.substr(cursor.column) === maybeInsertedLineEnd && + line.substr(0, cursor.column) == maybeInsertedLineStart; + }; + + CstyleBehaviour.popAutoInsertedClosing = function() { + autoInsertedLineEnd = autoInsertedLineEnd.substr(1); + autoInsertedBrackets--; + }; + + CstyleBehaviour.clearMaybeInsertedClosing = function() { + maybeInsertedBrackets = 0; + maybeInsertedRow = -1; + }; + + this.add("braces", "insertion", function (state, action, editor, session, text) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (text == '{') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "{" && editor.getWrapBehavioursEnabled()) { + return { + text: '{' + selected + '}', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + if (/[\]\}\)]/.test(line[cursor.column])) { + CstyleBehaviour.recordAutoInsert(editor, session, "}"); + return { + text: '{}', + selection: [1, 1] + }; + } else { + CstyleBehaviour.recordMaybeInsert(editor, session, "{"); + return { + text: '{', + selection: [1, 1] + }; + } + } + } else if (text == '}') { + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}') { + var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } else if (text == "\n" || text == "\r\n") { + var closing = ""; + if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) { + closing = lang.stringRepeat("}", maybeInsertedBrackets); + CstyleBehaviour.clearMaybeInsertedClosing(); + } + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}' || closing !== "") { + var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column}, '}'); + if (!openBracePos) + return null; + + var indent = this.getNextLineIndent(state, line.substring(0, cursor.column), session.getTabString()); + var next_indent = this.$getIndent(line); + + return { + text: '\n' + indent + '\n' + next_indent + closing, + selection: [1, indent.length, 1, indent.length] + }; + } + } + }); + + this.add("braces", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '{') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar == '}') { + range.end.column++; + return range; + } else { + maybeInsertedBrackets--; + } + } + }); + + this.add("parens", "insertion", function (state, action, editor, session, text) { + if (text == '(') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return { + text: '(' + selected + ')', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, ")"); + return { + text: '()', + selection: [1, 1] + }; + } + } else if (text == ')') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ')') { + var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("parens", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '(') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ')') { + range.end.column++; + return range; + } + } + }); + + this.add("brackets", "insertion", function (state, action, editor, session, text) { + if (text == '[') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return { + text: '[' + selected + ']', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, "]"); + return { + text: '[]', + selection: [1, 1] + }; + } + } else if (text == ']') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ']') { + var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("brackets", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '[') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ']') { + range.end.column++; + return range; + } + } + }); + + this.add("string_dquotes", "insertion", function (state, action, editor, session, text) { + if (text == '"' || text == "'") { + var quote = text; + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "'" && selected != '"' && editor.getWrapBehavioursEnabled()) { + return { + text: quote + selected + quote, + selection: false + }; + } else { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var leftChar = line.substring(cursor.column-1, cursor.column); + if (leftChar == '\\') { + return null; + } + var tokens = session.getTokens(selection.start.row); + var col = 0, token; + var quotepos = -1; // Track whether we're inside an open quote. + + for (var x = 0; x < tokens.length; x++) { + token = tokens[x]; + if (token.type == "string") { + quotepos = -1; + } else if (quotepos < 0) { + quotepos = token.value.indexOf(quote); + } + if ((token.value.length + col) > selection.start.column) { + break; + } + col += tokens[x].value.length; + } + if (!token || (quotepos < 0 && token.type !== "comment" && (token.type !== "string" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) { + if (!CstyleBehaviour.isSaneInsertion(editor, session)) + return; + return { + text: quote + quote, + selection: [1,1] + }; + } else if (token && token.type === "string") { + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == quote) { + return { + text: '', + selection: [1, 1] + }; + } + } + } + } + }); + + this.add("string_dquotes", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && (selected == '"' || selected == "'")) { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == selected) { + range.end.column++; + return range; + } + } + }); + +}; + +oop.inherits(CstyleBehaviour, Behaviour); + +exports.CstyleBehaviour = CstyleBehaviour; +}); + +ace.define('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var line = session.getLine(row); + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i + match[0].length, 1); + } + + if (foldStyle !== "markbeginend") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define('ace/mode/css', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/css_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/worker/worker_client', 'ace/mode/behaviour/css', 'ace/mode/folding/cstyle'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CssBehaviour = require("./behaviour/css").CssBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new CssHighlightRules().getRules()); + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CssBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.foldingRules = "cStyle"; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + var tokens = this.$tokenizer.getLineTokens(line, state).tokens; + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + var match = line.match(/^.*\{\s*$/); + if (match) { + indent += tab; + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/css_worker", "Worker"); + worker.attachToDocument(session.getDocument()); + + worker.on("csslint", function(e) { + session.setAnnotations(e.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; + +}); + +ace.define('ace/mode/css_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var supportType = exports.supportType = "animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|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|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|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|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index"; +var supportFunction = exports.supportFunction = "rgb|rgba|url|attr|counter|counters"; +var supportConstant = exports.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"; +var supportConstantColor = exports.supportConstantColor = "aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow"; +var supportConstantFonts = exports.supportConstantFonts = "arial|century|comic|courier|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace"; + +var numRe = exports.numRe = "\\-?(?:(?:[0-9]+)|(?:[0-9]*\\.[0-9]+))"; +var pseudoElements = exports.pseudoElements = "(\\:+)\\b(after|before|first-letter|first-line|moz-selection|selection)\\b"; +var pseudoClasses = exports.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"; + +var CssHighlightRules = function() { + + var keywordMapper = this.createKeywordMapper({ + "support.function": supportFunction, + "support.constant": supportConstant, + "support.type": supportType, + "support.constant.color": supportConstantColor, + "support.constant.fonts": supportConstantFonts + }, "text", true); + + var base_ruleset = [ + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "ruleset_comment" + }, { + token : "string", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' + }, { + token : "string", // single line + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" + }, { + token : ["constant.numeric", "keyword"], + regex : "(" + numRe + ")(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 : numRe + }, { + token : "constant.numeric", // hex6 color + regex : "#[a-f0-9]{6}" + }, { + token : "constant.numeric", // hex3 color + regex : "#[a-f0-9]{3}" + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"], + regex : pseudoElements + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"], + regex : pseudoClasses + }, { + token : ["support.function", "string", "support.function"], + regex : "(url\\()(.*)(\\))" + }, { + token : keywordMapper, + regex : "\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*" + }, { + caseInsensitive: true + } + ]; + + var ruleset = lang.copyArray(base_ruleset); + ruleset.unshift({ + token : "paren.rparen", + regex : "\\}", + next: "start" + }); + + var media_ruleset = lang.copyArray( base_ruleset ); + media_ruleset.unshift({ + token : "paren.rparen", + regex : "\\}", + next: "media" + }); + + var base_comment = [{ + token : "comment", // comment spanning whole line + regex : ".+" + }]; + + var comment = lang.copyArray(base_comment); + comment.unshift({ + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "start" + }); + + var media_comment = lang.copyArray(base_comment); + media_comment.unshift({ + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "media" + }); + + var ruleset_comment = lang.copyArray(base_comment); + ruleset_comment.unshift({ + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "ruleset" + }); + + this.$rules = { + "start" : [{ + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment" + }, { + token: "paren.lparen", + regex: "\\{", + next: "ruleset" + }, { + token: "string", + regex: "@.*?{", + next: "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: true + }], + + "media" : [ { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "media_comment" + }, { + token: "paren.lparen", + regex: "\\{", + next: "media_ruleset" + },{ + token: "string", + regex: "\\}", + next: "start" + },{ + 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: true + }], + + "comment" : comment, + + "ruleset" : ruleset, + "ruleset_comment" : ruleset_comment, + + "media_ruleset" : media_ruleset, + "media_comment" : media_comment + }; +}; + +oop.inherits(CssHighlightRules, TextHighlightRules); + +exports.CssHighlightRules = CssHighlightRules; + +}); + +ace.define('ace/mode/behaviour/css', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/mode/behaviour/cstyle', 'ace/token_iterator'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var CstyleBehaviour = require("./cstyle").CstyleBehaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; + +var CssBehaviour = function () { + + this.inherit(CstyleBehaviour); + + this.add("colon", "insertion", function (state, action, editor, session, text) { + if (text === ':') { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + if (token && token.value.match(/\s+/)) { + token = iterator.stepBackward(); + } + if (token && token.type === 'support.type') { + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar === ':') { + return { + text: '', + selection: [1, 1] + } + } + if (!line.substring(cursor.column).match(/^\s*;/)) { + return { + text: ':;', + selection: [1, 1] + } + } + } + } + }); + + this.add("colon", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected === ':') { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + if (token && token.value.match(/\s+/)) { + token = iterator.stepBackward(); + } + if (token && token.type === 'support.type') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar === ';') { + range.end.column ++; + return range; + } + } + } + }); + + this.add("semicolon", "insertion", function (state, action, editor, session, text) { + if (text === ';') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar === ';') { + return { + text: '', + selection: [1, 1] + } + } + } + }); + +} +oop.inherits(CssBehaviour, CstyleBehaviour); + +exports.CssBehaviour = CssBehaviour; +}); + +ace.define('ace/mode/twig_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/html_highlight_rules', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var TwigHighlightRules = function() { + HtmlHighlightRules.call(this); + + var tags = "autoescape|block|do|embed|extends|filter|flush|for|from|if|import|include|macro|sandbox|set|spaceless|use|verbatim"; + tags = tags + "|end" + tags.replace(/\|/g, "|end"); + var filters = "abs|batch|capitalize|convert_encoding|date|date_modify|default|e|escape|first|format|join|json_encode|keys|last|length|lower|merge|nl2br|number_format|raw|replace|reverse|slice|sort|split|striptags|title|trim|upper|url_encode"; + var functions = "attribute|constant|cycle|date|dump|parent|random|range|template_from_string"; + var tests = "constant|divisibleby|sameas|defined|empty|even|iterable|odd"; + var constants = "null|none|true|false"; + var operators = "b-and|b-xor|b-or|in|is|and|or|not" + + var keywordMapper = this.createKeywordMapper({ + "keyword.control.twig": tags, + "support.function.twig": [filters, functions, tests].join("|"), + "keyword.operator.twig": operators, + "constant.language.twig": constants + }, "identifier"); + this.$rules.start.unshift({ + token : "variable.other.readwrite.local.twig", + regex : "\\{\\{-?", + next : "twig-start" + }, { + token : "meta.tag.twig", + regex : "\\{%-?", + next : "twig-start" + }, { + token : "comment.block.twig", + regex : "\\{#-?", + next : "comment" + }); + this.$rules.comment.unshift({ + token : "comment.block.twig", + regex : ".*-?#\\}", + next : "start" + }); + + this.$rules["twig-start"] = [{ + token : "variable.other.readwrite.local.twig", + regex : "-?\\}\\}", + next : "start" + }, { + token : "meta.tag.twig", + regex : "-?%\\}", + next : "start" + }, { + token : "string", + regex : "'", + next : "twig-qstring" + }, { + token : "string", + regex : '"', + next : "twig-qqstring" + }, { + token : "constant.numeric", // hex + regex : "0[xX][0-9a-fA-F]+\\b" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : "constant.language.boolean", + regex : "(?:true|false)\\b" + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "keyword.operator.assignment", + regex : "=|~" + }, { + token : "keyword.operator.comparison", + regex : "==|!=|<|>|>=|<=|===" + }, { + token : "keyword.operator.arithmetic", + regex : "\\+|-|/|%|//|\\*|\\*\\*" + }, { + token : "keyword.operator.other", + regex : "\\.\\.|\\|" + }, { + token : "punctuation.operator", + regex : /\?|\:|\,|\;|\./ + }, { + token : "paren.lparen", + regex : /[\[\({]/ + }, { + token : "paren.rparen", + regex : /[\])}]/ + }, { + token : "text", + regex : "\\s+" + } ]; + + + + this.$rules["twig-qqstring"] = [{ + token : "constant.language.escape", + regex : /\\[\\"$#ntr]|#{[^"}]*}/ + }, { + token : "string", + regex : '"', + next : "twig-start", + }, { + defaultToken : "string" + } + ]; + + this.$rules["twig-qstring"] = [{ + token : "constant.language.escape", + regex : /\\[\\'ntr]}/ + }, { + token : "string", + regex : "'", + next : "twig-start", + }, { + defaultToken : "string" + } + ]; +}; + +oop.inherits(TwigHighlightRules, TextHighlightRules); + +exports.TwigHighlightRules = TwigHighlightRules; +}); + +ace.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_util', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var xmlUtil = require("./xml_util"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var tagMap = lang.createMap({ + a : 'anchor', + button : 'form', + form : 'form', + img : 'image', + input : 'form', + label : 'form', + script : 'script', + select : 'form', + textarea : 'form', + style : 'style', + table : 'table', + tbody : 'table', + td : 'table', + tfoot : 'table', + th : 'table', + tr : 'table' +}); + +var HtmlHighlightRules = function() { + this.$rules = { + start : [{ + token : "text", + regex : "<\\!\\[CDATA\\[", + next : "cdata" + }, { + token : "xml-pe", + regex : "<\\?.*?\\?>" + }, { + token : "comment", + regex : "<\\!--", + next : "comment" + }, { + token : "xml-pe", + regex : "<\\!.*?>" + }, { + token : "meta.tag", + regex : "<(?=script\\b)", + next : "script" + }, { + token : "meta.tag", + regex : "<(?=style\\b)", + next : "style" + }, { + token : "meta.tag", // opening tag + regex : "<\\/?(?=\\S)", + next : "tag" + }, { + token : "text", + regex : "\\s+" + }, { + token : "constant.character.entity", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }], + + cdata : [ { + token : "text", + regex : "\\]\\]>", + next : "start" + } ], + + comment : [ { + token : "comment", + regex : ".*?-->", + next : "start" + }, { + defaultToken : "comment" + } ] + }; + + xmlUtil.tag(this.$rules, "tag", "start", tagMap); + xmlUtil.tag(this.$rules, "style", "css-start", tagMap); + xmlUtil.tag(this.$rules, "script", "js-start", tagMap); + + this.embedRules(JavaScriptHighlightRules, "js-", [{ + token: "comment", + regex: "\\/\\/.*(?=<\\/script>)", + next: "tag" + }, { + token: "meta.tag", + regex: "<\\/(?=script)", + next: "tag" + }]); + + this.embedRules(CssHighlightRules, "css-", [{ + token: "meta.tag", + regex: "<\\/(?=style)", + next: "tag" + }]); +}; + +oop.inherits(HtmlHighlightRules, TextHighlightRules); + +exports.HtmlHighlightRules = HtmlHighlightRules; +}); + +ace.define('ace/mode/xml_util', ['require', 'exports', 'module' ], function(require, exports, module) { + + +function string(state) { + return [{ + token : "string", + regex : '"', + next : state + "_qqstring" + }, { + token : "string", + regex : "'", + next : state + "_qstring" + }]; +} + +function multiLineString(quote, state) { + return [ + {token : "string", regex : quote, next : state}, + { + token : "constant.language.escape", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }, + {defaultToken : "string"} + ]; +} + +exports.tag = function(states, name, nextState, tagMap) { + states[name] = [{ + token : "text", + regex : "\\s+" + }, { + + token : !tagMap ? "meta.tag.tag-name" : function(value) { + if (tagMap[value]) + return "meta.tag.tag-name." + tagMap[value]; + else + return "meta.tag.tag-name"; + }, + regex : "[-_a-zA-Z0-9:]+", + next : name + "_embed_attribute_list" + }, { + token: "empty", + regex: "", + next : name + "_embed_attribute_list" + }]; + + states[name + "_qstring"] = multiLineString("'", name + "_embed_attribute_list"); + states[name + "_qqstring"] = multiLineString("\"", name + "_embed_attribute_list"); + + states[name + "_embed_attribute_list"] = [{ + token : "meta.tag.r", + regex : "/?>", + next : nextState + }, { + token : "keyword.operator", + regex : "=" + }, { + token : "entity.other.attribute-name", + regex : "[-_a-zA-Z0-9:]+" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : "text", + regex : "\\s+" + }].concat(string(name)); +}; + +}); + +ace.define('ace/mode/behaviour/html', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour/xml', 'ace/mode/behaviour/cstyle', 'ace/token_iterator'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var XmlBehaviour = require("../behaviour/xml").XmlBehaviour; +var CstyleBehaviour = require("./cstyle").CstyleBehaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; +var voidElements = ['area', 'base', 'br', 'col', 'command', 'embed', 'hr', 'img', 'input', 'keygen', 'link', 'meta', 'param', 'source', 'track', 'wbr']; + +function hasType(token, type) { + var hasType = true; + var typeList = token.type.split('.'); + var needleList = type.split('.'); + needleList.forEach(function(needle){ + if (typeList.indexOf(needle) == -1) { + hasType = false; + return false; + } + }); + return hasType; +} + +var HtmlBehaviour = function () { + + this.inherit(XmlBehaviour); // Get xml behaviour + + this.add("autoclosing", "insertion", function (state, action, editor, session, text) { + if (text == '>') { + var position = editor.getCursorPosition(); + var iterator = new TokenIterator(session, position.row, position.column); + var token = iterator.getCurrentToken(); + + if (hasType(token, 'string') && iterator.getCurrentTokenColumn() + token.value.length > position.column) + return; + var atCursor = false; + if (!token || !hasType(token, 'meta.tag') && !(hasType(token, 'text') && token.value.match('/'))){ + do { + token = iterator.stepBackward(); + } while (token && (hasType(token, 'string') || hasType(token, 'keyword.operator') || hasType(token, 'entity.attribute-name') || hasType(token, 'text'))); + } else { + atCursor = true; + } + if (!token || !hasType(token, 'meta.tag-name') || iterator.stepBackward().value.match('/')) { + return + } + var element = token.value; + if (atCursor){ + var element = element.substring(0, position.column - token.start); + } + if (voidElements.indexOf(element) !== -1){ + return; + } + return { + text: '>' + '', + selection: [1, 1] + } + } + }); +} +oop.inherits(HtmlBehaviour, XmlBehaviour); + +exports.HtmlBehaviour = HtmlBehaviour; +}); + +ace.define('ace/mode/behaviour/xml', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/mode/behaviour/cstyle', 'ace/token_iterator'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var CstyleBehaviour = require("./cstyle").CstyleBehaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; + +function hasType(token, type) { + var hasType = true; + var typeList = token.type.split('.'); + var needleList = type.split('.'); + needleList.forEach(function(needle){ + if (typeList.indexOf(needle) == -1) { + hasType = false; + return false; + } + }); + return hasType; +} + +var XmlBehaviour = function () { + + this.inherit(CstyleBehaviour, ["string_dquotes"]); // Get string behaviour + + this.add("autoclosing", "insertion", function (state, action, editor, session, text) { + if (text == '>') { + var position = editor.getCursorPosition(); + var iterator = new TokenIterator(session, position.row, position.column); + var token = iterator.getCurrentToken(); + var atCursor = false; + if (!token || !hasType(token, 'meta.tag') && !(hasType(token, 'text') && token.value.match('/'))){ + do { + token = iterator.stepBackward(); + } while (token && (hasType(token, 'string') || hasType(token, 'keyword.operator') || hasType(token, 'entity.attribute-name') || hasType(token, 'text'))); + } else { + atCursor = true; + } + if (!token || !hasType(token, 'meta.tag-name') || iterator.stepBackward().value.match('/')) { + return + } + var tag = token.value; + if (atCursor){ + var tag = tag.substring(0, position.column - token.start); + } + + return { + text: '>' + '', + selection: [1, 1] + } + } + }); + + this.add('autoindent', 'insertion', function (state, action, editor, session, text) { + if (text == "\n") { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChars = line.substring(cursor.column, cursor.column + 2); + if (rightChars == '?)/; + this._parseTag = function(tag) { + + var match = tag.match(this.tagRe); + var column = 0; + + return { + value: tag, + match: match ? match[2] : "", + closing: match ? !!match[3] : false, + selfClosing: match ? !!match[5] || match[2] == "/>" : false, + tagName: match ? match[4] : "", + column: match[1] ? column + match[1].length : column + }; + }; + this._readTagForward = function(iterator) { + var token = iterator.getCurrentToken(); + if (!token) + return null; + + var value = ""; + var start; + + do { + if (token.type.indexOf("meta.tag") === 0) { + if (!start) { + var start = { + row: iterator.getCurrentTokenRow(), + column: iterator.getCurrentTokenColumn() + }; + } + value += token.value; + if (value.indexOf(">") !== -1) { + var tag = this._parseTag(value); + tag.start = start; + tag.end = { + row: iterator.getCurrentTokenRow(), + column: iterator.getCurrentTokenColumn() + token.value.length + }; + iterator.stepForward(); + return tag; + } + } + } while(token = iterator.stepForward()); + + return null; + }; + + this._readTagBackward = function(iterator) { + var token = iterator.getCurrentToken(); + if (!token) + return null; + + var value = ""; + var end; + + do { + if (token.type.indexOf("meta.tag") === 0) { + if (!end) { + end = { + row: iterator.getCurrentTokenRow(), + column: iterator.getCurrentTokenColumn() + token.value.length + }; + } + value = token.value + value; + if (value.indexOf("<") !== -1) { + var tag = this._parseTag(value); + tag.end = end; + tag.start = { + row: iterator.getCurrentTokenRow(), + column: iterator.getCurrentTokenColumn() + }; + iterator.stepBackward(); + return tag; + } + } + } while(token = iterator.stepBackward()); + + return null; + }; + + this._pop = function(stack, tag) { + while (stack.length) { + + var top = stack[stack.length-1]; + if (!tag || top.tagName == tag.tagName) { + return stack.pop(); + } + else if (this.voidElements[tag.tagName]) { + return; + } + else if (this.voidElements[top.tagName]) { + stack.pop(); + continue; + } else { + return null; + } + } + }; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var firstTag = this._getFirstTagInLine(session, row); + + if (!firstTag.match) + return null; + + var isBackward = firstTag.closing || firstTag.selfClosing; + var stack = []; + var tag; + + if (!isBackward) { + var iterator = new TokenIterator(session, row, firstTag.column); + var start = { + row: row, + column: firstTag.column + firstTag.tagName.length + 2 + }; + while (tag = this._readTagForward(iterator)) { + if (tag.selfClosing) { + if (!stack.length) { + tag.start.column += tag.tagName.length + 2; + tag.end.column -= 2; + return Range.fromPoints(tag.start, tag.end); + } else + continue; + } + + if (tag.closing) { + this._pop(stack, tag); + if (stack.length == 0) + return Range.fromPoints(start, tag.start); + } + else { + stack.push(tag) + } + } + } + else { + var iterator = new TokenIterator(session, row, firstTag.column + firstTag.match.length); + var end = { + row: row, + column: firstTag.column + }; + + while (tag = this._readTagBackward(iterator)) { + if (tag.selfClosing) { + if (!stack.length) { + tag.start.column += tag.tagName.length + 2; + tag.end.column -= 2; + return Range.fromPoints(tag.start, tag.end); + } else + continue; + } + + if (!tag.closing) { + this._pop(stack, tag); + if (stack.length == 0) { + tag.start.column += tag.tagName.length + 2; + return Range.fromPoints(tag.start, end); + } + } + else { + stack.push(tag) + } + } + } + + }; + +}).call(FoldMode.prototype); + +}); diff --git a/0.0.3_0/ace/mode-typescript.js b/0.0.3_0/ace/mode-typescript.js new file mode 100644 index 0000000..333fba7 --- /dev/null +++ b/0.0.3_0/ace/mode-typescript.js @@ -0,0 +1,961 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2012, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/mode/typescript', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/javascript', 'ace/tokenizer', 'ace/mode/typescript_highlight_rules', 'ace/mode/behaviour/cstyle', 'ace/mode/folding/cstyle', 'ace/mode/matching_brace_outdent'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var jsMode = require("./javascript").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var TypeScriptHighlightRules = require("./typescript_highlight_rules").TypeScriptHighlightRules; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; + +var Mode = function() { + var highlighter = new TypeScriptHighlightRules(); + + this.$tokenizer = new Tokenizer(highlighter.getRules()); + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, jsMode); + +(function() { + this.createWorker = function(session) { + return null; + }; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/javascript', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/javascript_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/range', 'ace/worker/worker_client', 'ace/mode/behaviour/cstyle', 'ace/mode/folding/cstyle'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var Range = require("../range").Range; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new JavaScriptHighlightRules().getRules()); + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.$tokenizer.getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start" || state == "no_regex") { + var match = line.match(/^.*(?:\bcase\b.*\:|[\{\(\[])\s*$/); + if (match) { + indent += tab; + } + } else if (state == "doc-start") { + if (endState == "start" || endState == "no_regex") { + return ""; + } + var match = line.match(/^\s*(\/?)\*/); + if (match) { + if (match[1]) { + indent += " "; + } + indent += "* "; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/javascript_worker", "JavaScriptWorker"); + worker.attachToDocument(session.getDocument()); + + worker.on("jslint", function(results) { + session.setAnnotations(results.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +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(require, exports, module) { + + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var JavaScriptHighlightRules = function() { + var keywordMapper = this.createKeywordMapper({ + "variable.language": + "Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|" + // Constructors + "Namespace|QName|XML|XMLList|" + // E4X + "ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|" + + "Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|" + + "Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|" + // Errors + "SyntaxError|TypeError|URIError|" + + "decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|" + // Non-constructor functions + "isNaN|parseFloat|parseInt|" + + "JSON|Math|" + // Other + "this|arguments|prototype|window|document" , // Pseudo + "keyword": + "const|yield|import|get|set|" + + "break|case|catch|continue|default|delete|do|else|finally|for|function|" + + "if|in|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"); + var kwBeforeRe = "case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void"; + var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*\\b"; + + var escapedRe = "\\\\(?:x[0-9a-fA-F]{2}|" + // hex + "u[0-9a-fA-F]{4}|" + // unicode + "[0-2][0-7]{0,2}|" + // oct + "3[0-6][0-7]?|" + // oct + "37[0-7]?|" + // oct + "[4-7][0-7]?|" + //oct + ".)"; + + this.$rules = { + "no_regex" : [ + { + token : "comment", + regex : /\/\/.*$/ + }, + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : /\/\*/, + next : "comment" + }, { + token : "string", + regex : "'(?=.)", + next : "qstring" + }, { + token : "string", + regex : '"(?=.)', + next : "qqstring" + }, { + token : "constant.numeric", // hex + regex : /0[xX][0-9a-fA-F]+\b/ + }, { + token : "constant.numeric", // float + regex : /[+-]?\d+(?:(?:\.\d*)?(?:[eE][+-]?\d+)?)?\b/ + }, { + token : [ + "storage.type", "punctuation.operator", "support.function", + "punctuation.operator", "entity.name.function", "text","keyword.operator" + ], + regex : "(" + identifierRe + ")(\\.)(prototype)(\\.)(" + identifierRe +")(\\s*)(=)", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "keyword.operator", "text", "storage.type", + "text", "paren.lparen" + ], + regex : "(" + identifierRe +")(\\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 : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(function)(\\s+)(" + identifierRe + ")(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "punctuation.operator", + "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\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 : "(?:" + kwBeforeRe + ")\\b", + next : "start" + }, { + token : ["punctuation.operator", "support.function"], + regex : /(\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:opzzzz|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 : ["punctuation.operator", "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)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/ + }, { + token : ["punctuation.operator", "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 : ["storage.type", "punctuation.operator", "support.function.firebug"], + regex : /(console)(\.)(warn|info|log|error|time|timeEnd|assert)\b/ + }, { + token : keywordMapper, + regex : identifierRe + }, { + token : "keyword.operator", + regex : /--|\+\+|[!$%&*+\-~]|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\|\||\?\:|\*=|%=|\+=|\-=|&=|\^=/, + next : "start" + }, { + token : "punctuation.operator", + regex : /\?|\:|\,|\;|\./, + next : "start" + }, { + token : "paren.lparen", + regex : /[\[({]/, + next : "start" + }, { + token : "paren.rparen", + regex : /[\])}]/ + }, { + token : "keyword.operator", + regex : /\/=?/, + next : "start" + }, { + token: "comment", + regex: /^#!.*$/ + } + ], + "start": [ + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment_regex_allowed" + }, { + token : "comment", + regex : "\\/\\/.*$", + next : "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: "/\\w*", + 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.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: identifierRe + }, { + token: "punctuation.operator", + regex: "[, ]+" + }, { + token: "punctuation.operator", + regex: "$" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "comment_regex_allowed" : [ + {token : "comment", regex : "\\*\\/", next : "start"}, + {defaultToken : "comment"} + ], + "comment" : [ + {token : "comment", regex : "\\*\\/", next : "no_regex"}, + {defaultToken : "comment"} + ], + "qqstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + next : "qqstring" + }, { + token : "string", + regex : '"|$', + next : "no_regex" + }, { + defaultToken: "string" + } + ], + "qstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + next : "qstring" + }, { + token : "string", + regex : "'|$", + next : "no_regex" + }, { + defaultToken: "string" + } + ] + }; + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("no_regex") ]); +}; + +oop.inherits(JavaScriptHighlightRules, TextHighlightRules); + +exports.JavaScriptHighlightRules = JavaScriptHighlightRules; +}); + +ace.define('ace/mode/doc_comment_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, { + token : "comment.doc.tag", + regex : "\\bTODO\\b" + }, { + defaultToken : "comment.doc" + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) { + + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define('ace/mode/behaviour/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/token_iterator', 'ace/lib/lang'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; +var lang = require("../../lib/lang"); + +var SAFE_INSERT_IN_TOKENS = + ["text", "paren.rparen", "punctuation.operator"]; +var SAFE_INSERT_BEFORE_TOKENS = + ["text", "paren.rparen", "punctuation.operator", "comment"]; + + +var autoInsertedBrackets = 0; +var autoInsertedRow = -1; +var autoInsertedLineEnd = ""; +var maybeInsertedBrackets = 0; +var maybeInsertedRow = -1; +var maybeInsertedLineStart = ""; +var maybeInsertedLineEnd = ""; + +var CstyleBehaviour = function () { + + CstyleBehaviour.isSaneInsertion = function(editor, session) { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + if (!this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) { + var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1); + if (!this.$matchTokenType(iterator2.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) + return false; + } + iterator.stepForward(); + return iterator.getCurrentTokenRow() !== cursor.row || + this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_BEFORE_TOKENS); + }; + + CstyleBehaviour.$matchTokenType = function(token, types) { + return types.indexOf(token.type || token) > -1; + }; + + CstyleBehaviour.recordAutoInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isAutoInsertedClosing(cursor, line, autoInsertedLineEnd[0])) + autoInsertedBrackets = 0; + autoInsertedRow = cursor.row; + autoInsertedLineEnd = bracket + line.substr(cursor.column); + autoInsertedBrackets++; + }; + + CstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isMaybeInsertedClosing(cursor, line)) + maybeInsertedBrackets = 0; + maybeInsertedRow = cursor.row; + maybeInsertedLineStart = line.substr(0, cursor.column) + bracket; + maybeInsertedLineEnd = line.substr(cursor.column); + maybeInsertedBrackets++; + }; + + CstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) { + return autoInsertedBrackets > 0 && + cursor.row === autoInsertedRow && + bracket === autoInsertedLineEnd[0] && + line.substr(cursor.column) === autoInsertedLineEnd; + }; + + CstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) { + return maybeInsertedBrackets > 0 && + cursor.row === maybeInsertedRow && + line.substr(cursor.column) === maybeInsertedLineEnd && + line.substr(0, cursor.column) == maybeInsertedLineStart; + }; + + CstyleBehaviour.popAutoInsertedClosing = function() { + autoInsertedLineEnd = autoInsertedLineEnd.substr(1); + autoInsertedBrackets--; + }; + + CstyleBehaviour.clearMaybeInsertedClosing = function() { + maybeInsertedBrackets = 0; + maybeInsertedRow = -1; + }; + + this.add("braces", "insertion", function (state, action, editor, session, text) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (text == '{') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "{" && editor.getWrapBehavioursEnabled()) { + return { + text: '{' + selected + '}', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + if (/[\]\}\)]/.test(line[cursor.column])) { + CstyleBehaviour.recordAutoInsert(editor, session, "}"); + return { + text: '{}', + selection: [1, 1] + }; + } else { + CstyleBehaviour.recordMaybeInsert(editor, session, "{"); + return { + text: '{', + selection: [1, 1] + }; + } + } + } else if (text == '}') { + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}') { + var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } else if (text == "\n" || text == "\r\n") { + var closing = ""; + if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) { + closing = lang.stringRepeat("}", maybeInsertedBrackets); + CstyleBehaviour.clearMaybeInsertedClosing(); + } + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}' || closing !== "") { + var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column}, '}'); + if (!openBracePos) + return null; + + var indent = this.getNextLineIndent(state, line.substring(0, cursor.column), session.getTabString()); + var next_indent = this.$getIndent(line); + + return { + text: '\n' + indent + '\n' + next_indent + closing, + selection: [1, indent.length, 1, indent.length] + }; + } + } + }); + + this.add("braces", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '{') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar == '}') { + range.end.column++; + return range; + } else { + maybeInsertedBrackets--; + } + } + }); + + this.add("parens", "insertion", function (state, action, editor, session, text) { + if (text == '(') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return { + text: '(' + selected + ')', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, ")"); + return { + text: '()', + selection: [1, 1] + }; + } + } else if (text == ')') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ')') { + var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("parens", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '(') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ')') { + range.end.column++; + return range; + } + } + }); + + this.add("brackets", "insertion", function (state, action, editor, session, text) { + if (text == '[') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return { + text: '[' + selected + ']', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, "]"); + return { + text: '[]', + selection: [1, 1] + }; + } + } else if (text == ']') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ']') { + var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("brackets", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '[') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ']') { + range.end.column++; + return range; + } + } + }); + + this.add("string_dquotes", "insertion", function (state, action, editor, session, text) { + if (text == '"' || text == "'") { + var quote = text; + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "'" && selected != '"' && editor.getWrapBehavioursEnabled()) { + return { + text: quote + selected + quote, + selection: false + }; + } else { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var leftChar = line.substring(cursor.column-1, cursor.column); + if (leftChar == '\\') { + return null; + } + var tokens = session.getTokens(selection.start.row); + var col = 0, token; + var quotepos = -1; // Track whether we're inside an open quote. + + for (var x = 0; x < tokens.length; x++) { + token = tokens[x]; + if (token.type == "string") { + quotepos = -1; + } else if (quotepos < 0) { + quotepos = token.value.indexOf(quote); + } + if ((token.value.length + col) > selection.start.column) { + break; + } + col += tokens[x].value.length; + } + if (!token || (quotepos < 0 && token.type !== "comment" && (token.type !== "string" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) { + if (!CstyleBehaviour.isSaneInsertion(editor, session)) + return; + return { + text: quote + quote, + selection: [1,1] + }; + } else if (token && token.type === "string") { + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == quote) { + return { + text: '', + selection: [1, 1] + }; + } + } + } + } + }); + + this.add("string_dquotes", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && (selected == '"' || selected == "'")) { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == selected) { + range.end.column++; + return range; + } + } + }); + +}; + +oop.inherits(CstyleBehaviour, Behaviour); + +exports.CstyleBehaviour = CstyleBehaviour; +}); + +ace.define('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var line = session.getLine(row); + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i + match[0].length, 1); + } + + if (foldStyle !== "markbeginend") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + +}).call(FoldMode.prototype); + +}); + + +ace.define('ace/mode/typescript_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/javascript_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; + +var TypeScriptHighlightRules = function() { + + var tsRules = [ + { + token: ["keyword.operator.ts", "text", "variable.parameter.function.ts", "text"], + regex: "\\b(module)(\\s*)([a-zA-Z0-9_?.$][\\w?.$]*)(\\s*\\{)" + }, + { + token: ["storage.type.variable.ts", "text", "keyword.other.ts", "text"], + regex: "(super)(\\s*\\()([a-zA-Z0-9,_?.$\\s]+\\s*)(\\))" + }, + { + token: ["entity.name.function.ts","paren.lparen", "paren.rparen"], + regex: "([a-zA-Z_?.$][\\w?.$]*)(\\()(\\))" + }, + { + token: ["variable.parameter.function.ts", "text", "variable.parameter.function.ts"], + regex: "([a-zA-Z0-9_?.$][\\w?.$]*)(\\s*:\\s*)([a-zA-Z0-9_?.$][\\w?.$]*)" + }, + { + token: ["keyword.operator.ts"], + regex: "(?:\\b(constructor|declare|interface|as|AS|public|private|class|extends|export|super)\\b)" + }, + { + token: ["storage.type.variable.ts"], + regex: "(?:\\b(this\\.|string\\b|bool\\b|number)\\b)" + }, + { + token: ["keyword.operator.ts", "storage.type.variable.ts", "keyword.operator.ts", "storage.type.variable.ts"], + regex: "(class)(\\s+[a-zA-Z0-9_?.$][\\w?.$]*\\s+)(extends)(\\s+[a-zA-Z0-9_?.$][\\w?.$]*\\s+)?" + }, + { + token: "keyword", + regex: "(?:super|export|class|extends|import)\\b" + } + ]; + + var JSRules = new JavaScriptHighlightRules().getRules(); + + JSRules.start = tsRules.concat(JSRules.start); + this.$rules = JSRules; +}; + +oop.inherits(TypeScriptHighlightRules, JavaScriptHighlightRules); + +exports.TypeScriptHighlightRules = TypeScriptHighlightRules; +}); \ No newline at end of file diff --git a/0.0.3_0/ace/mode-vbscript.js b/0.0.3_0/ace/mode-vbscript.js new file mode 100644 index 0000000..073e1ca --- /dev/null +++ b/0.0.3_0/ace/mode-vbscript.js @@ -0,0 +1,281 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2012, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * + * Contributor(s): + * + * + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/mode/vbscript', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/vbscript_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var VBScriptHighlightRules = require("./vbscript_highlight_rules").VBScriptHighlightRules; + +var Mode = function() { + var highlighter = new VBScriptHighlightRules(); + + this.$tokenizer = new Tokenizer(highlighter.getRules()); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = ["'", "REM"]; + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + + +ace.define('ace/mode/vbscript_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var VBScriptHighlightRules = function() { + + this.$rules = { + "start": [ + { + token: [ + "meta.ending-space" + ], + regex: "$" + }, + { + token: [ + null + ], + regex: "^(?=\\t)", + next: "state_3" + }, + { + token: [null], + regex: "^(?= )", + next: "state_4" + }, + { + token: [ + "storage.type.function.asp", + "text", + "entity.name.function.asp", + "text", + "punctuation.definition.parameters.asp", + "variable.parameter.function.asp", + "punctuation.definition.parameters.asp" + ], + regex: "^\\s*((?:Function|Sub))(\\s*)([a-zA-Z_]\\w*)(\\s*)(\\()([^)]*)(\\)).*\\n?" + }, + { + token: "punctuation.definition.comment.asp", + regex: "'|REM", + next: "comment" + }, + { + token: [ + "keyword.control.asp" + ], + regex: "(?:\\b(If|Then|Else|ElseIf|Else If|End If|While|Wend|For|To|Each|Case|Select|End Select|Return|Continue|Do|Until|Loop|Next|With|Exit Do|Exit For|Exit Function|Exit Property|Exit Sub|IIf)\\b)" + }, + { + token: [ + "keyword.operator.asp" + ], + regex: "(?:\\b(Mod|And|Not|Or|Xor|as)\\b)" + }, + { + token: [ + "storage.type.asp" + ], + regex: "Dim|Call|Class|Const|Dim|Redim|Function|Sub|Private Sub|Public Sub|End sub|End Function|Set|Let|Get|New|Randomize|Option Explicit|On Error Resume Next|On Error GoTo" + }, + { + token: [ + "storage.modifier.asp" + ], + regex: "(?:\\b(Private|Public|Default)\\b)" + }, + { + token: [ + "constant.language.asp" + ], + regex: "(?:\\s*\\b(Empty|False|Nothing|Null|True)\\b)" + }, + { + token: [ + "punctuation.definition.string.begin.asp" + ], + regex: '"', + next: "string" + }, + { + token: [ + "punctuation.definition.variable.asp" + ], + regex: "(\\$)[a-zA-Z_x7f-xff][a-zA-Z0-9_x7f-xff]*?\\b\\s*" + }, + { + token: [ + "support.class.asp" + ], + regex: "(?:\\b(Application|ObjectContext|Request|Response|Server|Session)\\b)" + }, + { + token: [ + "support.class.collection.asp" + ], + regex: "(?:\\b(Contents|StaticObjects|ClientCertificate|Cookies|Form|QueryString|ServerVariables)\\b)" + }, + { + token: [ + "support.constant.asp" + ], + regex: "(?:\\b(TotalBytes|Buffer|CacheControl|Charset|ContentType|Expires|ExpiresAbsolute|IsClientConnected|PICS|Status|ScriptTimeout|CodePage|LCID|SessionID|Timeout)\\b)" + }, + { + token: [ + "support.function.asp" + ], + regex: "(?:\\b(Lock|Unlock|SetAbort|SetComplete|BianryRead|AddHeader|AppendToLog|BinaryWrite|Clear|End|Flush|Redirect|Write|CreateObject|HTMLEncode|MapPath|URLEncode|Abandon|Convert|Regex)\\b)" + }, + { + token: [ + "support.function.event.asp" + ], + regex: "(?:\\b(Application_OnEnd|Application_OnStart|OnTransactionAbort|OnTransactionCommit|Session_OnEnd|Session_OnStart)\\b)" + }, + { + token: [ + "support.function.vb.asp" + ], + regex: "(?:\\b(Array|Add|Asc|Atn|CBool|CByte|CCur|CDate|CDbl|Chr|CInt|CLng|Conversions|Cos|CreateObject|CSng|CStr|Date|DateAdd|DateDiff|DatePart|DateSerial|DateValue|Day|Derived|Math|Escape|Eval|Exists|Exp|Filter|FormatCurrency|FormatDateTime|FormatNumber|FormatPercent|GetLocale|GetObject|GetRef|Hex|Hour|InputBox|InStr|InStrRev|Int|Fix|IsArray|IsDate|IsEmpty|IsNull|IsNumeric|IsObject|Item|Items|Join|Keys|LBound|LCase|Left|Len|LoadPicture|Log|LTrim|RTrim|Trim|Maths|Mid|Minute|Month|MonthName|MsgBox|Now|Oct|Remove|RemoveAll|Replace|RGB|Right|Rnd|Round|ScriptEngine|ScriptEngineBuildVersion|ScriptEngineMajorVersion|ScriptEngineMinorVersion|Second|SetLocale|Sgn|Sin|Space|Split|Sqr|StrComp|String|StrReverse|Tan|Time|Timer|TimeSerial|TimeValue|TypeName|UBound|UCase|Unescape|VarType|Weekday|WeekdayName|Year)\\b)" + }, + { + token: [ + "constant.numeric.asp" + ], + regex: "-?\\b(?:(?:0(?:x|X)[0-9a-fA-F]*)|(?:(?:[0-9]+\\.?[0-9]*)|(?:\\.[0-9]+))(?:(?:e|E)(?:\\+|-)?[0-9]+)?)(?:L|l|UL|ul|u|U|F|f)?\\b" + }, + { + token: [ + "support.type.vb.asp" + ], + regex: "(?:\\b(vbtrue|vbfalse|vbcr|vbcrlf|vbformfeed|vblf|vbnewline|vbnullchar|vbnullstring|int32|vbtab|vbverticaltab|vbbinarycompare|vbtextcomparevbsunday|vbmonday|vbtuesday|vbwednesday|vbthursday|vbfriday|vbsaturday|vbusesystemdayofweek|vbfirstjan1|vbfirstfourdays|vbfirstfullweek|vbgeneraldate|vblongdate|vbshortdate|vblongtime|vbshorttime|vbobjecterror|vbEmpty|vbNull|vbInteger|vbLong|vbSingle|vbDouble|vbCurrency|vbDate|vbString|vbObject|vbError|vbBoolean|vbVariant|vbDataObject|vbDecimal|vbByte|vbArray)\\b)" + }, + { + token: [ + "entity.name.function.asp" + ], + regex: "(?:(\\b[a-zA-Z_x7f-xff][a-zA-Z0-9_x7f-xff]*?\\b)(?=\\(\\)?))" + }, + { + token: [ + "keyword.operator.asp" + ], + regex: "\\-|\\+|\\*\\\/|\\>|\\<|\\=|\\&" + } + ], + "state_3": [ + { + token: [ + "meta.odd-tab.tabs", + "meta.even-tab.tabs" + ], + regex: "(\\t)(\\t)?" + }, + { + token: "meta.leading-space", + regex: "(?=[^\\t])", + next: "start" + }, + { + token: "meta.leading-space", + regex: ".", + next: "state_3" + } + ], + "state_4": [ + { + token: [ + "meta.odd-tab.spaces", + "meta.even-tab.spaces" + ], + regex: "( )( )?" + }, + { + token: "meta.leading-space", + regex: "(?=[^ ])", + next: "start" + }, + { + token: "meta.leading-space", + regex: ".", + next: "state_4" + } + ], + "comment": [ + { + token: "comment.line.apostrophe.asp", + regex: "$|(?=(?:%>))", + next: "start" + }, + { + token: "comment.line.apostrophe.asp", + regex: "." + } + ], + "string": [ + { + token: "constant.character.escape.apostrophe.asp", + regex: '""' + }, + { + token: "string.quoted.double.asp", + regex: '"', + next: "start" + }, + { + token: "string.quoted.double.asp", + regex: "." + } + ] +} + +}; + +oop.inherits(VBScriptHighlightRules, TextHighlightRules); + +exports.VBScriptHighlightRules = VBScriptHighlightRules; +}); \ No newline at end of file diff --git a/0.0.3_0/ace/mode-velocity.js b/0.0.3_0/ace/mode-velocity.js new file mode 100644 index 0000000..358f77e --- /dev/null +++ b/0.0.3_0/ace/mode-velocity.js @@ -0,0 +1,1422 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2012, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/mode/velocity', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/velocity_highlight_rules', 'ace/mode/folding/velocity', 'ace/mode/behaviour/html'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var VelocityHighlightRules = require("./velocity_highlight_rules").VelocityHighlightRules; +var FoldMode = require("./folding/velocity").FoldMode; +var HtmlBehaviour = require("./behaviour/html").HtmlBehaviour; + +var Mode = function() { + var highlighter = new VelocityHighlightRules(); + this.foldingRules = new FoldMode(); + this.$tokenizer = new Tokenizer(highlighter.getRules()); + this.$behaviour = new HtmlBehaviour(); +}; +oop.inherits(Mode, TextMode); + +(function() { + this.lineCommentStart = "##"; + this.blockComment = {start: "#*", end: "*#"}; +}).call(Mode.prototype); + +exports.Mode = Mode; +});ace.define('ace/mode/velocity_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/xml_util', 'ace/mode/text_highlight_rules', 'ace/mode/css_highlight_rules', 'ace/mode/javascript_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var xmlUtil = require("./xml_util"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; + +var VelocityHighlightRules = function() { + var builtinConstants = lang.arrayToMap( + ('true|false|null').split('|') + ); + + var builtinFunctions = lang.arrayToMap( + ("_DateTool|_DisplayTool|_EscapeTool|_FieldTool|_MathTool|_NumberTool|_SerializerTool|_SortTool|_StringTool|_XPathTool").split('|') + ); + + var builtinVariables = lang.arrayToMap( + ('$contentRoot|$foreach').split('|') + ); + + var keywords = lang.arrayToMap( + ("#set|#macro|#include|#parse|" + + "#if|#elseif|#else|#foreach|" + + "#break|#end|#stop" + ).split('|') + ); + + this.$rules = { + "start" : [ + { + token : "meta.tag", + regex : "<\\!\\[CDATA\\[", + next : "cdata" + }, { + token : "xml-pe", + regex : "<\\?.*?\\?>" + }, { + token : "comment", + regex : "<\\!--", + next : "comment" + }, { + token : "meta.tag", + regex : "<(?=\\s*script\\b)", + next : "script" + }, { + token : "meta.tag", + regex : "<(?=\\s*style\\b)", + next : "style" + }, { + token : "meta.tag", // opening tag + regex : "<\\/?(?=[a-z])", + next : "tag" + }, { + token : "comment", + regex : "##.*$" + },{ + token : "comment.block", // multi line comment + regex : "#\\*", + next : "comment" + }, { + token : "string.regexp", + regex : "[/](?:(?:\\[(?:\\\\]|[^\\]])+\\])|(?:\\\\/|[^\\]/]))*[/]\\w*\\s*(?=[).,;]|$)" + }, { + token : "string", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' + }, { + token : "string", // single line + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" + }, { + token : "constant.numeric", // hex + regex : "0[xX][0-9a-fA-F]+\\b" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : "constant.language.boolean", + regex : "(?:true|false)\\b" + }, { + token : function(value) { + if (keywords.hasOwnProperty(value)) + return "keyword"; + else if (builtinConstants.hasOwnProperty(value)) + return "constant.language"; + else if (builtinVariables.hasOwnProperty(value)) + return "variable.language"; + else if (builtinFunctions.hasOwnProperty(value) || builtinFunctions.hasOwnProperty(value.substring(1))) + return "support.function"; + else if (value == "debugger") + return "invalid.deprecated"; + else + if(value.match(/^(\$[a-zA-Z_][a-zA-Z0-9_]*)$/)) + return "variable"; + return "identifier"; + }, + regex : "[a-zA-Z$#][a-zA-Z0-9_]*\\b" + }, { + token : "keyword.operator", + regex : "!|&|\\*|\\-|\\+|=|!=|<=|>=|<|>|&&|\\|\\|" + }, { + token : "lparen", + regex : "[[({]" + }, { + token : "rparen", + regex : "[\\])}]" + }, { + token : "text", + regex : "\\s+" + } + ], + "cdata" : [ + { + token : "text", + regex : "\\]\\]>", + next : "start" + }, { + token : "text", + regex : "\\s+" + }, { + token : "text", + regex : ".+" + } + ], + "comment" : [ + { + token : "comment", // closing comment + regex : "\\*#|-->", + next : "start" + }, { + defaultToken: "comment" + } + ], + "vm_start" : [ + { + token: "variable", + regex: "}", + next: "start" + }, { + token : "string.regexp", + regex : "[/](?:(?:\\[(?:\\\\]|[^\\]])+\\])|(?:\\\\/|[^\\]/]))*[/]\\w*\\s*(?=[).,;]|$)" + }, { + token : "string", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' + }, { + token : "string", // single line + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" + }, { + token : "constant.numeric", // hex + regex : "0[xX][0-9a-fA-F]+\\b" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : "constant.language.boolean", + regex : "(?:true|false)\\b" + }, { + token : function(value) { + if (keywords.hasOwnProperty(value)) + return "keyword"; + else if (builtinConstants.hasOwnProperty(value)) + return "constant.language"; + else if (builtinVariables.hasOwnProperty(value)) + return "variable.language"; + else if (builtinFunctions.hasOwnProperty(value) || builtinFunctions.hasOwnProperty(value.substring(1))) + return "support.function"; + else if (value == "debugger") + return "invalid.deprecated"; + else + if(value.match(/^(\$[a-zA-Z_$][a-zA-Z0-9_]*)$/)) + return "variable"; + return "identifier"; + }, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "keyword.operator", + regex : "!|&|\\*|\\-|\\+|=|!=|<=|>=|<|>|&&|\\|\\|" + }, { + token : "lparen", + regex : "[[({]" + }, { + token : "rparen", + regex : "[\\])}]" + }, { + token : "text", + regex : "\\s+" + } + ] + }; + + xmlUtil.tag(this.$rules, "tag", "start"); + xmlUtil.tag(this.$rules, "style", "css-start"); + xmlUtil.tag(this.$rules, "script", "js-start"); + + this.embedRules(JavaScriptHighlightRules, "js-", [{ + token: "comment", + regex: "\\/\\/.*(?=<\\/script>)", + next: "tag" + }, { + token: "meta.tag", + regex: "<\\/(?=script)", + next: "tag" + }]); + + this.embedRules(CssHighlightRules, "css-", [{ + token: "meta.tag", + regex: "<\\/(?=style)", + next: "tag" + }]); + + for (var i in this.$rules) { + this.$rules[i].unshift({ + token: "variable", + regex: "\\${", + next: "vm_start" + }); + } +}; + +oop.inherits(VelocityHighlightRules, TextHighlightRules); + +exports.VelocityHighlightRules = VelocityHighlightRules; +}); + +ace.define('ace/mode/xml_util', ['require', 'exports', 'module' ], function(require, exports, module) { + + +function string(state) { + return [{ + token : "string", + regex : '"', + next : state + "_qqstring" + }, { + token : "string", + regex : "'", + next : state + "_qstring" + }]; +} + +function multiLineString(quote, state) { + return [ + {token : "string", regex : quote, next : state}, + { + token : "constant.language.escape", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }, + {defaultToken : "string"} + ]; +} + +exports.tag = function(states, name, nextState, tagMap) { + states[name] = [{ + token : "text", + regex : "\\s+" + }, { + + token : !tagMap ? "meta.tag.tag-name" : function(value) { + if (tagMap[value]) + return "meta.tag.tag-name." + tagMap[value]; + else + return "meta.tag.tag-name"; + }, + regex : "[-_a-zA-Z0-9:]+", + next : name + "_embed_attribute_list" + }, { + token: "empty", + regex: "", + next : name + "_embed_attribute_list" + }]; + + states[name + "_qstring"] = multiLineString("'", name + "_embed_attribute_list"); + states[name + "_qqstring"] = multiLineString("\"", name + "_embed_attribute_list"); + + states[name + "_embed_attribute_list"] = [{ + token : "meta.tag.r", + regex : "/?>", + next : nextState + }, { + token : "keyword.operator", + regex : "=" + }, { + token : "entity.other.attribute-name", + regex : "[-_a-zA-Z0-9:]+" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : "text", + regex : "\\s+" + }].concat(string(name)); +}; + +}); + +ace.define('ace/mode/css_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var supportType = exports.supportType = "animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|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|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|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|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index"; +var supportFunction = exports.supportFunction = "rgb|rgba|url|attr|counter|counters"; +var supportConstant = exports.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"; +var supportConstantColor = exports.supportConstantColor = "aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow"; +var supportConstantFonts = exports.supportConstantFonts = "arial|century|comic|courier|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace"; + +var numRe = exports.numRe = "\\-?(?:(?:[0-9]+)|(?:[0-9]*\\.[0-9]+))"; +var pseudoElements = exports.pseudoElements = "(\\:+)\\b(after|before|first-letter|first-line|moz-selection|selection)\\b"; +var pseudoClasses = exports.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"; + +var CssHighlightRules = function() { + + var keywordMapper = this.createKeywordMapper({ + "support.function": supportFunction, + "support.constant": supportConstant, + "support.type": supportType, + "support.constant.color": supportConstantColor, + "support.constant.fonts": supportConstantFonts + }, "text", true); + + var base_ruleset = [ + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "ruleset_comment" + }, { + token : "string", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' + }, { + token : "string", // single line + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" + }, { + token : ["constant.numeric", "keyword"], + regex : "(" + numRe + ")(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 : numRe + }, { + token : "constant.numeric", // hex6 color + regex : "#[a-f0-9]{6}" + }, { + token : "constant.numeric", // hex3 color + regex : "#[a-f0-9]{3}" + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"], + regex : pseudoElements + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"], + regex : pseudoClasses + }, { + token : ["support.function", "string", "support.function"], + regex : "(url\\()(.*)(\\))" + }, { + token : keywordMapper, + regex : "\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*" + }, { + caseInsensitive: true + } + ]; + + var ruleset = lang.copyArray(base_ruleset); + ruleset.unshift({ + token : "paren.rparen", + regex : "\\}", + next: "start" + }); + + var media_ruleset = lang.copyArray( base_ruleset ); + media_ruleset.unshift({ + token : "paren.rparen", + regex : "\\}", + next: "media" + }); + + var base_comment = [{ + token : "comment", // comment spanning whole line + regex : ".+" + }]; + + var comment = lang.copyArray(base_comment); + comment.unshift({ + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "start" + }); + + var media_comment = lang.copyArray(base_comment); + media_comment.unshift({ + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "media" + }); + + var ruleset_comment = lang.copyArray(base_comment); + ruleset_comment.unshift({ + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "ruleset" + }); + + this.$rules = { + "start" : [{ + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment" + }, { + token: "paren.lparen", + regex: "\\{", + next: "ruleset" + }, { + token: "string", + regex: "@.*?{", + next: "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: true + }], + + "media" : [ { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "media_comment" + }, { + token: "paren.lparen", + regex: "\\{", + next: "media_ruleset" + },{ + token: "string", + regex: "\\}", + next: "start" + },{ + 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: true + }], + + "comment" : comment, + + "ruleset" : ruleset, + "ruleset_comment" : ruleset_comment, + + "media_ruleset" : media_ruleset, + "media_comment" : media_comment + }; +}; + +oop.inherits(CssHighlightRules, TextHighlightRules); + +exports.CssHighlightRules = CssHighlightRules; + +}); + +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(require, exports, module) { + + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var JavaScriptHighlightRules = function() { + var keywordMapper = this.createKeywordMapper({ + "variable.language": + "Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|" + // Constructors + "Namespace|QName|XML|XMLList|" + // E4X + "ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|" + + "Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|" + + "Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|" + // Errors + "SyntaxError|TypeError|URIError|" + + "decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|" + // Non-constructor functions + "isNaN|parseFloat|parseInt|" + + "JSON|Math|" + // Other + "this|arguments|prototype|window|document" , // Pseudo + "keyword": + "const|yield|import|get|set|" + + "break|case|catch|continue|default|delete|do|else|finally|for|function|" + + "if|in|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"); + var kwBeforeRe = "case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void"; + var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*\\b"; + + var escapedRe = "\\\\(?:x[0-9a-fA-F]{2}|" + // hex + "u[0-9a-fA-F]{4}|" + // unicode + "[0-2][0-7]{0,2}|" + // oct + "3[0-6][0-7]?|" + // oct + "37[0-7]?|" + // oct + "[4-7][0-7]?|" + //oct + ".)"; + + this.$rules = { + "no_regex" : [ + { + token : "comment", + regex : /\/\/.*$/ + }, + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : /\/\*/, + next : "comment" + }, { + token : "string", + regex : "'(?=.)", + next : "qstring" + }, { + token : "string", + regex : '"(?=.)', + next : "qqstring" + }, { + token : "constant.numeric", // hex + regex : /0[xX][0-9a-fA-F]+\b/ + }, { + token : "constant.numeric", // float + regex : /[+-]?\d+(?:(?:\.\d*)?(?:[eE][+-]?\d+)?)?\b/ + }, { + token : [ + "storage.type", "punctuation.operator", "support.function", + "punctuation.operator", "entity.name.function", "text","keyword.operator" + ], + regex : "(" + identifierRe + ")(\\.)(prototype)(\\.)(" + identifierRe +")(\\s*)(=)", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "keyword.operator", "text", "storage.type", + "text", "paren.lparen" + ], + regex : "(" + identifierRe +")(\\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 : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(function)(\\s+)(" + identifierRe + ")(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "punctuation.operator", + "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\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 : "(?:" + kwBeforeRe + ")\\b", + next : "start" + }, { + token : ["punctuation.operator", "support.function"], + regex : /(\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:opzzzz|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 : ["punctuation.operator", "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)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/ + }, { + token : ["punctuation.operator", "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 : ["storage.type", "punctuation.operator", "support.function.firebug"], + regex : /(console)(\.)(warn|info|log|error|time|timeEnd|assert)\b/ + }, { + token : keywordMapper, + regex : identifierRe + }, { + token : "keyword.operator", + regex : /--|\+\+|[!$%&*+\-~]|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\|\||\?\:|\*=|%=|\+=|\-=|&=|\^=/, + next : "start" + }, { + token : "punctuation.operator", + regex : /\?|\:|\,|\;|\./, + next : "start" + }, { + token : "paren.lparen", + regex : /[\[({]/, + next : "start" + }, { + token : "paren.rparen", + regex : /[\])}]/ + }, { + token : "keyword.operator", + regex : /\/=?/, + next : "start" + }, { + token: "comment", + regex: /^#!.*$/ + } + ], + "start": [ + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment_regex_allowed" + }, { + token : "comment", + regex : "\\/\\/.*$", + next : "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: "/\\w*", + 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.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: identifierRe + }, { + token: "punctuation.operator", + regex: "[, ]+" + }, { + token: "punctuation.operator", + regex: "$" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "comment_regex_allowed" : [ + {token : "comment", regex : "\\*\\/", next : "start"}, + {defaultToken : "comment"} + ], + "comment" : [ + {token : "comment", regex : "\\*\\/", next : "no_regex"}, + {defaultToken : "comment"} + ], + "qqstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + next : "qqstring" + }, { + token : "string", + regex : '"|$', + next : "no_regex" + }, { + defaultToken: "string" + } + ], + "qstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + next : "qstring" + }, { + token : "string", + regex : "'|$", + next : "no_regex" + }, { + defaultToken: "string" + } + ] + }; + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("no_regex") ]); +}; + +oop.inherits(JavaScriptHighlightRules, TextHighlightRules); + +exports.JavaScriptHighlightRules = JavaScriptHighlightRules; +}); + +ace.define('ace/mode/doc_comment_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, { + token : "comment.doc.tag", + regex : "\\bTODO\\b" + }, { + defaultToken : "comment.doc" + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define('ace/mode/folding/velocity', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/folding/fold_mode', 'ace/range'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var BaseFoldMode = require("./fold_mode").FoldMode; +var Range = require("../../range").Range; + +var FoldMode = exports.FoldMode = function() {}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var range = this.indentationBlock(session, row); + if (range) + return range; + + var re = /\S/; + var line = session.getLine(row); + var startLevel = line.search(re); + if (startLevel == -1 || line[startLevel] != "##") + return; + + var startColumn = line.length; + var maxRow = session.getLength(); + var startRow = row; + var endRow = row; + + while (++row < maxRow) { + line = session.getLine(row); + var level = line.search(re); + + if (level == -1) + continue; + + if (line[level] != "##") + break; + + endRow = row; + } + + if (endRow > startRow) { + var endColumn = session.getLine(endRow).length; + return new Range(startRow, startColumn, endRow, endColumn); + } + }; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + var indent = line.search(/\S/); + var next = session.getLine(row + 1); + var prev = session.getLine(row - 1); + var prevIndent = prev.search(/\S/); + var nextIndent = next.search(/\S/); + + if (indent == -1) { + session.foldWidgets[row - 1] = prevIndent!= -1 && prevIndent < nextIndent ? "start" : ""; + return ""; + } + if (prevIndent == -1) { + if (indent == nextIndent && line[indent] == "##" && next[indent] == "##") { + session.foldWidgets[row - 1] = ""; + session.foldWidgets[row + 1] = ""; + return "start"; + } + } else if (prevIndent == indent && line[indent] == "##" && prev[indent] == "##") { + if (session.getLine(row - 2).search(/\S/) == -1) { + session.foldWidgets[row - 1] = "start"; + session.foldWidgets[row + 1] = ""; + return ""; + } + } + + if (prevIndent!= -1 && prevIndent < indent) + session.foldWidgets[row - 1] = "start"; + else + session.foldWidgets[row - 1] = ""; + + if (indent < nextIndent) + return "start"; + else + return ""; + }; + +}).call(FoldMode.prototype); + +}); + +ace.define('ace/mode/behaviour/html', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour/xml', 'ace/mode/behaviour/cstyle', 'ace/token_iterator'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var XmlBehaviour = require("../behaviour/xml").XmlBehaviour; +var CstyleBehaviour = require("./cstyle").CstyleBehaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; +var voidElements = ['area', 'base', 'br', 'col', 'command', 'embed', 'hr', 'img', 'input', 'keygen', 'link', 'meta', 'param', 'source', 'track', 'wbr']; + +function hasType(token, type) { + var hasType = true; + var typeList = token.type.split('.'); + var needleList = type.split('.'); + needleList.forEach(function(needle){ + if (typeList.indexOf(needle) == -1) { + hasType = false; + return false; + } + }); + return hasType; +} + +var HtmlBehaviour = function () { + + this.inherit(XmlBehaviour); // Get xml behaviour + + this.add("autoclosing", "insertion", function (state, action, editor, session, text) { + if (text == '>') { + var position = editor.getCursorPosition(); + var iterator = new TokenIterator(session, position.row, position.column); + var token = iterator.getCurrentToken(); + + if (hasType(token, 'string') && iterator.getCurrentTokenColumn() + token.value.length > position.column) + return; + var atCursor = false; + if (!token || !hasType(token, 'meta.tag') && !(hasType(token, 'text') && token.value.match('/'))){ + do { + token = iterator.stepBackward(); + } while (token && (hasType(token, 'string') || hasType(token, 'keyword.operator') || hasType(token, 'entity.attribute-name') || hasType(token, 'text'))); + } else { + atCursor = true; + } + if (!token || !hasType(token, 'meta.tag-name') || iterator.stepBackward().value.match('/')) { + return + } + var element = token.value; + if (atCursor){ + var element = element.substring(0, position.column - token.start); + } + if (voidElements.indexOf(element) !== -1){ + return; + } + return { + text: '>' + '', + selection: [1, 1] + } + } + }); +} +oop.inherits(HtmlBehaviour, XmlBehaviour); + +exports.HtmlBehaviour = HtmlBehaviour; +}); + +ace.define('ace/mode/behaviour/xml', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/mode/behaviour/cstyle', 'ace/token_iterator'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var CstyleBehaviour = require("./cstyle").CstyleBehaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; + +function hasType(token, type) { + var hasType = true; + var typeList = token.type.split('.'); + var needleList = type.split('.'); + needleList.forEach(function(needle){ + if (typeList.indexOf(needle) == -1) { + hasType = false; + return false; + } + }); + return hasType; +} + +var XmlBehaviour = function () { + + this.inherit(CstyleBehaviour, ["string_dquotes"]); // Get string behaviour + + this.add("autoclosing", "insertion", function (state, action, editor, session, text) { + if (text == '>') { + var position = editor.getCursorPosition(); + var iterator = new TokenIterator(session, position.row, position.column); + var token = iterator.getCurrentToken(); + var atCursor = false; + if (!token || !hasType(token, 'meta.tag') && !(hasType(token, 'text') && token.value.match('/'))){ + do { + token = iterator.stepBackward(); + } while (token && (hasType(token, 'string') || hasType(token, 'keyword.operator') || hasType(token, 'entity.attribute-name') || hasType(token, 'text'))); + } else { + atCursor = true; + } + if (!token || !hasType(token, 'meta.tag-name') || iterator.stepBackward().value.match('/')) { + return + } + var tag = token.value; + if (atCursor){ + var tag = tag.substring(0, position.column - token.start); + } + + return { + text: '>' + '', + selection: [1, 1] + } + } + }); + + this.add('autoindent', 'insertion', function (state, action, editor, session, text) { + if (text == "\n") { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChars = line.substring(cursor.column, cursor.column + 2); + if (rightChars == ' -1; + }; + + CstyleBehaviour.recordAutoInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isAutoInsertedClosing(cursor, line, autoInsertedLineEnd[0])) + autoInsertedBrackets = 0; + autoInsertedRow = cursor.row; + autoInsertedLineEnd = bracket + line.substr(cursor.column); + autoInsertedBrackets++; + }; + + CstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isMaybeInsertedClosing(cursor, line)) + maybeInsertedBrackets = 0; + maybeInsertedRow = cursor.row; + maybeInsertedLineStart = line.substr(0, cursor.column) + bracket; + maybeInsertedLineEnd = line.substr(cursor.column); + maybeInsertedBrackets++; + }; + + CstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) { + return autoInsertedBrackets > 0 && + cursor.row === autoInsertedRow && + bracket === autoInsertedLineEnd[0] && + line.substr(cursor.column) === autoInsertedLineEnd; + }; + + CstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) { + return maybeInsertedBrackets > 0 && + cursor.row === maybeInsertedRow && + line.substr(cursor.column) === maybeInsertedLineEnd && + line.substr(0, cursor.column) == maybeInsertedLineStart; + }; + + CstyleBehaviour.popAutoInsertedClosing = function() { + autoInsertedLineEnd = autoInsertedLineEnd.substr(1); + autoInsertedBrackets--; + }; + + CstyleBehaviour.clearMaybeInsertedClosing = function() { + maybeInsertedBrackets = 0; + maybeInsertedRow = -1; + }; + + this.add("braces", "insertion", function (state, action, editor, session, text) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (text == '{') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "{" && editor.getWrapBehavioursEnabled()) { + return { + text: '{' + selected + '}', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + if (/[\]\}\)]/.test(line[cursor.column])) { + CstyleBehaviour.recordAutoInsert(editor, session, "}"); + return { + text: '{}', + selection: [1, 1] + }; + } else { + CstyleBehaviour.recordMaybeInsert(editor, session, "{"); + return { + text: '{', + selection: [1, 1] + }; + } + } + } else if (text == '}') { + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}') { + var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } else if (text == "\n" || text == "\r\n") { + var closing = ""; + if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) { + closing = lang.stringRepeat("}", maybeInsertedBrackets); + CstyleBehaviour.clearMaybeInsertedClosing(); + } + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}' || closing !== "") { + var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column}, '}'); + if (!openBracePos) + return null; + + var indent = this.getNextLineIndent(state, line.substring(0, cursor.column), session.getTabString()); + var next_indent = this.$getIndent(line); + + return { + text: '\n' + indent + '\n' + next_indent + closing, + selection: [1, indent.length, 1, indent.length] + }; + } + } + }); + + this.add("braces", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '{') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar == '}') { + range.end.column++; + return range; + } else { + maybeInsertedBrackets--; + } + } + }); + + this.add("parens", "insertion", function (state, action, editor, session, text) { + if (text == '(') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return { + text: '(' + selected + ')', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, ")"); + return { + text: '()', + selection: [1, 1] + }; + } + } else if (text == ')') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ')') { + var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("parens", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '(') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ')') { + range.end.column++; + return range; + } + } + }); + + this.add("brackets", "insertion", function (state, action, editor, session, text) { + if (text == '[') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return { + text: '[' + selected + ']', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, "]"); + return { + text: '[]', + selection: [1, 1] + }; + } + } else if (text == ']') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ']') { + var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("brackets", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '[') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ']') { + range.end.column++; + return range; + } + } + }); + + this.add("string_dquotes", "insertion", function (state, action, editor, session, text) { + if (text == '"' || text == "'") { + var quote = text; + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "'" && selected != '"' && editor.getWrapBehavioursEnabled()) { + return { + text: quote + selected + quote, + selection: false + }; + } else { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var leftChar = line.substring(cursor.column-1, cursor.column); + if (leftChar == '\\') { + return null; + } + var tokens = session.getTokens(selection.start.row); + var col = 0, token; + var quotepos = -1; // Track whether we're inside an open quote. + + for (var x = 0; x < tokens.length; x++) { + token = tokens[x]; + if (token.type == "string") { + quotepos = -1; + } else if (quotepos < 0) { + quotepos = token.value.indexOf(quote); + } + if ((token.value.length + col) > selection.start.column) { + break; + } + col += tokens[x].value.length; + } + if (!token || (quotepos < 0 && token.type !== "comment" && (token.type !== "string" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) { + if (!CstyleBehaviour.isSaneInsertion(editor, session)) + return; + return { + text: quote + quote, + selection: [1,1] + }; + } else if (token && token.type === "string") { + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == quote) { + return { + text: '', + selection: [1, 1] + }; + } + } + } + } + }); + + this.add("string_dquotes", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && (selected == '"' || selected == "'")) { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == selected) { + range.end.column++; + return range; + } + } + }); + +}; + +oop.inherits(CstyleBehaviour, Behaviour); + +exports.CstyleBehaviour = CstyleBehaviour; +}); diff --git a/0.0.3_0/ace/mode-verilog.js b/0.0.3_0/ace/mode-verilog.js new file mode 100644 index 0000000..0756e47 --- /dev/null +++ b/0.0.3_0/ace/mode-verilog.js @@ -0,0 +1,126 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2010, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/mode/verilog', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/verilog_highlight_rules', 'ace/range'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var VerilogHighlightRules = require("./verilog_highlight_rules").VerilogHighlightRules; +var Range = require("../range").Range; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new VerilogHighlightRules().getRules()); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + +}).call(Mode.prototype); + +exports.Mode = Mode; + +}); + + +ace.define('ace/mode/verilog_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var VerilogHighlightRules = function() { +var keywords = "always|and|assign|automatic|begin|buf|bufif0|bufif1|case|casex|casez|cell|cmos|config|" + + "deassign|default|defparam|design|disable|edge|else|end|endcase|endconfig|endfunction|endgenerate|endmodule|" + + "endprimitive|endspecify|endtable|endtask|event|for|force|forever|fork|function|generate|genvar|highz0|" + + "highz1|if|ifnone|incdir|include|initial|inout|input|instance|integer|join|large|liblist|library|localparam|" + + "macromodule|medium|module|nand|negedge|nmos|nor|noshowcancelled|not|notif0|notif1|or|output|parameter|pmos|" + + "posedge|primitive|pull0|pull1|pulldown|pullup|pulsestyle_onevent|pulsestyle_ondetect|rcmos|real|realtime|" + + "reg|release|repeat|rnmos|rpmos|rtran|rtranif0|rtranif1|scalared|showcancelled|signed|small|specify|specparam|" + + "strong0|strong1|supply0|supply1|table|task|time|tran|tranif0|tranif1|tri|tri0|tri1|triand|trior|trireg|" + + "unsigned|use|vectored|wait|wand|weak0|weak1|while|wire|wor|xnor|xor" + + "begin|bufif0|bufif1|case|casex|casez|config|else|end|endcase|endconfig|endfunction|" + + "endgenerate|endmodule|endprimitive|endspecify|endtable|endtask|for|forever|function|generate|if|ifnone|" + + "macromodule|module|primitive|repeat|specify|table|task|while"; + + var builtinConstants = ( + "true|false|null" + ); + + var builtinFunctions = ( + "count|min|max|avg|sum|rank|now|coalesce|main" + ); + + var keywordMapper = this.createKeywordMapper({ + "support.function": builtinFunctions, + "keyword": keywords, + "constant.language": builtinConstants + }, "identifier", true); + + this.$rules = { + "start" : [ { + token : "comment", + regex : "//.*$" + }, { + token : "string", // " string + regex : '".*?"' + }, { + token : "string", // ' string + regex : "'.*?'" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "keyword.operator", + regex : "\\+|\\-|\\/|\\/\\/|%|<@>|@>|<@|&|\\^|~|<|>|<=|=>|==|!=|<>|=" + }, { + token : "paren.lparen", + regex : "[\\(]" + }, { + token : "paren.rparen", + regex : "[\\)]" + }, { + token : "text", + regex : "\\s+" + } ] + }; +}; + +oop.inherits(VerilogHighlightRules, TextHighlightRules); + +exports.VerilogHighlightRules = VerilogHighlightRules; +}); diff --git a/0.0.3_0/ace/mode-xml.js b/0.0.3_0/ace/mode-xml.js new file mode 100644 index 0000000..8dba147 --- /dev/null +++ b/0.0.3_0/ace/mode-xml.js @@ -0,0 +1,788 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2010, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ***** END LICENSE BLOCK ***** */ + +ace.define('ace/mode/xml', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/xml_highlight_rules', 'ace/mode/behaviour/xml', 'ace/mode/folding/xml'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var XmlHighlightRules = require("./xml_highlight_rules").XmlHighlightRules; +var XmlBehaviour = require("./behaviour/xml").XmlBehaviour; +var XmlFoldMode = require("./folding/xml").FoldMode; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new XmlHighlightRules().getRules()); + this.$behaviour = new XmlBehaviour(); + this.foldingRules = new XmlFoldMode(); +}; + +oop.inherits(Mode, TextMode); + +(function() { + + this.blockComment = {start: ""}; + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/xml_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/xml_util', 'ace/mode/text_highlight_rules'], function(require, exports, module) { + + +var oop = require("../lib/oop"); +var xmlUtil = require("./xml_util"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var XmlHighlightRules = function() { + this.$rules = { + start : [ + {token : "text", regex : "<\\!\\[CDATA\\[", next : "cdata"}, + {token : "xml-pe", regex : "<\\?.*?\\?>"}, + {token : "comment", regex : "<\\!--", next : "comment"}, + {token : "xml-pe", regex : "<\\!.*?>"}, + {token : "meta.tag", regex : "<\\/?", next : "tag"}, + {token : "text", regex : "\\s+"}, + { + token : "constant.character.entity", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + } + ], + + cdata : [ + {token : "text", regex : "\\]\\]>", next : "start"}, + {token : "text", regex : "\\s+"}, + {token : "text", regex : "(?:[^\\]]|\\](?!\\]>))+"} + ], + + comment : [ + {token : "comment", regex : ".*?-->", next : "start"}, + {token : "comment", regex : ".+"} + ] + }; + + xmlUtil.tag(this.$rules, "tag", "start"); +}; + +oop.inherits(XmlHighlightRules, TextHighlightRules); + +exports.XmlHighlightRules = XmlHighlightRules; +}); + +ace.define('ace/mode/xml_util', ['require', 'exports', 'module' ], function(require, exports, module) { + + +function string(state) { + return [{ + token : "string", + regex : '"', + next : state + "_qqstring" + }, { + token : "string", + regex : "'", + next : state + "_qstring" + }]; +} + +function multiLineString(quote, state) { + return [ + {token : "string", regex : quote, next : state}, + { + token : "constant.language.escape", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }, + {defaultToken : "string"} + ]; +} + +exports.tag = function(states, name, nextState, tagMap) { + states[name] = [{ + token : "text", + regex : "\\s+" + }, { + + token : !tagMap ? "meta.tag.tag-name" : function(value) { + if (tagMap[value]) + return "meta.tag.tag-name." + tagMap[value]; + else + return "meta.tag.tag-name"; + }, + regex : "[-_a-zA-Z0-9:]+", + next : name + "_embed_attribute_list" + }, { + token: "empty", + regex: "", + next : name + "_embed_attribute_list" + }]; + + states[name + "_qstring"] = multiLineString("'", name + "_embed_attribute_list"); + states[name + "_qqstring"] = multiLineString("\"", name + "_embed_attribute_list"); + + states[name + "_embed_attribute_list"] = [{ + token : "meta.tag.r", + regex : "/?>", + next : nextState + }, { + token : "keyword.operator", + regex : "=" + }, { + token : "entity.other.attribute-name", + regex : "[-_a-zA-Z0-9:]+" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : "text", + regex : "\\s+" + }].concat(string(name)); +}; + +}); + +ace.define('ace/mode/behaviour/xml', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/mode/behaviour/cstyle', 'ace/token_iterator'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var CstyleBehaviour = require("./cstyle").CstyleBehaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; + +function hasType(token, type) { + var hasType = true; + var typeList = token.type.split('.'); + var needleList = type.split('.'); + needleList.forEach(function(needle){ + if (typeList.indexOf(needle) == -1) { + hasType = false; + return false; + } + }); + return hasType; +} + +var XmlBehaviour = function () { + + this.inherit(CstyleBehaviour, ["string_dquotes"]); // Get string behaviour + + this.add("autoclosing", "insertion", function (state, action, editor, session, text) { + if (text == '>') { + var position = editor.getCursorPosition(); + var iterator = new TokenIterator(session, position.row, position.column); + var token = iterator.getCurrentToken(); + var atCursor = false; + if (!token || !hasType(token, 'meta.tag') && !(hasType(token, 'text') && token.value.match('/'))){ + do { + token = iterator.stepBackward(); + } while (token && (hasType(token, 'string') || hasType(token, 'keyword.operator') || hasType(token, 'entity.attribute-name') || hasType(token, 'text'))); + } else { + atCursor = true; + } + if (!token || !hasType(token, 'meta.tag-name') || iterator.stepBackward().value.match('/')) { + return + } + var tag = token.value; + if (atCursor){ + var tag = tag.substring(0, position.column - token.start); + } + + return { + text: '>' + '', + selection: [1, 1] + } + } + }); + + this.add('autoindent', 'insertion', function (state, action, editor, session, text) { + if (text == "\n") { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChars = line.substring(cursor.column, cursor.column + 2); + if (rightChars == ' -1; + }; + + CstyleBehaviour.recordAutoInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isAutoInsertedClosing(cursor, line, autoInsertedLineEnd[0])) + autoInsertedBrackets = 0; + autoInsertedRow = cursor.row; + autoInsertedLineEnd = bracket + line.substr(cursor.column); + autoInsertedBrackets++; + }; + + CstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isMaybeInsertedClosing(cursor, line)) + maybeInsertedBrackets = 0; + maybeInsertedRow = cursor.row; + maybeInsertedLineStart = line.substr(0, cursor.column) + bracket; + maybeInsertedLineEnd = line.substr(cursor.column); + maybeInsertedBrackets++; + }; + + CstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) { + return autoInsertedBrackets > 0 && + cursor.row === autoInsertedRow && + bracket === autoInsertedLineEnd[0] && + line.substr(cursor.column) === autoInsertedLineEnd; + }; + + CstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) { + return maybeInsertedBrackets > 0 && + cursor.row === maybeInsertedRow && + line.substr(cursor.column) === maybeInsertedLineEnd && + line.substr(0, cursor.column) == maybeInsertedLineStart; + }; + + CstyleBehaviour.popAutoInsertedClosing = function() { + autoInsertedLineEnd = autoInsertedLineEnd.substr(1); + autoInsertedBrackets--; + }; + + CstyleBehaviour.clearMaybeInsertedClosing = function() { + maybeInsertedBrackets = 0; + maybeInsertedRow = -1; + }; + + this.add("braces", "insertion", function (state, action, editor, session, text) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (text == '{') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "{" && editor.getWrapBehavioursEnabled()) { + return { + text: '{' + selected + '}', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + if (/[\]\}\)]/.test(line[cursor.column])) { + CstyleBehaviour.recordAutoInsert(editor, session, "}"); + return { + text: '{}', + selection: [1, 1] + }; + } else { + CstyleBehaviour.recordMaybeInsert(editor, session, "{"); + return { + text: '{', + selection: [1, 1] + }; + } + } + } else if (text == '}') { + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}') { + var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } else if (text == "\n" || text == "\r\n") { + var closing = ""; + if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) { + closing = lang.stringRepeat("}", maybeInsertedBrackets); + CstyleBehaviour.clearMaybeInsertedClosing(); + } + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}' || closing !== "") { + var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column}, '}'); + if (!openBracePos) + return null; + + var indent = this.getNextLineIndent(state, line.substring(0, cursor.column), session.getTabString()); + var next_indent = this.$getIndent(line); + + return { + text: '\n' + indent + '\n' + next_indent + closing, + selection: [1, indent.length, 1, indent.length] + }; + } + } + }); + + this.add("braces", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '{') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar == '}') { + range.end.column++; + return range; + } else { + maybeInsertedBrackets--; + } + } + }); + + this.add("parens", "insertion", function (state, action, editor, session, text) { + if (text == '(') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return { + text: '(' + selected + ')', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, ")"); + return { + text: '()', + selection: [1, 1] + }; + } + } else if (text == ')') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ')') { + var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("parens", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '(') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ')') { + range.end.column++; + return range; + } + } + }); + + this.add("brackets", "insertion", function (state, action, editor, session, text) { + if (text == '[') { + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return { + text: '[' + selected + ']', + selection: false + }; + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, "]"); + return { + text: '[]', + selection: [1, 1] + }; + } + } else if (text == ']') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ']') { + var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("brackets", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '[') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ']') { + range.end.column++; + return range; + } + } + }); + + this.add("string_dquotes", "insertion", function (state, action, editor, session, text) { + if (text == '"' || text == "'") { + var quote = text; + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "'" && selected != '"' && editor.getWrapBehavioursEnabled()) { + return { + text: quote + selected + quote, + selection: false + }; + } else { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var leftChar = line.substring(cursor.column-1, cursor.column); + if (leftChar == '\\') { + return null; + } + var tokens = session.getTokens(selection.start.row); + var col = 0, token; + var quotepos = -1; // Track whether we're inside an open quote. + + for (var x = 0; x < tokens.length; x++) { + token = tokens[x]; + if (token.type == "string") { + quotepos = -1; + } else if (quotepos < 0) { + quotepos = token.value.indexOf(quote); + } + if ((token.value.length + col) > selection.start.column) { + break; + } + col += tokens[x].value.length; + } + if (!token || (quotepos < 0 && token.type !== "comment" && (token.type !== "string" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) { + if (!CstyleBehaviour.isSaneInsertion(editor, session)) + return; + return { + text: quote + quote, + selection: [1,1] + }; + } else if (token && token.type === "string") { + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == quote) { + return { + text: '', + selection: [1, 1] + }; + } + } + } + } + }); + + this.add("string_dquotes", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && (selected == '"' || selected == "'")) { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == selected) { + range.end.column++; + return range; + } + } + }); + +}; + +oop.inherits(CstyleBehaviour, Behaviour); + +exports.CstyleBehaviour = CstyleBehaviour; +}); + +ace.define('ace/mode/folding/xml', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/range', 'ace/mode/folding/fold_mode', 'ace/token_iterator'], function(require, exports, module) { + + +var oop = require("../../lib/oop"); +var lang = require("../../lib/lang"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; +var TokenIterator = require("../../token_iterator").TokenIterator; + +var FoldMode = exports.FoldMode = function(voidElements) { + BaseFoldMode.call(this); + this.voidElements = voidElements || {}; +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.getFoldWidget = function(session, foldStyle, row) { + var tag = this._getFirstTagInLine(session, row); + + if (tag.closing) + return foldStyle == "markbeginend" ? "end" : ""; + + if (!tag.tagName || this.voidElements[tag.tagName.toLowerCase()]) + return ""; + + if (tag.selfClosing) + return ""; + + if (tag.value.indexOf("/" + tag.tagName) !== -1) + return ""; + + return "start"; + }; + + this._getFirstTagInLine = function(session, row) { + var tokens = session.getTokens(row); + var value = ""; + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i]; + if (token.type.indexOf("meta.tag") === 0) + value += token.value; + else + value += lang.stringRepeat(" ", token.value.length); + } + + return this._parseTag(value); + }; + + this.tagRe = /^(\s*)(?)/; + this._parseTag = function(tag) { + + var match = tag.match(this.tagRe); + var column = 0; + + return { + value: tag, + match: match ? match[2] : "", + closing: match ? !!match[3] : false, + selfClosing: match ? !!match[5] || match[2] == "/>" : false, + tagName: match ? match[4] : "", + column: match[1] ? column + match[1].length : column + }; + }; + this._readTagForward = function(iterator) { + var token = iterator.getCurrentToken(); + if (!token) + return null; + + var value = ""; + var start; + + do { + if (token.type.indexOf("meta.tag") === 0) { + if (!start) { + var start = { + row: iterator.getCurrentTokenRow(), + column: iterator.getCurrentTokenColumn() + }; + } + value += token.value; + if (value.indexOf(">") !== -1) { + var tag = this._parseTag(value); + tag.start = start; + tag.end = { + row: iterator.getCurrentTokenRow(), + column: iterator.getCurrentTokenColumn() + token.value.length + }; + iterator.stepForward(); + return tag; + } + } + } while(token = iterator.stepForward()); + + return null; + }; + + this._readTagBackward = function(iterator) { + var token = iterator.getCurrentToken(); + if (!token) + return null; + + var value = ""; + var end; + + do { + if (token.type.indexOf("meta.tag") === 0) { + if (!end) { + end = { + row: iterator.getCurrentTokenRow(), + column: iterator.getCurrentTokenColumn() + token.value.length + }; + } + value = token.value + value; + if (value.indexOf("<") !== -1) { + var tag = this._parseTag(value); + tag.end = end; + tag.start = { + row: iterator.getCurrentTokenRow(), + column: iterator.getCurrentTokenColumn() + }; + iterator.stepBackward(); + return tag; + } + } + } while(token = iterator.stepBackward()); + + return null; + }; + + this._pop = function(stack, tag) { + while (stack.length) { + + var top = stack[stack.length-1]; + if (!tag || top.tagName == tag.tagName) { + return stack.pop(); + } + else if (this.voidElements[tag.tagName]) { + return; + } + else if (this.voidElements[top.tagName]) { + stack.pop(); + continue; + } else { + return null; + } + } + }; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var firstTag = this._getFirstTagInLine(session, row); + + if (!firstTag.match) + return null; + + var isBackward = firstTag.closing || firstTag.selfClosing; + var stack = []; + var tag; + + if (!isBackward) { + var iterator = new TokenIterator(session, row, firstTag.column); + var start = { + row: row, + column: firstTag.column + firstTag.tagName.length + 2 + }; + while (tag = this._readTagForward(iterator)) { + if (tag.selfClosing) { + if (!stack.length) { + tag.start.column += tag.tagName.length + 2; + tag.end.column -= 2; + return Range.fromPoints(tag.start, tag.end); + } else + continue; + } + + if (tag.closing) { + this._pop(stack, tag); + if (stack.length == 0) + return Range.fromPoints(start, tag.start); + } + else { + stack.push(tag) + } + } + } + else { + var iterator = new TokenIterator(session, row, firstTag.column + firstTag.match.length); + var end = { + row: row, + column: firstTag.column + }; + + while (tag = this._readTagBackward(iterator)) { + if (tag.selfClosing) { + if (!stack.length) { + tag.start.column += tag.tagName.length + 2; + tag.end.column -= 2; + return Range.fromPoints(tag.start, tag.end); + } else + continue; + } + + if (!tag.closing) { + this._pop(stack, tag); + if (stack.length == 0) { + tag.start.column += tag.tagName.length + 2; + return Range.fromPoints(tag.start, end); + } + } + else { + stack.push(tag) + } + } + } + + }; + +}).call(FoldMode.prototype); + +}); diff --git a/0.0.3_0/ace/mode-xquery.js b/0.0.3_0/ace/mode-xquery.js new file mode 100644 index 0000000..f7965c9 --- /dev/null +++ b/0.0.3_0/ace/mode-xquery.js @@ -0,0 +1,2750 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2010, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ***** END LICENSE BLOCK ***** */ +ace.define('ace/mode/xquery', ['require', 'exports', 'module' , 'ace/worker/worker_client', 'ace/lib/oop', 'ace/mode/text', 'ace/mode/xquery/XQueryLexer', 'ace/range', 'ace/mode/behaviour/xquery', 'ace/mode/folding/cstyle'], function(require, exports, module) { + + +var WorkerClient = require("../worker/worker_client").WorkerClient; +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var XQueryLexer = require("./xquery/XQueryLexer").XQueryLexer; +var Range = require("../range").Range; +var XQueryBehaviour = require("./behaviour/xquery").XQueryBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + + +var Mode = function() { + this.$tokenizer = new XQueryLexer(); + this.$behaviour = new XQueryBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; + +oop.inherits(Mode, TextMode); + +(function() { + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + var match = line.match(/\s*(?:then|else|return|[{\(]|<\w+>)\s*$/); + if (match) + indent += tab; + return indent; + }; + + this.checkOutdent = function(state, line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*[\}\)]/.test(input); + }; + + this.autoOutdent = function(state, doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*[\}\)])/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.toggleCommentLines = function(state, doc, startRow, endRow) { + var i, line; + var outdent = true; + var re = /^\s*\(:(.*):\)/; + + for (i=startRow; i<= endRow; i++) { + if (!re.test(doc.getLine(i))) { + outdent = false; + break; + } + } + + var range = new Range(0, 0, 0, 0); + for (i=startRow; i<= endRow; i++) { + line = doc.getLine(i); + range.start.row = i; + range.end.row = i; + range.end.column = line.length; + + doc.replace(range, outdent ? line.match(re)[1] : "(:" + line + ":)"); + } + }; + + this.createWorker = function(session) { + + var worker = new WorkerClient(["ace"], "ace/mode/xquery_worker", "XQueryWorker"); + var that = this; + + worker.attachToDocument(session.getDocument()); + + worker.on("error", function(e) { + session.setAnnotations([e.data]); + }); + + worker.on("ok", function(e) { + session.clearAnnotations(); + }); + + worker.on("highlight", function(tokens) { + that.$tokenizer.tokens = tokens.data.tokens; + that.$tokenizer.lines = session.getDocument().getAllLines(); + + var rows = Object.keys(that.$tokenizer.tokens); + for(var i=0; i < rows.length; i++) { + var row = parseInt(rows[i]); + delete session.bgTokenizer.lines[row]; + delete session.bgTokenizer.states[row]; + session.bgTokenizer.fireUpdateEvent(row, row); + } + }); + + return worker; + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define('ace/mode/xquery/XQueryLexer', ['require', 'exports', 'module' , 'ace/mode/xquery/XQueryTokenizer'], function(require, exports, module) { + + var XQueryTokenizer = require("./XQueryTokenizer").XQueryTokenizer; + + var TokenHandler = function(code) { + + var input = code; + + this.tokens = []; + + this.reset = function(code) { + input = input; + this.tokens = []; + }; + + this.startNonterminal = function(name, begin) {}; + + this.endNonterminal = function(name, end) {}; + + this.terminal = function(name, begin, end) { + this.tokens.push({ + name: name, + value: input.substring(begin, end) + }); + }; + + this.whitespace = function(begin, end) { + this.tokens.push({ + name: "WS", + value: input.substring(begin, end) + }); + }; + }; + + var keys = "after|ancestor|ancestor-or-self|and|as|ascending|attribute|before|case|cast|castable|child|collation|comment|copy|count|declare|default|delete|descendant|descendant-or-self|descending|div|document|document-node|element|else|empty|empty-sequence|end|eq|every|except|first|following|following-sibling|for|function|ge|group|gt|idiv|if|import|insert|instance|intersect|into|is|item|last|le|let|lt|mod|modify|module|namespace|namespace-node|ne|node|only|or|order|ordered|parent|preceding|preceding-sibling|processing-instruction|rename|replace|return|satisfies|schema-attribute|schema-element|self|some|stable|start|switch|text|to|treat|try|typeswitch|union|unordered|validate|where|with|xquery|contains|paragraphs|sentences|times|words|by|collectionreturn|variable|version|option|when|encoding|toswitch|catch|tumbling|sliding|window|at|using|stemming|collection|schema|while|on|nodes|index|external|then|in|updating|value|of|containsbreak|loop|continue|exit|returning|append|json|position|strict".split("|"); + var keywords = keys.map( + function(val) { return { name: "'" + val + "'", token: "keyword" }; } + ); + + var ncnames = keys.map( + function(val) { return { name: "'" + val + "'", token: "text", next: function(stack){ stack.pop(); } }; } + ); + + var cdata = "constant.language"; + var number = "constant"; + var xmlcomment = "comment"; + var pi = "xml-pe"; + var pragma = "constant.buildin"; + + var Rules = { + start: [ + { name: "'(#'", token: pragma, next: function(stack){ stack.push("Pragma"); } }, + { name: "'(:'", token: "comment", next: function(stack){ stack.push("Comment"); } }, + { name: "'(:~'", token: "comment.doc", next: function(stack){ stack.push("CommentDoc"); } }, + { name: "''", token: xmlcomment, next: function(stack){ stack.pop(); } } + ], + CData: [ + { name: "CDataSectionContents", token: cdata }, + { name: "']]>'", token: cdata, next: function(stack){ stack.pop(); } } + ], + PI: [ + { name: "DirPIContents", token: pi }, + { name: "'?'", token: pi }, + { name: "'?>'", token: pi, next: function(stack){ stack.pop(); } } + ], + AposString: [ + { name: "''''", token: "string", next: function(stack){ stack.pop(); } }, + { name: "PredefinedEntityRef", token: "constant.language.escape" }, + { name: "CharRef", token: "constant.language.escape" }, + { name: "EscapeApos", token: "constant.language.escape" }, + { name: "AposChar", token: "string" } + ], + QuotString: [ + { name: "'\"'", token: "string", next: function(stack){ stack.pop(); } }, + { name: "PredefinedEntityRef", token: "constant.language.escape" }, + { name: "CharRef", token: "constant.language.escape" }, + { name: "EscapeQuot", token: "constant.language.escape" }, + { name: "QuotChar", token: "string" } + ] + }; + +exports.XQueryLexer = function() { + + this.tokens = []; + + this.getLineTokens = function(line, state, row) { + state = (state === "start" || !state) ? '["start"]' : state; + var stack = JSON.parse(state); + var h = new TokenHandler(line); + var tokenizer = new XQueryTokenizer(line, h); + var tokens = []; + + while(true) { + var currentState = stack[stack.length - 1]; + try { + + h.tokens = []; + tokenizer["parse_" + currentState](); + var info = null; + + if(h.tokens.length > 1 && h.tokens[0].name === "WS") { + tokens.push({ + type: "text", + value: h.tokens[0].value + }); + h.tokens.splice(0, 1); + } + + var token = h.tokens[0]; + var rules = Rules[currentState]; + for(var k = 0; k < rules.length; k++) { + var rule = Rules[currentState][k]; + if((typeof(rule.name) === "function" && rule.name(token)) || rule.name === token.name) { + info = rule; + break; + } + } + + if(token.name === "EOF") { break; } + if(token.value === "") { throw "Encountered empty string lexical rule."; } + + tokens.push({ + type: info === null ? "text" : (typeof(info.token) === "function" ? info.token(token.value) : info.token), + value: token.value + }); + + if(info && info.next) { + info.next(stack); + } + + } catch(e) { + if(e instanceof tokenizer.ParseException) { + var index = 0; + for(var i=0; i < tokens.length; i++) { + index += tokens[i].value.length; + } + tokens.push({ type: "text", value: line.substring(index) }); + return { + tokens: tokens, + state: JSON.stringify(["start"]) + }; + } else { + throw e; + } + } + } + + + if(this.tokens[row] !== undefined) { + var cachedLine = this.lines[row]; + var begin = sharedStart([line, cachedLine]); + var diff = cachedLine.length - line.length; + var idx = 0; + var col = 0; + for(var i = 0; i < tokens.length; i++) { + var token = tokens[i]; + for(var j = 0; j < this.tokens[row].length; j++) { + var semanticToken = this.tokens[row][j]; + if( + ((col + token.value.length) <= begin.length && semanticToken.sc === col && semanticToken.ec === (col + token.value.length)) || + (semanticToken.sc === (col + diff) && semanticToken.ec === (col + token.value.length + diff)) + ) { + idx = i; + tokens[i].type = semanticToken.type; + } + } + col += token.value.length; + } + } + + return { + tokens: tokens, + state: JSON.stringify(stack) + }; + }; + + function sharedStart(A) { + var tem1, tem2, s, A = A.slice(0).sort(); + tem1 = A[0]; + s = tem1.length; + tem2 = A.pop(); + while(s && tem2.indexOf(tem1) == -1) { + tem1 = tem1.substring(0, --s); + } + return tem1; + } +}; +}); + + ace.define('ace/mode/xquery/XQueryTokenizer', ['require', 'exports', 'module' ], function(require, exports, module) { + var XQueryTokenizer = exports.XQueryTokenizer = function XQueryTokenizer(string, parsingEventHandler) + { + init(string, parsingEventHandler); + var self = this; + + this.ParseException = function(b, e, s, o, x) + { + var + begin = b, + end = e, + state = s, + offending = o, + expected = x; + + this.getBegin = function() {return begin;}; + this.getEnd = function() {return end;}; + this.getState = function() {return state;}; + this.getExpected = function() {return expected;}; + this.getOffending = function() {return offending;}; + + this.getMessage = function() + { + return offending < 0 ? "lexical analysis failed" : "syntax error"; + }; + }; + + function init(string, parsingEventHandler) + { + eventHandler = parsingEventHandler; + input = string; + size = string.length; + reset(0, 0, 0); + } + + this.getInput = function() + { + return input; + }; + + function reset(l, b, e) + { + b0 = b; e0 = b; + l1 = l; b1 = b; e1 = e; + end = e; + eventHandler.reset(input); + } + + this.getOffendingToken = function(e) + { + var o = e.getOffending(); + return o >= 0 ? XQueryTokenizer.TOKEN[o] : null; + }; + + this.getExpectedTokenSet = function(e) + { + var expected; + if (e.getExpected() < 0) + { + expected = XQueryTokenizer.getTokenSet(- e.getState()); + } + else + { + expected = [XQueryTokenizer.TOKEN[e.getExpected()]]; + } + return expected; + }; + + this.getErrorMessage = function(e) + { + var tokenSet = this.getExpectedTokenSet(e); + var found = this.getOffendingToken(e); + var prefix = input.substring(0, e.getBegin()); + var lines = prefix.split("\n"); + var line = lines.length; + var column = lines[line - 1].length + 1; + var size = e.getEnd() - e.getBegin(); + return e.getMessage() + + (found == null ? "" : ", found " + found) + + "\nwhile expecting " + + (tokenSet.length == 1 ? tokenSet[0] : ("[" + tokenSet.join(", ") + "]")) + + "\n" + + (size == 0 || found != null ? "" : "after successfully scanning " + size + " characters beginning ") + + "at line " + line + ", column " + column + ":\n..." + + input.substring(e.getBegin(), Math.min(input.length, e.getBegin() + 64)) + + "..."; + }; + + this.parse_start = function() + { + eventHandler.startNonterminal("start", e0); + lookahead1W(14); // ModuleDecl | Annotation | OptionDecl | Operator | Variable | Tag | AttrTest | + switch (l1) + { + case 55: // '' | '=' | '>' + switch (l1) + { + case 58: // '>' + shift(58); // '>' + break; + case 50: // '/>' + shift(50); // '/>' + break; + case 27: // QName + shift(27); // QName + break; + case 57: // '=' + shift(57); // '=' + break; + case 35: // '"' + shift(35); // '"' + break; + case 38: // "'" + shift(38); // "'" + break; + default: + shift(33); // EOF + } + eventHandler.endNonterminal("StartTag", e0); + }; + + this.parse_TagContent = function() + { + eventHandler.startNonterminal("TagContent", e0); + lookahead1(11); // Tag | EndTag | PredefinedEntityRef | ElementContentChar | CharRef | EOF | + switch (l1) + { + case 23: // ElementContentChar + shift(23); // ElementContentChar + break; + case 6: // Tag + shift(6); // Tag + break; + case 7: // EndTag + shift(7); // EndTag + break; + case 55: // '' + switch (l1) + { + case 11: // CDataSectionContents + shift(11); // CDataSectionContents + break; + case 64: // ']]>' + shift(64); // ']]>' + break; + default: + shift(33); // EOF + } + eventHandler.endNonterminal("CData", e0); + }; + + this.parse_XMLComment = function() + { + eventHandler.startNonterminal("XMLComment", e0); + lookahead1(0); // DirCommentContents | EOF | '-->' + switch (l1) + { + case 9: // DirCommentContents + shift(9); // DirCommentContents + break; + case 47: // '-->' + shift(47); // '-->' + break; + default: + shift(33); // EOF + } + eventHandler.endNonterminal("XMLComment", e0); + }; + + this.parse_PI = function() + { + eventHandler.startNonterminal("PI", e0); + lookahead1(3); // DirPIContents | EOF | '?' | '?>' + switch (l1) + { + case 10: // DirPIContents + shift(10); // DirPIContents + break; + case 59: // '?' + shift(59); // '?' + break; + case 60: // '?>' + shift(60); // '?>' + break; + default: + shift(33); // EOF + } + eventHandler.endNonterminal("PI", e0); + }; + + this.parse_Pragma = function() + { + eventHandler.startNonterminal("Pragma", e0); + lookahead1(2); // PragmaContents | EOF | '#' | '#)' + switch (l1) + { + case 8: // PragmaContents + shift(8); // PragmaContents + break; + case 36: // '#' + shift(36); // '#' + break; + case 37: // '#)' + shift(37); // '#)' + break; + default: + shift(33); // EOF + } + eventHandler.endNonterminal("Pragma", e0); + }; + + this.parse_Comment = function() + { + eventHandler.startNonterminal("Comment", e0); + lookahead1(4); // CommentContents | EOF | '(:' | ':)' + switch (l1) + { + case 52: // ':)' + shift(52); // ':)' + break; + case 41: // '(:' + shift(41); // '(:' + break; + case 30: // CommentContents + shift(30); // CommentContents + break; + default: + shift(33); // EOF + } + eventHandler.endNonterminal("Comment", e0); + }; + + this.parse_CommentDoc = function() + { + eventHandler.startNonterminal("CommentDoc", e0); + lookahead1(5); // DocTag | DocCommentContents | EOF | '(:' | ':)' + switch (l1) + { + case 31: // DocTag + shift(31); // DocTag + break; + case 32: // DocCommentContents + shift(32); // DocCommentContents + break; + case 52: // ':)' + shift(52); // ':)' + break; + case 41: // '(:' + shift(41); // '(:' + break; + default: + shift(33); // EOF + } + eventHandler.endNonterminal("CommentDoc", e0); + }; + + this.parse_QuotString = function() + { + eventHandler.startNonterminal("QuotString", e0); + lookahead1(6); // PredefinedEntityRef | EscapeQuot | QuotChar | CharRef | EOF | '"' + switch (l1) + { + case 18: // PredefinedEntityRef + shift(18); // PredefinedEntityRef + break; + case 29: // CharRef + shift(29); // CharRef + break; + case 19: // EscapeQuot + shift(19); // EscapeQuot + break; + case 21: // QuotChar + shift(21); // QuotChar + break; + case 35: // '"' + shift(35); // '"' + break; + default: + shift(33); // EOF + } + eventHandler.endNonterminal("QuotString", e0); + }; + + this.parse_AposString = function() + { + eventHandler.startNonterminal("AposString", e0); + lookahead1(7); // PredefinedEntityRef | EscapeApos | AposChar | CharRef | EOF | "'" + switch (l1) + { + case 18: // PredefinedEntityRef + shift(18); // PredefinedEntityRef + break; + case 29: // CharRef + shift(29); // CharRef + break; + case 20: // EscapeApos + shift(20); // EscapeApos + break; + case 22: // AposChar + shift(22); // AposChar + break; + case 38: // "'" + shift(38); // "'" + break; + default: + shift(33); // EOF + } + eventHandler.endNonterminal("AposString", e0); + }; + + this.parse_Prefix = function() + { + eventHandler.startNonterminal("Prefix", e0); + lookahead1W(13); // NCName^Token | S^WS | 'after' | 'allowing' | 'ancestor' | 'ancestor-or-self' | + whitespace(); + parse_NCName(); + eventHandler.endNonterminal("Prefix", e0); + }; + + this.parse__EQName = function() + { + eventHandler.startNonterminal("_EQName", e0); + lookahead1W(12); // EQName^Token | S^WS | 'after' | 'allowing' | 'ancestor' | 'ancestor-or-self' | + whitespace(); + parse_EQName(); + eventHandler.endNonterminal("_EQName", e0); + }; + + function parse_EQName() + { + eventHandler.startNonterminal("EQName", e0); + switch (l1) + { + case 77: // 'attribute' + shift(77); // 'attribute' + break; + case 91: // 'comment' + shift(91); // 'comment' + break; + case 115: // 'document-node' + shift(115); // 'document-node' + break; + case 116: // 'element' + shift(116); // 'element' + break; + case 119: // 'empty-sequence' + shift(119); // 'empty-sequence' + break; + case 140: // 'function' + shift(140); // 'function' + break; + case 147: // 'if' + shift(147); // 'if' + break; + case 160: // 'item' + shift(160); // 'item' + break; + case 180: // 'namespace-node' + shift(180); // 'namespace-node' + break; + case 186: // 'node' + shift(186); // 'node' + break; + case 211: // 'processing-instruction' + shift(211); // 'processing-instruction' + break; + case 221: // 'schema-attribute' + shift(221); // 'schema-attribute' + break; + case 222: // 'schema-element' + shift(222); // 'schema-element' + break; + case 238: // 'switch' + shift(238); // 'switch' + break; + case 239: // 'text' + shift(239); // 'text' + break; + case 248: // 'typeswitch' + shift(248); // 'typeswitch' + break; + default: + parse_FunctionName(); + } + eventHandler.endNonterminal("EQName", e0); + } + + function parse_FunctionName() + { + eventHandler.startNonterminal("FunctionName", e0); + switch (l1) + { + case 14: // EQName^Token + shift(14); // EQName^Token + break; + case 65: // 'after' + shift(65); // 'after' + break; + case 68: // 'ancestor' + shift(68); // 'ancestor' + break; + case 69: // 'ancestor-or-self' + shift(69); // 'ancestor-or-self' + break; + case 70: // 'and' + shift(70); // 'and' + break; + case 74: // 'as' + shift(74); // 'as' + break; + case 75: // 'ascending' + shift(75); // 'ascending' + break; + case 79: // 'before' + shift(79); // 'before' + break; + case 83: // 'case' + shift(83); // 'case' + break; + case 84: // 'cast' + shift(84); // 'cast' + break; + case 85: // 'castable' + shift(85); // 'castable' + break; + case 88: // 'child' + shift(88); // 'child' + break; + case 89: // 'collation' + shift(89); // 'collation' + break; + case 98: // 'copy' + shift(98); // 'copy' + break; + case 100: // 'count' + shift(100); // 'count' + break; + case 103: // 'declare' + shift(103); // 'declare' + break; + case 104: // 'default' + shift(104); // 'default' + break; + case 105: // 'delete' + shift(105); // 'delete' + break; + case 106: // 'descendant' + shift(106); // 'descendant' + break; + case 107: // 'descendant-or-self' + shift(107); // 'descendant-or-self' + break; + case 108: // 'descending' + shift(108); // 'descending' + break; + case 113: // 'div' + shift(113); // 'div' + break; + case 114: // 'document' + shift(114); // 'document' + break; + case 117: // 'else' + shift(117); // 'else' + break; + case 118: // 'empty' + shift(118); // 'empty' + break; + case 121: // 'end' + shift(121); // 'end' + break; + case 123: // 'eq' + shift(123); // 'eq' + break; + case 124: // 'every' + shift(124); // 'every' + break; + case 126: // 'except' + shift(126); // 'except' + break; + case 129: // 'first' + shift(129); // 'first' + break; + case 130: // 'following' + shift(130); // 'following' + break; + case 131: // 'following-sibling' + shift(131); // 'following-sibling' + break; + case 132: // 'for' + shift(132); // 'for' + break; + case 141: // 'ge' + shift(141); // 'ge' + break; + case 143: // 'group' + shift(143); // 'group' + break; + case 145: // 'gt' + shift(145); // 'gt' + break; + case 146: // 'idiv' + shift(146); // 'idiv' + break; + case 148: // 'import' + shift(148); // 'import' + break; + case 154: // 'insert' + shift(154); // 'insert' + break; + case 155: // 'instance' + shift(155); // 'instance' + break; + case 157: // 'intersect' + shift(157); // 'intersect' + break; + case 158: // 'into' + shift(158); // 'into' + break; + case 159: // 'is' + shift(159); // 'is' + break; + case 165: // 'last' + shift(165); // 'last' + break; + case 167: // 'le' + shift(167); // 'le' + break; + case 169: // 'let' + shift(169); // 'let' + break; + case 173: // 'lt' + shift(173); // 'lt' + break; + case 175: // 'mod' + shift(175); // 'mod' + break; + case 176: // 'modify' + shift(176); // 'modify' + break; + case 177: // 'module' + shift(177); // 'module' + break; + case 179: // 'namespace' + shift(179); // 'namespace' + break; + case 181: // 'ne' + shift(181); // 'ne' + break; + case 193: // 'only' + shift(193); // 'only' + break; + case 195: // 'or' + shift(195); // 'or' + break; + case 196: // 'order' + shift(196); // 'order' + break; + case 197: // 'ordered' + shift(197); // 'ordered' + break; + case 201: // 'parent' + shift(201); // 'parent' + break; + case 207: // 'preceding' + shift(207); // 'preceding' + break; + case 208: // 'preceding-sibling' + shift(208); // 'preceding-sibling' + break; + case 213: // 'rename' + shift(213); // 'rename' + break; + case 214: // 'replace' + shift(214); // 'replace' + break; + case 215: // 'return' + shift(215); // 'return' + break; + case 219: // 'satisfies' + shift(219); // 'satisfies' + break; + case 224: // 'self' + shift(224); // 'self' + break; + case 230: // 'some' + shift(230); // 'some' + break; + case 231: // 'stable' + shift(231); // 'stable' + break; + case 232: // 'start' + shift(232); // 'start' + break; + case 243: // 'to' + shift(243); // 'to' + break; + case 244: // 'treat' + shift(244); // 'treat' + break; + case 245: // 'try' + shift(245); // 'try' + break; + case 249: // 'union' + shift(249); // 'union' + break; + case 251: // 'unordered' + shift(251); // 'unordered' + break; + case 255: // 'validate' + shift(255); // 'validate' + break; + case 261: // 'where' + shift(261); // 'where' + break; + case 265: // 'with' + shift(265); // 'with' + break; + case 269: // 'xquery' + shift(269); // 'xquery' + break; + case 67: // 'allowing' + shift(67); // 'allowing' + break; + case 76: // 'at' + shift(76); // 'at' + break; + case 78: // 'base-uri' + shift(78); // 'base-uri' + break; + case 80: // 'boundary-space' + shift(80); // 'boundary-space' + break; + case 81: // 'break' + shift(81); // 'break' + break; + case 86: // 'catch' + shift(86); // 'catch' + break; + case 93: // 'construction' + shift(93); // 'construction' + break; + case 96: // 'context' + shift(96); // 'context' + break; + case 97: // 'continue' + shift(97); // 'continue' + break; + case 99: // 'copy-namespaces' + shift(99); // 'copy-namespaces' + break; + case 101: // 'decimal-format' + shift(101); // 'decimal-format' + break; + case 120: // 'encoding' + shift(120); // 'encoding' + break; + case 127: // 'exit' + shift(127); // 'exit' + break; + case 128: // 'external' + shift(128); // 'external' + break; + case 136: // 'ft-option' + shift(136); // 'ft-option' + break; + case 149: // 'in' + shift(149); // 'in' + break; + case 150: // 'index' + shift(150); // 'index' + break; + case 156: // 'integrity' + shift(156); // 'integrity' + break; + case 166: // 'lax' + shift(166); // 'lax' + break; + case 187: // 'nodes' + shift(187); // 'nodes' + break; + case 194: // 'option' + shift(194); // 'option' + break; + case 198: // 'ordering' + shift(198); // 'ordering' + break; + case 217: // 'revalidation' + shift(217); // 'revalidation' + break; + case 220: // 'schema' + shift(220); // 'schema' + break; + case 223: // 'score' + shift(223); // 'score' + break; + case 229: // 'sliding' + shift(229); // 'sliding' + break; + case 235: // 'strict' + shift(235); // 'strict' + break; + case 246: // 'tumbling' + shift(246); // 'tumbling' + break; + case 247: // 'type' + shift(247); // 'type' + break; + case 252: // 'updating' + shift(252); // 'updating' + break; + case 256: // 'value' + shift(256); // 'value' + break; + case 257: // 'variable' + shift(257); // 'variable' + break; + case 258: // 'version' + shift(258); // 'version' + break; + case 262: // 'while' + shift(262); // 'while' + break; + case 92: // 'constraint' + shift(92); // 'constraint' + break; + case 171: // 'loop' + shift(171); // 'loop' + break; + default: + shift(216); // 'returning' + } + eventHandler.endNonterminal("FunctionName", e0); + } + + function parse_NCName() + { + eventHandler.startNonterminal("NCName", e0); + switch (l1) + { + case 26: // NCName^Token + shift(26); // NCName^Token + break; + case 65: // 'after' + shift(65); // 'after' + break; + case 70: // 'and' + shift(70); // 'and' + break; + case 74: // 'as' + shift(74); // 'as' + break; + case 75: // 'ascending' + shift(75); // 'ascending' + break; + case 79: // 'before' + shift(79); // 'before' + break; + case 83: // 'case' + shift(83); // 'case' + break; + case 84: // 'cast' + shift(84); // 'cast' + break; + case 85: // 'castable' + shift(85); // 'castable' + break; + case 89: // 'collation' + shift(89); // 'collation' + break; + case 100: // 'count' + shift(100); // 'count' + break; + case 104: // 'default' + shift(104); // 'default' + break; + case 108: // 'descending' + shift(108); // 'descending' + break; + case 113: // 'div' + shift(113); // 'div' + break; + case 117: // 'else' + shift(117); // 'else' + break; + case 118: // 'empty' + shift(118); // 'empty' + break; + case 121: // 'end' + shift(121); // 'end' + break; + case 123: // 'eq' + shift(123); // 'eq' + break; + case 126: // 'except' + shift(126); // 'except' + break; + case 132: // 'for' + shift(132); // 'for' + break; + case 141: // 'ge' + shift(141); // 'ge' + break; + case 143: // 'group' + shift(143); // 'group' + break; + case 145: // 'gt' + shift(145); // 'gt' + break; + case 146: // 'idiv' + shift(146); // 'idiv' + break; + case 155: // 'instance' + shift(155); // 'instance' + break; + case 157: // 'intersect' + shift(157); // 'intersect' + break; + case 158: // 'into' + shift(158); // 'into' + break; + case 159: // 'is' + shift(159); // 'is' + break; + case 167: // 'le' + shift(167); // 'le' + break; + case 169: // 'let' + shift(169); // 'let' + break; + case 173: // 'lt' + shift(173); // 'lt' + break; + case 175: // 'mod' + shift(175); // 'mod' + break; + case 176: // 'modify' + shift(176); // 'modify' + break; + case 181: // 'ne' + shift(181); // 'ne' + break; + case 193: // 'only' + shift(193); // 'only' + break; + case 195: // 'or' + shift(195); // 'or' + break; + case 196: // 'order' + shift(196); // 'order' + break; + case 215: // 'return' + shift(215); // 'return' + break; + case 219: // 'satisfies' + shift(219); // 'satisfies' + break; + case 231: // 'stable' + shift(231); // 'stable' + break; + case 232: // 'start' + shift(232); // 'start' + break; + case 243: // 'to' + shift(243); // 'to' + break; + case 244: // 'treat' + shift(244); // 'treat' + break; + case 249: // 'union' + shift(249); // 'union' + break; + case 261: // 'where' + shift(261); // 'where' + break; + case 265: // 'with' + shift(265); // 'with' + break; + case 68: // 'ancestor' + shift(68); // 'ancestor' + break; + case 69: // 'ancestor-or-self' + shift(69); // 'ancestor-or-self' + break; + case 77: // 'attribute' + shift(77); // 'attribute' + break; + case 88: // 'child' + shift(88); // 'child' + break; + case 91: // 'comment' + shift(91); // 'comment' + break; + case 98: // 'copy' + shift(98); // 'copy' + break; + case 103: // 'declare' + shift(103); // 'declare' + break; + case 105: // 'delete' + shift(105); // 'delete' + break; + case 106: // 'descendant' + shift(106); // 'descendant' + break; + case 107: // 'descendant-or-self' + shift(107); // 'descendant-or-self' + break; + case 114: // 'document' + shift(114); // 'document' + break; + case 115: // 'document-node' + shift(115); // 'document-node' + break; + case 116: // 'element' + shift(116); // 'element' + break; + case 119: // 'empty-sequence' + shift(119); // 'empty-sequence' + break; + case 124: // 'every' + shift(124); // 'every' + break; + case 129: // 'first' + shift(129); // 'first' + break; + case 130: // 'following' + shift(130); // 'following' + break; + case 131: // 'following-sibling' + shift(131); // 'following-sibling' + break; + case 140: // 'function' + shift(140); // 'function' + break; + case 147: // 'if' + shift(147); // 'if' + break; + case 148: // 'import' + shift(148); // 'import' + break; + case 154: // 'insert' + shift(154); // 'insert' + break; + case 160: // 'item' + shift(160); // 'item' + break; + case 165: // 'last' + shift(165); // 'last' + break; + case 177: // 'module' + shift(177); // 'module' + break; + case 179: // 'namespace' + shift(179); // 'namespace' + break; + case 180: // 'namespace-node' + shift(180); // 'namespace-node' + break; + case 186: // 'node' + shift(186); // 'node' + break; + case 197: // 'ordered' + shift(197); // 'ordered' + break; + case 201: // 'parent' + shift(201); // 'parent' + break; + case 207: // 'preceding' + shift(207); // 'preceding' + break; + case 208: // 'preceding-sibling' + shift(208); // 'preceding-sibling' + break; + case 211: // 'processing-instruction' + shift(211); // 'processing-instruction' + break; + case 213: // 'rename' + shift(213); // 'rename' + break; + case 214: // 'replace' + shift(214); // 'replace' + break; + case 221: // 'schema-attribute' + shift(221); // 'schema-attribute' + break; + case 222: // 'schema-element' + shift(222); // 'schema-element' + break; + case 224: // 'self' + shift(224); // 'self' + break; + case 230: // 'some' + shift(230); // 'some' + break; + case 238: // 'switch' + shift(238); // 'switch' + break; + case 239: // 'text' + shift(239); // 'text' + break; + case 245: // 'try' + shift(245); // 'try' + break; + case 248: // 'typeswitch' + shift(248); // 'typeswitch' + break; + case 251: // 'unordered' + shift(251); // 'unordered' + break; + case 255: // 'validate' + shift(255); // 'validate' + break; + case 257: // 'variable' + shift(257); // 'variable' + break; + case 269: // 'xquery' + shift(269); // 'xquery' + break; + case 67: // 'allowing' + shift(67); // 'allowing' + break; + case 76: // 'at' + shift(76); // 'at' + break; + case 78: // 'base-uri' + shift(78); // 'base-uri' + break; + case 80: // 'boundary-space' + shift(80); // 'boundary-space' + break; + case 81: // 'break' + shift(81); // 'break' + break; + case 86: // 'catch' + shift(86); // 'catch' + break; + case 93: // 'construction' + shift(93); // 'construction' + break; + case 96: // 'context' + shift(96); // 'context' + break; + case 97: // 'continue' + shift(97); // 'continue' + break; + case 99: // 'copy-namespaces' + shift(99); // 'copy-namespaces' + break; + case 101: // 'decimal-format' + shift(101); // 'decimal-format' + break; + case 120: // 'encoding' + shift(120); // 'encoding' + break; + case 127: // 'exit' + shift(127); // 'exit' + break; + case 128: // 'external' + shift(128); // 'external' + break; + case 136: // 'ft-option' + shift(136); // 'ft-option' + break; + case 149: // 'in' + shift(149); // 'in' + break; + case 150: // 'index' + shift(150); // 'index' + break; + case 156: // 'integrity' + shift(156); // 'integrity' + break; + case 166: // 'lax' + shift(166); // 'lax' + break; + case 187: // 'nodes' + shift(187); // 'nodes' + break; + case 194: // 'option' + shift(194); // 'option' + break; + case 198: // 'ordering' + shift(198); // 'ordering' + break; + case 217: // 'revalidation' + shift(217); // 'revalidation' + break; + case 220: // 'schema' + shift(220); // 'schema' + break; + case 223: // 'score' + shift(223); // 'score' + break; + case 229: // 'sliding' + shift(229); // 'sliding' + break; + case 235: // 'strict' + shift(235); // 'strict' + break; + case 246: // 'tumbling' + shift(246); // 'tumbling' + break; + case 247: // 'type' + shift(247); // 'type' + break; + case 252: // 'updating' + shift(252); // 'updating' + break; + case 256: // 'value' + shift(256); // 'value' + break; + case 258: // 'version' + shift(258); // 'version' + break; + case 262: // 'while' + shift(262); // 'while' + break; + case 92: // 'constraint' + shift(92); // 'constraint' + break; + case 171: // 'loop' + shift(171); // 'loop' + break; + default: + shift(216); // 'returning' + } + eventHandler.endNonterminal("NCName", e0); + } + + function shift(t) + { + if (l1 == t) + { + whitespace(); + eventHandler.terminal(XQueryTokenizer.TOKEN[l1], b1, e1 > size ? size : e1); + b0 = b1; e0 = e1; l1 = 0; + } + else + { + error(b1, e1, 0, l1, t); + } + } + + function whitespace() + { + if (e0 != b1) + { + b0 = e0; + e0 = b1; + eventHandler.whitespace(b0, e0); + } + } + + function matchW(set) + { + var code; + for (;;) + { + code = match(set); + if (code != 28) // S^WS + { + break; + } + } + return code; + } + + function lookahead1W(set) + { + if (l1 == 0) + { + l1 = matchW(set); + b1 = begin; + e1 = end; + } + } + + function lookahead1(set) + { + if (l1 == 0) + { + l1 = match(set); + b1 = begin; + e1 = end; + } + } + + function error(b, e, s, l, t) + { + throw new self.ParseException(b, e, s, l, t); + } + + var lk, b0, e0; + var l1, b1, e1; + var eventHandler; + + var input; + var size; + var begin; + var end; + + function match(tokenSetId) + { + var nonbmp = false; + begin = end; + var current = end; + var result = XQueryTokenizer.INITIAL[tokenSetId]; + var state = 0; + + for (var code = result & 4095; code != 0; ) + { + var charclass; + var c0 = current < size ? input.charCodeAt(current) : 0; + ++current; + if (c0 < 0x80) + { + charclass = XQueryTokenizer.MAP0[c0]; + } + else if (c0 < 0xd800) + { + var c1 = c0 >> 4; + charclass = XQueryTokenizer.MAP1[(c0 & 15) + XQueryTokenizer.MAP1[(c1 & 31) + XQueryTokenizer.MAP1[c1 >> 5]]]; + } + else + { + if (c0 < 0xdc00) + { + var c1 = current < size ? input.charCodeAt(current) : 0; + if (c1 >= 0xdc00 && c1 < 0xe000) + { + ++current; + c0 = ((c0 & 0x3ff) << 10) + (c1 & 0x3ff) + 0x10000; + nonbmp = true; + } + } + var lo = 0, hi = 5; + for (var m = 3; ; m = (hi + lo) >> 1) + { + if (XQueryTokenizer.MAP2[m] > c0) hi = m - 1; + else if (XQueryTokenizer.MAP2[6 + m] < c0) lo = m + 1; + else {charclass = XQueryTokenizer.MAP2[12 + m]; break;} + if (lo > hi) {charclass = 0; break;} + } + } + + state = code; + var i0 = (charclass << 12) + code - 1; + code = XQueryTokenizer.TRANSITION[(i0 & 15) + XQueryTokenizer.TRANSITION[i0 >> 4]]; + + if (code > 4095) + { + result = code; + code &= 4095; + end = current; + } + } + + result >>= 12; + if (result == 0) + { + end = current - 1; + var c1 = end < size ? input.charCodeAt(end) : 0; + if (c1 >= 0xdc00 && c1 < 0xe000) --end; + return error(begin, end, state, -1, -1); + } + + if (nonbmp) + { + for (var i = result >> 9; i > 0; --i) + { + --end; + var c1 = end < size ? input.charCodeAt(end) : 0; + if (c1 >= 0xdc00 && c1 < 0xe000) --end; + } + } + else + { + end -= result >> 9; + } + + return (result & 511) - 1; + } +} + +XQueryTokenizer.getTokenSet = function(tokenSetId) +{ + var set = []; + var s = tokenSetId < 0 ? - tokenSetId : INITIAL[tokenSetId] & 4095; + for (var i = 0; i < 276; i += 32) + { + var j = i; + var i0 = (i >> 5) * 2062 + s - 1; + var i1 = i0 >> 2; + var i2 = i1 >> 2; + var f = XQueryTokenizer.EXPECTED[(i0 & 3) + XQueryTokenizer.EXPECTED[(i1 & 3) + XQueryTokenizer.EXPECTED[(i2 & 3) + XQueryTokenizer.EXPECTED[i2 >> 2]]]]; + for ( ; f != 0; f >>>= 1, ++j) + { + if ((f & 1) != 0) + { + set.push(XQueryTokenizer.TOKEN[j]); + } + } + } + return set; +}; + +XQueryTokenizer.MAP0 = +[ 66, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 27, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 32, 31, 31, 33, 31, 31, 31, 31, 31, 31, 34, 35, 36, 35, 31, 35, 37, 38, 39, 40, 41, 42, 43, 44, 45, 31, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 31, 61, 62, 63, 64, 35 +]; + +XQueryTokenizer.MAP1 = +[ 108, 124, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 156, 181, 181, 181, 181, 181, 214, 215, 213, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 247, 261, 277, 293, 309, 347, 363, 379, 416, 416, 416, 408, 331, 323, 331, 323, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 433, 433, 433, 433, 433, 433, 433, 316, 331, 331, 331, 331, 331, 331, 331, 331, 394, 416, 416, 417, 415, 416, 416, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 330, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 416, 66, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 27, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 35, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 32, 31, 31, 33, 31, 31, 31, 31, 31, 31, 34, 35, 36, 35, 31, 35, 37, 38, 39, 40, 41, 42, 43, 44, 45, 31, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 31, 61, 62, 63, 64, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 31, 31, 35, 35, 35, 35, 35, 35, 35, 65, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65 +]; + +XQueryTokenizer.MAP2 = +[ 57344, 63744, 64976, 65008, 65536, 983040, 63743, 64975, 65007, 65533, 983039, 1114111, 35, 31, 35, 31, 31, 35 +]; + +XQueryTokenizer.INITIAL = +[ 1, 2, 36867, 45060, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 +]; + +XQueryTokenizer.TRANSITION = +[ 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22908, 18836, 17152, 19008, 19233, 20367, 19008, 17173, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17949, 17308, 17327, 17346, 18918, 17365, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 21873, 17311, 18658, 18999, 19008, 17447, 17470, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 18157, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 17848, 17880, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18023, 36545, 18621, 18039, 18056, 18072, 18117, 18143, 18173, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17687, 18805, 18421, 18437, 18101, 17393, 18489, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 18579, 21711, 17152, 19008, 19233, 20367, 19008, 28684, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17949, 17308, 17327, 17346, 18918, 17365, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 21873, 17311, 18658, 18999, 19008, 17447, 17470, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 18157, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 17848, 17880, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18023, 36545, 18621, 18039, 18056, 18072, 18117, 18143, 18173, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17687, 18805, 18421, 18437, 18101, 17393, 18489, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 20116, 18836, 18637, 19008, 19233, 21267, 19008, 17173, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17949, 17308, 17327, 17346, 18918, 18452, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 21873, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 18763, 18778, 18794, 19008, 19233, 20367, 19008, 17173, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17949, 17308, 17327, 17346, 18918, 18452, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 21873, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 18821, 22923, 18906, 19008, 19233, 17431, 19008, 17173, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17949, 17308, 17327, 17346, 18918, 18937, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 19054, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 18953, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21843, 18836, 18987, 19008, 19233, 20367, 19008, 17173, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17949, 17308, 17327, 17346, 18918, 18452, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 21873, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21696, 18836, 18987, 19008, 19233, 20367, 19008, 17173, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17949, 17308, 17327, 17346, 18918, 18452, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 21873, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22429, 20131, 18720, 19008, 19233, 20367, 19008, 17173, 23559, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 18087, 17308, 17327, 17346, 18918, 18452, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 21242, 19111, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 19024, 18836, 18609, 19008, 19233, 20367, 19008, 17173, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17949, 17308, 17327, 17346, 18918, 18452, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 21873, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 19081, 22444, 18987, 19008, 19233, 20367, 19008, 19065, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17949, 17308, 17327, 17346, 18918, 18452, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 21873, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21992, 22007, 18987, 19008, 19233, 20367, 19008, 18690, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17949, 17308, 17327, 17346, 18918, 18452, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 21873, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22414, 18836, 18987, 19008, 19233, 30651, 19008, 17173, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 19138, 17308, 17327, 17346, 18918, 18452, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 19280, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 19172, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21783, 18836, 18987, 19008, 19233, 20367, 19008, 17173, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 19218, 17308, 17327, 17346, 18918, 18452, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 21873, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21651, 18836, 18987, 19008, 19233, 20367, 19008, 17173, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17949, 17308, 17327, 17346, 18918, 18452, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 21873, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 19249, 19265, 19307, 18888, 27857, 30536, 24401, 31444, 23357, 18888, 19351, 18888, 18890, 27211, 19370, 27211, 27211, 19392, 24401, 31911, 24401, 24401, 25467, 18888, 18888, 18888, 18888, 18888, 25783, 27211, 27211, 27211, 27211, 28537, 19440, 24401, 24401, 24401, 24401, 24036, 17994, 24060, 18888, 18888, 18888, 18890, 19468, 27211, 27211, 27211, 27211, 19484, 35367, 19520, 24401, 24401, 24401, 19628, 18888, 29855, 18888, 18888, 23086, 27211, 19538, 27211, 27211, 30756, 24012, 24401, 19560, 24401, 24401, 26750, 18888, 18888, 19327, 27855, 27211, 27211, 19580, 17590, 24017, 24401, 24401, 19600, 25665, 18888, 18888, 28518, 27211, 27212, 24016, 19620, 19868, 28435, 25722, 18889, 19644, 27211, 32888, 35852, 19868, 31018, 19694, 19376, 19717, 22215, 19735, 22098, 19751, 35203, 19776, 19797, 19817, 19840, 25783, 31738, 24135, 19701, 19856, 31015, 23516, 31008, 28311, 19419, 27963, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21768, 18836, 19307, 18888, 27857, 27904, 24401, 29183, 28015, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 19888, 24401, 24401, 24401, 24401, 22953, 18888, 18888, 18888, 18888, 18888, 25783, 27211, 27211, 27211, 27211, 28537, 19440, 24401, 24401, 24401, 24401, 24036, 18881, 18888, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 27211, 19484, 24401, 24401, 24401, 24401, 24401, 19628, 18888, 18888, 18888, 18888, 23086, 27211, 27211, 27211, 27211, 30756, 24012, 24401, 24401, 24401, 24401, 26750, 18888, 18888, 18888, 27855, 27211, 27211, 27211, 17590, 24017, 24401, 24401, 24401, 18887, 18888, 18888, 27211, 27211, 27212, 24016, 24402, 19868, 25659, 18888, 18889, 27211, 27211, 19719, 23889, 19868, 31018, 18890, 27211, 31833, 19406, 19447, 23086, 23330, 19828, 31017, 27856, 31741, 19840, 25783, 31738, 19837, 25782, 19760, 31015, 23516, 31008, 22105, 19419, 27963, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22399, 18836, 19918, 19008, 19233, 20367, 19008, 17173, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17949, 17308, 17327, 17346, 18918, 18452, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 21873, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21666, 18836, 19307, 18888, 27857, 27525, 24401, 29183, 21467, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 19946, 24401, 24401, 24401, 24401, 32382, 18888, 18888, 18888, 18888, 18888, 25783, 27211, 27211, 27211, 27211, 28537, 19998, 24401, 24401, 24401, 24401, 31500, 18467, 18888, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 27211, 20021, 24401, 24401, 24401, 24401, 24401, 34271, 18888, 18888, 18888, 18888, 23086, 27211, 27211, 27211, 27211, 32926, 29908, 24401, 24401, 24401, 24401, 26095, 18888, 18888, 18888, 27855, 27211, 27211, 27211, 20050, 22968, 24401, 24401, 24401, 18887, 18888, 18888, 27211, 27211, 35779, 20080, 24402, 19868, 25659, 18888, 18889, 27211, 27211, 19719, 23889, 19868, 31018, 18890, 27211, 31833, 19406, 19447, 23086, 23330, 19828, 31017, 27856, 31741, 19840, 25783, 31738, 19837, 25782, 19760, 31015, 23516, 31008, 22105, 19419, 27963, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 20101, 19039, 20191, 20412, 20903, 17569, 20309, 20872, 25633, 20623, 20505, 20218, 20242, 17189, 17208, 17281, 20355, 20265, 20306, 20328, 20383, 22490, 20796, 20619, 21354, 20654, 20410, 20956, 21232, 20765, 17421, 20535, 17192, 18127, 22459, 20312, 25531, 22470, 20309, 20428, 18964, 20466, 20491, 21342, 21070, 20521, 20682, 17714, 18326, 17543, 17559, 17585, 22497, 20559, 19504, 20279, 20575, 20290, 20475, 20604, 20639, 20226, 20670, 17661, 21190, 17703, 21176, 17730, 19494, 20698, 20711, 22480, 21046, 21116, 18971, 21130, 20727, 20755, 17675, 17753, 17832, 17590, 25518, 20394, 20781, 20831, 20202, 20847, 21401, 17292, 17934, 17979, 18549, 20863, 20588, 25542, 20888, 20919, 18072, 18117, 20935, 20972, 21032, 21062, 21086, 18239, 21102, 18563, 21146, 21162, 21206, 18351, 20949, 20902, 18340, 21222, 21258, 21283, 18360, 20249, 17405, 21295, 21311, 21327, 20739, 20343, 21370, 21386, 21417, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21977, 18836, 18987, 19008, 19233, 20367, 19008, 17173, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17949, 17308, 17327, 17346, 18918, 21452, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 21873, 17311, 18658, 18999, 19008, 21504, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 36501, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 28674, 21946, 17617, 36473, 18223, 17237, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 21575, 21534, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 21560, 30628, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21798, 18836, 21612, 19008, 19233, 20367, 19008, 17173, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17949, 17308, 17327, 17346, 18918, 18452, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 21873, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21636, 18836, 18987, 19008, 19233, 17902, 19008, 17173, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17949, 17308, 17327, 17346, 18918, 18452, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 21873, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21753, 19096, 21903, 19008, 19233, 20367, 19008, 19291, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17949, 17308, 17327, 17346, 18918, 17379, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 21873, 17311, 18658, 18999, 19008, 17447, 21931, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 18280, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21962, 18594, 18987, 19008, 19233, 22043, 19008, 17173, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17949, 17308, 17327, 17346, 18918, 18452, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 21873, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21681, 21858, 18987, 19008, 19233, 20367, 19008, 21544, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17949, 17308, 17327, 17346, 18918, 18452, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 21873, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22339, 18836, 22059, 18888, 27857, 34097, 24401, 29183, 22087, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 22121, 24401, 24401, 24401, 24401, 30613, 18888, 18888, 18888, 18888, 18888, 25783, 27211, 27211, 27211, 27211, 35072, 22164, 24401, 24401, 24401, 24401, 31500, 31693, 18888, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 27211, 19484, 24401, 24401, 24401, 24401, 24401, 32319, 18888, 18888, 18888, 18888, 23086, 27211, 27211, 27211, 27211, 30756, 21431, 24401, 24401, 24401, 24401, 26095, 18888, 18888, 18888, 27855, 27211, 27211, 27211, 22187, 22968, 24401, 24401, 24401, 22231, 18888, 18888, 27211, 27211, 35779, 20080, 24402, 19868, 25659, 18888, 18889, 27211, 27211, 19719, 23889, 19868, 31018, 18890, 27211, 31833, 19406, 19447, 23086, 23330, 19828, 31017, 27856, 31741, 19840, 25783, 31738, 19837, 25782, 19760, 31015, 23516, 31008, 22105, 19419, 27963, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22339, 18836, 22059, 18888, 27857, 34097, 24401, 29183, 22087, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 22121, 24401, 24401, 24401, 24401, 30613, 18888, 18888, 18888, 18888, 18888, 25783, 27211, 27211, 27211, 27211, 35072, 22164, 24401, 24401, 24401, 24401, 31500, 31693, 18888, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 27211, 19484, 24401, 24401, 24401, 24401, 24401, 31181, 18888, 18888, 18888, 18888, 23086, 27211, 27211, 27211, 27211, 30756, 21431, 24401, 24401, 24401, 24401, 26095, 18888, 18888, 18888, 27855, 27211, 27211, 27211, 22187, 22968, 24401, 24401, 24401, 18887, 18888, 18888, 27211, 27211, 35779, 20080, 24402, 19868, 25659, 18888, 18889, 27211, 27211, 19719, 23889, 19868, 31018, 18890, 27211, 31833, 19406, 19447, 23086, 23330, 19828, 31017, 27856, 31741, 19840, 25783, 31738, 19837, 25782, 19760, 31015, 23516, 31008, 22105, 19419, 27963, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22339, 18836, 22059, 18888, 27857, 34097, 24401, 29183, 22087, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 22121, 24401, 24401, 24401, 24401, 31678, 18888, 18888, 18888, 18888, 18888, 25783, 27211, 27211, 27211, 27211, 35072, 22164, 24401, 24401, 24401, 24401, 31500, 31693, 18888, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 27211, 19484, 24401, 24401, 24401, 24401, 24401, 31181, 18888, 18888, 18888, 18888, 23086, 27211, 27211, 27211, 27211, 30756, 21431, 24401, 24401, 24401, 24401, 26095, 18888, 18888, 18888, 27855, 27211, 27211, 27211, 22187, 22968, 24401, 24401, 24401, 18887, 18888, 18888, 27211, 27211, 35779, 20080, 24402, 19868, 25659, 18888, 18889, 27211, 27211, 19719, 23889, 19868, 31018, 18890, 27211, 31833, 19406, 19447, 23086, 23330, 19828, 31017, 27856, 31741, 19840, 25783, 31738, 19837, 25782, 19760, 31015, 23516, 31008, 22105, 19419, 27963, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22339, 18836, 22059, 18888, 27857, 34097, 24401, 29183, 22087, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 22121, 24401, 24401, 24401, 24401, 30613, 18888, 18888, 18888, 18888, 18888, 25783, 27211, 27211, 27211, 27211, 35072, 22164, 24401, 24401, 24401, 24401, 33588, 31693, 18888, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 27211, 19484, 24401, 24401, 24401, 24401, 24401, 31181, 18888, 18888, 18888, 18888, 23086, 27211, 27211, 27211, 27211, 30756, 21431, 24401, 24401, 24401, 24401, 26095, 18888, 18888, 18888, 27855, 27211, 27211, 27211, 22187, 22968, 24401, 24401, 24401, 18887, 18888, 18888, 27211, 27211, 35779, 20080, 24402, 19868, 25659, 18888, 18889, 27211, 27211, 19719, 23889, 19868, 31018, 18890, 27211, 31833, 19406, 19447, 23086, 23330, 19828, 31017, 27856, 31741, 19840, 25783, 31738, 19837, 25782, 19760, 31015, 23516, 31008, 22105, 19419, 27963, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22339, 18836, 22059, 18888, 27857, 35019, 24401, 29183, 22087, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 22248, 24401, 24401, 24401, 24401, 30613, 18888, 18888, 18888, 18888, 18888, 25783, 27211, 27211, 27211, 27211, 35072, 22164, 24401, 24401, 24401, 24401, 31500, 31693, 18888, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 27211, 19484, 24401, 24401, 24401, 24401, 24401, 31181, 18888, 18888, 18888, 18888, 23086, 27211, 27211, 27211, 27211, 30756, 21431, 24401, 24401, 24401, 24401, 26095, 18888, 18888, 18888, 27855, 27211, 27211, 27211, 22187, 22968, 24401, 24401, 24401, 18887, 18888, 18888, 27211, 27211, 35779, 20080, 24402, 19868, 25659, 18888, 18889, 27211, 27211, 19719, 23889, 19868, 31018, 18890, 27211, 31833, 19406, 19447, 23086, 23330, 19828, 31017, 27856, 31741, 19840, 25783, 31738, 19837, 25782, 19760, 31015, 23516, 31008, 22105, 19419, 27963, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22339, 18836, 22059, 18888, 27857, 34097, 24401, 29183, 22087, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 22121, 24401, 24401, 24401, 24401, 18866, 18888, 18888, 18888, 18888, 18888, 25783, 27211, 27211, 27211, 27211, 35072, 22164, 24401, 24401, 24401, 24401, 24036, 31693, 18888, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 27211, 19484, 24401, 24401, 24401, 24401, 24401, 19628, 18888, 18888, 18888, 18888, 23086, 27211, 27211, 27211, 27211, 30756, 24012, 24401, 24401, 24401, 24401, 26750, 18888, 18888, 18888, 27855, 27211, 27211, 27211, 17590, 24017, 24401, 24401, 24401, 18887, 18888, 18888, 27211, 27211, 27212, 24016, 24402, 19868, 25659, 18888, 18889, 27211, 27211, 19719, 23889, 19868, 31018, 18890, 27211, 31833, 19406, 19447, 23086, 23330, 19828, 31017, 27856, 31741, 19840, 25783, 31738, 19837, 25782, 19760, 31015, 23516, 31008, 22105, 19419, 27963, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22324, 18836, 22059, 18888, 27857, 30501, 24401, 29183, 22087, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 22121, 24401, 24401, 24401, 24401, 18866, 18888, 18888, 18888, 18888, 18888, 25783, 27211, 27211, 27211, 27211, 35072, 22164, 24401, 24401, 24401, 24401, 24036, 31693, 18888, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 27211, 19484, 24401, 24401, 24401, 24401, 24401, 19628, 18888, 18888, 18888, 18888, 23086, 27211, 27211, 27211, 27211, 30756, 24012, 24401, 24401, 24401, 24401, 26750, 18888, 18888, 18888, 27855, 27211, 27211, 27211, 17590, 24017, 24401, 24401, 24401, 18887, 18888, 18888, 27211, 27211, 27212, 24016, 24402, 19868, 25659, 18888, 18889, 27211, 27211, 19719, 23889, 19868, 31018, 18890, 27211, 31833, 19406, 19447, 23086, 23330, 19828, 31017, 27856, 31741, 19840, 25783, 31738, 19837, 25782, 19760, 31015, 23516, 31008, 22105, 19419, 27963, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22339, 18836, 22059, 18888, 27857, 34097, 24401, 29183, 22087, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 22121, 24401, 24401, 24401, 24401, 18866, 18888, 18888, 18888, 18888, 18888, 25783, 27211, 27211, 27211, 27211, 35072, 22164, 24401, 24401, 24401, 24401, 24036, 31693, 18888, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 27211, 19484, 24401, 24401, 24401, 24401, 24401, 19628, 18888, 18888, 18888, 18888, 23086, 27211, 27211, 27211, 27211, 30756, 24012, 24401, 24401, 24401, 24401, 34365, 18888, 18888, 18888, 27855, 27211, 27211, 27211, 17590, 24017, 24401, 24401, 24401, 18887, 18888, 18888, 27211, 27211, 27212, 24016, 24402, 19868, 25659, 18888, 18889, 27211, 27211, 19719, 23889, 19868, 31018, 18890, 27211, 31833, 19406, 19447, 23086, 23330, 19828, 31017, 27856, 31741, 19840, 25783, 31738, 19837, 25782, 19760, 31015, 23516, 31008, 22105, 19419, 27963, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22354, 18836, 18987, 19008, 19233, 20367, 19008, 17173, 27086, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17949, 17308, 17327, 17346, 18918, 18452, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 21873, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 19930, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21828, 18836, 18987, 19008, 19233, 20367, 19008, 17173, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17949, 17308, 17327, 17346, 18918, 18452, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 21873, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22309, 22513, 18987, 19008, 19233, 20367, 19008, 19122, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17949, 17308, 17327, 17346, 18918, 22544, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 21873, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22608, 18836, 22988, 23004, 27585, 23020, 23036, 23067, 22087, 18888, 18888, 18888, 23083, 27211, 27211, 27211, 23102, 22121, 24401, 24401, 24401, 23122, 31386, 26154, 19674, 18888, 28119, 28232, 19424, 23705, 27211, 27211, 23142, 23173, 23189, 23212, 24401, 24401, 23246, 34427, 31693, 23262, 18888, 23290, 23308, 27783, 27620, 23327, 35263, 35107, 33383, 23346, 18193, 23393, 32748, 23968, 24401, 23414, 35153, 23463, 18888, 33913, 23442, 23482, 27211, 27211, 23532, 23552, 21431, 23575, 24401, 24401, 23604, 26095, 23635, 23657, 18888, 33482, 23685, 33251, 27211, 22187, 18851, 23721, 35536, 24401, 18887, 23750, 32641, 27211, 23769, 23787, 20080, 33012, 24384, 25659, 18888, 18889, 27211, 27211, 19719, 23889, 23803, 31018, 18890, 27211, 31833, 19406, 19447, 23086, 23330, 19828, 28224, 31826, 23823, 26917, 34978, 23850, 26493, 25782, 23878, 23914, 23516, 31008, 22105, 19419, 27963, 19659, 29781, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22623, 18836, 22059, 18888, 27857, 34097, 24401, 29183, 22087, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 22121, 24401, 24401, 24401, 24401, 30613, 18888, 18888, 18888, 18888, 28909, 25783, 27211, 27211, 27211, 34048, 23933, 22164, 24401, 24401, 24401, 28409, 23949, 31693, 18888, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 27211, 19484, 24401, 24401, 24401, 24401, 24401, 31181, 26583, 18888, 18888, 18888, 35585, 23984, 27211, 27211, 27211, 24005, 22201, 24033, 24401, 24401, 24401, 24052, 18888, 18888, 18888, 27855, 27211, 27211, 27211, 22187, 22968, 24401, 24401, 24401, 18887, 18888, 18888, 27211, 27211, 35779, 20080, 24402, 19868, 25659, 18888, 18889, 27211, 27211, 19719, 23889, 19868, 31018, 18890, 27211, 31833, 19406, 19447, 23086, 23330, 19828, 31017, 27856, 31741, 26496, 24076, 24126, 24151, 25782, 19760, 31015, 23516, 31008, 22105, 19419, 27963, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22638, 18836, 22059, 19678, 27857, 24185, 24401, 24201, 24217, 26592, 18888, 18888, 18890, 24252, 24268, 27211, 27211, 22121, 24287, 24303, 24401, 24401, 30613, 19781, 35432, 36007, 32649, 18888, 25783, 24322, 28966, 23771, 27211, 35072, 22164, 24358, 32106, 26829, 24400, 31500, 31693, 18888, 18888, 18888, 24801, 18890, 27211, 27211, 27211, 27211, 24418, 19484, 24401, 24401, 24401, 24401, 20167, 31181, 18888, 18888, 18888, 27833, 23086, 27211, 27211, 33540, 27211, 30756, 21431, 24401, 24401, 22972, 24401, 26095, 18888, 36131, 18888, 27855, 27211, 24440, 27211, 22187, 22968, 24401, 24459, 24401, 31699, 28454, 18888, 34528, 34570, 35779, 24478, 24402, 24494, 25659, 18888, 36228, 27211, 27211, 24515, 30981, 23734, 31018, 18890, 27211, 31833, 19406, 19447, 23086, 23330, 24538, 31017, 27856, 31741, 30059, 23377, 24563, 19837, 25782, 19760, 31015, 23516, 25374, 22105, 19419, 29793, 24579, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22653, 18836, 22059, 25756, 19982, 34097, 23196, 29183, 24614, 24110, 23641, 24673, 26103, 24697, 24443, 24713, 28558, 22121, 24748, 24462, 24764, 23398, 30613, 18888, 18888, 18888, 18888, 24798, 25783, 27211, 27211, 27211, 34232, 35072, 22164, 24401, 24401, 24401, 33302, 31500, 22559, 24106, 24232, 18888, 18888, 34970, 24817, 30411, 27211, 27211, 32484, 19484, 29750, 35127, 24401, 24401, 19872, 31181, 24852, 18888, 18888, 24871, 29221, 27211, 27211, 32072, 27211, 30756, 34441, 24401, 24401, 31571, 24401, 26095, 33141, 27802, 27011, 27855, 25295, 25607, 24888, 22187, 22968, 19195, 34593, 24906, 18887, 18888, 18888, 27211, 27211, 35779, 20080, 24402, 19868, 25659, 18888, 33663, 27211, 27211, 24924, 24947, 23588, 31018, 18890, 27211, 31833, 22135, 19447, 23086, 23330, 19828, 30904, 31042, 24972, 19840, 25000, 31738, 30898, 25782, 19760, 31015, 23516, 31008, 22105, 19419, 25016, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22668, 18836, 25041, 25057, 31320, 25073, 25089, 25105, 22087, 34796, 24236, 36138, 34870, 34125, 25121, 23106, 35497, 22248, 36613, 25137, 30671, 27365, 30613, 25153, 26447, 25199, 25233, 22574, 23274, 25249, 25265, 25281, 25318, 25344, 25360, 25400, 25428, 25452, 26731, 25504, 31693, 23669, 25558, 27407, 25575, 28599, 25934, 25599, 27211, 28180, 27304, 25623, 25839, 25649, 24401, 34820, 25681, 25698, 22586, 27775, 30190, 25745, 25778, 25799, 25817, 28995, 33569, 30756, 21518, 33443, 25837, 25855, 25893, 26095, 31254, 26677, 30136, 27855, 25930, 25950, 27211, 22187, 22968, 25966, 25986, 24401, 23428, 27763, 36330, 26959, 26002, 26029, 26045, 26085, 26119, 26170, 26203, 26222, 26239, 30527, 26372, 26274, 28404, 31018, 33757, 27211, 34262, 26316, 36729, 26345, 26366, 35337, 31017, 26388, 26407, 30954, 26350, 33861, 26434, 26463, 26479, 26512, 23516, 33189, 26531, 26547, 27963, 31293, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22683, 18836, 26568, 26181, 26608, 34097, 26643, 29183, 22087, 26669, 18888, 18888, 18890, 26693, 27211, 27211, 27211, 22121, 26720, 24401, 24401, 24401, 30613, 18888, 18888, 18888, 18888, 26774, 25783, 27211, 27211, 27211, 26619, 35072, 22164, 24401, 24401, 24401, 21596, 31500, 31693, 18888, 18888, 33978, 18888, 18890, 27211, 27211, 25801, 27211, 27211, 19484, 24401, 24401, 24401, 26792, 24401, 31181, 18888, 18888, 18888, 35464, 23086, 27211, 27211, 27211, 26809, 30756, 21431, 24401, 24401, 24401, 26828, 26095, 18888, 18888, 18888, 27855, 27211, 27211, 27211, 22187, 22968, 24401, 24401, 24401, 18887, 18888, 18888, 27211, 27211, 35779, 20080, 24402, 19868, 25659, 31948, 18889, 35707, 27211, 19719, 26845, 19868, 31018, 18890, 27211, 31833, 19406, 19447, 23086, 23330, 26905, 31017, 27856, 31741, 19840, 25783, 31738, 19837, 25782, 19760, 31015, 23516, 24984, 31088, 19419, 26945, 27651, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22698, 18836, 26999, 18888, 27857, 34097, 24401, 29183, 22087, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 22121, 24401, 24401, 24401, 24401, 23051, 18888, 18888, 18888, 18888, 18888, 25783, 27211, 27211, 27211, 27211, 35072, 27033, 24401, 24401, 24401, 24401, 24036, 31693, 18888, 18888, 27056, 18888, 18890, 27211, 27211, 30320, 27211, 27211, 27075, 24401, 24401, 29032, 24401, 24401, 19628, 18888, 18888, 18888, 18888, 23086, 27211, 27211, 27211, 27211, 30756, 24012, 24401, 24401, 24401, 24401, 26750, 18888, 18888, 33986, 27855, 27211, 27211, 27102, 17590, 24017, 24401, 24401, 27123, 27144, 36254, 27162, 27210, 27228, 28500, 18187, 34842, 33426, 27244, 35980, 27277, 27302, 27320, 36048, 34013, 20999, 31882, 21478, 27895, 27356, 30287, 27381, 23086, 23330, 19828, 31017, 27856, 31741, 19840, 25783, 31738, 19837, 25782, 19760, 31015, 23516, 31008, 22105, 26329, 30087, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22339, 18836, 22059, 27406, 27423, 27445, 35294, 27461, 22087, 18888, 18888, 30140, 18890, 27211, 27211, 27989, 27211, 22121, 24401, 24401, 25682, 24401, 18866, 18888, 18888, 18888, 18888, 18888, 34042, 27211, 27211, 27211, 27211, 29700, 22164, 24401, 24401, 24401, 24401, 27128, 31693, 27477, 18888, 18888, 18888, 18890, 27194, 27211, 27211, 27211, 27211, 19484, 35299, 24401, 24401, 24401, 24401, 19628, 18888, 18888, 18888, 27059, 23086, 27211, 27211, 27211, 33366, 30756, 24012, 24401, 24401, 24401, 35044, 26750, 18888, 18888, 18888, 27855, 27211, 27211, 27211, 17590, 24017, 24401, 24401, 24401, 18887, 18888, 18888, 27211, 27211, 27212, 24016, 24402, 19868, 25659, 18888, 18889, 27211, 27211, 19719, 23889, 19868, 31018, 20815, 27211, 30818, 19960, 33969, 23086, 23330, 19828, 31017, 27856, 31741, 19840, 25783, 31738, 19837, 25782, 19760, 31015, 23516, 31008, 22105, 19419, 27963, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22713, 18836, 22059, 27496, 27516, 27541, 35231, 27557, 22087, 29662, 26292, 23292, 27573, 24836, 27601, 27211, 27636, 22121, 35544, 27686, 24401, 27721, 18866, 18888, 27799, 18888, 27818, 22071, 27853, 32260, 27211, 26013, 27873, 27920, 22164, 29419, 24401, 29946, 33413, 26742, 27751, 26881, 18888, 18888, 27261, 36776, 27936, 27211, 27211, 27211, 27988, 28005, 28031, 28052, 24401, 24401, 28069, 28088, 28135, 25488, 28152, 26069, 28167, 27211, 28340, 24657, 28196, 30756, 31523, 24401, 28212, 34176, 36174, 24956, 28248, 28266, 28290, 21488, 33077, 28327, 28356, 17590, 20986, 23126, 28391, 28425, 28102, 28451, 28470, 28490, 28516, 28534, 20034, 33728, 25868, 25659, 18888, 18889, 27211, 27211, 19719, 23889, 19868, 30241, 28274, 28553, 28574, 19406, 28590, 23086, 23330, 19828, 19452, 28615, 28660, 26147, 25783, 31738, 19837, 25782, 19760, 29613, 35958, 29276, 22105, 19419, 27963, 23157, 28700, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22339, 18836, 22059, 18888, 27857, 34097, 24401, 29183, 22087, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 22121, 24401, 24401, 24401, 24401, 18866, 18888, 18888, 18888, 18888, 18888, 25783, 27211, 27211, 27211, 27211, 35072, 22164, 24401, 24401, 24401, 24401, 24036, 22528, 18888, 18888, 18888, 18888, 18890, 27333, 27211, 27211, 27211, 27211, 19484, 30853, 24401, 24401, 24401, 24401, 19628, 18888, 18888, 18888, 18888, 23086, 27211, 27211, 27211, 27211, 30756, 24012, 24401, 24401, 24401, 24401, 26750, 18888, 18888, 18888, 27855, 27211, 27211, 27211, 17590, 24017, 24401, 24401, 24401, 18887, 18888, 18888, 27211, 27211, 27212, 24016, 24402, 19868, 25659, 18888, 18889, 27211, 27211, 19719, 23889, 19868, 31018, 18890, 27211, 31833, 19406, 19447, 23086, 23330, 19828, 31017, 27856, 31741, 19840, 25783, 31738, 19837, 25782, 19760, 31015, 23516, 31008, 22105, 19419, 27963, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22728, 18836, 28747, 28782, 28817, 28841, 28857, 28880, 28896, 24161, 28943, 32011, 36261, 27340, 28961, 29492, 28982, 29011, 24522, 29027, 25436, 29048, 23051, 27500, 29090, 29110, 30713, 18888, 23512, 29130, 25183, 27211, 29155, 28927, 27033, 29173, 23230, 24401, 29199, 35373, 31693, 18888, 18888, 25583, 32629, 29218, 27211, 27211, 31461, 30692, 29237, 27075, 24401, 24401, 24401, 29262, 29302, 19628, 18888, 34329, 18888, 18888, 23086, 27211, 29329, 27211, 27211, 30756, 24012, 35933, 24401, 24401, 24401, 27705, 31612, 18888, 18888, 29346, 29374, 27211, 35650, 17590, 21436, 29393, 24401, 25970, 18887, 33895, 18888, 27211, 32528, 27212, 24016, 32769, 19868, 25659, 18888, 26889, 27211, 27211, 29412, 23889, 24371, 31018, 18890, 27211, 31833, 19406, 19447, 23086, 23330, 19828, 31017, 27856, 31768, 19840, 25783, 31738, 19837, 29435, 29508, 31102, 29550, 29606, 22105, 30300, 29462, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22743, 18836, 22059, 29629, 29473, 34097, 33285, 29183, 29651, 27254, 18888, 29678, 33329, 32535, 27211, 29694, 29716, 22121, 19202, 24401, 32742, 29741, 18866, 26776, 33921, 28474, 18888, 18888, 25783, 29766, 27211, 29809, 27211, 35072, 22164, 35825, 24401, 29828, 24401, 24036, 36769, 25217, 18888, 18888, 29848, 18890, 27211, 29871, 27211, 26258, 27211, 29894, 24401, 29929, 24401, 36587, 24401, 19628, 18888, 18888, 18888, 18888, 23086, 27211, 27211, 27211, 27211, 29725, 29962, 24401, 24401, 24401, 24401, 26750, 18888, 18888, 18888, 27855, 27211, 27211, 27211, 17590, 24017, 24401, 24401, 24401, 18473, 18888, 18888, 19584, 27211, 27212, 24016, 29982, 19868, 25659, 18888, 18889, 27211, 27211, 19719, 23889, 19868, 31018, 18890, 27211, 31833, 19902, 19447, 32052, 19544, 19828, 29998, 30097, 30031, 19840, 25783, 30047, 19837, 25782, 19760, 31015, 23516, 31008, 22105, 19419, 27963, 19659, 30075, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22758, 18836, 30121, 30156, 30206, 30257, 30273, 30336, 22087, 35624, 32837, 25762, 18890, 29878, 34934, 26812, 27211, 22121, 24931, 23223, 29202, 24401, 18866, 34373, 30352, 18888, 18888, 18888, 23447, 24828, 27211, 27211, 27211, 35072, 30370, 35052, 24401, 24401, 24401, 24036, 29523, 18888, 18888, 27146, 18888, 31308, 30386, 27211, 27211, 30405, 30558, 19484, 30427, 24401, 24401, 29938, 35686, 19628, 28766, 30447, 34506, 35614, 23086, 28731, 30482, 30517, 30552, 30756, 24012, 20156, 30574, 30598, 30667, 26283, 33464, 28945, 27670, 30687, 32915, 33504, 25328, 17590, 23963, 20450, 33837, 21016, 32397, 26300, 30708, 30729, 27885, 30748, 21588, 36373, 30779, 26653, 24628, 33220, 32514, 30806, 31835, 25412, 25906, 26515, 18890, 28825, 31833, 26133, 19447, 28304, 31730, 23834, 26057, 30869, 30885, 32181, 30920, 30942, 32797, 25782, 30970, 31015, 23516, 31008, 30997, 31034, 27963, 19659, 29450, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22773, 18836, 31058, 31074, 32463, 31125, 31141, 31197, 22087, 18888, 29534, 35471, 36738, 27211, 24342, 31213, 24424, 22121, 24401, 20175, 31229, 31917, 27736, 31245, 34334, 27175, 18888, 29094, 27286, 27211, 31278, 31336, 27211, 31355, 31371, 24401, 31402, 31418, 24401, 31437, 31693, 18888, 31619, 32841, 18888, 18890, 27211, 27211, 31460, 31477, 27211, 19484, 24401, 24401, 31497, 36581, 24401, 33020, 18888, 18888, 18888, 18888, 30007, 27211, 27211, 27211, 27211, 31516, 32310, 24401, 24401, 24401, 24401, 31539, 18888, 28762, 18888, 24651, 35740, 27211, 27211, 28644, 31565, 35796, 24401, 24401, 19318, 32188, 18888, 24334, 28366, 27212, 29966, 29832, 19868, 25659, 18888, 18889, 27211, 27211, 19719, 31587, 19868, 31635, 32435, 33693, 30105, 31663, 20005, 31715, 31757, 31784, 31812, 30015, 31851, 31878, 25783, 31898, 19837, 25782, 19760, 31015, 23516, 31008, 22105, 19419, 27963, 31933, 30221, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22788, 18836, 22059, 25729, 30466, 31968, 24306, 31984, 32000, 32807, 35160, 27017, 29590, 34941, 19801, 29377, 33700, 22121, 27040, 30431, 29396, 28864, 29565, 18888, 18888, 18888, 32027, 18888, 25783, 27211, 27211, 23698, 27211, 35072, 22164, 24401, 24401, 30845, 24401, 24036, 32045, 18888, 26929, 18888, 18888, 18890, 27211, 31481, 32068, 27211, 27211, 32088, 24401, 33058, 32122, 24401, 24401, 33736, 18888, 18888, 33162, 18888, 23086, 27211, 27211, 29484, 27211, 28375, 32144, 24401, 24401, 33831, 24401, 26750, 18888, 18888, 18888, 27855, 27211, 27211, 27211, 36704, 24017, 24401, 24401, 24401, 18887, 18888, 18888, 27211, 27211, 27212, 24016, 24402, 19868, 25659, 18888, 18889, 27211, 27211, 19719, 23889, 19868, 31018, 18890, 27211, 31833, 33107, 22171, 33224, 24271, 32169, 31017, 27856, 31741, 19840, 25783, 31738, 30234, 25782, 19760, 31015, 23516, 31008, 22105, 19419, 27963, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22339, 18836, 32204, 32232, 32252, 32677, 33295, 29074, 22087, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 22121, 24401, 24401, 24401, 24401, 23619, 18888, 18888, 18888, 18888, 18888, 25783, 27211, 27211, 27211, 27211, 35072, 32276, 24401, 24401, 24401, 24401, 24036, 31693, 18888, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 27211, 32299, 24401, 24401, 24401, 24401, 24401, 19628, 18888, 18888, 18888, 18888, 23086, 27211, 27211, 27211, 27211, 30756, 24012, 24401, 24401, 24401, 24401, 26750, 18888, 18888, 18888, 27855, 27211, 27211, 27211, 17590, 24017, 24401, 24401, 24401, 18887, 18888, 18888, 27211, 27211, 27212, 24016, 24402, 19868, 25659, 33886, 18889, 36065, 27211, 19719, 35326, 19868, 31018, 18890, 27211, 31833, 19406, 19447, 23086, 23330, 19828, 31017, 27856, 31741, 19840, 25783, 31738, 19837, 25782, 19760, 31015, 23516, 31008, 22105, 19419, 27963, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22803, 18836, 32335, 31647, 34666, 32351, 32367, 32417, 22087, 18888, 32433, 19335, 32451, 27211, 32479, 27107, 32500, 22121, 24401, 32551, 20085, 32572, 18866, 22287, 23753, 18888, 18888, 32602, 32665, 27211, 32693, 27211, 26972, 32713, 32729, 24401, 32764, 24401, 25877, 32785, 34768, 18888, 27390, 32823, 24594, 24855, 32857, 24890, 32878, 32904, 27211, 32942, 32977, 24401, 33000, 29313, 24401, 30790, 26206, 27666, 33904, 18888, 23086, 36353, 27211, 33036, 27211, 30756, 24012, 32153, 24401, 33056, 24401, 35861, 18888, 18888, 30354, 27972, 27211, 27211, 33800, 17590, 20145, 24401, 24401, 34638, 20811, 18888, 18888, 33074, 27211, 27212, 36167, 24402, 19868, 25659, 18888, 18889, 27211, 27211, 19719, 23889, 19868, 31018, 18890, 27211, 31833, 19406, 34616, 24169, 33093, 33123, 33157, 27856, 31741, 23862, 26552, 34302, 19837, 25782, 19760, 31015, 23516, 31008, 33178, 19973, 27963, 23497, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22818, 18836, 33205, 28113, 33240, 34097, 33275, 29183, 22087, 33318, 35438, 18888, 18890, 33345, 26391, 33382, 27211, 22121, 33399, 28072, 33442, 24401, 18866, 22232, 18888, 33459, 18888, 18888, 33480, 33498, 25175, 27211, 27211, 26704, 22164, 24775, 35239, 24401, 24401, 25914, 29580, 18888, 18888, 31109, 25211, 33520, 33539, 27211, 27211, 33556, 36284, 19484, 33585, 24401, 24401, 33604, 32556, 19628, 18888, 18888, 31262, 33658, 23086, 27211, 27211, 33679, 27211, 30756, 24012, 24401, 24401, 33716, 24401, 26854, 27480, 18888, 33752, 27855, 33259, 34701, 27211, 17590, 32102, 24782, 23807, 24401, 18887, 18888, 18888, 27211, 27211, 27212, 33773, 36105, 19868, 25659, 18888, 23368, 27211, 29157, 19719, 23889, 34454, 29286, 18890, 33794, 25302, 33816, 19447, 34079, 33853, 31862, 31017, 27856, 31741, 33877, 28920, 33937, 19837, 30461, 34002, 22276, 36041, 34029, 22105, 19419, 27963, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22833, 18836, 34064, 32616, 34113, 34141, 34157, 34192, 34208, 32216, 36013, 31549, 31952, 34224, 34248, 34287, 29330, 34350, 34389, 34413, 34481, 26793, 18866, 26187, 29635, 22293, 18888, 36654, 25783, 34522, 34544, 34566, 25821, 35072, 22164, 34586, 34609, 34632, 19604, 24036, 36644, 36674, 24681, 18888, 32401, 34654, 31339, 34682, 34698, 27211, 34717, 34753, 28053, 34812, 34836, 24401, 33619, 19628, 34858, 32236, 34906, 24598, 33523, 27612, 34890, 34922, 24732, 29246, 36717, 33634, 34465, 32984, 34168, 26750, 34957, 18888, 18888, 34994, 35010, 27211, 33040, 17590, 29913, 35035, 24401, 36304, 25482, 30171, 35883, 35068, 35088, 26627, 20441, 31173, 35123, 35143, 35176, 24640, 30492, 29358, 19719, 35192, 35219, 25384, 28801, 35255, 35279, 32586, 34496, 23086, 23330, 29061, 31017, 27856, 31741, 19840, 25783, 31738, 24547, 25164, 35315, 31796, 35353, 34316, 22105, 19419, 27963, 24091, 28630, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22848, 18836, 22059, 34782, 34088, 35389, 21008, 35405, 35421, 35454, 18888, 18888, 23466, 35487, 27211, 27211, 27211, 35513, 31154, 24401, 24401, 24401, 35560, 18888, 26863, 36664, 35601, 24872, 25783, 30389, 23536, 26250, 35647, 35666, 22164, 19522, 19564, 30582, 35682, 27697, 35575, 29114, 18888, 18888, 18888, 18890, 27211, 35702, 27211, 27211, 27211, 35723, 24401, 35527, 24401, 24401, 24401, 19628, 30184, 18888, 18888, 18888, 23086, 35739, 27211, 27211, 27211, 29139, 22938, 24401, 24401, 24401, 24401, 23898, 35756, 18888, 18888, 25025, 35778, 27211, 27211, 17590, 20064, 35795, 24401, 24401, 18887, 18888, 18888, 27211, 27211, 27212, 24016, 24402, 19868, 25659, 18888, 18889, 27211, 27211, 19719, 23889, 19868, 23917, 18890, 34550, 31833, 22262, 19447, 23086, 23330, 26418, 31017, 27856, 31741, 19840, 25783, 35812, 19837, 27187, 35841, 33135, 23516, 31008, 22105, 22148, 28712, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22863, 18836, 22059, 35877, 28723, 34097, 31164, 29183, 22087, 26758, 18888, 22592, 18890, 23989, 27211, 29812, 27211, 22121, 33778, 24401, 31421, 24401, 18866, 18888, 18888, 26872, 18888, 18888, 25783, 27211, 30732, 27211, 27211, 35072, 22164, 24401, 24908, 24401, 24401, 24036, 31693, 18888, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 27211, 19484, 24401, 24401, 24401, 24401, 24401, 19628, 18888, 18888, 18888, 18888, 23086, 27211, 27211, 27211, 27211, 30756, 24012, 24401, 24401, 24401, 24401, 26750, 18888, 18888, 18888, 27855, 27211, 27211, 27211, 17590, 24017, 24401, 24401, 24401, 18887, 18888, 18888, 27211, 27211, 27212, 24016, 24402, 19868, 25659, 18888, 18889, 27211, 27211, 19719, 23889, 19868, 31018, 18890, 27211, 31833, 19406, 19447, 23086, 23330, 19828, 31017, 27856, 31741, 19840, 25783, 31738, 19837, 25782, 19760, 31015, 23516, 31008, 22105, 19419, 27963, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22878, 18836, 22059, 27837, 27857, 35899, 24401, 35915, 22087, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 22121, 24401, 24401, 24401, 24401, 18866, 18888, 18888, 18888, 18888, 18888, 25783, 27211, 27211, 27211, 27211, 35072, 22164, 24401, 24401, 24401, 24401, 24036, 31602, 18888, 18888, 18888, 18888, 26223, 27211, 27211, 27211, 27211, 27211, 19484, 35931, 24401, 24401, 24401, 24401, 19628, 18888, 28136, 18888, 18888, 35949, 27211, 32862, 27211, 32697, 30756, 24012, 24401, 32283, 24401, 32128, 26750, 18888, 18888, 18888, 27855, 27211, 27211, 27211, 17590, 24017, 24401, 24401, 24401, 18887, 18888, 18888, 27211, 27211, 27212, 24016, 24402, 19868, 25659, 18888, 18889, 27211, 27211, 19719, 23889, 19868, 31018, 18890, 27211, 31833, 19406, 19447, 23086, 23330, 19828, 31017, 27856, 31741, 19840, 25783, 31738, 19837, 25782, 19760, 31015, 23516, 31008, 22105, 19419, 27963, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22893, 18836, 22059, 35974, 34882, 34097, 33960, 29183, 35996, 18888, 23311, 18888, 36029, 27211, 27211, 36064, 36081, 22121, 24401, 24401, 36104, 33950, 18866, 18888, 18888, 18888, 18888, 18888, 25783, 27211, 27211, 27211, 27211, 35072, 22164, 24401, 24401, 24401, 24401, 24036, 36121, 18888, 25559, 18888, 18888, 18890, 27211, 27211, 30313, 27211, 27211, 36154, 24401, 24401, 34397, 24401, 24401, 19628, 28250, 18888, 18888, 18888, 23086, 30926, 27211, 27211, 27211, 26983, 24012, 33642, 24401, 24401, 24401, 26750, 18888, 18888, 18888, 27855, 27211, 27211, 27211, 17590, 24017, 24401, 24401, 24401, 18887, 18888, 18888, 27211, 27211, 27212, 24016, 24402, 19868, 25659, 18888, 18889, 27211, 27211, 19719, 23889, 19868, 31018, 18890, 27211, 31833, 19406, 19447, 23086, 23330, 19828, 31017, 27856, 31741, 19840, 25783, 31738, 19837, 25782, 19760, 31015, 23516, 31008, 22105, 19419, 27963, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22339, 18836, 22059, 19354, 27857, 36190, 24401, 36206, 22087, 18888, 18888, 18888, 18007, 27211, 27211, 27211, 24724, 22121, 24401, 24401, 24401, 30827, 18866, 18888, 36222, 18888, 28795, 18888, 25783, 35100, 27211, 27429, 27211, 35072, 22164, 30836, 24401, 24499, 24401, 24036, 31693, 18888, 36244, 18888, 18888, 18890, 27211, 36088, 27211, 27211, 27211, 19484, 24401, 28036, 24401, 24401, 24401, 19628, 18888, 18888, 35631, 18888, 35762, 27211, 27211, 36277, 27211, 34730, 24012, 24401, 24401, 36300, 24401, 36320, 18888, 18888, 18888, 27855, 27211, 27211, 27211, 17590, 24017, 24401, 24401, 24401, 25712, 18888, 18888, 36346, 27211, 27212, 19184, 24402, 19868, 25659, 32029, 18889, 27211, 33359, 19719, 23889, 36369, 31018, 18890, 27211, 31833, 19406, 19447, 23086, 23330, 19828, 31017, 27856, 31741, 19840, 25783, 31738, 19837, 25782, 19760, 31015, 23516, 31008, 22105, 19419, 27963, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22384, 18836, 36389, 19008, 19233, 20367, 36434, 17173, 17595, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 36453, 17308, 17327, 17346, 18918, 18452, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 20362, 21726, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22369, 18836, 18987, 19008, 19233, 20367, 19008, 21737, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17949, 17308, 17327, 17346, 18918, 18452, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 21873, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21813, 18836, 36489, 19008, 19233, 20367, 19008, 17173, 17737, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17768, 17308, 17327, 17346, 18918, 18452, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 20543, 22022, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21828, 18836, 18987, 19008, 19233, 20367, 19008, 17173, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 36517, 17308, 17327, 17346, 18918, 18452, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 21873, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21828, 18836, 19307, 18888, 27857, 30756, 24401, 29183, 28015, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 36567, 24401, 24401, 24401, 24401, 22953, 18888, 18888, 18888, 18888, 18888, 25783, 27211, 27211, 27211, 27211, 28537, 36603, 24401, 24401, 24401, 24401, 24036, 18881, 18888, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 27211, 19484, 24401, 24401, 24401, 24401, 24401, 19628, 18888, 18888, 18888, 18888, 23086, 27211, 27211, 27211, 27211, 30756, 24012, 24401, 24401, 24401, 24401, 26750, 18888, 18888, 18888, 27855, 27211, 27211, 27211, 17590, 24017, 24401, 24401, 24401, 18887, 18888, 18888, 27211, 27211, 27212, 24016, 24402, 19868, 25659, 18888, 18889, 27211, 27211, 19719, 23889, 19868, 31018, 18890, 27211, 31833, 19406, 19447, 23086, 23330, 19828, 31017, 27856, 31741, 19840, 25783, 31738, 19837, 25782, 19760, 31015, 23516, 31008, 22105, 19419, 27963, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 36629, 36690, 18720, 19008, 19233, 20367, 19008, 17454, 17595, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17223, 17308, 17327, 17346, 18918, 36754, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 20362, 21726, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 0, 94242, 0, 118820, 0, 2211840, 102439, 0, 0, 106538, 98347, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2482176, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 2207744, 2404352, 2412544, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 3104768, 2605056, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2678784, 2207744, 2695168, 2207744, 2703360, 2207744, 2711552, 2752512, 2207744, 0, 0, 0, 0, 0, 0, 2166784, 0, 0, 0, 0, 0, 0, 2158592, 2158592, 3170304, 3174400, 2158592, 0, 139, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 2424832, 2158592, 2158592, 2158592, 2748416, 2756608, 2777088, 2801664, 2158592, 2158592, 2158592, 2863104, 2891776, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 3104768, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2207744, 2785280, 2207744, 2809856, 2207744, 2207744, 2842624, 2207744, 2207744, 2207744, 2899968, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2473984, 2207744, 2207744, 2494464, 2207744, 2207744, 2207744, 2523136, 2158592, 2404352, 2412544, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2564096, 2158592, 2158592, 2605056, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2678784, 2158592, 2695168, 2158592, 2703360, 2158592, 2711552, 2752512, 2158592, 2158592, 2785280, 2158592, 2158592, 2785280, 2158592, 2809856, 2158592, 2158592, 2842624, 2158592, 2158592, 2158592, 2899968, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 18, 0, 0, 0, 0, 0, 0, 0, 2211840, 0, 0, 641, 0, 2158592, 0, 0, 0, 0, 0, 0, 0, 0, 2211840, 0, 0, 32768, 0, 2158592, 0, 2158592, 2158592, 2158592, 2383872, 2158592, 2158592, 2158592, 2158592, 3006464, 2383872, 2207744, 2207744, 2207744, 2207744, 2158877, 2158877, 2158877, 2158877, 0, 0, 0, 2158877, 2572573, 2158877, 2158877, 0, 2207744, 2207744, 2596864, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2641920, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 0, 0, 0, 167936, 0, 0, 2162688, 0, 0, 3104768, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 0, 0, 0, 2146304, 2146304, 2224128, 2224128, 2232320, 2232320, 2232320, 641, 0, 0, 0, 0, 0, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2531328, 2158592, 2158592, 2158592, 2158592, 2158592, 2617344, 2158592, 2158592, 2158592, 2158592, 2441216, 2445312, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2502656, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2580480, 2158592, 2158592, 2158592, 2158592, 2621440, 2158592, 2580480, 2158592, 2158592, 2158592, 2158592, 2621440, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2699264, 2158592, 2158592, 2158592, 2158592, 2158592, 2748416, 2756608, 2777088, 2801664, 2207744, 2863104, 2891776, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 3018752, 2207744, 3043328, 2207744, 2207744, 2207744, 2207744, 3080192, 2207744, 2207744, 3112960, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 0, 0, 0, 172310, 279, 0, 2162688, 0, 0, 2207744, 2207744, 2207744, 3186688, 2207744, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2158592, 2158592, 2158592, 2404352, 2412544, 2158592, 2510848, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2584576, 2158592, 2609152, 2158592, 2158592, 2629632, 2158592, 2158592, 2158592, 2686976, 2158592, 2715648, 2158592, 2158592, 3121152, 2158592, 2158592, 2158592, 3149824, 2158592, 2158592, 3170304, 3174400, 2158592, 2367488, 2207744, 2207744, 2207744, 2207744, 2158592, 2158592, 2158592, 2158592, 0, 0, 0, 2158592, 2572288, 2158592, 2158592, 0, 2207744, 2207744, 2207744, 2433024, 2207744, 2453504, 2461696, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2510848, 2207744, 2207744, 2207744, 2207744, 2207744, 2531328, 2207744, 2207744, 2207744, 2207744, 2207744, 2617344, 2207744, 2207744, 2207744, 2207744, 2158592, 2158592, 2158592, 2158592, 0, 0, 0, 2158592, 2572288, 2158592, 2158592, 1508, 2715648, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2867200, 2207744, 2904064, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2580480, 2207744, 2207744, 2207744, 2207744, 2621440, 2207744, 2207744, 2207744, 3149824, 2207744, 2207744, 3170304, 3174400, 2207744, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 138, 2158592, 2158592, 2158592, 2404352, 2412544, 2707456, 2732032, 2207744, 2207744, 2207744, 2822144, 2826240, 2207744, 2895872, 2207744, 2207744, 2924544, 2207744, 2207744, 2973696, 2207744, 0, 0, 0, 0, 0, 0, 2166784, 0, 0, 0, 0, 0, 285, 2158592, 2158592, 3112960, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 3186688, 2158592, 2207744, 2207744, 2158592, 2158592, 2158592, 2158592, 2158592, 0, 0, 0, 2158592, 2158592, 2158592, 2158592, 0, 0, 2535424, 2543616, 2158592, 2158592, 2158592, 0, 0, 0, 2158592, 2158592, 2158592, 2990080, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2572288, 2981888, 2207744, 2207744, 3002368, 2207744, 3047424, 3063808, 3076096, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 3203072, 2708960, 2732032, 2158592, 2158592, 2158592, 2822144, 2827748, 2158592, 2895872, 2158592, 2158592, 2924544, 2158592, 2158592, 2973696, 2158592, 2981888, 2158592, 2158592, 3002368, 2158592, 3047424, 3063808, 3076096, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 3203072, 2981888, 2158592, 2158592, 3003876, 2158592, 3047424, 3063808, 3076096, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 3203072, 2207744, 2207744, 2207744, 2207744, 2207744, 2424832, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 20480, 0, 0, 0, 0, 0, 2162688, 20480, 0, 2523136, 2527232, 2158592, 2158592, 2576384, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2908160, 2527232, 2207744, 2207744, 2576384, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2908160, 2207744, 0, 0, 0, 0, 0, 0, 2166784, 0, 0, 0, 0, 0, 286, 2158592, 2158592, 0, 0, 2158592, 2158592, 2158592, 2158592, 2633728, 2658304, 0, 0, 2740224, 2744320, 0, 2834432, 2207744, 2207744, 2977792, 2207744, 2207744, 2207744, 2207744, 3039232, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 3158016, 0, 0, 29315, 0, 0, 0, 0, 45, 45, 45, 45, 45, 933, 45, 45, 45, 45, 442, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 2494464, 2158592, 2158592, 2158592, 2524757, 2527232, 2158592, 2158592, 2576384, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 1504, 2158592, 2498560, 2158592, 2158592, 2158592, 2158592, 2568192, 2158592, 2592768, 2625536, 2158592, 2158592, 2674688, 2736128, 2158592, 2158592, 0, 2158592, 2912256, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 3108864, 2158592, 2158592, 3133440, 3145728, 3153920, 2375680, 2379776, 2207744, 2207744, 2420736, 2207744, 2449408, 2207744, 2207744, 2207744, 2498560, 2207744, 2207744, 2207744, 2207744, 2568192, 2207744, 0, 0, 0, 0, 0, 0, 2166784, 0, 0, 0, 0, 0, 551, 2158592, 2158592, 2158592, 2158592, 2207744, 2506752, 2207744, 2207744, 2207744, 2207744, 2207744, 2158592, 2506752, 0, 2020, 2158592, 2592768, 2625536, 2207744, 2207744, 2674688, 2736128, 2207744, 2207744, 2207744, 2912256, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 0, 542, 0, 544, 2207744, 3108864, 2207744, 2207744, 3133440, 3145728, 3153920, 2375680, 2379776, 2158592, 2158592, 2420736, 2158592, 2449408, 2158592, 2158592, 2158592, 2158592, 2158592, 3186688, 2158592, 0, 641, 0, 0, 0, 0, 0, 0, 2367488, 2158592, 2498560, 2158592, 2158592, 1621, 2158592, 2158592, 2568192, 2158592, 2592768, 2625536, 2158592, 2158592, 2674688, 0, 0, 0, 0, 0, 1608, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1107, 97, 97, 1110, 97, 97, 3133440, 3145728, 3153920, 2158592, 2408448, 2416640, 2158592, 2465792, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 3014656, 2158592, 2158592, 3051520, 2158592, 2158592, 3100672, 2158592, 2158592, 3121152, 2158592, 2158592, 2158592, 3149824, 2416640, 2207744, 2465792, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2633728, 2658304, 2740224, 2744320, 2834432, 2949120, 2158592, 2985984, 2158592, 2998272, 2158592, 2158592, 2158592, 3129344, 2207744, 2408448, 2949120, 2207744, 2985984, 2207744, 2998272, 2207744, 2207744, 2207744, 3129344, 2158592, 2408448, 2416640, 2158592, 2465792, 2158592, 2158592, 2158592, 2158592, 2158592, 3186688, 2158592, 0, 32768, 0, 0, 0, 0, 0, 0, 2367488, 2949120, 2158592, 2985984, 2158592, 2998272, 2158592, 2158592, 2158592, 3129344, 2158592, 2158592, 2478080, 2158592, 2158592, 2158592, 2535424, 2543616, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 3117056, 2207744, 2207744, 2478080, 2207744, 2207744, 2207744, 2207744, 2699264, 2207744, 2207744, 2207744, 2207744, 2207744, 2748416, 2756608, 2777088, 2801664, 2207744, 2207744, 2158877, 2158877, 2158877, 2158877, 2158877, 0, 0, 0, 2158877, 2158877, 2158877, 2158877, 0, 0, 2535709, 2543901, 2158877, 2158877, 2158877, 0, 0, 0, 2158877, 2158877, 2158877, 2990365, 2158877, 2158877, 2158730, 2158730, 2158730, 2158730, 2158730, 2572426, 2207744, 2535424, 2543616, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 3117056, 2158592, 2158592, 2478080, 2207744, 2207744, 2990080, 2207744, 2207744, 2158592, 2158592, 2482176, 2158592, 2158592, 0, 0, 0, 2158592, 2158592, 2158592, 0, 2158592, 2908160, 2158592, 2158592, 2158592, 2977792, 2158592, 2158592, 2158592, 2158592, 3039232, 2158592, 2158592, 3010560, 2207744, 2428928, 2207744, 2514944, 2207744, 2588672, 2207744, 2838528, 2207744, 2207744, 2207744, 3010560, 2158592, 2428928, 2158592, 2514944, 0, 0, 2158592, 2588672, 2158592, 0, 2838528, 2158592, 2158592, 2158592, 3010560, 2158592, 2506752, 2158592, 18, 0, 0, 0, 0, 0, 0, 0, 2211840, 0, 0, 0, 0, 2158592, 0, 0, 29315, 922, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1539, 45, 3006464, 2383872, 0, 2020, 2158592, 2158592, 2158592, 2158592, 3006464, 2158592, 2637824, 2953216, 2158592, 2207744, 2637824, 2953216, 2207744, 0, 0, 2158592, 2637824, 2953216, 2158592, 2539520, 2158592, 2539520, 2207744, 0, 0, 2539520, 2158592, 2158592, 2158592, 2158592, 2207744, 2506752, 2207744, 2207744, 2207744, 2207744, 2207744, 2158592, 2506752, 0, 0, 2158592, 2207744, 0, 2158592, 2158592, 2207744, 0, 2158592, 2158592, 2207744, 0, 2158592, 2965504, 2965504, 2965504, 0, 0, 0, 0, 0, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2474269, 2158877, 2158877, 0, 0, 2158877, 2158877, 2158877, 2158877, 2634013, 2658589, 0, 0, 2740509, 2744605, 0, 2834717, 40976, 18, 36884, 45078, 24, 28, 90143, 94242, 118820, 102439, 106538, 98347, 118820, 118820, 118820, 40976, 18, 18, 36884, 0, 0, 0, 24, 24, 24, 27, 27, 27, 27, 90143, 0, 0, 86016, 0, 0, 2211840, 102439, 0, 0, 0, 98347, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 3158016, 0, 2375680, 2379776, 2158592, 2158592, 2420736, 2158592, 2449408, 2158592, 2158592, 0, 94242, 0, 0, 0, 2211840, 102439, 0, 0, 106538, 98347, 135, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2564096, 2158592, 2158592, 2158592, 2158592, 2158592, 2596864, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2641920, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2781184, 2793472, 2494464, 2158592, 2158592, 2158592, 2523136, 2527232, 2158592, 2158592, 2576384, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 0, 40976, 0, 18, 18, 24, 0, 27, 27, 0, 2158592, 2498560, 2158592, 2158592, 0, 2158592, 2158592, 2568192, 2158592, 2592768, 2625536, 2158592, 2158592, 2674688, 0, 0, 0, 0, 0, 2211840, 0, 0, 0, 0, 0, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2473984, 2158592, 2158592, 2494464, 2158592, 2158592, 2158592, 3006464, 2383872, 0, 0, 2158592, 2158592, 2158592, 2158592, 3006464, 2158592, 2637824, 2953216, 2158592, 2207744, 2637824, 2953216, 40976, 18, 36884, 45078, 24, 27, 147488, 94242, 147456, 147488, 106538, 98347, 0, 0, 147456, 40976, 18, 18, 36884, 0, 45078, 0, 24, 24, 24, 27, 27, 27, 27, 0, 81920, 0, 94242, 0, 0, 0, 2211840, 0, 0, 0, 106538, 98347, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2428928, 2158592, 2514944, 2158592, 2588672, 2158592, 2838528, 2158592, 2158592, 40976, 18, 151573, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 0, 40976, 18, 18, 36884, 0, 45078, 0, 24, 24, 24, 27, 27, 27, 27, 90143, 0, 0, 1315, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1487, 97, 18, 131427, 0, 0, 0, 0, 0, 0, 362, 0, 0, 365, 29315, 367, 0, 0, 29315, 0, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 130, 94242, 0, 0, 0, 2211840, 102439, 0, 0, 106538, 98347, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 3096576, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2207744, 2207744, 2158592, 18, 0, 0, 0, 0, 0, 0, 0, 2211840, 0, 0, 0, 0, 2158592, 644, 2207744, 2207744, 2207744, 3186688, 2207744, 0, 1080, 0, 1084, 0, 1088, 0, 0, 0, 0, 0, 0, 0, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2531466, 2158730, 2158730, 2158730, 2158730, 2158730, 2617482, 0, 94242, 0, 0, 0, 2211840, 102439, 0, 0, 106538, 98347, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 2781184, 2793472, 2158592, 2818048, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 40976, 18, 36884, 45078, 24, 27, 90143, 159779, 159744, 102439, 159779, 98347, 0, 0, 159744, 40976, 18, 18, 36884, 0, 45078, 0, 2224253, 172032, 2224253, 2232448, 2232448, 172032, 2232448, 90143, 0, 0, 2170880, 0, 0, 550, 829, 2158592, 2158592, 2158592, 2387968, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 0, 40976, 0, 18, 18, 124, 124, 127, 127, 127, 40976, 18, 36884, 45078, 25, 29, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 163931, 40976, 18, 18, 36884, 0, 45078, 249856, 24, 24, 24, 27, 27, 27, 27, 90143, 0, 0, 2170880, 0, 0, 827, 0, 2158592, 2158592, 2158592, 2387968, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 0, 40976, 0, 4243810, 4243810, 24, 24, 27, 27, 27, 2207744, 0, 0, 0, 0, 0, 0, 2166784, 0, 0, 0, 0, 57344, 286, 2158592, 2158592, 2158592, 2158592, 2707456, 2732032, 2158592, 2158592, 2158592, 2822144, 2826240, 2158592, 2895872, 2158592, 2158592, 2924544, 2158592, 2158592, 2973696, 2158592, 2207744, 2207744, 2207744, 3186688, 2207744, 0, 0, 0, 0, 0, 0, 53248, 0, 0, 0, 0, 0, 97, 97, 97, 97, 97, 1613, 97, 97, 97, 97, 97, 97, 1495, 97, 97, 97, 97, 97, 97, 97, 97, 97, 566, 97, 97, 97, 97, 97, 97, 2207744, 0, 0, 0, 0, 0, 0, 2166784, 546, 0, 0, 0, 0, 286, 2158592, 2158592, 2158592, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 17, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 20480, 120, 121, 18, 18, 36884, 0, 45078, 0, 24, 24, 24, 27, 27, 27, 27, 90143, 0, 0, 2170880, 0, 53248, 550, 0, 2158592, 2158592, 2158592, 2387968, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 0, 40976, 196608, 18, 266240, 24, 24, 27, 27, 27, 0, 94242, 0, 0, 0, 38, 102439, 0, 0, 106538, 98347, 0, 45, 45, 45, 45, 45, 45, 45, 1535, 45, 45, 45, 45, 45, 45, 45, 1416, 45, 45, 45, 45, 45, 45, 45, 45, 424, 45, 45, 45, 45, 45, 45, 45, 45, 45, 405, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 199, 45, 45, 67, 67, 67, 67, 67, 491, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1766, 67, 67, 67, 1767, 67, 24850, 24850, 12564, 12564, 0, 0, 2166784, 546, 0, 53531, 53531, 0, 286, 97, 97, 0, 0, 97, 97, 97, 97, 97, 97, 0, 0, 97, 97, 0, 97, 97, 97, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 743, 57889, 0, 2170880, 0, 0, 550, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 45, 45, 1856, 45, 1858, 1859, 67, 67, 67, 1009, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1021, 67, 67, 67, 67, 67, 25398, 0, 13112, 0, 54074, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2367773, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2699549, 2158877, 2158877, 2158877, 2158877, 2158877, 2748701, 2756893, 2777373, 2801949, 97, 1115, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 857, 97, 67, 67, 67, 67, 67, 1258, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1826, 67, 97, 97, 97, 97, 97, 97, 1338, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 870, 97, 97, 67, 67, 67, 1463, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1579, 67, 67, 97, 97, 97, 1518, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 904, 905, 97, 97, 97, 97, 1620, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 921, 0, 0, 0, 0, 0, 0, 45, 1679, 67, 67, 67, 1682, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1690, 67, 0, 0, 97, 97, 97, 97, 45, 45, 67, 67, 0, 0, 97, 97, 45, 45, 45, 669, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 189, 45, 45, 45, 1748, 45, 45, 45, 1749, 1750, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 1959, 67, 67, 67, 67, 1768, 67, 67, 67, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1791, 97, 97, 97, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 1802, 67, 1817, 67, 67, 67, 67, 67, 67, 1823, 67, 67, 67, 67, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 0, 97, 97, 97, 97, 1848, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 659, 45, 45, 45, 45, 45, 45, 45, 1863, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 495, 67, 67, 67, 67, 67, 1878, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 0, 0, 97, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 97, 97, 97, 97, 0, 0, 0, 1973, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1165, 97, 1167, 67, 24850, 24850, 12564, 12564, 0, 0, 2166784, 0, 0, 53531, 53531, 0, 286, 97, 97, 0, 0, 97, 97, 97, 97, 97, 97, 0, 0, 97, 97, 1789, 97, 0, 94242, 0, 0, 0, 2211840, 102439, 0, 0, 106538, 98347, 136, 2158592, 2158592, 2158592, 2158592, 2158592, 3158016, 229376, 2375680, 2379776, 2158592, 2158592, 2420736, 2158592, 2449408, 2158592, 2158592, 67, 24850, 24850, 12564, 12564, 0, 0, 280, 547, 0, 53531, 53531, 0, 286, 97, 97, 0, 0, 97, 97, 97, 97, 97, 97, 0, 1788, 97, 97, 0, 97, 2024, 97, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 235, 67, 67, 67, 67, 67, 57889, 547, 547, 0, 0, 550, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 45, 45, 45, 1799, 45, 45, 45, 67, 67, 67, 67, 67, 25398, 0, 13112, 0, 54074, 0, 0, 1092, 0, 0, 0, 0, 0, 97, 97, 97, 97, 1612, 97, 97, 97, 97, 1616, 97, 1297, 1472, 0, 0, 0, 0, 1303, 1474, 0, 0, 0, 0, 1309, 1476, 0, 0, 0, 0, 97, 97, 97, 1481, 97, 97, 97, 97, 97, 97, 1488, 97, 0, 1474, 0, 1476, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 607, 97, 97, 97, 97, 40976, 18, 36884, 45078, 26, 30, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 213080, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 143448, 40976, 18, 18, 36884, 0, 45078, 0, 24, 24, 24, 27, 27, 27, 27, 0, 0, 0, 0, 97, 97, 97, 97, 1482, 97, 1483, 97, 97, 97, 97, 97, 97, 1326, 97, 97, 1329, 1330, 97, 97, 97, 97, 97, 97, 1159, 1160, 97, 97, 97, 97, 97, 97, 97, 97, 590, 97, 97, 97, 97, 97, 97, 97, 0, 94242, 0, 0, 0, 2211974, 102439, 0, 0, 106538, 98347, 0, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2474122, 2158730, 2158730, 2494602, 2158730, 2158730, 2158730, 2809994, 2158730, 2158730, 2842762, 2158730, 2158730, 2158730, 2900106, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 3014794, 2158730, 2158730, 3051658, 2158730, 2158730, 3100810, 2158730, 2158730, 2158730, 2158730, 3096714, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2207744, 2207744, 2207744, 2207744, 2207744, 2572288, 2207744, 2207744, 2207744, 2207744, 541, 541, 543, 543, 0, 0, 2166784, 0, 548, 549, 549, 0, 286, 2158877, 2158877, 2158877, 2863389, 2892061, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 3186973, 2158877, 0, 0, 0, 0, 0, 0, 0, 0, 2367626, 2158877, 2404637, 2412829, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2564381, 2158877, 2158877, 2605341, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2679069, 2158877, 2695453, 2158877, 2703645, 2158877, 2711837, 2752797, 2158877, 0, 2158877, 2158877, 2158877, 2384010, 2158730, 2158730, 2158730, 2158730, 3006602, 2383872, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 3096576, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 0, 0, 0, 0, 0, 0, 2162688, 0, 0, 2158877, 2785565, 2158877, 2810141, 2158877, 2158877, 2842909, 2158877, 2158877, 2158877, 2900253, 2158877, 2158877, 2158877, 2158877, 2158877, 2531613, 2158877, 2158877, 2158877, 2158877, 2158877, 2617629, 2158877, 2158877, 2158877, 2158877, 2158730, 2818186, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 3105053, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 0, 0, 0, 0, 0, 97, 97, 97, 1611, 97, 97, 97, 97, 97, 97, 97, 1496, 97, 97, 1499, 97, 97, 97, 97, 97, 2441354, 2445450, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2502794, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2433162, 2158730, 2453642, 2461834, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2580618, 2158730, 2158730, 2158730, 2158730, 2621578, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2699402, 2158730, 2158730, 2158730, 2158730, 2678922, 2158730, 2695306, 2158730, 2703498, 2158730, 2711690, 2752650, 2158730, 2158730, 2785418, 2158730, 2158730, 2158730, 3113098, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 3186826, 2158730, 2207744, 2207744, 2207744, 2207744, 2781184, 2793472, 2207744, 2818048, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 0, 541, 0, 543, 2158877, 2502941, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2580765, 2158877, 2158877, 2158877, 2158877, 2621725, 2158877, 3019037, 2158877, 3043613, 2158877, 2158877, 2158877, 2158877, 3080477, 2158877, 2158877, 3113245, 2158877, 2158877, 2158877, 2158877, 0, 2158877, 2908445, 2158877, 2158877, 2158877, 2978077, 2158877, 2158877, 2158877, 2158877, 3039517, 2158877, 2158730, 2510986, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2584714, 2158730, 2609290, 2158730, 2158730, 2629770, 2158730, 2158730, 2158730, 2388106, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2605194, 2158730, 2158730, 2158730, 2158730, 2687114, 2158730, 2715786, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2867338, 2158730, 2904202, 2158730, 2158730, 2158730, 2642058, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2781322, 2793610, 2158730, 3121290, 2158730, 2158730, 2158730, 3149962, 2158730, 2158730, 3170442, 3174538, 2158730, 2367488, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2441216, 2445312, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2502656, 2158877, 2433309, 2158877, 2453789, 2461981, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2511133, 2158877, 2158877, 2158877, 2158877, 2584861, 2158877, 2609437, 2158877, 2158877, 2629917, 2158877, 2158877, 2158877, 2687261, 2158877, 2715933, 2158877, 2158730, 2158730, 2973834, 2158730, 2982026, 2158730, 2158730, 3002506, 2158730, 3047562, 3063946, 3076234, 2158730, 2158730, 2158730, 2158730, 2207744, 2506752, 2207744, 2207744, 2207744, 2207744, 2207744, 2158877, 2507037, 0, 0, 2158877, 2158730, 2158730, 2158730, 3203210, 2207744, 2207744, 2207744, 2207744, 2207744, 2424832, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2564096, 2207744, 2207744, 2207744, 2707741, 2732317, 2158877, 2158877, 2158877, 2822429, 2826525, 2158877, 2896157, 2158877, 2158877, 2924829, 2158877, 2158877, 2973981, 2158877, 18, 0, 0, 0, 0, 0, 0, 0, 2211840, 0, 0, 642, 0, 2158592, 0, 45, 1529, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1755, 45, 67, 67, 2982173, 2158877, 2158877, 3002653, 2158877, 3047709, 3064093, 3076381, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 3203357, 2523274, 2527370, 2158730, 2158730, 2576522, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2908298, 2494749, 2158877, 2158877, 2158877, 2523421, 2527517, 2158877, 2158877, 2576669, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 0, 40976, 0, 18, 18, 4321280, 2224253, 2232448, 4329472, 2232448, 2158730, 2498698, 2158730, 2158730, 2158730, 2158730, 2568330, 2158730, 2592906, 2625674, 2158730, 2158730, 2674826, 2736266, 2158730, 2158730, 2158730, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2158730, 2912394, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 3109002, 2158730, 2158730, 3133578, 3145866, 3154058, 2375680, 2207744, 3108864, 2207744, 2207744, 3133440, 3145728, 3153920, 2375965, 2380061, 2158877, 2158877, 2421021, 2158877, 2449693, 2158877, 2158877, 2158877, 3117341, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 3104906, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158877, 2498845, 2158877, 2158877, 0, 2158877, 2158877, 2568477, 2158877, 2593053, 2625821, 2158877, 2158877, 2674973, 0, 0, 0, 0, 97, 97, 1480, 97, 97, 97, 97, 97, 1485, 97, 97, 97, 0, 97, 97, 1729, 97, 1731, 97, 97, 97, 97, 97, 97, 97, 311, 97, 97, 97, 97, 97, 97, 97, 97, 1520, 97, 97, 1523, 97, 97, 1526, 97, 2736413, 2158877, 2158877, 0, 2158877, 2912541, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 3109149, 2158877, 2158877, 3014941, 2158877, 2158877, 3051805, 2158877, 2158877, 3100957, 2158877, 2158877, 3121437, 2158877, 2158877, 2158877, 3150109, 3133725, 3146013, 3154205, 2158730, 2408586, 2416778, 2158730, 2465930, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 3018890, 2158730, 3043466, 2158730, 2158730, 2158730, 2158730, 3080330, 2633866, 2658442, 2740362, 2744458, 2834570, 2949258, 2158730, 2986122, 2158730, 2998410, 2158730, 2158730, 2158730, 3129482, 2207744, 2408448, 2949120, 2207744, 2985984, 2207744, 2998272, 2207744, 2207744, 2207744, 3129344, 2158877, 2408733, 2416925, 2158877, 2466077, 2158877, 2158877, 3170589, 3174685, 2158877, 0, 0, 0, 2158730, 2158730, 2158730, 2158730, 2158730, 2424970, 2158730, 2158730, 2158730, 2158730, 2707594, 2732170, 2158730, 2158730, 2158730, 2822282, 2826378, 2158730, 2896010, 2158730, 2158730, 2924682, 2949405, 2158877, 2986269, 2158877, 2998557, 2158877, 2158877, 2158877, 3129629, 2158730, 2158730, 2478218, 2158730, 2158730, 2158730, 2535562, 2543754, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 3117194, 2207744, 2207744, 2478080, 2207744, 2207744, 2207744, 2207744, 3014656, 2207744, 2207744, 3051520, 2207744, 2207744, 3100672, 2207744, 2207744, 3121152, 2207744, 2207744, 2207744, 2207744, 2207744, 2584576, 2207744, 2609152, 2207744, 2207744, 2629632, 2207744, 2207744, 2207744, 2686976, 2207744, 2207744, 2535424, 2543616, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 3117056, 2158877, 2158877, 2478365, 0, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158730, 2158730, 2482314, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2207744, 2207744, 2207744, 2387968, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 0, 823, 0, 825, 2158730, 2158730, 2158730, 2990218, 2158730, 2158730, 2207744, 2207744, 2482176, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 0, 0, 0, 0, 0, 0, 2162688, 135, 0, 2207744, 2207744, 2990080, 2207744, 2207744, 2158877, 2158877, 2482461, 2158877, 2158877, 0, 0, 0, 2158877, 2158877, 2158877, 2158877, 2158877, 2158730, 2429066, 2158730, 2515082, 2158730, 2588810, 2158730, 2838666, 2158730, 2158730, 2158730, 3010698, 2207744, 2428928, 2207744, 2514944, 2207744, 2588672, 2207744, 2838528, 2207744, 2207744, 2207744, 3010560, 2158877, 2429213, 2158877, 2515229, 0, 0, 2158877, 2588957, 2158877, 0, 2838813, 2158877, 2158877, 2158877, 3010845, 2158730, 2506890, 2158730, 2158730, 2158730, 2748554, 2756746, 2777226, 2801802, 2158730, 2158730, 2158730, 2863242, 2891914, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2564234, 2158730, 2158730, 2158730, 2158730, 2158730, 2597002, 2158730, 2158730, 2158730, 3006464, 2384157, 0, 0, 2158877, 2158877, 2158877, 2158877, 3006749, 2158730, 2637962, 2953354, 2158730, 2207744, 2637824, 2953216, 2207744, 0, 0, 2158877, 2638109, 2953501, 2158877, 2539658, 2158730, 2539520, 2207744, 0, 0, 2539805, 2158877, 2158730, 2158730, 2158730, 2977930, 2158730, 2158730, 2158730, 2158730, 3039370, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 3158154, 2207744, 0, 2158877, 2158730, 2207744, 0, 2158877, 2158730, 2207744, 0, 2158877, 2965642, 2965504, 2965789, 0, 0, 0, 0, 1315, 0, 0, 0, 0, 97, 97, 97, 97, 97, 97, 97, 1484, 97, 97, 97, 97, 2158592, 18, 0, 122880, 0, 0, 0, 77824, 0, 2211840, 0, 0, 0, 0, 2158592, 0, 356, 0, 0, 0, 0, 0, 0, 28809, 0, 139, 45, 45, 45, 45, 45, 45, 1751, 45, 45, 45, 45, 45, 45, 45, 67, 67, 1427, 67, 67, 67, 67, 67, 1432, 67, 67, 67, 3104768, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 122880, 0, 0, 0, 0, 1315, 0, 0, 0, 0, 97, 97, 97, 97, 97, 97, 1322, 550, 0, 286, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 2424832, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 0, 40976, 0, 18, 18, 24, 24, 4329472, 27, 27, 2207744, 2207744, 2977792, 2207744, 2207744, 2207744, 2207744, 3039232, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 3158016, 542, 0, 0, 0, 542, 0, 544, 0, 0, 0, 544, 0, 550, 0, 0, 0, 0, 0, 97, 97, 1610, 97, 97, 97, 97, 97, 97, 97, 97, 898, 97, 97, 97, 97, 97, 97, 97, 0, 94242, 0, 0, 0, 2211840, 0, 0, 0, 0, 0, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 2424832, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 237568, 102439, 106538, 98347, 0, 0, 20480, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 192512, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 94, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 96, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 12378, 40976, 18, 18, 36884, 0, 45078, 0, 24, 24, 24, 126, 126, 126, 126, 90143, 0, 0, 2170880, 0, 0, 0, 0, 2158592, 2158592, 2158592, 2387968, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 20480, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 241664, 102439, 106538, 98347, 0, 0, 20568, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 200797, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 20480, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 0, 0, 44, 0, 0, 20575, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 41, 41, 41, 0, 0, 1126400, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 0, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 89, 40976, 18, 18, 36884, 0, 45078, 0, 24, 24, 24, 27, 131201, 27, 27, 90143, 0, 0, 2170880, 0, 0, 550, 0, 2158592, 2158592, 2158592, 2387968, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2441216, 2445312, 2158592, 2158592, 2158592, 2158592, 2158592, 0, 94242, 0, 0, 208896, 2211840, 102439, 0, 0, 106538, 98347, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 3186688, 2158592, 0, 0, 0, 0, 0, 0, 0, 0, 2367488, 32768, 0, 0, 0, 0, 0, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2433024, 2158592, 2453504, 2461696, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2510848, 2158592, 2158592, 2158592, 2158592, 40976, 18, 36884, 245783, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 20480, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 221184, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 180224, 40976, 18, 18, 36884, 155648, 45078, 0, 24, 24, 217088, 27, 27, 27, 217088, 90143, 0, 0, 2170880, 0, 0, 828, 0, 2158592, 2158592, 2158592, 2387968, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2207744, 2207744, 2207744, 2387968, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 0, 0, 0, 0, 0, 0, 2162688, 233472, 0, 0, 94242, 0, 0, 0, 38, 102439, 0, 0, 106538, 98347, 28809, 45, 45, 45, 45, 45, 718, 45, 45, 45, 45, 45, 45, 45, 45, 45, 727, 131427, 0, 0, 0, 0, 362, 0, 365, 28809, 367, 139, 45, 45, 45, 45, 45, 45, 1808, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 97, 97, 0, 0, 97, 67, 24850, 24850, 12564, 12564, 0, 57889, 0, 0, 0, 53531, 53531, 367, 286, 97, 97, 0, 0, 97, 97, 97, 97, 97, 97, 1787, 0, 97, 97, 0, 97, 97, 97, 45, 45, 45, 45, 2029, 45, 67, 67, 67, 67, 2033, 57889, 0, 0, 54074, 54074, 550, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 45, 1798, 45, 45, 1800, 45, 45, 0, 1472, 0, 0, 0, 0, 0, 1474, 0, 0, 0, 0, 0, 1476, 0, 0, 0, 0, 1315, 0, 0, 0, 0, 97, 97, 97, 97, 1320, 97, 97, 0, 0, 97, 97, 97, 97, 1786, 97, 0, 0, 97, 97, 0, 1790, 1527, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 663, 67, 24850, 24850, 12564, 12564, 0, 57889, 281, 0, 0, 53531, 53531, 367, 286, 97, 97, 0, 0, 97, 97, 97, 1785, 97, 97, 0, 0, 97, 97, 0, 97, 97, 1979, 97, 97, 45, 45, 1983, 45, 1984, 45, 45, 45, 45, 45, 652, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 690, 45, 45, 694, 45, 45, 40976, 19, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 262144, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 46, 67, 98, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 45, 67, 97, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 258048, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 1122423, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 1114152, 1114152, 1114152, 0, 0, 1114112, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 37, 102439, 106538, 98347, 0, 0, 204800, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 57436, 40976, 18, 36884, 45078, 24, 27, 33, 33, 0, 33, 33, 33, 0, 0, 0, 40976, 18, 18, 36884, 0, 45078, 0, 124, 124, 124, 127, 127, 127, 127, 90143, 0, 0, 2170880, 0, 0, 550, 0, 2158877, 2158877, 2158877, 2388253, 2158877, 2158877, 2158877, 2158877, 2158877, 2781469, 2793757, 2158877, 2818333, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2867485, 2158877, 2904349, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 3096861, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2441501, 2445597, 2158877, 2158877, 2158877, 2158877, 2158877, 40976, 122, 123, 36884, 0, 45078, 0, 24, 24, 24, 27, 27, 27, 27, 90143, 0, 921, 29315, 0, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 936, 2158592, 4243810, 0, 0, 0, 0, 0, 0, 0, 2211840, 0, 0, 0, 0, 2158592, 0, 921, 29315, 0, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 935, 45, 45, 45, 715, 45, 45, 45, 45, 45, 45, 45, 723, 45, 45, 45, 45, 45, 1182, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 430, 45, 45, 45, 45, 45, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 47, 68, 99, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 48, 69, 100, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 49, 70, 101, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 50, 71, 102, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 51, 72, 103, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 52, 73, 104, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 53, 74, 105, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 54, 75, 106, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 55, 76, 107, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 56, 77, 108, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 57, 78, 109, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 58, 79, 110, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 59, 80, 111, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 60, 81, 112, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 61, 82, 113, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 62, 83, 114, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 63, 84, 115, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 64, 85, 116, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 65, 86, 117, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 66, 87, 118, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 118820, 102439, 106538, 98347, 118820, 118820, 118820, 40976, 18, 18, 0, 0, 45078, 0, 24, 24, 24, 27, 27, 27, 27, 90143, 0, 0, 1314, 0, 0, 0, 0, 0, 0, 97, 97, 97, 97, 97, 1321, 97, 18, 131427, 0, 0, 0, 0, 0, 0, 362, 0, 0, 365, 0, 367, 0, 0, 1315, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1360, 97, 97, 131, 94242, 0, 0, 0, 38, 102439, 0, 0, 106538, 98347, 28809, 45, 45, 45, 145, 149, 45, 45, 45, 45, 45, 174, 45, 179, 45, 185, 45, 188, 45, 45, 202, 67, 255, 67, 67, 269, 67, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 97, 97, 97, 292, 296, 97, 97, 97, 97, 97, 321, 97, 326, 97, 332, 97, 18, 131427, 0, 0, 0, 0, 0, 0, 362, 0, 0, 365, 29315, 367, 646, 335, 97, 97, 349, 97, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 437, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 523, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 511, 67, 67, 67, 97, 97, 97, 620, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1501, 1502, 97, 793, 67, 67, 796, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 808, 67, 0, 0, 97, 97, 97, 97, 45, 45, 67, 67, 0, 0, 97, 97, 2052, 67, 67, 67, 67, 813, 67, 67, 67, 67, 67, 67, 67, 25398, 542, 13112, 544, 57889, 0, 0, 54074, 54074, 550, 830, 97, 97, 97, 97, 97, 97, 97, 97, 97, 315, 97, 97, 97, 97, 97, 97, 841, 97, 97, 97, 97, 97, 97, 97, 97, 97, 854, 97, 97, 97, 97, 97, 97, 589, 97, 97, 97, 97, 97, 97, 97, 97, 97, 867, 97, 97, 97, 97, 97, 97, 97, 891, 97, 97, 894, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 906, 45, 937, 45, 45, 940, 45, 45, 45, 45, 45, 45, 948, 45, 45, 45, 45, 45, 734, 735, 67, 737, 67, 738, 67, 740, 67, 67, 67, 45, 967, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 435, 45, 45, 45, 980, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 415, 45, 45, 67, 67, 1024, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 97, 97, 97, 67, 67, 67, 67, 67, 25398, 1081, 13112, 1085, 54074, 1089, 0, 0, 0, 0, 0, 0, 363, 0, 28809, 0, 139, 45, 45, 45, 45, 45, 45, 1674, 45, 45, 45, 45, 45, 45, 45, 45, 67, 1913, 67, 1914, 67, 67, 67, 1918, 67, 67, 97, 97, 97, 97, 1118, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 630, 97, 97, 97, 97, 97, 1169, 97, 97, 97, 97, 97, 0, 921, 0, 1175, 0, 0, 0, 0, 45, 45, 45, 45, 45, 45, 1534, 45, 45, 45, 45, 45, 1538, 45, 45, 45, 45, 1233, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 742, 67, 45, 45, 1191, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 454, 67, 67, 67, 67, 1243, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1251, 67, 0, 0, 97, 97, 97, 97, 45, 45, 67, 67, 2050, 0, 97, 97, 45, 45, 45, 732, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 97, 97, 67, 67, 67, 1284, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 772, 67, 67, 67, 1293, 67, 67, 67, 67, 67, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 368, 2158592, 2158592, 2158592, 2404352, 2412544, 1323, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1331, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1737, 97, 1364, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1373, 97, 18, 131427, 0, 0, 0, 0, 0, 0, 362, 0, 0, 365, 29315, 367, 647, 45, 45, 1387, 45, 45, 1391, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 410, 45, 45, 45, 45, 45, 1400, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1407, 45, 45, 45, 45, 45, 941, 45, 943, 45, 45, 45, 45, 45, 45, 951, 45, 67, 1438, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1447, 67, 67, 67, 67, 67, 67, 782, 67, 67, 67, 67, 67, 67, 67, 67, 67, 756, 67, 67, 67, 67, 67, 67, 97, 1491, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1500, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1736, 97, 45, 45, 1541, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 677, 45, 45, 67, 1581, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 791, 792, 67, 67, 67, 67, 1598, 67, 1600, 67, 67, 67, 67, 67, 67, 67, 67, 1472, 97, 97, 97, 1727, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1513, 97, 97, 67, 67, 97, 1879, 97, 1881, 97, 0, 1884, 0, 97, 97, 97, 97, 0, 0, 97, 97, 97, 97, 97, 0, 0, 0, 1842, 97, 97, 67, 67, 67, 67, 67, 97, 97, 97, 97, 1928, 0, 0, 0, 97, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 1903, 45, 45, 45, 67, 67, 67, 67, 97, 97, 97, 97, 1971, 0, 0, 97, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 0, 0, 45, 45, 45, 1381, 45, 45, 45, 45, 1976, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1747, 809, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 25398, 542, 13112, 544, 97, 907, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 638, 0, 0, 0, 0, 1478, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1150, 97, 97, 97, 97, 67, 67, 67, 67, 1244, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 477, 67, 67, 67, 67, 67, 67, 1294, 67, 67, 67, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1324, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 0, 0, 1374, 97, 97, 97, 97, 0, 1175, 0, 45, 45, 45, 45, 45, 45, 45, 45, 945, 45, 45, 45, 45, 45, 45, 45, 45, 1908, 45, 45, 1910, 45, 67, 67, 67, 67, 67, 67, 67, 67, 1919, 67, 0, 0, 97, 97, 97, 97, 45, 2048, 67, 2049, 0, 0, 97, 2051, 45, 45, 45, 939, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 397, 45, 45, 45, 1921, 67, 67, 1923, 67, 97, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 97, 97, 45, 45, 45, 45, 1947, 45, 1935, 0, 0, 0, 97, 1939, 97, 97, 1941, 97, 45, 45, 45, 45, 45, 45, 382, 389, 45, 45, 45, 45, 45, 45, 45, 45, 1810, 45, 45, 1812, 67, 67, 67, 67, 67, 256, 67, 67, 67, 67, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 336, 97, 97, 97, 97, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 131427, 0, 0, 0, 0, 362, 0, 365, 28809, 367, 139, 45, 45, 371, 373, 45, 45, 45, 955, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 413, 45, 45, 45, 457, 459, 67, 67, 67, 67, 67, 67, 67, 67, 473, 67, 478, 67, 67, 482, 67, 67, 485, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 97, 1828, 97, 554, 556, 97, 97, 97, 97, 97, 97, 97, 97, 570, 97, 575, 97, 97, 579, 97, 97, 582, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 330, 97, 97, 67, 746, 67, 67, 67, 67, 67, 67, 67, 67, 67, 758, 67, 67, 67, 67, 67, 67, 67, 1575, 67, 67, 67, 67, 67, 67, 67, 67, 493, 67, 67, 67, 67, 67, 67, 67, 97, 97, 844, 97, 97, 97, 97, 97, 97, 97, 97, 97, 856, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 1735, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 97, 1642, 97, 1644, 97, 97, 890, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 67, 67, 67, 67, 1065, 1066, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 532, 67, 67, 67, 67, 67, 67, 67, 1451, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 496, 67, 67, 97, 97, 1505, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 593, 97, 97, 0, 1474, 0, 1476, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1617, 97, 97, 1635, 0, 1637, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 885, 97, 97, 97, 97, 67, 67, 1704, 67, 67, 67, 67, 97, 97, 97, 97, 97, 97, 97, 97, 97, 565, 572, 97, 97, 97, 97, 97, 97, 97, 97, 1832, 0, 97, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 97, 97, 45, 45, 45, 1946, 45, 45, 67, 67, 67, 67, 67, 97, 1926, 97, 1927, 97, 0, 0, 0, 97, 97, 1934, 2043, 0, 0, 97, 97, 97, 2047, 45, 45, 67, 67, 0, 1832, 97, 97, 45, 45, 45, 981, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1227, 45, 45, 45, 131427, 0, 0, 0, 0, 362, 0, 365, 28809, 367, 139, 45, 45, 372, 45, 45, 45, 45, 1661, 1662, 45, 45, 45, 45, 45, 1666, 45, 45, 45, 45, 45, 1673, 45, 1675, 45, 45, 45, 45, 45, 45, 45, 67, 1426, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1275, 67, 67, 67, 67, 67, 45, 418, 45, 45, 420, 45, 45, 423, 45, 45, 45, 45, 45, 45, 45, 45, 959, 45, 45, 962, 45, 45, 45, 45, 458, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 483, 67, 67, 67, 67, 504, 67, 67, 506, 67, 67, 509, 67, 67, 67, 67, 67, 67, 67, 528, 67, 67, 67, 67, 67, 67, 67, 67, 1287, 67, 67, 67, 67, 67, 67, 67, 555, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 580, 97, 97, 97, 97, 601, 97, 97, 603, 97, 97, 606, 97, 97, 97, 97, 97, 97, 848, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1498, 97, 97, 97, 97, 97, 97, 45, 45, 714, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 989, 990, 45, 67, 67, 67, 67, 67, 1011, 67, 67, 67, 67, 1015, 67, 67, 67, 67, 67, 67, 67, 753, 67, 67, 67, 67, 67, 67, 67, 67, 467, 67, 67, 67, 67, 67, 67, 67, 45, 45, 1179, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1003, 1004, 67, 1217, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 728, 67, 1461, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1034, 67, 97, 1516, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 871, 97, 67, 67, 67, 1705, 67, 67, 67, 97, 97, 97, 97, 97, 97, 97, 97, 97, 567, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1715, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 0, 0, 45, 45, 1380, 45, 45, 45, 45, 45, 67, 67, 97, 97, 97, 97, 97, 0, 0, 0, 97, 1887, 97, 97, 0, 0, 97, 97, 97, 0, 97, 97, 97, 97, 97, 2006, 45, 45, 1907, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1920, 67, 97, 0, 2035, 97, 97, 97, 97, 97, 45, 45, 45, 45, 67, 67, 67, 1428, 67, 67, 67, 67, 67, 67, 1435, 67, 0, 94242, 0, 0, 0, 38, 102439, 0, 0, 106538, 98347, 28809, 45, 45, 45, 146, 45, 152, 45, 45, 165, 45, 175, 45, 180, 45, 45, 187, 190, 195, 45, 203, 254, 257, 262, 67, 270, 67, 67, 0, 24850, 12564, 0, 0, 0, 281, 28809, 53531, 97, 97, 97, 293, 97, 299, 97, 97, 312, 97, 322, 97, 327, 97, 97, 334, 337, 342, 97, 350, 97, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 67, 484, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 499, 97, 581, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 596, 648, 45, 650, 45, 651, 45, 653, 45, 45, 45, 657, 45, 45, 45, 45, 45, 45, 1954, 67, 67, 67, 1958, 67, 67, 67, 67, 67, 67, 67, 768, 67, 67, 67, 67, 67, 67, 67, 67, 769, 67, 67, 67, 67, 67, 67, 67, 680, 45, 45, 45, 45, 45, 45, 45, 45, 688, 689, 691, 45, 45, 45, 45, 45, 983, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 947, 45, 45, 45, 45, 952, 45, 45, 698, 699, 45, 45, 702, 703, 45, 45, 45, 45, 45, 45, 45, 711, 744, 67, 67, 67, 67, 67, 67, 67, 67, 67, 757, 67, 67, 67, 67, 761, 67, 67, 67, 67, 765, 67, 767, 67, 67, 67, 67, 67, 67, 67, 67, 775, 776, 778, 67, 67, 67, 67, 67, 67, 785, 786, 67, 67, 789, 790, 67, 67, 67, 67, 67, 67, 1442, 67, 67, 67, 67, 67, 67, 67, 67, 67, 97, 97, 97, 1775, 97, 97, 97, 67, 67, 67, 67, 67, 798, 67, 67, 67, 802, 67, 67, 67, 67, 67, 67, 67, 67, 1465, 67, 67, 1468, 67, 67, 1471, 67, 67, 810, 67, 67, 67, 67, 67, 67, 67, 67, 67, 821, 25398, 542, 13112, 544, 57889, 0, 0, 54074, 54074, 550, 0, 833, 97, 835, 97, 836, 97, 838, 97, 97, 0, 0, 97, 97, 97, 2002, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 1740, 45, 45, 45, 1744, 45, 45, 45, 97, 842, 97, 97, 97, 97, 97, 97, 97, 97, 97, 855, 97, 97, 97, 97, 0, 1717, 1718, 97, 97, 97, 97, 97, 1722, 97, 0, 0, 859, 97, 97, 97, 97, 863, 97, 865, 97, 97, 97, 97, 97, 97, 97, 97, 604, 97, 97, 97, 97, 97, 97, 97, 873, 874, 876, 97, 97, 97, 97, 97, 97, 883, 884, 97, 97, 887, 888, 97, 18, 131427, 0, 0, 0, 0, 0, 0, 362, 225280, 0, 365, 0, 367, 0, 45, 45, 45, 1531, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1199, 45, 45, 45, 45, 45, 97, 97, 908, 97, 97, 97, 97, 97, 97, 97, 97, 97, 919, 638, 0, 0, 0, 0, 2158877, 2158877, 2158877, 2158877, 2158877, 2425117, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2597149, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2642205, 2158877, 2158877, 2158877, 2158877, 2158877, 3158301, 0, 2375818, 2379914, 2158730, 2158730, 2420874, 2158730, 2449546, 2158730, 2158730, 953, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 965, 978, 45, 45, 45, 45, 45, 45, 985, 45, 45, 45, 45, 45, 45, 45, 45, 971, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 1027, 67, 1029, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1455, 67, 67, 67, 67, 67, 67, 67, 1077, 1078, 67, 67, 25398, 0, 13112, 0, 54074, 0, 0, 0, 0, 0, 0, 0, 0, 366, 0, 139, 2158730, 2158730, 2158730, 2404490, 2412682, 1113, 97, 97, 97, 97, 97, 97, 1121, 97, 1123, 97, 97, 97, 97, 97, 97, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1540, 1155, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 615, 1168, 97, 97, 1171, 1172, 97, 97, 0, 921, 0, 1175, 0, 0, 0, 0, 45, 45, 45, 45, 45, 1533, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1663, 45, 45, 45, 45, 45, 45, 45, 45, 45, 183, 45, 45, 45, 45, 201, 45, 45, 45, 1219, 45, 45, 45, 45, 45, 45, 45, 1226, 45, 45, 45, 45, 45, 168, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 427, 45, 45, 45, 45, 45, 45, 45, 1231, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1242, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1046, 67, 67, 1254, 67, 1256, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 806, 807, 67, 67, 97, 1336, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1111, 97, 97, 97, 97, 97, 1351, 97, 97, 97, 1354, 97, 97, 97, 1359, 97, 97, 97, 0, 97, 97, 97, 97, 1640, 97, 97, 97, 97, 97, 97, 97, 897, 97, 97, 97, 902, 97, 97, 97, 97, 97, 97, 97, 97, 1366, 97, 97, 97, 97, 97, 97, 97, 1371, 97, 97, 97, 0, 97, 97, 97, 1730, 97, 97, 97, 97, 97, 97, 97, 97, 915, 97, 97, 97, 97, 0, 360, 0, 67, 67, 67, 1440, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1017, 67, 1019, 67, 67, 67, 67, 67, 1453, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1459, 97, 97, 97, 1493, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1525, 97, 97, 97, 97, 97, 97, 1507, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1514, 67, 67, 67, 67, 1584, 67, 67, 67, 67, 67, 1590, 67, 67, 67, 67, 67, 67, 67, 783, 67, 67, 67, 788, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1599, 1601, 67, 67, 67, 1604, 67, 1606, 1607, 67, 1472, 0, 1474, 0, 1476, 0, 97, 97, 97, 97, 97, 97, 1614, 97, 97, 97, 97, 45, 45, 1850, 45, 45, 45, 45, 1855, 45, 45, 45, 45, 45, 1222, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1229, 97, 1618, 97, 97, 97, 97, 97, 97, 97, 1625, 97, 97, 97, 97, 97, 0, 1175, 0, 45, 45, 45, 45, 45, 45, 45, 45, 447, 45, 45, 45, 45, 45, 67, 67, 1633, 97, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 1643, 1645, 97, 97, 0, 0, 97, 97, 1784, 97, 97, 97, 0, 0, 97, 97, 0, 97, 1894, 1895, 97, 1897, 97, 45, 45, 45, 45, 45, 45, 45, 45, 45, 656, 45, 45, 45, 45, 45, 45, 97, 1648, 97, 1650, 1651, 97, 0, 45, 45, 45, 1654, 45, 45, 45, 45, 45, 169, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 658, 45, 45, 45, 45, 664, 45, 45, 1659, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1187, 45, 45, 1669, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 1005, 67, 67, 1681, 67, 67, 67, 67, 67, 67, 67, 1686, 67, 67, 67, 67, 67, 67, 67, 784, 67, 67, 67, 67, 67, 67, 67, 67, 1055, 67, 67, 67, 67, 1060, 67, 67, 97, 97, 1713, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 0, 0, 1378, 45, 45, 45, 45, 45, 45, 45, 408, 45, 45, 45, 45, 45, 45, 45, 45, 1547, 45, 1549, 45, 45, 45, 45, 45, 97, 97, 1780, 0, 97, 97, 97, 97, 97, 97, 0, 0, 97, 97, 0, 97, 97, 97, 45, 45, 2027, 2028, 45, 45, 67, 67, 2031, 2032, 67, 45, 45, 1804, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 1917, 67, 67, 67, 67, 67, 67, 67, 1819, 67, 67, 67, 67, 67, 67, 67, 67, 97, 97, 97, 1708, 97, 97, 97, 97, 97, 45, 45, 1862, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 497, 67, 67, 67, 1877, 97, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 0, 0, 97, 97, 97, 97, 97, 1839, 0, 0, 97, 97, 97, 97, 1936, 0, 0, 97, 97, 97, 97, 97, 97, 1943, 1944, 1945, 45, 45, 45, 45, 670, 45, 45, 45, 45, 674, 45, 45, 45, 45, 678, 45, 1948, 45, 1950, 45, 45, 45, 45, 1955, 1956, 1957, 67, 67, 67, 1960, 67, 1962, 67, 67, 67, 67, 1967, 1968, 1969, 97, 0, 0, 0, 97, 97, 1974, 97, 0, 1936, 0, 97, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 45, 45, 1906, 0, 1977, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1746, 45, 45, 45, 45, 2011, 67, 67, 2013, 67, 67, 67, 2017, 97, 97, 0, 0, 2021, 97, 8192, 97, 97, 2025, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 1916, 67, 67, 67, 67, 0, 94242, 0, 0, 0, 38, 102439, 0, 0, 106538, 98347, 28809, 45, 45, 140, 45, 45, 45, 1180, 45, 45, 45, 45, 1184, 45, 45, 45, 45, 45, 45, 45, 387, 45, 392, 45, 45, 396, 45, 45, 399, 45, 45, 67, 207, 67, 67, 67, 67, 67, 67, 236, 67, 67, 67, 67, 67, 67, 67, 800, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1603, 67, 67, 67, 67, 67, 0, 97, 97, 287, 97, 97, 97, 97, 97, 97, 316, 97, 97, 97, 97, 97, 97, 0, 45, 45, 45, 45, 45, 45, 45, 1656, 1657, 45, 376, 45, 45, 45, 45, 45, 388, 45, 45, 45, 45, 45, 45, 45, 45, 1406, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 462, 67, 67, 67, 67, 67, 474, 67, 67, 67, 67, 67, 67, 67, 817, 67, 67, 67, 67, 25398, 542, 13112, 544, 97, 97, 97, 97, 559, 97, 97, 97, 97, 97, 571, 97, 97, 97, 97, 97, 97, 896, 97, 97, 97, 900, 97, 97, 97, 97, 97, 97, 912, 914, 97, 97, 97, 97, 97, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 391, 45, 45, 45, 45, 45, 45, 45, 45, 713, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 662, 45, 1140, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 636, 67, 67, 1283, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 513, 67, 67, 1363, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 889, 97, 97, 97, 1714, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 0, 926, 45, 45, 45, 45, 45, 45, 45, 45, 672, 45, 45, 45, 45, 45, 45, 45, 45, 686, 45, 45, 45, 45, 45, 45, 45, 45, 944, 45, 45, 45, 45, 45, 45, 45, 45, 1676, 45, 45, 45, 45, 45, 45, 67, 97, 97, 97, 1833, 0, 97, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 97, 97, 45, 45, 45, 45, 1902, 45, 45, 45, 45, 45, 957, 45, 45, 45, 45, 961, 45, 963, 45, 45, 45, 67, 97, 2034, 0, 97, 97, 97, 97, 97, 2040, 45, 45, 45, 2042, 67, 67, 67, 67, 67, 67, 1574, 67, 67, 67, 67, 67, 1578, 67, 67, 67, 67, 67, 67, 799, 67, 67, 67, 804, 67, 67, 67, 67, 67, 67, 67, 1298, 0, 0, 0, 1304, 0, 0, 0, 1310, 132, 94242, 0, 0, 0, 38, 102439, 0, 0, 106538, 98347, 28809, 45, 45, 45, 45, 45, 1414, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 428, 45, 45, 45, 45, 45, 57889, 0, 0, 54074, 54074, 550, 831, 97, 97, 97, 97, 97, 97, 97, 97, 97, 568, 97, 97, 97, 97, 578, 97, 45, 45, 968, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1228, 45, 45, 67, 67, 67, 67, 67, 25398, 1082, 13112, 1086, 54074, 1090, 0, 0, 0, 0, 0, 0, 364, 0, 0, 0, 139, 2158592, 2158592, 2158592, 2404352, 2412544, 67, 67, 67, 67, 1464, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 510, 67, 67, 67, 67, 97, 97, 97, 97, 1519, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 918, 97, 0, 0, 0, 0, 1528, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 976, 45, 1554, 45, 45, 45, 45, 45, 45, 45, 45, 1562, 45, 45, 1565, 45, 45, 45, 45, 683, 45, 45, 45, 687, 45, 45, 692, 45, 45, 45, 45, 45, 1953, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1014, 67, 67, 67, 67, 67, 67, 1568, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 0, 67, 67, 67, 67, 67, 1585, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1594, 97, 97, 1649, 97, 97, 97, 0, 45, 45, 1653, 45, 45, 45, 45, 45, 45, 383, 45, 45, 45, 45, 45, 45, 45, 45, 45, 986, 45, 45, 45, 45, 45, 45, 45, 45, 1670, 45, 1672, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 736, 67, 67, 67, 67, 67, 741, 67, 67, 67, 1680, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1074, 67, 67, 67, 1692, 67, 67, 67, 67, 67, 67, 67, 1697, 67, 1699, 67, 67, 67, 67, 67, 67, 1012, 67, 67, 67, 67, 67, 67, 67, 67, 67, 468, 475, 67, 67, 67, 67, 67, 67, 1769, 67, 67, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 97, 97, 624, 97, 97, 97, 97, 97, 97, 634, 97, 97, 1792, 97, 97, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 45, 958, 45, 45, 45, 45, 45, 45, 964, 45, 150, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 977, 204, 45, 67, 67, 67, 217, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 787, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 271, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 97, 97, 97, 97, 351, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 45, 45, 938, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1398, 45, 45, 45, 153, 45, 161, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 660, 661, 45, 45, 205, 45, 67, 67, 67, 67, 220, 67, 228, 67, 67, 67, 67, 67, 67, 67, 0, 0, 0, 0, 0, 280, 94, 0, 0, 67, 67, 67, 67, 67, 272, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 97, 97, 97, 97, 352, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 45, 439, 45, 45, 45, 45, 45, 445, 45, 45, 45, 452, 45, 45, 67, 67, 212, 216, 67, 67, 67, 67, 67, 241, 67, 246, 67, 252, 67, 67, 486, 67, 67, 67, 67, 67, 67, 67, 494, 67, 67, 67, 67, 67, 67, 67, 1245, 67, 67, 67, 67, 67, 67, 67, 67, 1013, 67, 67, 1016, 67, 67, 67, 67, 67, 521, 67, 67, 525, 67, 67, 67, 67, 67, 531, 67, 67, 67, 538, 67, 0, 0, 2046, 97, 97, 97, 45, 45, 67, 67, 0, 0, 97, 97, 45, 45, 45, 1192, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1418, 45, 45, 1421, 97, 97, 583, 97, 97, 97, 97, 97, 97, 97, 591, 97, 97, 97, 97, 97, 97, 913, 97, 97, 97, 97, 97, 97, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 1384, 97, 618, 97, 97, 622, 97, 97, 97, 97, 97, 628, 97, 97, 97, 635, 97, 18, 131427, 0, 0, 0, 639, 0, 132, 362, 0, 0, 365, 29315, 367, 0, 921, 29315, 0, 0, 0, 0, 45, 45, 45, 45, 932, 45, 45, 45, 45, 45, 1544, 45, 45, 45, 45, 45, 1550, 45, 45, 45, 45, 45, 1194, 45, 1196, 45, 45, 45, 45, 45, 45, 45, 45, 999, 45, 45, 45, 45, 45, 67, 67, 45, 45, 667, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1408, 45, 45, 45, 696, 45, 45, 45, 701, 45, 45, 45, 45, 45, 45, 45, 45, 710, 45, 45, 45, 1220, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 194, 45, 45, 45, 729, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 797, 67, 67, 67, 67, 67, 67, 805, 67, 67, 67, 67, 67, 67, 67, 1587, 67, 1589, 67, 67, 67, 67, 67, 67, 67, 67, 1763, 67, 67, 67, 67, 67, 67, 67, 0, 0, 0, 0, 0, 0, 2162968, 0, 0, 67, 67, 67, 67, 67, 814, 816, 67, 67, 67, 67, 67, 25398, 542, 13112, 544, 67, 67, 1008, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1020, 67, 0, 97, 45, 67, 0, 97, 45, 67, 0, 97, 45, 67, 97, 0, 0, 97, 97, 97, 97, 97, 45, 45, 45, 45, 67, 67, 67, 67, 1429, 67, 1430, 67, 67, 67, 67, 67, 1062, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 518, 1076, 67, 67, 67, 67, 25398, 0, 13112, 0, 54074, 0, 0, 0, 0, 0, 0, 0, 0, 28809, 0, 139, 45, 45, 45, 45, 45, 97, 97, 97, 97, 1102, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1124, 97, 1126, 97, 97, 1114, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1112, 97, 97, 1156, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 594, 97, 97, 97, 97, 1170, 97, 97, 97, 97, 0, 921, 0, 0, 0, 0, 0, 0, 45, 45, 45, 45, 1532, 45, 45, 45, 45, 1536, 45, 45, 45, 45, 45, 172, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 706, 45, 45, 709, 45, 45, 1177, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1202, 45, 1204, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1215, 45, 45, 45, 1232, 45, 45, 45, 45, 45, 45, 45, 67, 1237, 67, 67, 67, 67, 67, 67, 1053, 1054, 67, 67, 67, 67, 67, 67, 1061, 67, 67, 1282, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1289, 67, 67, 67, 1292, 97, 97, 97, 97, 1339, 97, 97, 97, 97, 97, 97, 1344, 97, 97, 97, 97, 45, 1849, 45, 1851, 45, 45, 45, 45, 45, 45, 45, 45, 721, 45, 45, 45, 45, 45, 726, 45, 1385, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1188, 45, 45, 1401, 1402, 45, 45, 45, 45, 1405, 45, 45, 45, 45, 45, 45, 45, 45, 1752, 45, 45, 45, 45, 45, 67, 67, 1410, 45, 45, 45, 1413, 45, 1415, 45, 45, 45, 45, 45, 45, 1419, 45, 45, 45, 45, 1806, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 97, 97, 2019, 0, 97, 67, 67, 67, 1452, 67, 67, 67, 67, 67, 67, 67, 67, 1457, 67, 67, 67, 67, 67, 67, 1259, 67, 67, 67, 67, 67, 67, 1264, 67, 67, 1460, 67, 1462, 67, 67, 67, 67, 67, 67, 1466, 67, 67, 67, 67, 67, 67, 67, 67, 1588, 67, 67, 67, 67, 67, 67, 67, 0, 1300, 0, 0, 0, 1306, 0, 0, 0, 97, 97, 97, 1506, 97, 97, 97, 97, 97, 97, 97, 97, 1512, 97, 97, 97, 0, 1728, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 901, 97, 97, 97, 97, 1515, 97, 1517, 97, 97, 97, 97, 97, 97, 1521, 97, 97, 97, 97, 97, 97, 0, 45, 1652, 45, 45, 45, 1655, 45, 45, 45, 45, 45, 1542, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1552, 1553, 45, 45, 45, 1556, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 693, 45, 45, 45, 67, 67, 67, 67, 1572, 67, 67, 67, 67, 1576, 67, 67, 67, 67, 67, 67, 67, 67, 1602, 67, 67, 1605, 67, 67, 67, 0, 67, 1582, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1580, 67, 67, 1596, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 0, 542, 0, 544, 67, 67, 67, 67, 1759, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 533, 67, 67, 67, 67, 67, 67, 67, 1770, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 97, 1777, 97, 97, 97, 1793, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 45, 998, 45, 45, 1001, 1002, 45, 45, 67, 67, 45, 1861, 45, 67, 67, 67, 67, 67, 67, 67, 67, 1871, 67, 1873, 1874, 67, 0, 97, 45, 67, 0, 97, 45, 67, 16384, 97, 45, 67, 97, 0, 0, 0, 1473, 0, 1082, 0, 0, 0, 1475, 0, 1086, 0, 0, 0, 1477, 1876, 67, 97, 97, 97, 97, 97, 1883, 0, 1885, 97, 97, 97, 1889, 0, 0, 0, 286, 0, 0, 0, 286, 0, 2367488, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 0, 40976, 0, 18, 18, 24, 24, 126, 126, 126, 2053, 0, 2055, 45, 67, 0, 97, 45, 67, 0, 97, 45, 67, 97, 0, 0, 97, 97, 97, 2039, 97, 45, 45, 45, 45, 67, 67, 67, 67, 67, 226, 67, 67, 67, 67, 67, 67, 67, 67, 1246, 67, 67, 1249, 1250, 67, 67, 67, 132, 94242, 0, 0, 0, 38, 102439, 0, 0, 106538, 98347, 28809, 45, 45, 141, 45, 45, 45, 1403, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1186, 45, 45, 1189, 45, 45, 155, 45, 45, 45, 45, 45, 45, 45, 45, 45, 191, 45, 45, 45, 45, 700, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1753, 45, 45, 45, 67, 67, 45, 45, 67, 208, 67, 67, 67, 222, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1764, 67, 67, 67, 67, 67, 67, 67, 258, 67, 67, 67, 67, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 97, 97, 288, 97, 97, 97, 302, 97, 97, 97, 97, 97, 97, 97, 97, 97, 627, 97, 97, 97, 97, 97, 97, 338, 97, 97, 97, 97, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 131427, 0, 0, 0, 0, 362, 0, 365, 28809, 367, 139, 45, 370, 45, 45, 45, 45, 716, 45, 45, 45, 45, 45, 722, 45, 45, 45, 45, 45, 45, 1912, 67, 67, 67, 67, 67, 67, 67, 67, 67, 819, 67, 67, 25398, 542, 13112, 544, 45, 403, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1409, 45, 67, 67, 67, 67, 489, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 771, 67, 67, 67, 67, 520, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 534, 67, 67, 67, 67, 67, 67, 1271, 67, 67, 67, 1274, 67, 67, 67, 1279, 67, 67, 24850, 24850, 12564, 12564, 0, 57889, 0, 0, 0, 53531, 53531, 367, 286, 97, 553, 97, 97, 97, 97, 586, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1138, 97, 97, 97, 97, 617, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 631, 97, 97, 97, 0, 1834, 97, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 97, 353, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 45, 45, 668, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 724, 45, 45, 45, 45, 45, 682, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 949, 45, 45, 45, 67, 67, 747, 748, 67, 67, 67, 67, 755, 67, 67, 67, 67, 67, 67, 67, 0, 0, 0, 1302, 0, 0, 0, 1308, 0, 67, 794, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1701, 67, 97, 97, 97, 845, 846, 97, 97, 97, 97, 853, 97, 97, 97, 97, 97, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 97, 97, 892, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 610, 97, 97, 45, 992, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 1239, 67, 67, 67, 1063, 67, 67, 67, 67, 67, 1068, 67, 67, 67, 67, 67, 67, 67, 0, 0, 1301, 0, 0, 0, 1307, 0, 0, 97, 1141, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1152, 97, 97, 0, 0, 97, 97, 2001, 0, 97, 2003, 97, 97, 97, 45, 45, 45, 1739, 45, 45, 45, 1742, 45, 45, 45, 45, 45, 97, 97, 97, 97, 1157, 97, 97, 97, 97, 97, 1162, 97, 97, 97, 97, 97, 97, 1145, 97, 97, 97, 97, 97, 1151, 97, 97, 97, 1253, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 539, 45, 1423, 45, 45, 67, 67, 67, 67, 67, 67, 67, 1431, 67, 67, 67, 67, 67, 67, 67, 1695, 67, 67, 67, 67, 67, 1700, 67, 1702, 67, 67, 1439, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 514, 67, 67, 97, 97, 1492, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 611, 97, 97, 1703, 67, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 97, 97, 97, 97, 852, 97, 97, 97, 97, 97, 97, 45, 1949, 45, 1951, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 1961, 67, 0, 97, 45, 67, 0, 97, 2060, 2061, 0, 2062, 45, 67, 97, 0, 0, 2036, 97, 97, 97, 97, 45, 45, 45, 45, 67, 67, 67, 67, 67, 223, 67, 67, 237, 67, 67, 67, 67, 67, 67, 67, 1272, 67, 67, 67, 67, 67, 67, 67, 67, 507, 67, 67, 67, 67, 67, 67, 67, 1963, 67, 67, 67, 97, 97, 97, 97, 0, 1972, 0, 97, 97, 97, 1975, 0, 921, 29315, 0, 0, 0, 0, 45, 45, 45, 931, 45, 45, 45, 45, 45, 407, 45, 45, 45, 45, 45, 45, 45, 45, 45, 417, 45, 45, 1989, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1996, 97, 18, 131427, 0, 0, 360, 0, 0, 0, 362, 0, 0, 365, 29315, 367, 0, 921, 29315, 0, 0, 0, 0, 45, 45, 930, 45, 45, 45, 45, 45, 45, 444, 45, 45, 45, 45, 45, 45, 45, 67, 67, 97, 97, 1998, 0, 97, 97, 97, 0, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 1985, 45, 1986, 45, 45, 45, 156, 45, 45, 170, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 675, 45, 45, 45, 45, 679, 131427, 0, 358, 0, 0, 362, 0, 365, 28809, 367, 139, 45, 45, 45, 45, 45, 381, 45, 45, 45, 45, 45, 45, 45, 45, 45, 400, 45, 45, 419, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 436, 67, 67, 67, 67, 67, 505, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 820, 67, 25398, 542, 13112, 544, 67, 67, 522, 67, 67, 67, 67, 67, 529, 67, 67, 67, 67, 67, 67, 67, 0, 1299, 0, 0, 0, 1305, 0, 0, 0, 97, 97, 619, 97, 97, 97, 97, 97, 626, 97, 97, 97, 97, 97, 97, 97, 1105, 97, 97, 97, 97, 1109, 97, 97, 97, 67, 67, 67, 67, 749, 67, 67, 67, 67, 67, 67, 67, 67, 67, 760, 67, 0, 97, 45, 67, 2058, 97, 45, 67, 0, 97, 45, 67, 97, 0, 0, 97, 97, 97, 97, 97, 45, 45, 45, 2041, 67, 67, 67, 67, 67, 780, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 516, 67, 67, 97, 97, 97, 878, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1629, 97, 0, 45, 979, 45, 45, 45, 45, 984, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1198, 45, 45, 45, 45, 45, 45, 67, 1023, 67, 67, 67, 67, 1028, 67, 67, 67, 67, 67, 67, 67, 67, 67, 470, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 25398, 0, 13112, 0, 54074, 0, 0, 0, 1094, 0, 0, 0, 1092, 1315, 0, 0, 0, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1486, 97, 1489, 97, 97, 97, 1117, 97, 97, 97, 97, 1122, 97, 97, 97, 97, 97, 97, 97, 1146, 97, 97, 97, 97, 97, 97, 97, 97, 881, 97, 97, 97, 886, 97, 97, 97, 1311, 0, 0, 0, 0, 0, 0, 0, 0, 97, 97, 97, 97, 97, 97, 97, 1615, 97, 97, 97, 97, 97, 1619, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1631, 97, 97, 1847, 97, 45, 45, 45, 45, 1852, 45, 45, 45, 45, 45, 45, 45, 1235, 45, 45, 45, 67, 67, 67, 67, 67, 1868, 67, 67, 67, 1872, 67, 67, 67, 67, 67, 97, 97, 97, 97, 1882, 0, 0, 0, 97, 97, 97, 97, 0, 1891, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 1929, 0, 0, 97, 97, 97, 97, 97, 97, 45, 1900, 45, 1901, 45, 45, 45, 1905, 45, 67, 2054, 97, 45, 67, 0, 97, 45, 67, 0, 97, 45, 67, 97, 0, 0, 97, 2037, 2038, 97, 97, 45, 45, 45, 45, 67, 67, 67, 67, 1867, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1774, 97, 97, 97, 97, 97, 97, 0, 94242, 0, 0, 0, 38, 102439, 0, 0, 106538, 98347, 28809, 45, 45, 142, 45, 45, 45, 1412, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 432, 45, 45, 45, 45, 45, 157, 45, 45, 171, 45, 45, 45, 182, 45, 45, 45, 45, 200, 45, 45, 45, 1543, 45, 45, 45, 45, 45, 45, 45, 45, 1551, 45, 45, 45, 45, 1181, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1211, 45, 45, 45, 1214, 45, 45, 45, 67, 209, 67, 67, 67, 224, 67, 67, 238, 67, 67, 67, 249, 67, 0, 97, 2056, 2057, 0, 2059, 45, 67, 0, 97, 45, 67, 97, 0, 0, 1937, 97, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 1741, 45, 45, 45, 45, 45, 45, 67, 67, 67, 267, 67, 67, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 97, 97, 289, 97, 97, 97, 304, 97, 97, 318, 97, 97, 97, 329, 97, 97, 0, 0, 97, 1783, 97, 97, 97, 97, 0, 0, 97, 97, 0, 97, 97, 97, 45, 2026, 45, 45, 45, 45, 67, 2030, 67, 67, 67, 67, 67, 67, 1041, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1044, 67, 67, 67, 67, 67, 67, 97, 97, 347, 97, 97, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 45, 666, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1420, 45, 57889, 0, 0, 54074, 54074, 550, 0, 97, 97, 97, 97, 97, 97, 97, 97, 840, 67, 1007, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 759, 67, 67, 67, 67, 67, 67, 67, 1052, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1031, 67, 67, 67, 67, 67, 97, 97, 97, 1101, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 592, 97, 97, 97, 1190, 45, 45, 45, 45, 45, 1195, 45, 1197, 45, 45, 45, 45, 1201, 45, 45, 45, 45, 1952, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 250, 67, 67, 67, 1255, 67, 1257, 67, 67, 67, 67, 1261, 67, 67, 67, 67, 67, 67, 67, 67, 1685, 67, 67, 67, 67, 67, 67, 67, 0, 24851, 12565, 0, 0, 0, 0, 28809, 53532, 67, 67, 1267, 67, 67, 67, 67, 67, 67, 1273, 67, 67, 67, 67, 67, 67, 67, 67, 1696, 67, 67, 67, 67, 67, 67, 67, 0, 0, 0, 0, 0, 0, 2162688, 0, 0, 1281, 67, 67, 67, 67, 1285, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1070, 67, 67, 67, 67, 67, 1335, 97, 1337, 97, 97, 97, 97, 1341, 97, 97, 97, 97, 97, 97, 97, 97, 882, 97, 97, 97, 97, 97, 97, 97, 1347, 97, 97, 97, 97, 97, 97, 1353, 97, 97, 97, 97, 97, 97, 1361, 97, 18, 131427, 0, 638, 0, 0, 0, 0, 362, 0, 0, 365, 29315, 367, 0, 544, 0, 550, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2473984, 2158592, 2158592, 2158592, 2990080, 2158592, 2158592, 2207744, 2207744, 2482176, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 0, 0, 0, 0, 0, 0, 2162688, 0, 53530, 97, 97, 97, 1365, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 608, 97, 97, 97, 45, 45, 1424, 45, 1425, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1058, 67, 67, 67, 67, 45, 1555, 45, 45, 1557, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 707, 45, 45, 45, 45, 67, 67, 1570, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 773, 67, 67, 1595, 67, 67, 1597, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 139, 2158592, 2158592, 2158592, 2404352, 2412544, 97, 97, 97, 1636, 97, 97, 97, 1639, 97, 97, 1641, 97, 97, 97, 97, 97, 97, 1173, 0, 921, 0, 0, 0, 0, 0, 0, 45, 67, 67, 67, 1693, 67, 67, 67, 67, 67, 67, 67, 1698, 67, 67, 67, 67, 67, 67, 67, 1773, 67, 97, 97, 97, 97, 97, 97, 97, 625, 97, 97, 97, 97, 97, 97, 97, 97, 850, 97, 97, 97, 97, 97, 97, 97, 97, 880, 97, 97, 97, 97, 97, 97, 97, 97, 1106, 97, 97, 97, 97, 97, 97, 97, 1860, 45, 45, 67, 67, 1865, 67, 67, 67, 67, 1870, 67, 67, 67, 67, 1875, 67, 67, 97, 97, 1880, 97, 97, 0, 0, 0, 97, 97, 1888, 97, 0, 0, 0, 1938, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 1854, 45, 45, 45, 45, 45, 45, 45, 1909, 45, 45, 1911, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1248, 67, 67, 67, 67, 67, 67, 1922, 67, 67, 1924, 97, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 97, 1898, 45, 45, 45, 45, 45, 45, 1904, 45, 45, 67, 67, 67, 67, 97, 97, 97, 97, 0, 0, 16384, 97, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 1724, 2008, 2009, 45, 45, 67, 67, 67, 2014, 2015, 67, 67, 97, 97, 0, 0, 97, 97, 97, 0, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 2022, 0, 2023, 97, 97, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 1869, 67, 67, 67, 67, 67, 67, 0, 94242, 0, 0, 0, 38, 102439, 0, 0, 106538, 98347, 28809, 45, 45, 45, 147, 151, 154, 45, 162, 45, 45, 176, 178, 181, 45, 45, 45, 192, 196, 45, 45, 45, 45, 2012, 67, 67, 67, 67, 67, 67, 2018, 97, 0, 0, 97, 1978, 97, 97, 97, 1982, 45, 45, 45, 45, 45, 45, 45, 45, 45, 972, 973, 45, 45, 45, 45, 45, 67, 259, 263, 67, 67, 67, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 97, 97, 97, 294, 298, 301, 97, 309, 97, 97, 323, 325, 328, 97, 97, 97, 97, 97, 560, 97, 97, 97, 569, 97, 97, 97, 97, 97, 97, 306, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1624, 97, 97, 97, 97, 97, 97, 97, 0, 921, 0, 1175, 0, 0, 0, 0, 45, 339, 343, 97, 97, 97, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 67, 67, 503, 67, 67, 67, 67, 67, 67, 67, 67, 67, 512, 67, 67, 519, 97, 97, 600, 97, 97, 97, 97, 97, 97, 97, 97, 97, 609, 97, 97, 616, 45, 649, 45, 45, 45, 45, 45, 654, 45, 45, 45, 45, 45, 45, 45, 45, 1393, 45, 45, 45, 45, 45, 45, 45, 45, 1209, 45, 45, 45, 45, 45, 45, 45, 67, 763, 67, 67, 67, 67, 67, 67, 67, 67, 770, 67, 67, 67, 774, 67, 0, 2045, 97, 97, 97, 97, 45, 45, 67, 67, 0, 0, 97, 97, 45, 45, 45, 994, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 213, 67, 219, 67, 67, 232, 67, 242, 67, 247, 67, 67, 67, 779, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1018, 67, 67, 67, 67, 811, 67, 67, 67, 67, 67, 67, 67, 67, 67, 25398, 542, 13112, 544, 57889, 0, 0, 54074, 54074, 550, 0, 97, 834, 97, 97, 97, 97, 97, 839, 97, 18, 131427, 0, 638, 0, 0, 0, 0, 362, 0, 0, 365, 29315, 367, 645, 97, 97, 861, 97, 97, 97, 97, 97, 97, 97, 97, 868, 97, 97, 97, 872, 97, 97, 877, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 613, 97, 97, 97, 97, 97, 909, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 0, 0, 18, 18, 24, 24, 27, 27, 27, 1036, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1047, 67, 67, 67, 1050, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1033, 67, 67, 67, 97, 97, 1130, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 638, 0, 0, 67, 67, 67, 1295, 67, 67, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 1317, 97, 97, 97, 97, 97, 97, 1375, 97, 97, 97, 0, 0, 0, 45, 1379, 45, 45, 45, 45, 45, 45, 422, 45, 45, 45, 429, 431, 45, 45, 45, 45, 0, 1090, 0, 0, 97, 1479, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1357, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1716, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1723, 0, 921, 29315, 0, 0, 0, 0, 45, 929, 45, 45, 45, 45, 45, 45, 45, 1392, 45, 45, 45, 45, 45, 45, 45, 45, 45, 960, 45, 45, 45, 45, 45, 45, 97, 97, 97, 1738, 45, 45, 45, 45, 45, 45, 45, 1743, 45, 45, 45, 45, 166, 45, 45, 45, 45, 184, 186, 45, 45, 197, 45, 45, 97, 1779, 0, 0, 97, 97, 97, 97, 97, 97, 0, 0, 97, 97, 0, 97, 18, 131427, 0, 638, 0, 0, 0, 0, 362, 0, 640, 365, 29315, 367, 0, 921, 29315, 0, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1537, 45, 45, 45, 45, 45, 1803, 45, 45, 45, 45, 45, 1809, 45, 45, 45, 67, 67, 67, 1814, 67, 67, 67, 67, 67, 67, 1821, 67, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 0, 0, 67, 67, 67, 1818, 67, 67, 67, 67, 67, 1824, 67, 67, 67, 97, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 1890, 0, 1829, 97, 97, 0, 0, 97, 97, 1836, 97, 97, 0, 0, 0, 97, 97, 97, 97, 1981, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1987, 1845, 97, 97, 97, 45, 45, 45, 45, 45, 1853, 45, 45, 45, 1857, 45, 45, 45, 67, 1864, 67, 1866, 67, 67, 67, 67, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 97, 97, 1710, 1711, 67, 67, 97, 97, 97, 97, 97, 0, 0, 0, 1886, 97, 97, 97, 0, 0, 97, 97, 97, 97, 1838, 0, 0, 0, 97, 1843, 97, 0, 1893, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1745, 45, 45, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 0, 0, 1931, 97, 97, 97, 97, 97, 588, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 629, 97, 97, 97, 97, 97, 67, 2044, 0, 97, 97, 97, 97, 45, 45, 67, 67, 0, 0, 97, 97, 45, 45, 45, 1660, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 453, 45, 455, 67, 67, 67, 67, 268, 67, 67, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 97, 97, 348, 97, 97, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 131427, 0, 359, 0, 0, 362, 0, 365, 28809, 367, 139, 45, 45, 45, 45, 45, 421, 45, 45, 45, 45, 45, 45, 45, 434, 45, 45, 695, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1667, 45, 0, 921, 29315, 0, 925, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1811, 45, 67, 67, 67, 67, 67, 67, 1037, 67, 1039, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1277, 67, 67, 67, 67, 67, 67, 67, 67, 25398, 0, 13112, 0, 54074, 0, 0, 0, 1095, 0, 0, 0, 1096, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 869, 97, 97, 97, 97, 97, 97, 1131, 97, 1133, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1370, 97, 97, 97, 97, 97, 1312, 0, 0, 0, 0, 1096, 0, 0, 0, 97, 97, 97, 97, 97, 97, 97, 1327, 97, 97, 97, 97, 97, 1332, 97, 97, 97, 1830, 97, 0, 0, 97, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 1896, 97, 97, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1548, 45, 45, 45, 45, 45, 45, 133, 94242, 0, 0, 0, 38, 102439, 0, 0, 106538, 98347, 28809, 45, 45, 45, 45, 380, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 401, 45, 45, 158, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1200, 45, 45, 45, 45, 206, 67, 67, 67, 67, 67, 225, 67, 67, 67, 67, 67, 67, 67, 67, 754, 67, 67, 67, 67, 67, 67, 67, 57889, 0, 0, 54074, 54074, 550, 832, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1342, 97, 97, 97, 97, 97, 97, 67, 67, 67, 67, 67, 25398, 1083, 13112, 1087, 54074, 1091, 0, 0, 0, 0, 0, 0, 1316, 0, 831, 97, 97, 97, 97, 97, 97, 97, 1174, 921, 0, 1175, 0, 0, 0, 0, 45, 0, 94242, 0, 0, 0, 38, 102439, 0, 0, 106538, 98347, 28809, 45, 45, 45, 148, 67, 67, 264, 67, 67, 67, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 97, 97, 97, 295, 97, 97, 97, 97, 313, 97, 97, 97, 97, 331, 333, 97, 18, 131427, 356, 638, 0, 0, 0, 0, 362, 0, 0, 365, 0, 367, 0, 45, 45, 1530, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 988, 45, 45, 45, 97, 344, 97, 97, 97, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 402, 404, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1756, 67, 438, 45, 45, 45, 45, 45, 45, 45, 45, 449, 450, 45, 45, 45, 67, 67, 214, 218, 221, 67, 229, 67, 67, 243, 245, 248, 67, 67, 67, 67, 67, 488, 490, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1071, 67, 1073, 67, 67, 67, 67, 67, 524, 67, 67, 67, 67, 67, 67, 67, 67, 535, 536, 67, 67, 67, 67, 67, 67, 1683, 1684, 67, 67, 67, 67, 1688, 1689, 67, 67, 67, 67, 67, 67, 1586, 67, 67, 67, 67, 67, 67, 67, 67, 67, 469, 67, 67, 67, 67, 67, 67, 97, 97, 97, 585, 587, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1163, 97, 97, 97, 97, 97, 97, 97, 621, 97, 97, 97, 97, 97, 97, 97, 97, 632, 633, 97, 97, 0, 0, 1782, 97, 97, 97, 97, 97, 0, 0, 97, 97, 0, 97, 712, 45, 45, 45, 717, 45, 45, 45, 45, 45, 45, 45, 45, 725, 45, 45, 45, 163, 167, 173, 177, 45, 45, 45, 45, 45, 193, 45, 45, 45, 45, 982, 45, 45, 45, 45, 45, 45, 987, 45, 45, 45, 45, 45, 1558, 45, 1560, 45, 45, 45, 45, 45, 45, 45, 45, 704, 705, 45, 45, 45, 45, 45, 45, 45, 45, 731, 45, 45, 45, 67, 67, 67, 67, 67, 739, 67, 67, 67, 67, 67, 67, 273, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 67, 67, 67, 764, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1290, 67, 67, 67, 67, 67, 67, 812, 67, 67, 67, 67, 818, 67, 67, 67, 25398, 542, 13112, 544, 57889, 0, 0, 54074, 54074, 550, 0, 97, 97, 97, 97, 97, 837, 97, 97, 97, 97, 97, 602, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1137, 97, 97, 97, 97, 97, 97, 97, 97, 97, 862, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1627, 97, 97, 97, 0, 97, 97, 97, 97, 910, 97, 97, 97, 97, 916, 97, 97, 97, 0, 0, 0, 97, 97, 1940, 97, 97, 1942, 45, 45, 45, 45, 45, 45, 385, 45, 45, 45, 45, 395, 45, 45, 45, 45, 966, 45, 969, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 975, 45, 45, 45, 406, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 974, 45, 45, 45, 67, 67, 67, 67, 1010, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1262, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1040, 67, 1042, 67, 1045, 67, 67, 67, 67, 67, 67, 67, 97, 1706, 97, 97, 97, 1709, 97, 97, 97, 67, 67, 67, 67, 1051, 67, 67, 67, 67, 67, 1057, 67, 67, 67, 67, 67, 67, 67, 1443, 67, 67, 1446, 67, 67, 67, 67, 67, 67, 67, 1297, 0, 0, 0, 1303, 0, 0, 0, 1309, 67, 67, 67, 67, 1079, 25398, 0, 13112, 0, 54074, 0, 0, 0, 0, 0, 0, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2207744, 2207744, 2207744, 2207744, 2207744, 2572288, 2207744, 2207744, 2207744, 1098, 97, 97, 97, 97, 97, 1104, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1356, 97, 97, 97, 97, 97, 97, 1128, 97, 97, 97, 97, 97, 97, 1134, 97, 1136, 97, 1139, 97, 97, 97, 97, 97, 97, 1622, 97, 97, 97, 97, 97, 97, 97, 97, 0, 921, 0, 0, 0, 1176, 0, 646, 45, 67, 67, 67, 1268, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1469, 67, 67, 67, 97, 1348, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1127, 97, 67, 1569, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1448, 1449, 67, 1816, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1825, 67, 67, 1827, 97, 97, 0, 1781, 97, 97, 97, 97, 97, 97, 0, 0, 97, 97, 0, 97, 97, 97, 1831, 0, 0, 97, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 1980, 97, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1395, 45, 45, 45, 45, 45, 97, 1846, 97, 97, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1212, 45, 45, 45, 45, 45, 45, 2010, 45, 67, 67, 67, 67, 67, 2016, 67, 97, 97, 0, 0, 97, 97, 97, 0, 97, 97, 97, 97, 97, 45, 45, 2007, 0, 94242, 0, 0, 0, 38, 102439, 0, 0, 106538, 98347, 28809, 45, 45, 143, 45, 45, 45, 1671, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 1813, 67, 67, 1815, 45, 45, 67, 210, 67, 67, 67, 67, 67, 67, 239, 67, 67, 67, 67, 67, 67, 67, 1454, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1445, 67, 67, 67, 67, 67, 67, 97, 97, 290, 97, 97, 97, 97, 97, 97, 319, 97, 97, 97, 97, 97, 97, 303, 97, 97, 317, 97, 97, 97, 97, 97, 97, 305, 97, 97, 97, 97, 97, 97, 97, 97, 97, 899, 97, 97, 97, 97, 97, 97, 375, 45, 45, 45, 379, 45, 45, 390, 45, 45, 394, 45, 45, 45, 45, 45, 443, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 461, 67, 67, 67, 465, 67, 67, 476, 67, 67, 480, 67, 67, 67, 67, 67, 67, 1694, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1288, 67, 67, 67, 67, 67, 67, 500, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1075, 97, 97, 97, 558, 97, 97, 97, 562, 97, 97, 573, 97, 97, 577, 97, 97, 97, 97, 97, 895, 97, 97, 97, 97, 97, 97, 903, 97, 97, 97, 0, 97, 97, 1638, 97, 97, 97, 97, 97, 97, 97, 97, 1646, 597, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1334, 45, 681, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1396, 45, 45, 1399, 45, 45, 730, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1434, 67, 67, 67, 67, 67, 67, 750, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1456, 67, 67, 67, 67, 67, 45, 45, 993, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 1238, 67, 67, 1006, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1280, 1048, 1049, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1059, 67, 67, 67, 67, 67, 67, 1286, 67, 67, 67, 67, 67, 67, 67, 1291, 67, 97, 97, 1100, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 638, 0, 920, 97, 97, 1142, 1143, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1153, 97, 97, 97, 97, 97, 1158, 97, 97, 97, 1161, 97, 97, 97, 97, 1166, 97, 97, 97, 97, 97, 1325, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1328, 97, 97, 97, 97, 97, 97, 97, 45, 1218, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1678, 45, 45, 45, 67, 67, 67, 67, 67, 1269, 67, 67, 67, 67, 67, 67, 67, 67, 1278, 67, 67, 67, 67, 67, 67, 1761, 67, 67, 67, 67, 67, 67, 67, 67, 67, 530, 67, 67, 67, 67, 67, 67, 97, 97, 1349, 97, 97, 97, 97, 97, 97, 97, 97, 1358, 97, 97, 97, 97, 97, 97, 1623, 97, 97, 97, 97, 97, 97, 97, 97, 0, 921, 0, 0, 926, 0, 0, 0, 45, 45, 1411, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1754, 45, 45, 67, 67, 1301, 0, 1307, 0, 1313, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 21054, 97, 97, 97, 97, 67, 1757, 67, 67, 67, 1760, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1467, 67, 67, 67, 67, 67, 1778, 97, 0, 0, 97, 97, 97, 97, 97, 97, 0, 0, 97, 97, 0, 97, 97, 97, 97, 97, 1352, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1511, 97, 97, 97, 97, 97, 67, 67, 67, 67, 67, 1820, 67, 1822, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 0, 0, 0, 97, 1933, 97, 1892, 97, 97, 97, 97, 97, 97, 1899, 45, 45, 45, 45, 45, 45, 45, 45, 1664, 45, 45, 45, 45, 45, 45, 45, 45, 1546, 45, 45, 45, 45, 45, 45, 45, 45, 1208, 45, 45, 45, 45, 45, 45, 45, 45, 1224, 45, 45, 45, 45, 45, 45, 45, 45, 673, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 1925, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 97, 623, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 307, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1796, 97, 45, 45, 45, 45, 45, 45, 45, 970, 45, 45, 45, 45, 45, 45, 45, 45, 1417, 45, 45, 45, 45, 45, 45, 45, 67, 1964, 67, 67, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 1721, 97, 97, 0, 0, 1997, 97, 0, 0, 2000, 97, 97, 0, 97, 97, 97, 97, 97, 45, 45, 45, 45, 733, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 803, 67, 67, 67, 67, 67, 0, 94242, 0, 0, 0, 38, 102439, 0, 0, 106538, 98347, 28809, 45, 45, 144, 45, 45, 45, 1805, 45, 1807, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 231, 67, 67, 67, 67, 67, 67, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 45, 45, 67, 211, 67, 67, 67, 67, 230, 234, 240, 244, 67, 67, 67, 67, 67, 67, 464, 67, 67, 67, 67, 67, 67, 479, 67, 67, 67, 260, 67, 67, 67, 67, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 97, 97, 291, 97, 97, 97, 97, 310, 314, 320, 324, 97, 97, 97, 97, 97, 97, 1367, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1355, 97, 97, 97, 97, 97, 97, 1362, 340, 97, 97, 97, 97, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 131427, 0, 0, 360, 0, 362, 0, 365, 28809, 367, 139, 369, 45, 45, 45, 374, 67, 67, 460, 67, 67, 67, 67, 466, 67, 67, 67, 67, 67, 67, 67, 67, 801, 67, 67, 67, 67, 67, 67, 67, 67, 67, 487, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 498, 67, 67, 67, 67, 67, 67, 1772, 67, 67, 97, 97, 97, 97, 97, 97, 97, 0, 921, 922, 1175, 0, 0, 0, 0, 45, 67, 502, 67, 67, 67, 67, 67, 67, 67, 508, 67, 67, 67, 515, 517, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 0, 0, 0, 1932, 97, 97, 0, 1999, 97, 97, 97, 0, 97, 97, 2004, 2005, 97, 45, 45, 45, 45, 1193, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 676, 45, 45, 45, 45, 67, 24850, 24850, 12564, 12564, 0, 57889, 0, 0, 0, 53531, 53531, 367, 286, 552, 97, 97, 97, 97, 97, 1377, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 655, 45, 45, 45, 45, 45, 45, 45, 97, 97, 557, 97, 97, 97, 97, 563, 97, 97, 97, 97, 97, 97, 97, 97, 1135, 97, 97, 97, 97, 97, 97, 97, 97, 97, 584, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 595, 97, 97, 97, 97, 97, 911, 97, 97, 97, 97, 97, 97, 97, 638, 0, 0, 0, 0, 1315, 0, 0, 0, 0, 97, 97, 97, 1319, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 1733, 97, 97, 97, 97, 97, 97, 1340, 97, 97, 97, 1343, 97, 97, 1345, 97, 1346, 97, 599, 97, 97, 97, 97, 97, 97, 97, 605, 97, 97, 97, 612, 614, 97, 97, 97, 97, 97, 1794, 97, 97, 97, 45, 45, 45, 45, 45, 45, 45, 1207, 45, 45, 45, 45, 45, 45, 1213, 45, 45, 745, 67, 67, 67, 67, 751, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1577, 67, 67, 67, 67, 67, 762, 67, 67, 67, 67, 766, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1765, 67, 67, 67, 67, 67, 777, 67, 67, 781, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1592, 1593, 67, 67, 97, 843, 97, 97, 97, 97, 849, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1510, 97, 97, 97, 97, 97, 97, 97, 860, 97, 97, 97, 97, 864, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1797, 45, 45, 45, 45, 1801, 45, 97, 875, 97, 97, 879, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1522, 97, 97, 97, 97, 97, 991, 45, 45, 45, 45, 996, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 215, 67, 67, 67, 67, 233, 67, 67, 67, 67, 251, 253, 1022, 67, 67, 67, 1026, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1035, 67, 67, 1038, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1458, 67, 67, 67, 67, 67, 1064, 67, 67, 67, 1067, 67, 67, 67, 67, 1072, 67, 67, 67, 67, 67, 67, 1296, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2367488, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 67, 67, 67, 67, 67, 25398, 0, 13112, 0, 54074, 0, 0, 0, 0, 1096, 0, 921, 29315, 0, 0, 0, 0, 928, 45, 45, 45, 45, 45, 934, 45, 45, 45, 164, 45, 45, 45, 45, 45, 45, 45, 45, 45, 198, 45, 45, 45, 378, 45, 45, 45, 45, 45, 45, 393, 45, 45, 45, 398, 45, 97, 97, 1116, 97, 97, 97, 1120, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1147, 1148, 97, 97, 97, 97, 97, 97, 97, 1129, 97, 97, 1132, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1626, 97, 97, 97, 97, 0, 45, 1178, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1185, 45, 45, 45, 45, 441, 45, 45, 45, 45, 45, 45, 451, 45, 45, 67, 67, 67, 67, 67, 227, 67, 67, 67, 67, 67, 67, 67, 67, 1260, 67, 67, 67, 1263, 67, 67, 1265, 1203, 45, 45, 1205, 45, 1206, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1216, 67, 1266, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1276, 67, 67, 67, 67, 67, 67, 492, 67, 67, 67, 67, 67, 67, 67, 67, 67, 471, 67, 67, 67, 67, 481, 67, 45, 1386, 45, 1389, 45, 45, 45, 45, 1394, 45, 45, 45, 1397, 45, 45, 45, 45, 995, 45, 997, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 1915, 67, 67, 67, 67, 67, 1422, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1433, 67, 1436, 67, 67, 67, 67, 1441, 67, 67, 67, 1444, 67, 67, 67, 67, 67, 67, 67, 0, 24850, 12564, 0, 0, 0, 281, 28809, 53531, 97, 97, 97, 97, 1494, 97, 97, 97, 1497, 97, 97, 97, 97, 97, 97, 97, 1368, 97, 97, 97, 97, 97, 97, 97, 97, 851, 97, 97, 97, 97, 97, 97, 97, 67, 67, 67, 1571, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 25398, 542, 13112, 544, 67, 67, 1583, 67, 67, 67, 67, 67, 67, 67, 67, 1591, 67, 67, 67, 67, 67, 67, 752, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1056, 67, 67, 67, 67, 67, 67, 97, 1634, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1125, 97, 97, 97, 1647, 97, 97, 97, 97, 97, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1183, 45, 45, 45, 45, 45, 45, 45, 45, 45, 409, 45, 45, 45, 45, 45, 45, 1658, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1668, 1712, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 0, 1835, 97, 97, 97, 97, 0, 0, 0, 97, 97, 1844, 97, 97, 1726, 0, 97, 97, 97, 97, 97, 1732, 97, 1734, 97, 97, 97, 97, 97, 300, 97, 308, 97, 97, 97, 97, 97, 97, 97, 97, 866, 97, 97, 97, 97, 97, 97, 97, 67, 67, 67, 1758, 67, 67, 67, 1762, 67, 67, 67, 67, 67, 67, 67, 67, 1043, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1771, 67, 67, 67, 97, 97, 97, 97, 97, 1776, 97, 97, 97, 97, 297, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1108, 97, 97, 97, 97, 67, 67, 67, 1966, 97, 97, 97, 1970, 0, 0, 0, 97, 97, 97, 97, 0, 97, 97, 97, 1720, 97, 97, 97, 97, 97, 0, 0, 97, 97, 97, 1837, 97, 0, 1840, 1841, 97, 97, 97, 1988, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1994, 1995, 67, 97, 97, 97, 97, 97, 1103, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 917, 97, 97, 0, 0, 0, 67, 67, 265, 67, 67, 67, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 97, 345, 97, 97, 97, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 131427, 0, 0, 0, 361, 362, 0, 365, 28809, 367, 139, 45, 45, 45, 45, 45, 671, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 411, 45, 45, 414, 45, 45, 45, 45, 377, 45, 45, 45, 386, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1223, 45, 45, 45, 45, 45, 45, 45, 45, 45, 426, 45, 45, 433, 45, 45, 45, 67, 67, 67, 67, 67, 463, 67, 67, 67, 472, 67, 67, 67, 67, 67, 67, 67, 527, 67, 67, 67, 67, 67, 67, 537, 67, 540, 24850, 24850, 12564, 12564, 0, 57889, 0, 0, 0, 53531, 53531, 367, 286, 97, 97, 97, 97, 97, 1119, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1509, 97, 97, 97, 97, 97, 97, 97, 97, 564, 97, 97, 97, 97, 97, 97, 97, 637, 18, 131427, 0, 0, 0, 0, 0, 0, 362, 0, 0, 365, 29315, 367, 0, 921, 29315, 0, 0, 0, 927, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1234, 45, 45, 45, 45, 67, 67, 67, 67, 1240, 45, 697, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 708, 45, 45, 45, 45, 1221, 45, 45, 45, 45, 1225, 45, 45, 45, 45, 45, 45, 384, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1210, 45, 45, 45, 45, 45, 45, 67, 67, 795, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1470, 67, 67, 67, 67, 67, 67, 67, 815, 67, 67, 67, 67, 67, 67, 25398, 542, 13112, 544, 97, 97, 97, 893, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1164, 97, 97, 97, 67, 67, 67, 1025, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1687, 67, 67, 67, 67, 67, 67, 67, 67, 67, 25398, 0, 13112, 0, 54074, 0, 0, 0, 0, 0, 1097, 1241, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1450, 45, 45, 1388, 45, 1390, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1236, 67, 67, 67, 67, 67, 1437, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1472, 1490, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1503, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 0, 1930, 0, 97, 97, 97, 97, 97, 847, 97, 97, 97, 97, 97, 97, 97, 97, 97, 858, 67, 67, 1965, 67, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 0, 97, 97, 1719, 97, 97, 97, 97, 97, 97, 0, 0, 0, 45, 45, 45, 45, 1382, 45, 1383, 45, 45, 45, 159, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1563, 45, 45, 45, 45, 45, 67, 261, 67, 67, 67, 67, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 341, 97, 97, 97, 97, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 97, 1099, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1333, 97, 1230, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 1992, 67, 1993, 67, 67, 67, 97, 97, 45, 45, 160, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1665, 45, 45, 45, 45, 45, 131427, 357, 0, 0, 0, 362, 0, 365, 28809, 367, 139, 45, 45, 45, 45, 45, 684, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 412, 45, 45, 45, 416, 45, 45, 45, 440, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 1990, 67, 1991, 67, 67, 67, 67, 67, 67, 67, 97, 97, 1707, 97, 97, 97, 97, 97, 97, 501, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1691, 67, 67, 67, 67, 67, 526, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1030, 67, 1032, 67, 67, 67, 67, 598, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1632, 0, 921, 29315, 923, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1404, 45, 45, 45, 45, 45, 45, 45, 45, 45, 425, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 25398, 0, 13112, 0, 54074, 0, 0, 1093, 0, 0, 0, 0, 0, 97, 1609, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1369, 97, 97, 97, 1372, 97, 97, 67, 67, 266, 67, 67, 67, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 97, 346, 97, 97, 97, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 665, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1677, 45, 45, 45, 45, 67, 45, 45, 954, 45, 956, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1545, 45, 45, 45, 45, 45, 45, 45, 45, 45, 448, 45, 45, 45, 45, 67, 456, 67, 67, 67, 67, 67, 1270, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1069, 67, 67, 67, 67, 67, 67, 97, 97, 97, 1350, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1524, 97, 97, 97, 97, 97, 97, 97, 1376, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 1559, 1561, 45, 45, 45, 1564, 45, 1566, 1567, 45, 67, 67, 67, 67, 67, 1573, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1247, 67, 67, 67, 67, 67, 1252, 97, 1725, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1628, 97, 1630, 0, 0, 94242, 0, 0, 0, 2211840, 0, 1118208, 0, 0, 0, 0, 2158592, 2158731, 2158592, 2158592, 2158592, 3117056, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 3018752, 2158592, 3043328, 2158592, 2158592, 2158592, 2158592, 3080192, 2158592, 2158592, 3112960, 2158592, 2158592, 2158592, 2158592, 2158592, 2158878, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2605056, 2158592, 2158592, 2207744, 0, 542, 0, 544, 0, 0, 2166784, 0, 0, 0, 550, 0, 0, 2158592, 2158592, 2686976, 2158592, 2715648, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2867200, 2158592, 2904064, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 0, 94242, 0, 0, 0, 2211840, 0, 0, 1130496, 0, 0, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 3186688, 2158592, 0, 0, 139, 0, 0, 0, 139, 0, 2367488, 2207744, 0, 0, 0, 0, 176128, 0, 2166784, 0, 0, 0, 0, 0, 286, 2158592, 2158592, 3170304, 3174400, 2158592, 0, 0, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 2424832, 2158592, 2158592, 2158592, 1508, 2158592, 2908160, 2158592, 2158592, 2158592, 2977792, 2158592, 2158592, 2158592, 2158592, 3039232, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 3158016, 67, 24850, 24850, 12564, 12564, 0, 0, 0, 0, 0, 53531, 53531, 0, 286, 97, 97, 97, 97, 97, 1144, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1149, 97, 97, 97, 97, 1154, 57889, 0, 0, 0, 0, 550, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 561, 97, 97, 97, 97, 97, 97, 576, 97, 97, 139264, 139264, 139264, 139264, 139264, 139264, 139264, 139264, 139264, 139264, 139264, 139264, 0, 0, 139264, 0, 921, 29315, 0, 0, 926, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 719, 720, 45, 45, 45, 45, 45, 45, 45, 45, 685, 45, 45, 45, 45, 45, 45, 45, 45, 45, 942, 45, 45, 946, 45, 45, 45, 950, 45, 45, 0, 2146304, 2146304, 0, 0, 0, 0, 2224128, 2224128, 2224128, 2232320, 2232320, 2232320, 2232320, 0, 0, 1301, 0, 0, 0, 0, 0, 1307, 0, 0, 0, 0, 0, 1313, 0, 0, 0, 0, 0, 0, 0, 97, 97, 1318, 97, 97, 97, 97, 97, 97, 1795, 97, 97, 45, 45, 45, 45, 45, 45, 45, 446, 45, 45, 45, 45, 45, 45, 67, 67, 2158592, 2146304, 0, 0, 0, 0, 0, 0, 0, 2211840, 0, 0, 0, 0, 2158592, 0, 921, 29315, 0, 924, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1000, 45, 45, 45, 45, 67, 67 +]; + +XQueryTokenizer.EXPECTED = +[ 290, 300, 304, 353, 296, 309, 305, 319, 315, 324, 328, 352, 354, 334, 338, 330, 320, 345, 349, 293, 358, 362, 341, 366, 312, 370, 374, 378, 382, 386, 390, 394, 398, 737, 402, 634, 439, 604, 634, 634, 634, 634, 408, 634, 634, 634, 404, 634, 634, 634, 457, 634, 634, 963, 634, 634, 413, 634, 634, 634, 634, 634, 634, 634, 663, 418, 422, 903, 902, 426, 431, 548, 634, 437, 521, 919, 443, 615, 409, 449, 455, 624, 731, 751, 634, 461, 465, 672, 470, 469, 474, 481, 485, 477, 489, 493, 629, 542, 497, 505, 603, 602, 991, 648, 510, 804, 634, 515, 958, 526, 525, 530, 768, 634, 546, 552, 711, 710, 593, 558, 562, 618, 566, 570, 574, 578, 582, 586, 590, 608, 612, 660, 822, 821, 634, 622, 596, 444, 628, 533, 724, 633, 640, 653, 647, 652, 536, 1008, 451, 450, 445, 657, 670, 676, 685, 689, 693, 697, 701, 704, 707, 715, 719, 798, 815, 634, 723, 762, 996, 634, 728, 969, 730, 735, 908, 634, 741, 679, 889, 511, 747, 634, 750, 755, 499, 666, 499, 501, 759, 772, 776, 780, 634, 787, 784, 797, 802, 809, 808, 427, 814, 1006, 517, 634, 519, 853, 634, 813, 850, 793, 634, 819, 826, 833, 832, 837, 843, 847, 857, 861, 863, 867, 871, 875, 879, 883, 643, 887, 539, 980, 979, 634, 893, 944, 634, 900, 896, 634, 907, 933, 506, 912, 917, 828, 433, 636, 635, 554, 961, 923, 930, 927, 937, 941, 634, 634, 634, 974, 948, 952, 985, 913, 968, 967, 743, 634, 973, 839, 634, 978, 599, 634, 984, 989, 765, 444, 995, 1000, 634, 1003, 790, 955, 1012, 681, 634, 634, 634, 634, 634, 414, 1016, 1020, 1024, 1085, 1027, 1090, 1090, 1046, 1080, 1137, 1108, 1215, 1049, 1032, 1039, 1085, 1085, 1085, 1085, 1058, 1062, 1068, 1085, 1086, 1090, 1090, 1091, 1072, 1064, 1107, 1090, 1090, 1090, 1118, 1123, 1138, 1078, 1074, 1084, 1085, 1085, 1085, 1087, 1090, 1062, 1052, 1060, 1114, 1062, 1104, 1085, 1085, 1090, 1090, 1028, 1122, 1063, 1128, 1139, 1127, 1158, 1085, 1085, 1151, 1090, 1090, 1090, 1095, 1090, 1132, 1073, 1136, 1143, 1061, 1150, 1085, 1155, 1098, 1101, 1146, 1162, 1169, 1101, 1185, 1151, 1090, 1110, 1173, 1054, 1087, 1109, 1177, 1165, 1089, 1204, 1184, 1107, 1189, 1193, 1088, 1197, 1180, 1201, 1208, 1042, 1212, 1219, 1223, 1227, 1231, 1235, 1245, 1777, 1527, 1686, 1686, 1238, 1686, 1254, 1686, 1686, 1686, 1294, 1669, 1686, 1686, 1686, 1322, 1625, 1534, 1268, 1624, 1275, 1281, 1443, 1292, 1300, 1686, 1686, 1686, 1350, 1826, 1306, 1686, 1686, 1240, 2032, 1317, 1321, 1686, 1686, 1253, 1686, 1326, 1686, 1686, 1686, 1418, 1709, 1446, 1686, 1686, 1686, 1492, 1686, 1295, 1447, 1686, 1686, 1258, 1686, 1736, 1686, 1686, 1520, 1355, 1686, 1288, 1348, 1361, 1686, 1359, 1686, 1364, 1498, 1368, 1302, 1362, 1381, 1389, 1395, 1486, 1686, 1371, 1377, 1370, 1686, 1375, 1382, 1384, 1402, 1408, 1385, 1383, 1619, 1413, 1423, 1428, 1433, 1686, 1686, 1270, 1686, 1338, 1686, 1440, 1686, 1686, 1686, 1499, 1465, 1686, 1686, 1686, 1639, 1473, 1884, 1686, 1686, 1293, 1864, 1686, 1686, 1296, 1321, 1483, 1686, 1686, 1686, 1646, 1686, 1748, 1496, 1686, 1418, 1675, 1686, 1418, 1702, 1686, 1418, 1981, 1686, 1429, 1409, 1427, 1504, 1692, 1686, 1686, 1313, 1448, 1651, 1508, 1686, 1686, 1340, 1686, 1903, 1686, 1686, 1435, 1513, 1686, 1283, 1287, 1519, 1686, 1524, 1363, 1568, 1938, 1539, 1566, 1579, 1479, 1533, 1538, 1553, 1544, 1552, 1557, 1563, 1574, 1557, 1583, 1589, 1590, 1759, 1594, 1603, 1607, 1611, 1686, 1436, 1514, 1686, 1434, 1656, 1686, 1434, 1680, 1686, 1453, 1686, 1686, 1686, 1559, 1617, 1686, 1770, 1418, 1623, 1769, 1629, 1686, 1515, 1335, 1686, 1285, 1686, 1671, 1921, 1650, 1686, 1686, 1344, 1308, 1666, 1686, 1686, 1686, 1659, 1685, 1686, 1686, 1686, 1686, 1241, 1686, 1686, 1844, 1691, 1686, 1630, 1977, 1970, 1362, 1686, 1686, 1686, 1693, 1698, 1686, 1686, 1686, 1697, 1686, 1764, 1715, 1686, 1634, 1638, 1686, 1599, 1585, 1686, 1271, 1686, 1269, 1686, 1721, 1686, 1686, 1354, 1686, 1801, 1686, 1799, 1686, 1640, 1686, 1686, 1461, 1686, 1686, 1732, 1686, 1944, 1686, 1740, 1686, 1746, 1415, 1396, 1686, 1598, 1547, 1417, 1597, 1416, 1577, 1546, 1397, 1577, 1547, 1548, 1570, 1398, 1753, 1686, 1652, 1509, 1686, 1686, 1686, 1757, 1686, 1419, 1686, 1763, 1418, 1768, 1781, 1686, 1686, 1686, 1705, 1686, 2048, 1792, 1686, 1686, 1686, 1735, 1686, 1797, 1686, 1686, 1404, 1686, 1639, 1815, 1686, 1686, 1418, 2017, 1820, 1686, 1686, 1803, 1686, 1686, 1686, 1736, 1489, 1686, 1686, 1825, 1338, 1260, 1263, 1686, 1686, 1785, 1686, 1686, 1728, 1686, 1686, 1749, 1497, 1830, 1830, 1262, 1248, 1261, 1329, 1260, 1264, 1329, 1248, 1249, 1259, 1540, 1849, 1842, 1686, 1686, 1835, 1686, 1686, 1816, 1686, 1686, 1831, 1882, 1848, 1686, 1686, 1686, 1774, 2071, 1854, 1686, 1686, 1469, 1884, 1686, 1821, 1859, 1686, 1686, 1350, 1883, 1686, 1686, 1686, 1781, 1391, 1875, 1686, 1686, 1613, 1644, 1686, 1686, 1889, 1686, 1686, 1662, 1884, 1686, 1885, 1890, 1686, 1686, 1686, 1894, 1686, 1686, 1678, 1686, 1907, 1686, 1686, 1529, 1914, 1686, 1838, 1686, 1686, 1881, 1686, 1686, 1872, 1876, 1836, 1919, 1686, 1837, 1692, 1910, 1686, 1925, 1928, 1742, 1686, 1811, 1811, 1930, 1810, 1929, 1935, 1928, 1900, 1942, 1867, 1868, 1931, 1035, 1788, 1948, 1952, 1956, 1960, 1964, 1686, 1976, 1686, 1686, 1686, 2065, 1686, 1992, 2037, 1686, 1686, 1998, 2009, 1972, 2002, 1686, 1686, 1686, 2077, 1300, 2023, 1686, 1686, 1686, 1807, 2031, 1686, 1686, 1686, 1860, 1500, 2032, 1686, 1686, 1686, 2083, 1686, 2036, 1686, 1277, 1276, 2042, 1877, 1686, 1686, 2041, 1686, 1686, 2027, 2037, 2012, 1686, 2012, 1855, 1850, 1686, 2046, 1686, 1686, 2054, 1996, 1686, 1897, 1309, 2059, 2052, 1686, 2058, 1686, 1686, 2081, 1686, 1717, 1477, 1686, 1331, 1686, 1686, 1687, 1686, 1860, 1681, 1686, 1686, 1686, 1966, 1724, 1686, 1686, 1686, 1984, 2015, 1686, 1686, 1686, 1988, 1686, 2063, 1686, 1686, 1686, 2005, 1686, 1727, 1686, 1686, 1711, 1457, 2069, 1686, 1686, 1686, 2019, 2075, 1686, 1686, 1915, 1686, 1686, 1793, 1874, 1686, 1686, 1491, 1362, 1449, 1686, 1686, 1460, 2098, 2087, 2091, 2095, 2184, 2102, 2113, 2780, 2117, 2134, 2142, 2281, 2146, 2146, 2146, 2304, 2296, 2181, 2639, 2591, 2872, 2592, 2873, 2313, 2195, 2200, 2281, 2146, 2273, 2226, 2204, 2152, 2219, 2276, 2167, 2177, 2276, 2235, 2276, 2276, 2230, 2281, 2276, 2296, 2276, 2293, 2276, 2276, 2276, 2276, 2234, 2276, 2311, 2314, 2210, 2199, 2217, 2222, 2276, 2276, 2276, 2240, 2276, 2294, 2276, 2276, 2173, 2276, 2198, 2281, 2281, 2281, 2281, 2282, 2146, 2146, 2146, 2146, 2205, 2146, 2204, 2248, 2276, 2235, 2276, 2297, 2276, 2276, 2276, 2277, 2256, 2281, 2283, 2146, 2146, 2146, 2275, 2276, 2295, 2276, 2276, 2293, 2146, 2304, 2264, 2269, 2221, 2276, 2276, 2276, 2293, 2295, 2276, 2276, 2276, 2295, 2263, 2205, 2268, 2220, 2172, 2276, 2276, 2276, 2296, 2276, 2276, 2296, 2294, 2276, 2276, 2278, 2281, 2281, 2280, 2281, 2281, 2281, 2283, 2206, 2223, 2276, 2276, 2279, 2281, 2281, 2146, 2273, 2276, 2276, 2281, 2281, 2281, 2276, 2292, 2276, 2298, 2225, 2276, 2298, 2169, 2224, 2292, 2298, 2171, 2229, 2281, 2281, 2171, 2236, 2281, 2281, 2281, 2146, 2275, 2225, 2292, 2299, 2276, 2229, 2281, 2146, 2276, 2290, 2297, 2283, 2146, 2146, 2274, 2224, 2227, 2298, 2225, 2297, 2276, 2230, 2170, 2230, 2282, 2146, 2147, 2151, 2156, 2288, 2276, 2230, 2303, 2308, 2236, 2284, 2228, 2318, 2318, 2318, 2326, 2335, 2339, 2343, 2349, 2416, 2693, 2357, 2592, 2109, 2592, 2592, 2162, 2943, 2823, 2646, 2592, 2361, 2592, 2122, 2592, 2592, 2122, 2470, 2592, 2592, 2592, 2109, 2107, 2592, 2592, 2592, 2123, 2592, 2592, 2592, 2125, 2592, 2413, 2592, 2592, 2592, 2127, 2592, 2592, 2414, 2592, 2592, 2592, 2130, 2952, 2592, 2594, 2592, 2592, 2212, 2609, 2252, 2592, 2592, 2592, 2446, 2434, 2592, 2592, 2592, 2212, 2446, 2450, 2456, 2431, 2435, 2592, 2592, 2243, 2478, 2448, 2439, 2946, 2592, 2592, 2592, 2368, 2809, 2813, 2450, 2441, 2212, 2812, 2449, 2440, 2947, 2592, 2592, 2592, 2345, 2451, 2457, 2948, 2592, 2124, 2592, 2592, 2650, 2823, 2449, 2455, 2946, 2592, 2128, 2592, 2592, 2649, 2952, 2592, 2810, 2448, 2461, 2991, 2467, 2592, 2592, 2329, 2817, 2474, 2990, 2466, 2592, 2592, 2373, 2447, 2992, 2469, 2592, 2592, 2592, 2373, 2447, 2477, 2468, 2592, 2592, 2353, 2469, 2592, 2495, 2592, 2592, 2415, 2483, 2592, 2415, 2496, 2592, 2592, 2352, 2592, 2592, 2352, 2352, 2469, 2592, 2592, 2363, 2331, 2494, 2592, 2592, 2592, 2375, 2592, 2375, 2415, 2504, 2592, 2592, 2367, 2372, 2503, 2592, 2592, 2592, 2389, 2418, 2415, 2592, 2592, 2373, 2592, 2592, 2592, 2593, 2732, 2417, 2415, 2592, 2417, 2520, 2592, 2592, 2592, 2390, 2521, 2521, 2592, 2592, 2592, 2401, 2599, 2585, 2526, 2531, 2120, 2592, 2212, 2426, 2450, 2463, 2948, 2592, 2592, 2592, 2213, 2389, 2527, 2532, 2121, 2542, 2551, 2105, 2592, 2213, 2592, 2592, 2592, 2558, 2538, 2544, 2553, 2557, 2537, 2543, 2552, 2421, 2572, 2576, 2546, 2543, 2547, 2592, 2592, 2373, 2615, 2575, 2545, 2105, 2592, 2244, 2479, 2592, 2129, 2592, 2592, 2628, 2690, 2469, 2562, 2566, 2592, 2592, 2592, 2415, 2928, 2934, 2401, 2570, 2574, 2564, 2572, 2585, 2590, 2592, 2592, 2585, 2965, 2592, 2592, 2592, 2445, 2251, 2592, 2592, 2592, 2474, 2592, 2609, 2892, 2592, 2362, 2592, 2592, 2138, 2851, 2159, 2592, 2592, 2592, 2509, 2888, 2892, 2592, 2592, 2592, 2490, 2418, 2891, 2592, 2592, 2376, 2592, 2592, 2374, 2592, 2889, 2388, 2592, 2373, 2373, 2890, 2592, 2592, 2387, 2592, 2887, 2505, 2892, 2592, 2373, 2610, 2388, 2592, 2592, 2376, 2373, 2592, 2887, 2891, 2592, 2374, 2592, 2592, 2608, 2159, 2614, 2620, 2592, 2592, 2394, 2594, 2887, 2399, 2592, 2887, 2397, 2508, 2374, 2507, 2592, 2375, 2592, 2592, 2592, 2595, 2508, 2506, 2592, 2506, 2505, 2505, 2592, 2507, 2637, 2505, 2592, 2592, 2401, 2661, 2592, 2643, 2592, 2592, 2417, 2592, 2655, 2592, 2592, 2592, 2510, 2414, 2656, 2592, 2592, 2592, 2516, 2592, 2593, 2660, 2665, 2880, 2592, 2592, 2592, 2522, 2767, 2666, 2881, 2592, 2592, 2420, 2571, 2696, 2592, 2592, 2592, 2580, 2572, 2686, 2632, 2698, 2592, 2383, 2514, 2592, 2163, 2932, 2465, 2685, 2631, 2697, 2592, 2388, 2592, 2592, 2212, 2604, 2671, 2632, 2678, 2592, 2401, 2405, 2409, 2592, 2592, 2592, 2679, 2592, 2592, 2592, 2592, 2108, 2677, 2591, 2592, 2592, 2592, 2419, 2592, 2683, 2187, 2191, 2469, 2671, 2189, 2467, 2592, 2401, 2629, 2633, 2702, 2468, 2592, 2592, 2421, 2536, 2703, 2469, 2592, 2592, 2422, 2573, 2593, 2672, 2467, 2592, 2402, 2406, 2592, 2402, 2979, 2592, 2592, 2626, 2673, 2467, 2592, 2446, 2259, 2947, 2592, 2377, 2709, 2592, 2592, 2522, 2862, 2713, 2468, 2592, 2592, 2581, 2572, 2562, 2374, 2374, 2592, 2376, 2721, 2724, 2592, 2592, 2624, 2373, 2731, 2592, 2592, 2592, 2626, 2732, 2592, 2592, 2592, 2755, 2656, 2726, 2736, 2741, 2592, 2486, 2593, 2381, 2592, 2727, 2737, 2742, 2715, 2747, 2753, 2592, 2498, 2469, 2873, 2743, 2592, 2592, 2592, 2791, 2759, 2763, 2592, 2592, 2627, 2704, 2592, 2592, 2522, 2789, 2593, 2761, 2753, 2592, 2498, 2863, 2592, 2592, 2767, 2592, 2592, 2592, 2792, 2789, 2592, 2592, 2592, 2803, 2126, 2592, 2592, 2592, 2811, 2122, 2592, 2592, 2592, 2834, 2777, 2592, 2592, 2592, 2848, 2936, 2591, 2489, 2797, 2592, 2592, 2670, 2631, 2490, 2798, 2592, 2592, 2592, 2963, 2807, 2592, 2592, 2592, 2965, 2838, 2592, 2592, 2592, 2975, 2330, 2818, 2829, 2592, 2498, 2939, 2592, 2498, 2592, 2791, 2331, 2819, 2830, 2592, 2592, 2592, 2982, 2834, 2817, 2828, 2106, 2592, 2592, 2592, 2405, 2405, 2817, 2828, 2592, 2592, 2415, 2849, 2842, 2592, 2522, 2773, 2592, 2522, 2868, 2592, 2580, 2600, 2586, 2137, 2850, 2843, 2592, 2592, 2855, 2937, 2844, 2592, 2592, 2592, 2987, 2936, 2591, 2592, 2592, 2684, 2630, 2592, 2856, 2938, 2592, 2592, 2860, 2939, 2592, 2592, 2872, 2592, 2861, 2591, 2592, 2592, 2887, 2616, 2592, 2867, 2592, 2592, 2708, 2592, 2498, 2469, 2498, 2497, 2785, 2773, 2499, 2783, 2770, 2877, 2877, 2877, 2772, 2592, 2592, 2345, 2885, 2592, 2592, 2592, 2715, 2762, 2515, 2896, 2592, 2592, 2715, 2917, 2516, 2897, 2592, 2592, 2592, 2901, 2906, 2911, 2592, 2592, 2956, 2960, 2715, 2902, 2907, 2912, 2593, 2916, 2920, 2820, 2922, 2822, 2592, 2592, 2715, 2927, 2921, 2821, 2106, 2592, 2592, 2974, 2408, 2321, 2821, 2106, 2592, 2592, 2983, 2592, 2593, 2404, 2408, 2592, 2592, 2717, 2749, 2716, 2928, 2322, 2822, 2593, 2926, 2919, 2820, 2934, 2823, 2592, 2592, 2592, 2651, 2824, 2592, 2592, 2592, 2130, 2952, 2592, 2592, 2592, 2592, 2964, 2592, 2592, 2716, 2748, 2592, 2969, 2592, 2592, 2716, 2918, 2368, 2970, 2592, 2592, 2592, 2403, 2407, 2592, 2592, 2787, 2211, 2404, 2409, 2592, 2592, 2802, 2837, 2987, 2592, 2592, 2592, 2809, 2427, 2592, 2793, 2592, 2592, 2809, 2447, 1073741824, 0x80000000, 539754496, 542375936, 402653184, 554434560, 571736064, 545521856, 268451840, 335544320, 268693630, 512, 2048, 256, 1024, 0, 1024, 0, 1073741824, 0x80000000, 0, 0, 0, 8388608, 0, 0, 1073741824, 1073741824, 0, 0x80000000, 537133056, 4194304, 1048576, 268435456, -1073741824, 0, 0, 0, 1048576, 0, 0, 0, 1572864, 0, 0, 0, 4194304, 0, 134217728, 16777216, 0, 0, 32, 64, 98304, 0, 33554432, 8388608, 192, 67108864, 67108864, 67108864, 67108864, 16, 32, 4, 0, 8192, 196608, 196608, 229376, 80, 4096, 524288, 8388608, 0, 0, 32, 128, 256, 24576, 24600, 24576, 24576, 2, 24576, 24576, 24576, 24584, 24592, 24576, 24578, 24576, 24578, 24576, 24576, 16, 512, 2048, 2048, 256, 4096, 32768, 1048576, 4194304, 67108864, 134217728, 268435456, 262144, 134217728, 0, 128, 128, 64, 16384, 16384, 16384, 67108864, 32, 32, 4, 4, 4096, 262144, 134217728, 0, 0, 0, 2, 0, 8192, 131072, 131072, 4096, 4096, 4096, 4096, 24576, 24576, 24576, 8, 8, 24576, 24576, 16384, 16384, 16384, 24576, 24584, 24576, 24576, 24576, 16384, 24576, 536870912, 262144, 0, 0, 32, 2048, 8192, 4, 4096, 4096, 4096, 786432, 8388608, 16777216, 0, 128, 16384, 16384, 16384, 32768, 65536, 2097152, 32, 32, 32, 32, 4, 4, 4, 4, 4, 4096, 67108864, 67108864, 67108864, 24576, 24576, 24576, 24576, 0, 16384, 16384, 16384, 16384, 67108864, 67108864, 8, 67108864, 24576, 8, 8, 8, 24576, 24576, 24576, 24578, 24576, 24576, 24576, 2, 2, 2, 16384, 67108864, 67108864, 67108864, 32, 67108864, 8, 8, 24576, 2048, 0x80000000, 536870912, 262144, 262144, 262144, 67108864, 8, 24576, 16384, 32768, 1048576, 4194304, 25165824, 67108864, 24576, 32770, 2, 4, 112, 512, 98304, 524288, 50, 402653186, 1049090, 1049091, 10, 66, 100925514, 10, 66, 12582914, 0, 0, -1678194207, -1678194207, -1041543218, 0, 32768, 0, 0, 32, 65536, 268435456, 1, 1, 513, 1048577, 0, 12582912, 0, 0, 0, 4, 1792, 0, 0, 0, 7, 29360128, 0, 0, 0, 8, 0, 0, 0, 12, 1, 1, 0, 0, -604102721, -604102721, 4194304, 8388608, 0, 0, 0, 31, 925600, 997981306, 997981306, 997981306, 0, 0, 2048, 8388608, 0, 0, 1, 2, 4, 32, 64, 512, 8192, 0, 0, 0, 245760, 997720064, 0, 0, 0, 32, 0, 0, 0, 3, 12, 16, 32, 8, 112, 3072, 12288, 16384, 32768, 65536, 131072, 7864320, 16777216, 973078528, 0, 0, 65536, 131072, 3670016, 4194304, 16777216, 33554432, 2, 8, 48, 2048, 8192, 16384, 32768, 65536, 131072, 524288, 131072, 524288, 3145728, 4194304, 16777216, 33554432, 65536, 131072, 2097152, 4194304, 16777216, 33554432, 134217728, 268435456, 536870912, 0, 0, 0, 1024, 0, 8, 48, 2048, 8192, 65536, 33554432, 268435456, 536870912, 65536, 268435456, 536870912, 0, 0, 32768, 0, 0, 126, 623104, 65011712, 0, 32, 65536, 536870912, 0, 0, 65536, 524288, 0, 32, 65536, 0, 0, 0, 2048, 0, 0, 0, 15482, 245760, -604102721, 0, 0, 0, 18913, 33062912, 925600, -605028352, 0, 0, 0, 65536, 31, 8096, 131072, 786432, 3145728, 3145728, 12582912, 50331648, 134217728, 268435456, 160, 256, 512, 7168, 131072, 786432, 131072, 786432, 1048576, 2097152, 12582912, 16777216, 268435456, 1073741824, 0x80000000, 12582912, 16777216, 33554432, 268435456, 1073741824, 0x80000000, 3, 12, 16, 160, 256, 7168, 786432, 1048576, 12582912, 16777216, 268435456, 1073741824, 0, 8, 16, 32, 128, 256, 512, 7168, 786432, 1048576, 2097152, 0, 1, 2, 8, 16, 7168, 786432, 1048576, 8388608, 16777216, 16777216, 1073741824, 0, 0, 0, 0, 1, 0, 0, 8, 32, 128, 256, 7168, 8, 32, 0, 3072, 0, 8, 32, 3072, 4096, 524288, 8, 32, 0, 0, 3072, 4096, 0, 2048, 524288, 8388608, 8, 2048, 0, 0, 1, 12, 256, 4096, 32768, 262144, 1048576, 4194304, 67108864, 0, 2048, 0, 2048, 2048, 1073741824, -58805985, -58805985, -58805985, 0, 0, 262144, 0, 0, 32, 4194304, 16777216, 134217728, 4382, 172032, -58982400, 0, 0, 2, 28, 256, 4096, 8192, 8192, 32768, 131072, 262144, 524288, 1, 2, 12, 256, 4096, 0, 0, 4194304, 67108864, 134217728, 805306368, 1073741824, 0, 0, 1, 2, 12, 16, 256, 4096, 1048576, 67108864, 134217728, 268435456, 0, 512, 1048576, 4194304, 201326592, 1879048192, 0, 0, 12, 256, 4096, 134217728, 268435456, 536870912, 12, 256, 268435456, 536870912, 0, 12, 256, 0, 0, 1, 32, 64, 512, 0, 0, 205236961, 205236961, 0, 0, 0, 1, 96, 640, 1, 10976, 229376, 204996608, 0, 640, 2048, 8192, 229376, 1572864, 1572864, 2097152, 201326592, 0, 0, 0, 64, 512, 2048, 229376, 1572864, 201326592, 1572864, 201326592, 0, 0, 1, 4382, 0, 1, 32, 2048, 65536, 131072, 1572864, 201326592, 131072, 1572864, 134217728, 0, 0, 524288, 524288, 0, 0, 0, -68582786, -68582786, -68582786, 0, 0, 2097152, 524288, 0, 524288, 0, 0, 65536, 131072, 1572864, 0, 0, 2, 4, 0, 0, 65011712, -134217728, 0, 0, 0, 0, 2, 4, 120, 512, -268435456, 0, 0, 0, 2, 8, 48, 64, 2048, 8192, 98304, 524288, 2097152, 4194304, 25165824, 33554432, 134217728, 268435456, 0x80000000, 0, 0, 25165824, 33554432, 134217728, 1879048192, 0x80000000, 0, 0, 4, 112, 512, 622592, 65011712, 134217728, -268435456, 16777216, 33554432, 134217728, 1610612736, 0, 0, 0, 64, 98304, 524288, 4194304, 16777216, 33554432, 0, 98304, 524288, 16777216, 33554432, 0, 65536, 524288, 33554432, 536870912, 1073741824, 0, 65536, 524288, 536870912, 1073741824, 0, 0, 65536, 524288, 536870912, 0, 524288, 0, 524288, 524288, 1048576, 2086666240, 0x80000000, 0, -1678194207, 0, 0, 0, 8, 32, 2048, 524288, 8388608, 0, 0, 33062912, 436207616, 0x80000000, 0, 0, 32, 64, 2432, 16384, 32768, 32768, 524288, 3145728, 4194304, 25165824, 25165824, 167772160, 268435456, 0x80000000, 0, 32, 64, 384, 2048, 16384, 32768, 1048576, 2097152, 4194304, 25165824, 32, 64, 128, 256, 2048, 16384, 2048, 16384, 1048576, 4194304, 16777216, 33554432, 134217728, 536870912, 1073741824, 0, 0, 2048, 16384, 4194304, 16777216, 33554432, 134217728, 805306368, 0, 0, 16777216, 134217728, 268435456, 0x80000000, 0, 622592, 622592, 622592, 8807, 8807, 434791, 0, 0, 16777216, 0, 0, 0, 7, 608, 8192, 0, 0, 0, 3, 4, 96, 512, 32, 64, 8192, 0, 0, 16777216, 134217728, 0, 0, 2, 4, 8192, 16384, 65536, 2097152, 33554432, 268435456 +]; + +XQueryTokenizer.TOKEN = +[ + "(0)", + "ModuleDecl", + "Annotation", + "OptionDecl", + "Operator", + "Variable", + "Tag", + "EndTag", + "PragmaContents", + "DirCommentContents", + "DirPIContents", + "CDataSectionContents", + "AttrTest", + "Wildcard", + "EQName", + "IntegerLiteral", + "DecimalLiteral", + "DoubleLiteral", + "PredefinedEntityRef", + "'\"\"'", + "EscapeApos", + "QuotChar", + "AposChar", + "ElementContentChar", + "QuotAttrContentChar", + "AposAttrContentChar", + "NCName", + "QName", + "S", + "CharRef", + "CommentContents", + "DocTag", + "DocCommentContents", + "EOF", + "'!'", + "'\"'", + "'#'", + "'#)'", + "''''", + "'('", + "'(#'", + "'(:'", + "'(:~'", + "')'", + "'*'", + "'*'", + "','", + "'-->'", + "'.'", + "'/'", + "'/>'", + "':'", + "':)'", + "';'", + "'"){ + return this.createToken(Tokens.CDC, text, startLine, startCol); + } else { + reader.reset(); + return this.charToken(first, startLine, startCol); + } + }, + identOrFunctionToken: function(first, startLine, startCol){ + var reader = this._reader, + ident = this.readName(first), + tt = Tokens.IDENT; + if (reader.peek() == "("){ + ident += reader.read(); + if (ident.toLowerCase() == "url("){ + tt = Tokens.URI; + ident = this.readURI(ident); + if (ident.toLowerCase() == "url("){ + tt = Tokens.FUNCTION; + } + } else { + tt = Tokens.FUNCTION; + } + } else if (reader.peek() == ":"){ //might be an IE function + if (ident.toLowerCase() == "progid"){ + ident += reader.readTo("("); + tt = Tokens.IE_FUNCTION; + } + } + + return this.createToken(tt, ident, startLine, startCol); + }, + importantToken: function(first, startLine, startCol){ + var reader = this._reader, + important = first, + tt = Tokens.CHAR, + temp, + c; + + reader.mark(); + c = reader.read(); + + while(c){ + if (c == "/"){ + if (reader.peek() != "*"){ + break; + } else { + temp = this.readComment(c); + if (temp === ""){ //broken! + break; + } + } + } else if (isWhitespace(c)){ + important += c + this.readWhitespace(); + } else if (/i/i.test(c)){ + temp = reader.readCount(8); + if (/mportant/i.test(temp)){ + important += c + temp; + tt = Tokens.IMPORTANT_SYM; + + } + break; //we're done + } else { + break; + } + + c = reader.read(); + } + + if (tt == Tokens.CHAR){ + reader.reset(); + return this.charToken(first, startLine, startCol); + } else { + return this.createToken(tt, important, startLine, startCol); + } + + + }, + notToken: function(first, startLine, startCol){ + var reader = this._reader, + text = first; + + reader.mark(); + text += reader.readCount(4); + + if (text.toLowerCase() == ":not("){ + return this.createToken(Tokens.NOT, text, startLine, startCol); + } else { + reader.reset(); + return this.charToken(first, startLine, startCol); + } + }, + numberToken: function(first, startLine, startCol){ + var reader = this._reader, + value = this.readNumber(first), + ident, + tt = Tokens.NUMBER, + c = reader.peek(); + + if (isIdentStart(c)){ + ident = this.readName(reader.read()); + value += ident; + + if (/^em$|^ex$|^px$|^gd$|^rem$|^vw$|^vh$|^vm$|^ch$|^cm$|^mm$|^in$|^pt$|^pc$/i.test(ident)){ + tt = Tokens.LENGTH; + } else if (/^deg|^rad$|^grad$/i.test(ident)){ + tt = Tokens.ANGLE; + } else if (/^ms$|^s$/i.test(ident)){ + tt = Tokens.TIME; + } else if (/^hz$|^khz$/i.test(ident)){ + tt = Tokens.FREQ; + } else if (/^dpi$|^dpcm$/i.test(ident)){ + tt = Tokens.RESOLUTION; + } else { + tt = Tokens.DIMENSION; + } + + } else if (c == "%"){ + value += reader.read(); + tt = Tokens.PERCENTAGE; + } + + return this.createToken(tt, value, startLine, startCol); + }, + stringToken: function(first, startLine, startCol){ + var delim = first, + string = first, + reader = this._reader, + prev = first, + tt = Tokens.STRING, + c = reader.read(); + + while(c){ + string += c; + if (c == delim && prev != "\\"){ + break; + } + if (isNewLine(reader.peek()) && c != "\\"){ + tt = Tokens.INVALID; + break; + } + prev = c; + c = reader.read(); + } + if (c === null){ + tt = Tokens.INVALID; + } + + return this.createToken(tt, string, startLine, startCol); + }, + + unicodeRangeToken: function(first, startLine, startCol){ + var reader = this._reader, + value = first, + temp, + tt = Tokens.CHAR; + if (reader.peek() == "+"){ + reader.mark(); + value += reader.read(); + value += this.readUnicodeRangePart(true); + if (value.length == 2){ + reader.reset(); + } else { + + tt = Tokens.UNICODE_RANGE; + if (value.indexOf("?") == -1){ + + if (reader.peek() == "-"){ + reader.mark(); + temp = reader.read(); + temp += this.readUnicodeRangePart(false); + if (temp.length == 1){ + reader.reset(); + } else { + value += temp; + } + } + + } + } + } + + return this.createToken(tt, value, startLine, startCol); + }, + whitespaceToken: function(first, startLine, startCol){ + var reader = this._reader, + value = first + this.readWhitespace(); + return this.createToken(Tokens.S, value, startLine, startCol); + }, + + readUnicodeRangePart: function(allowQuestionMark){ + var reader = this._reader, + part = "", + c = reader.peek(); + while(isHexDigit(c) && part.length < 6){ + reader.read(); + part += c; + c = reader.peek(); + } + if (allowQuestionMark){ + while(c == "?" && part.length < 6){ + reader.read(); + part += c; + c = reader.peek(); + } + } + + return part; + }, + + readWhitespace: function(){ + var reader = this._reader, + whitespace = "", + c = reader.peek(); + + while(isWhitespace(c)){ + reader.read(); + whitespace += c; + c = reader.peek(); + } + + return whitespace; + }, + readNumber: function(first){ + var reader = this._reader, + number = first, + hasDot = (first == "."), + c = reader.peek(); + + + while(c){ + if (isDigit(c)){ + number += reader.read(); + } else if (c == "."){ + if (hasDot){ + break; + } else { + hasDot = true; + number += reader.read(); + } + } else { + break; + } + + c = reader.peek(); + } + + return number; + }, + readString: function(){ + var reader = this._reader, + delim = reader.read(), + string = delim, + prev = delim, + c = reader.peek(); + + while(c){ + c = reader.read(); + string += c; + if (c == delim && prev != "\\"){ + break; + } + if (isNewLine(reader.peek()) && c != "\\"){ + string = ""; + break; + } + prev = c; + c = reader.peek(); + } + if (c === null){ + string = ""; + } + + return string; + }, + readURI: function(first){ + var reader = this._reader, + uri = first, + inner = "", + c = reader.peek(); + + reader.mark(); + while(c && isWhitespace(c)){ + reader.read(); + c = reader.peek(); + } + if (c == "'" || c == "\""){ + inner = this.readString(); + } else { + inner = this.readURL(); + } + + c = reader.peek(); + while(c && isWhitespace(c)){ + reader.read(); + c = reader.peek(); + } + if (inner === "" || c != ")"){ + uri = first; + reader.reset(); + } else { + uri += inner + reader.read(); + } + + return uri; + }, + readURL: function(){ + var reader = this._reader, + url = "", + c = reader.peek(); + while (/^[!#$%&\\*-~]$/.test(c)){ + url += reader.read(); + c = reader.peek(); + } + + return url; + + }, + readName: function(first){ + var reader = this._reader, + ident = first || "", + c = reader.peek(); + + while(true){ + if (c == "\\"){ + ident += this.readEscape(reader.read()); + c = reader.peek(); + } else if(c && isNameChar(c)){ + ident += reader.read(); + c = reader.peek(); + } else { + break; + } + } + + return ident; + }, + + readEscape: function(first){ + var reader = this._reader, + cssEscape = first || "", + i = 0, + c = reader.peek(); + + if (isHexDigit(c)){ + do { + cssEscape += reader.read(); + c = reader.peek(); + } while(c && isHexDigit(c) && ++i < 6); + } + + if (cssEscape.length == 3 && /\s/.test(c) || + cssEscape.length == 7 || cssEscape.length == 1){ + reader.read(); + } else { + c = ""; + } + + return cssEscape + c; + }, + + readComment: function(first){ + var reader = this._reader, + comment = first || "", + c = reader.read(); + + if (c == "*"){ + while(c){ + comment += c; + if (comment.length > 2 && c == "*" && reader.peek() == "/"){ + comment += reader.read(); + break; + } + + c = reader.read(); + } + + return comment; + } else { + return ""; + } + + } +}); + + +var Tokens = [ + { name: "CDO"}, + { name: "CDC"}, + { name: "S", whitespace: true/*, channel: "ws"*/}, + { name: "COMMENT", comment: true, hide: true, channel: "comment" }, + { name: "INCLUDES", text: "~="}, + { name: "DASHMATCH", text: "|="}, + { name: "PREFIXMATCH", text: "^="}, + { name: "SUFFIXMATCH", text: "$="}, + { name: "SUBSTRINGMATCH", text: "*="}, + { name: "STRING"}, + { name: "IDENT"}, + { name: "HASH"}, + { name: "IMPORT_SYM", text: "@import"}, + { name: "PAGE_SYM", text: "@page"}, + { name: "MEDIA_SYM", text: "@media"}, + { name: "FONT_FACE_SYM", text: "@font-face"}, + { name: "CHARSET_SYM", text: "@charset"}, + { name: "NAMESPACE_SYM", text: "@namespace"}, + { name: "UNKNOWN_SYM" }, + { name: "KEYFRAMES_SYM", text: [ "@keyframes", "@-webkit-keyframes", "@-moz-keyframes", "@-o-keyframes" ] }, + { name: "IMPORTANT_SYM"}, + { name: "LENGTH"}, + { name: "ANGLE"}, + { name: "TIME"}, + { name: "FREQ"}, + { name: "DIMENSION"}, + { name: "PERCENTAGE"}, + { name: "NUMBER"}, + { name: "URI"}, + { name: "FUNCTION"}, + { name: "UNICODE_RANGE"}, + { name: "INVALID"}, + { name: "PLUS", text: "+" }, + { name: "GREATER", text: ">"}, + { name: "COMMA", text: ","}, + { name: "TILDE", text: "~"}, + { name: "NOT"}, + { name: "TOPLEFTCORNER_SYM", text: "@top-left-corner"}, + { name: "TOPLEFT_SYM", text: "@top-left"}, + { name: "TOPCENTER_SYM", text: "@top-center"}, + { name: "TOPRIGHT_SYM", text: "@top-right"}, + { name: "TOPRIGHTCORNER_SYM", text: "@top-right-corner"}, + { name: "BOTTOMLEFTCORNER_SYM", text: "@bottom-left-corner"}, + { name: "BOTTOMLEFT_SYM", text: "@bottom-left"}, + { name: "BOTTOMCENTER_SYM", text: "@bottom-center"}, + { name: "BOTTOMRIGHT_SYM", text: "@bottom-right"}, + { name: "BOTTOMRIGHTCORNER_SYM", text: "@bottom-right-corner"}, + { name: "LEFTTOP_SYM", text: "@left-top"}, + { name: "LEFTMIDDLE_SYM", text: "@left-middle"}, + { name: "LEFTBOTTOM_SYM", text: "@left-bottom"}, + { name: "RIGHTTOP_SYM", text: "@right-top"}, + { name: "RIGHTMIDDLE_SYM", text: "@right-middle"}, + { name: "RIGHTBOTTOM_SYM", text: "@right-bottom"}, + { name: "RESOLUTION", state: "media"}, + { name: "IE_FUNCTION" }, + { name: "CHAR" }, + { + name: "PIPE", + text: "|" + }, + { + name: "SLASH", + text: "/" + }, + { + name: "MINUS", + text: "-" + }, + { + name: "STAR", + text: "*" + }, + + { + name: "LBRACE", + text: "{" + }, + { + name: "RBRACE", + text: "}" + }, + { + name: "LBRACKET", + text: "[" + }, + { + name: "RBRACKET", + text: "]" + }, + { + name: "EQUALS", + text: "=" + }, + { + name: "COLON", + text: ":" + }, + { + name: "SEMICOLON", + text: ";" + }, + + { + name: "LPAREN", + text: "(" + }, + { + name: "RPAREN", + text: ")" + }, + { + name: "DOT", + text: "." + } +]; + +(function(){ + + var nameMap = [], + typeMap = {}; + + Tokens.UNKNOWN = -1; + Tokens.unshift({name:"EOF"}); + for (var i=0, len = Tokens.length; i < len; i++){ + nameMap.push(Tokens[i].name); + Tokens[Tokens[i].name] = i; + if (Tokens[i].text){ + if (Tokens[i].text instanceof Array){ + for (var j=0; j < Tokens[i].text.length; j++){ + typeMap[Tokens[i].text[j]] = i; + } + } else { + typeMap[Tokens[i].text] = i; + } + } + } + + Tokens.name = function(tt){ + return nameMap[tt]; + }; + + Tokens.type = function(c){ + return typeMap[c] || -1; + }; + +})(); +var Validation = { + + validate: function(property, value){ + var name = property.toString().toLowerCase(), + parts = value.parts, + expression = new PropertyValueIterator(value), + spec = Properties[name], + part, + valid, + j, count, + msg, + types, + last, + literals, + max, multi, group; + + if (!spec) { + if (name.indexOf("-") !== 0){ //vendor prefixed are ok + throw new ValidationError("Unknown property '" + property + "'.", property.line, property.col); + } + } else if (typeof spec != "number"){ + if (typeof spec == "string"){ + if (spec.indexOf("||") > -1) { + this.groupProperty(spec, expression); + } else { + this.singleProperty(spec, expression, 1); + } + + } else if (spec.multi) { + this.multiProperty(spec.multi, expression, spec.comma, spec.max || Infinity); + } else if (typeof spec == "function") { + spec(expression); + } + + } + + }, + + singleProperty: function(types, expression, max, partial) { + + var result = false, + value = expression.value, + count = 0, + part; + + while (expression.hasNext() && count < max) { + result = ValidationTypes.isAny(expression, types); + if (!result) { + break; + } + count++; + } + + if (!result) { + if (expression.hasNext() && !expression.isFirst()) { + part = expression.peek(); + throw new ValidationError("Expected end of value but found '" + part + "'.", part.line, part.col); + } else { + throw new ValidationError("Expected (" + types + ") but found '" + value + "'.", value.line, value.col); + } + } else if (expression.hasNext()) { + part = expression.next(); + throw new ValidationError("Expected end of value but found '" + part + "'.", part.line, part.col); + } + + }, + + multiProperty: function (types, expression, comma, max) { + + var result = false, + value = expression.value, + count = 0, + sep = false, + part; + + while(expression.hasNext() && !result && count < max) { + if (ValidationTypes.isAny(expression, types)) { + count++; + if (!expression.hasNext()) { + result = true; + + } else if (comma) { + if (expression.peek() == ",") { + part = expression.next(); + } else { + break; + } + } + } else { + break; + + } + } + + if (!result) { + if (expression.hasNext() && !expression.isFirst()) { + part = expression.peek(); + throw new ValidationError("Expected end of value but found '" + part + "'.", part.line, part.col); + } else { + part = expression.previous(); + if (comma && part == ",") { + throw new ValidationError("Expected end of value but found '" + part + "'.", part.line, part.col); + } else { + throw new ValidationError("Expected (" + types + ") but found '" + value + "'.", value.line, value.col); + } + } + + } else if (expression.hasNext()) { + part = expression.next(); + throw new ValidationError("Expected end of value but found '" + part + "'.", part.line, part.col); + } + + }, + + groupProperty: function (types, expression, comma) { + + var result = false, + value = expression.value, + typeCount = types.split("||").length, + groups = { count: 0 }, + partial = false, + name, + part; + + while(expression.hasNext() && !result) { + name = ValidationTypes.isAnyOfGroup(expression, types); + if (name) { + if (groups[name]) { + break; + } else { + groups[name] = 1; + groups.count++; + partial = true; + + if (groups.count == typeCount || !expression.hasNext()) { + result = true; + } + } + } else { + break; + } + } + + if (!result) { + if (partial && expression.hasNext()) { + part = expression.peek(); + throw new ValidationError("Expected end of value but found '" + part + "'.", part.line, part.col); + } else { + throw new ValidationError("Expected (" + types + ") but found '" + value + "'.", value.line, value.col); + } + } else if (expression.hasNext()) { + part = expression.next(); + throw new ValidationError("Expected end of value but found '" + part + "'.", part.line, part.col); + } + } + + + +}; +function ValidationError(message, line, col){ + this.col = col; + this.line = line; + this.message = message; + +} +ValidationError.prototype = new Error(); +var ValidationTypes = { + + isLiteral: function (part, literals) { + var text = part.text.toString().toLowerCase(), + args = literals.split(" | "), + i, len, found = false; + + for (i=0,len=args.length; i < len && !found; i++){ + if (text == args[i].toLowerCase()){ + found = true; + } + } + + return found; + }, + + isSimple: function(type) { + return !!this.simple[type]; + }, + + isComplex: function(type) { + return !!this.complex[type]; + }, + isAny: function (expression, types) { + var args = types.split(" | "), + i, len, found = false; + + for (i=0,len=args.length; i < len && !found && expression.hasNext(); i++){ + found = this.isType(expression, args[i]); + } + + return found; + }, + isAnyOfGroup: function(expression, types) { + var args = types.split(" || "), + i, len, found = false; + + for (i=0,len=args.length; i < len && !found; i++){ + found = this.isType(expression, args[i]); + } + + return found ? args[i-1] : false; + }, + isType: function (expression, type) { + var part = expression.peek(), + result = false; + + if (type.charAt(0) != "<") { + result = this.isLiteral(part, type); + if (result) { + expression.next(); + } + } else if (this.simple[type]) { + result = this.simple[type](part); + if (result) { + expression.next(); + } + } else { + result = this.complex[type](expression); + } + + return result; + }, + + + + simple: { + + "": function(part){ + return ValidationTypes.isLiteral(part, "xx-small | x-small | small | medium | large | x-large | xx-large"); + }, + + "": function(part){ + return ValidationTypes.isLiteral(part, "scroll | fixed | local"); + }, + + "": function(part){ + return part.type == "function" && part.name == "attr"; + }, + + "": function(part){ + return this[""](part) || this[""](part) || part == "none"; + }, + + "": function(part) { + return part.type == "function" && /^(?:\-(?:ms|moz|o|webkit)\-)?(?:repeating\-)?(?:radial\-|linear\-)?gradient/i.test(part); + }, + + "": function(part){ + return ValidationTypes.isLiteral(part, "padding-box | border-box | content-box"); + }, + + "": function(part){ + return part.type == "function" && part.name == "content"; + }, + + "": function(part){ + return ValidationTypes.isLiteral(part, "smaller | larger"); + }, + "": function(part){ + return part.type == "identifier"; + }, + + "": function(part){ + if (part.type == "function" && /^(?:\-(?:ms|moz|o|webkit)\-)?calc/i.test(part)){ + return true; + }else{ + return part.type == "length" || part.type == "number" || part.type == "integer" || part == "0"; + } + }, + + "": function(part){ + return part.type == "color" || part == "transparent"; + }, + + "": function(part){ + return part.type == "number" || this[""](part); + }, + + "": function(part){ + return part.type == "integer"; + }, + + "": function(part){ + return part.type == "integer"; + }, + + "": function(part){ + return part.type == "angle"; + }, + + "": function(part){ + return part.type == "uri"; + }, + + "": function(part){ + return this[""](part); + }, + + "": function(part){ + return part.type == "percentage" || part == "0"; + }, + + "": function(part){ + return this[""](part) || ValidationTypes.isLiteral(part, "thin | medium | thick"); + }, + + "": function(part){ + return ValidationTypes.isLiteral(part, "none | hidden | dotted | dashed | solid | double | groove | ridge | inset | outset"); + }, + + "": function(part){ + return this[""](part) || this[""](part) || ValidationTypes.isLiteral(part, "auto"); + }, + + "": function(part){ + return this[""](part) || this[""](part); + }, + + "": function(part){ + return part.type == "function" && (part.name == "rect" || part.name == "inset-rect"); + }, + + "

ACI8jA}moE`W3}>0x6bFTz!gp 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 #6aqaxg)eYMw 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 G)flq0k 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