From f54b6ff601408e19dc51670d3dd8f2ad7c069688 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=A9mie=20Astor?= Date: Wed, 30 Sep 2020 20:18:26 +0200 Subject: [PATCH] Gwion highlight.js --- scripts/mdr2mdbook.sh | 1 - theme/highlight.js | 30009 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 30009 insertions(+), 1 deletion(-) create mode 100644 theme/highlight.js diff --git a/scripts/mdr2mdbook.sh b/scripts/mdr2mdbook.sh index 453b4934..a293921c 100644 --- a/scripts/mdr2mdbook.sh +++ b/scripts/mdr2mdbook.sh @@ -12,7 +12,6 @@ EOF mk_target() { cmojify "$(cat $1)" | - sed 's/```.*gw/```cpp/' | sed 's#:gwion:#[Gwion](https://github.com/fennecdjay/Gwion)#g' footer } diff --git a/theme/highlight.js b/theme/highlight.js new file mode 100644 index 00000000..8a2f28f6 --- /dev/null +++ b/theme/highlight.js @@ -0,0 +1,30009 @@ +/* + 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