From 522a3f7f5153d6ea94b6a493a963b48beb8cd0fd Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=A9mie=20Astor?= Date: Thu, 14 Apr 2022 15:28:18 +0200 Subject: [PATCH] try using GwionSite --- .github/workflows/build.yml | 9 + Makefile | 33 - custom.css | 26 - docs/editor_mine.js | 26 - docs/mode-gwion.js | 250 - scripts/deploy.sh | 7 - scripts/ensure.sh | 9 - scripts/list_benchmarks.sh | 6 - scripts/mdr2mdbook.sh | 48 - scripts/mk_page.sh | 18 - scripts/run.sh | 20 - scripts/summary.sh | 45 - scripts/test.sh | 29 - scripts/update.sh | 20 - scripts/watch.sh | 11 - theme/book.js | 574 - theme/favicon.png | Bin 113510 -> 0 bytes theme/highlight.js | 30008 ---------------------------------- theme/index.hbs | 307 - 19 files changed, 9 insertions(+), 31437 deletions(-) delete mode 100644 Makefile delete mode 100644 custom.css delete mode 100644 docs/editor_mine.js delete mode 100644 docs/mode-gwion.js delete mode 100644 scripts/deploy.sh delete mode 100644 scripts/ensure.sh delete mode 100644 scripts/list_benchmarks.sh delete mode 100644 scripts/mdr2mdbook.sh delete mode 100644 scripts/mk_page.sh delete mode 100644 scripts/run.sh delete mode 100644 scripts/summary.sh delete mode 100644 scripts/test.sh delete mode 100644 scripts/update.sh delete mode 100644 scripts/watch.sh delete mode 100644 theme/book.js delete mode 100644 theme/favicon.png delete mode 100644 theme/highlight.js delete mode 100644 theme/index.hbs diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index aa6634c7..1a155391 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -12,6 +12,15 @@ jobs: - uses: actions/checkout@v1 name: Checkout + - name: Checkout tools repo + uses: actions/checkout@v3 + with: + repository: Gwion/GwionSite + path: GwionSite + + - name: GwionSite tools + run: bash GwionSite/install.sh + - name: Dependencies run: bash scripts/update.sh diff --git a/Makefile b/Makefile deleted file mode 100644 index 04e64fb3..00000000 --- a/Makefile +++ /dev/null @@ -1,33 +0,0 @@ -serve: ensure - @sh scripts/run.sh - -build: ensure - @mdbook build - -deploy: build - @sh scripts/deploy.sh - -ensure: style.css - @sh scripts/ensure.sh - -lint: - vale docs - -clean: - @[ -d src ] && mdbook clean || true - -clean-tests: - @rm -rf *.gw log vlog - -clean-all: clean clean-tests - @rm -rf src - -style.css: ansi2html.sh - @bash ansi2html.sh --css-only > ansi2html.css - -ansi2html.sh: - @curl https://raw.githubusercontent.com/pixelb/scripts/master/scripts/ansi2html.sh -o $@ - -.SUFFIXES: .gw .test -.gw.test: - @bash scripts/test.sh $< "${CONTAINS}" diff --git a/custom.css b/custom.css deleted file mode 100644 index 9305d8df..00000000 --- a/custom.css +++ /dev/null @@ -1,26 +0,0 @@ -.mdr { - color:var(--sidebar-active); - background-color:var(--sidebar-bg); -// border: 1px solid var(--sidebar-fg); - padding: 1%; -// margin-right: 1%; -// margin-left: 1%; -// moz-border-radius: 1%; -// -webkit-border-radius: 1%; - overflow: auto; -} - -footer { - padding: 10px; - text-align: center; - font-size: small; - font-style: italic; -} - -.zoom { - transition: transform .2s; /* Animation */ -} - -.zoom:hover { - transform: scale(1.5); /* (150% zoom - Note: if the zoom is too large, it will go outside of the viewport) */ -} diff --git a/docs/editor_mine.js b/docs/editor_mine.js deleted file mode 100644 index b9b39a73..00000000 --- a/docs/editor_mine.js +++ /dev/null @@ -1,26 +0,0 @@ -"use strict"; -window.editors = []; -(function(editors) { - if (typeof(ace) === 'undefined' || !ace) { - return; - } - Array.from(document.querySelectorAll('.editable')).forEach(function(editable) { - let editor = ace.edit(editable); - editor.setOptions({ - theme: 'ace/theme/tomorrow_night', - mode: 'ace/mode/gwion' - }); - - editable.addEventListener('mouseenter', e => { - editor.setOptions({ - highlightActiveLine: true - }); - }); - editable.addEventListener('mouseleave', e => { - editor.setOptions({ - highlightActiveLine: false - }); - }); - - }); -})(window.editors); diff --git a/docs/mode-gwion.js b/docs/mode-gwion.js deleted file mode 100644 index 7fb88ce6..00000000 --- a/docs/mode-gwion.js +++ /dev/null @@ -1,250 +0,0 @@ -ace.define("ace/mode/gwion_highlight_rules", ["require", "exports", "module", "ace/lib/oop", "ace/mode/text_highlight_rules"], function(e, t, n) { - "use strict"; - var interp = 0; - var r = e("../lib/oop") - , i = e("./text_highlight_rules").TextHighlightRules - , s = /\\(?:[nrt0'"\\]|x[\da-fA-F]{2}|u\{[\da-fA-F]{6}\})/.source - , o = function() { - this.$rules = { - start: [{ - token: "variable.other.source.gwion", - regex: "'[a-zA-Z_][a-zA-Z0-9_]*" - }, { - token: "string.quoted.single.source.gwion", - regex: "'(?:[^'\\\\]|" + s + ")'" - }, { - token: "identifier", - regex: /r#[a-zA-Z_][a-zA-Z0-9_]*\b/ - }, { - stateName: "bracketedComment", - onMatch: function(e, t, n) { - return n.unshift(this.next, e.length - 1, t), - "string.quoted.raw.source.gwion" - }, - regex: /r#*"/, - next: [{ - onMatch: function(e, t, n) { - var r = "string.quoted.raw.source.gwion"; - return e.length >= n[1] ? (e.length > n[1] && (r = "invalid"), - n.shift(), - n.shift(), - this.next = n.shift()) : this.next = "", - r - }, - regex: /"#*/, - next: "start" - }, { - defaultToken: "string.quoted.raw.source.gwion" - }] - }, { - token: "string.quoted.double.source.gwion", - regex: '"', - push: [{ - token: "string.quoted.double.source.gwion", - regex: '"', - next: "pop" - }, { - token: "constant.character.escape.source.gwion", - regex: s - }, { - defaultToken: "string.quoted.double.source.gwion" - }] - }, { - token: ["keyword.source.gwion", "text", "entity.name.function.source.gwion"], - regex: "\\b(fn)(\\s+)((?:r#)?[a-zA-Z_][a-zA-Z0-9_]*)" - }, { - token: "support.constant", - regex: "\\b[a-zA-Z_][\\w\\d]*::" - }, { - token: "keyword.source.gwion", - regex: "\\b(?:abstract|defer|repeat|foreach|break|continue|const|var|late|do|else|enum|for|final|if|extends|match|case|private|protect|global|return|self|static|public|class|struct|fun|operator|funcdef|trait|union|where|when|while|new)\\b" - }, { - token: "storage.type.source.gwion", - regex: "\\b(?:Self|int|float|string|Event|Object|bool|Option|Ref|Array)\\b" - }, { - token: "variable.language.source.gwion", - regex: "\\b(?:self|this|me|adc|dac)\\b" - }, { - token: "comment.line.doc.source.gwion", - regex: "#!!.*$" - }, { - token: "comment.block.source.gwion", - regex: "#!.*!#", - }, { - token: "comment.line.double-dash.source.gwion", - regex: "#!.*$" - }, { - token: "keyword.operator", - regex: /\$|[-=]>|[-+%^=!&|<>~:]=?|[*/](?![*/>])=?/ - }, { - token: "punctuation.operator", - regex: /[?:,;.]/ - }, { - token: "paren.lparen", - regex: /[\[({]/ - }, { - token: "paren.rparen", - regex: /[\])}]/ - }, { - token: "constant.language.source.gwion", - regex: "\\b(?:true|false|maybe|None)\\b" - }, { - token: "support.constant.source.gwion", - regex: "\\b(?:pi|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.gwion", - regex : "#\\s*(?:include|require|pragma|__line__|__file__|__func__|ifdef|undef|define|undef)\\b" - }, { - token: "constant.numeric.source.gwion", - regex: /\b(?:0x[a-fA-F0-9_]+|0o[0-7_]+|0b[01_]+|[0-9][0-9_]*(?!\.))(?:[iu](?:size|8|16|32|64|128))?\b/ - }, { - token: "constant.numeric.source.gwion", - regex: /\b(?:[0-9][0-9_]*)(?:\.[0-9][0-9_]*)?(?:[Ee][+-][0-9][0-9_]*)?(?:f32|f64)?\b/ - }] - }, - this.normalizeRules() - }; - o.metaData = { - fileTypes: ["rs", "rc"], - foldingStartMarker: "^.*\\bfn\\s*(\\w+\\s*)?\\([^\\)]*\\)(\\s*\\{[^\\}]*)?\\s*$", - foldingStopMarker: "^\\s*\\}", - name: "Rust", - scopeName: "source.gwion" - }, - r.inherits(o, i), - t.RustHighlightRules = o -}), -ace.define("ace/mode/folding/cstyle", ["require", "exports", "module", "ace/lib/oop", "ace/range", "ace/mode/folding/fold_mode"], function(e, t, n) { - "use strict"; - var r = e("../../lib/oop") - , i = e("../../range").Range - , s = e("./fold_mode").FoldMode - , o = t.FoldMode = function(e) { - e && (this.foldingStartMarker = new RegExp(this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + e.start)), - this.foldingStopMarker = new RegExp(this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + e.end))) - } - ; - r.inherits(o, s), - function() { - this.foldingStartMarker = /([\{\[\(])[^\}\]\)]*$|^\s*(\/\*)/, - this.foldingStopMarker = /^[^\[\{\(]*([\}\]\)])|^[\s\*]*(\*\/)/, - this.singleLineBlockCommentRe = /^\s*(\/\*).*\*\/\s*$/, - this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/, - this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/, - this._getFoldWidgetBase = this.getFoldWidget, - this.getFoldWidget = function(e, t, n) { - var r = e.getLine(n); - if (this.singleLineBlockCommentRe.test(r) && !this.startRegionRe.test(r) && !this.tripleStarBlockCommentRe.test(r)) - return ""; - var i = this._getFoldWidgetBase(e, t, n); - return !i && this.startRegionRe.test(r) ? "start" : i - } - , - this.getFoldWidgetRange = function(e, t, n, r) { - var i = e.getLine(n); - if (this.startRegionRe.test(i)) - return this.getCommentRegionBlock(e, i, n); - var s = i.match(this.foldingStartMarker); - if (s) { - var o = s.index; - if (s[1]) - return this.openingBracketBlock(e, s[1], n, o); - var u = e.getCommentFoldRange(n, o + s[0].length, 1); - return u && !u.isMultiLine() && (r ? u = this.getSectionRange(e, n) : t != "all" && (u = null)), - u - } - if (t === "markbegin") - return; - var s = i.match(this.foldingStopMarker); - if (s) { - var o = s.index + s[0].length; - return s[1] ? this.closingBracketBlock(e, s[1], n, o) : e.getCommentFoldRange(n, o, -1) - } - } - , - this.getSectionRange = function(e, t) { - var n = e.getLine(t) - , r = n.search(/\S/) - , s = t - , o = n.length; - t += 1; - var u = t - , a = e.getLength(); - while (++t < a) { - n = e.getLine(t); - var f = n.search(/\S/); - if (f === -1) - continue; - if (r > f) - break; - var l = this.getFoldWidgetRange(e, "all", t); - if (l) { - if (l.start.row <= s) - break; - if (l.isMultiLine()) - t = l.end.row; - else if (r == f) - break - } - u = t - } - return new i(s,o,u,e.getLine(u).length) - } - , - this.getCommentRegionBlock = function(e, t, n) { - var r = t.search(/\s*$/) - , s = e.getLength() - , o = n - , u = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/ - , a = 1; - while (++n < s) { - t = e.getLine(n); - var f = u.exec(t); - if (!f) - continue; - f[1] ? a-- : a++; - if (!a) - break - } - var l = n; - if (l > o) - return new i(o,r,l,t.length) - } - } - .call(o.prototype) -}), -ace.define("ace/mode/gwion", ["require", "exports", "module", "ace/lib/oop", "ace/mode/text", "ace/mode/gwion_highlight_rules", "ace/mode/folding/cstyle"], function(e, t, n) { - "use strict"; - var r = e("../lib/oop") - , i = e("./text").Mode - , s = e("./gwion_highlight_rules").RustHighlightRules - , o = e("./folding/cstyle").FoldMode - , u = function() { - this.HighlightRules = s, - this.foldingRules = new o, - this.$behaviour = this.$defaultBehaviour - }; - r.inherits(u, i), - function() { - this.lineCommentStart = "//", - this.blockComment = { - start: "/*", - end: "*/", - nestable: !0 - }, - this.$quotes = { - '"': '"' - }, - this.$id = "ace/mode/gwion" - } - .call(u.prototype), - t.Mode = u -}); -(function() { - ace.require(["ace/mode/gwion"], function(m) { - if (typeof module == "object" && typeof exports == "object" && module) { - module.exports = m; - } - }); -} -)(); diff --git a/scripts/deploy.sh b/scripts/deploy.sh deleted file mode 100644 index f31adb02..00000000 --- a/scripts/deploy.sh +++ /dev/null @@ -1,7 +0,0 @@ -git checkout -b doc_tmp -git branch -r | grep gh-pages && git push origin :gh-pages || true -git add -f book -git commit -m "add book" -git subtree push --prefix book origin gh-pages -git checkout mdbook -git branch -D doc_tmp diff --git a/scripts/ensure.sh b/scripts/ensure.sh deleted file mode 100644 index b539cc97..00000000 --- a/scripts/ensure.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/sh - -for file in $(find docs -type f -name "*.mdr") -do mdr $file -done - -[ -d src ] || bash scripts/mdr2mdbook.sh - -[ -f src/SUMMARY.md ] || bash scripts/summary.sh > src/SUMMARY.md diff --git a/scripts/list_benchmarks.sh b/scripts/list_benchmarks.sh deleted file mode 100644 index 7755e2f4..00000000 --- a/scripts/list_benchmarks.sh +++ /dev/null @@ -1,6 +0,0 @@ -for a in $(find gwion-benchmark/png -type f -name "*.png") -do - png_url="https://raw.githubusercontent.com/Gwion/gwion-benchmark/results/png/$(basename $a)" - test_url="https://github.com/Gwion/gwion-benchmark/blob/master/src/$(basename $a .png).gw" - echo "" -done diff --git a/scripts/mdr2mdbook.sh b/scripts/mdr2mdbook.sh deleted file mode 100644 index edfd542a..00000000 --- a/scripts/mdr2mdbook.sh +++ /dev/null @@ -1,48 +0,0 @@ -#!/bin/bash -footer() { - cat << EOF - - - -EOF -} - -mk_target() { - cmojify "$(cat $1)" | - sed 's/```.*gw/```gw/' | - sed 's#:gwion:#[Gwion](https://github.com/Gwion/Gwion)#g' - footer -} - -ensure_dir() { - mkdir -p $(dirname $1) -} - -doc2src() { - mdr $1 || return - mdfile=${1::-1} - target=$(sed 's/docs/src/' <<< $mdfile) - ensure_dir $target - mk_target $mdfile > $target -# mv $mdfile $target - rm $mdfile -} - -runall() { - list=$(find docs -type f -name "*.mdr") - for file in $list - do doc2src "$file" - done -} - -if [[ "$1" == *".mdr" ]] -then doc2src "$1" -if [ "$(git status -s | grep docs)" ] -then bash scripts/summary.sh > src/SUMMARY.md -fi -else runall -fi -cp docs/*.js src diff --git a/scripts/mk_page.sh b/scripts/mk_page.sh deleted file mode 100644 index 01d6e581..00000000 --- a/scripts/mk_page.sh +++ /dev/null @@ -1,18 +0,0 @@ -NAME=$(echo $1 | sed 's/\.so//') - -mkpage() { -cat << EOF -# $NAME - -compiler generated documentation - -\`\`\`gwion -EOF - -./gwion -p. -P $NAME - -echo '```' -} - -mkpage > docs/Reference/Plugins/$NAME.mdr -echo $NAME.md >> docs/Reference/Plugins/list diff --git a/scripts/run.sh b/scripts/run.sh deleted file mode 100644 index 714edc09..00000000 --- a/scripts/run.sh +++ /dev/null @@ -1,20 +0,0 @@ -sedi () { - sed --version >/dev/null 2>&1 && sed -i -- "$@" || sed -i "" "$@" -} - -run() { - mdbook serve& - sedi 's/^src/#src/' .gitignore - while true - do bash scripts/watch.sh - done -} - -clean() { - trap - SIGINT SIGTERM ERR - killall mdbook - sedi 's/#src/src/' .gitignore - exit 1 -} - -trap clean SIGINT SIGTERM ERR; run diff --git a/scripts/summary.sh b/scripts/summary.sh deleted file mode 100644 index 2ad29231..00000000 --- a/scripts/summary.sh +++ /dev/null @@ -1,45 +0,0 @@ -#!/bin/sh - -# print the offset -tabulate() { - for i in $(seq 1 $1) - do printf " " - done -} - -sign() { - [ "$1" -eq 1 ] && echo "- " -} - -# add an entry to symmary -entry() { - title=$(head -n1 ${1}/${2}r) - if [ "$2" = "README.md" ] && [ $3 -gt 0 ] - then idx=$(($4-1)) - else idx=$4 - fi - tabulate $idx - if [ $1 = "docs" ] - then dir="." - else dir=$(sed 's#docs/##' <<< ${1}) - fi - echo "$(sign $3)[${title:2}]($dir/$2)" -} - -# handle a directory -handle() { - while read -r line - do - if [ -z "$line" ] || [[ "$line" == "-----"* ]] - then echo "$line" - continue - fi - if [ -f "$1/${line}r" ] - then entry $1 $line $2 $(( $3 + 1 )) - elif [ -d "$1/${line}" ] - then handle $1/$line 1 $(( $3 + 1 )) - fi - done < "${1}/list" -} - -handle docs 0 -1 diff --git a/scripts/test.sh b/scripts/test.sh deleted file mode 100644 index 2463f81f..00000000 --- a/scripts/test.sh +++ /dev/null @@ -1,29 +0,0 @@ -NOTERM_OK="✔" -NOTERM_NOT_OK="✘" - -# terminal status -INTERM_OK="\033[32mOK\033[0m" -INTERM_NOT_OK="\033[31mNOT OK\033[0m" - -check() { - for a in $@; - do grep "$a" log >/dev/null || return 1 - done #&& [ -z "${VALGRIND}" ] || return valgrind_parse vlog -} - -interm() { - cat log; check $@ && printf "${INTERM_OK}\n" || printf "${INTERM_NOT_OK}\n" -} - -noterm() { - echo '

' - cat log | bash ansi2html.sh --body-only | sed 's/$/<\/br>/' - echo "
" - check $@ && printf "${NOTERM_OK}\n" || printf "${NOTERM_NOT_OK}\n" - echo '

' - -} - -${VALGRIND} ${VALGRIND_OPT} gwion "$1" &> log -shift -[ -t 1 ] && interm $@ || noterm $@ diff --git a/scripts/update.sh b/scripts/update.sh deleted file mode 100644 index ebbba59a..00000000 --- a/scripts/update.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/bash - -get_latest_release() { - curl --silent "https://api.github.com/repos/$1/$2/releases/latest" | # Get latest release from GitHub api - grep '"browser_download_url"' | grep 'nightly-ubuntu' | - sed -E 's/.*"([^"]+)".*/\1/' # Pluck JSON value -} - -update() { - new_release=$(get_latest_release $1 $2) - file=${2}*.zip - wget "$new_release" - 7z e $file - rm $file -} - -update Gwion gwion -update Gwion gwion-plug -update fennecdjay mdr -update fennecdjay cmojify diff --git a/scripts/watch.sh b/scripts/watch.sh deleted file mode 100644 index 516961c0..00000000 --- a/scripts/watch.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/sh - -wait() { - inotifywait -q -r docs --format "%w%f" | tail -1 -} - -while true -do - file=$(wait) - bash scripts/mdr2mdbook.sh $file; -done diff --git a/theme/book.js b/theme/book.js deleted file mode 100644 index 43a4dedb..00000000 --- a/theme/book.js +++ /dev/null @@ -1,574 +0,0 @@ -"use strict"; - -// Fix back button cache problem -window.onunload = function () { }; - -// Global variable, shared between modules -function playground_text(playground) { - - let code_block = playground.querySelector("code"); - - if (window.ace && code_block.classList.contains("editable")) { - let editor = window.ace.edit(code_block); - return editor.getValue(); - } else { - return code_block.textContent; - } -} - -(function codeSnippets() { - Array.from(document.querySelectorAll(".language-gwion")).forEach((element) => { - let parent = element.parentNode; - let wrapper = document.createElement('pre'); - wrapper.className = 'playground'; - // set the wrapper as child (instead of the element) - parent.replaceChild(wrapper, element); - // set element as child of wrapper - wrapper.appendChild(element); - }); - - - function fetch_with_timeout(url, options, timeout = 60000) { - return Promise.race([ - fetch(url, options), - new Promise((_, reject) => setTimeout(() => reject(new Error('timeout')), timeout)) - ]); - } - - var playgrounds = Array.from(document.querySelectorAll(".playground")); - - function run_gwion_code(code_block) { - var result_block = code_block.querySelector(".result"); - if (!result_block) { - result_block = document.createElement('code'); - result_block.className = 'result hljs f9 b9'; - - result_block.innerHTML = `${result_block.innerHTML}` - code_block.append(result_block); - } - - let text = playground_text(code_block); - - result_block.innerText = "Running..."; - - fetch_with_timeout("https://TheGwionPlayground.fennecdjay.repl.co", { - headers: { - 'Content-Type': "text/plain", - }, - method: 'POST', - mode: 'cors', - body: text - }) - .then(response => response.json()) - .then(response => result_block.innerHTML = response) - .catch(error => result_block.innerText = "Playground Communication: " + error.message); - } - - // Syntax highlighting Configuration - hljs.configure({ - tabReplace: ' ', // 4 spaces - languages: [], // Languages used for auto-detection - }); - - let code_nodes = Array - .from(document.querySelectorAll('code')) - // Don't highlight `inline code` blocks in headers. - .filter(function (node) {return !node.parentElement.classList.contains("header"); }); - - if (window.ace) { - // language-gwion class needs to be removed for editable - // blocks or highlightjs will capture events - Array - .from(document.querySelectorAll('code.editable')) - .forEach(function (block) { - block.classList.remove('language-gwion'); - let editor = window.ace.edit(block); - editor.commands.addCommand({ - name: "run", - bindKey: { - win: "Ctrl-Enter", - mac: "Ctrl-Enter" - }, - exec: _editor => run_gwion_code(block.parentNode) - }); - }); - - Array - .from(document.querySelectorAll('code:not(.editable)')) - .forEach(function (block) { hljs.highlightBlock(block); }); - } else { - code_nodes.forEach(function (block) { hljs.highlightBlock(block); }); - } - - // Adding the hljs class gives code blocks the color css - // even if highlighting doesn't apply - code_nodes.forEach(function (block) { block.classList.add('hljs'); }); - - if (window.playground_copyable) { - Array.from(document.querySelectorAll('pre code')).forEach(function (block) { - var pre_block = block.parentNode; - if (!pre_block.classList.contains('playground')) { - var buttons = pre_block.querySelector(".buttons"); - if (!buttons) { - buttons = document.createElement('div'); - buttons.className = 'buttons'; - pre_block.insertBefore(buttons, pre_block.firstChild); - } - - var clipButton = document.createElement('button'); - clipButton.className = 'fa fa-copy clip-button'; - clipButton.title = 'Copy to clipboard'; - clipButton.setAttribute('aria-label', clipButton.title); - clipButton.innerHTML = ''; - - buttons.insertBefore(clipButton, buttons.firstChild); - } - }); - } - - // Process playground code blocks - Array.from(document.querySelectorAll(".playground")).forEach(function (pre_block) { - // Add play button - var buttons = pre_block.querySelector(".buttons"); - if (!buttons) { - buttons = document.createElement('div'); - buttons.className = 'buttons'; - pre_block.insertBefore(buttons, pre_block.firstChild); - } - - var runCodeButton = document.createElement('button'); - runCodeButton.className = 'fa fa-play play-button'; - runCodeButton.hidden = true; - runCodeButton.title = 'Run this code'; - runCodeButton.setAttribute('aria-label', runCodeButton.title); - - buttons.insertBefore(runCodeButton, buttons.firstChild); - runCodeButton.addEventListener('click', function (e) { - run_gwion_code(pre_block); - }); - - if (window.playground_copyable) { - var copyCodeClipboardButton = document.createElement('button'); - copyCodeClipboardButton.className = 'fa fa-copy clip-button'; - copyCodeClipboardButton.innerHTML = ''; - copyCodeClipboardButton.title = 'Copy to clipboard'; - copyCodeClipboardButton.setAttribute('aria-label', copyCodeClipboardButton.title); - - buttons.insertBefore(copyCodeClipboardButton, buttons.firstChild); - } - - let code_block = pre_block.querySelector("code"); - - - if (window.ace && code_block.classList.contains("editable")) { - var undoChangesButton = document.createElement('button'); - undoChangesButton.className = 'fa fa-history reset-button'; - undoChangesButton.title = 'Undo changes'; - undoChangesButton.setAttribute('aria-label', undoChangesButton.title); - - buttons.insertBefore(undoChangesButton, buttons.firstChild); - - undoChangesButton.addEventListener('click', function () { - let editor = window.ace.edit(code_block); - editor.setValue(editor.originalCode); - editor.clearSelection(); - }); - } - - const play_button = pre_block.querySelector(".play-button"); - - // skip if code is `no_run` - if (pre_block.querySelector('code').classList.contains("no_run")) { - play_button.classList.add("hidden"); - return; - } - }); -})(); - -(function themes() { - var html = document.querySelector('html'); - var themeToggleButton = document.getElementById('theme-toggle'); - var themePopup = document.getElementById('theme-list'); - var themeColorMetaTag = document.querySelector('meta[name="theme-color"]'); - var stylesheets = { - ayuHighlight: document.querySelector("[href$='ayu-highlight.css']"), - tomorrowNight: document.querySelector("[href$='tomorrow-night.css']"), - highlight: document.querySelector("[href$='highlight.css']"), - }; - - function showThemes() { - themePopup.style.display = 'block'; - themeToggleButton.setAttribute('aria-expanded', true); - themePopup.querySelector("button#" + get_theme()).focus(); - } - - function hideThemes() { - themePopup.style.display = 'none'; - themeToggleButton.setAttribute('aria-expanded', false); - themeToggleButton.focus(); - } - - function get_theme() { - var theme; - try { theme = localStorage.getItem('mdbook-theme'); } catch (e) { } - if (theme === null || theme === undefined) { - return default_theme; - } else { - return theme; - } - } - - function set_theme(theme, store = true) { - let ace_theme; - - if (theme == 'coal' || theme == 'navy') { - stylesheets.ayuHighlight.disabled = true; - stylesheets.tomorrowNight.disabled = false; - stylesheets.highlight.disabled = true; - - ace_theme = "ace/theme/tomorrow_night"; - } else if (theme == 'ayu') { - stylesheets.ayuHighlight.disabled = false; - stylesheets.tomorrowNight.disabled = true; - stylesheets.highlight.disabled = true; - ace_theme = "ace/theme/tomorrow_night"; - } else { - stylesheets.ayuHighlight.disabled = true; - stylesheets.tomorrowNight.disabled = true; - stylesheets.highlight.disabled = false; - ace_theme = "ace/theme/dawn"; - } - - setTimeout(function () { - themeColorMetaTag.content = getComputedStyle(document.body).backgroundColor; - }, 1); - - if (window.ace && window.editors) { - window.editors.forEach(function (editor) { - editor.setTheme(ace_theme); - }); - } - - var previousTheme = get_theme(); - - if (store) { - try { localStorage.setItem('mdbook-theme', theme); } catch (e) { } - } - - html.classList.remove(previousTheme); - html.classList.add(theme); - } - - // Set theme - var theme = get_theme(); - - set_theme(theme, false); - - themeToggleButton.addEventListener('click', function () { - if (themePopup.style.display === 'block') { - hideThemes(); - } else { - showThemes(); - } - }); - - themePopup.addEventListener('click', function (e) { - var theme = e.target.id || e.target.parentElement.id; - set_theme(theme); - }); - - themePopup.addEventListener('focusout', function(e) { - // e.relatedTarget is null in Safari and Firefox on macOS (see workaround below) - if (!!e.relatedTarget && !themeToggleButton.contains(e.relatedTarget) && !themePopup.contains(e.relatedTarget)) { - hideThemes(); - } - }); - - // Should not be needed, but it works around an issue on macOS & iOS: https://github.com/rust-lang/mdBook/issues/628 - document.addEventListener('click', function(e) { - if (themePopup.style.display === 'block' && !themeToggleButton.contains(e.target) && !themePopup.contains(e.target)) { - hideThemes(); - } - }); - - document.addEventListener('keydown', function (e) { - if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) { return; } - if (!themePopup.contains(e.target)) { return; } - - switch (e.key) { - case 'Escape': - e.preventDefault(); - hideThemes(); - break; - case 'ArrowUp': - e.preventDefault(); - var li = document.activeElement.parentElement; - if (li && li.previousElementSibling) { - li.previousElementSibling.querySelector('button').focus(); - } - break; - case 'ArrowDown': - e.preventDefault(); - var li = document.activeElement.parentElement; - if (li && li.nextElementSibling) { - li.nextElementSibling.querySelector('button').focus(); - } - break; - case 'Home': - e.preventDefault(); - themePopup.querySelector('li:first-child button').focus(); - break; - case 'End': - e.preventDefault(); - themePopup.querySelector('li:last-child button').focus(); - break; - } - }); -})(); - -(function sidebar() { - var html = document.querySelector("html"); - var sidebar = document.getElementById("sidebar"); - var sidebarLinks = document.querySelectorAll('#sidebar a'); - var sidebarToggleButton = document.getElementById("sidebar-toggle"); - var sidebarResizeHandle = document.getElementById("sidebar-resize-handle"); - var firstContact = null; - - function showSidebar() { - html.classList.remove('sidebar-hidden') - html.classList.add('sidebar-visible'); - Array.from(sidebarLinks).forEach(function (link) { - link.setAttribute('tabIndex', 0); - }); - sidebarToggleButton.setAttribute('aria-expanded', true); - sidebar.setAttribute('aria-hidden', false); - try { localStorage.setItem('mdbook-sidebar', 'visible'); } catch (e) { } - } - - - var sidebarAnchorToggles = document.querySelectorAll('#sidebar a.toggle'); - - function toggleSection(ev) { - ev.currentTarget.parentElement.classList.toggle('expanded'); - } - - Array.from(sidebarAnchorToggles).forEach(function (el) { - el.addEventListener('click', toggleSection); - }); - - function hideSidebar() { - html.classList.remove('sidebar-visible') - html.classList.add('sidebar-hidden'); - Array.from(sidebarLinks).forEach(function (link) { - link.setAttribute('tabIndex', -1); - }); - sidebarToggleButton.setAttribute('aria-expanded', false); - sidebar.setAttribute('aria-hidden', true); - try { localStorage.setItem('mdbook-sidebar', 'hidden'); } catch (e) { } - } - - // Toggle sidebar - sidebarToggleButton.addEventListener('click', function sidebarToggle() { - if (html.classList.contains("sidebar-hidden")) { - var current_width = parseInt( - document.documentElement.style.getPropertyValue('--sidebar-width'), 10); - if (current_width < 150) { - document.documentElement.style.setProperty('--sidebar-width', '150px'); - } - showSidebar(); - } else if (html.classList.contains("sidebar-visible")) { - hideSidebar(); - } else { - if (getComputedStyle(sidebar)['transform'] === 'none') { - hideSidebar(); - } else { - showSidebar(); - } - } - }); - - sidebarResizeHandle.addEventListener('mousedown', initResize, false); - - function initResize(e) { - window.addEventListener('mousemove', resize, false); - window.addEventListener('mouseup', stopResize, false); - html.classList.add('sidebar-resizing'); - } - function resize(e) { - var pos = (e.clientX - sidebar.offsetLeft); - if (pos < 20) { - hideSidebar(); - } else { - if (html.classList.contains("sidebar-hidden")) { - showSidebar(); - } - pos = Math.min(pos, window.innerWidth - 100); - document.documentElement.style.setProperty('--sidebar-width', pos + 'px'); - } - } - //on mouseup remove windows functions mousemove & mouseup - function stopResize(e) { - html.classList.remove('sidebar-resizing'); - window.removeEventListener('mousemove', resize, false); - window.removeEventListener('mouseup', stopResize, false); - } - - document.addEventListener('touchstart', function (e) { - firstContact = { - x: e.touches[0].clientX, - time: Date.now() - }; - }, { passive: true }); - - document.addEventListener('touchmove', function (e) { - if (!firstContact) - return; - - var curX = e.touches[0].clientX; - var xDiff = curX - firstContact.x, - tDiff = Date.now() - firstContact.time; - - if (tDiff < 250 && Math.abs(xDiff) >= 150) { - if (xDiff >= 0 && firstContact.x < Math.min(document.body.clientWidth * 0.25, 300)) - showSidebar(); - else if (xDiff < 0 && curX < 300) - hideSidebar(); - - firstContact = null; - } - }, { passive: true }); - - // Scroll sidebar to current active section - var activeSection = document.getElementById("sidebar").querySelector(".active"); - if (activeSection) { - // https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoView - activeSection.scrollIntoView({ block: 'center' }); - } -})(); - -(function chapterNavigation() { - document.addEventListener('keydown', function (e) { - if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) { return; } - if (window.search && window.search.hasFocus()) { return; } - - switch (e.key) { - case 'ArrowRight': - e.preventDefault(); - var nextButton = document.querySelector('.nav-chapters.next'); - if (nextButton) { - window.location.href = nextButton.href; - } - break; - case 'ArrowLeft': - e.preventDefault(); - var previousButton = document.querySelector('.nav-chapters.previous'); - if (previousButton) { - window.location.href = previousButton.href; - } - break; - } - }); -})(); - -(function clipboard() { - var clipButtons = document.querySelectorAll('.clip-button'); - - function hideTooltip(elem) { - elem.firstChild.innerText = ""; - elem.className = 'fa fa-copy clip-button'; - } - - function showTooltip(elem, msg) { - elem.firstChild.innerText = msg; - elem.className = 'fa fa-copy tooltipped'; - } - - var clipboardSnippets = new ClipboardJS('.clip-button', { - text: function (trigger) { - hideTooltip(trigger); - let playground = trigger.closest("pre"); - return playground_text(playground); - } - }); - - Array.from(clipButtons).forEach(function (clipButton) { - clipButton.addEventListener('mouseout', function (e) { - hideTooltip(e.currentTarget); - }); - }); - - clipboardSnippets.on('success', function (e) { - e.clearSelection(); - showTooltip(e.trigger, "Copied!"); - }); - - clipboardSnippets.on('error', function (e) { - showTooltip(e.trigger, "Clipboard error!"); - }); -})(); - -(function scrollToTop () { - var menuTitle = document.querySelector('.menu-title'); - - menuTitle.addEventListener('click', function () { - document.scrollingElement.scrollTo({ top: 0, behavior: 'smooth' }); - }); -})(); - -(function controllMenu() { - var menu = document.getElementById('menu-bar'); - - (function controllPosition() { - var scrollTop = document.scrollingElement.scrollTop; - var prevScrollTop = scrollTop; - var minMenuY = -menu.clientHeight - 50; - // When the script loads, the page can be at any scroll (e.g. if you reforesh it). - menu.style.top = scrollTop + 'px'; - // Same as parseInt(menu.style.top.slice(0, -2), but faster - var topCache = menu.style.top.slice(0, -2); - menu.classList.remove('sticky'); - var stickyCache = false; // Same as menu.classList.contains('sticky'), but faster - document.addEventListener('scroll', function () { - scrollTop = Math.max(document.scrollingElement.scrollTop, 0); - // `null` means that it doesn't need to be updated - var nextSticky = null; - var nextTop = null; - var scrollDown = scrollTop > prevScrollTop; - var menuPosAbsoluteY = topCache - scrollTop; - if (scrollDown) { - nextSticky = false; - if (menuPosAbsoluteY > 0) { - nextTop = prevScrollTop; - } - } else { - if (menuPosAbsoluteY > 0) { - nextSticky = true; - } else if (menuPosAbsoluteY < minMenuY) { - nextTop = prevScrollTop + minMenuY; - } - } - if (nextSticky === true && stickyCache === false) { - menu.classList.add('sticky'); - stickyCache = true; - } else if (nextSticky === false && stickyCache === true) { - menu.classList.remove('sticky'); - stickyCache = false; - } - if (nextTop !== null) { - menu.style.top = nextTop + 'px'; - topCache = nextTop; - } - prevScrollTop = scrollTop; - }, { passive: true }); - })(); - (function controllBorder() { - menu.classList.remove('bordered'); - document.addEventListener('scroll', function () { - if (menu.offsetTop === 0) { - menu.classList.remove('bordered'); - } else { - menu.classList.add('bordered'); - } - }, { passive: true }); - })(); -})(); diff --git a/theme/favicon.png b/theme/favicon.png deleted file mode 100644 index 548b1695f01cef89a9d6640b805414671adaeee7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 113510 zcmZ5o2Rzm9_x~7KC6QA0s*I=A4AS7beva%W)Rt_!>H?15TIhAB(IUSuHu36h% zMG%jk%&=VL_Zp0t#*oBe4MB1zM~{bme1%hHwaG#k_GGkkee6h1P_||;F=_X`lVnKA zSU9Krt9$ndE+kQi$W!d}8TJ^3=NE3Bl z+l_+V$S`l%&#G}j(yzB#vm|LZYQ3Kb&|bvO-gtDEQvkDhK83mZ!0`azv~ztVFD0xy zF=vq%CUeIy{2$h7`S?2*&v_%)8kfC~k0B>N`0P0D>hg-jMoB{Jdf6qR^v73~-o}tW zILm%jg4xnpX7}Ex!)ZxL!V#O4mFDGLHzb@hZ7zFF|2~;DUf(wmz6Y!CdDP(CY3=br zfza5&@!?vJgS#EBcxvVM3l?=_?@lLX>L!%#SRFZ5S*yN2VW4gfX63X{)KWzd&qD}; z4M31zoACDpf@o18B>VIcL?RkNm>fC{I3f^|;xr|>bJ`v~GwZgF&sTkp{M;Z6ASAE3 zG{x(+@TUu});z{2DcPy8$bP9lGu@Ci+4k{9jn^0EXO>ziYVDyDmqgz#s{M$$B>6T) z`G=ZGLs;PFnWsepPftdQba&&PpWuJ`npcJUoYG4^Q*MLuW`;wjFf`R{;}_gzRjGKL zCVLl`#xKKTG_a>q;uJt82NKXT=XPQF^oooz9&bWVPN{8!~PM!An!|+RM5lWeZXAy03Zu8NPRahB5c?wI~k<^<1ZH0cw}zjm62J zpH5U?yU2;Vp@P7{=P`YiV$8_g*-$$zBQAd;tk!Gj;8IfSGDo|I1LNoeLgTwP(w6Jw z2$rgf89`iDNJ|5%3@$l#{JhmzGDs$Q^5DGdTUGH*lkbnE|5@FTH6wOyNM&T%G%WDz zF3$!_Bi2&3;GhE=1-;>Xsz3B)ND$8RIpC7mGGtIbN0+WqKyzn3^I8n9eRG%MOPe;* zH?5kzSXBw*%>~O+rpoTtOtOr41lhx-Po_9WZInaNl=qA@f5F3HFfX^s zhaz8Hbc)N+sBhHGz}nzFff_;R{YA0g;=pZ)@tZ8NS-taEilsQ4QW?kAp+effyXIXb z7uF}6NWCfJZGF@xq1&oW{&d(~gjO-jrtN&;ktAsoXTXw7;?d}9e>Q`0R{si;3-!fo z7s66^SX&5?Ed_t{$bLJkIB~&+>fk~Yl+<=__RK!C_I>xSvPH=^Wlo=9W^zx&rPE*( zScAvD6w(bkNeHQb{&(9bTq%!$gTB6tP}e5U&7 z)I#fOxO!645Z+IdRy4i$WW4Jh@OroWyE*~mlRV-f*GE6^`hp}v`k^KZ&n<2nWBU}Z z*}eI`5N3DGXgQ0II94%7oS!afu6?hlfc4eEyO0dB9B?DTX5^)U!$K_mCv}|C30%?9;MR=XHe{$;steFcI%fc1CyumL2fzC z)a{)eSo<7xW+Y!uv@l181?jg~XR#8kV#a8p;52*qW&LZlM=4V>?iCf1-)Gq-(ZkLG zeph%zhIiNBq%cs;p@?WhaaTlcY>hPOw5JBzCB)F;r!)M>G7m$9O`#EXsyT`Rk+KzW z$s=*WZC@Opjhb9pZiWtKNAR|LWXH_r4$%#2>M&qeUT@ImKLZfFLP4+;i-L83!JgUr z1VLJ)#Y}{Iz6Z{GTs(t7 zP>VO&K;$K(F&&|-%EQib#o&Stf}ht;Vt;-2!2?9ne7hACaa(Z`XpJBZ>>;b?3tK;t z8DrE={b8+$%JPK!*uZsoEh3j#iF^8CArrb}Pe z&76;N^IRlDJR2s1JdT<#gYdIruUIh^x!cX?Vk~sA^(h6yTRW*gZ3%j=S8caO)4q47 z5Y9ttff2M5WdCe1jQ%AF!tX9|#}1=>dAs9#Am9%xB<)X@+5>a(e$T^#vM*Fyyysw- z%w)y1{4>@di~r)9vs@^EscHN$&v2vc2MXRN+c%Ft1Uq@nP;h*9=W;v=;!#n@J-m>5 z*G^{?iF~(R(;S}ha+zWo?(#iPpJ>n`SRs9!Ed9dI?+Uf-mv-UD)h~ng`~T-2A<5PC zkGZM1ThD`n?%zj{8AVa<-509k>HIA1w9a5nEVui+>(R|Y(_Zn}+d&6(=n-t;X*PP( zkf6GIGUhU3{}1)TlYOhRF%(GCh42d&GKJw?;j|ON(}S3F>JB8*lawi=YVG;j#y5{P zd8s+NBz6*{B$K%y0(HEIo7@@fjhyYik-MWA4%MrZMCg6;lFIFyT`Img82_9K6%aX* z8|2~rlgA?P5vi5<_NAHwzxen$AGJwhKk_bB0l_Ax%U36);_g4!-i>G59wGAar@R^QRC*e_o?)#auFxu~K(CxN&##+@Zqg zb(G*PXI?QU6Z^Q`0KAXNS`ozRwoO+EEtD_Y4E*5uNz^p`5S#e}mU7ouP#r2Qt^b4b@I4>xB)Vz*z zZ+OE%_DeJq4%;IlsqVA4A0YKhJ|(v~&JFQcG^k8DPBRo>XM?mb68{Vmdj^AoVNeorkOUhHiqOKm{>Q=lV_=Z79BWX|hV{OE zBnUQD-kzgS!OhRoRObxmt$%P8a%whSECGD&s1*24+AiYscB@(hPOYU#?V(@OAwv+c z+1#L?&wRQ#4{jGwE7rcMjYvs2PTlUgor?3$NJWRKigK6lrw^y<`ZvmP^{AbiQ(aSL>29M{u$HLJ zT8@wFs=`XF?(To%J@@uYjQx30sH~@V-^J3FeA*6zQ%{NZ#(DK+gP5k9>>)wfvl}1E zd6Y?FuWn}`b0H0{@KW( zMA}ooeL)}Vv9-D*i5&@IX|P~~M@mvhm75|zUTV8NJM_qH;7gkn*-8rgE8Em4DCg85 zgV1-DAh&DM+HN-$QPd7g1+83W0gtzHn1KLw8>n*_mGw^&EzqVc|GH$P44XX@QEFnRGvgoFl z%6aG)qWU??ZffyQF#R(w4NQZRxBoVB2RwvO-{j*iFIh`+kJF`T`Lf;5#wQkga+TX8 z+74^Oh82rsHK)ze1$J0(2US5>8l?>-_wenYR21wH4DCTb4dl*poAKbbTeIT?=q9T2RajM@Sh6hMC>3w(mWS%a5*Zg9O>QeAL|()PSu@c0#_ z4V`>7(H3?S8g24&V2H@-?S_yPLk$5u6hz6Ln8*$CqIGa+J;L)=#`C()8Aa0VK{WdT z+;upyFx=n*AP6Z;W-eIogyd27k8yiNKqktP7C?YV4$ni)on2vkJIekEZ9}a=g;}#L zPQs|bNq23wLjKtH3byBE+p4D5aT~8!Af-t;lrHKUMDThO20RZ6cmw@WGujDrZMJ+pkeY_8Np})C}t9ZJfw(j zv_4KxpWQh)O@iT`ARZPG% z6+-{m+5G_0lqi2)BK|ZZkfme-U&II(8VwUi)_8`C7T`01ElZ~4TQqbjzy_w&0v94? zBK`~Dl%x89YyCquw|jiEg<*s$`_2)r?!*6KMqM*U?B-P0?I4fi+yW+-VThOp;A^gY z`HR9M|IGj3|DBQC_GC&JPNDie{fV)CJAk_OLcuHe)SG zW<#aeS(M7tv>ea;x8=AdGyAc&+~8E#S30Foz9KUiQJa2Sh&YvPqVDVDNp||W>3L%kGX)poIc$IoRo#U3FSBAqSc8MI zXUdnelwM5Gq2_GOrKl|Y{M>UPq3H#>wb!8vnO?J8FAy`yKO$a)6?jJXfCU!?K!*sk zhnl@!_FDWc+Y*Z;YevI!&s+w2Kq*N(C7|>IJFEjB$V$^n4*w5N?#EFh4STeew8`rL znz4*fJIXexUwuTT#|BeyL<>BLMyEpVpWR zdYJ^mpRlFGOCm@hvJ*tm`8VMxsppdIy6w!-89)TH0vd}t`(V(-WjGz6vFIwtFF`yS z$e$zS?LzH!|F6AF#F^;>r{_mW6#3X}c}Fnz%(p1zK9>^SS;?Jce){RHUYj4U1niWxR?-d9)a=A@GuXa6*I zKAzUtVY}yKcDY7ykBJSj%to|Ea)XNeU|g2Kg=rKS4eYiE_3_22og?&4XNg1|AqFf8 zj*vm5)SzQJa?QkNC?V)HYk_JQ5Dj+eAnIwrm**4B2+&-VCQ|wo%umu}SwBt8>rLWt zjyd(s`bF0n6vx0d6X!sS92uJ=jykl^MF^kZm@GS|M}r+mvcOrgrb={7>?JB1M9DLZ zC2oGuix(|{EZp^?%)PeI&2x}4%?u}vYHNY6_7X(}rr#1|sR`6{5Vymph-F6y?4@@) zP25gp4dBYrXBNQ4 zGGZ*UUtX3p9~Xx1Yf7Kz9O})XpwoDio-xsEJ?pt|=jX>sx2RwXT0}U&snTjf3w4%f z9Wm?xTK(bb1Ak1BU->!xSg1nv!XDy|%dQ^f4(sd`M!LAFm@9WT0FY%hd(|@&i5{X$ zld~TzfG&pF^-zCaaH3|!68@>4X{sE=Oc#1ULNMpg?x$a!-{|UZ_w{(aMT`$Z$#in$ z!%?8;0?>&E8wiT$VLj!x53T(Y(NQO97|cRoPgl4BTna>RDdL+`ard5sEi;?{I2?}T zdZwoj&KUOtC}GOic9xWdZV7mgEOr3#Oe=8{`}1*W8lrWMTMqn z@7}F6hho)Vw8V>_ z!Yczz+Rkp9ujC_Bpul5pgo;OmrxoSAPbjTr5fcUE{Wnu5--U01)$C+#k{Gk|MSiUB zA$>AJ3n(@p9t3QN9x@RmMhs;!TS3G}A%|iqc2Y0ikI!a=Ly(AxoU2hm9{J_9q)mD= zL_c_CG?Ol`x3Px>QMaSBt%4!)qD=bTiShL(^12c{Q{7H;*P`_tf`0*pRJqBnPBf0L zG4e)uwjPP+2xpP;6 z?R_2v4U`7S9WV>%IDnYGkcm6so{a2|NOI(#NU_-YQeE0K*dV%x$RdbKO#-AZowvV~ zwuefLHeLJfz;!e~A|>zyYi{~l5wS#0;=J9K>JZ_zMX5-c88JTW5Uq1L6v^*UjgvZF zZ6O+wvN*-PyR-8K!T_x)-U0aXNaFr9oh=KDYbWl{Qsvtb;o>jK*$g^uI?AzXL-h!y zzk5#kW3mYSgE8WfL1dy2HOYlVe17~=mOBeIInf0Xe2`uRy>6`GY~FHw*g8EC`OQiT z^j5GZGeQ-Qybg-ny8lmcxu?>)&g1w zluM2=rwV$qi=2-d1(Cym4?(6!Z-KT zt%$*f=n&Hl6@D71xKlO$_naK0bfRQrAe(_cyrVM$DN)X$aA}7fN;A?^63u`WJgsl4 zLOQ|xH%MQd^7-)=&Vc7pjzGHnWxUhNKgx|DgXdbL)`` z!(cQ!p5mj)^lx} zMZToU2^sZfGh*ISbzlphfUV&Gdg{*|MkMcoIPrCBo&Q?7a_=)fh^RtSS7#82h!hs#+S+LmGy7Ez#BG$n}PXyJeiN zLS?E>yaROyzHv*aSse%sDCgA=kme?`Cid|wR7e;Ixw9q2APW^D2tvrVgjmH8g-~^H zj&3Q^O9Gd_eQ(16$$X*7Xvfx+A_6^;UVtb9i21SM<8Fht>PS(B_n{XLy6pI)OJ42y zB8pdFl{;HRj%j4sImDcN{+g?+&c2Ctl0W(`mzrd ztC+pE>izp+AfXu9Qf}$=mQ|MS1}qm~@PU(PUa^UH%TTTOF#~6@HhK)RYOEy3rSUI< zVQw&6((h zki7Zo#>R3Uv^9($58XvqL%CwIPkg3Kz<0TJdRR}!u`IDks6D92p|MWpOt*u&k;yp* zst(8)J=d$AY2Z$s{zYI}DC_iNIAZF@BmDUoA9PcZU=a<0TKhMBtQEfXs!qK^;(}DM zx;W`wo&O^lAI1#ocE#7lzwVwUw4^UAsT{d$4HJ`VF|Q7+_W2t2d9BqY8VLwc#cJWC zcW#@(|xV);udmtbPC_A2cpo_pFs7Q`?Z%C4qg7l&BH%w&b?*J$QC7KgV5QX=9eVNO24n2lUl8OL;iRF z;zJs=PBL6_Z&a`S*g2>{)$@vhKJcz>(`8_zh)KP;Oga1C78gVn{a@W2w=Y56Ao*Qy z&{JY;jET|T4Q{U`Ef*-@$$&FSmL2S%C#x;0*iy5(g9)zXAvyL;V@$(?zvBb<`Ma?| zVPbHBAHNP`4?^v5@u1?Chc>QXXGBBXZDQWftyWP{;tJ401SSSJv|-DeGkVmK<~Mw~ zP-pH#hZ=m7Vf7h6hx+*lF<9|bG3Pfg2{u9srjFuN3M*eqqmO`LP3Iv>>zboYbf_e* zB$gkh&JQ-D?XleQ#}ya}yBMB~Rue!2Ilrs*SZrH?e9BoP(-`s|Ob&(pabOCID=$w_ zFAdwuv}K|Nmc8Q@U#{}&*`gBTW?2~1CoEO#m5JOHHjPPv7GAr^|PkiozY+I6>3aT75oJ-5cjf!#+ES? z!I6seAhmMMq2=l+n^@a@FR&fJ)YDK&TYSQ30i}H5Lzm5e>eDgdpPQO#Oe(~wAF%(4 z@95J2=nXOOwjcXaZn29O#<)~MSPcZU((Y}|KFebiu>XS~$;@Xk-9@=-x#~3Y2z?px zK{gmDF$T^!JXf*|#FoN_irVWXz41y`nWPswU~XoxqgtL}ymEw#m>O!A`S+7MDW`3p zRfoCu0m?N05jUcD=;4}aRRU zx=k&+t&7efppXmvW>BE!Tv&EEy=8=uor^o~!ytrB#8oXvz7r>34Ysw51xa&gsY5J% zp`J-B?4Y*04WHr(KTgtJsJ^2daoBG&&r|@_0OR*8HTxE6%p*P0uIE$r=#~T0({0X` zoKA)yz%TkP<(bxI`+k+Ui)T8k@AK_liNB{w@1g{;^RK7?eFXOejuF@4OEG5XkOrM zsy{qsn^Z{wHo6Tf!zCk19e>{|?=4}-cWKsVXZ1~ac688ZR7rr0gCRiy0_S9YVZ%h> z>xlyoEfj+wwQ1oY7M`_!vGBBBb5vD@0B8(Q!}5Ey84Tzrh{dmy{Jb`Xot*`jHaQcYv)B7tV+w>XyEo7 zH+LdMJ)~V6yyhAIpj=+(G=ZbSuweq zjT+Y~0bTcoXv>6|Pv$38HQ2p9h=VY(OU0F1E#S4>5_ zBK=k~=c_}q*A>xin6bf>vOADT?kzD=}BfP>hghLCVbG{2>4r@xbCb%)en`gUI6v;+x`bnlvQydbl9s?4@g)|IN0o>RABh5w)r?eI9$iLgKf}@8Ow8=)z5UzRP5t zHS>duEb=n%MpbpC7bbmT*6aRP6sl6#wntaoJPxtFOJcgF)0fe2acSoX@d`ZJ^G)vg z@LdB%ExWtVlI(qwn476Tg4G8rp8D~@@r4|1$oI?T==%JUgf_B90bX(|iK*9wr1&zT zRVf;PuSCFIP|n%*EjQD3s{l=Id^#fSGoiex__vJoyla+8_~DM80lV~QJ>LO{_@F9y z2z8}8BNU}rxwo^AV}`TBefe&@9X(uworQ~Bs2x0iIB%2klqdz|@>*>g&-%XK=e_5b z)Q6Yj*F`oq#w*%BLOjC>;UN2c)AdSMr+QpxO?LP|vLvm+b+lSs*4o7UPorOE4dpfw zdu}f7Tv&XQGR$;+Fu3?vO;FHJNST^XXg_~xsAH+{$V&>pHP=`Cq|EW$0ttebecgRA zG&EFBI(mL$WFT$PrU5vd5ER50P2&W-IZUP(PSt`h6Mj4R?62#W8Nl_2*3w8OU8k1C zhl8)11X*Nn;4Q+7^Ya-mwYEBKl+Hm6T19(Hb9mhgw6L<`d);lPzZT@*I`&I=iY2^_T%TU?`ubWXRGM2gY3B~W%1k=NQv3~a zJD7Ol=A6;R#?Mq;5F9Zj`%---7c2Iz&aK^HLMAT2gYeF@hW~KlUJ)?IJ&*3U) z=H+GcDM%68HKc4dNc6J)=!&{u?k~FkoeWe#^B41QXCY8$$Ao)|i60NUw0eEQbo%k=ORybXE+Z~O=kY90P3av60f zGVeaq&QWdpyKa;5dU`9^qPV!&!^=is|Ni}@XuMdi&h?*oeO=u$uNzj15>vF3u7!eqa7WpLV1$#jxMjL0z@x*W!2?h)C8Ii^17ul}k`iQc4nvO4_iG z(&bxyZJX32Kh;8JTYB0C#+F>EK6#92?6&5*=drOkP@;DLC^uQH*eGl|t5`mo8RK;k zHN*>iEO59kI2}q!N^N)oGVrq|W+9t>eQ*S4TH2jkXLR{;uxa_S?&pSvTaX15?>M1L%edbWGz^fYW9+Z`HYT(A$Yy!Dk}pZ)M9 zHwF#WK*K*Yjj2CK3;nYgy`%d_?oDT%B+%pY(&%%uo!3&}p3ZE}L%XBt-b<-y=iDl! z(PwJz=k?9+;Sv(c*Bl*>-zb_Z0bHN}W5M(NPKuzNOd2ApsH&hz_uD1o_YUO>~3 z=UyB<_=~&bGbsrrWPkuklSzM%`z%w%@2f|T9`yj-C#*Y-d|Y?Y(z^aJ#6y{%rNd;U z45yu1z7(t6wxYwLLyP_L6rk_7Jiobm zdS!}Ef>87h3J*_Jv6$IUREsjd0vhYKEZEgGnL7JMSBJ)+hTS%~rV5UaE`4C+&2K7x zO$*{b&<)HCl=bcec2X@Yx2rcf1pRTbhXLw zYc@kYf^0q)hv2D9e@muXf!_+!5xxU8F`gft)K_wDR0l% zP$x-vA}cFfdme77I`y+|@@bQGy;g4Ph)j6fNvDhv*D>`ZBtQbD#tvwCCHdV{;8=vP zKfuhaSliUIgaK`eR)^@e%_|=n;QA>W+s{o-{-P3DgqGGd zV#hsl2>4_6CpQM@0OI-Z>&wvsP@AIR4eU@d(%A}5Hr4jVcEqG+i^?io&P+@S#gZ$& z1Xm6H>`R%Oo3Pj)Qd8tZ-}C_%W@?|nEs~a3EPLtU)4|{vha%ktlAaWX0@3Re2dbFaAao|l;36FZ z^09q#y@Q(@5FTuvoB9($c&DEI81Uf;_geKaf;kSQN?Oi!0aj(H8H zHSTuEY+W;hz7qSW^O-IB?KAA&i*f{?G-e!5I05$x_hvNn%VS8BtI?cMH(y#X2pH>a z&Wy?5_(lgwv*}9IafV1WV^cnoSzXWxs>_Rqkd_gZ_|4cZ!|vARy1p_m_eb?tYbX)3 zR{50~u*G0=-EXi_n4v?l(gKNuLq_?2TKhx#NtvjE`_a|DY;o0f$&I2Ccz3NU;|31f z2dROP1MkJ2k*y@#`z;DvXn+g2k3^`s4-kfm7A-i!whD~PNB3JKYX!fuX@|h8yy|LC zZuyEaH*Ev1dLHLq;U}9-w7?a? zMMuyL_et20^J3@@q-U$j8d7ywg-ivf)WHn}WhA*5KuPrUOpS_|Eiat>qaQVnTdaO} ztm9Z!+5B~V9|zu@H8opPww}7fsu(5;(!9k*}Qo;$v@-On|5}(ejCJRa$-Sm*i?$Z0sNq%qO$NXe*NOYZS9G%px(Q8 z@9JN^yughF%Y+X&_PetAdD{^DliqxdE#XOEz&L*aPLhHsv+CuV%+AfU@) zN|#LWc|iMKbr$N6VStJqJe(x@tyG;7){WnDpl!B%FX0v0(U=DLSNtEW*dOq*@=SIF zx)>guEzXg4F*Gt-d%IJ0Fy1@cf5j)8nVEU&=ZG&PGeK#%+;;ClL_StCVkQVYpCJwv z!Di#;YNy0Tk<72|M&V*{I>+3xJ$86@cFU7b3(TrcU$Ckei?F}pE6vUQI7VXVv2flv zt79%&d$0|d&Z6{z($qc<&ZnVws`(U4-cu2QRz6rT7=Y*4*K$`twXR_n8xU-FCZn z@2;Jh$zZ}(TZdjd3OK93#uHzkx#QaTlV*9$Bz>b2UpoRFBnA~rjLFE@{5}J5p5@ks zy?5`{R%i7ob*?KzuYCRxjulFeJ8eJ>UMunk)w6zvY>pU02n-p&h2k)Ix$1IKZ^o_c zlUTJPt)CrKT~L^sTi?1RSF<{fH~TY4B1kFIkA$H>bI{@MY7q@$ z$e{(3I9_n~o#~Wd&!FACTV5=t;Jbnz6mK7{C6W4yc>w8ZBFu(nKmN6JZ(qUcnE~R2L8A#hi zP4Q5<>Kb)NmjGCyD<4c%I$~`5mI4}OGc%;c1DPi@gcZadLMq}rOV;)7R~~(d&dSW? zwYOtxZ)(O6wdgaFrw5qNIUMQ#l}iW6CBVabpHG!9vt=J)8`9!V6Exr{JvkC{m6f*) zf=XUGK3presBpad#R@B_+4y*0(5ichXsx2~(WBMFKYsLN`*2)8+36iyQ7B5m!14@cbcz5XymtM186sD`MwWl0e`t5*n&=IiJw>@X zWG}u@8ljl_j!Z6_Emt?!h2F6|Np5S`@m?9JbnEl1S7oE?aHHKt)j`l82LA!F(H}h< z*Cm>eNH4VtqpuxjwVZFq(| zzIf=X7N|By2l%kMZK&Wd=aHi;z{ptMc}#9PBvzssnRtYgSIWxBsP5}~ej<|EllHCC z2wYIZmW!B3Il1_ahIw&Zq7mcPw~z(M32Lg0k(kw?`UJg?^|{EU>R^4;pY~DxiX0h! zyj%g|q}(C&TVJ2i=VQVh=f#b`OC_-+JVSMAsRFwz2)Oqd>dDS#El3(5?pJ;KyvnL*$q{2jgTl@v(?frz8GBGhRhAdoX#Kp&%lT;{592eUf z#EsIwBkO1h_9L5b$NXDeZPE_l0||EYV29N`cr^Mi>nu6dk2-(;^2L)xLVNnQ^O^h0 zWz8;0BoVdqt_^GpJC~(;gg-ad!S>5~B$B)CIt}(0Dec0>IpRHsCq^KBN+mL$+MAI} zkD9O;O25L9DuY-0j2Q(=Jc@vq+8d-z(adb!va$u`h0yc}@fRE6>D60R%d23Zl9T~k z*lpO||7&M#sY+~v!2S?T;b@D_N-QTW(qrb+RG6RdqS5tdEw55x>FPk*pdZ6$6nOf$&6GTLGTZ_uBLwov3e7eT_HAbdhy!zV{Sig zRT=cdUVK^*yu!Ya8aUcEPb|d8#)^tL2Qa(-CMX?|LFR82fuSuxR3_Yq-Wvz6H*1;O4i61P7t_M?9%6QLv~lZ9;sP9qNk=&|?U z=+#n@$hfYW(=m=lw?Z{Z6oTJ-gRSh0TG__KFzIVz4=2-^nL=s~3>2v7F(b(z2)Pe% zHwwGEyUTlG8VYC;sjnE6y#(F+yyW-^KYK1x6XF2$$p$hgYX-@8Y2YvEs}rXF1=6}wPD>afEyp@9E_d>s z-wAD`5aKJqqASccIf(bg-3}MFt_y_yi^g-7*Ydpn&@s+e?oz{{3uB}V<`zo z_vc=#{c+{GQ;(q|28u^PVl#Y{(3q9-2w$Onq+%Ts8zdqh*Q(Z}5l%`<%8_U3*5}J6Kvo@MAL$8a{pWRI-Gdl9`Sw;i%@L=lxtIE`>hb@D|?c@4j0aUd49<5`-Y4z0zK zH080UW|y@d>r_>S%W`2oFYm*hcyUud`%m7szPhPu!KLbWU+ zOciK80MF8pAuQ=~_Ot6D%FP_$(?p41vkP#AmjQ9Gu%!Lv@<;6%OH0~Pwvkwg_WEuMUd z9=hSWRB{K@T1M^-qE4+i@mj?f<`w!#>cPzHnupF=-db6pI9!y3YtT!1Ml4KTaEuzR zWw{Z=lJ)k>2L*V&`BX`l@94{zVN|Mf@$NeroS?h8NE&n#J(>5_j zNRiAE?5A-H4=X-5I=Z*AEC}a7ZwPw$K-GRO<7c9YOejR9W_}#ZW}Liwh_5CMKoyQ& zY{Yf|pEyA;qYiZ+Y!+ROpMssC#l&D54CgyT4t{tLa;$KFJ7>% zZ#oyViW|8b_j$ahMPD(tJ8yCE8;E$)wSIl@^x{h<2JGx>v3PU;f=6ip6>hjqONwwm zE7B{fsa$8M**_kBA2kg-9cY(jfG$cSFfumd3Q2=D2za!8n)( zWM*XW9YB;^@a5Ok@9UpYjt@|VZsaA%4VI1UYbhj%i{?$r-rh@>SngTv3<)`rs*Uir zRs|KQA8e7WGq{gRJqs_?k|M%|zD|ds=BDj5W&(4?!i^}r!YPR^d4Z@8*WOlGy1Loa zhLB8KS)kh(|#h1Vi@;3UKIA-*cP2|0d-nV6xCQ zzP@`ZpNSl+3nkMVK3U}~y+@pEFArDvaB|D*kYY{Trk2!8R=S|eg#wVK9U7vXpbXmi zLVX97hJIlkGxAZ)!1Vo*9ptwB$3=;dOl5%I??8J_S#QUl#U0=$hYns;{bj%s_m~P;=|6#8DCJ z-!6?1yKcPg;C^mso}JE)-FU@~G~F0k-i0OqAb9S4M(z6tniNQ6J-aO?@~X(w50)Z& z8{*xWgKwWSSaOT>mvxyM8{^vB+l4kOqDDsrH)EpqQSOPDneO5j4M1(z~hX)*P>3XY0akG>rE$)p*mLWb1nMYUaUFpNgzNCy8(P ziZaMCMQ}LZM~Zc0iAAM6@Tq`bzgiNmGN1#g+J{`y;b83W{FVwm=MLe0k3}UK$glFQ zbbYxt*xN!-u5-L}#OP*MN0);dLOEF$w=aXFiHlB+&2OsdL-`=Q(d598v0O+-uZdd! z%TLw`A6%2&`^wK<7pykSyFKoVQmi$I)~bq?d}U^Hd?&6L*F%2KRF4XgNMI`j628_&9! zCR&L`atcHO;28SV_r-*i7-r%ecnRL3gS@~=>zimnYjF7CM>#la8VNJ~I?r{##+*^* z1s~lmxmQME=C2sYJgO)q8yM>Mrh5t&^?+Bb$r0;?XD1?-66CEqy2vuMg|lbW=+a!hY=B1Gc3W*Vhb76wn1tesGtv<(pQl z)m`)4{fSre=+B?x92MSIC@SIHe-YDDHik}UD(H}%$?cHj{emRl*T5y$i>;imALWku zC?|iNqViB3 z?i`Yj=qQ~q9As)xRKSWozq$B}@3C@$W(llJ-J{5C3{xK*O<>BhkHWv5qFzh|Vm^#M zpQ(K+zR!Q4uuPQwuQDk#pXxYnD;(rQTtBcTE0_hGCJf2UR4Hzf|*cY_eD`4^bZ6V6{7S@DUfUIlx{vLEd0uUkqqBH<>f-tZH4|Iz!G9?Ys{%XeU@4Tc{Q44 zEapn`tbwK#nPBH)5#lu>!&81>l{lJB9(&UD_s8I%c1_?996SsaI_jtdRg817k>$-Z zBWxrSY|9Zs(e)R6T}5>tM_b&wbw*cLx9y(l8Q-Zur}0b<_;JS)YnQ2?5BKt{N#9iD zmw;mGx>6X4qEG_!G#WoZFR!mNBh7E0H;N&6m=K33G%d9_?4 z$U9*V+`Pyw&1Xdag8N6Ojgn6k41F>5Q~f`p-aC-W{{J7pkOrkl5us8d>oyLuZ&_s~ z8OJQ!vG=B-j8GyWD=Tqu?5$)bd+(y`k#%H$pI7($_xb(RJv!I*8qe`~KAz*^LuT0w za8O&ja50z<$uc{672Outz5?CdbjMetW{v)aJj#I3UbUI${UKO&F@EtWm|!sE2+-5j zE&pj*3!YZ#U~Fxz;8Ni5_6MC8IfihloX~|6QWoVns>lrv1^a7 zZONARM^{%=FtjQu)oJ(V1|Ev|sa-~9g<$PhbQVscCIw8{zMMODrG}^NvW`%E^@n>l zzB7aJDHrl@;!nm5JhxvUtJu7pXq+o77!jgxXxQJ-KZ8o}^I7Zy@);XH2Zy`#;?W{Y zxxT79_84yL_~$sX{LQh474?_4`;U$4ZC4nwe8oJsYkTxA_aiZ>kkPnUrOM zigj(K+VTEwOWV=Z@DH3u>H}nj)9nRe2Pc#1Y|zflQ`iD!Xl8@M?gPGA3(@O{j7CZe6MnifX3xPx z74!SqV4btaCVZCPUP+TSnaI_boN!M)9{;64o{8ad9N`5LFBTyr7*S7Gw zA{?+X?H6kBL!Y1R9T)G0KuK+JVl@blL<*Mw>NRy(65t%*o0`)+I)sto-D>;PPx$g| ze0eKgyOx&%$}{mk|9AXbViBNQB= z#tbDJa}D^!#V(sB%eJM zkhoVqeFlVPOTyJ)uwPuJU^SJopS0xHFCBgTMX&Eozc9qBB?AnI z#KXg0!gU3O<-Koc5B_KD!rTD19$L~GB6jKN!?Q~{5UR+#SlrkX(^~z4{}i^ zx!q5)TtCXGeAt9?&}+Eox+(>z$~DM8LlfQO1-@&8+k)mX*nXPg2uOaaUS zcRTo@UmS}=FN#-ub&*eQwm_NfY=Z_zNVchKj8myNUu4Grs$)isd7j`o z;nTh;fJn%_=^}kx%oHa|G`+S6+QuRxx?K%LYuZ6PaQt`KY2Rz|l-jNoDEm6v85>^$ zg6E;7rQ*w@$VlhKqEn|&qp3JRCd4JFxE9%(wt*96&yHR?M;s71<@Twsznv-Q_^~TU z*4Cfb9qckOg6C(PY|GA8cSV&5VtcxtYxATuUlB zGOj}v8`{37{o-sTbE4z0UvS*l24A5j0SP53 z(lJ>yA!u3;UC}eCH!;a8DhW>|MM^d#DjdHknb?XCdc&e+V=DkSfSt?k_%}GcE#aM+0C71MG9cBaMTw62r#!C>mhdX%d?ZD(+(2y=09Kt@s=0(}ONYIfI*zOA*Se?s zdopPXOw9l=-B4{141x)SYY-S9TLX6pd33P)FMjrB4$g1BrLk!xgCJ(O4T@vWb}-)y5^ABN7#Utj z^X#4a^yyRkmH`Pu0~aUPdN3sm^)6?%~bFT z5shlLzzsD4#V1p=Gszi0wnnPO_FA`6pqgOMfJhgDLjd!G+a=iUOeZLtFFj)!!!5bH ztfl2*5U-X4uj$WPxs_4It<1pdb*q+Q<9Vt|%3`q2$1PGQE7mcUeR!wdO@jvlSU z2#JK`>bNZvJwwCr?d@$9U%XH*S}|F&SKQVwe(+OZwaMs@1O$89;`G#8oL{ERw6wKL z50iFn9$Cx}zPcl;eA5O|JdEGBm?E$?_7*KZ&aR1QF{c|@-}Z^RbIpYLvb9OO(9Up+ zd11`r-ZxYJm?etp?ui})=unL@=&jWkDXpri`Y~~0W7ZwTc4cMsl$4Z&Sl48?hW`4H)(WIq0RczQyC{qwXklNdiW^*KQ9 zZ7$ixkoOO(JNKCX5yMi6b6gWAMN=}y$X;x&0IERrcU_%l`^AUX?y&Md$Oem! zCU(}=oS<@2-{qpAi^1zwxh!TFwQjTIx+R<>mJ7j&;oVpezK3wOx9&KajsI&uj_#D^@05MS@xBsvfanktT_|xjf z?LBO%F2oVD76E=P>5RwYZk054JT5hDH7`T~4S-5MDJlQEpWd|ndjGbqakB1l*Gn-6 zmo?M9W&5!UkoF1tD~HfM9Q}iTfn2no#}-xj-ip2(ROgUxlt4U~8>q=WqgQnl^0TjW z2ZGT>!~s#ejT6jwpK>?%Z=DNv6{a6jz`J8AzJ+Z1 z{$AUz$`uIU(VbZB2aYPW5P#F9XRbd!?*}9rzIAluk*88q12x7!WW#mgR5>^JRzcN- z1FKQdoqrpUizk`}_oAQS?v_K3sSvnBi zk!LC_U#z{>rl#J6W&EqgG8jZdwRCv;Tu8%KpaoRu-ARw+DORmLuR?-NQHQDXoyXR; z_nrwW3091PER)+AbXFY>2U60ZnRot8p4CQN-89e#_26kDI((gy;EHTh!J#R?7`^GI z$RSiFbpNr^P5~H3bA{__jf@uK8bO?cmQuwa+)%6Wwr82L&&LnHpd4`YlYE?gk!6Xb z1C-De9BRiKJ#X}A1~V9>%tq1h&=jhZZg-YngGw*uQ872Y{{?ZrH?L4}eA&G~Uj7Kx z+bff0U&sQA;{K<%sMC6=kD4eM-`bZ)4Xka;F5y?a`~MKSNI8%q8CGM6x`Uxiuy}ve zG65p}w@^s2prx1PPW^Fx+IRW&?qr0Yy*_$$yYkByla!~<3Q!dMIu~|~mLx#Xd#_nQ zrkJz2zlmN>Lb}zIAH?{BiS=`a%UFUWwvalFMEbg5L=;*$8Kkpd2|n$7NwG9fOsGMn z8{Rd~%(9F^VySAwfNae(YJOi@(%RvszCrS2o&k7i?<=-_u`C<^AQ2 z)7IJ(r}5>ikTA(0xa-w7B-n64J>;qQ(btYZnjCKFMB+! z|9H2{2FXkFwg-A&CMPGc%_aHy$=ORZUxAOK2z(1o3o-=yA=LWlsK4d>13DNiCbg47 z&lN)pQLNXcBRD!fih>q6ETTevDitNtZRutwc`$dl=IWhoFd4^Y#Gb?b2KEKz1hlmH z?7PlET9)(kWQa9ji+<5z5N%g;Jam#V(DCR8p$IO^9id?5U4easN*&a#K*%#jYa`Cy4l{ro9N}hl4@**QeceUqkK-Rk!>gU0DgW%_3xdzBW0l#C9zD9lqip@c#pZ}L zBJGVKTH#!PHVu21w363Cx(({-&3%@dvaVPOr4Lpi$f&22T)z!gD;^rG^Vpvl}z177L;2}`{ijcL~W%?jjSS}NrF+L0J8D1akjaUejbH4fO0_fYG%!G zi#YEeb%CJh=XZa4+Bcb~NiuGYI_g0&nHETq*_9*kWs+C-9|vX8omP{Tm4k#wJg_R~ zA|$qRWCV@&1Ou&sW!p@_PUZeVixM!9wuB%KQsG>hWC6^Y;Qyh!Be!DyW7+)2Z1kTu z4St2izXKwdHbicKJ!W;Y)=!2Sna#K(p)}|HxR}A@5{Y8Ez4&U{6+xpv@OX$9-Ij)< zzc$4G2PydY`DwHbT<@PeeVTFeIC5g&uLdm&ftL=q@mUS8)C_(4Bn_UAoi_9pFT_cV z5VvHm);l+$Oi^U|Q)BK7Lva`)WcG`yy4(erYCs0y7tQHeZ8jw4`t9%W_ zzheLJ-S5y6IA(1a^O|1^eE)jKVOwnvUMr?Vog3c&x2l*+mJH$Hmy%)uYz#h|MND^P zjvV#hP*np}6NIw-?+pesEQi8}W~19(r%~mBX{37c%N2QXKd%#B=UHG6LZ!@!S>(UbD)_fW@Zf}6k=tDQ0!L0ZmRUYv3O*0 z(FRI`APmyT=&YI%fHQK@PA>K-Mxr`k1t=CVj&O#d!VvE z5~$)*1NGbuYin!Q4*kIW!P3qp*8BK^bBF4S^gXdJ^59iywir2HP~cG3mo=`NE5f zmV(L}JFoGhC;ed0>9dw(l3MS;IhXEV70W#577cEEtJG*drY9jZGd+zO;k!wt4olrH zo*qdKU1ls_sA0Xm|1<3IXdoQB?}flR_N1Qrk@D z_3uEfA8-17R$pO;6$pLyYR=fD8msCIOf;FNs0Trdnyf1U6A=h?$aTeR@-n2Iaz^1n ztowiJcMD9=T|@`Hbs8mm34IVXFwl=Hxg=~VlCQl4gGY1geyrRqevEO#< z^1$&K6kXR&RiaMT>p$ko7-$b=I&}M$aKa+~2UU~T^i!X3pO{jKiHVsSbDs$7i$3=Q zdzSSw$t0XdXPcjK*OU z*67MyN4uE9;>9BWVJjdUF2etI$;I3x4o6JR2ETS(VJf|uOfp*plcCZk5?yL*vi(1; zQb}X!Nrq@Y_C1M^Ny-1=QDq1Y`62KUM70HnHpUbkXX6sdOSt>ZvCwz{{}~lNdV2cb zz%9hInVT3Je}C_6X!7lQx${ge{d;a+-lp#E?%|dAtrQ%UDo?396Moxoi2m$NF|m?%Zy8E{dN#75iB|q2a9nrbSIKq_V#>~)zq3Q zS87HIjB{?jz>Vvvo*57YRhMAOHvp#tIuI6U_*-;MH_#MAV2ftS0lIE2-r-0@1z{^~=2f-2-YCJp6-79pZt1AT)7eM3WX}G*OS7U z5`9YYaO&*md9j)hD=)@6q;}ne4$|EN9or*jVXB4G)Gx+nxp2`y3lA826XW>cP(?uoUQ$B~(@AIO829^m!Vu?d3KlBgkaR!?dmadCJ70#(!g<4Cx z{h^>^lRFD}YBuc0J5|6_NdA6wy1utpvueFvOk%SfSMLejM&M4+r^XfU6x;`O_WIwyf4`BxcP*vA z?Xxaxr_Ejk3(8y;4;U_(9_b{VX-^16kIA(IIs&+Pcp9OX2Rqnv{Cl@CT7H%!HF5TG zKM(`l`q_tG1ZEFn;eOJ#sm~9AB$r5%PSGo| ztSNU?zr&K#^vuiv)LFhQWZps#;ogOSRWR!B;qDqa;n!Se`KLf`vi0x zvmEXpuH~7y+12nS`9ps2A%Q+NLjn&`BoHueOY2sP>HWAn>D|~M00jM_-Gi~9ZbaYR zMWhqeoYg6oL!HY!CXSAd+@=eCpKPIuEStnC^+|5mcBV7;q`N=PXs>IT*&ihV6sCajFgTL|6)3bak zA_;ES*w~nR6!e}D+3NbsdF~u!#ylXN{yezVb$a^>Y4X^Ol`0R9$&Z!GVo^J|0ZGq) zYrnredZ{H*(vd&BmY7=Odl0xYSZAKDk;Q4CGsdt#NI#-;Bf9^wpn+vVPiR6gVpWJ6 z;Q2f(l&8{lKxjqXNiS~Vp$(!LQn-5j%*3we`+eb>pdDqEb6J zC3HTJ!Gviku-^d1moUeG{fIOpYHIxs){{78<59FxS67Ga?5B?zR2{o`3LJuWSE7BW zFLUnF?(FkP6n3Ta9zmc@DtozN#U;-_QvP4Vala-$Juu7 zWpEZiz>3kZ6W>q4xQLo3OHxkX2YigDWd{`;F0B%Sg-Fbx7)gaT(t0J?CW9s>P*Xl|Y{HAO!V@l+rGJSbr~ zdEp$eRVv~e5j8(A9fL_;mGjFT%yYlg9Ig+LT1~7Tw1yiYk!XZkb1&& zTn8GOn-!Hr7l7jic`4d>mfi-yqHMPDx3cdInY;{1GZ|MwtO+Y{3vk<_8!_M|hbXEz*7_lgHK$Nvg%pE2554!x%}sH*Xq zVUj~EUsKZY6xk;6y18-pl-;yk8Lt+rY2kR?QV&(SVhq+OnuQho=_nX#-dc4Xnu351 z4n32~0U5UPmq@)mgVBgHDhv7`;zyzwhe{5pWC3rIH<2dvV$85T-T2wr9=vLGnvhkUp72|7VTQa+q(QkOohT zSjiua8_{l65hIBb-fmU1vi73R(=Wm)0?wmUXwu={4BgTrIeXlwc+qS18(`AluZbRb z=G7*C`?c=tUESZYB8JSq?KKz7I@v$&`9m-D!O5%0i49ObVPEeVOMsw*m&8YAsixc@ z`3In-Dm4N{T@c?m{gbI_LZVZ4^!vMEI6Rw02xk?302Mboi@7HhKjsi+mZGybGDo^E z&OsIsK4{co-R%x;jP4sBrF6IWL9g>_Bk#m~>x?0g)y~1>VF}@;qahOB#KjK+Kt({U zh_uON4=*n)A5voF=O^j6_B!c!9}RSIE|)FX0DexLq7QADe8yzmAW1cV3Wo14^AUJa z($|ILs2ZKqB8DW2kpq5vJszOVyKCh$PUX!8?^*G$LoY%`x`|SZag1C=6zU`DhYBsi zc*zE*x7RbJ_OsS4D2gVBEx_EQ?&57ddbHT?Rd!`RNm9r|M|b$|m%V~!CzTt8alPcY zm8#!(LJ+-c73s?~;lll@yy5h^9A&m1LNY|a^*}ti?Ky(4Wa{*tt_!3@J(UP52$c0m z456Ta=H9(~f4x_eeF(hrdQ5BaPf;7rh|;c23pU7ATqEwPR0{iTYxztCXI|_?ioRG% z6yA;&bj$G_B2Y+2`t0Y`UO)lP_9$<09#(dVYF2d&BQ7E`7#X%O1D@K^vFqQl=j{n% zbW#Va5mVn{1yDeB4qIug8H^3_3U{c3Ctmg!(87YUGygO@c zI0&g0$37)g;XFM&Jf^CJ+%AD-0JGC7#nS?X+^K+fAh{?P>IoiUEoRWf{K(Ya_PS%1DC*mMpUw2DXCMnfKXH&diZ$iY(UzdLdj~@4X53Ya{68qp>9w% zX?vm;jTx3;qz2SQpjKmqGkm-lP6ws-z-$4*8jJy=0t~q=ZZFgNhlJJ?R^2xJkb7r9lat#Gr5|X7>Y`h zk>pmL8S#E-P`H~XwE2~6PIZ8%1|^tU94cheyGn{!rbEC9E>!>BO=q@@jEv#ohQ8eR zL>^BAEW0d`Cbfn2_1vJP)5?8hmh9~2$?NC3i<*Z0n%I!rzlVVYM9DRH$=<;0C5z^3SuCPmMKCVcU)YE(cUB-pMXFQVIjtC;!n}|uiRq- zLyKljF`0e9g6u6c)xsnl1Z(S$O;n6~j6q4S`uJY|)fj)&7sR(2I`U?zhARVsz4*tE zfD$|c0%tAS-vy&$jt(vYcvkZdwBB@H%&6Wcj@S+yLt*nuf90>DB|+%w6hqoYg3;@vh@ zbBj*T*X{Y}H5n5>`tKPX`Yi%9@*yCdH%j$gw=C4Q>aG{SXc+Enp}iqU0{E>q<_XE*i=e;}r4xQ)eygEI_3`#K7eI3OgoOuUC`AzI-CVRw z*TmZTM*F*)=-KF2PS0Kolu1b)unttw&psd0kXZh?>NR+Jls(bd?fHGRn+8nH>Tzk_ zg_*lI;x8l>#`3+w_qMFci~!dCQE73k>E2(=C+9v+x!D${bLlDEH>|pSv#`rAc2t6;3_usog$oV664YUP<(3 zdz}@iqg`eWo_TgqMhIm%~H?oG4bmj9V(Wz4E+!`WaCl<1yxXPi=(^`{X70f(A;1^*~#z#E5$)e z!F1{rIKK>QefIMvDF-_nucdZdYXPZu#XQW{Un8gZq$+;q#OZz-35vA@x*GUKcN5cd zWaB*=IK4*bOD|(J;8H$p>t_@clzH-3qOHl>^f%dWjrifvQUiCt4Q-PN1*xA1x$$+VQ~^nm zzwNQQC3XNa#n8ijx3j8-I)BQ*W}AYktR9m~l?0L3nqh><7)D+cMuUD9sTpF4`D6iY zI{#6qTjUmDNkg%Aqn-EIX@#ohW;F(?_sb@R2M%}QS39LD*r29DOp#XY^t6QGpadvdcU=H7Qi}qnz9z-YyUOhDM-}^$WLlZM@!}qte}i zGKE1pjN9l~3n=RlZ5N%zmyXZ>F==max2rg7TP*ptaDu2;xm|&qOp)4;B%=*Tn4K4C z_WSRJ5*BFc2t82yq(iOc8_O=G*r(yes>9z5cEUQjC#&=EgaN(vBob*(TiUl6_qVpa zcop|NUa_%#ZP*x74rGGBZ21nP{P~~VJF*c6=><(- zr8j;#PkcSz9JKsYe~8=1uV?}Y=Han}7`=L%@ew@AxuxcHT|Op#=%;3N1| zeOvRJTwJL~LR{+%(BtVV74$6rYeQw5+IBA@4!#~^5=3m84islanq|Wuqy58%f4y1l zY>!$=t<1cmU=;GX;5HdzqcqU?FL8=p5nRYD2Y@F?s2rG2 zNFL(txF*8FX6IPiLha+3X8Oe43d%WoCMOB$q&EZbR+6Xla&rw`!tJP9T%x*gkZSIK zT)g8~5Vrb$pC~!YayU@Cl1ySOMst&jKkG9%Lq??fr_tf2u!&o))YcRnvmOJ<&>yKz zrIN~|_MJ0!`-)$udCD6Jyl=@Oef(^enM2D&F5>p~zkUs=d*v~*?U#V}pI9kX{rbO{ zgMYbvO6V9BqE{?MBSOXRn2p`!dzl(84CND3Y7%sr0CXWPh*dUky{s#lv@$GWWm!D! zJ9(vqt~0tn?5+VzKjy$@pET(uRasP69e(rCp!^J1>bbeTsd7e8d8h>CKGuK+$y!=F zc2|E2CwkoY8=h82k5OTfl7}0p9qET@4{^!@(cj79TRBf;805X7- zIoHO}z%=UUhl~y&8qG9v`c9gEKbY}YY<)D|vFQR*y)jKN!YogYtu??roMDKl%)ZDG zwRozGZlvMf(eZ3yYVOXAX-P^J4VyQfx9gqjThw@@{gmpT!7T12$Nr;w;}&?H_%`A% z#by)&{S7|?Cl0ue@gjNzDHSqjVM;~s)y~*A9jpS94mF5aZg-{xpYM4 z>L1g$&p7l{o{cG)^Q(kF%jK=DqHn6EDsGu(0!vGaE=9R6PCag8*i35$?-dV=Y;j?C zeOKY}YVFvMn+YG?GFXTeg6)lc!8UEC-85o%TWzyd^5kh_RpJ*%ir9|1Mr-bpJ-{6~((o-_OjvTUpuNZn1V5i#{a2!M6=%|627Zdq6d) zUwEb5ExWg#bJMwXX1#B7OZP#DeO^|5wT@Zb?Sah-$=YH6WB2rtm7DU_1HE7IuU^_8 z{%%?eP4ZHfKgu#geiBi~cx-)Pc_FpISu2T)u^+TkYV=pocZ2z5`5D=iN^9fAwa!bm z6APPKOeE#|o+?qQnKXMnqVlv2C~uUUe~;On=sYi+M+ z@2y(4r2`?udIY&&67r;IByyF*&z*DDI6>(vw3e1K3KaR7)@J>Vp zDpI-mt{JE~x0$@MvgpZ+dB0p^NQ(5DepQ{wv1P#3OOqlwlOrq2N*d1g^_miAjoNAm z#?i;c;KxxG(Hv867&I8%)|O#(!$5xO-wlkad0Zw#G*8)W2H1R7J&UXTf}=z_ZS0M9 zq$RNj<+#Ir!#r)Q^(brG)T-cq25A^N6W4oibhM~`>+VWjK12l>nL>iC@iV+F);0-r z0*G|9t(UZ$b&kqv1t}uf6ZV_QbGQ3g?*7(*_q|UPd?K;RjjoK%u%AJd8_^%VSlZ+h z$p*6f7S2U9O;ybBWu^aw4Xi&tihPJGXce{&b$5Mui3HK76-siSkbEU-$E9QD9}KYy zC3IkZsuL0t;##k!ccoguv#O4@qifElgC6OR5937?E4gAWAEiM$HPP+ZJzXgyPOPkY z%-3WYM>odZCoaHNr01M5*~;0vOFnTp4kUnb@I9SrOye+Z-gPL8)Hl$Hq!cL3&3#18 zX@jTnf32FyY;lny zj>-G{$dI*5f}$c45b_zH_%eOy!9&}S0U9J(x5jn(akjP=G`Z9B-s z-A$MXOPz$7|ZT& zH+Hj^fG^c2+(0kjD}U^Z`iFel`|%P-W$`2D?(QN8`IJ_~lcJrTF z(pafl{SQ8j)@T!K_!BpbLXl0qtDP9(X&_$g=KA0^&$n+*a35b|3)X}!HXDauSNS1` zxi^T86RS^CAI8$kiqFMJFi%d{s$*uICZfr+3m)_qdP$mhb}DdmH$BCfTbFLx5HSNF zhh!v3KAqCmGp-Sx%H1EQy`BbRkbo9c1SCl{>J4@!(=<4SMn``(oQ9dJk;-hWU6z`# zlV7z1HbNu$c}vq-#c6LM2M!jc9R5KNB7booYr$1cH4y4y66CF~x+R)-9x9G`z zk~k-G#E6sqhEwN5~NZ^cQw91 z|38JHd-bm&FA^ZnO6t^ff~3d#+BKRJx<*DYw^xl1HgE$FL!{zW8>w_HD9%t8J8f#M zVv4EYu{SKMhZ7#Oa>%wY<P?AUWDJMO13Cc9?wfp zm&5AmsccuiV>k^X39m6nw1PD{LP|1Zp^*yT{ri;T%%sv|>g?P@m~r;DGGEUxF22vt zV`-?R@#5*;le~koRPxBDwCI`(t;#uL`wm_jvR)p(aAtwWn+@m|*>aykt8sX^3esDF)S-2{g(ioV{5C`%$qy)~ zUzW1hQyISI?H_Zv)yVA~4stZZp_+-uj#!V0Jo4Ojj+*)t-+tp%oLK zS$rR>ENN8wQReDTLEv(fvA-AzvZ!$PJh{T(zCem}9+#DtY#w=fs%z~0<*QD-@^iqs zgB3EUoM!}YuyXO*E5&A@jm><0$NGA#D#50-_CC%k_6~Y_1PN;Xqs5ywm%~p03IFd| zZ#>qwJklCW4mhOQUOO(GinkHsWMpJ4sHnKH>hbO^%!lrbawa?!um#~25*9Wn|D6@7 z`Bjv1%`#^!0`)RFX)&hJ|M`fM3P*l2)6J^9)#99-4hzb#q6w2P%^dsyQx`00V0}TwSAm zVc>*x-;6dG9$5O#m=Ehd-|qB)4C~Wc+?SOh4anZK*^G+&O0m+8;-!pM>sXwPtPlwj@E(pbF5|X1^F+9Z@>QC}AK00jA2Y1p?2QLK@i_yG z_jfOq6%O6Yp;nOtB(Sgvb8?fp(6u+`tq7k&v<(J=pJ;-!EMX0=F zrpPzWm!Jwe=PI-6ycrXHeGfE9_gzVAU&FQX3Pm{7vR>1|+DC7^R4>jO@HxAid#TGx zPP-z=KVQ9_r5tOjcW^@F5yj)l0^SW1Q=FkTL1nKwgXgB4LRLu z$prk$=&#$<+jfNqYv#P3v6I`!5PH{tU0of6WunT@ltxY(UbcMk@HM{otGnHI62y3X zmylrv&f_XW*w+LxcT-RYu-!Ixc58{Frb9OUS~IE2_@yxNH^}!p_uBSa<4c-`$71Ik zsms5@aeUB*)Rx7DK@BGv(rf!*`;GqF*z_}II^{R( z3~~JsQLtE+1kBU`3`7&&fY6ugFW1}_9Gn14ZX2J%9H9U&Qk!HRuX4DJ zMlbT0kxvqF{U+AtU?FFi5cLSaOZExz8D}WyzH3Ey%*gc!4%PZgsYS^}TbC4Ud9A)lDo z;y3Ap(+O^%0wFUO5%oMu7Q@$lgQ9`#sp;trYXrVI7cVitGeq?lpN4%+KGI*G+l0t} zwYkQ3x8(37gjA4z8M!xfCC~~O%Z`m$O0cE?{fahgKi~R#OYU!^BP@P3i9$jdUPr#% zuB;~E@^etP@NnFG?AIlTAJk(Qf80ld7~1#U4W%l?hY3?A4A1H$ah>3Gtv1mI`ig&$k5;?<& zsIN58+$e0Ng=tc+HE&$=t4+GzmO_kkI$JJ0r)5)h4x(;GB>7Lx-FM=gjhJqcTbP+k z0L38oSUTk97Sa_Quwk)X`m*2q$`K4@yYNud)=w{0E^A$m|Ic7-A4PiS0jgDb{xG0O z`LwbXI%sKzQ&2ee>Lq(t*>gPtiT3D7*fb+Dc+c^p@=wF{oU-FjKFHH=i#p%AhgVcf zAGA>Ux3X5{AoFnAJ#B149*$_+i$&Cl3%hi^&)Ki@Mdg{-;vGl;7T?(a3j~+_DQQHL zNp?nDkRpFN~mtLCuQllTvVKA<9FcAe)BUmU%NyiFC+EpdLIGx$&ThV#XL zBG1NKf0(S0QEDk|S7~MO*-TOgyHvwLy`3BD|3F}w2d#=pHn&go*N()7$guw&{O1O6 z%u4VUxQaw+O_lU*HYfX9;aA>g9nufp9pyzvaZ$meQf4KEx+Uv;0p~=@v!<=#3m zK4sNKo3e9Tk2p8^GA0q7p=FPTgtmNrp3<2nq!LUmAg8JZBzguduhlmXixo{pFwo4pQ!c2O! zkqs(k`8K)nQgymkFE){6g08@7=4Sm(pt4p%?y&+U@#c=F=X9t7`w>KBgjXDdcGJ2e z4`;R(IlPy4{FNvYFmLe3;Y|ki9Mreju$X99amb{SxD`9|tEQDOj;6=iS7uI!xCyU? zh&&6JX74+GmP6tcRQWImxtUm>{BSV(%AEfWD)(#UKa5_g1@1uJO=N4)TSNK96G5@; z>D$yi@bR0za%#iqQr7$`|rAeDmb>S51C} zS2`tC`lfuAbj?q`BRtlMDZGQJ4QaB0=B4BdV-V# z3xs*AIFlF;$p7a^6B8>1=o(o>*Lrg<_{YY!>a%&;ksy7F)*PO%t%~DBY_H)6<Y5!eGSV%z5u8Q_Njl_{1t&-Lia+MD-hFbfD5)8CrIXG|O_^m(qg zm_|BF(ND{J+~@hG4|8t5i%aNLe|RQ+(d=;Wn)K(mc0`dVa5dbBK)_;g) zXmIe1N{^0g;4=gF8qXgJw4}(prYOVzw&uBB7ol@gXC>ZSDKz__x`B~5#}s~;UkX4n zE`t!mpu9Rhs%H9N`#j)oi&()aUMmk1bY3j-5ycFEoKntgI_a9Iq&b{ri&YNEuo6eV zX(t4{9YF4&+y&ayQBU66r=C5uw?`Z<-XrP?m^`$7Hv`PeO~ub=^!Jb)~=Gd`ROTOMo2)`tL!8PM%s)!Bh~0+JRUYY^_`4-nN9x3dri76Qq`fpPZ7p zg->ZnPdr7O-e$Rb1aWw_D(|=Y?5|?ZQZwL?0Dd4Tpm$4!u>MR>{0OZO0^4}| z7XB3`BjZ%*Uqo+~O^P@Ktm2vP-x73s2q#O0ZLNI*CEo%;d#0JT^l@cs|a-^SrM z<=|@ASrb&105~bL-QrV@G`alNY9QO*@XxEgq}sg&z^RK%x2bQA1o4hG2Nydg3M0}S zsA5ojI{Gl$VF`#QIJJL1gKVfnx6w#=&-mzQT2}wloi7(bk!An8r@;}A)S7?p!Z#4_ z;TtENetf~vzJFwy(-(0RV#ZGrVpGibvS?2wvL#PX@Ak~Wx9pI?5!2Kfhg%Fdcd4>} zTAYs}?7v11{o<~C5(+t00)_xQ7A+`ynLIcYg8@(g2OiVFnI{c~8N2^?Va6t5^Y<~< zpahvGk^GUmFuk>|HExP7W96I+_FFe>t-%AlgPI=H+k;@nW$I3L-I=Z4k0vE2}dREQ}>{uPQp2aF6v^Qb-vW+zO{IK7(^ zM#*ISN#xTwLwB~dCaM^eNPdsEGYet6Fqm%K(jjc!6AeWH%*QIzguym!EZloja~A~d zxk9Xpr@eN^F5I@}0E|r(917x{$Lvs!?|xLKxK6kO z%Q!Y*bI<+-sn6>`E?QfDIYk1~kf7QFvyl_Cr;R!c|NM>LLLg$hmPc3kZ^hZtv4vb48YbE#fdmNCJ5x=xhOizTS8!-vlUGB{N;Y~iL?;^k8t zVHh;mOw{?`#7Y7E9?}3`6^4Cs#x5PP`t>6S`;FY?C!TBD;&c-#5Js3eJKy^+PAO1> zBm3uEo8YkoZ6{`{3m`JCs%a&2uBgi-wjRAe|8Cz?B?hyfHa!&b3ptbj|KYe z0jMT$o^e)GVwoL|hV~a08L5yGjMWC6jjRb+xD&{wD+LUp0{H%`H`)5RGU?B?wDADF z5j829*T6mxeEW9bmqa6-)+E)#pesng{tL!^@>8}z*L>f*+ChyZ2Yq-k-QswwVYuV; zsxrK=(K#rg=Qp5L7XyorEstO`GtbX&fb8g&IfeojZlfQoNva_{K$=!HecDx zaZlqpiC(!ODndk4Ajc}r3U#{#ZN2|hUDbai;hMnxTJ_$MP`KRFsC;*ny)ycS`$^Xt zD&DeAhMb}Hd>!;6qt&c%(#kgdj8G(SQJ|Jy3-TcY3(*i7gSKXSh%-|h0iqv*W0)WS z*Q;YQHR&vq(UFgRRo+XnMnJ}-?o=-onfynY<&+w&fASf2AWOs#lcvs zE}g>i1mRwYWzvg_T`Rjlci%a;mlVEgyvopBp-RoQoB&Z=4oN`u3&!n+lX^QBx4-*D z1f5)i=L9w8AJr-sUD+PJaG@pf2JpJ~9FvMr?|YSIWHlV@PzJ-*m{vzW3$kp2h#q`L zqxz)XX8y?sKkJ9DcAP@K&rdc%$^s_&#Q5-B=axM#x>i1Rvu%3SBMpePDnnkvD>SFT zH%#~wnsMUmyPte`bJmqAG1mVdr{q5edxWc}<6p~d73rWvzN_(8DN%Dh&BC~|m#!tm zy92fEe*kj~K)WESj{$1|>8vd?&8QahSZvX&J{|oGsdoShj9I4SeJ`_K?+3g>g1CFz zFSF`~HE=u)g!5fp9#OcgpFw{a+^gKrgW!_M6<}2OR>~`{cL!j9I^S%uNvQlR$>Zap z62AYH{vHl7KK*Pn|AkFX*m@NbP+7gcd{QodnA}T}cgW_Ad`Rp6Z$xF4 z%&a8YWRsN&AuBH{*(7`K-5``C2`^b0*)w}qMo46DA!LW_(eK>)e7~RH@AuF9U5{S( zxUTD5=RD8zJg;*v+kYti00k18MZYx|V)D9|7GzG!tR-WzW>u#MYAeb*dyKCr@?7qL zE!bmpKnYnmLwEzpD!1~AC>tyqj@Rr-AdL328_x2re_^!#aNhxsMapc$0h=C#QZ5D?%;W$oCDE5x8OlejFxCBYk#ws zD$+0(t6hSI_Fa8dJxRu}hf&;5jJG)tN?w^;@d@E$m#C1|I2BHMpV(s5m(gak1*Yuaf}@Oj7Y6>QN;jx$fQ zgkHzb%lrVYlNW}W-$f7)C2Nk|p7{%RPCWx<_*BOn$b5oKlX=szc1^7Dkb4&laG@0( zlN(SEgCl_U5__I=t2pgn<}T+g3b`}58hq`gMFt;TtmRInwTY6vfc#K}S&U?JAdhp! zW(f<)IyKdYC~#`+cy)DmI~#q@+ws9xBgiGncngV3^l>*HGXR!jzQqunC5#jXIbEt# zxGlvN505;z`{SS@M1KZeavMCd*Zf4yb+Zon;RAnKI?LDU3)gR^~Ce zdAF5eJ?SPu^Vbvm>jjuoNMTtg{0TPQ54M>g=pxmnzWpF1Me+!d`GvYOX2pc^sD#vp0bQ9D}eWn4S&PQy6JllBd~|CkEMk z+44~U5(rNH0B=8$^6&Fj!HV-L!rR8yBnWrGN+J~m_P}h|s1Cpv2@EZ5oj7ak5uHKr zE;=0Ri5ED$Z2x-MJ`IQ6=_sLHku@RXEbsaepvynh$Hang_`p8?LRBgi%ylx9ek5V{ z)QJ8i>#-JzQGB1?HyufZC3JkKB96s+fQ>sZ=`^Q}bsqI2#@7M(=Pj1{KlF~tj@Y0_0{4|W`SNB@%)9DA|B1+# zjF_*aM)voY;lG`Unti`8FKY1? zUjO4S@P0a91qyI#tUSULA#_)*)3R<{ey+zOGU=|`ynNt-WHx+8h;$ zV6xX7iBR8YIBISmoXD=;TVxv;(e-(?hX+GP9fu=SS1<7}o)O)7NI-uNj;pq<1dn`c zEl(hKViuZ4*hYrVj?^066%O}9`o+!|s|oYLd%e-tamcA_)=PwXp<~qcY@D{s&!7Nt zp2Rm)Tles=vch4`4b+^L{n;|-BWoTGZ|GC=$Kj}6sGq)VdaZDR_Qws0?eLM^2i42Z z%SLxy9!t&q5UO?vUQMLu+N8mnA!Yu?keh4^cjAymKB)7QO+31V8Xx{9LBOWxhc{}u z4cG8O z8N~QWUuXjM-a?p*Q+UpubKoatSD#s!NJ+&->)pC1ts%0+0{IbGX;!e*<(B2oK0r(hrSFgGTk7j3s%2teQu@t5r*#MoRyJ-Jy;zgn)9DbM=!s+xui z;`kIu#?({1(fw|$XodhSJADoRXexCty$_~E(YMNC!p=-YL?Q23A`PSjw3Y8 z)MrngBuzInbkN%&3THM6kU5AV#S?cl*5vWHJYWbv*mrBv+!9<2VjtO2BMk!HW!{Eb zS@*%(^zZ^p3}9W4BjIJrZR{5d0kqDGl*IsIj#g3>iBG5bfu%!6AJh!1B?CD1L~`bm znE{XK4GejZpua>}jC8A47q`e*Z(DPeL4LYOQ?NyDZIw%+{s3{z&v|wsYMb;vd|E@J zaRwc)eA)ILv%khd-ysix+^{e>+s9BDW^?89xOJvBKdrz`Ar|-@ckZCN*#%+UkJjA0 zs~tTs!$jzP(RnW$BQ9uzB!&W4xHYZk-FuB!bFBF2B~OBBbHjr25aZL+ef~GJ!b`tI z)L&y~mg+r^h-IBrLNftQ)dI2{bhTKM;=9!!M^jRjkHa!`=}Sdk2&jLLRm*fYwR=g6 z7btkSl!BjvPnk8rVim2q3*nOp51#gc9eeq?&W5qtrFtPcpU{dVr0`-%CElC$~m$YE2S;oGHgol2T#(ESUCfpj0PL@_ciSSE2KN zZ3Q2BPbVEr%O9KA&U0(`P%c48i5>?>=)Mp-w>O|S>Dqs+`!MO!*kTYC$XR4Hhb_mJRaQ_D=*B9!scq&|S@p&67t(d&arPNa z>s&eigF`24LgZT{6rPgHrY1;|Ni?vCbkS$m^7Vz5URNSS zRK*q9N*K0cV9-&j4r)b3)G*O9P>-#`i!1A8bgh6su;zNf9;JFak+K)A?0c&|b}br8b*k^JvT;~- z!<+6;Hrs(uou$?Eda1MaEF7bT6xN$_HXT_zrkh4VR|{LUVh{kWeJIm_M+Y*1aC35? z-<&pZ)(akdezz9~z52Y4*UN=Qy)&C95Vp6kdo=MN%`_Mw%E@=DEnE;!dM^gc?}lDF z${u~r&IJP=UtlSkKzEi_I!@`%DTGfgqU|xKNI!GTU+Y(TU=6BmIHQ=+D4x8-Y@R(obdz!LGT43{C`{nPbOQ57Owdjf15a;%)+;+%Fl>I>Qp* zs^HDFuGb^<-OT{ zZ;N+4&Ga2?typd&Q(B&5XMmRbyuPU+EhrdO)+%Dl=+>o6dx04LjryI|9NZEJM=3{Z z>F!pu4Oc|M79svHCOa}r#{<6Gl$OM?Pgn|R5PBTV_(N-ldAgSj$gTyoYZ<3x9>cl4 zeS2$2*+N>ThmQKdF2KOl@BGVKEAuS$q>~=(5j$2wQ6%Tup|13H(jjgW64*>v@CS)* z);r^N0@+6+`vP;gaDy%6YQ+*;<|AX4HdaOfpU-K=^*VWd>yB;xMv;QtW(SZwP1 zZoD?$gctfpIf~Y&kgetqw8jh)+g2kl9649|nhn80h-pg$$>yx=kZ_V>+g62q?v%{T zu>YEwV#eSU4)Rq!OLR6}7WrXoUWC`L_1t}!;o{xrk+y4|jXm8rp2G;-y&NX6GVOLM zDa-yzCj-3;R+IK-_`$$bw6lst6ho1Qy8m74!bpt{k;og*&D*u3?Dn^16+y8Qlu#oZ%DX?CSX&3%^SmNpHu_Tt? zVV^zcd^Ixfm;4Y`Jk^VUi!*V=I;(f9(r)eTfc@~uNV?fy|I;UMC5wbT1N^T8l&x33 zh$I&^xBC@pfKT7U36w%X+p&{1qjcc?RmD4RtLOH&yPZz>SJ(-s&9J3>Vl}3$Ol02DVZuIRAY07MeIg*#?up9y-w&Ef z8dbd5jH?U6@ye`FMQPLHX8kyBn9-Z_XZ+w6K+fbf?>4`eXaexNRpbXn6J@2hI8Qv* zVx+GUd9GE%uhR>DZuy?*)X2z))dw7(5Vmum-2v4T5Wr=l+wZMFP{dlKt1N5o^D3{T z1OsDUeHO``c!uKdZSzY@zIE{2`z|@H%Wnc)cD^xKIXJ}B8NUoskjp8m7(Fo8B9&g} zL)Yj0mFiT|h|Ii<9JSQ({t1{pg>R=1}tgGL`qt3agBlQq7z3-TM0oK2N2I^(d zx%YldUQfoe`Oq1%>s}IMX&&9bSp@eu^1t4fNeU;O?h*2}l;Xvg;0%X}=Vw}`))j@m|DL_KW^n)_inP_q zr|H%4rNNeUz&7qC{Dq>sbP_di_Rib(HzypPt;VI|9gftm{@yodrx04&Ni;IF(w$a; z&?KbNZ_0mqYfH(;N8$>*(CfP-r9}_%M&^o|T*gw=)x{5_+xsnU_RM@5ee|}{HGRs* z%c(metCVn#M=wlF0kOt=Ubwii3+ zrnIhY@bcd0lZ^M)oi2~N44CqN-ezBhLD>EXBo2Bs^4G3WWv}+d>R8Lx=(^o!+IgrF zeDYWc0nakNV$aO{{pEDs9g@;zv-R)E@OwAmviPjet5I2(QU&-0*b5GZyzUa-YLk|x zis;eB$k4MOLYke17c7Ss@gmy;qTkyi##dH5u6!x~``HL{DwY|1wyD|8sn91@KJpZ) zw6{*~5s6YUk_b2v$b2gL)Z0F~zWnLWvyb6r{h*Sub$`=&J72#fd$i@YQ2h#gDUtlE z0wn&-Ha1WZA>PN{Oi5OLPTbb`CHb;L|COLi&R&yM`i2#TYplM)U~HEMN4N|NVy5xj zZnH+6yL(S?$+rUDJv8$Ac{(vB^3RXoB;LsB3(jaCFxvN^jGv3x+ymjc0>m`}5#@2$g0`g5iw=K8 ziiE=479Ey1hPuE(ba(*{cBED3-1ZLfl?w-=6m~sv93#o5Yg^;*WO@l9+mX-@)+(Jm zZSx+yZ~T-C%VV;H@vlhl(*au|GyR8v&Hqx>{+Vsd+`|?{vRyiB0%U9b}ezE1Q@r7UdhvJ8&2uRYI}HRHegOn&i5yoHpcz0omcXj#5~e>nbr z#AJRxFKmkSM>#);QZKFhz?a>Df}owg{W0|K!4%%WlU}IiPcEnx^k_bwgi+=;nFcqj zE>pl$VbjLZ@Cx<3rE$Ycu7v$_6^=i&GzXVEG^-ii%jMGM1v$Ku7&pYmy+_xles-Oe zAFa6NZmF9{OXoCd8m;c}UYX&1G-{*uHO$nrROWlbrYc6a2i)$Sep>nP%*?>;+Kv^| z)cvd?vVo-i7o>k;>~j06GaFR4fkK!aULq66jpX z4&$U2G4W7@2x2qnCFsvVA6X)}Aw2Q?$`R;~7T^5Y`g4};{{<$Ka@&p*#IFWIDp3#`r4rON;I+VYI4`N2q?}x-y^`t= zTq5u~?O)!Lf=-BUJS{|j^zbQn-U;NXaWpM)CHrmG%Ty6`1b8z!cd?DmE4I%za zZ>XZzWELACNm*qR_R>uMyE_my8*jd|50$+EyGM9Ay?=7sPV~i?7(V&J%4-Z8>-}jC zgKyuywhzVaX4BbL<+tZWQ*OC^@`I1`Jy{*i+CA_Dhw)a@J2uuu=)fOAF?^?Cc)|*S{a8%(0j)7n~o;4E{-QiLNT66nBryGw0dvXe_O5ljj#O zjrrvjs)&}GPAS}wC79dg&HkE!^>SYSWx^coLEnS9B|ih2%mOP;;o>sZELXipwYBu^ zyns5;x5*k}Sl|%yvC91T+6VX9h4yQQn{2RCX$s5>YzqKUZ{i|839@*lfDh4apPNFp zFwebo-_qn&RF*moD$MJ~ z?cvYv(q5jkcK}7-s(csj>Om-=$oBVJdoR~I9-L;rV3G|rB76UHk&h$JmYzWf7CAPb z`Uv+EWKko7EuX?iC~&m+z0Z`IJq?}#W7GbL>-fZ*&bCSH>XzZ-HkGQp5gB4>r zt^39}0{)D~-1qmAQ%$PY?OW6L^}pfg*H}~aH9;XQ4kB>&4aDzVi&fVg~&G4lPgLMQcsbj=He10KQUmPlk1Rl#-``r>%hjW5+DBBXk{! zkZ?ZTg){fu|6c#O9Z2f+J&C`h2SM1hBb!fXDS*n{mTYJx)7F=y7{cbKe zY7Jc^zbIv1cy-_>c(`j6%&Md#)>hdhL64jl<`vHql5J=eKwvZUTJ-Jf$y81e|La@% zMz?=TIw5mB?zYa)ujyPq{-dkgw*#OLc=qpwzcXo)%94BtO`fROTGB0#qw86qJ6Je@ zY<Lg^g?e8R3Tfz+*u8o zm`mlpl3jU_o1$KrF<)A0so5R({13jBy|@ZbQLb$9r?C8^KUI>O?Wy3(o(lue^Ei4K zgGB=UP_|SML_+Espb+>nj5QaC!`90`onS)^c`(I<)*4~D=j1%$SvJMFudyP_TpXw5 zgc)zjw#%lZt5Oc7D*$IP7oqm$mrVUzX^%Ts7fN>yoaiNP@u-wSyt?XU`pQC-dk#vX z=(?W(?kg}s4U1yEA2<-P;f8L@soJ)gMNf&4*Y04uaWv;&_pIvYT6^;xOMbd95EiXs z+cift>A*kCOo)H`^oAfFel)=7r){`fveDKe&>=jRnVz+Euy#65{KhnH{|CqEG8RnL zhjJ&9lL!HAi~+e#dj3!EO!yw`T-y0T4%%m}9rwzu?X%r>{Eqj_%CmZvpA?8D9|d8X z4UBc6)-6obc`=SXxE3BP0Up}WZ{>uFaMY73iJ87R)h|UiKer`e+NHe;-&n_6gS)8N z8$FG+F027k6mtT|zs{9w?7~GNG6_h--YX91ieuX&qynQAo=CfYg9NemfT5zn{C%gv zYe%8{KUe>GuK6=TjdRm;`B7T%Sg${heI0te1vJ&?7gjW1c-?pIsDpX`U$a}&|GWoW z^qVWsU#J87@eNO^9f$CXjA{Z;RU8+{D&5!%MG!!l-qr;{}R8 zC;iiIQ~x&?T{GS*`Z`DF>&}t(=(`lkGT+g{Ecfu|Zx6@&iOS3a zdLKzf2#p$&bP3mJK$T{luciSTv(Sh@CFgB&TGZ(Ub|`b@R= z`(B8|sFP|`#tFO*QPFERr)38AL>u{)rdhqr0<{DGYjUnHt>58Fz&}pzkPG#3zuS?_ z6d6EKyxoK}x}iI#!mhb!btbhCkbY@5l2XN>SUmmbEF0O?om1p*;H*nJ6h>d;Be@ZW zeWQLilM^{g0fHKe9X)}uVw4ffz^Gei+9434Q%<6yvsVctzHP+!CEV*NXgISohI2X- zm`uN!z6d8le|DwTNp)VV4nRfAbmZ2Sd)NaL4`wppbC!i2Ep=5BV$&=O(}5R3=~mZX96=KgEuyy`>f{g1t0d)2z(?&Ij2%X zh$`wH7nkr@VVt-C=Y-!{d1x#yLQd(>rqd%7nw#fjHr|{)R2`aut$kq@JqrhLq9h_i z*2fL_)R-gH4P)goB&v=ZQCf-_Vo3;+y0nt8oCs8dEMn}pR4~ii6jE4f`C*}xXPnsk zXy=5_P2ejj;@MhAvv_RTkG{UIwCEvP;iOHyLLcxb1FJ$|_CZUN9FNcixPZt~;h8xQ zNYJ}X7)S0CAjZjS34d==upooV0_i37*k_P@i#m**Q|ZY*8ifTR-#>*={U>w@4bbyO zDzM-3O7!-A#o-)}qNn$XiJB5dYOFTnMAXgM7GZ@IOeBtBLGh!aa0bo96tZD=XJt%> z@VlZ|NN2TLPKT4wzg#`|IPml5_ssA{U(Gi|(TRiD___$^cjiAdM(Kr9fna82~0bd#`57 z(0cSNg6wBzRD$L$+Kj-2*I*!;^((r+cFSJ~l1-oOlT3p2S$H}6*m)a9ttz->@hVv zQ*(90{lf?MU6YfTaRb8>#Q8bQ@J_yFq`P|$6Gs2!D(wI0#E5@6o5DwWOZYuUumpf; z@3+0D1v~S&I8+&M^D81`Tu2b&@@ioB6p@Cid|t!%r%0=R8=ZcdlPKePwDY9qKx--u zY2YwCT5w7io0uXoV>QC6xvfIHeA(*!)CYdjy;e;XuFbF=zL3{ss&ws=k=W4*OqwGJ z)i2z@i>w|;o%v99M%(?=@7(`xBzo;`H1OLau{Xiy%eA$$v681C&w<#XZFOG=%15Z1 z+pHv4B4UNQVZAVsdaYLg_yMX<6%ASM*`gWW(=vn&!?_wbI$5w&0g-Y`>v7J(`=*E> zAI^UdX)N$TS@`&!kR5`SE;j@1Pm|f&JisNq1i*7Qo$@=ZZx*bt0?VL7UZ{`?Ci^cK zxYvaH>AqH3l^)q1A;Ny9Y_gZxKGQg=P8(4nEEriuyuipZI-AJtzpn&Au*c{8J>epp zWy_0>&Ni(9gKWDXwS8Z^1~2e41ex_uYi!3$aY;L0QInYo2oL4h>gU#%qO(ey)$R1^ z09Sp>`gnK(kx_Bq>Ozmksy;CR{p+2+j@P91YN}FF9Gw@El0A_h=O77+rWI&9>^J7^ zi{E~)dKPD1o-=$+ne}s{6<(%L4S4mlIHy#Ez+cohD^!Do$TE#9F+Hv>V4U15Plq=Ht@39!(gfB_W19ZW$@EC?V$Z)j^+#HDlHlJI8lUp!xD z{8p4hG1u0M<=3Pg|Cda}nm*ho9MwUP&t2$51%7ApV2;ezzH~uCh#LjaLs9r3vWLWSWQF#-la2gkentN-fUOjt5r7Cl#JOi99bZDRK{SMgoP^{6lRElK_1HQj2DV z^Li^NlsUbrS$B~hf`~rvt&g-Ubww$E48Kj$giv5}IaStlB~^CJn;Lx*~~1-5!o9rj1zz1^A;A|lF@(2RhV;g^o}Fpvho zWuzDr+-6tKkrEd9)ZsIFt8^$^fF$%J)WAVyPI=+hXS#|Da15G{02r}`&@041mRM#3 zNj3$(TnTzblWnQ->*-I{9ztgN=EfurXOBjx>?4{1S|}rixdBXz4HhjVBJ#jV=9Oxi zSOTFM1_t#8G97KRrCQ^Yp|bC?oZO?_UrUaSVjX{M7NAb2|{H0a*fPNhMF5CdIpygVmJaSH!^alo9~in!dysn`ZT) z&m6ryt^49__3~8`_ica3G;Jtu-O_yD{ae~S#Qaq9YjdTTc23pXv)T?LjrXeF5YAlPJ+Hz8b(d;v6LF6D8H0M)$@e-92Dx!9cs+4l;L;oCC}28Wsn$@j@^4wd_7ujtT4(|kc!7ymx_rRZrUQ49y6 zmOS+Ps;CH`KBxW};DdUJA{kjhNXXAD0z{YO&ddHN;1z%*nJ+>aCUDIha6rlgb+SWo zUPE1fidPM4$Ht~My*YF#IeFf}TZKN9?P~^j3k-{J{fZbb*TAj&0%rridFDEqiD?UfcCFRaekp?5+>kv%( zYunTUT{H-_@S|xI?8j57IQfHUonBtfYLs!-$6XlohPlJo<}$pa05J@as5bkfAe7{& za5hLQRN4X;sX2NL%IT?)G;yh_!7j(zXu*NKa7n|bH$E0e44IqeWlU>4fp3`80*Yb5 zhzG%uD28*D1Gk^! zfgYitaG&z12NH<=6LJ>+G(siyaR&D@AsoyAufrv^h3<3xhs21?CCCJHe9tJsk(O3- zc5VDdnRnlV8F>P7XVG`7K8rWsl~j)91?Hq(+M<3!Erm8DjULHl0Me*17B&>hSm^%1 zJyMm;`{)JE_Nqwp0(|*kL)p*&!}`_W8?Uj8ou5M<%0A9oDv>9z*-J8Llo{?kUhXzg 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 jhSErxPtIv&Z^E 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

K$ZGDX2O1Y)%6J>{q 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 diff --git a/theme/highlight.js b/theme/highlight.js deleted file mode 100644 index 4859699f..00000000 --- a/theme/highlight.js +++ /dev/null @@ -1,30008 +0,0 @@ -/* - Highlight.js 10.2.1 (5b87cc4d) - License: BSD-3-Clause - Copyright (c) 2006-2020, Ivan Sagalaev -*/ -var hljs = (function () { - 'use strict'; - - // https://github.com/substack/deep-freeze/blob/master/index.js - - function deepFreeze(obj) { - Object.freeze(obj); - - var objIsFunction = typeof obj === 'function'; - - Object.getOwnPropertyNames(obj).forEach(function(prop) { - if (Object.hasOwnProperty.call(obj, prop) - && obj[prop] !== null - && (typeof obj[prop] === "object" || typeof obj[prop] === "function") - // IE11 fix: https://github.com/highlightjs/highlight.js/issues/2318 - // TODO: remove in the future - && (objIsFunction ? prop !== 'caller' && prop !== 'callee' && prop !== 'arguments' : true) - && !Object.isFrozen(obj[prop])) { - deepFreeze(obj[prop]); - } - }); - - return obj; - } - - class Response { - /** - * @param {CompiledMode} mode - */ - constructor(mode) { - // eslint-disable-next-line no-undefined - if (mode.data === undefined) mode.data = {}; - - this.data = mode.data; - } - - ignoreMatch() { - this.ignore = true; - } - } - - /** - * @param {string} value - * @returns {string} - */ - function escapeHTML(value) { - return value - .replace(/&/g, '&') - .replace(//g, '>') - .replace(/"/g, '"') - .replace(/'/g, '''); - } - - /** - * performs a shallow merge of multiple objects into one - * - * @template T - * @param {T} original - * @param {Record[]} objects - * @returns {T} a single new object - */ - function inherit(original, ...objects) { - /** @type Record */ - var result = {}; - - for (const key in original) { - result[key] = original[key]; - } - objects.forEach(function(obj) { - for (const key in obj) { - result[key] = obj[key]; - } - }); - return /** @type {T} */ (result); - } - - /* Stream merging */ - - /** - * @typedef Event - * @property {'start'|'stop'} event - * @property {number} offset - * @property {Node} node - */ - - /** - * @param {Node} node - */ - function tag(node) { - return node.nodeName.toLowerCase(); - } - - /** - * @param {Node} node - */ - function nodeStream(node) { - /** @type Event[] */ - var result = []; - (function _nodeStream(node, offset) { - for (var child = node.firstChild; child; child = child.nextSibling) { - if (child.nodeType === 3) { - offset += child.nodeValue.length; - } else if (child.nodeType === 1) { - result.push({ - event: 'start', - offset: offset, - node: child - }); - offset = _nodeStream(child, offset); - // Prevent void elements from having an end tag that would actually - // double them in the output. There are more void elements in HTML - // but we list only those realistically expected in code display. - if (!tag(child).match(/br|hr|img|input/)) { - result.push({ - event: 'stop', - offset: offset, - node: child - }); - } - } - } - return offset; - })(node, 0); - return result; - } - - /** - * @param {any} original - the original stream - * @param {any} highlighted - stream of the highlighted source - * @param {string} value - the original source itself - */ - function mergeStreams(original, highlighted, value) { - var processed = 0; - var result = ''; - var nodeStack = []; - - function selectStream() { - if (!original.length || !highlighted.length) { - return original.length ? original : highlighted; - } - if (original[0].offset !== highlighted[0].offset) { - return (original[0].offset < highlighted[0].offset) ? original : highlighted; - } - - /* - To avoid starting the stream just before it should stop the order is - ensured that original always starts first and closes last: - - if (event1 == 'start' && event2 == 'start') - return original; - if (event1 == 'start' && event2 == 'stop') - return highlighted; - if (event1 == 'stop' && event2 == 'start') - return original; - if (event1 == 'stop' && event2 == 'stop') - return highlighted; - - ... which is collapsed to: - */ - return highlighted[0].event === 'start' ? original : highlighted; - } - - /** - * @param {Node} node - */ - function open(node) { - /** @param {Attr} attr */ - function attr_str(attr) { - return ' ' + attr.nodeName + '="' + escapeHTML(attr.value) + '"'; - } - // @ts-ignore - result += '<' + tag(node) + [].map.call(node.attributes, attr_str).join('') + '>'; - } - - /** - * @param {Node} node - */ - function close(node) { - result += ''; - } - - /** - * @param {Event} event - */ - function render(event) { - (event.event === 'start' ? open : close)(event.node); - } - - while (original.length || highlighted.length) { - var stream = selectStream(); - result += escapeHTML(value.substring(processed, stream[0].offset)); - processed = stream[0].offset; - if (stream === original) { - /* - On any opening or closing tag of the original markup we first close - the entire highlighted node stack, then render the original tag along - with all the following original tags at the same offset and then - reopen all the tags on the highlighted stack. - */ - nodeStack.reverse().forEach(close); - do { - render(stream.splice(0, 1)[0]); - stream = selectStream(); - } while (stream === original && stream.length && stream[0].offset === processed); - nodeStack.reverse().forEach(open); - } else { - if (stream[0].event === 'start') { - nodeStack.push(stream[0].node); - } else { - nodeStack.pop(); - } - render(stream.splice(0, 1)[0]); - } - } - return result + escapeHTML(value.substr(processed)); - } - - var utils = /*#__PURE__*/Object.freeze({ - __proto__: null, - escapeHTML: escapeHTML, - inherit: inherit, - nodeStream: nodeStream, - mergeStreams: mergeStreams - }); - - /** - * @typedef {object} Renderer - * @property {(text: string) => void} addText - * @property {(node: Node) => void} openNode - * @property {(node: Node) => void} closeNode - * @property {() => string} value - */ - - /** @typedef {{kind?: string, sublanguage?: boolean}} Node */ - /** @typedef {{walk: (r: Renderer) => void}} Tree */ - /** */ - - const SPAN_CLOSE = ''; - - /** - * Determines if a node needs to be wrapped in - * - * @param {Node} node */ - const emitsWrappingTags = (node) => { - return !!node.kind; - }; - - /** @type {Renderer} */ - class HTMLRenderer { - /** - * Creates a new HTMLRenderer - * - * @param {Tree} parseTree - the parse tree (must support `walk` API) - * @param {{classPrefix: string}} options - */ - constructor(parseTree, options) { - this.buffer = ""; - this.classPrefix = options.classPrefix; - parseTree.walk(this); - } - - /** - * Adds texts to the output stream - * - * @param {string} text */ - addText(text) { - this.buffer += escapeHTML(text); - } - - /** - * Adds a node open to the output stream (if needed) - * - * @param {Node} node */ - openNode(node) { - if (!emitsWrappingTags(node)) return; - - let className = node.kind; - if (!node.sublanguage) { - className = `${this.classPrefix}${className}`; - } - this.span(className); - } - - /** - * Adds a node close to the output stream (if needed) - * - * @param {Node} node */ - closeNode(node) { - if (!emitsWrappingTags(node)) return; - - this.buffer += SPAN_CLOSE; - } - - /** - * returns the accumulated buffer - */ - value() { - return this.buffer; - } - - // helpers - - /** - * Builds a span element - * - * @param {string} className */ - span(className) { - this.buffer += ``; - } - } - - /** @typedef {{kind?: string, sublanguage?: boolean, children: Node[]} | string} Node */ - /** @typedef {{kind?: string, sublanguage?: boolean, children: Node[]} } DataNode */ - /** */ - - class TokenTree { - constructor() { - /** @type DataNode */ - this.rootNode = { children: [] }; - this.stack = [this.rootNode]; - } - - get top() { - return this.stack[this.stack.length - 1]; - } - - get root() { return this.rootNode; } - - /** @param {Node} node */ - add(node) { - this.top.children.push(node); - } - - /** @param {string} kind */ - openNode(kind) { - /** @type Node */ - const node = { kind, children: [] }; - this.add(node); - this.stack.push(node); - } - - closeNode() { - if (this.stack.length > 1) { - return this.stack.pop(); - } - // eslint-disable-next-line no-undefined - return undefined; - } - - closeAllNodes() { - while (this.closeNode()); - } - - toJSON() { - return JSON.stringify(this.rootNode, null, 4); - } - - /** - * @typedef { import("./html_renderer").Renderer } Renderer - * @param {Renderer} builder - */ - walk(builder) { - // this does not - return this.constructor._walk(builder, this.rootNode); - // this works - // return TokenTree._walk(builder, this.rootNode); - } - - /** - * @param {Renderer} builder - * @param {Node} node - */ - static _walk(builder, node) { - if (typeof node === "string") { - builder.addText(node); - } else if (node.children) { - builder.openNode(node); - node.children.forEach((child) => this._walk(builder, child)); - builder.closeNode(node); - } - return builder; - } - - /** - * @param {Node} node - */ - static _collapse(node) { - if (typeof node === "string") return; - if (!node.children) return; - - if (node.children.every(el => typeof el === "string")) { - // node.text = node.children.join(""); - // delete node.children; - node.children = [node.children.join("")]; - } else { - node.children.forEach((child) => { - TokenTree._collapse(child); - }); - } - } - } - - /** - Currently this is all private API, but this is the minimal API necessary - that an Emitter must implement to fully support the parser. - - Minimal interface: - - - addKeyword(text, kind) - - addText(text) - - addSublanguage(emitter, subLanguageName) - - finalize() - - openNode(kind) - - closeNode() - - closeAllNodes() - - toHTML() - - */ - - /** - * @implements {Emitter} - */ - class TokenTreeEmitter extends TokenTree { - /** - * @param {*} options - */ - constructor(options) { - super(); - this.options = options; - } - - /** - * @param {string} text - * @param {string} kind - */ - addKeyword(text, kind) { - if (text === "") { return; } - - this.openNode(kind); - this.addText(text); - this.closeNode(); - } - - /** - * @param {string} text - */ - addText(text) { - if (text === "") { return; } - - this.add(text); - } - - /** - * @param {Emitter & {root: DataNode}} emitter - * @param {string} name - */ - addSublanguage(emitter, name) { - /** @type DataNode */ - const node = emitter.root; - node.kind = name; - node.sublanguage = true; - this.add(node); - } - - toHTML() { - const renderer = new HTMLRenderer(this, this.options); - return renderer.value(); - } - - finalize() { - return true; - } - } - - /** - * @param {string} value - * @returns {RegExp} - * */ - function escape(value) { - return new RegExp(value.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&'), 'm'); - } - - /** - * @param {RegExp | string } re - * @returns {string} - */ - function source(re) { - if (!re) return null; - if (typeof re === "string") return re; - - return re.source; - } - - /** - * @param {...(RegExp | string) } args - * @returns {string} - */ - function concat(...args) { - const joined = args.map((x) => source(x)).join(""); - return joined; - } - - /** - * @param {RegExp} re - * @returns {number} - */ - function countMatchGroups(re) { - return (new RegExp(re.toString() + '|')).exec('').length - 1; - } - - /** - * Does lexeme start with a regular expression match at the beginning - * @param {RegExp} re - * @param {string} lexeme - */ - function startsWith(re, lexeme) { - var match = re && re.exec(lexeme); - return match && match.index === 0; - } - - // join logically computes regexps.join(separator), but fixes the - // backreferences so they continue to match. - // it also places each individual regular expression into it's own - // match group, keeping track of the sequencing of those match groups - // is currently an exercise for the caller. :-) - /** - * @param {(string | RegExp)[]} regexps - * @param {string} separator - * @returns {string} - */ - function join(regexps, separator = "|") { - // backreferenceRe matches an open parenthesis or backreference. To avoid - // an incorrect parse, it additionally matches the following: - // - [...] elements, where the meaning of parentheses and escapes change - // - other escape sequences, so we do not misparse escape sequences as - // interesting elements - // - non-matching or lookahead parentheses, which do not capture. These - // follow the '(' with a '?'. - var backreferenceRe = /\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./; - var numCaptures = 0; - var ret = ''; - for (var i = 0; i < regexps.length; i++) { - numCaptures += 1; - var offset = numCaptures; - var re = source(regexps[i]); - if (i > 0) { - ret += separator; - } - ret += "("; - while (re.length > 0) { - var match = backreferenceRe.exec(re); - if (match == null) { - ret += re; - break; - } - ret += re.substring(0, match.index); - re = re.substring(match.index + match[0].length); - if (match[0][0] === '\\' && match[1]) { - // Adjust the backreference. - ret += '\\' + String(Number(match[1]) + offset); - } else { - ret += match[0]; - if (match[0] === '(') { - numCaptures++; - } - } - } - ret += ")"; - } - return ret; - } - - // Common regexps - const IDENT_RE = '[a-zA-Z]\\w*'; - const UNDERSCORE_IDENT_RE = '[a-zA-Z_]\\w*'; - const NUMBER_RE = '\\b\\d+(\\.\\d+)?'; - const C_NUMBER_RE = '(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)'; // 0x..., 0..., decimal, float - const BINARY_NUMBER_RE = '\\b(0b[01]+)'; // 0b... - const RE_STARTERS_RE = '!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~'; - - /** - * @param { Partial & {binary?: string | RegExp} } opts - */ - const SHEBANG = (opts = {}) => { - const beginShebang = /^#![ ]*\//; - if (opts.binary) { - opts.begin = concat( - beginShebang, - /.*\b/, - opts.binary, - /\b.*/); - } - return inherit({ - className: 'meta', - begin: beginShebang, - end: /$/, - relevance: 0, - /** @type {ModeCallback} */ - "on:begin": (m, resp) => { - if (m.index !== 0) resp.ignoreMatch(); - } - }, opts); - }; - - // Common modes - const BACKSLASH_ESCAPE = { - begin: '\\\\[\\s\\S]', relevance: 0 - }; - const APOS_STRING_MODE = { - className: 'string', - begin: '\'', - end: '\'', - illegal: '\\n', - contains: [BACKSLASH_ESCAPE] - }; - const QUOTE_STRING_MODE = { - className: 'string', - begin: '"', - end: '"', - illegal: '\\n', - contains: [BACKSLASH_ESCAPE] - }; - const PHRASAL_WORDS_MODE = { - begin: /\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/ - }; - /** - * Creates a comment mode - * - * @param {string | RegExp} begin - * @param {string | RegExp} end - * @param {Mode | {}} [modeOptions] - * @returns {Partial} - */ - const COMMENT = function(begin, end, modeOptions = {}) { - var mode = inherit( - { - className: 'comment', - begin, - end, - contains: [] - }, - modeOptions - ); - mode.contains.push(PHRASAL_WORDS_MODE); - mode.contains.push({ - className: 'doctag', - begin: '(?:TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):', - relevance: 0 - }); - return mode; - }; - const C_LINE_COMMENT_MODE = COMMENT('//', '$'); - const C_BLOCK_COMMENT_MODE = COMMENT('/\\*', '\\*/'); - const HASH_COMMENT_MODE = COMMENT('#', '$'); - const NUMBER_MODE = { - className: 'number', - begin: NUMBER_RE, - relevance: 0 - }; - const C_NUMBER_MODE = { - className: 'number', - begin: C_NUMBER_RE, - relevance: 0 - }; - const BINARY_NUMBER_MODE = { - className: 'number', - begin: BINARY_NUMBER_RE, - relevance: 0 - }; - const CSS_NUMBER_MODE = { - className: 'number', - begin: NUMBER_RE + '(' + - '%|em|ex|ch|rem' + - '|vw|vh|vmin|vmax' + - '|cm|mm|in|pt|pc|px' + - '|deg|grad|rad|turn' + - '|s|ms' + - '|Hz|kHz' + - '|dpi|dpcm|dppx' + - ')?', - relevance: 0 - }; - const REGEXP_MODE = { - // this outer rule makes sure we actually have a WHOLE regex and not simply - // an expression such as: - // - // 3 / something - // - // (which will then blow up when regex's `illegal` sees the newline) - begin: /(?=\/[^/\n]*\/)/, - contains: [{ - className: 'regexp', - begin: /\//, - end: /\/[gimuy]*/, - illegal: /\n/, - contains: [ - BACKSLASH_ESCAPE, - { - begin: /\[/, - end: /\]/, - relevance: 0, - contains: [BACKSLASH_ESCAPE] - } - ] - }] - }; - const TITLE_MODE = { - className: 'title', - begin: IDENT_RE, - relevance: 0 - }; - const UNDERSCORE_TITLE_MODE = { - className: 'title', - begin: UNDERSCORE_IDENT_RE, - relevance: 0 - }; - const METHOD_GUARD = { - // excludes method names from keyword processing - begin: '\\.\\s*' + UNDERSCORE_IDENT_RE, - relevance: 0 - }; - - /** - * Adds end same as begin mechanics to a mode - * - * Your mode must include at least a single () match group as that first match - * group is what is used for comparison - * @param {Partial} mode - */ - const END_SAME_AS_BEGIN = function(mode) { - return Object.assign(mode, - { - /** @type {ModeCallback} */ - 'on:begin': (m, resp) => { resp.data._beginMatch = m[1]; }, - /** @type {ModeCallback} */ - 'on:end': (m, resp) => { if (resp.data._beginMatch !== m[1]) resp.ignoreMatch(); } - }); - }; - - var MODES = /*#__PURE__*/Object.freeze({ - __proto__: null, - IDENT_RE: IDENT_RE, - UNDERSCORE_IDENT_RE: UNDERSCORE_IDENT_RE, - NUMBER_RE: NUMBER_RE, - C_NUMBER_RE: C_NUMBER_RE, - BINARY_NUMBER_RE: BINARY_NUMBER_RE, - RE_STARTERS_RE: RE_STARTERS_RE, - SHEBANG: SHEBANG, - BACKSLASH_ESCAPE: BACKSLASH_ESCAPE, - APOS_STRING_MODE: APOS_STRING_MODE, - QUOTE_STRING_MODE: QUOTE_STRING_MODE, - PHRASAL_WORDS_MODE: PHRASAL_WORDS_MODE, - COMMENT: COMMENT, - C_LINE_COMMENT_MODE: C_LINE_COMMENT_MODE, - C_BLOCK_COMMENT_MODE: C_BLOCK_COMMENT_MODE, - HASH_COMMENT_MODE: HASH_COMMENT_MODE, - NUMBER_MODE: NUMBER_MODE, - C_NUMBER_MODE: C_NUMBER_MODE, - BINARY_NUMBER_MODE: BINARY_NUMBER_MODE, - CSS_NUMBER_MODE: CSS_NUMBER_MODE, - REGEXP_MODE: REGEXP_MODE, - TITLE_MODE: TITLE_MODE, - UNDERSCORE_TITLE_MODE: UNDERSCORE_TITLE_MODE, - METHOD_GUARD: METHOD_GUARD, - END_SAME_AS_BEGIN: END_SAME_AS_BEGIN - }); - - // keywords that should have no default relevance value - var COMMON_KEYWORDS = 'of and for in not or if then'.split(' '); - - // compilation - - /** - * Compiles a language definition result - * - * Given the raw result of a language definition (Language), compiles this so - * that it is ready for highlighting code. - * @param {Language} language - * @returns {CompiledLanguage} - */ - function compileLanguage(language) { - /** - * Builds a regex with the case sensativility of the current language - * - * @param {RegExp | string} value - * @param {boolean} [global] - */ - function langRe(value, global) { - return new RegExp( - source(value), - 'm' + (language.case_insensitive ? 'i' : '') + (global ? 'g' : '') - ); - } - - /** - Stores multiple regular expressions and allows you to quickly search for - them all in a string simultaneously - returning the first match. It does - this by creating a huge (a|b|c) regex - each individual item wrapped with () - and joined by `|` - using match groups to track position. When a match is - found checking which position in the array has content allows us to figure - out which of the original regexes / match groups triggered the match. - - The match object itself (the result of `Regex.exec`) is returned but also - enhanced by merging in any meta-data that was registered with the regex. - This is how we keep track of which mode matched, and what type of rule - (`illegal`, `begin`, end, etc). - */ - class MultiRegex { - constructor() { - this.matchIndexes = {}; - // @ts-ignore - this.regexes = []; - this.matchAt = 1; - this.position = 0; - } - - // @ts-ignore - addRule(re, opts) { - opts.position = this.position++; - // @ts-ignore - this.matchIndexes[this.matchAt] = opts; - this.regexes.push([opts, re]); - this.matchAt += countMatchGroups(re) + 1; - } - - compile() { - if (this.regexes.length === 0) { - // avoids the need to check length every time exec is called - // @ts-ignore - this.exec = () => null; - } - const terminators = this.regexes.map(el => el[1]); - this.matcherRe = langRe(join(terminators), true); - this.lastIndex = 0; - } - - /** @param {string} s */ - exec(s) { - this.matcherRe.lastIndex = this.lastIndex; - const match = this.matcherRe.exec(s); - if (!match) { return null; } - - // eslint-disable-next-line no-undefined - const i = match.findIndex((el, i) => i > 0 && el !== undefined); - // @ts-ignore - const matchData = this.matchIndexes[i]; - // trim off any earlier non-relevant match groups (ie, the other regex - // match groups that make up the multi-matcher) - match.splice(0, i); - - return Object.assign(match, matchData); - } - } - - /* - Created to solve the key deficiently with MultiRegex - there is no way to - test for multiple matches at a single location. Why would we need to do - that? In the future a more dynamic engine will allow certain matches to be - ignored. An example: if we matched say the 3rd regex in a large group but - decided to ignore it - we'd need to started testing again at the 4th - regex... but MultiRegex itself gives us no real way to do that. - - So what this class creates MultiRegexs on the fly for whatever search - position they are needed. - - NOTE: These additional MultiRegex objects are created dynamically. For most - grammars most of the time we will never actually need anything more than the - first MultiRegex - so this shouldn't have too much overhead. - - Say this is our search group, and we match regex3, but wish to ignore it. - - regex1 | regex2 | regex3 | regex4 | regex5 ' ie, startAt = 0 - - What we need is a new MultiRegex that only includes the remaining - possibilities: - - regex4 | regex5 ' ie, startAt = 3 - - This class wraps all that complexity up in a simple API... `startAt` decides - where in the array of expressions to start doing the matching. It - auto-increments, so if a match is found at position 2, then startAt will be - set to 3. If the end is reached startAt will return to 0. - - MOST of the time the parser will be setting startAt manually to 0. - */ - class ResumableMultiRegex { - constructor() { - // @ts-ignore - this.rules = []; - // @ts-ignore - this.multiRegexes = []; - this.count = 0; - - this.lastIndex = 0; - this.regexIndex = 0; - } - - // @ts-ignore - getMatcher(index) { - if (this.multiRegexes[index]) return this.multiRegexes[index]; - - const matcher = new MultiRegex(); - this.rules.slice(index).forEach(([re, opts]) => matcher.addRule(re, opts)); - matcher.compile(); - this.multiRegexes[index] = matcher; - return matcher; - } - - resumingScanAtSamePosition() { - return this.regexIndex !== 0; - } - - considerAll() { - this.regexIndex = 0; - } - - // @ts-ignore - addRule(re, opts) { - this.rules.push([re, opts]); - if (opts.type === "begin") this.count++; - } - - /** @param {string} s */ - exec(s) { - const m = this.getMatcher(this.regexIndex); - m.lastIndex = this.lastIndex; - let result = m.exec(s); - - // The following is because we have no easy way to say "resume scanning at the - // existing position but also skip the current rule ONLY". What happens is - // all prior rules are also skipped which can result in matching the wrong - // thing. Example of matching "booger": - - // our matcher is [string, "booger", number] - // - // ....booger.... - - // if "booger" is ignored then we'd really need a regex to scan from the - // SAME position for only: [string, number] but ignoring "booger" (if it - // was the first match), a simple resume would scan ahead who knows how - // far looking only for "number", ignoring potential string matches (or - // future "booger" matches that might be valid.) - - // So what we do: We execute two matchers, one resuming at the same - // position, but the second full matcher starting at the position after: - - // /--- resume first regex match here (for [number]) - // |/---- full match here for [string, "booger", number] - // vv - // ....booger.... - - // Which ever results in a match first is then used. So this 3-4 step - // process essentially allows us to say "match at this position, excluding - // a prior rule that was ignored". - // - // 1. Match "booger" first, ignore. Also proves that [string] does non match. - // 2. Resume matching for [number] - // 3. Match at index + 1 for [string, "booger", number] - // 4. If #2 and #3 result in matches, which came first? - if (this.resumingScanAtSamePosition()) { - if (result && result.index === this.lastIndex) ; else { // use the second matcher result - const m2 = this.getMatcher(0); - m2.lastIndex = this.lastIndex + 1; - result = m2.exec(s); - } - } - - if (result) { - this.regexIndex += result.position + 1; - if (this.regexIndex === this.count) { - // wrap-around to considering all matches again - this.considerAll(); - } - } - - return result; - } - } - - /** - * Given a mode, builds a huge ResumableMultiRegex that can be used to walk - * the content and find matches. - * - * @param {CompiledMode} mode - * @returns {ResumableMultiRegex} - */ - function buildModeRegex(mode) { - const mm = new ResumableMultiRegex(); - - mode.contains.forEach(term => mm.addRule(term.begin, { rule: term, type: "begin" })); - - if (mode.terminator_end) { - mm.addRule(mode.terminator_end, { type: "end" }); - } - if (mode.illegal) { - mm.addRule(mode.illegal, { type: "illegal" }); - } - - return mm; - } - - // TODO: We need negative look-behind support to do this properly - /** - * Skip a match if it has a preceding or trailing dot - * - * This is used for `beginKeywords` to prevent matching expressions such as - * `bob.keyword.do()`. The mode compiler automatically wires this up as a - * special _internal_ 'on:begin' callback for modes with `beginKeywords` - * @param {RegExpMatchArray} match - * @param {CallbackResponse} response - */ - function skipIfhasPrecedingOrTrailingDot(match, response) { - const before = match.input[match.index - 1]; - const after = match.input[match.index + match[0].length]; - if (before === "." || after === ".") { - response.ignoreMatch(); - } - } - - /** skip vs abort vs ignore - * - * @skip - The mode is still entered and exited normally (and contains rules apply), - * but all content is held and added to the parent buffer rather than being - * output when the mode ends. Mostly used with `sublanguage` to build up - * a single large buffer than can be parsed by sublanguage. - * - * - The mode begin ands ends normally. - * - Content matched is added to the parent mode buffer. - * - The parser cursor is moved forward normally. - * - * @abort - A hack placeholder until we have ignore. Aborts the mode (as if it - * never matched) but DOES NOT continue to match subsequent `contains` - * modes. Abort is bad/suboptimal because it can result in modes - * farther down not getting applied because an earlier rule eats the - * content but then aborts. - * - * - The mode does not begin. - * - Content matched by `begin` is added to the mode buffer. - * - The parser cursor is moved forward accordingly. - * - * @ignore - Ignores the mode (as if it never matched) and continues to match any - * subsequent `contains` modes. Ignore isn't technically possible with - * the current parser implementation. - * - * - The mode does not begin. - * - Content matched by `begin` is ignored. - * - The parser cursor is not moved forward. - */ - - /** - * Compiles an individual mode - * - * This can raise an error if the mode contains certain detectable known logic - * issues. - * @param {Mode} mode - * @param {CompiledMode | null} [parent] - * @returns {CompiledMode | never} - */ - function compileMode(mode, parent) { - const cmode = /** @type CompiledMode */ (mode); - if (mode.compiled) return cmode; - mode.compiled = true; - - // __beforeBegin is considered private API, internal use only - mode.__beforeBegin = null; - - mode.keywords = mode.keywords || mode.beginKeywords; - - let kw_pattern = null; - if (typeof mode.keywords === "object") { - kw_pattern = mode.keywords.$pattern; - delete mode.keywords.$pattern; - } - - if (mode.keywords) { - mode.keywords = compileKeywords(mode.keywords, language.case_insensitive); - } - - // both are not allowed - if (mode.lexemes && kw_pattern) { - throw new Error("ERR: Prefer `keywords.$pattern` to `mode.lexemes`, BOTH are not allowed. (see mode reference) "); - } - - // `mode.lexemes` was the old standard before we added and now recommend - // using `keywords.$pattern` to pass the keyword pattern - cmode.keywordPatternRe = langRe(mode.lexemes || kw_pattern || /\w+/, true); - - if (parent) { - if (mode.beginKeywords) { - // for languages with keywords that include non-word characters checking for - // a word boundary is not sufficient, so instead we check for a word boundary - // or whitespace - this does no harm in any case since our keyword engine - // doesn't allow spaces in keywords anyways and we still check for the boundary - // first - mode.begin = '\\b(' + mode.beginKeywords.split(' ').join('|') + ')(?=\\b|\\s)'; - mode.__beforeBegin = skipIfhasPrecedingOrTrailingDot; - } - if (!mode.begin) mode.begin = /\B|\b/; - cmode.beginRe = langRe(mode.begin); - if (mode.endSameAsBegin) mode.end = mode.begin; - if (!mode.end && !mode.endsWithParent) mode.end = /\B|\b/; - if (mode.end) cmode.endRe = langRe(mode.end); - cmode.terminator_end = source(mode.end) || ''; - if (mode.endsWithParent && parent.terminator_end) { - cmode.terminator_end += (mode.end ? '|' : '') + parent.terminator_end; - } - } - if (mode.illegal) cmode.illegalRe = langRe(mode.illegal); - // eslint-disable-next-line no-undefined - if (mode.relevance === undefined) mode.relevance = 1; - if (!mode.contains) mode.contains = []; - - mode.contains = [].concat(...mode.contains.map(function(c) { - return expand_or_clone_mode(c === 'self' ? mode : c); - })); - mode.contains.forEach(function(c) { compileMode(/** @type Mode */ (c), cmode); }); - - if (mode.starts) { - compileMode(mode.starts, parent); - } - - cmode.matcher = buildModeRegex(cmode); - return cmode; - } - - // self is not valid at the top-level - if (language.contains && language.contains.includes('self')) { - throw new Error("ERR: contains `self` is not supported at the top-level of a language. See documentation."); - } - return compileMode(/** @type Mode */ (language)); - } - - /** - * Determines if a mode has a dependency on it's parent or not - * - * If a mode does have a parent dependency then often we need to clone it if - * it's used in multiple places so that each copy points to the correct parent, - * where-as modes without a parent can often safely be re-used at the bottom of - * a mode chain. - * - * @param {Mode | null} mode - * @returns {boolean} - is there a dependency on the parent? - * */ - function dependencyOnParent(mode) { - if (!mode) return false; - - return mode.endsWithParent || dependencyOnParent(mode.starts); - } - - /** - * Expands a mode or clones it if necessary - * - * This is necessary for modes with parental dependenceis (see notes on - * `dependencyOnParent`) and for nodes that have `variants` - which must then be - * exploded into their own individual modes at compile time. - * - * @param {Mode} mode - * @returns {Mode | Mode[]} - * */ - function expand_or_clone_mode(mode) { - if (mode.variants && !mode.cached_variants) { - mode.cached_variants = mode.variants.map(function(variant) { - return inherit(mode, { variants: null }, variant); - }); - } - - // EXPAND - // if we have variants then essentially "replace" the mode with the variants - // this happens in compileMode, where this function is called from - if (mode.cached_variants) { - return mode.cached_variants; - } - - // CLONE - // if we have dependencies on parents then we need a unique - // instance of ourselves, so we can be reused with many - // different parents without issue - if (dependencyOnParent(mode)) { - return inherit(mode, { starts: mode.starts ? inherit(mode.starts) : null }); - } - - if (Object.isFrozen(mode)) { - return inherit(mode); - } - - // no special dependency issues, just return ourselves - return mode; - } - - /*********************************************** - Keywords - ***********************************************/ - - /** - * Given raw keywords from a language definition, compile them. - * - * @param {string | Record} rawKeywords - * @param {boolean} case_insensitive - */ - function compileKeywords(rawKeywords, case_insensitive) { - /** @type KeywordDict */ - var compiled_keywords = {}; - - if (typeof rawKeywords === 'string') { // string - splitAndCompile('keyword', rawKeywords); - } else { - Object.keys(rawKeywords).forEach(function(className) { - splitAndCompile(className, rawKeywords[className]); - }); - } - return compiled_keywords; - - // --- - - /** - * Compiles an individual list of keywords - * - * Ex: "for if when while|5" - * - * @param {string} className - * @param {string} keywordList - */ - function splitAndCompile(className, keywordList) { - if (case_insensitive) { - keywordList = keywordList.toLowerCase(); - } - keywordList.split(' ').forEach(function(keyword) { - var pair = keyword.split('|'); - compiled_keywords[pair[0]] = [className, scoreForKeyword(pair[0], pair[1])]; - }); - } - } - - /** - * Returns the proper score for a given keyword - * - * Also takes into account comment keywords, which will be scored 0 UNLESS - * another score has been manually assigned. - * @param {string} keyword - * @param {string} [providedScore] - */ - function scoreForKeyword(keyword, providedScore) { - // manual scores always win over common keywords - // so you can force a score of 1 if you really insist - if (providedScore) { - return Number(providedScore); - } - - return commonKeyword(keyword) ? 0 : 1; - } - - /** - * Determines if a given keyword is common or not - * - * @param {string} keyword */ - function commonKeyword(keyword) { - return COMMON_KEYWORDS.includes(keyword.toLowerCase()); - } - - var version = "10.2.1"; - - // @ts-nocheck - - function hasValueOrEmptyAttribute(value) { - return Boolean(value || value === ""); - } - - const Component = { - props: ["language", "code", "autodetect"], - data: function() { - return { - detectedLanguage: "", - unknownLanguage: false - }; - }, - computed: { - className() { - if (this.unknownLanguage) return ""; - - return "hljs " + this.detectedLanguage; - }, - highlighted() { - // no idea what language to use, return raw code - if (!this.autoDetect && !hljs.getLanguage(this.language)) { - console.warn(`The language "${this.language}" you specified could not be found.`); - this.unknownLanguage = true; - return escapeHTML(this.code); - } - - let result; - if (this.autoDetect) { - result = hljs.highlightAuto(this.code); - this.detectedLanguage = result.language; - } else { - result = hljs.highlight(this.language, this.code, this.ignoreIllegals); - this.detectectLanguage = this.language; - } - return result.value; - }, - autoDetect() { - return !this.language || hasValueOrEmptyAttribute(this.autodetect); - }, - ignoreIllegals() { - return true; - } - }, - // this avoids needing to use a whole Vue compilation pipeline just - // to build Highlight.js - render(createElement) { - return createElement("pre", {}, [ - createElement("code", { - class: this.className, - domProps: { innerHTML: this.highlighted }}) - ]); - } - // template: `

` - }; - - const VuePlugin = { - install(Vue) { - Vue.component('highlightjs', Component); - } - }; - - /* - Syntax highlighting with language autodetection. - https://highlightjs.org/ - */ - - const escape$1 = escapeHTML; - const inherit$1 = inherit; - - const { nodeStream: nodeStream$1, mergeStreams: mergeStreams$1 } = utils; - const NO_MATCH = Symbol("nomatch"); - - /** - * @param {any} hljs - object that is extended (legacy) - * @returns {HLJSApi} - */ - const HLJS = function(hljs) { - // Convenience variables for build-in objects - /** @type {unknown[]} */ - var ArrayProto = []; - - // Global internal variables used within the highlight.js library. - /** @type {Record} */ - var languages = Object.create(null); - /** @type {Record} */ - var aliases = Object.create(null); - /** @type {HLJSPlugin[]} */ - var plugins = []; - - // safe/production mode - swallows more errors, tries to keep running - // even if a single syntax or parse hits a fatal error - var SAFE_MODE = true; - var fixMarkupRe = /(^(<[^>]+>|\t|)+|\n)/gm; - var LANGUAGE_NOT_FOUND = "Could not find the language '{}', did you forget to load/include a language module?"; - /** @type {Language} */ - const PLAINTEXT_LANGUAGE = { disableAutodetect: true, name: 'Plain text', contains: [] }; - - // Global options used when within external APIs. This is modified when - // calling the `hljs.configure` function. - /** @type HLJSOptions */ - var options = { - noHighlightRe: /^(no-?highlight)$/i, - languageDetectRe: /\blang(?:uage)?-([\w-]+)\b/i, - classPrefix: 'hljs-', - tabReplace: null, - useBR: false, - languages: null, - // beta configuration options, subject to change, welcome to discuss - // https://github.com/highlightjs/highlight.js/issues/1086 - __emitter: TokenTreeEmitter - }; - - /* Utility functions */ - - /** - * Tests a language name to see if highlighting should be skipped - * @param {string} languageName - */ - function shouldNotHighlight(languageName) { - return options.noHighlightRe.test(languageName); - } - - /** - * @param {HighlightedHTMLElement} block - the HTML element to determine language for - */ - function blockLanguage(block) { - var classes = block.className + ' '; - - classes += block.parentNode ? block.parentNode.className : ''; - - // language-* takes precedence over non-prefixed class names. - const match = options.languageDetectRe.exec(classes); - if (match) { - var language = getLanguage(match[1]); - if (!language) { - console.warn(LANGUAGE_NOT_FOUND.replace("{}", match[1])); - console.warn("Falling back to no-highlight mode for this block.", block); - } - return language ? match[1] : 'no-highlight'; - } - - return classes - .split(/\s+/) - .find((_class) => shouldNotHighlight(_class) || getLanguage(_class)); - } - - /** - * Core highlighting function. - * - * @param {string} languageName - the language to use for highlighting - * @param {string} code - the code to highlight - * @param {boolean} [ignoreIllegals] - whether to ignore illegal matches, default is to bail - * @param {Mode} [continuation] - current continuation mode, if any - * - * @returns {HighlightResult} Result - an object that represents the result - * @property {string} language - the language name - * @property {number} relevance - the relevance score - * @property {string} value - the highlighted HTML code - * @property {string} code - the original raw code - * @property {Mode} top - top of the current mode stack - * @property {boolean} illegal - indicates whether any illegal matches were found - */ - function highlight(languageName, code, ignoreIllegals, continuation) { - /** @type {{ code: string, language: string, result?: any }} */ - var context = { - code, - language: languageName - }; - // the plugin can change the desired language or the code to be highlighted - // just be changing the object it was passed - fire("before:highlight", context); - - // a before plugin can usurp the result completely by providing it's own - // in which case we don't even need to call highlight - var result = context.result ? - context.result : - _highlight(context.language, context.code, ignoreIllegals, continuation); - - result.code = context.code; - // the plugin can change anything in result to suite it - fire("after:highlight", result); - - return result; - } - - /** - * private highlight that's used internally and does not fire callbacks - * - * @param {string} languageName - the language to use for highlighting - * @param {string} code - the code to highlight - * @param {boolean} [ignoreIllegals] - whether to ignore illegal matches, default is to bail - * @param {Mode} [continuation] - current continuation mode, if any - */ - function _highlight(languageName, code, ignoreIllegals, continuation) { - var codeToHighlight = code; - - /** - * Return keyword data if a match is a keyword - * @param {CompiledMode} mode - current mode - * @param {RegExpMatchArray} match - regexp match data - * @returns {KeywordData | false} - */ - function keywordData(mode, match) { - var matchText = language.case_insensitive ? match[0].toLowerCase() : match[0]; - return Object.prototype.hasOwnProperty.call(mode.keywords, matchText) && mode.keywords[matchText]; - } - - function processKeywords() { - if (!top.keywords) { - emitter.addText(mode_buffer); - return; - } - - let last_index = 0; - top.keywordPatternRe.lastIndex = 0; - let match = top.keywordPatternRe.exec(mode_buffer); - let buf = ""; - - while (match) { - buf += mode_buffer.substring(last_index, match.index); - const data = keywordData(top, match); - if (data) { - const [kind, keywordRelevance] = data; - emitter.addText(buf); - buf = ""; - - relevance += keywordRelevance; - emitter.addKeyword(match[0], kind); - } else { - buf += match[0]; - } - last_index = top.keywordPatternRe.lastIndex; - match = top.keywordPatternRe.exec(mode_buffer); - } - buf += mode_buffer.substr(last_index); - emitter.addText(buf); - } - - function processSubLanguage() { - if (mode_buffer === "") return; - /** @type HighlightResult */ - var result = null; - - if (typeof top.subLanguage === 'string') { - if (!languages[top.subLanguage]) { - emitter.addText(mode_buffer); - return; - } - result = _highlight(top.subLanguage, mode_buffer, true, continuations[top.subLanguage]); - continuations[top.subLanguage] = result.top; - } else { - result = highlightAuto(mode_buffer, top.subLanguage.length ? top.subLanguage : null); - } - - // Counting embedded language score towards the host language may be disabled - // with zeroing the containing mode relevance. Use case in point is Markdown that - // allows XML everywhere and makes every XML snippet to have a much larger Markdown - // score. - if (top.relevance > 0) { - relevance += result.relevance; - } - emitter.addSublanguage(result.emitter, result.language); - } - - function processBuffer() { - if (top.subLanguage != null) { - processSubLanguage(); - } else { - processKeywords(); - } - mode_buffer = ''; - } - - /** - * @param {Mode} mode - new mode to start - */ - function startNewMode(mode) { - if (mode.className) { - emitter.openNode(mode.className); - } - top = Object.create(mode, { parent: { value: top } }); - return top; - } - - /** - * @param {CompiledMode } mode - the mode to potentially end - * @param {RegExpMatchArray} match - the latest match - * @param {string} matchPlusRemainder - match plus remainder of content - * @returns {CompiledMode | void} - the next mode, or if void continue on in current mode - */ - function endOfMode(mode, match, matchPlusRemainder) { - let matched = startsWith(mode.endRe, matchPlusRemainder); - - if (matched) { - if (mode["on:end"]) { - const resp = new Response(mode); - mode["on:end"](match, resp); - if (resp.ignore) matched = false; - } - - if (matched) { - while (mode.endsParent && mode.parent) { - mode = mode.parent; - } - return mode; - } - } - // even if on:end fires an `ignore` it's still possible - // that we might trigger the end node because of a parent mode - if (mode.endsWithParent) { - return endOfMode(mode.parent, match, matchPlusRemainder); - } - } - - /** - * Handle matching but then ignoring a sequence of text - * - * @param {string} lexeme - string containing full match text - */ - function doIgnore(lexeme) { - if (top.matcher.regexIndex === 0) { - // no more regexs to potentially match here, so we move the cursor forward one - // space - mode_buffer += lexeme[0]; - return 1; - } else { - // no need to move the cursor, we still have additional regexes to try and - // match at this very spot - resumeScanAtSamePosition = true; - return 0; - } - } - - /** - * Handle the start of a new potential mode match - * - * @param {EnhancedMatch} match - the current match - * @returns {number} how far to advance the parse cursor - */ - function doBeginMatch(match) { - var lexeme = match[0]; - var new_mode = match.rule; - - const resp = new Response(new_mode); - // first internal before callbacks, then the public ones - const beforeCallbacks = [new_mode.__beforeBegin, new_mode["on:begin"]]; - for (const cb of beforeCallbacks) { - if (!cb) continue; - cb(match, resp); - if (resp.ignore) return doIgnore(lexeme); - } - - if (new_mode && new_mode.endSameAsBegin) { - new_mode.endRe = escape(lexeme); - } - - if (new_mode.skip) { - mode_buffer += lexeme; - } else { - if (new_mode.excludeBegin) { - mode_buffer += lexeme; - } - processBuffer(); - if (!new_mode.returnBegin && !new_mode.excludeBegin) { - mode_buffer = lexeme; - } - } - startNewMode(new_mode); - // if (mode["after:begin"]) { - // let resp = new Response(mode); - // mode["after:begin"](match, resp); - // } - return new_mode.returnBegin ? 0 : lexeme.length; - } - - /** - * Handle the potential end of mode - * - * @param {RegExpMatchArray} match - the current match - */ - function doEndMatch(match) { - var lexeme = match[0]; - var matchPlusRemainder = codeToHighlight.substr(match.index); - - var end_mode = endOfMode(top, match, matchPlusRemainder); - if (!end_mode) { return NO_MATCH; } - - var origin = top; - if (origin.skip) { - mode_buffer += lexeme; - } else { - if (!(origin.returnEnd || origin.excludeEnd)) { - mode_buffer += lexeme; - } - processBuffer(); - if (origin.excludeEnd) { - mode_buffer = lexeme; - } - } - do { - if (top.className) { - emitter.closeNode(); - } - if (!top.skip && !top.subLanguage) { - relevance += top.relevance; - } - top = top.parent; - } while (top !== end_mode.parent); - if (end_mode.starts) { - if (end_mode.endSameAsBegin) { - end_mode.starts.endRe = end_mode.endRe; - } - startNewMode(end_mode.starts); - } - return origin.returnEnd ? 0 : lexeme.length; - } - - function processContinuations() { - var list = []; - for (var current = top; current !== language; current = current.parent) { - if (current.className) { - list.unshift(current.className); - } - } - list.forEach(item => emitter.openNode(item)); - } - - /** @type {{type?: MatchType, index?: number, rule?: Mode}}} */ - var lastMatch = {}; - - /** - * Process an individual match - * - * @param {string} textBeforeMatch - text preceeding the match (since the last match) - * @param {EnhancedMatch} [match] - the match itself - */ - function processLexeme(textBeforeMatch, match) { - var lexeme = match && match[0]; - - // add non-matched text to the current mode buffer - mode_buffer += textBeforeMatch; - - if (lexeme == null) { - processBuffer(); - return 0; - } - - // we've found a 0 width match and we're stuck, so we need to advance - // this happens when we have badly behaved rules that have optional matchers to the degree that - // sometimes they can end up matching nothing at all - // Ref: https://github.com/highlightjs/highlight.js/issues/2140 - if (lastMatch.type === "begin" && match.type === "end" && lastMatch.index === match.index && lexeme === "") { - // spit the "skipped" character that our regex choked on back into the output sequence - mode_buffer += codeToHighlight.slice(match.index, match.index + 1); - if (!SAFE_MODE) { - /** @type {AnnotatedError} */ - const err = new Error('0 width match regex'); - err.languageName = languageName; - err.badRule = lastMatch.rule; - throw err; - } - return 1; - } - lastMatch = match; - - if (match.type === "begin") { - return doBeginMatch(match); - } else if (match.type === "illegal" && !ignoreIllegals) { - // illegal match, we do not continue processing - /** @type {AnnotatedError} */ - const err = new Error('Illegal lexeme "' + lexeme + '" for mode "' + (top.className || '') + '"'); - err.mode = top; - throw err; - } else if (match.type === "end") { - var processed = doEndMatch(match); - if (processed !== NO_MATCH) { - return processed; - } - } - - // edge case for when illegal matches $ (end of line) which is technically - // a 0 width match but not a begin/end match so it's not caught by the - // first handler (when ignoreIllegals is true) - if (match.type === "illegal" && lexeme === "") { - // advance so we aren't stuck in an infinite loop - return 1; - } - - // infinite loops are BAD, this is a last ditch catch all. if we have a - // decent number of iterations yet our index (cursor position in our - // parsing) still 3x behind our index then something is very wrong - // so we bail - if (iterations > 100000 && iterations > match.index * 3) { - const err = new Error('potential infinite loop, way more iterations than matches'); - throw err; - } - - /* - Why might be find ourselves here? Only one occasion now. An end match that was - triggered but could not be completed. When might this happen? When an `endSameasBegin` - rule sets the end rule to a specific match. Since the overall mode termination rule that's - being used to scan the text isn't recompiled that means that any match that LOOKS like - the end (but is not, because it is not an exact match to the beginning) will - end up here. A definite end match, but when `doEndMatch` tries to "reapply" - the end rule and fails to match, we wind up here, and just silently ignore the end. - - This causes no real harm other than stopping a few times too many. - */ - - mode_buffer += lexeme; - return lexeme.length; - } - - var language = getLanguage(languageName); - if (!language) { - console.error(LANGUAGE_NOT_FOUND.replace("{}", languageName)); - throw new Error('Unknown language: "' + languageName + '"'); - } - - var md = compileLanguage(language); - var result = ''; - /** @type {CompiledMode} */ - var top = continuation || md; - /** @type Record */ - var continuations = {}; // keep continuations for sub-languages - var emitter = new options.__emitter(options); - processContinuations(); - var mode_buffer = ''; - var relevance = 0; - var index = 0; - var iterations = 0; - var resumeScanAtSamePosition = false; - - try { - top.matcher.considerAll(); - - for (;;) { - iterations++; - if (resumeScanAtSamePosition) { - // only regexes not matched previously will now be - // considered for a potential match - resumeScanAtSamePosition = false; - } else { - top.matcher.considerAll(); - } - top.matcher.lastIndex = index; - - const match = top.matcher.exec(codeToHighlight); - // console.log("match", match[0], match.rule && match.rule.begin) - - if (!match) break; - - const beforeMatch = codeToHighlight.substring(index, match.index); - const processedCount = processLexeme(beforeMatch, match); - index = match.index + processedCount; - } - processLexeme(codeToHighlight.substr(index)); - emitter.closeAllNodes(); - emitter.finalize(); - result = emitter.toHTML(); - - return { - relevance: relevance, - value: result, - language: languageName, - illegal: false, - emitter: emitter, - top: top - }; - } catch (err) { - if (err.message && err.message.includes('Illegal')) { - return { - illegal: true, - illegalBy: { - msg: err.message, - context: codeToHighlight.slice(index - 100, index + 100), - mode: err.mode - }, - sofar: result, - relevance: 0, - value: escape$1(codeToHighlight), - emitter: emitter - }; - } else if (SAFE_MODE) { - return { - illegal: false, - relevance: 0, - value: escape$1(codeToHighlight), - emitter: emitter, - language: languageName, - top: top, - errorRaised: err - }; - } else { - throw err; - } - } - } - - /** - * returns a valid highlight result, without actually doing any actual work, - * auto highlight starts with this and it's possible for small snippets that - * auto-detection may not find a better match - * @param {string} code - * @returns {HighlightResult} - */ - function justTextHighlightResult(code) { - const result = { - relevance: 0, - emitter: new options.__emitter(options), - value: escape$1(code), - illegal: false, - top: PLAINTEXT_LANGUAGE - }; - result.emitter.addText(code); - return result; - } - - /** - Highlighting with language detection. Accepts a string with the code to - highlight. Returns an object with the following properties: - - - language (detected language) - - relevance (int) - - value (an HTML string with highlighting markup) - - second_best (object with the same structure for second-best heuristically - detected language, may be absent) - - @param {string} code - @param {Array} [languageSubset] - @returns {AutoHighlightResult} - */ - function highlightAuto(code, languageSubset) { - languageSubset = languageSubset || options.languages || Object.keys(languages); - var result = justTextHighlightResult(code); - var secondBest = result; - languageSubset.filter(getLanguage).filter(autoDetection).forEach(function(name) { - var current = _highlight(name, code, false); - current.language = name; - if (current.relevance > secondBest.relevance) { - secondBest = current; - } - if (current.relevance > result.relevance) { - secondBest = result; - result = current; - } - }); - if (secondBest.language) { - // second_best (with underscore) is the expected API - result.second_best = secondBest; - } - return result; - } - - /** - Post-processing of the highlighted markup: - - - replace TABs with something more useful - - replace real line-breaks with '
' for non-pre containers - - @param {string} html - @returns {string} - */ - function fixMarkup(html) { - if (!(options.tabReplace || options.useBR)) { - return html; - } - - return html.replace(fixMarkupRe, match => { - if (match === '\n') { - return options.useBR ? '
' : match; - } else if (options.tabReplace) { - return match.replace(/\t/g, options.tabReplace); - } - return match; - }); - } - - /** - * Builds new class name for block given the language name - * - * @param {string} prevClassName - * @param {string} [currentLang] - * @param {string} [resultLang] - */ - function buildClassName(prevClassName, currentLang, resultLang) { - var language = currentLang ? aliases[currentLang] : resultLang; - var result = [prevClassName.trim()]; - - if (!prevClassName.match(/\bhljs\b/)) { - result.push('hljs'); - } - - if (!prevClassName.includes(language)) { - result.push(language); - } - - return result.join(' ').trim(); - } - - /** - * Applies highlighting to a DOM node containing code. Accepts a DOM node and - * two optional parameters for fixMarkup. - * - * @param {HighlightedHTMLElement} element - the HTML element to highlight - */ - function highlightBlock(element) { - /** @type HTMLElement */ - let node = null; - const language = blockLanguage(element); - - if (shouldNotHighlight(language)) return; - - fire("before:highlightBlock", - { block: element, language: language }); - - if (options.useBR) { - node = document.createElement('div'); - node.innerHTML = element.innerHTML.replace(/\n/g, '').replace(//g, '\n'); - } else { - node = element; - } - const text = node.textContent; - const result = language ? highlight(language, text, true) : highlightAuto(text); - - const originalStream = nodeStream$1(node); - if (originalStream.length) { - const resultNode = document.createElement('div'); - resultNode.innerHTML = result.value; - result.value = mergeStreams$1(originalStream, nodeStream$1(resultNode), text); - } - result.value = fixMarkup(result.value); - - fire("after:highlightBlock", { block: element, result: result }); - - element.innerHTML = result.value; - element.className = buildClassName(element.className, language, result.language); - element.result = { - language: result.language, - // TODO: remove with version 11.0 - re: result.relevance, - relavance: result.relevance - }; - if (result.second_best) { - element.second_best = { - language: result.second_best.language, - // TODO: remove with version 11.0 - re: result.second_best.relevance, - relavance: result.second_best.relevance - }; - } - } - - /** - * Updates highlight.js global options with the passed options - * - * @param {{}} userOptions - */ - function configure(userOptions) { - options = inherit$1(options, userOptions); - } - - /** - * Highlights to all
 blocks on a page
-     *
-     * @type {Function & {called?: boolean}}
-     */
-    const initHighlighting = () => {
-      if (initHighlighting.called) return;
-      initHighlighting.called = true;
-
-      var blocks = document.querySelectorAll('pre code');
-      ArrayProto.forEach.call(blocks, highlightBlock);
-    };
-
-    // Higlights all when DOMContentLoaded fires
-    function initHighlightingOnLoad() {
-      // @ts-ignore
-      window.addEventListener('DOMContentLoaded', initHighlighting, false);
-    }
-
-    /**
-     * Register a language grammar module
-     *
-     * @param {string} languageName
-     * @param {LanguageFn} languageDefinition
-     */
-    function registerLanguage(languageName, languageDefinition) {
-      var lang = null;
-      try {
-        lang = languageDefinition(hljs);
-      } catch (error) {
-        console.error("Language definition for '{}' could not be registered.".replace("{}", languageName));
-        // hard or soft error
-        if (!SAFE_MODE) { throw error; } else { console.error(error); }
-        // languages that have serious errors are replaced with essentially a
-        // "plaintext" stand-in so that the code blocks will still get normal
-        // css classes applied to them - and one bad language won't break the
-        // entire highlighter
-        lang = PLAINTEXT_LANGUAGE;
-      }
-      // give it a temporary name if it doesn't have one in the meta-data
-      if (!lang.name) lang.name = languageName;
-      languages[languageName] = lang;
-      lang.rawDefinition = languageDefinition.bind(null, hljs);
-
-      if (lang.aliases) {
-        registerAliases(lang.aliases, { languageName });
-      }
-    }
-
-    /**
-     * @returns {string[]} List of language internal names
-     */
-    function listLanguages() {
-      return Object.keys(languages);
-    }
-
-    /**
-      intended usage: When one language truly requires another
-
-      Unlike `getLanguage`, this will throw when the requested language
-      is not available.
-
-      @param {string} name - name of the language to fetch/require
-      @returns {Language | never}
-    */
-    function requireLanguage(name) {
-      var lang = getLanguage(name);
-      if (lang) { return lang; }
-
-      var err = new Error('The \'{}\' language is required, but not loaded.'.replace('{}', name));
-      throw err;
-    }
-
-    /**
-     * @param {string} name - name of the language to retrieve
-     * @returns {Language | undefined}
-     */
-    function getLanguage(name) {
-      name = (name || '').toLowerCase();
-      return languages[name] || languages[aliases[name]];
-    }
-
-    /**
-     *
-     * @param {string|string[]} aliasList - single alias or list of aliases
-     * @param {{languageName: string}} opts
-     */
-    function registerAliases(aliasList, { languageName }) {
-      if (typeof aliasList === 'string') {
-        aliasList = [aliasList];
-      }
-      aliasList.forEach(alias => { aliases[alias] = languageName; });
-    }
-
-    /**
-     * Determines if a given language has auto-detection enabled
-     * @param {string} name - name of the language
-     */
-    function autoDetection(name) {
-      var lang = getLanguage(name);
-      return lang && !lang.disableAutodetect;
-    }
-
-    /**
-     * @param {HLJSPlugin} plugin
-     */
-    function addPlugin(plugin) {
-      plugins.push(plugin);
-    }
-
-    /**
-     *
-     * @param {PluginEvent} event
-     * @param {any} args
-     */
-    function fire(event, args) {
-      var cb = event;
-      plugins.forEach(function(plugin) {
-        if (plugin[cb]) {
-          plugin[cb](args);
-        }
-      });
-    }
-
-    /* fixMarkup is deprecated and will be removed entirely in v11 */
-    function deprecate_fixMarkup(arg) {
-      console.warn("fixMarkup is deprecated and will be removed entirely in v11.0");
-      console.warn("Please see https://github.com/highlightjs/highlight.js/issues/2534");
-
-      return fixMarkup(arg)
-    }
-
-    /* Interface definition */
-    Object.assign(hljs, {
-      highlight,
-      highlightAuto,
-      fixMarkup: deprecate_fixMarkup,
-      highlightBlock,
-      configure,
-      initHighlighting,
-      initHighlightingOnLoad,
-      registerLanguage,
-      listLanguages,
-      getLanguage,
-      registerAliases,
-      requireLanguage,
-      autoDetection,
-      inherit: inherit$1,
-      addPlugin,
-      // plugins for frameworks
-      vuePlugin: VuePlugin
-    });
-
-    hljs.debugMode = function() { SAFE_MODE = false; };
-    hljs.safeMode = function() { SAFE_MODE = true; };
-    hljs.versionString = version;
-
-    for (const key in MODES) {
-      // @ts-ignore
-      if (typeof MODES[key] === "object") {
-        // @ts-ignore
-        deepFreeze(MODES[key]);
-      }
-    }
-
-    // merge all the modes/regexs into our main object
-    Object.assign(hljs, MODES);
-
-    return hljs;
-  };
-
-  // export an "instance" of the highlighter
-  var highlight = HLJS({});
-
-  return highlight;
-
-}());
-if (typeof exports === 'object' && typeof module !== 'undefined') { module.exports = hljs; }
-
-hljs.registerLanguage('1c', function () {
-  'use strict';
-
-  /*
-  Language: 1C:Enterprise
-  Author: Stanislav Belov 
-  Description: built-in language 1C:Enterprise (v7, v8)
-  Category: enterprise
-  */
-
-  function _1c(hljs) {
-
-    // общий паттерн для определения идентификаторов
-    var UNDERSCORE_IDENT_RE = '[A-Za-zА-Яа-яёЁ_][A-Za-zА-Яа-яёЁ_0-9]+';
-
-    // v7 уникальные ключевые слова, отсутствующие в v8 ==> keyword
-    var v7_keywords =
-    'далее ';
-
-    // v8 ключевые слова ==> keyword
-    var v8_keywords =
-    'возврат вызватьисключение выполнить для если и из или иначе иначеесли исключение каждого конецесли ' +
-    'конецпопытки конеццикла не новый перейти перем по пока попытка прервать продолжить тогда цикл экспорт ';
-
-    // keyword : ключевые слова
-    var KEYWORD = v7_keywords + v8_keywords;
-
-    // v7 уникальные директивы, отсутствующие в v8 ==> meta-keyword
-    var v7_meta_keywords =
-    'загрузитьизфайла ';
-
-    // v8 ключевые слова в инструкциях препроцессора, директивах компиляции, аннотациях ==> meta-keyword
-    var v8_meta_keywords =
-    'вебклиент вместо внешнеесоединение клиент конецобласти мобильноеприложениеклиент мобильноеприложениесервер ' +
-    'наклиенте наклиентенасервере наклиентенасерверебезконтекста насервере насерверебезконтекста область перед ' +
-    'после сервер толстыйклиентобычноеприложение толстыйклиентуправляемоеприложение тонкийклиент ';
-
-    // meta-keyword : ключевые слова в инструкциях препроцессора, директивах компиляции, аннотациях
-    var METAKEYWORD = v7_meta_keywords + v8_meta_keywords;
-
-    // v7 системные константы ==> built_in
-    var v7_system_constants =
-    'разделительстраниц разделительстрок символтабуляции ';
-
-    // v7 уникальные методы глобального контекста, отсутствующие в v8 ==> built_in
-    var v7_global_context_methods =
-    'ansitooem oemtoansi ввестивидсубконто ввестиперечисление ввестипериод ввестиплансчетов выбранныйплансчетов ' +
-    'датагод датамесяц датачисло заголовоксистемы значениевстроку значениеизстроки каталогиб каталогпользователя ' +
-    'кодсимв конгода конецпериодаби конецрассчитанногопериодаби конецстандартногоинтервала конквартала конмесяца ' +
-    'коннедели лог лог10 максимальноеколичествосубконто названиеинтерфейса названиенабораправ назначитьвид ' +
-    'назначитьсчет найтиссылки началопериодаби началостандартногоинтервала начгода начквартала начмесяца ' +
-    'начнедели номерднягода номерднянедели номернеделигода обработкаожидания основнойжурналрасчетов ' +
-    'основнойплансчетов основнойязык очиститьокносообщений периодстр получитьвремята получитьдатута ' +
-    'получитьдокументта получитьзначенияотбора получитьпозициюта получитьпустоезначение получитьта ' +
-    'префиксавтонумерации пропись пустоезначение разм разобратьпозициюдокумента рассчитатьрегистрына ' +
-    'рассчитатьрегистрыпо симв создатьобъект статусвозврата стрколичествострок сформироватьпозициюдокумента ' +
-    'счетпокоду текущеевремя типзначения типзначениястр установитьтана установитьтапо фиксшаблон шаблон ';
-
-    // v8 методы глобального контекста ==> built_in
-    var v8_global_context_methods =
-    'acos asin atan base64значение base64строка cos exp log log10 pow sin sqrt tan xmlзначение xmlстрока ' +
-    'xmlтип xmlтипзнч активноеокно безопасныйрежим безопасныйрежимразделенияданных булево ввестидату ввестизначение ' +
-    'ввестистроку ввестичисло возможностьчтенияxml вопрос восстановитьзначение врег выгрузитьжурналрегистрации ' +
-    'выполнитьобработкуоповещения выполнитьпроверкуправдоступа вычислить год данныеформывзначение дата день деньгода ' +
-    'деньнедели добавитьмесяц заблокироватьданныедляредактирования заблокироватьработупользователя завершитьработусистемы ' +
-    'загрузитьвнешнююкомпоненту закрытьсправку записатьjson записатьxml записатьдатуjson записьжурналарегистрации ' +
-    'заполнитьзначениясвойств запроситьразрешениепользователя запуститьприложение запуститьсистему зафиксироватьтранзакцию ' +
-    'значениевданныеформы значениевстрокувнутр значениевфайл значениезаполнено значениеизстрокивнутр значениеизфайла ' +
-    'изxmlтипа импортмоделиxdto имякомпьютера имяпользователя инициализироватьпредопределенныеданные информацияобошибке ' +
-    'каталогбиблиотекимобильногоустройства каталогвременныхфайлов каталогдокументов каталогпрограммы кодироватьстроку ' +
-    'кодлокализацииинформационнойбазы кодсимвола командасистемы конецгода конецдня конецквартала конецмесяца конецминуты ' +
-    'конецнедели конецчаса конфигурациябазыданныхизмененадинамически конфигурацияизменена копироватьданныеформы ' +
-    'копироватьфайл краткоепредставлениеошибки лев макс местноевремя месяц мин минута монопольныйрежим найти ' +
-    'найтинедопустимыесимволыxml найтиокнопонавигационнойссылке найтипомеченныенаудаление найтипоссылкам найтифайлы ' +
-    'началогода началодня началоквартала началомесяца началоминуты началонедели началочаса начатьзапросразрешенияпользователя ' +
-    'начатьзапускприложения начатькопированиефайла начатьперемещениефайла начатьподключениевнешнейкомпоненты ' +
-    'начатьподключениерасширенияработыскриптографией начатьподключениерасширенияработысфайлами начатьпоискфайлов ' +
-    'начатьполучениекаталогавременныхфайлов начатьполучениекаталогадокументов начатьполучениерабочегокаталогаданныхпользователя ' +
-    'начатьполучениефайлов начатьпомещениефайла начатьпомещениефайлов начатьсозданиедвоичныхданныхизфайла начатьсозданиекаталога ' +
-    'начатьтранзакцию начатьудалениефайлов начатьустановкувнешнейкомпоненты начатьустановкурасширенияработыскриптографией ' +
-    'начатьустановкурасширенияработысфайлами неделягода необходимостьзавершениясоединения номерсеансаинформационнойбазы ' +
-    'номерсоединенияинформационнойбазы нрег нстр обновитьинтерфейс обновитьнумерациюобъектов обновитьповторноиспользуемыезначения ' +
-    'обработкапрерыванияпользователя объединитьфайлы окр описаниеошибки оповестить оповеститьобизменении ' +
-    'отключитьобработчикзапросанастроекклиенталицензирования отключитьобработчикожидания отключитьобработчикоповещения ' +
-    'открытьзначение открытьиндекссправки открытьсодержаниесправки открытьсправку открытьформу открытьформумодально ' +
-    'отменитьтранзакцию очиститьжурналрегистрации очиститьнастройкипользователя очиститьсообщения параметрыдоступа ' +
-    'перейтипонавигационнойссылке переместитьфайл подключитьвнешнююкомпоненту ' +
-    'подключитьобработчикзапросанастроекклиенталицензирования подключитьобработчикожидания подключитьобработчикоповещения ' +
-    'подключитьрасширениеработыскриптографией подключитьрасширениеработысфайлами подробноепредставлениеошибки ' +
-    'показатьвводдаты показатьвводзначения показатьвводстроки показатьвводчисла показатьвопрос показатьзначение ' +
-    'показатьинформациюобошибке показатьнакарте показатьоповещениепользователя показатьпредупреждение полноеимяпользователя ' +
-    'получитьcomобъект получитьxmlтип получитьадреспоместоположению получитьблокировкусеансов получитьвремязавершенияспящегосеанса ' +
-    'получитьвремязасыпанияпассивногосеанса получитьвремяожиданияблокировкиданных получитьданныевыбора ' +
-    'получитьдополнительныйпараметрклиенталицензирования получитьдопустимыекодылокализации получитьдопустимыечасовыепояса ' +
-    'получитьзаголовокклиентскогоприложения получитьзаголовоксистемы получитьзначенияотборажурналарегистрации ' +
-    'получитьидентификаторконфигурации получитьизвременногохранилища получитьимявременногофайла ' +
-    'получитьимяклиенталицензирования получитьинформациюэкрановклиента получитьиспользованиежурналарегистрации ' +
-    'получитьиспользованиесобытияжурналарегистрации получитькраткийзаголовокприложения получитьмакетоформления ' +
-    'получитьмаскувсефайлы получитьмаскувсефайлыклиента получитьмаскувсефайлысервера получитьместоположениепоадресу ' +
-    'получитьминимальнуюдлинупаролейпользователей получитьнавигационнуюссылку получитьнавигационнуюссылкуинформационнойбазы ' +
-    'получитьобновлениеконфигурациибазыданных получитьобновлениепредопределенныхданныхинформационнойбазы получитьобщиймакет ' +
-    'получитьобщуюформу получитьокна получитьоперативнуюотметкувремени получитьотключениебезопасногорежима ' +
-    'получитьпараметрыфункциональныхопцийинтерфейса получитьполноеимяпредопределенногозначения ' +
-    'получитьпредставлениянавигационныхссылок получитьпроверкусложностипаролейпользователей получитьразделительпути ' +
-    'получитьразделительпутиклиента получитьразделительпутисервера получитьсеансыинформационнойбазы ' +
-    'получитьскоростьклиентскогосоединения получитьсоединенияинформационнойбазы получитьсообщенияпользователю ' +
-    'получитьсоответствиеобъектаиформы получитьсоставстандартногоинтерфейсаodata получитьструктурухранениябазыданных ' +
-    'получитьтекущийсеансинформационнойбазы получитьфайл получитьфайлы получитьформу получитьфункциональнуюопцию ' +
-    'получитьфункциональнуюопциюинтерфейса получитьчасовойпоясинформационнойбазы пользователиос поместитьвовременноехранилище ' +
-    'поместитьфайл поместитьфайлы прав праводоступа предопределенноезначение представлениекодалокализации представлениепериода ' +
-    'представлениеправа представлениеприложения представлениесобытияжурналарегистрации представлениечасовогопояса предупреждение ' +
-    'прекратитьработусистемы привилегированныйрежим продолжитьвызов прочитатьjson прочитатьxml прочитатьдатуjson пустаястрока ' +
-    'рабочийкаталогданныхпользователя разблокироватьданныедляредактирования разделитьфайл разорватьсоединениесвнешнимисточникомданных ' +
-    'раскодироватьстроку рольдоступна секунда сигнал символ скопироватьжурналрегистрации смещениелетнеговремени ' +
-    'смещениестандартноговремени соединитьбуферыдвоичныхданных создатькаталог создатьфабрикуxdto сокрл сокрлп сокрп сообщить ' +
-    'состояние сохранитьзначение сохранитьнастройкипользователя сред стрдлина стрзаканчиваетсяна стрзаменить стрнайти стрначинаетсяс ' +
-    'строка строкасоединенияинформационнойбазы стрполучитьстроку стрразделить стрсоединить стрсравнить стрчисловхождений '+
-    'стрчислострок стршаблон текущаядата текущаядатасеанса текущаяуниверсальнаядата текущаяуниверсальнаядатавмиллисекундах ' +
-    'текущийвариантинтерфейсаклиентскогоприложения текущийвариантосновногошрифтаклиентскогоприложения текущийкодлокализации ' +
-    'текущийрежимзапуска текущийязык текущийязыксистемы тип типзнч транзакцияактивна трег удалитьданныеинформационнойбазы ' +
-    'удалитьизвременногохранилища удалитьобъекты удалитьфайлы универсальноевремя установитьбезопасныйрежим ' +
-    'установитьбезопасныйрежимразделенияданных установитьблокировкусеансов установитьвнешнююкомпоненту ' +
-    'установитьвремязавершенияспящегосеанса установитьвремязасыпанияпассивногосеанса установитьвремяожиданияблокировкиданных ' +
-    'установитьзаголовокклиентскогоприложения установитьзаголовоксистемы установитьиспользованиежурналарегистрации ' +
-    'установитьиспользованиесобытияжурналарегистрации установитькраткийзаголовокприложения ' +
-    'установитьминимальнуюдлинупаролейпользователей установитьмонопольныйрежим установитьнастройкиклиенталицензирования ' +
-    'установитьобновлениепредопределенныхданныхинформационнойбазы установитьотключениебезопасногорежима ' +
-    'установитьпараметрыфункциональныхопцийинтерфейса установитьпривилегированныйрежим ' +
-    'установитьпроверкусложностипаролейпользователей установитьрасширениеработыскриптографией ' +
-    'установитьрасширениеработысфайлами установитьсоединениесвнешнимисточникомданных установитьсоответствиеобъектаиформы ' +
-    'установитьсоставстандартногоинтерфейсаodata установитьчасовойпоясинформационнойбазы установитьчасовойпояссеанса ' +
-    'формат цел час часовойпояс часовойпояссеанса число числопрописью этоадресвременногохранилища ';
-
-    // v8 свойства глобального контекста ==> built_in
-    var v8_global_context_property =
-    'wsссылки библиотекакартинок библиотекамакетовоформлениякомпоновкиданных библиотекастилей бизнеспроцессы ' +
-    'внешниеисточникиданных внешниеобработки внешниеотчеты встроенныепокупки главныйинтерфейс главныйстиль ' +
-    'документы доставляемыеуведомления журналыдокументов задачи информацияобинтернетсоединении использованиерабочейдаты ' +
-    'историяработыпользователя константы критерииотбора метаданные обработки отображениерекламы отправкадоставляемыхуведомлений ' +
-    'отчеты панельзадачос параметрзапуска параметрысеанса перечисления планывидоврасчета планывидовхарактеристик ' +
-    'планыобмена планысчетов полнотекстовыйпоиск пользователиинформационнойбазы последовательности проверкавстроенныхпокупок ' +
-    'рабочаядата расширенияконфигурации регистрыбухгалтерии регистрынакопления регистрырасчета регистрысведений ' +
-    'регламентныезадания сериализаторxdto справочники средствагеопозиционирования средствакриптографии средствамультимедиа ' +
-    'средстваотображениярекламы средствапочты средствателефонии фабрикаxdto файловыепотоки фоновыезадания хранилищанастроек ' +
-    'хранилищевариантовотчетов хранилищенастроекданныхформ хранилищеобщихнастроек хранилищепользовательскихнастроекдинамическихсписков ' +
-    'хранилищепользовательскихнастроекотчетов хранилищесистемныхнастроек ';
-
-    // built_in : встроенные или библиотечные объекты (константы, классы, функции)
-    var BUILTIN =
-    v7_system_constants +
-    v7_global_context_methods + v8_global_context_methods +
-    v8_global_context_property;
-
-    // v8 системные наборы значений ==> class
-    var v8_system_sets_of_values =
-    'webцвета windowsцвета windowsшрифты библиотекакартинок рамкистиля символы цветастиля шрифтыстиля ';
-
-    // v8 системные перечисления - интерфейсные ==> class
-    var v8_system_enums_interface =
-    'автоматическоесохранениеданныхформывнастройках автонумерациявформе автораздвижениесерий ' +
-    'анимациядиаграммы вариантвыравниванияэлементовизаголовков вариантуправлениявысотойтаблицы ' +
-    'вертикальнаяпрокруткаформы вертикальноеположение вертикальноеположениеэлемента видгруппыформы ' +
-    'виддекорацииформы виддополненияэлементаформы видизмененияданных видкнопкиформы видпереключателя ' +
-    'видподписейкдиаграмме видполяформы видфлажка влияниеразмеранапузырекдиаграммы горизонтальноеположение ' +
-    'горизонтальноеположениеэлемента группировкаколонок группировкаподчиненныхэлементовформы ' +
-    'группыиэлементы действиеперетаскивания дополнительныйрежимотображения допустимыедействияперетаскивания ' +
-    'интервалмеждуэлементамиформы использованиевывода использованиеполосыпрокрутки ' +
-    'используемоезначениеточкибиржевойдиаграммы историявыборапривводе источникзначенийоситочекдиаграммы ' +
-    'источникзначенияразмерапузырькадиаграммы категориягруппыкоманд максимумсерий начальноеотображениедерева ' +
-    'начальноеотображениесписка обновлениетекстаредактирования ориентациядендрограммы ориентациядиаграммы ' +
-    'ориентацияметокдиаграммы ориентацияметоксводнойдиаграммы ориентацияэлементаформы отображениевдиаграмме ' +
-    'отображениевлегендедиаграммы отображениегруппыкнопок отображениезаголовкашкалыдиаграммы ' +
-    'отображениезначенийсводнойдиаграммы отображениезначенияизмерительнойдиаграммы ' +
-    'отображениеинтерваладиаграммыганта отображениекнопки отображениекнопкивыбора отображениеобсужденийформы ' +
-    'отображениеобычнойгруппы отображениеотрицательныхзначенийпузырьковойдиаграммы отображениепанелипоиска ' +
-    'отображениеподсказки отображениепредупрежденияприредактировании отображениеразметкиполосырегулирования ' +
-    'отображениестраницформы отображениетаблицы отображениетекстазначениядиаграммыганта ' +
-    'отображениеуправленияобычнойгруппы отображениефигурыкнопки палитрацветовдиаграммы поведениеобычнойгруппы ' +
-    'поддержкамасштабадендрограммы поддержкамасштабадиаграммыганта поддержкамасштабасводнойдиаграммы ' +
-    'поисквтаблицепривводе положениезаголовкаэлементаформы положениекартинкикнопкиформы ' +
-    'положениекартинкиэлементаграфическойсхемы положениекоманднойпанелиформы положениекоманднойпанелиэлементаформы ' +
-    'положениеопорнойточкиотрисовки положениеподписейкдиаграмме положениеподписейшкалызначенийизмерительнойдиаграммы ' +
-    'положениесостоянияпросмотра положениестрокипоиска положениетекстасоединительнойлинии положениеуправленияпоиском ' +
-    'положениешкалывремени порядокотображенияточекгоризонтальнойгистограммы порядоксерийвлегендедиаграммы ' +
-    'размеркартинки расположениезаголовкашкалыдиаграммы растягиваниеповертикалидиаграммыганта ' +
-    'режимавтоотображениясостояния режимвводастроктаблицы режимвыборанезаполненного режимвыделениядаты ' +
-    'режимвыделениястрокитаблицы режимвыделениятаблицы режимизмененияразмера режимизменениясвязанногозначения ' +
-    'режимиспользованиядиалогапечати режимиспользованияпараметракоманды режиммасштабированияпросмотра ' +
-    'режимосновногоокнаклиентскогоприложения режимоткрытияокнаформы режимотображениявыделения ' +
-    'режимотображениягеографическойсхемы режимотображениязначенийсерии режимотрисовкисеткиграфическойсхемы ' +
-    'режимполупрозрачностидиаграммы режимпробеловдиаграммы режимразмещениянастранице режимредактированияколонки ' +
-    'режимсглаживаниядиаграммы режимсглаживанияиндикатора режимсписказадач сквозноевыравнивание ' +
-    'сохранениеданныхформывнастройках способзаполнениятекстазаголовкашкалыдиаграммы ' +
-    'способопределенияограничивающегозначениядиаграммы стандартнаягруппакоманд стандартноеоформление ' +
-    'статусоповещенияпользователя стильстрелки типаппроксимациилиниитрендадиаграммы типдиаграммы ' +
-    'типединицышкалывремени типимпортасерийслоягеографическойсхемы типлиниигеографическойсхемы типлиниидиаграммы ' +
-    'типмаркерагеографическойсхемы типмаркерадиаграммы типобластиоформления ' +
-    'типорганизацииисточникаданныхгеографическойсхемы типотображениясериислоягеографическойсхемы ' +
-    'типотображенияточечногообъектагеографическойсхемы типотображенияшкалыэлементалегендыгеографическойсхемы ' +
-    'типпоискаобъектовгеографическойсхемы типпроекциигеографическойсхемы типразмещенияизмерений ' +
-    'типразмещенияреквизитовизмерений типрамкиэлементауправления типсводнойдиаграммы ' +
-    'типсвязидиаграммыганта типсоединениязначенийпосериямдиаграммы типсоединенияточекдиаграммы ' +
-    'типсоединительнойлинии типстороныэлементаграфическойсхемы типформыотчета типшкалырадарнойдиаграммы ' +
-    'факторлиниитрендадиаграммы фигуракнопки фигурыграфическойсхемы фиксациявтаблице форматдняшкалывремени ' +
-    'форматкартинки ширинаподчиненныхэлементовформы ';
-
-    // v8 системные перечисления - свойства прикладных объектов ==> class
-    var v8_system_enums_objects_properties =
-    'виддвижениябухгалтерии виддвижениянакопления видпериодарегистрарасчета видсчета видточкимаршрутабизнеспроцесса ' +
-    'использованиеагрегатарегистранакопления использованиегруппиэлементов использованиережимапроведения ' +
-    'использованиесреза периодичностьагрегатарегистранакопления режимавтовремя режимзаписидокумента режимпроведениядокумента ';
-
-    // v8 системные перечисления - планы обмена ==> class
-    var v8_system_enums_exchange_plans =
-    'авторегистрацияизменений допустимыйномерсообщения отправкаэлементаданных получениеэлементаданных ';
-
-    // v8 системные перечисления - табличный документ ==> class
-    var v8_system_enums_tabular_document =
-    'использованиерасшифровкитабличногодокумента ориентациястраницы положениеитоговколоноксводнойтаблицы ' +
-    'положениеитоговстроксводнойтаблицы положениетекстаотносительнокартинки расположениезаголовкагруппировкитабличногодокумента ' +
-    'способчтениязначенийтабличногодокумента типдвустороннейпечати типзаполненияобластитабличногодокумента ' +
-    'типкурсоровтабличногодокумента типлиниирисункатабличногодокумента типлинииячейкитабличногодокумента ' +
-    'типнаправленияпереходатабличногодокумента типотображениявыделениятабличногодокумента типотображениялинийсводнойтаблицы ' +
-    'типразмещениятекстатабличногодокумента типрисункатабличногодокумента типсмещениятабличногодокумента ' +
-    'типузоратабличногодокумента типфайлатабличногодокумента точностьпечати чередованиерасположениястраниц ';
-
-    // v8 системные перечисления - планировщик ==> class
-    var v8_system_enums_sheduler =
-    'отображениевремениэлементовпланировщика ';
-
-    // v8 системные перечисления - форматированный документ ==> class
-    var v8_system_enums_formatted_document =
-    'типфайлаформатированногодокумента ';
-
-    // v8 системные перечисления - запрос ==> class
-    var v8_system_enums_query =
-    'обходрезультатазапроса типзаписизапроса ';
-
-    // v8 системные перечисления - построитель отчета ==> class
-    var v8_system_enums_report_builder =
-    'видзаполнениярасшифровкипостроителяотчета типдобавленияпредставлений типизмеренияпостроителяотчета типразмещенияитогов ';
-
-    // v8 системные перечисления - работа с файлами ==> class
-    var v8_system_enums_files =
-    'доступкфайлу режимдиалогавыборафайла режимоткрытияфайла ';
-
-    // v8 системные перечисления - построитель запроса ==> class
-    var v8_system_enums_query_builder =
-    'типизмеренияпостроителязапроса ';
-
-    // v8 системные перечисления - анализ данных ==> class
-    var v8_system_enums_data_analysis =
-    'видданныханализа методкластеризации типединицыинтервалавременианализаданных типзаполнениятаблицырезультатаанализаданных ' +
-    'типиспользованиячисловыхзначенийанализаданных типисточникаданныхпоискаассоциаций типколонкианализаданныхдереворешений ' +
-    'типколонкианализаданныхкластеризация типколонкианализаданныхобщаястатистика типколонкианализаданныхпоискассоциаций ' +
-    'типколонкианализаданныхпоискпоследовательностей типколонкимоделипрогноза типмерырасстоянияанализаданных ' +
-    'типотсеченияправилассоциации типполяанализаданных типстандартизациианализаданных типупорядочиванияправилассоциациианализаданных ' +
-    'типупорядочиванияшаблоновпоследовательностейанализаданных типупрощениядереварешений ';
-
-    // v8 системные перечисления - xml, json, xs, dom, xdto, web-сервисы ==> class
-    var v8_system_enums_xml_json_xs_dom_xdto_ws =
-    'wsнаправлениепараметра вариантxpathxs вариантзаписидатыjson вариантпростоготипаxs видгруппымоделиxs видфасетаxdto ' +
-    'действиепостроителяdom завершенностьпростоготипаxs завершенностьсоставноготипаxs завершенностьсхемыxs запрещенныеподстановкиxs ' +
-    'исключениягруппподстановкиxs категорияиспользованияатрибутаxs категорияограниченияидентичностиxs категорияограниченияпространствименxs ' +
-    'методнаследованияxs модельсодержимогоxs назначениетипаxml недопустимыеподстановкиxs обработкапробельныхсимволовxs обработкасодержимогоxs ' +
-    'ограничениезначенияxs параметрыотбораузловdom переносстрокjson позициявдокументеdom пробельныесимволыxml типатрибутаxml типзначенияjson ' +
-    'типканоническогоxml типкомпонентыxs типпроверкиxml типрезультатаdomxpath типузлаdom типузлаxml формаxml формапредставленияxs ' +
-    'форматдатыjson экранированиесимволовjson ';
-
-    // v8 системные перечисления - система компоновки данных ==> class
-    var v8_system_enums_data_composition_system =
-    'видсравнениякомпоновкиданных действиеобработкирасшифровкикомпоновкиданных направлениесортировкикомпоновкиданных ' +
-    'расположениевложенныхэлементоврезультатакомпоновкиданных расположениеитоговкомпоновкиданных расположениегруппировкикомпоновкиданных ' +
-    'расположениеполейгруппировкикомпоновкиданных расположениеполякомпоновкиданных расположениереквизитовкомпоновкиданных ' +
-    'расположениересурсовкомпоновкиданных типбухгалтерскогоостаткакомпоновкиданных типвыводатекстакомпоновкиданных ' +
-    'типгруппировкикомпоновкиданных типгруппыэлементовотборакомпоновкиданных типдополненияпериодакомпоновкиданных ' +
-    'типзаголовкаполейкомпоновкиданных типмакетагруппировкикомпоновкиданных типмакетаобластикомпоновкиданных типостаткакомпоновкиданных ' +
-    'типпериодакомпоновкиданных типразмещениятекстакомпоновкиданных типсвязинаборовданныхкомпоновкиданных типэлементарезультатакомпоновкиданных ' +
-    'расположениелегендыдиаграммыкомпоновкиданных типпримененияотборакомпоновкиданных режимотображенияэлементанастройкикомпоновкиданных ' +
-    'режимотображениянастроеккомпоновкиданных состояниеэлементанастройкикомпоновкиданных способвосстановлениянастроеккомпоновкиданных ' +
-    'режимкомпоновкирезультата использованиепараметракомпоновкиданных автопозицияресурсовкомпоновкиданных '+
-    'вариантиспользованиягруппировкикомпоновкиданных расположениересурсоввдиаграммекомпоновкиданных фиксациякомпоновкиданных ' +
-    'использованиеусловногооформлениякомпоновкиданных ';
-
-    // v8 системные перечисления - почта ==> class
-    var v8_system_enums_email =
-    'важностьинтернетпочтовогосообщения обработкатекстаинтернетпочтовогосообщения способкодированияинтернетпочтовоговложения ' +
-    'способкодированиянеasciiсимволовинтернетпочтовогосообщения типтекстапочтовогосообщения протоколинтернетпочты ' +
-    'статусразборапочтовогосообщения ';
-
-    // v8 системные перечисления - журнал регистрации ==> class
-    var v8_system_enums_logbook =
-    'режимтранзакциизаписижурналарегистрации статустранзакциизаписижурналарегистрации уровеньжурналарегистрации ';
-
-    // v8 системные перечисления - криптография ==> class
-    var v8_system_enums_cryptography =
-    'расположениехранилищасертификатовкриптографии режимвключениясертификатовкриптографии режимпроверкисертификатакриптографии ' +
-    'типхранилищасертификатовкриптографии ';
-
-    // v8 системные перечисления - ZIP ==> class
-    var v8_system_enums_zip =
-    'кодировкаименфайловвzipфайле методсжатияzip методшифрованияzip режимвосстановленияпутейфайловzip режимобработкиподкаталоговzip ' +
-    'режимсохраненияпутейzip уровеньсжатияzip ';
-
-    // v8 системные перечисления -
-    // Блокировка данных, Фоновые задания, Автоматизированное тестирование,
-    // Доставляемые уведомления, Встроенные покупки, Интернет, Работа с двоичными данными ==> class
-    var v8_system_enums_other =
-    'звуковоеоповещение направлениепереходакстроке позициявпотоке порядокбайтов режимблокировкиданных режимуправленияблокировкойданных ' +
-    'сервисвстроенныхпокупок состояниефоновогозадания типподписчикадоставляемыхуведомлений уровеньиспользованиязащищенногосоединенияftp ';
-
-    // v8 системные перечисления - схема запроса ==> class
-    var v8_system_enums_request_schema =
-    'направлениепорядкасхемызапроса типдополненияпериодамисхемызапроса типконтрольнойточкисхемызапроса типобъединениясхемызапроса ' +
-    'типпараметрадоступнойтаблицысхемызапроса типсоединениясхемызапроса ';
-
-    // v8 системные перечисления - свойства объектов метаданных ==> class
-    var v8_system_enums_properties_of_metadata_objects =
-    'httpметод автоиспользованиеобщегореквизита автопрефиксномеразадачи вариантвстроенногоязыка видиерархии видрегистранакопления ' +
-    'видтаблицывнешнегоисточникаданных записьдвиженийприпроведении заполнениепоследовательностей индексирование ' +
-    'использованиебазыпланавидоврасчета использованиебыстроговыбора использованиеобщегореквизита использованиеподчинения ' +
-    'использованиеполнотекстовогопоиска использованиеразделяемыхданныхобщегореквизита использованиереквизита ' +
-    'назначениеиспользованияприложения назначениерасширенияконфигурации направлениепередачи обновлениепредопределенныхданных ' +
-    'оперативноепроведение основноепредставлениевидарасчета основноепредставлениевидахарактеристики основноепредставлениезадачи ' +
-    'основноепредставлениепланаобмена основноепредставлениесправочника основноепредставлениесчета перемещениеграницыприпроведении ' +
-    'периодичностьномерабизнеспроцесса периодичностьномерадокумента периодичностьрегистрарасчета периодичностьрегистрасведений ' +
-    'повторноеиспользованиевозвращаемыхзначений полнотекстовыйпоискпривводепостроке принадлежностьобъекта проведение ' +
-    'разделениеаутентификацииобщегореквизита разделениеданныхобщегореквизита разделениерасширенийконфигурацииобщегореквизита '+
-    'режимавтонумерацииобъектов режимзаписирегистра режимиспользованиямодальности ' +
-    'режимиспользованиясинхронныхвызововрасширенийплатформыивнешнихкомпонент режимповторногоиспользованиясеансов ' +
-    'режимполученияданныхвыборапривводепостроке режимсовместимости режимсовместимостиинтерфейса ' +
-    'режимуправленияблокировкойданныхпоумолчанию сериикодовпланавидовхарактеристик сериикодовпланасчетов ' +
-    'сериикодовсправочника созданиепривводе способвыбора способпоискастрокипривводепостроке способредактирования ' +
-    'типданныхтаблицывнешнегоисточникаданных типкодапланавидоврасчета типкодасправочника типмакета типномерабизнеспроцесса ' +
-    'типномерадокумента типномеразадачи типформы удалениедвижений ';
-
-    // v8 системные перечисления - разные ==> class
-    var v8_system_enums_differents =
-    'важностьпроблемыприменениярасширенияконфигурации вариантинтерфейсаклиентскогоприложения вариантмасштабаформклиентскогоприложения ' +
-    'вариантосновногошрифтаклиентскогоприложения вариантстандартногопериода вариантстандартнойдатыначала видграницы видкартинки ' +
-    'видотображенияполнотекстовогопоиска видрамки видсравнения видцвета видчисловогозначения видшрифта допустимаядлина допустимыйзнак ' +
-    'использованиеbyteordermark использованиеметаданныхполнотекстовогопоиска источникрасширенийконфигурации клавиша кодвозвратадиалога ' +
-    'кодировкаxbase кодировкатекста направлениепоиска направлениесортировки обновлениепредопределенныхданных обновлениеприизмененииданных ' +
-    'отображениепанелиразделов проверказаполнения режимдиалогавопрос режимзапускаклиентскогоприложения режимокругления режимоткрытияформприложения ' +
-    'режимполнотекстовогопоиска скоростьклиентскогосоединения состояниевнешнегоисточникаданных состояниеобновленияконфигурациибазыданных ' +
-    'способвыборасертификатаwindows способкодированиястроки статуссообщения типвнешнейкомпоненты типплатформы типповеденияклавишиenter ' +
-    'типэлементаинформацииовыполненииобновленияконфигурациибазыданных уровеньизоляциитранзакций хешфункция частидаты';
-
-    // class: встроенные наборы значений, системные перечисления (содержат дочерние значения, обращения к которым через разыменование)
-    var CLASS =
-    v8_system_sets_of_values +
-    v8_system_enums_interface +
-    v8_system_enums_objects_properties +
-    v8_system_enums_exchange_plans +
-    v8_system_enums_tabular_document +
-    v8_system_enums_sheduler +
-    v8_system_enums_formatted_document +
-    v8_system_enums_query +
-    v8_system_enums_report_builder +
-    v8_system_enums_files +
-    v8_system_enums_query_builder +
-    v8_system_enums_data_analysis +
-    v8_system_enums_xml_json_xs_dom_xdto_ws +
-    v8_system_enums_data_composition_system +
-    v8_system_enums_email +
-    v8_system_enums_logbook +
-    v8_system_enums_cryptography +
-    v8_system_enums_zip +
-    v8_system_enums_other +
-    v8_system_enums_request_schema +
-    v8_system_enums_properties_of_metadata_objects +
-    v8_system_enums_differents;
-
-    // v8 общие объекты (у объектов есть конструктор, экземпляры создаются методом НОВЫЙ) ==> type
-    var v8_shared_object =
-    'comобъект ftpсоединение httpзапрос httpсервисответ httpсоединение wsопределения wsпрокси xbase анализданных аннотацияxs ' +
-    'блокировкаданных буфердвоичныхданных включениеxs выражениекомпоновкиданных генераторслучайныхчисел географическаясхема ' +
-    'географическиекоординаты графическаясхема группамоделиxs данныерасшифровкикомпоновкиданных двоичныеданные дендрограмма ' +
-    'диаграмма диаграммаганта диалогвыборафайла диалогвыборацвета диалогвыборашрифта диалограсписаниярегламентногозадания ' +
-    'диалогредактированиястандартногопериода диапазон документdom документhtml документацияxs доставляемоеуведомление ' +
-    'записьdom записьfastinfoset записьhtml записьjson записьxml записьzipфайла записьданных записьтекста записьузловdom ' +
-    'запрос защищенноесоединениеopenssl значенияполейрасшифровкикомпоновкиданных извлечениетекста импортxs интернетпочта ' +
-    'интернетпочтовоесообщение интернетпочтовыйпрофиль интернетпрокси интернетсоединение информациядляприложенияxs ' +
-    'использованиеатрибутаxs использованиесобытияжурналарегистрации источникдоступныхнастроеккомпоновкиданных ' +
-    'итераторузловdom картинка квалификаторыдаты квалификаторыдвоичныхданных квалификаторыстроки квалификаторычисла ' +
-    'компоновщикмакетакомпоновкиданных компоновщикнастроеккомпоновкиданных конструктормакетаоформлениякомпоновкиданных ' +
-    'конструкторнастроеккомпоновкиданных конструкторформатнойстроки линия макеткомпоновкиданных макетобластикомпоновкиданных ' +
-    'макетоформлениякомпоновкиданных маскаxs менеджеркриптографии наборсхемxml настройкикомпоновкиданных настройкисериализацииjson ' +
-    'обработкакартинок обработкарасшифровкикомпоновкиданных обходдереваdom объявлениеатрибутаxs объявлениенотацииxs ' +
-    'объявлениеэлементаxs описаниеиспользованиясобытиядоступжурналарегистрации ' +
-    'описаниеиспользованиясобытияотказвдоступежурналарегистрации описаниеобработкирасшифровкикомпоновкиданных ' +
-    'описаниепередаваемогофайла описаниетипов определениегруппыатрибутовxs определениегруппымоделиxs ' +
-    'определениеограниченияидентичностиxs определениепростоготипаxs определениесоставноготипаxs определениетипадокументаdom ' +
-    'определенияxpathxs отборкомпоновкиданных пакетотображаемыхдокументов параметрвыбора параметркомпоновкиданных ' +
-    'параметрызаписиjson параметрызаписиxml параметрычтенияxml переопределениеxs планировщик полеанализаданных ' +
-    'полекомпоновкиданных построительdom построительзапроса построительотчета построительотчетаанализаданных ' +
-    'построительсхемxml поток потоквпамяти почта почтовоесообщение преобразованиеxsl преобразованиекканоническомуxml ' +
-    'процессорвыводарезультатакомпоновкиданныхвколлекциюзначений процессорвыводарезультатакомпоновкиданныхвтабличныйдокумент ' +
-    'процессоркомпоновкиданных разыменовательпространствименdom рамка расписаниерегламентногозадания расширенноеимяxml ' +
-    'результатчтенияданных своднаядиаграмма связьпараметравыбора связьпотипу связьпотипукомпоновкиданных сериализаторxdto ' +
-    'сертификатклиентаwindows сертификатклиентафайл сертификаткриптографии сертификатыудостоверяющихцентровwindows ' +
-    'сертификатыудостоверяющихцентровфайл сжатиеданных системнаяинформация сообщениепользователю сочетаниеклавиш ' +
-    'сравнениезначений стандартнаядатаначала стандартныйпериод схемаxml схемакомпоновкиданных табличныйдокумент ' +
-    'текстовыйдокумент тестируемоеприложение типданныхxml уникальныйидентификатор фабрикаxdto файл файловыйпоток ' +
-    'фасетдлиныxs фасетколичестваразрядовдробнойчастиxs фасетмаксимальноговключающегозначенияxs ' +
-    'фасетмаксимальногоисключающегозначенияxs фасетмаксимальнойдлиныxs фасетминимальноговключающегозначенияxs ' +
-    'фасетминимальногоисключающегозначенияxs фасетминимальнойдлиныxs фасетобразцаxs фасетобщегоколичестваразрядовxs ' +
-    'фасетперечисленияxs фасетпробельныхсимволовxs фильтрузловdom форматированнаястрока форматированныйдокумент ' +
-    'фрагментxs хешированиеданных хранилищезначения цвет чтениеfastinfoset чтениеhtml чтениеjson чтениеxml чтениеzipфайла ' +
-    'чтениеданных чтениетекста чтениеузловdom шрифт элементрезультатакомпоновкиданных ';
-
-    // v8 универсальные коллекции значений ==> type
-    var v8_universal_collection =
-    'comsafearray деревозначений массив соответствие списокзначений структура таблицазначений фиксированнаяструктура ' +
-    'фиксированноесоответствие фиксированныймассив ';
-
-    // type : встроенные типы
-    var TYPE =
-    v8_shared_object +
-    v8_universal_collection;
-
-    // literal : примитивные типы
-    var LITERAL = 'null истина ложь неопределено';
-
-    // number : числа
-    var NUMBERS = hljs.inherit(hljs.NUMBER_MODE);
-
-    // string : строки
-    var STRINGS = {
-      className: 'string',
-      begin: '"|\\|', end: '"|$',
-      contains: [{begin: '""'}]
-    };
-
-    // number : даты
-    var DATE = {
-      begin: "'", end: "'", excludeBegin: true, excludeEnd: true,
-      contains: [
-        {
-          className: 'number',
-          begin: '\\d{4}([\\.\\\\/:-]?\\d{2}){0,5}'
-        }
-      ]
-    };
-
-    // comment : комментарии
-    var COMMENTS = hljs.inherit(hljs.C_LINE_COMMENT_MODE);
-
-    // meta : инструкции препроцессора, директивы компиляции
-    var META = {
-      className: 'meta',
-
-      begin: '#|&', end: '$',
-      keywords: {
-        $pattern: UNDERSCORE_IDENT_RE,
-        'meta-keyword': KEYWORD + METAKEYWORD
-      },
-      contains: [
-        COMMENTS
-      ]
-    };
-
-    // symbol : метка goto
-    var SYMBOL = {
-      className: 'symbol',
-      begin: '~', end: ';|:', excludeEnd: true
-    };
-
-    // function : объявление процедур и функций
-    var FUNCTION = {
-      className: 'function',
-      variants: [
-        {begin: 'процедура|функция', end: '\\)', keywords: 'процедура функция'},
-        {begin: 'конецпроцедуры|конецфункции', keywords: 'конецпроцедуры конецфункции'}
-      ],
-      contains: [
-        {
-          begin: '\\(', end: '\\)', endsParent : true,
-          contains: [
-            {
-              className: 'params',
-              begin: UNDERSCORE_IDENT_RE, end: ',', excludeEnd: true, endsWithParent: true,
-              keywords: {
-                $pattern: UNDERSCORE_IDENT_RE,
-                keyword: 'знач',
-                literal: LITERAL
-              },
-              contains: [
-                NUMBERS,
-                STRINGS,
-                DATE
-              ]
-            },
-            COMMENTS
-          ]
-        },
-        hljs.inherit(hljs.TITLE_MODE, {begin: UNDERSCORE_IDENT_RE})
-      ]
-    };
-
-    return {
-      name: '1C:Enterprise',
-      case_insensitive: true,
-      keywords: {
-        $pattern: UNDERSCORE_IDENT_RE,
-        keyword: KEYWORD,
-        built_in: BUILTIN,
-        class: CLASS,
-        type: TYPE,
-        literal: LITERAL
-      },
-      contains: [
-        META,
-        FUNCTION,
-        COMMENTS,
-        SYMBOL,
-        NUMBERS,
-        STRINGS,
-        DATE
-      ]
-    }
-  }
-
-  return _1c;
-
-  return module.exports.definer || module.exports;
-
-}());
-
-hljs.registerLanguage('abnf', function () {
-    'use strict';
-
-    /*
-    Language: Augmented Backus-Naur Form
-    Author: Alex McKibben 
-    Website: https://tools.ietf.org/html/rfc5234
-    */
-
-    /** @type LanguageFn */
-    function abnf(hljs) {
-        var regexes = {
-            ruleDeclaration: "^[a-zA-Z][a-zA-Z0-9-]*",
-            unexpectedChars: "[!@#$^&',?+~`|:]"
-        };
-
-        var keywords = [
-            "ALPHA",
-            "BIT",
-            "CHAR",
-            "CR",
-            "CRLF",
-            "CTL",
-            "DIGIT",
-            "DQUOTE",
-            "HEXDIG",
-            "HTAB",
-            "LF",
-            "LWSP",
-            "OCTET",
-            "SP",
-            "VCHAR",
-            "WSP"
-        ];
-
-        var commentMode = hljs.COMMENT(";", "$");
-
-        var terminalBinaryMode = {
-            className: "symbol",
-            begin: /%b[0-1]+(-[0-1]+|(\.[0-1]+)+){0,1}/
-        };
-
-        var terminalDecimalMode = {
-            className: "symbol",
-            begin: /%d[0-9]+(-[0-9]+|(\.[0-9]+)+){0,1}/
-        };
-
-        var terminalHexadecimalMode = {
-            className: "symbol",
-            begin: /%x[0-9A-F]+(-[0-9A-F]+|(\.[0-9A-F]+)+){0,1}/,
-        };
-
-        var caseSensitivityIndicatorMode = {
-            className: "symbol",
-            begin: /%[si]/
-        };
-
-        var ruleDeclarationMode = {
-            className: "attribute",
-            begin: regexes.ruleDeclaration + '(?=\\s*=)',
-        };
-
-        return {
-          name: 'Augmented Backus-Naur Form',
-          illegal: regexes.unexpectedChars,
-          keywords: keywords.join(" "),
-          contains: [
-              ruleDeclarationMode,
-              commentMode,
-              terminalBinaryMode,
-              terminalDecimalMode,
-              terminalHexadecimalMode,
-              caseSensitivityIndicatorMode,
-              hljs.QUOTE_STRING_MODE,
-              hljs.NUMBER_MODE
-          ]
-        };
-    }
-
-    return abnf;
-
-    return module.exports.definer || module.exports;
-
-}());
-
-hljs.registerLanguage('accesslog', function () {
-  'use strict';
-
-  /*
-   Language: Apache Access Log
-   Author: Oleg Efimov 
-   Description: Apache/Nginx Access Logs
-   Website: https://httpd.apache.org/docs/2.4/logs.html#accesslog
-   */
-
-   /** @type LanguageFn */
-  function accesslog(hljs) {
-    // https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods
-    var HTTP_VERBS = [
-      "GET", "POST", "HEAD", "PUT", "DELETE", "CONNECT", "OPTIONS", "PATCH", "TRACE"
-    ];
-    return {
-      name: 'Apache Access Log',
-      contains: [
-        // IP
-        {
-          className: 'number',
-          begin: '^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b',
-          relevance:5
-        },
-        // Other numbers
-        {
-          className: 'number',
-          begin: '\\b\\d+\\b',
-          relevance: 0
-        },
-        // Requests
-        {
-          className: 'string',
-          begin: '"(' + HTTP_VERBS.join("|") + ')', end: '"',
-          keywords: HTTP_VERBS.join(" "),
-          illegal: '\\n',
-          relevance: 5,
-          contains: [{
-            begin: 'HTTP/[12]\\.\\d',
-            relevance:5
-          }]
-        },
-        // Dates
-        {
-          className: 'string',
-          // dates must have a certain length, this prevents matching
-          // simple array accesses a[123] and [] and other common patterns
-          // found in other languages
-          begin: /\[\d[^\]\n]{8,}\]/,
-          illegal: '\\n',
-          relevance: 1
-        },
-        {
-          className: 'string',
-          begin: /\[/, end: /\]/,
-          illegal: '\\n',
-          relevance: 0
-        },
-        // User agent / relevance boost
-        {
-          className: 'string',
-          begin: '"Mozilla/\\d\\.\\d \\\(', end: '"',
-          illegal: '\\n',
-          relevance: 3
-        },
-        // Strings
-        {
-          className: 'string',
-          begin: '"', end: '"',
-          illegal: '\\n',
-          relevance: 0
-        }
-      ]
-    };
-  }
-
-  return accesslog;
-
-  return module.exports.definer || module.exports;
-
-}());
-
-hljs.registerLanguage('actionscript', function () {
-  'use strict';
-
-  /*
-  Language: ActionScript
-  Author: Alexander Myadzel 
-  Category: scripting
-  */
-
-  /** @type LanguageFn */
-  function actionscript(hljs) {
-    var IDENT_RE = '[a-zA-Z_$][a-zA-Z0-9_$]*';
-    var IDENT_FUNC_RETURN_TYPE_RE = '([*]|[a-zA-Z_$][a-zA-Z0-9_$]*)';
-
-    var AS3_REST_ARG_MODE = {
-      className: 'rest_arg',
-      begin: '[.]{3}', end: IDENT_RE,
-      relevance: 10
-    };
-
-    return {
-      name: 'ActionScript',
-      aliases: ['as'],
-      keywords: {
-        keyword: 'as break case catch class const continue default delete do dynamic each ' +
-          'else extends final finally for function get if implements import in include ' +
-          'instanceof interface internal is namespace native new override package private ' +
-          'protected public return set static super switch this throw try typeof use var void ' +
-          'while with',
-        literal: 'true false null undefined'
-      },
-      contains: [
-        hljs.APOS_STRING_MODE,
-        hljs.QUOTE_STRING_MODE,
-        hljs.C_LINE_COMMENT_MODE,
-        hljs.C_BLOCK_COMMENT_MODE,
-        hljs.C_NUMBER_MODE,
-        {
-          className: 'class',
-          beginKeywords: 'package', end: '{',
-          contains: [hljs.TITLE_MODE]
-        },
-        {
-          className: 'class',
-          beginKeywords: 'class interface', end: '{', excludeEnd: true,
-          contains: [
-            {
-              beginKeywords: 'extends implements'
-            },
-            hljs.TITLE_MODE
-          ]
-        },
-        {
-          className: 'meta',
-          beginKeywords: 'import include', end: ';',
-          keywords: {'meta-keyword': 'import include'}
-        },
-        {
-          className: 'function',
-          beginKeywords: 'function', end: '[{;]', excludeEnd: true,
-          illegal: '\\S',
-          contains: [
-            hljs.TITLE_MODE,
-            {
-              className: 'params',
-              begin: '\\(', end: '\\)',
-              contains: [
-                hljs.APOS_STRING_MODE,
-                hljs.QUOTE_STRING_MODE,
-                hljs.C_LINE_COMMENT_MODE,
-                hljs.C_BLOCK_COMMENT_MODE,
-                AS3_REST_ARG_MODE
-              ]
-            },
-            {
-              begin: ':\\s*' + IDENT_FUNC_RETURN_TYPE_RE
-            }
-          ]
-        },
-        hljs.METHOD_GUARD
-      ],
-      illegal: /#/
-    };
-  }
-
-  return actionscript;
-
-  return module.exports.definer || module.exports;
-
-}());
-
-hljs.registerLanguage('ada', function () {
-    'use strict';
-
-    /*
-    Language: Ada
-    Author: Lars Schulna 
-    Description: Ada is a general-purpose programming language that has great support for saftey critical and real-time applications.
-                 It has been developed by the DoD and thus has been used in military and safety-critical applications (like civil aviation).
-                 The first version appeared in the 80s, but it's still actively developed today with
-                 the newest standard being Ada2012.
-    */
-
-    // We try to support full Ada2012
-    //
-    // We highlight all appearances of types, keywords, literals (string, char, number, bool)
-    // and titles (user defined function/procedure/package)
-    // CSS classes are set accordingly
-    //
-    // Languages causing problems for language detection:
-    // xml (broken by Foo : Bar type), elm (broken by Foo : Bar type), vbscript-html (broken by body keyword)
-    // sql (ada default.txt has a lot of sql keywords)
-
-    /** @type LanguageFn */
-    function ada(hljs) {
-        // Regular expression for Ada numeric literals.
-        // stolen form the VHDL highlighter
-
-        // Decimal literal:
-        var INTEGER_RE = '\\d(_|\\d)*';
-        var EXPONENT_RE = '[eE][-+]?' + INTEGER_RE;
-        var DECIMAL_LITERAL_RE = INTEGER_RE + '(\\.' + INTEGER_RE + ')?' + '(' + EXPONENT_RE + ')?';
-
-        // Based literal:
-        var BASED_INTEGER_RE = '\\w+';
-        var BASED_LITERAL_RE = INTEGER_RE + '#' + BASED_INTEGER_RE + '(\\.' + BASED_INTEGER_RE + ')?' + '#' + '(' + EXPONENT_RE + ')?';
-
-        var NUMBER_RE = '\\b(' + BASED_LITERAL_RE + '|' + DECIMAL_LITERAL_RE + ')';
-
-        // Identifier regex
-        var ID_REGEX = '[A-Za-z](_?[A-Za-z0-9.])*';
-
-        // bad chars, only allowed in literals
-        var BAD_CHARS = `[]{}%#'"`;
-
-        // Ada doesn't have block comments, only line comments
-        var COMMENTS = hljs.COMMENT('--', '$');
-
-        // variable declarations of the form
-        // Foo : Bar := Baz;
-        // where only Bar will be highlighted
-        var VAR_DECLS = {
-            // TODO: These spaces are not required by the Ada syntax
-            // however, I have yet to see handwritten Ada code where
-            // someone does not put spaces around :
-            begin: '\\s+:\\s+', end: '\\s*(:=|;|\\)|=>|$)',
-            // endsWithParent: true,
-            // returnBegin: true,
-            illegal: BAD_CHARS,
-            contains: [
-                {
-                    // workaround to avoid highlighting
-                    // named loops and declare blocks
-                    beginKeywords: 'loop for declare others',
-                    endsParent: true,
-                },
-                {
-                    // properly highlight all modifiers
-                    className: 'keyword',
-                    beginKeywords: 'not null constant access function procedure in out aliased exception'
-                },
-                {
-                    className: 'type',
-                    begin: ID_REGEX,
-                    endsParent: true,
-                    relevance: 0,
-                }
-            ]
-        };
-
-        return {
-            name: 'Ada',
-            case_insensitive: true,
-            keywords: {
-                keyword:
-                    'abort else new return abs elsif not reverse abstract end ' +
-                    '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 ' +
-                    'is raise use declare range delay limited record when delta loop rem while ' +
-                    'digits renames with do mod requeue xor',
-                literal:
-                    'True False',
-            },
-            contains: [
-                COMMENTS,
-                // strings "foobar"
-                {
-                    className: 'string',
-                    begin: /"/, end: /"/,
-                    contains: [{begin: /""/, relevance: 0}]
-                },
-                // characters ''
-                {
-                    // character literals always contain one char
-                    className: 'string',
-                    begin: /'.'/
-                },
-                {
-                    // number literals
-                    className: 'number',
-                    begin: NUMBER_RE,
-                    relevance: 0
-                },
-                {
-                    // Attributes
-                    className: 'symbol',
-                    begin: "'" + ID_REGEX,
-                },
-                {
-                    // package definition, maybe inside generic
-                    className: 'title',
-                    begin: '(\\bwith\\s+)?(\\bprivate\\s+)?\\bpackage\\s+(\\bbody\\s+)?', end: '(is|$)',
-                    keywords: 'package body',
-                    excludeBegin: true,
-                    excludeEnd: true,
-                    illegal: BAD_CHARS
-                },
-                {
-                    // function/procedure declaration/definition
-                    // maybe inside generic
-                    begin: '(\\b(with|overriding)\\s+)?\\b(function|procedure)\\s+', end: '(\\bis|\\bwith|\\brenames|\\)\\s*;)',
-                    keywords: 'overriding function procedure with is renames return',
-                    // we need to re-match the 'function' keyword, so that
-                    // the title mode below matches only exactly once
-                    returnBegin: true,
-                    contains:
-                    [
-                        COMMENTS,
-                        {
-                            // name of the function/procedure
-                            className: 'title',
-                            begin: '(\\bwith\\s+)?\\b(function|procedure)\\s+',
-                            end: '(\\(|\\s+|$)',
-                            excludeBegin: true,
-                            excludeEnd: true,
-                            illegal: BAD_CHARS
-                        },
-                        // 'self'
-                        // // parameter types
-                        VAR_DECLS,
-                        {
-                            // return type
-                            className: 'type',
-                            begin: '\\breturn\\s+', end: '(\\s+|;|$)',
-                            keywords: 'return',
-                            excludeBegin: true,
-                            excludeEnd: true,
-                            // we are done with functions
-                            endsParent: true,
-                            illegal: BAD_CHARS
-
-                        },
-                    ]
-                },
-                {
-                    // new type declarations
-                    // maybe inside generic
-                    className: 'type',
-                    begin: '\\b(sub)?type\\s+', end: '\\s+',
-                    keywords: 'type',
-                    excludeBegin: true,
-                    illegal: BAD_CHARS
-                },
-
-                // see comment above the definition
-                VAR_DECLS,
-
-                // no markup
-                // relevance boosters for small snippets
-                // {begin: '\\s*=>\\s*'},
-                // {begin: '\\s*:=\\s*'},
-                // {begin: '\\s+:=\\s+'},
-            ]
-        };
-    }
-
-    return ada;
-
-    return module.exports.definer || module.exports;
-
-}());
-
-hljs.registerLanguage('angelscript', function () {
-  'use strict';
-
-  /*
-  Language: AngelScript
-  Author: Melissa Geels 
-  Category: scripting
-  Website: https://www.angelcode.com/angelscript/
-  */
-
-  /** @type LanguageFn */
-  function angelscript(hljs) {
-    var builtInTypeMode = {
-      className: 'built_in',
-      begin: '\\b(void|bool|int|int8|int16|int32|int64|uint|uint8|uint16|uint32|uint64|string|ref|array|double|float|auto|dictionary)'
-    };
-
-    var objectHandleMode = {
-      className: 'symbol',
-      begin: '[a-zA-Z0-9_]+@'
-    };
-
-    var genericMode = {
-      className: 'keyword',
-      begin: '<', end: '>',
-      contains: [ builtInTypeMode, objectHandleMode ]
-    };
-
-    builtInTypeMode.contains = [ genericMode ];
-    objectHandleMode.contains = [ genericMode ];
-
-    return {
-      name: 'AngelScript',
-      aliases: ['asc'],
-
-      keywords:
-        'for in|0 break continue while do|0 return if else case switch namespace is cast ' +
-        'or and xor not get|0 in inout|10 out override set|0 private public const default|0 ' +
-        'final shared external mixin|10 enum typedef funcdef this super import from interface ' +
-        'abstract|0 try catch protected explicit property',
-
-      // avoid close detection with C# and JS
-      illegal: '(^using\\s+[A-Za-z0-9_\\.]+;$|\\bfunction\s*[^\\(])',
-
-      contains: [
-        { // 'strings'
-          className: 'string',
-          begin: '\'', end: '\'',
-          illegal: '\\n',
-          contains: [ hljs.BACKSLASH_ESCAPE ],
-          relevance: 0
-        },
-
-        { // "strings"
-          className: 'string',
-          begin: '"', end: '"',
-          illegal: '\\n',
-          contains: [ hljs.BACKSLASH_ESCAPE ],
-          relevance: 0
-        },
-
-        // """heredoc strings"""
-        {
-          className: 'string',
-          begin: '"""', end: '"""'
-        },
-
-        hljs.C_LINE_COMMENT_MODE, // single-line comments
-        hljs.C_BLOCK_COMMENT_MODE, // comment blocks
-
-        { // interface or namespace declaration
-          beginKeywords: 'interface namespace', end: '{',
-          illegal: '[;.\\-]',
-          contains: [
-            { // interface or namespace name
-              className: 'symbol',
-              begin: '[a-zA-Z0-9_]+'
-            }
-          ]
-        },
-
-        { // class declaration
-          beginKeywords: 'class', end: '{',
-          illegal: '[;.\\-]',
-          contains: [
-            { // class name
-              className: 'symbol',
-              begin: '[a-zA-Z0-9_]+',
-              contains: [
-                {
-                  begin: '[:,]\\s*',
-                  contains: [
-                    {
-                      className: 'symbol',
-                      begin: '[a-zA-Z0-9_]+'
-                    }
-                  ]
-                }
-              ]
-            }
-          ]
-        },
-
-        builtInTypeMode, // built-in types
-        objectHandleMode, // object handles
-
-        { // literals
-          className: 'literal',
-          begin: '\\b(null|true|false)'
-        },
-
-        { // numbers
-          className: 'number',
-          begin: '(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?f?|\\.\\d+f?)([eE][-+]?\\d+f?)?)'
-        }
-      ]
-    };
-  }
-
-  return angelscript;
-
-  return module.exports.definer || module.exports;
-
-}());
-
-hljs.registerLanguage('apache', function () {
-  'use strict';
-
-  /*
-  Language: Apache config
-  Author: Ruslan Keba 
-  Contributors: Ivan Sagalaev 
-  Website: https://httpd.apache.org
-  Description: language definition for Apache configuration files (httpd.conf & .htaccess)
-  Category: common, config
-  */
-
-  /** @type LanguageFn */
-  function apache(hljs) {
-    var NUMBER_REF = {className: 'number', begin: '[\\$%]\\d+'};
-    var NUMBER = {className: 'number', begin: '\\d+'};
-    var IP_ADDRESS = {
-      className: "number",
-      begin: '\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?'
-    };
-    var PORT_NUMBER = {
-      className: "number",
-      begin: ":\\d{1,5}"
-    };
-    return {
-      name: 'Apache config',
-      aliases: ['apacheconf'],
-      case_insensitive: true,
-      contains: [
-        hljs.HASH_COMMENT_MODE,
-        {className: 'section', begin: '',
-        contains: [
-          IP_ADDRESS,
-          PORT_NUMBER,
-          // low relevance prevents us from claming XML/HTML where this rule would
-          // match strings inside of XML tags
-          hljs.inherit(hljs.QUOTE_STRING_MODE, { relevance:0 })
-        ]
-      },
-        {
-          className: 'attribute',
-          begin: /\w+/,
-          relevance: 0,
-          // keywords aren’t needed for highlighting per se, they only boost relevance
-          // for a very generally defined mode (starts with a word, ends with line-end
-          keywords: {
-            nomarkup:
-              'order deny allow setenv rewriterule rewriteengine rewritecond documentroot ' +
-              'sethandler errordocument loadmodule options header listen serverroot ' +
-              'servername'
-          },
-          starts: {
-            end: /$/,
-            relevance: 0,
-            keywords: {
-              literal: 'on off all deny allow'
-            },
-            contains: [
-              {
-                className: 'meta',
-                begin: '\\s\\[', end: '\\]$'
-              },
-              {
-                className: 'variable',
-                begin: '[\\$%]\\{', end: '\\}',
-                contains: ['self', NUMBER_REF]
-              },
-              IP_ADDRESS,
-              NUMBER,
-              hljs.QUOTE_STRING_MODE
-            ]
-          }
-        }
-      ],
-      illegal: /\S/
-    };
-  }
-
-  return apache;
-
-  return module.exports.definer || module.exports;
-
-}());
-
-hljs.registerLanguage('applescript', function () {
-  'use strict';
-
-  /*
-  Language: AppleScript
-  Authors: Nathan Grigg , Dr. Drang 
-  Category: scripting
-  Website: https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/introduction/ASLR_intro.html
-  */
-
-  /** @type LanguageFn */
-  function applescript(hljs) {
-    var STRING = hljs.inherit(hljs.QUOTE_STRING_MODE, {illegal: ''});
-    var PARAMS = {
-      className: 'params',
-      begin: '\\(', end: '\\)',
-      contains: ['self', hljs.C_NUMBER_MODE, STRING]
-    };
-    var COMMENT_MODE_1 = hljs.COMMENT('--', '$');
-    var COMMENT_MODE_2 = hljs.COMMENT(
-      '\\(\\*',
-      '\\*\\)',
-      {
-        contains: ['self', COMMENT_MODE_1] //allow nesting
-      }
-    );
-    var COMMENTS = [
-      COMMENT_MODE_1,
-      COMMENT_MODE_2,
-      hljs.HASH_COMMENT_MODE
-    ];
-
-    return {
-      name: 'AppleScript',
-      aliases: ['osascript'],
-      keywords: {
-        keyword:
-          'about above after against and around as at back before beginning ' +
-          'behind below beneath beside between but by considering ' +
-          'contain contains continue copy div does eighth else end equal ' +
-          'equals error every exit fifth first for fourth from front ' +
-          'get given global if ignoring in into is it its last local me ' +
-          'middle mod my ninth not of on onto or over prop property put ref ' +
-          'reference repeat returning script second set seventh since ' +
-          'sixth some tell tenth that the|0 then third through thru ' +
-          'timeout times to transaction try until where while whose with ' +
-          'without',
-        literal:
-          'AppleScript false linefeed return pi quote result space tab true',
-        built_in:
-          'alias application boolean class constant date file integer list ' +
-          'number real record string text ' +
-          'activate beep count delay launch log offset read round ' +
-          'run say summarize write ' +
-          'character characters contents day frontmost id item length ' +
-          'month name paragraph paragraphs rest reverse running time version ' +
-          'weekday word words year'
-      },
-      contains: [
-        STRING,
-        hljs.C_NUMBER_MODE,
-        {
-          className: 'built_in',
-          begin:
-            '\\b(clipboard info|the clipboard|info for|list (disks|folder)|' +
-            'mount volume|path to|(close|open for) access|(get|set) eof|' +
-            'current date|do shell script|get volume settings|random number|' +
-            'set volume|system attribute|system info|time to GMT|' +
-            '(load|run|store) script|scripting components|' +
-            'ASCII (character|number)|localized string|' +
-            'choose (application|color|file|file name|' +
-            'folder|from list|remote application|URL)|' +
-            'display (alert|dialog))\\b|^\\s*return\\b'
-        },
-        {
-          className: 'literal',
-          begin:
-            '\\b(text item delimiters|current application|missing value)\\b'
-        },
-        {
-          className: 'keyword',
-          begin:
-            '\\b(apart from|aside from|instead of|out of|greater than|' +
-            "isn't|(doesn't|does not) (equal|come before|come after|contain)|" +
-            '(greater|less) than( or equal)?|(starts?|ends|begins?) with|' +
-            'contained by|comes (before|after)|a (ref|reference)|POSIX file|' +
-            'POSIX path|(date|time) string|quoted form)\\b'
-        },
-        {
-          beginKeywords: 'on',
-          illegal: '[${=;\\n]',
-          contains: [hljs.UNDERSCORE_TITLE_MODE, PARAMS]
-        }
-      ].concat(COMMENTS),
-      illegal: '//|->|=>|\\[\\['
-    };
-  }
-
-  return applescript;
-
-  return module.exports.definer || module.exports;
-
-}());
-
-hljs.registerLanguage('arcade', function () {
-  'use strict';
-
-  /*
-   Language: ArcGIS Arcade
-   Category: scripting
-   Author: John Foster 
-   Website: https://developers.arcgis.com/arcade/
-   Description: ArcGIS Arcade is an expression language used in many Esri ArcGIS products such as Pro, Online, Server, Runtime, JavaScript, and Python
-  */
-
-  /** @type LanguageFn */
-  function arcade(hljs) {
-    var IDENT_RE = '[A-Za-z_][0-9A-Za-z_]*';
-    var KEYWORDS = {
-      keyword:
-        'if for while var new function do return void else break',
-      literal:
-        'BackSlash DoubleQuote false ForwardSlash Infinity NaN NewLine null PI SingleQuote Tab TextFormatting true undefined',
-      built_in:
-        'Abs Acos Angle Attachments Area AreaGeodetic Asin Atan Atan2 Average Bearing Boolean Buffer BufferGeodetic ' +
-        'Ceil Centroid Clip Console Constrain Contains Cos Count Crosses Cut Date DateAdd ' +
-        'DateDiff Day Decode DefaultValue Dictionary Difference Disjoint Distance DistanceGeodetic Distinct ' +
-        'DomainCode DomainName Equals Exp Extent Feature FeatureSet FeatureSetByAssociation FeatureSetById FeatureSetByPortalItem ' +
-        'FeatureSetByRelationshipName FeatureSetByTitle FeatureSetByUrl Filter First Floor Geometry GroupBy Guid HasKey Hour IIf IndexOf ' +
-        'Intersection Intersects IsEmpty IsNan IsSelfIntersecting Length LengthGeodetic Log Max Mean Millisecond Min Minute Month ' +
-        'MultiPartToSinglePart Multipoint NextSequenceValue Now Number OrderBy Overlaps Point Polygon ' +
-        'Polyline Portal Pow Random Relate Reverse RingIsClockWise Round Second SetGeometry Sin Sort Sqrt Stdev Sum ' +
-        'SymmetricDifference Tan Text Timestamp Today ToLocal Top Touches ToUTC TrackCurrentTime ' +
-        'TrackGeometryWindow TrackIndex TrackStartTime TrackWindow TypeOf Union UrlEncode Variance ' +
-        'Weekday When Within Year '
-    };
-    var SYMBOL = {
-      className: 'symbol',
-      begin: '\\$[datastore|feature|layer|map|measure|sourcefeature|sourcelayer|targetfeature|targetlayer|value|view]+'
-    };
-    var NUMBER = {
-      className: 'number',
-      variants: [
-        { begin: '\\b(0[bB][01]+)' },
-        { begin: '\\b(0[oO][0-7]+)' },
-        { begin: hljs.C_NUMBER_RE }
-      ],
-      relevance: 0
-    };
-    var SUBST = {
-      className: 'subst',
-      begin: '\\$\\{', end: '\\}',
-      keywords: KEYWORDS,
-      contains: [] // defined later
-    };
-    var TEMPLATE_STRING = {
-      className: 'string',
-      begin: '`', end: '`',
-      contains: [
-        hljs.BACKSLASH_ESCAPE,
-        SUBST
-      ]
-    };
-    SUBST.contains = [
-      hljs.APOS_STRING_MODE,
-      hljs.QUOTE_STRING_MODE,
-      TEMPLATE_STRING,
-      NUMBER,
-      hljs.REGEXP_MODE
-    ];
-    var PARAMS_CONTAINS = SUBST.contains.concat([
-      hljs.C_BLOCK_COMMENT_MODE,
-      hljs.C_LINE_COMMENT_MODE
-    ]);
-
-    return {
-      name: 'ArcGIS Arcade',
-      aliases: ['arcade'],
-      keywords: KEYWORDS,
-      contains: [
-        hljs.APOS_STRING_MODE,
-        hljs.QUOTE_STRING_MODE,
-        TEMPLATE_STRING,
-        hljs.C_LINE_COMMENT_MODE,
-        hljs.C_BLOCK_COMMENT_MODE,
-        SYMBOL,
-        NUMBER,
-        { // object attr container
-          begin: /[{,]\s*/, relevance: 0,
-          contains: [
-            {
-              begin: IDENT_RE + '\\s*:', returnBegin: true,
-              relevance: 0,
-              contains: [{className: 'attr', begin: IDENT_RE, relevance: 0}]
-            }
-          ]
-        },
-        { // "value" container
-          begin: '(' + hljs.RE_STARTERS_RE + '|\\b(return)\\b)\\s*',
-          keywords: 'return',
-          contains: [
-            hljs.C_LINE_COMMENT_MODE,
-            hljs.C_BLOCK_COMMENT_MODE,
-            hljs.REGEXP_MODE,
-            {
-              className: 'function',
-              begin: '(\\(.*?\\)|' + IDENT_RE + ')\\s*=>', returnBegin: true,
-              end: '\\s*=>',
-              contains: [
-                {
-                  className: 'params',
-                  variants: [
-                    {
-                      begin: IDENT_RE
-                    },
-                    {
-                      begin: /\(\s*\)/,
-                    },
-                    {
-                      begin: /\(/, end: /\)/,
-                      excludeBegin: true, excludeEnd: true,
-                      keywords: KEYWORDS,
-                      contains: PARAMS_CONTAINS
-                    }
-                  ]
-                }
-              ]
-            }
-          ],
-          relevance: 0
-        },
-        {
-          className: 'function',
-          beginKeywords: 'function', end: /\{/, excludeEnd: true,
-          contains: [
-            hljs.inherit(hljs.TITLE_MODE, {begin: IDENT_RE}),
-            {
-              className: 'params',
-              begin: /\(/, end: /\)/,
-              excludeBegin: true,
-              excludeEnd: true,
-              contains: PARAMS_CONTAINS
-            }
-          ],
-          illegal: /\[|%/
-        },
-        {
-          begin: /\$[(.]/
-        }
-      ],
-      illegal: /#(?!!)/
-    };
-  }
-
-  return arcade;
-
-  return module.exports.definer || module.exports;
-
-}());
-
-hljs.registerLanguage('c-like', function () {
-  'use strict';
-
-  /*
-  Language: C-like foundation grammar for C/C++ grammars
-  Author: Ivan Sagalaev 
-  Contributors: Evgeny Stepanischev , Zaven Muradyan , Roel Deckers , Sam Wu , Jordi Petit , Pieter Vantorre , Google Inc. (David Benjamin) 
-  Category: common, system
-  */
-
-  /* In the future the intention is to split out the C/C++ grammars distinctly
-  since they are separate languages.  They will likely share a common foundation
-  though, and this file sets the groundwork for that - so that we get the breaking
-  change in v10 and don't have to change the requirements again later.
-
-  See: https://github.com/highlightjs/highlight.js/issues/2146
-  */
-
-  /** @type LanguageFn */
-  function cLike(hljs) {
-    function optional(s) {
-      return '(?:' + s + ')?';
-    }
-    var DECLTYPE_AUTO_RE = 'decltype\\(auto\\)';
-    var NAMESPACE_RE = '[a-zA-Z_]\\w*::';
-    var TEMPLATE_ARGUMENT_RE = '<.*?>';
-    var FUNCTION_TYPE_RE = '(' +
-      DECLTYPE_AUTO_RE + '|' +
-      optional(NAMESPACE_RE) +'[a-zA-Z_]\\w*' + optional(TEMPLATE_ARGUMENT_RE) +
-    ')';
-    var CPP_PRIMITIVE_TYPES = {
-      className: 'keyword',
-      begin: '\\b[a-z\\d_]*_t\\b'
-    };
-
-    // https://en.cppreference.com/w/cpp/language/escape
-    // \\ \x \xFF \u2837 \u00323747 \374
-    var CHARACTER_ESCAPES = '\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)';
-    var STRINGS = {
-      className: 'string',
-      variants: [
-        {
-          begin: '(u8?|U|L)?"', end: '"',
-          illegal: '\\n',
-          contains: [hljs.BACKSLASH_ESCAPE]
-        },
-        {
-          begin: '(u8?|U|L)?\'(' + CHARACTER_ESCAPES + "|.)", end: '\'',
-          illegal: '.'
-        },
-        hljs.END_SAME_AS_BEGIN({
-          begin: /(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,
-          end: /\)([^()\\ ]{0,16})"/,
-        })
-      ]
-    };
-
-    var NUMBERS = {
-      className: 'number',
-      variants: [
-        { begin: '\\b(0b[01\']+)' },
-        { begin: '(-?)\\b([\\d\']+(\\.[\\d\']*)?|\\.[\\d\']+)(u|U|l|L|ul|UL|f|F|b|B)' },
-        { begin: '(-?)(\\b0[xX][a-fA-F0-9\']+|(\\b[\\d\']+(\\.[\\d\']*)?|\\.[\\d\']+)([eE][-+]?[\\d\']+)?)' }
-      ],
-      relevance: 0
-    };
-
-    var PREPROCESSOR =       {
-      className: 'meta',
-      begin: /#\s*[a-z]+\b/, end: /$/,
-      keywords: {
-        'meta-keyword':
-          'if else elif endif define undef warning error line ' +
-          'pragma _Pragma ifdef ifndef include'
-      },
-      contains: [
-        {
-          begin: /\\\n/, relevance: 0
-        },
-        hljs.inherit(STRINGS, {className: 'meta-string'}),
-        {
-          className: 'meta-string',
-          begin: /<.*?>/, end: /$/,
-          illegal: '\\n',
-        },
-        hljs.C_LINE_COMMENT_MODE,
-        hljs.C_BLOCK_COMMENT_MODE
-      ]
-    };
-
-    var TITLE_MODE = {
-      className: 'title',
-      begin: optional(NAMESPACE_RE) + hljs.IDENT_RE,
-      relevance: 0
-    };
-
-    var FUNCTION_TITLE = optional(NAMESPACE_RE) + hljs.IDENT_RE + '\\s*\\(';
-
-    var CPP_KEYWORDS = {
-      keyword: 'int float while private char char8_t char16_t char32_t catch import module export virtual operator sizeof ' +
-        'dynamic_cast|10 typedef const_cast|10 const for static_cast|10 union namespace ' +
-        'unsigned long volatile static protected bool template mutable if public friend ' +
-        'do goto auto void enum else break extern using asm case typeid wchar_t ' +
-        'short reinterpret_cast|10 default double register explicit signed typename try this ' +
-        'switch continue inline delete alignas alignof constexpr consteval constinit decltype ' +
-        'concept co_await co_return co_yield requires ' +
-        'noexcept static_assert thread_local restrict final override ' +
-        'atomic_bool atomic_char atomic_schar ' +
-        'atomic_uchar atomic_short atomic_ushort atomic_int atomic_uint atomic_long atomic_ulong atomic_llong ' +
-        'atomic_ullong new throw return ' +
-        'and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq',
-      built_in: 'std string wstring cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream ' +
-        'auto_ptr deque list queue stack vector map set pair bitset multiset multimap unordered_set ' +
-        'unordered_map unordered_multiset unordered_multimap priority_queue make_pair array shared_ptr abort terminate abs acos ' +
-        'asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp ' +
-        'fscanf future isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper ' +
-        'isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow ' +
-        'printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp ' +
-        'strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan ' +
-        'vfprintf vprintf vsprintf endl initializer_list unique_ptr _Bool complex _Complex imaginary _Imaginary',
-      literal: 'true false nullptr NULL'
-    };
-
-    var EXPRESSION_CONTAINS = [
-      CPP_PRIMITIVE_TYPES,
-      hljs.C_LINE_COMMENT_MODE,
-      hljs.C_BLOCK_COMMENT_MODE,
-      NUMBERS,
-      STRINGS
-    ];
-
-    var EXPRESSION_CONTEXT = {
-      // This mode covers expression context where we can't expect a function
-      // definition and shouldn't highlight anything that looks like one:
-      // `return some()`, `else if()`, `(x*sum(1, 2))`
-      variants: [
-        {begin: /=/, end: /;/},
-        {begin: /\(/, end: /\)/},
-        {beginKeywords: 'new throw return else', end: /;/}
-      ],
-      keywords: CPP_KEYWORDS,
-      contains: EXPRESSION_CONTAINS.concat([
-        {
-          begin: /\(/, end: /\)/,
-          keywords: CPP_KEYWORDS,
-          contains: EXPRESSION_CONTAINS.concat(['self']),
-          relevance: 0
-        }
-      ]),
-      relevance: 0
-    };
-
-    var FUNCTION_DECLARATION = {
-      className: 'function',
-      begin: '(' + FUNCTION_TYPE_RE + '[\\*&\\s]+)+' + FUNCTION_TITLE,
-      returnBegin: true, end: /[{;=]/,
-      excludeEnd: true,
-      keywords: CPP_KEYWORDS,
-      illegal: /[^\w\s\*&:<>]/,
-      contains: [
-
-        { // to prevent it from being confused as the function title
-          begin: DECLTYPE_AUTO_RE,
-          keywords: CPP_KEYWORDS,
-          relevance: 0,
-        },
-        {
-          begin: FUNCTION_TITLE, returnBegin: true,
-          contains: [TITLE_MODE],
-          relevance: 0
-        },
-        {
-          className: 'params',
-          begin: /\(/, end: /\)/,
-          keywords: CPP_KEYWORDS,
-          relevance: 0,
-          contains: [
-            hljs.C_LINE_COMMENT_MODE,
-            hljs.C_BLOCK_COMMENT_MODE,
-            STRINGS,
-            NUMBERS,
-            CPP_PRIMITIVE_TYPES,
-            // Count matching parentheses.
-            {
-              begin: /\(/, end: /\)/,
-              keywords: CPP_KEYWORDS,
-              relevance: 0,
-              contains: [
-                'self',
-                hljs.C_LINE_COMMENT_MODE,
-                hljs.C_BLOCK_COMMENT_MODE,
-                STRINGS,
-                NUMBERS,
-                CPP_PRIMITIVE_TYPES
-              ]
-            }
-          ]
-        },
-        CPP_PRIMITIVE_TYPES,
-        hljs.C_LINE_COMMENT_MODE,
-        hljs.C_BLOCK_COMMENT_MODE,
-        PREPROCESSOR
-      ]
-    };
-
-    return {
-      aliases: ['c', 'cc', 'h', 'c++', 'h++', 'hpp', 'hh', 'hxx', 'cxx'],
-      keywords: CPP_KEYWORDS,
-      // the base c-like language will NEVER be auto-detected, rather the
-      // derivitives: c, c++, arduino turn auto-detect back on for themselves
-      disableAutodetect: true,
-      illegal: ' rooms (9);`
-          begin: '\\b(deque|list|queue|priority_queue|pair|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array)\\s*<', end: '>',
-          keywords: CPP_KEYWORDS,
-          contains: ['self', CPP_PRIMITIVE_TYPES]
-        },
-        {
-          begin: hljs.IDENT_RE + '::',
-          keywords: CPP_KEYWORDS
-        },
-        {
-          className: 'class',
-          beginKeywords: 'class struct', end: /[{;:]/,
-          contains: [
-            { beginKeywords: "final" },
-            {begin: //, contains: ['self']}, // skip generic stuff
-            hljs.TITLE_MODE
-          ]
-        }
-      ]),
-      exports: {
-        preprocessor: PREPROCESSOR,
-        strings: STRINGS,
-        keywords: CPP_KEYWORDS
-      }
-    };
-  }
-
-  return cLike;
-
-  return module.exports.definer || module.exports;
-
-}());
-
-hljs.registerLanguage('cpp', function () {
-  'use strict';
-
-  /*
-  Language: C++
-  Category: common, system
-  Website: https://isocpp.org
-  Requires: c-like.js
-  */
-
-  /** @type LanguageFn */
-  function cpp(hljs) {
-    var lang = hljs.requireLanguage('c-like').rawDefinition();
-    // return auto-detection back on
-    lang.disableAutodetect = false;
-    lang.name = 'C++';
-    lang.aliases = ['cc', 'c++', 'h++', 'hpp', 'hh', 'hxx', 'cxx'];
-    return lang;
-  }
-
-  return cpp;
-
-  return module.exports.definer || module.exports;
-
-}());
-
-hljs.registerLanguage('arduino', function () {
-  'use strict';
-
-  /*
-  Language: Arduino
-  Author: Stefania Mellai 
-  Description: The Arduino® Language is a superset of C++. This rules are designed to highlight the Arduino® source code. For info about language see http://www.arduino.cc.
-  Requires: cpp.js
-  Website: https://www.arduino.cc
-  */
-
-  /** @type LanguageFn */
-  function arduino(hljs) {
-
-  	var ARDUINO_KW = {
-        keyword:
-          'boolean byte word String',
-        built_in:
-          'setup loop ' +
-          'KeyboardController MouseController SoftwareSerial ' +
-          'EthernetServer EthernetClient LiquidCrystal ' +
-          'RobotControl GSMVoiceCall EthernetUDP EsploraTFT ' +
-          'HttpClient RobotMotor WiFiClient GSMScanner ' +
-          'FileSystem Scheduler GSMServer YunClient YunServer ' +
-          'IPAddress GSMClient GSMModem Keyboard Ethernet ' +
-          'Console GSMBand Esplora Stepper Process ' +
-          'WiFiUDP GSM_SMS Mailbox USBHost Firmata PImage ' +
-          'Client Server GSMPIN FileIO Bridge Serial ' +
-          'EEPROM Stream Mouse Audio Servo File Task ' +
-          'GPRS WiFi Wire TFT GSM SPI SD ' +
-          'runShellCommandAsynchronously analogWriteResolution ' +
-          'retrieveCallingNumber printFirmwareVersion ' +
-          'analogReadResolution sendDigitalPortPair ' +
-          'noListenOnLocalhost readJoystickButton setFirmwareVersion ' +
-          'readJoystickSwitch scrollDisplayRight getVoiceCallStatus ' +
-          'scrollDisplayLeft writeMicroseconds delayMicroseconds ' +
-          'beginTransmission getSignalStrength runAsynchronously ' +
-          'getAsynchronously listenOnLocalhost getCurrentCarrier ' +
-          'readAccelerometer messageAvailable sendDigitalPorts ' +
-          'lineFollowConfig countryNameWrite runShellCommand ' +
-          'readStringUntil rewindDirectory readTemperature ' +
-          'setClockDivider readLightSensor endTransmission ' +
-          'analogReference detachInterrupt countryNameRead ' +
-          'attachInterrupt encryptionType readBytesUntil ' +
-          'robotNameWrite readMicrophone robotNameRead cityNameWrite ' +
-          'userNameWrite readJoystickY readJoystickX mouseReleased ' +
-          'openNextFile scanNetworks noInterrupts digitalWrite ' +
-          'beginSpeaker mousePressed isActionDone mouseDragged ' +
-          'displayLogos noAutoscroll addParameter remoteNumber ' +
-          'getModifiers keyboardRead userNameRead waitContinue ' +
-          'processInput parseCommand printVersion readNetworks ' +
-          'writeMessage blinkVersion cityNameRead readMessage ' +
-          'setDataMode parsePacket isListening setBitOrder ' +
-          'beginPacket isDirectory motorsWrite drawCompass ' +
-          'digitalRead clearScreen serialEvent rightToLeft ' +
-          'setTextSize leftToRight requestFrom keyReleased ' +
-          'compassRead analogWrite interrupts WiFiServer ' +
-          'disconnect playMelody parseFloat autoscroll ' +
-          'getPINUsed setPINUsed setTimeout sendAnalog ' +
-          'readSlider analogRead beginWrite createChar ' +
-          'motorsStop keyPressed tempoWrite readButton ' +
-          'subnetMask debugPrint macAddress writeGreen ' +
-          'randomSeed attachGPRS readString sendString ' +
-          'remotePort releaseAll mouseMoved background ' +
-          'getXChange getYChange answerCall getResult ' +
-          'voiceCall endPacket constrain getSocket writeJSON ' +
-          'getButton available connected findUntil readBytes ' +
-          'exitValue readGreen writeBlue startLoop IPAddress ' +
-          'isPressed sendSysex pauseMode gatewayIP setCursor ' +
-          'getOemKey tuneWrite noDisplay loadImage switchPIN ' +
-          'onRequest onReceive changePIN playFile noBuffer ' +
-          'parseInt overflow checkPIN knobRead beginTFT ' +
-          'bitClear updateIR bitWrite position writeRGB ' +
-          'highByte writeRed setSpeed readBlue noStroke ' +
-          'remoteIP transfer shutdown hangCall beginSMS ' +
-          'endWrite attached maintain noCursor checkReg ' +
-          'checkPUK shiftOut isValid shiftIn pulseIn ' +
-          'connect println localIP pinMode getIMEI ' +
-          'display noBlink process getBand running beginSD ' +
-          'drawBMP lowByte setBand release bitRead prepare ' +
-          'pointTo readRed setMode noFill remove listen ' +
-          'stroke detach attach noTone exists buffer ' +
-          'height bitSet circle config cursor random ' +
-          'IRread setDNS endSMS getKey micros ' +
-          'millis begin print write ready flush width ' +
-          'isPIN blink clear press mkdir rmdir close ' +
-          'point yield image BSSID click delay ' +
-          'read text move peek beep rect line open ' +
-          'seek fill size turn stop home find ' +
-          'step tone sqrt RSSI SSID ' +
-          'end bit tan cos sin pow map abs max ' +
-          'min get run put',
-        literal:
-          'DIGITAL_MESSAGE FIRMATA_STRING ANALOG_MESSAGE ' +
-          'REPORT_DIGITAL REPORT_ANALOG INPUT_PULLUP ' +
-          'SET_PIN_MODE INTERNAL2V56 SYSTEM_RESET LED_BUILTIN ' +
-          'INTERNAL1V1 SYSEX_START INTERNAL EXTERNAL ' +
-          'DEFAULT OUTPUT INPUT HIGH LOW'
-    };
-
-    var ARDUINO = hljs.requireLanguage('cpp').rawDefinition();
-
-    var kws = ARDUINO.keywords;
-
-    kws.keyword += ' ' + ARDUINO_KW.keyword;
-    kws.literal += ' ' + ARDUINO_KW.literal;
-    kws.built_in += ' ' + ARDUINO_KW.built_in;
-
-    ARDUINO.name = 'Arduino';
-    ARDUINO.aliases = ['ino'];
-
-    return ARDUINO;
-  }
-
-  return arduino;
-
-  return module.exports.definer || module.exports;
-
-}());
-
-hljs.registerLanguage('armasm', function () {
-  'use strict';
-
-  /*
-  Language: ARM Assembly
-  Author: Dan Panzarella 
-  Description: ARM Assembly including Thumb and Thumb2 instructions
-  Category: assembler
-  */
-
-  /** @type LanguageFn */
-  function armasm(hljs) {
-      //local labels: %?[FB]?[AT]?\d{1,2}\w+
-
-    const COMMENT = {
-      variants: [
-        hljs.COMMENT('^[ \\t]*(?=#)', '$', {relevance: 0, excludeBegin: true }),
-        hljs.COMMENT('[;@]', '$', {relevance: 0}),
-        hljs.C_LINE_COMMENT_MODE,
-        hljs.C_BLOCK_COMMENT_MODE,
-      ]
-    };
-
-    return {
-      name: 'ARM Assembly',
-      case_insensitive: true,
-      aliases: ['arm'],
-      keywords: {
-        $pattern: '\\.?' + hljs.IDENT_RE,
-        meta:
-          //GNU preprocs
-          '.2byte .4byte .align .ascii .asciz .balign .byte .code .data .else .end .endif .endm .endr .equ .err .exitm .extern .global .hword .if .ifdef .ifndef .include .irp .long .macro .rept .req .section .set .skip .space .text .word .arm .thumb .code16 .code32 .force_thumb .thumb_func .ltorg '+
-          //ARM directives
-          'ALIAS ALIGN ARM AREA ASSERT ATTR CN CODE CODE16 CODE32 COMMON CP DATA DCB DCD DCDU DCDO DCFD DCFDU DCI DCQ DCQU DCW DCWU DN ELIF ELSE END ENDFUNC ENDIF ENDP ENTRY EQU EXPORT EXPORTAS EXTERN FIELD FILL FUNCTION GBLA GBLL GBLS GET GLOBAL IF IMPORT INCBIN INCLUDE INFO KEEP LCLA LCLL LCLS LTORG MACRO MAP MEND MEXIT NOFP OPT PRESERVE8 PROC QN READONLY RELOC REQUIRE REQUIRE8 RLIST FN ROUT SETA SETL SETS SN SPACE SUBT THUMB THUMBX TTL WHILE WEND ',
-        built_in:
-          'r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 '+ //standard registers
-          'pc lr sp ip sl sb fp '+ //typical regs plus backward compatibility
-          'a1 a2 a3 a4 v1 v2 v3 v4 v5 v6 v7 v8 f0 f1 f2 f3 f4 f5 f6 f7 '+ //more regs and fp
-          'p0 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 '+ //coprocessor regs
-          'c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12 c13 c14 c15 '+ //more coproc
-          'q0 q1 q2 q3 q4 q5 q6 q7 q8 q9 q10 q11 q12 q13 q14 q15 '+ //advanced SIMD NEON regs
-
-          //program status registers
-          'cpsr_c cpsr_x cpsr_s cpsr_f cpsr_cx cpsr_cxs cpsr_xs cpsr_xsf cpsr_sf cpsr_cxsf '+
-          'spsr_c spsr_x spsr_s spsr_f spsr_cx spsr_cxs spsr_xs spsr_xsf spsr_sf spsr_cxsf '+
-
-          //NEON and VFP registers
-          's0 s1 s2 s3 s4 s5 s6 s7 s8 s9 s10 s11 s12 s13 s14 s15 '+
-          's16 s17 s18 s19 s20 s21 s22 s23 s24 s25 s26 s27 s28 s29 s30 s31 '+
-          'd0 d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d12 d13 d14 d15 '+
-          'd16 d17 d18 d19 d20 d21 d22 d23 d24 d25 d26 d27 d28 d29 d30 d31 ' +
-
-          '{PC} {VAR} {TRUE} {FALSE} {OPT} {CONFIG} {ENDIAN} {CODESIZE} {CPU} {FPU} {ARCHITECTURE} {PCSTOREOFFSET} {ARMASM_VERSION} {INTER} {ROPI} {RWPI} {SWST} {NOSWST} . @'
-      },
-      contains: [
-        {
-          className: 'keyword',
-          begin: '\\b('+     //mnemonics
-              'adc|'+
-              '(qd?|sh?|u[qh]?)?add(8|16)?|usada?8|(q|sh?|u[qh]?)?(as|sa)x|'+
-              'and|adrl?|sbc|rs[bc]|asr|b[lx]?|blx|bxj|cbn?z|tb[bh]|bic|'+
-              'bfc|bfi|[su]bfx|bkpt|cdp2?|clz|clrex|cmp|cmn|cpsi[ed]|cps|'+
-              'setend|dbg|dmb|dsb|eor|isb|it[te]{0,3}|lsl|lsr|ror|rrx|'+
-              'ldm(([id][ab])|f[ds])?|ldr((s|ex)?[bhd])?|movt?|mvn|mra|mar|'+
-              'mul|[us]mull|smul[bwt][bt]|smu[as]d|smmul|smmla|'+
-              'mla|umlaal|smlal?([wbt][bt]|d)|mls|smlsl?[ds]|smc|svc|sev|'+
-              'mia([bt]{2}|ph)?|mrr?c2?|mcrr2?|mrs|msr|orr|orn|pkh(tb|bt)|rbit|'+
-              'rev(16|sh)?|sel|[su]sat(16)?|nop|pop|push|rfe([id][ab])?|'+
-              'stm([id][ab])?|str(ex)?[bhd]?|(qd?)?sub|(sh?|q|u[qh]?)?sub(8|16)|'+
-              '[su]xt(a?h|a?b(16)?)|srs([id][ab])?|swpb?|swi|smi|tst|teq|'+
-              'wfe|wfi|yield'+
-          ')'+
-          '(eq|ne|cs|cc|mi|pl|vs|vc|hi|ls|ge|lt|gt|le|al|hs|lo)?'+ //condition codes
-          '[sptrx]?' +                                             //legal postfixes
-          '(?=\\s)'                                                // followed by space
-        },
-        COMMENT,
-        hljs.QUOTE_STRING_MODE,
-        {
-          className: 'string',
-          begin: '\'',
-          end: '[^\\\\]\'',
-          relevance: 0
-        },
-        {
-          className: 'title',
-          begin: '\\|', end: '\\|',
-          illegal: '\\n',
-          relevance: 0
-        },
-        {
-          className: 'number',
-          variants: [
-              {begin: '[#$=]?0x[0-9a-f]+'}, //hex
-              {begin: '[#$=]?0b[01]+'},     //bin
-              {begin: '[#$=]\\d+'},        //literal
-              {begin: '\\b\\d+'}           //bare number
-          ],
-          relevance: 0
-        },
-        {
-          className: 'symbol',
-          variants: [
-              {begin: '^[ \\t]*[a-z_\\.\\$][a-z0-9_\\.\\$]+:'}, //GNU ARM syntax
-              {begin: '^[a-z_\\.\\$][a-z0-9_\\.\\$]+'}, //ARM syntax
-              {begin: '[=#]\\w+' }  //label reference
-          ],
-          relevance: 0
-        }
-      ]
-    };
-  }
-
-  return armasm;
-
-  return module.exports.definer || module.exports;
-
-}());
-
-hljs.registerLanguage('xml', function () {
-  'use strict';
-
-  /*
-  Language: HTML, XML
-  Website: https://www.w3.org/XML/
-  Category: common
-  */
-
-  function xml(hljs) {
-    var XML_IDENT_RE = '[A-Za-z0-9\\._:-]+';
-    var XML_ENTITIES = {
-      className: 'symbol',
-      begin: '&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;'
-    };
-    var XML_META_KEYWORDS = {
-  	  begin: '\\s',
-  	  contains:[
-  	    {
-  	      className: 'meta-keyword',
-  	      begin: '#?[a-z_][a-z1-9_-]+',
-  	      illegal: '\\n',
-        }
-  	  ]
-    };
-    var XML_META_PAR_KEYWORDS = hljs.inherit(XML_META_KEYWORDS, {begin: '\\(', end: '\\)'});
-    var APOS_META_STRING_MODE = hljs.inherit(hljs.APOS_STRING_MODE, {className: 'meta-string'});
-    var QUOTE_META_STRING_MODE = hljs.inherit(hljs.QUOTE_STRING_MODE, {className: 'meta-string'});
-    var TAG_INTERNALS = {
-      endsWithParent: true,
-      illegal: /`]+/}
-              ]
-            }
-          ]
-        }
-      ]
-    };
-    return {
-      name: 'HTML, XML',
-      aliases: ['html', 'xhtml', 'rss', 'atom', 'xjb', 'xsd', 'xsl', 'plist', 'wsf', 'svg'],
-      case_insensitive: true,
-      contains: [
-        {
-          className: 'meta',
-          begin: '',
-          relevance: 10,
-          contains: [
-  				  XML_META_KEYWORDS,
-  				  QUOTE_META_STRING_MODE,
-  				  APOS_META_STRING_MODE,
-  					XML_META_PAR_KEYWORDS,
-  					{
-  					  begin: '\\[', end: '\\]',
-  					  contains:[
-  						  {
-  					      className: 'meta',
-  					      begin: '',
-  					      contains: [
-  					        XML_META_KEYWORDS,
-  					        XML_META_PAR_KEYWORDS,
-  					        QUOTE_META_STRING_MODE,
-  					        APOS_META_STRING_MODE
-  						    ]
-  			        }
-  					  ]
-  				  }
-  				]
-        },
-        hljs.COMMENT(
-          '',
-          {
-            relevance: 10
-          }
-        ),
-        {
-          begin: '<\\!\\[CDATA\\[', end: '\\]\\]>',
-          relevance: 10
-        },
-        XML_ENTITIES,
-        {
-          className: 'meta',
-          begin: /<\?xml/, end: /\?>/, relevance: 10
-        },
-        {
-          className: 'tag',
-          /*
-          The lookahead pattern (?=...) ensures that 'begin' only matches
-          ')', end: '>',
-          keywords: {name: 'style'},
-          contains: [TAG_INTERNALS],
-          starts: {
-            end: '', returnEnd: true,
-            subLanguage: ['css', 'xml']
-          }
-        },
-        {
-          className: 'tag',
-          // See the comment in the