Commit b294bff1a8

Loris Cro <kappaloris@gmail.com>
2023-04-26 18:17:20
Autodoc: new decl search system (#15475)
New search system is based on a Radix Tree. The Radix Tree contains a shallow list of all decl names (ie no paths), plus some suffixes, split by following the official style guide (eg "HashMapUnmanaged" also produces "MapUnmanaged" and "Unmanaged", same with snake_case and camelCase names). Additionally, the search system uses the decl graph data to recognize hierarchical relationships between decls, allowing you to zero on a target namespace for search. As an example "fs create" will score highe all things related to the creation of files and directories inside of `std.fs`, while still showing (but with lower score) matches from `std.Bulild`. As another example "fs windows" will prioritize windows-related results in `std.fs`, while "windows fs" will prioritize fs-related results in `std.windows`.
1 parent b55b8e7
Changed files (4)
lib/docs/commonmark.js
@@ -0,0 +1,10255 @@
+/* commonmark 0.30.0 https://github.com/commonmark/commonmark.js @license BSD3 */
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
+    typeof define === 'function' && define.amd ? define(['exports'], factory) :
+    (global = global || self, factory(global.commonmark = {}));
+}(this, (function (exports) { 'use strict';
+
+    function isContainer(node) {
+        switch (node._type) {
+            case "document":
+            case "block_quote":
+            case "list":
+            case "item":
+            case "paragraph":
+            case "heading":
+            case "emph":
+            case "strong":
+            case "link":
+            case "image":
+            case "custom_inline":
+            case "custom_block":
+                return true;
+            default:
+                return false;
+        }
+    }
+
+    var resumeAt = function(node, entering) {
+        this.current = node;
+        this.entering = entering === true;
+    };
+
+    var next = function() {
+        var cur = this.current;
+        var entering = this.entering;
+
+        if (cur === null) {
+            return null;
+        }
+
+        var container = isContainer(cur);
+
+        if (entering && container) {
+            if (cur._firstChild) {
+                this.current = cur._firstChild;
+                this.entering = true;
+            } else {
+                // stay on node but exit
+                this.entering = false;
+            }
+        } else if (cur === this.root) {
+            this.current = null;
+        } else if (cur._next === null) {
+            this.current = cur._parent;
+            this.entering = false;
+        } else {
+            this.current = cur._next;
+            this.entering = true;
+        }
+
+        return { entering: entering, node: cur };
+    };
+
+    var NodeWalker = function(root) {
+        return {
+            current: root,
+            root: root,
+            entering: true,
+            next: next,
+            resumeAt: resumeAt
+        };
+    };
+
+    var Node = function(nodeType, sourcepos) {
+        this._type = nodeType;
+        this._parent = null;
+        this._firstChild = null;
+        this._lastChild = null;
+        this._prev = null;
+        this._next = null;
+        this._sourcepos = sourcepos;
+        this._lastLineBlank = false;
+        this._lastLineChecked = false;
+        this._open = true;
+        this._string_content = null;
+        this._literal = null;
+        this._listData = {};
+        this._info = null;
+        this._destination = null;
+        this._title = null;
+        this._isFenced = false;
+        this._fenceChar = null;
+        this._fenceLength = 0;
+        this._fenceOffset = null;
+        this._level = null;
+        this._onEnter = null;
+        this._onExit = null;
+    };
+
+    var proto = Node.prototype;
+
+    Object.defineProperty(proto, "isContainer", {
+        get: function() {
+            return isContainer(this);
+        }
+    });
+
+    Object.defineProperty(proto, "type", {
+        get: function() {
+            return this._type;
+        }
+    });
+
+    Object.defineProperty(proto, "firstChild", {
+        get: function() {
+            return this._firstChild;
+        }
+    });
+
+    Object.defineProperty(proto, "lastChild", {
+        get: function() {
+            return this._lastChild;
+        }
+    });
+
+    Object.defineProperty(proto, "next", {
+        get: function() {
+            return this._next;
+        }
+    });
+
+    Object.defineProperty(proto, "prev", {
+        get: function() {
+            return this._prev;
+        }
+    });
+
+    Object.defineProperty(proto, "parent", {
+        get: function() {
+            return this._parent;
+        }
+    });
+
+    Object.defineProperty(proto, "sourcepos", {
+        get: function() {
+            return this._sourcepos;
+        }
+    });
+
+    Object.defineProperty(proto, "literal", {
+        get: function() {
+            return this._literal;
+        },
+        set: function(s) {
+            this._literal = s;
+        }
+    });
+
+    Object.defineProperty(proto, "destination", {
+        get: function() {
+            return this._destination;
+        },
+        set: function(s) {
+            this._destination = s;
+        }
+    });
+
+    Object.defineProperty(proto, "title", {
+        get: function() {
+            return this._title;
+        },
+        set: function(s) {
+            this._title = s;
+        }
+    });
+
+    Object.defineProperty(proto, "info", {
+        get: function() {
+            return this._info;
+        },
+        set: function(s) {
+            this._info = s;
+        }
+    });
+
+    Object.defineProperty(proto, "level", {
+        get: function() {
+            return this._level;
+        },
+        set: function(s) {
+            this._level = s;
+        }
+    });
+
+    Object.defineProperty(proto, "listType", {
+        get: function() {
+            return this._listData.type;
+        },
+        set: function(t) {
+            this._listData.type = t;
+        }
+    });
+
+    Object.defineProperty(proto, "listTight", {
+        get: function() {
+            return this._listData.tight;
+        },
+        set: function(t) {
+            this._listData.tight = t;
+        }
+    });
+
+    Object.defineProperty(proto, "listStart", {
+        get: function() {
+            return this._listData.start;
+        },
+        set: function(n) {
+            this._listData.start = n;
+        }
+    });
+
+    Object.defineProperty(proto, "listDelimiter", {
+        get: function() {
+            return this._listData.delimiter;
+        },
+        set: function(delim) {
+            this._listData.delimiter = delim;
+        }
+    });
+
+    Object.defineProperty(proto, "onEnter", {
+        get: function() {
+            return this._onEnter;
+        },
+        set: function(s) {
+            this._onEnter = s;
+        }
+    });
+
+    Object.defineProperty(proto, "onExit", {
+        get: function() {
+            return this._onExit;
+        },
+        set: function(s) {
+            this._onExit = s;
+        }
+    });
+
+    Node.prototype.appendChild = function(child) {
+        child.unlink();
+        child._parent = this;
+        if (this._lastChild) {
+            this._lastChild._next = child;
+            child._prev = this._lastChild;
+            this._lastChild = child;
+        } else {
+            this._firstChild = child;
+            this._lastChild = child;
+        }
+    };
+
+    Node.prototype.prependChild = function(child) {
+        child.unlink();
+        child._parent = this;
+        if (this._firstChild) {
+            this._firstChild._prev = child;
+            child._next = this._firstChild;
+            this._firstChild = child;
+        } else {
+            this._firstChild = child;
+            this._lastChild = child;
+        }
+    };
+
+    Node.prototype.unlink = function() {
+        if (this._prev) {
+            this._prev._next = this._next;
+        } else if (this._parent) {
+            this._parent._firstChild = this._next;
+        }
+        if (this._next) {
+            this._next._prev = this._prev;
+        } else if (this._parent) {
+            this._parent._lastChild = this._prev;
+        }
+        this._parent = null;
+        this._next = null;
+        this._prev = null;
+    };
+
+    Node.prototype.insertAfter = function(sibling) {
+        sibling.unlink();
+        sibling._next = this._next;
+        if (sibling._next) {
+            sibling._next._prev = sibling;
+        }
+        sibling._prev = this;
+        this._next = sibling;
+        sibling._parent = this._parent;
+        if (!sibling._next) {
+            sibling._parent._lastChild = sibling;
+        }
+    };
+
+    Node.prototype.insertBefore = function(sibling) {
+        sibling.unlink();
+        sibling._prev = this._prev;
+        if (sibling._prev) {
+            sibling._prev._next = sibling;
+        }
+        sibling._next = this;
+        this._prev = sibling;
+        sibling._parent = this._parent;
+        if (!sibling._prev) {
+            sibling._parent._firstChild = sibling;
+        }
+    };
+
+    Node.prototype.walker = function() {
+        var walker = new NodeWalker(this);
+        return walker;
+    };
+
+    /* Example of use of walker:
+
+     var walker = w.walker();
+     var event;
+
+     while (event = walker.next()) {
+     console.log(event.entering, event.node.type);
+     }
+
+     */
+
+    var encodeCache = {};
+
+
+    // Create a lookup array where anything but characters in `chars` string
+    // and alphanumeric chars is percent-encoded.
+    //
+    function getEncodeCache(exclude) {
+      var i, ch, cache = encodeCache[exclude];
+      if (cache) { return cache; }
+
+      cache = encodeCache[exclude] = [];
+
+      for (i = 0; i < 128; i++) {
+        ch = String.fromCharCode(i);
+
+        if (/^[0-9a-z]$/i.test(ch)) {
+          // always allow unencoded alphanumeric characters
+          cache.push(ch);
+        } else {
+          cache.push('%' + ('0' + i.toString(16).toUpperCase()).slice(-2));
+        }
+      }
+
+      for (i = 0; i < exclude.length; i++) {
+        cache[exclude.charCodeAt(i)] = exclude[i];
+      }
+
+      return cache;
+    }
+
+
+    // Encode unsafe characters with percent-encoding, skipping already
+    // encoded sequences.
+    //
+    //  - string       - string to encode
+    //  - exclude      - list of characters to ignore (in addition to a-zA-Z0-9)
+    //  - keepEscaped  - don't encode '%' in a correct escape sequence (default: true)
+    //
+    function encode(string, exclude, keepEscaped) {
+      var i, l, code, nextCode, cache,
+          result = '';
+
+      if (typeof exclude !== 'string') {
+        // encode(string, keepEscaped)
+        keepEscaped  = exclude;
+        exclude = encode.defaultChars;
+      }
+
+      if (typeof keepEscaped === 'undefined') {
+        keepEscaped = true;
+      }
+
+      cache = getEncodeCache(exclude);
+
+      for (i = 0, l = string.length; i < l; i++) {
+        code = string.charCodeAt(i);
+
+        if (keepEscaped && code === 0x25 /* % */ && i + 2 < l) {
+          if (/^[0-9a-f]{2}$/i.test(string.slice(i + 1, i + 3))) {
+            result += string.slice(i, i + 3);
+            i += 2;
+            continue;
+          }
+        }
+
+        if (code < 128) {
+          result += cache[code];
+          continue;
+        }
+
+        if (code >= 0xD800 && code <= 0xDFFF) {
+          if (code >= 0xD800 && code <= 0xDBFF && i + 1 < l) {
+            nextCode = string.charCodeAt(i + 1);
+            if (nextCode >= 0xDC00 && nextCode <= 0xDFFF) {
+              result += encodeURIComponent(string[i] + string[i + 1]);
+              i++;
+              continue;
+            }
+          }
+          result += '%EF%BF%BD';
+          continue;
+        }
+
+        result += encodeURIComponent(string[i]);
+      }
+
+      return result;
+    }
+
+    encode.defaultChars   = ";/?:@&=+$,-_.!~*'()#";
+    encode.componentChars = "-_.!~*'()";
+
+
+    var encode_1 = encode;
+
+    var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
+
+    function unwrapExports (x) {
+    	return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
+    }
+
+    function createCommonjsModule(fn, module) {
+    	return module = { exports: {} }, fn(module, module.exports), module.exports;
+    }
+
+    function getCjsExportFromNamespace (n) {
+    	return n && n['default'] || n;
+    }
+
+    var Aacute = "ร";
+    var aacute = "รก";
+    var Abreve = "ฤ‚";
+    var abreve = "ฤƒ";
+    var ac = "โˆพ";
+    var acd = "โˆฟ";
+    var acE = "โˆพฬณ";
+    var Acirc = "ร‚";
+    var acirc = "รข";
+    var acute = "ยด";
+    var Acy = "ะ";
+    var acy = "ะฐ";
+    var AElig = "ร†";
+    var aelig = "รฆ";
+    var af = "โก";
+    var Afr = "๐”„";
+    var afr = "๐”ž";
+    var Agrave = "ร€";
+    var agrave = "ร ";
+    var alefsym = "โ„ต";
+    var aleph = "โ„ต";
+    var Alpha = "ฮ‘";
+    var alpha = "ฮฑ";
+    var Amacr = "ฤ€";
+    var amacr = "ฤ";
+    var amalg = "โจฟ";
+    var amp = "&";
+    var AMP = "&";
+    var andand = "โฉ•";
+    var And = "โฉ“";
+    var and = "โˆง";
+    var andd = "โฉœ";
+    var andslope = "โฉ˜";
+    var andv = "โฉš";
+    var ang = "โˆ ";
+    var ange = "โฆค";
+    var angle = "โˆ ";
+    var angmsdaa = "โฆจ";
+    var angmsdab = "โฆฉ";
+    var angmsdac = "โฆช";
+    var angmsdad = "โฆซ";
+    var angmsdae = "โฆฌ";
+    var angmsdaf = "โฆญ";
+    var angmsdag = "โฆฎ";
+    var angmsdah = "โฆฏ";
+    var angmsd = "โˆก";
+    var angrt = "โˆŸ";
+    var angrtvb = "โŠพ";
+    var angrtvbd = "โฆ";
+    var angsph = "โˆข";
+    var angst = "ร…";
+    var angzarr = "โผ";
+    var Aogon = "ฤ„";
+    var aogon = "ฤ…";
+    var Aopf = "๐”ธ";
+    var aopf = "๐•’";
+    var apacir = "โฉฏ";
+    var ap = "โ‰ˆ";
+    var apE = "โฉฐ";
+    var ape = "โ‰Š";
+    var apid = "โ‰‹";
+    var apos = "'";
+    var ApplyFunction = "โก";
+    var approx = "โ‰ˆ";
+    var approxeq = "โ‰Š";
+    var Aring = "ร…";
+    var aring = "รฅ";
+    var Ascr = "๐’œ";
+    var ascr = "๐’ถ";
+    var Assign = "โ‰”";
+    var ast = "*";
+    var asymp = "โ‰ˆ";
+    var asympeq = "โ‰";
+    var Atilde = "รƒ";
+    var atilde = "รฃ";
+    var Auml = "ร„";
+    var auml = "รค";
+    var awconint = "โˆณ";
+    var awint = "โจ‘";
+    var backcong = "โ‰Œ";
+    var backepsilon = "ฯถ";
+    var backprime = "โ€ต";
+    var backsim = "โˆฝ";
+    var backsimeq = "โ‹";
+    var Backslash = "โˆ–";
+    var Barv = "โซง";
+    var barvee = "โŠฝ";
+    var barwed = "โŒ…";
+    var Barwed = "โŒ†";
+    var barwedge = "โŒ…";
+    var bbrk = "โŽต";
+    var bbrktbrk = "โŽถ";
+    var bcong = "โ‰Œ";
+    var Bcy = "ะ‘";
+    var bcy = "ะฑ";
+    var bdquo = "โ€ž";
+    var becaus = "โˆต";
+    var because = "โˆต";
+    var Because = "โˆต";
+    var bemptyv = "โฆฐ";
+    var bepsi = "ฯถ";
+    var bernou = "โ„ฌ";
+    var Bernoullis = "โ„ฌ";
+    var Beta = "ฮ’";
+    var beta = "ฮฒ";
+    var beth = "โ„ถ";
+    var between = "โ‰ฌ";
+    var Bfr = "๐”…";
+    var bfr = "๐”Ÿ";
+    var bigcap = "โ‹‚";
+    var bigcirc = "โ—ฏ";
+    var bigcup = "โ‹ƒ";
+    var bigodot = "โจ€";
+    var bigoplus = "โจ";
+    var bigotimes = "โจ‚";
+    var bigsqcup = "โจ†";
+    var bigstar = "โ˜…";
+    var bigtriangledown = "โ–ฝ";
+    var bigtriangleup = "โ–ณ";
+    var biguplus = "โจ„";
+    var bigvee = "โ‹";
+    var bigwedge = "โ‹€";
+    var bkarow = "โค";
+    var blacklozenge = "โงซ";
+    var blacksquare = "โ–ช";
+    var blacktriangle = "โ–ด";
+    var blacktriangledown = "โ–พ";
+    var blacktriangleleft = "โ—‚";
+    var blacktriangleright = "โ–ธ";
+    var blank = "โฃ";
+    var blk12 = "โ–’";
+    var blk14 = "โ–‘";
+    var blk34 = "โ–“";
+    var block = "โ–ˆ";
+    var bne = "=โƒฅ";
+    var bnequiv = "โ‰กโƒฅ";
+    var bNot = "โซญ";
+    var bnot = "โŒ";
+    var Bopf = "๐”น";
+    var bopf = "๐•“";
+    var bot = "โŠฅ";
+    var bottom = "โŠฅ";
+    var bowtie = "โ‹ˆ";
+    var boxbox = "โง‰";
+    var boxdl = "โ”";
+    var boxdL = "โ••";
+    var boxDl = "โ•–";
+    var boxDL = "โ•—";
+    var boxdr = "โ”Œ";
+    var boxdR = "โ•’";
+    var boxDr = "โ•“";
+    var boxDR = "โ•”";
+    var boxh = "โ”€";
+    var boxH = "โ•";
+    var boxhd = "โ”ฌ";
+    var boxHd = "โ•ค";
+    var boxhD = "โ•ฅ";
+    var boxHD = "โ•ฆ";
+    var boxhu = "โ”ด";
+    var boxHu = "โ•ง";
+    var boxhU = "โ•จ";
+    var boxHU = "โ•ฉ";
+    var boxminus = "โŠŸ";
+    var boxplus = "โŠž";
+    var boxtimes = "โŠ ";
+    var boxul = "โ”˜";
+    var boxuL = "โ•›";
+    var boxUl = "โ•œ";
+    var boxUL = "โ•";
+    var boxur = "โ””";
+    var boxuR = "โ•˜";
+    var boxUr = "โ•™";
+    var boxUR = "โ•š";
+    var boxv = "โ”‚";
+    var boxV = "โ•‘";
+    var boxvh = "โ”ผ";
+    var boxvH = "โ•ช";
+    var boxVh = "โ•ซ";
+    var boxVH = "โ•ฌ";
+    var boxvl = "โ”ค";
+    var boxvL = "โ•ก";
+    var boxVl = "โ•ข";
+    var boxVL = "โ•ฃ";
+    var boxvr = "โ”œ";
+    var boxvR = "โ•ž";
+    var boxVr = "โ•Ÿ";
+    var boxVR = "โ• ";
+    var bprime = "โ€ต";
+    var breve = "ห˜";
+    var Breve = "ห˜";
+    var brvbar = "ยฆ";
+    var bscr = "๐’ท";
+    var Bscr = "โ„ฌ";
+    var bsemi = "โ";
+    var bsim = "โˆฝ";
+    var bsime = "โ‹";
+    var bsolb = "โง…";
+    var bsol = "\\";
+    var bsolhsub = "โŸˆ";
+    var bull = "โ€ข";
+    var bullet = "โ€ข";
+    var bump = "โ‰Ž";
+    var bumpE = "โชฎ";
+    var bumpe = "โ‰";
+    var Bumpeq = "โ‰Ž";
+    var bumpeq = "โ‰";
+    var Cacute = "ฤ†";
+    var cacute = "ฤ‡";
+    var capand = "โฉ„";
+    var capbrcup = "โฉ‰";
+    var capcap = "โฉ‹";
+    var cap = "โˆฉ";
+    var Cap = "โ‹’";
+    var capcup = "โฉ‡";
+    var capdot = "โฉ€";
+    var CapitalDifferentialD = "โ……";
+    var caps = "โˆฉ๏ธ€";
+    var caret = "โ";
+    var caron = "ห‡";
+    var Cayleys = "โ„ญ";
+    var ccaps = "โฉ";
+    var Ccaron = "ฤŒ";
+    var ccaron = "ฤ";
+    var Ccedil = "ร‡";
+    var ccedil = "รง";
+    var Ccirc = "ฤˆ";
+    var ccirc = "ฤ‰";
+    var Cconint = "โˆฐ";
+    var ccups = "โฉŒ";
+    var ccupssm = "โฉ";
+    var Cdot = "ฤŠ";
+    var cdot = "ฤ‹";
+    var cedil = "ยธ";
+    var Cedilla = "ยธ";
+    var cemptyv = "โฆฒ";
+    var cent = "ยข";
+    var centerdot = "ยท";
+    var CenterDot = "ยท";
+    var cfr = "๐” ";
+    var Cfr = "โ„ญ";
+    var CHcy = "ะง";
+    var chcy = "ั‡";
+    var check = "โœ“";
+    var checkmark = "โœ“";
+    var Chi = "ฮง";
+    var chi = "ฯ‡";
+    var circ = "ห†";
+    var circeq = "โ‰—";
+    var circlearrowleft = "โ†บ";
+    var circlearrowright = "โ†ป";
+    var circledast = "โŠ›";
+    var circledcirc = "โŠš";
+    var circleddash = "โŠ";
+    var CircleDot = "โŠ™";
+    var circledR = "ยฎ";
+    var circledS = "โ“ˆ";
+    var CircleMinus = "โŠ–";
+    var CirclePlus = "โŠ•";
+    var CircleTimes = "โŠ—";
+    var cir = "โ—‹";
+    var cirE = "โงƒ";
+    var cire = "โ‰—";
+    var cirfnint = "โจ";
+    var cirmid = "โซฏ";
+    var cirscir = "โง‚";
+    var ClockwiseContourIntegral = "โˆฒ";
+    var CloseCurlyDoubleQuote = "โ€";
+    var CloseCurlyQuote = "โ€™";
+    var clubs = "โ™ฃ";
+    var clubsuit = "โ™ฃ";
+    var colon = ":";
+    var Colon = "โˆท";
+    var Colone = "โฉด";
+    var colone = "โ‰”";
+    var coloneq = "โ‰”";
+    var comma = ",";
+    var commat = "@";
+    var comp = "โˆ";
+    var compfn = "โˆ˜";
+    var complement = "โˆ";
+    var complexes = "โ„‚";
+    var cong = "โ‰…";
+    var congdot = "โฉญ";
+    var Congruent = "โ‰ก";
+    var conint = "โˆฎ";
+    var Conint = "โˆฏ";
+    var ContourIntegral = "โˆฎ";
+    var copf = "๐•”";
+    var Copf = "โ„‚";
+    var coprod = "โˆ";
+    var Coproduct = "โˆ";
+    var copy = "ยฉ";
+    var COPY = "ยฉ";
+    var copysr = "โ„—";
+    var CounterClockwiseContourIntegral = "โˆณ";
+    var crarr = "โ†ต";
+    var cross = "โœ—";
+    var Cross = "โจฏ";
+    var Cscr = "๐’ž";
+    var cscr = "๐’ธ";
+    var csub = "โซ";
+    var csube = "โซ‘";
+    var csup = "โซ";
+    var csupe = "โซ’";
+    var ctdot = "โ‹ฏ";
+    var cudarrl = "โคธ";
+    var cudarrr = "โคต";
+    var cuepr = "โ‹ž";
+    var cuesc = "โ‹Ÿ";
+    var cularr = "โ†ถ";
+    var cularrp = "โคฝ";
+    var cupbrcap = "โฉˆ";
+    var cupcap = "โฉ†";
+    var CupCap = "โ‰";
+    var cup = "โˆช";
+    var Cup = "โ‹“";
+    var cupcup = "โฉŠ";
+    var cupdot = "โŠ";
+    var cupor = "โฉ…";
+    var cups = "โˆช๏ธ€";
+    var curarr = "โ†ท";
+    var curarrm = "โคผ";
+    var curlyeqprec = "โ‹ž";
+    var curlyeqsucc = "โ‹Ÿ";
+    var curlyvee = "โ‹Ž";
+    var curlywedge = "โ‹";
+    var curren = "ยค";
+    var curvearrowleft = "โ†ถ";
+    var curvearrowright = "โ†ท";
+    var cuvee = "โ‹Ž";
+    var cuwed = "โ‹";
+    var cwconint = "โˆฒ";
+    var cwint = "โˆฑ";
+    var cylcty = "โŒญ";
+    var dagger = "โ€ ";
+    var Dagger = "โ€ก";
+    var daleth = "โ„ธ";
+    var darr = "โ†“";
+    var Darr = "โ†ก";
+    var dArr = "โ‡“";
+    var dash = "โ€";
+    var Dashv = "โซค";
+    var dashv = "โŠฃ";
+    var dbkarow = "โค";
+    var dblac = "ห";
+    var Dcaron = "ฤŽ";
+    var dcaron = "ฤ";
+    var Dcy = "ะ”";
+    var dcy = "ะด";
+    var ddagger = "โ€ก";
+    var ddarr = "โ‡Š";
+    var DD = "โ……";
+    var dd = "โ…†";
+    var DDotrahd = "โค‘";
+    var ddotseq = "โฉท";
+    var deg = "ยฐ";
+    var Del = "โˆ‡";
+    var Delta = "ฮ”";
+    var delta = "ฮด";
+    var demptyv = "โฆฑ";
+    var dfisht = "โฅฟ";
+    var Dfr = "๐”‡";
+    var dfr = "๐”ก";
+    var dHar = "โฅฅ";
+    var dharl = "โ‡ƒ";
+    var dharr = "โ‡‚";
+    var DiacriticalAcute = "ยด";
+    var DiacriticalDot = "ห™";
+    var DiacriticalDoubleAcute = "ห";
+    var DiacriticalGrave = "`";
+    var DiacriticalTilde = "หœ";
+    var diam = "โ‹„";
+    var diamond = "โ‹„";
+    var Diamond = "โ‹„";
+    var diamondsuit = "โ™ฆ";
+    var diams = "โ™ฆ";
+    var die = "ยจ";
+    var DifferentialD = "โ…†";
+    var digamma = "ฯ";
+    var disin = "โ‹ฒ";
+    var div = "รท";
+    var divide = "รท";
+    var divideontimes = "โ‹‡";
+    var divonx = "โ‹‡";
+    var DJcy = "ะ‚";
+    var djcy = "ั’";
+    var dlcorn = "โŒž";
+    var dlcrop = "โŒ";
+    var dollar = "$";
+    var Dopf = "๐”ป";
+    var dopf = "๐••";
+    var Dot = "ยจ";
+    var dot = "ห™";
+    var DotDot = "โƒœ";
+    var doteq = "โ‰";
+    var doteqdot = "โ‰‘";
+    var DotEqual = "โ‰";
+    var dotminus = "โˆธ";
+    var dotplus = "โˆ”";
+    var dotsquare = "โŠก";
+    var doublebarwedge = "โŒ†";
+    var DoubleContourIntegral = "โˆฏ";
+    var DoubleDot = "ยจ";
+    var DoubleDownArrow = "โ‡“";
+    var DoubleLeftArrow = "โ‡";
+    var DoubleLeftRightArrow = "โ‡”";
+    var DoubleLeftTee = "โซค";
+    var DoubleLongLeftArrow = "โŸธ";
+    var DoubleLongLeftRightArrow = "โŸบ";
+    var DoubleLongRightArrow = "โŸน";
+    var DoubleRightArrow = "โ‡’";
+    var DoubleRightTee = "โŠจ";
+    var DoubleUpArrow = "โ‡‘";
+    var DoubleUpDownArrow = "โ‡•";
+    var DoubleVerticalBar = "โˆฅ";
+    var DownArrowBar = "โค“";
+    var downarrow = "โ†“";
+    var DownArrow = "โ†“";
+    var Downarrow = "โ‡“";
+    var DownArrowUpArrow = "โ‡ต";
+    var DownBreve = "ฬ‘";
+    var downdownarrows = "โ‡Š";
+    var downharpoonleft = "โ‡ƒ";
+    var downharpoonright = "โ‡‚";
+    var DownLeftRightVector = "โฅ";
+    var DownLeftTeeVector = "โฅž";
+    var DownLeftVectorBar = "โฅ–";
+    var DownLeftVector = "โ†ฝ";
+    var DownRightTeeVector = "โฅŸ";
+    var DownRightVectorBar = "โฅ—";
+    var DownRightVector = "โ‡";
+    var DownTeeArrow = "โ†ง";
+    var DownTee = "โŠค";
+    var drbkarow = "โค";
+    var drcorn = "โŒŸ";
+    var drcrop = "โŒŒ";
+    var Dscr = "๐’Ÿ";
+    var dscr = "๐’น";
+    var DScy = "ะ…";
+    var dscy = "ั•";
+    var dsol = "โงถ";
+    var Dstrok = "ฤ";
+    var dstrok = "ฤ‘";
+    var dtdot = "โ‹ฑ";
+    var dtri = "โ–ฟ";
+    var dtrif = "โ–พ";
+    var duarr = "โ‡ต";
+    var duhar = "โฅฏ";
+    var dwangle = "โฆฆ";
+    var DZcy = "ะ";
+    var dzcy = "ัŸ";
+    var dzigrarr = "โŸฟ";
+    var Eacute = "ร‰";
+    var eacute = "รฉ";
+    var easter = "โฉฎ";
+    var Ecaron = "ฤš";
+    var ecaron = "ฤ›";
+    var Ecirc = "รŠ";
+    var ecirc = "รช";
+    var ecir = "โ‰–";
+    var ecolon = "โ‰•";
+    var Ecy = "ะญ";
+    var ecy = "ั";
+    var eDDot = "โฉท";
+    var Edot = "ฤ–";
+    var edot = "ฤ—";
+    var eDot = "โ‰‘";
+    var ee = "โ…‡";
+    var efDot = "โ‰’";
+    var Efr = "๐”ˆ";
+    var efr = "๐”ข";
+    var eg = "โชš";
+    var Egrave = "รˆ";
+    var egrave = "รจ";
+    var egs = "โช–";
+    var egsdot = "โช˜";
+    var el = "โช™";
+    var Element = "โˆˆ";
+    var elinters = "โง";
+    var ell = "โ„“";
+    var els = "โช•";
+    var elsdot = "โช—";
+    var Emacr = "ฤ’";
+    var emacr = "ฤ“";
+    var empty = "โˆ…";
+    var emptyset = "โˆ…";
+    var EmptySmallSquare = "โ—ป";
+    var emptyv = "โˆ…";
+    var EmptyVerySmallSquare = "โ–ซ";
+    var emsp13 = "โ€„";
+    var emsp14 = "โ€…";
+    var emsp = "โ€ƒ";
+    var ENG = "ลŠ";
+    var eng = "ล‹";
+    var ensp = "โ€‚";
+    var Eogon = "ฤ˜";
+    var eogon = "ฤ™";
+    var Eopf = "๐”ผ";
+    var eopf = "๐•–";
+    var epar = "โ‹•";
+    var eparsl = "โงฃ";
+    var eplus = "โฉฑ";
+    var epsi = "ฮต";
+    var Epsilon = "ฮ•";
+    var epsilon = "ฮต";
+    var epsiv = "ฯต";
+    var eqcirc = "โ‰–";
+    var eqcolon = "โ‰•";
+    var eqsim = "โ‰‚";
+    var eqslantgtr = "โช–";
+    var eqslantless = "โช•";
+    var Equal = "โฉต";
+    var equals = "=";
+    var EqualTilde = "โ‰‚";
+    var equest = "โ‰Ÿ";
+    var Equilibrium = "โ‡Œ";
+    var equiv = "โ‰ก";
+    var equivDD = "โฉธ";
+    var eqvparsl = "โงฅ";
+    var erarr = "โฅฑ";
+    var erDot = "โ‰“";
+    var escr = "โ„ฏ";
+    var Escr = "โ„ฐ";
+    var esdot = "โ‰";
+    var Esim = "โฉณ";
+    var esim = "โ‰‚";
+    var Eta = "ฮ—";
+    var eta = "ฮท";
+    var ETH = "ร";
+    var eth = "รฐ";
+    var Euml = "ร‹";
+    var euml = "รซ";
+    var euro = "โ‚ฌ";
+    var excl = "!";
+    var exist = "โˆƒ";
+    var Exists = "โˆƒ";
+    var expectation = "โ„ฐ";
+    var exponentiale = "โ…‡";
+    var ExponentialE = "โ…‡";
+    var fallingdotseq = "โ‰’";
+    var Fcy = "ะค";
+    var fcy = "ั„";
+    var female = "โ™€";
+    var ffilig = "๏ฌƒ";
+    var fflig = "๏ฌ€";
+    var ffllig = "๏ฌ„";
+    var Ffr = "๐”‰";
+    var ffr = "๐”ฃ";
+    var filig = "๏ฌ";
+    var FilledSmallSquare = "โ—ผ";
+    var FilledVerySmallSquare = "โ–ช";
+    var fjlig = "fj";
+    var flat = "โ™ญ";
+    var fllig = "๏ฌ‚";
+    var fltns = "โ–ฑ";
+    var fnof = "ฦ’";
+    var Fopf = "๐”ฝ";
+    var fopf = "๐•—";
+    var forall = "โˆ€";
+    var ForAll = "โˆ€";
+    var fork = "โ‹”";
+    var forkv = "โซ™";
+    var Fouriertrf = "โ„ฑ";
+    var fpartint = "โจ";
+    var frac12 = "ยฝ";
+    var frac13 = "โ…“";
+    var frac14 = "ยผ";
+    var frac15 = "โ…•";
+    var frac16 = "โ…™";
+    var frac18 = "โ…›";
+    var frac23 = "โ…”";
+    var frac25 = "โ…–";
+    var frac34 = "ยพ";
+    var frac35 = "โ…—";
+    var frac38 = "โ…œ";
+    var frac45 = "โ…˜";
+    var frac56 = "โ…š";
+    var frac58 = "โ…";
+    var frac78 = "โ…ž";
+    var frasl = "โ„";
+    var frown = "โŒข";
+    var fscr = "๐’ป";
+    var Fscr = "โ„ฑ";
+    var gacute = "วต";
+    var Gamma = "ฮ“";
+    var gamma = "ฮณ";
+    var Gammad = "ฯœ";
+    var gammad = "ฯ";
+    var gap = "โช†";
+    var Gbreve = "ฤž";
+    var gbreve = "ฤŸ";
+    var Gcedil = "ฤข";
+    var Gcirc = "ฤœ";
+    var gcirc = "ฤ";
+    var Gcy = "ะ“";
+    var gcy = "ะณ";
+    var Gdot = "ฤ ";
+    var gdot = "ฤก";
+    var ge = "โ‰ฅ";
+    var gE = "โ‰ง";
+    var gEl = "โชŒ";
+    var gel = "โ‹›";
+    var geq = "โ‰ฅ";
+    var geqq = "โ‰ง";
+    var geqslant = "โฉพ";
+    var gescc = "โชฉ";
+    var ges = "โฉพ";
+    var gesdot = "โช€";
+    var gesdoto = "โช‚";
+    var gesdotol = "โช„";
+    var gesl = "โ‹›๏ธ€";
+    var gesles = "โช”";
+    var Gfr = "๐”Š";
+    var gfr = "๐”ค";
+    var gg = "โ‰ซ";
+    var Gg = "โ‹™";
+    var ggg = "โ‹™";
+    var gimel = "โ„ท";
+    var GJcy = "ะƒ";
+    var gjcy = "ั“";
+    var gla = "โชฅ";
+    var gl = "โ‰ท";
+    var glE = "โช’";
+    var glj = "โชค";
+    var gnap = "โชŠ";
+    var gnapprox = "โชŠ";
+    var gne = "โชˆ";
+    var gnE = "โ‰ฉ";
+    var gneq = "โชˆ";
+    var gneqq = "โ‰ฉ";
+    var gnsim = "โ‹ง";
+    var Gopf = "๐”พ";
+    var gopf = "๐•˜";
+    var grave = "`";
+    var GreaterEqual = "โ‰ฅ";
+    var GreaterEqualLess = "โ‹›";
+    var GreaterFullEqual = "โ‰ง";
+    var GreaterGreater = "โชข";
+    var GreaterLess = "โ‰ท";
+    var GreaterSlantEqual = "โฉพ";
+    var GreaterTilde = "โ‰ณ";
+    var Gscr = "๐’ข";
+    var gscr = "โ„Š";
+    var gsim = "โ‰ณ";
+    var gsime = "โชŽ";
+    var gsiml = "โช";
+    var gtcc = "โชง";
+    var gtcir = "โฉบ";
+    var gt = ">";
+    var GT = ">";
+    var Gt = "โ‰ซ";
+    var gtdot = "โ‹—";
+    var gtlPar = "โฆ•";
+    var gtquest = "โฉผ";
+    var gtrapprox = "โช†";
+    var gtrarr = "โฅธ";
+    var gtrdot = "โ‹—";
+    var gtreqless = "โ‹›";
+    var gtreqqless = "โชŒ";
+    var gtrless = "โ‰ท";
+    var gtrsim = "โ‰ณ";
+    var gvertneqq = "โ‰ฉ๏ธ€";
+    var gvnE = "โ‰ฉ๏ธ€";
+    var Hacek = "ห‡";
+    var hairsp = "โ€Š";
+    var half = "ยฝ";
+    var hamilt = "โ„‹";
+    var HARDcy = "ะช";
+    var hardcy = "ัŠ";
+    var harrcir = "โฅˆ";
+    var harr = "โ†”";
+    var hArr = "โ‡”";
+    var harrw = "โ†ญ";
+    var Hat = "^";
+    var hbar = "โ„";
+    var Hcirc = "ฤค";
+    var hcirc = "ฤฅ";
+    var hearts = "โ™ฅ";
+    var heartsuit = "โ™ฅ";
+    var hellip = "โ€ฆ";
+    var hercon = "โŠน";
+    var hfr = "๐”ฅ";
+    var Hfr = "โ„Œ";
+    var HilbertSpace = "โ„‹";
+    var hksearow = "โคฅ";
+    var hkswarow = "โคฆ";
+    var hoarr = "โ‡ฟ";
+    var homtht = "โˆป";
+    var hookleftarrow = "โ†ฉ";
+    var hookrightarrow = "โ†ช";
+    var hopf = "๐•™";
+    var Hopf = "โ„";
+    var horbar = "โ€•";
+    var HorizontalLine = "โ”€";
+    var hscr = "๐’ฝ";
+    var Hscr = "โ„‹";
+    var hslash = "โ„";
+    var Hstrok = "ฤฆ";
+    var hstrok = "ฤง";
+    var HumpDownHump = "โ‰Ž";
+    var HumpEqual = "โ‰";
+    var hybull = "โƒ";
+    var hyphen = "โ€";
+    var Iacute = "ร";
+    var iacute = "รญ";
+    var ic = "โฃ";
+    var Icirc = "รŽ";
+    var icirc = "รฎ";
+    var Icy = "ะ˜";
+    var icy = "ะธ";
+    var Idot = "ฤฐ";
+    var IEcy = "ะ•";
+    var iecy = "ะต";
+    var iexcl = "ยก";
+    var iff = "โ‡”";
+    var ifr = "๐”ฆ";
+    var Ifr = "โ„‘";
+    var Igrave = "รŒ";
+    var igrave = "รฌ";
+    var ii = "โ…ˆ";
+    var iiiint = "โจŒ";
+    var iiint = "โˆญ";
+    var iinfin = "โงœ";
+    var iiota = "โ„ฉ";
+    var IJlig = "ฤฒ";
+    var ijlig = "ฤณ";
+    var Imacr = "ฤช";
+    var imacr = "ฤซ";
+    var image = "โ„‘";
+    var ImaginaryI = "โ…ˆ";
+    var imagline = "โ„";
+    var imagpart = "โ„‘";
+    var imath = "ฤฑ";
+    var Im = "โ„‘";
+    var imof = "โŠท";
+    var imped = "ฦต";
+    var Implies = "โ‡’";
+    var incare = "โ„…";
+    var infin = "โˆž";
+    var infintie = "โง";
+    var inodot = "ฤฑ";
+    var intcal = "โŠบ";
+    var int = "โˆซ";
+    var Int = "โˆฌ";
+    var integers = "โ„ค";
+    var Integral = "โˆซ";
+    var intercal = "โŠบ";
+    var Intersection = "โ‹‚";
+    var intlarhk = "โจ—";
+    var intprod = "โจผ";
+    var InvisibleComma = "โฃ";
+    var InvisibleTimes = "โข";
+    var IOcy = "ะ";
+    var iocy = "ั‘";
+    var Iogon = "ฤฎ";
+    var iogon = "ฤฏ";
+    var Iopf = "๐•€";
+    var iopf = "๐•š";
+    var Iota = "ฮ™";
+    var iota = "ฮน";
+    var iprod = "โจผ";
+    var iquest = "ยฟ";
+    var iscr = "๐’พ";
+    var Iscr = "โ„";
+    var isin = "โˆˆ";
+    var isindot = "โ‹ต";
+    var isinE = "โ‹น";
+    var isins = "โ‹ด";
+    var isinsv = "โ‹ณ";
+    var isinv = "โˆˆ";
+    var it = "โข";
+    var Itilde = "ฤจ";
+    var itilde = "ฤฉ";
+    var Iukcy = "ะ†";
+    var iukcy = "ั–";
+    var Iuml = "ร";
+    var iuml = "รฏ";
+    var Jcirc = "ฤด";
+    var jcirc = "ฤต";
+    var Jcy = "ะ™";
+    var jcy = "ะน";
+    var Jfr = "๐”";
+    var jfr = "๐”ง";
+    var jmath = "ศท";
+    var Jopf = "๐•";
+    var jopf = "๐•›";
+    var Jscr = "๐’ฅ";
+    var jscr = "๐’ฟ";
+    var Jsercy = "ะˆ";
+    var jsercy = "ั˜";
+    var Jukcy = "ะ„";
+    var jukcy = "ั”";
+    var Kappa = "ฮš";
+    var kappa = "ฮบ";
+    var kappav = "ฯฐ";
+    var Kcedil = "ฤถ";
+    var kcedil = "ฤท";
+    var Kcy = "ะš";
+    var kcy = "ะบ";
+    var Kfr = "๐”Ž";
+    var kfr = "๐”จ";
+    var kgreen = "ฤธ";
+    var KHcy = "ะฅ";
+    var khcy = "ั…";
+    var KJcy = "ะŒ";
+    var kjcy = "ัœ";
+    var Kopf = "๐•‚";
+    var kopf = "๐•œ";
+    var Kscr = "๐’ฆ";
+    var kscr = "๐“€";
+    var lAarr = "โ‡š";
+    var Lacute = "ฤน";
+    var lacute = "ฤบ";
+    var laemptyv = "โฆด";
+    var lagran = "โ„’";
+    var Lambda = "ฮ›";
+    var lambda = "ฮป";
+    var lang = "โŸจ";
+    var Lang = "โŸช";
+    var langd = "โฆ‘";
+    var langle = "โŸจ";
+    var lap = "โช…";
+    var Laplacetrf = "โ„’";
+    var laquo = "ยซ";
+    var larrb = "โ‡ค";
+    var larrbfs = "โคŸ";
+    var larr = "โ†";
+    var Larr = "โ†ž";
+    var lArr = "โ‡";
+    var larrfs = "โค";
+    var larrhk = "โ†ฉ";
+    var larrlp = "โ†ซ";
+    var larrpl = "โคน";
+    var larrsim = "โฅณ";
+    var larrtl = "โ†ข";
+    var latail = "โค™";
+    var lAtail = "โค›";
+    var lat = "โชซ";
+    var late = "โชญ";
+    var lates = "โชญ๏ธ€";
+    var lbarr = "โคŒ";
+    var lBarr = "โคŽ";
+    var lbbrk = "โฒ";
+    var lbrace = "{";
+    var lbrack = "[";
+    var lbrke = "โฆ‹";
+    var lbrksld = "โฆ";
+    var lbrkslu = "โฆ";
+    var Lcaron = "ฤฝ";
+    var lcaron = "ฤพ";
+    var Lcedil = "ฤป";
+    var lcedil = "ฤผ";
+    var lceil = "โŒˆ";
+    var lcub = "{";
+    var Lcy = "ะ›";
+    var lcy = "ะป";
+    var ldca = "โคถ";
+    var ldquo = "โ€œ";
+    var ldquor = "โ€ž";
+    var ldrdhar = "โฅง";
+    var ldrushar = "โฅ‹";
+    var ldsh = "โ†ฒ";
+    var le = "โ‰ค";
+    var lE = "โ‰ฆ";
+    var LeftAngleBracket = "โŸจ";
+    var LeftArrowBar = "โ‡ค";
+    var leftarrow = "โ†";
+    var LeftArrow = "โ†";
+    var Leftarrow = "โ‡";
+    var LeftArrowRightArrow = "โ‡†";
+    var leftarrowtail = "โ†ข";
+    var LeftCeiling = "โŒˆ";
+    var LeftDoubleBracket = "โŸฆ";
+    var LeftDownTeeVector = "โฅก";
+    var LeftDownVectorBar = "โฅ™";
+    var LeftDownVector = "โ‡ƒ";
+    var LeftFloor = "โŒŠ";
+    var leftharpoondown = "โ†ฝ";
+    var leftharpoonup = "โ†ผ";
+    var leftleftarrows = "โ‡‡";
+    var leftrightarrow = "โ†”";
+    var LeftRightArrow = "โ†”";
+    var Leftrightarrow = "โ‡”";
+    var leftrightarrows = "โ‡†";
+    var leftrightharpoons = "โ‡‹";
+    var leftrightsquigarrow = "โ†ญ";
+    var LeftRightVector = "โฅŽ";
+    var LeftTeeArrow = "โ†ค";
+    var LeftTee = "โŠฃ";
+    var LeftTeeVector = "โฅš";
+    var leftthreetimes = "โ‹‹";
+    var LeftTriangleBar = "โง";
+    var LeftTriangle = "โŠฒ";
+    var LeftTriangleEqual = "โŠด";
+    var LeftUpDownVector = "โฅ‘";
+    var LeftUpTeeVector = "โฅ ";
+    var LeftUpVectorBar = "โฅ˜";
+    var LeftUpVector = "โ†ฟ";
+    var LeftVectorBar = "โฅ’";
+    var LeftVector = "โ†ผ";
+    var lEg = "โช‹";
+    var leg = "โ‹š";
+    var leq = "โ‰ค";
+    var leqq = "โ‰ฆ";
+    var leqslant = "โฉฝ";
+    var lescc = "โชจ";
+    var les = "โฉฝ";
+    var lesdot = "โฉฟ";
+    var lesdoto = "โช";
+    var lesdotor = "โชƒ";
+    var lesg = "โ‹š๏ธ€";
+    var lesges = "โช“";
+    var lessapprox = "โช…";
+    var lessdot = "โ‹–";
+    var lesseqgtr = "โ‹š";
+    var lesseqqgtr = "โช‹";
+    var LessEqualGreater = "โ‹š";
+    var LessFullEqual = "โ‰ฆ";
+    var LessGreater = "โ‰ถ";
+    var lessgtr = "โ‰ถ";
+    var LessLess = "โชก";
+    var lesssim = "โ‰ฒ";
+    var LessSlantEqual = "โฉฝ";
+    var LessTilde = "โ‰ฒ";
+    var lfisht = "โฅผ";
+    var lfloor = "โŒŠ";
+    var Lfr = "๐”";
+    var lfr = "๐”ฉ";
+    var lg = "โ‰ถ";
+    var lgE = "โช‘";
+    var lHar = "โฅข";
+    var lhard = "โ†ฝ";
+    var lharu = "โ†ผ";
+    var lharul = "โฅช";
+    var lhblk = "โ–„";
+    var LJcy = "ะ‰";
+    var ljcy = "ั™";
+    var llarr = "โ‡‡";
+    var ll = "โ‰ช";
+    var Ll = "โ‹˜";
+    var llcorner = "โŒž";
+    var Lleftarrow = "โ‡š";
+    var llhard = "โฅซ";
+    var lltri = "โ—บ";
+    var Lmidot = "ฤฟ";
+    var lmidot = "ล€";
+    var lmoustache = "โŽฐ";
+    var lmoust = "โŽฐ";
+    var lnap = "โช‰";
+    var lnapprox = "โช‰";
+    var lne = "โช‡";
+    var lnE = "โ‰จ";
+    var lneq = "โช‡";
+    var lneqq = "โ‰จ";
+    var lnsim = "โ‹ฆ";
+    var loang = "โŸฌ";
+    var loarr = "โ‡ฝ";
+    var lobrk = "โŸฆ";
+    var longleftarrow = "โŸต";
+    var LongLeftArrow = "โŸต";
+    var Longleftarrow = "โŸธ";
+    var longleftrightarrow = "โŸท";
+    var LongLeftRightArrow = "โŸท";
+    var Longleftrightarrow = "โŸบ";
+    var longmapsto = "โŸผ";
+    var longrightarrow = "โŸถ";
+    var LongRightArrow = "โŸถ";
+    var Longrightarrow = "โŸน";
+    var looparrowleft = "โ†ซ";
+    var looparrowright = "โ†ฌ";
+    var lopar = "โฆ…";
+    var Lopf = "๐•ƒ";
+    var lopf = "๐•";
+    var loplus = "โจญ";
+    var lotimes = "โจด";
+    var lowast = "โˆ—";
+    var lowbar = "_";
+    var LowerLeftArrow = "โ†™";
+    var LowerRightArrow = "โ†˜";
+    var loz = "โ—Š";
+    var lozenge = "โ—Š";
+    var lozf = "โงซ";
+    var lpar = "(";
+    var lparlt = "โฆ“";
+    var lrarr = "โ‡†";
+    var lrcorner = "โŒŸ";
+    var lrhar = "โ‡‹";
+    var lrhard = "โฅญ";
+    var lrm = "โ€Ž";
+    var lrtri = "โŠฟ";
+    var lsaquo = "โ€น";
+    var lscr = "๐“";
+    var Lscr = "โ„’";
+    var lsh = "โ†ฐ";
+    var Lsh = "โ†ฐ";
+    var lsim = "โ‰ฒ";
+    var lsime = "โช";
+    var lsimg = "โช";
+    var lsqb = "[";
+    var lsquo = "โ€˜";
+    var lsquor = "โ€š";
+    var Lstrok = "ล";
+    var lstrok = "ล‚";
+    var ltcc = "โชฆ";
+    var ltcir = "โฉน";
+    var lt = "<";
+    var LT = "<";
+    var Lt = "โ‰ช";
+    var ltdot = "โ‹–";
+    var lthree = "โ‹‹";
+    var ltimes = "โ‹‰";
+    var ltlarr = "โฅถ";
+    var ltquest = "โฉป";
+    var ltri = "โ—ƒ";
+    var ltrie = "โŠด";
+    var ltrif = "โ—‚";
+    var ltrPar = "โฆ–";
+    var lurdshar = "โฅŠ";
+    var luruhar = "โฅฆ";
+    var lvertneqq = "โ‰จ๏ธ€";
+    var lvnE = "โ‰จ๏ธ€";
+    var macr = "ยฏ";
+    var male = "โ™‚";
+    var malt = "โœ ";
+    var maltese = "โœ ";
+    var map = "โ†ฆ";
+    var mapsto = "โ†ฆ";
+    var mapstodown = "โ†ง";
+    var mapstoleft = "โ†ค";
+    var mapstoup = "โ†ฅ";
+    var marker = "โ–ฎ";
+    var mcomma = "โจฉ";
+    var Mcy = "ะœ";
+    var mcy = "ะผ";
+    var mdash = "โ€”";
+    var mDDot = "โˆบ";
+    var measuredangle = "โˆก";
+    var MediumSpace = "โŸ";
+    var Mellintrf = "โ„ณ";
+    var Mfr = "๐”";
+    var mfr = "๐”ช";
+    var mho = "โ„ง";
+    var micro = "ยต";
+    var midast = "*";
+    var midcir = "โซฐ";
+    var mid = "โˆฃ";
+    var middot = "ยท";
+    var minusb = "โŠŸ";
+    var minus = "โˆ’";
+    var minusd = "โˆธ";
+    var minusdu = "โจช";
+    var MinusPlus = "โˆ“";
+    var mlcp = "โซ›";
+    var mldr = "โ€ฆ";
+    var mnplus = "โˆ“";
+    var models = "โŠง";
+    var Mopf = "๐•„";
+    var mopf = "๐•ž";
+    var mp = "โˆ“";
+    var mscr = "๐“‚";
+    var Mscr = "โ„ณ";
+    var mstpos = "โˆพ";
+    var Mu = "ฮœ";
+    var mu = "ฮผ";
+    var multimap = "โŠธ";
+    var mumap = "โŠธ";
+    var nabla = "โˆ‡";
+    var Nacute = "ลƒ";
+    var nacute = "ล„";
+    var nang = "โˆ โƒ’";
+    var nap = "โ‰‰";
+    var napE = "โฉฐฬธ";
+    var napid = "โ‰‹ฬธ";
+    var napos = "ล‰";
+    var napprox = "โ‰‰";
+    var natural = "โ™ฎ";
+    var naturals = "โ„•";
+    var natur = "โ™ฎ";
+    var nbsp = "ย ";
+    var nbump = "โ‰Žฬธ";
+    var nbumpe = "โ‰ฬธ";
+    var ncap = "โฉƒ";
+    var Ncaron = "ล‡";
+    var ncaron = "ลˆ";
+    var Ncedil = "ล…";
+    var ncedil = "ล†";
+    var ncong = "โ‰‡";
+    var ncongdot = "โฉญฬธ";
+    var ncup = "โฉ‚";
+    var Ncy = "ะ";
+    var ncy = "ะฝ";
+    var ndash = "โ€“";
+    var nearhk = "โคค";
+    var nearr = "โ†—";
+    var neArr = "โ‡—";
+    var nearrow = "โ†—";
+    var ne = "โ‰ ";
+    var nedot = "โ‰ฬธ";
+    var NegativeMediumSpace = "โ€‹";
+    var NegativeThickSpace = "โ€‹";
+    var NegativeThinSpace = "โ€‹";
+    var NegativeVeryThinSpace = "โ€‹";
+    var nequiv = "โ‰ข";
+    var nesear = "โคจ";
+    var nesim = "โ‰‚ฬธ";
+    var NestedGreaterGreater = "โ‰ซ";
+    var NestedLessLess = "โ‰ช";
+    var NewLine = "\n";
+    var nexist = "โˆ„";
+    var nexists = "โˆ„";
+    var Nfr = "๐”‘";
+    var nfr = "๐”ซ";
+    var ngE = "โ‰งฬธ";
+    var nge = "โ‰ฑ";
+    var ngeq = "โ‰ฑ";
+    var ngeqq = "โ‰งฬธ";
+    var ngeqslant = "โฉพฬธ";
+    var nges = "โฉพฬธ";
+    var nGg = "โ‹™ฬธ";
+    var ngsim = "โ‰ต";
+    var nGt = "โ‰ซโƒ’";
+    var ngt = "โ‰ฏ";
+    var ngtr = "โ‰ฏ";
+    var nGtv = "โ‰ซฬธ";
+    var nharr = "โ†ฎ";
+    var nhArr = "โ‡Ž";
+    var nhpar = "โซฒ";
+    var ni = "โˆ‹";
+    var nis = "โ‹ผ";
+    var nisd = "โ‹บ";
+    var niv = "โˆ‹";
+    var NJcy = "ะŠ";
+    var njcy = "ัš";
+    var nlarr = "โ†š";
+    var nlArr = "โ‡";
+    var nldr = "โ€ฅ";
+    var nlE = "โ‰ฆฬธ";
+    var nle = "โ‰ฐ";
+    var nleftarrow = "โ†š";
+    var nLeftarrow = "โ‡";
+    var nleftrightarrow = "โ†ฎ";
+    var nLeftrightarrow = "โ‡Ž";
+    var nleq = "โ‰ฐ";
+    var nleqq = "โ‰ฆฬธ";
+    var nleqslant = "โฉฝฬธ";
+    var nles = "โฉฝฬธ";
+    var nless = "โ‰ฎ";
+    var nLl = "โ‹˜ฬธ";
+    var nlsim = "โ‰ด";
+    var nLt = "โ‰ชโƒ’";
+    var nlt = "โ‰ฎ";
+    var nltri = "โ‹ช";
+    var nltrie = "โ‹ฌ";
+    var nLtv = "โ‰ชฬธ";
+    var nmid = "โˆค";
+    var NoBreak = "โ ";
+    var NonBreakingSpace = "ย ";
+    var nopf = "๐•Ÿ";
+    var Nopf = "โ„•";
+    var Not = "โซฌ";
+    var not = "ยฌ";
+    var NotCongruent = "โ‰ข";
+    var NotCupCap = "โ‰ญ";
+    var NotDoubleVerticalBar = "โˆฆ";
+    var NotElement = "โˆ‰";
+    var NotEqual = "โ‰ ";
+    var NotEqualTilde = "โ‰‚ฬธ";
+    var NotExists = "โˆ„";
+    var NotGreater = "โ‰ฏ";
+    var NotGreaterEqual = "โ‰ฑ";
+    var NotGreaterFullEqual = "โ‰งฬธ";
+    var NotGreaterGreater = "โ‰ซฬธ";
+    var NotGreaterLess = "โ‰น";
+    var NotGreaterSlantEqual = "โฉพฬธ";
+    var NotGreaterTilde = "โ‰ต";
+    var NotHumpDownHump = "โ‰Žฬธ";
+    var NotHumpEqual = "โ‰ฬธ";
+    var notin = "โˆ‰";
+    var notindot = "โ‹ตฬธ";
+    var notinE = "โ‹นฬธ";
+    var notinva = "โˆ‰";
+    var notinvb = "โ‹ท";
+    var notinvc = "โ‹ถ";
+    var NotLeftTriangleBar = "โงฬธ";
+    var NotLeftTriangle = "โ‹ช";
+    var NotLeftTriangleEqual = "โ‹ฌ";
+    var NotLess = "โ‰ฎ";
+    var NotLessEqual = "โ‰ฐ";
+    var NotLessGreater = "โ‰ธ";
+    var NotLessLess = "โ‰ชฬธ";
+    var NotLessSlantEqual = "โฉฝฬธ";
+    var NotLessTilde = "โ‰ด";
+    var NotNestedGreaterGreater = "โชขฬธ";
+    var NotNestedLessLess = "โชกฬธ";
+    var notni = "โˆŒ";
+    var notniva = "โˆŒ";
+    var notnivb = "โ‹พ";
+    var notnivc = "โ‹ฝ";
+    var NotPrecedes = "โŠ€";
+    var NotPrecedesEqual = "โชฏฬธ";
+    var NotPrecedesSlantEqual = "โ‹ ";
+    var NotReverseElement = "โˆŒ";
+    var NotRightTriangleBar = "โงฬธ";
+    var NotRightTriangle = "โ‹ซ";
+    var NotRightTriangleEqual = "โ‹ญ";
+    var NotSquareSubset = "โŠฬธ";
+    var NotSquareSubsetEqual = "โ‹ข";
+    var NotSquareSuperset = "โАฬธ";
+    var NotSquareSupersetEqual = "โ‹ฃ";
+    var NotSubset = "โŠ‚โƒ’";
+    var NotSubsetEqual = "โŠˆ";
+    var NotSucceeds = "โЁ";
+    var NotSucceedsEqual = "โชฐฬธ";
+    var NotSucceedsSlantEqual = "โ‹ก";
+    var NotSucceedsTilde = "โ‰ฟฬธ";
+    var NotSuperset = "โŠƒโƒ’";
+    var NotSupersetEqual = "โЉ";
+    var NotTilde = "โ‰";
+    var NotTildeEqual = "โ‰„";
+    var NotTildeFullEqual = "โ‰‡";
+    var NotTildeTilde = "โ‰‰";
+    var NotVerticalBar = "โˆค";
+    var nparallel = "โˆฆ";
+    var npar = "โˆฆ";
+    var nparsl = "โซฝโƒฅ";
+    var npart = "โˆ‚ฬธ";
+    var npolint = "โจ”";
+    var npr = "โŠ€";
+    var nprcue = "โ‹ ";
+    var nprec = "โŠ€";
+    var npreceq = "โชฏฬธ";
+    var npre = "โชฏฬธ";
+    var nrarrc = "โคณฬธ";
+    var nrarr = "โ†›";
+    var nrArr = "โ‡";
+    var nrarrw = "โ†ฬธ";
+    var nrightarrow = "โ†›";
+    var nRightarrow = "โ‡";
+    var nrtri = "โ‹ซ";
+    var nrtrie = "โ‹ญ";
+    var nsc = "โЁ";
+    var nsccue = "โ‹ก";
+    var nsce = "โชฐฬธ";
+    var Nscr = "๐’ฉ";
+    var nscr = "๐“ƒ";
+    var nshortmid = "โˆค";
+    var nshortparallel = "โˆฆ";
+    var nsim = "โ‰";
+    var nsime = "โ‰„";
+    var nsimeq = "โ‰„";
+    var nsmid = "โˆค";
+    var nspar = "โˆฆ";
+    var nsqsube = "โ‹ข";
+    var nsqsupe = "โ‹ฃ";
+    var nsub = "โŠ„";
+    var nsubE = "โซ…ฬธ";
+    var nsube = "โŠˆ";
+    var nsubset = "โŠ‚โƒ’";
+    var nsubseteq = "โŠˆ";
+    var nsubseteqq = "โซ…ฬธ";
+    var nsucc = "โЁ";
+    var nsucceq = "โชฐฬธ";
+    var nsup = "โŠ…";
+    var nsupE = "โซ†ฬธ";
+    var nsupe = "โЉ";
+    var nsupset = "โŠƒโƒ’";
+    var nsupseteq = "โЉ";
+    var nsupseteqq = "โซ†ฬธ";
+    var ntgl = "โ‰น";
+    var Ntilde = "ร‘";
+    var ntilde = "รฑ";
+    var ntlg = "โ‰ธ";
+    var ntriangleleft = "โ‹ช";
+    var ntrianglelefteq = "โ‹ฌ";
+    var ntriangleright = "โ‹ซ";
+    var ntrianglerighteq = "โ‹ญ";
+    var Nu = "ฮ";
+    var nu = "ฮฝ";
+    var num = "#";
+    var numero = "โ„–";
+    var numsp = "โ€‡";
+    var nvap = "โ‰โƒ’";
+    var nvdash = "โŠฌ";
+    var nvDash = "โŠญ";
+    var nVdash = "โŠฎ";
+    var nVDash = "โŠฏ";
+    var nvge = "โ‰ฅโƒ’";
+    var nvgt = ">โƒ’";
+    var nvHarr = "โค„";
+    var nvinfin = "โงž";
+    var nvlArr = "โค‚";
+    var nvle = "โ‰คโƒ’";
+    var nvlt = "<โƒ’";
+    var nvltrie = "โŠดโƒ’";
+    var nvrArr = "โคƒ";
+    var nvrtrie = "โŠตโƒ’";
+    var nvsim = "โˆผโƒ’";
+    var nwarhk = "โคฃ";
+    var nwarr = "โ†–";
+    var nwArr = "โ‡–";
+    var nwarrow = "โ†–";
+    var nwnear = "โคง";
+    var Oacute = "ร“";
+    var oacute = "รณ";
+    var oast = "โŠ›";
+    var Ocirc = "ร”";
+    var ocirc = "รด";
+    var ocir = "โŠš";
+    var Ocy = "ะž";
+    var ocy = "ะพ";
+    var odash = "โŠ";
+    var Odblac = "ล";
+    var odblac = "ล‘";
+    var odiv = "โจธ";
+    var odot = "โŠ™";
+    var odsold = "โฆผ";
+    var OElig = "ล’";
+    var oelig = "ล“";
+    var ofcir = "โฆฟ";
+    var Ofr = "๐”’";
+    var ofr = "๐”ฌ";
+    var ogon = "ห›";
+    var Ograve = "ร’";
+    var ograve = "รฒ";
+    var ogt = "โง";
+    var ohbar = "โฆต";
+    var ohm = "ฮฉ";
+    var oint = "โˆฎ";
+    var olarr = "โ†บ";
+    var olcir = "โฆพ";
+    var olcross = "โฆป";
+    var oline = "โ€พ";
+    var olt = "โง€";
+    var Omacr = "ลŒ";
+    var omacr = "ล";
+    var Omega = "ฮฉ";
+    var omega = "ฯ‰";
+    var Omicron = "ฮŸ";
+    var omicron = "ฮฟ";
+    var omid = "โฆถ";
+    var ominus = "โŠ–";
+    var Oopf = "๐•†";
+    var oopf = "๐• ";
+    var opar = "โฆท";
+    var OpenCurlyDoubleQuote = "โ€œ";
+    var OpenCurlyQuote = "โ€˜";
+    var operp = "โฆน";
+    var oplus = "โŠ•";
+    var orarr = "โ†ป";
+    var Or = "โฉ”";
+    var or = "โˆจ";
+    var ord = "โฉ";
+    var order = "โ„ด";
+    var orderof = "โ„ด";
+    var ordf = "ยช";
+    var ordm = "ยบ";
+    var origof = "โŠถ";
+    var oror = "โฉ–";
+    var orslope = "โฉ—";
+    var orv = "โฉ›";
+    var oS = "โ“ˆ";
+    var Oscr = "๐’ช";
+    var oscr = "โ„ด";
+    var Oslash = "ร˜";
+    var oslash = "รธ";
+    var osol = "โŠ˜";
+    var Otilde = "ร•";
+    var otilde = "รต";
+    var otimesas = "โจถ";
+    var Otimes = "โจท";
+    var otimes = "โŠ—";
+    var Ouml = "ร–";
+    var ouml = "รถ";
+    var ovbar = "โŒฝ";
+    var OverBar = "โ€พ";
+    var OverBrace = "โž";
+    var OverBracket = "โŽด";
+    var OverParenthesis = "โœ";
+    var para = "ยถ";
+    var parallel = "โˆฅ";
+    var par = "โˆฅ";
+    var parsim = "โซณ";
+    var parsl = "โซฝ";
+    var part = "โˆ‚";
+    var PartialD = "โˆ‚";
+    var Pcy = "ะŸ";
+    var pcy = "ะฟ";
+    var percnt = "%";
+    var period = ".";
+    var permil = "โ€ฐ";
+    var perp = "โŠฅ";
+    var pertenk = "โ€ฑ";
+    var Pfr = "๐”“";
+    var pfr = "๐”ญ";
+    var Phi = "ฮฆ";
+    var phi = "ฯ†";
+    var phiv = "ฯ•";
+    var phmmat = "โ„ณ";
+    var phone = "โ˜Ž";
+    var Pi = "ฮ ";
+    var pi = "ฯ€";
+    var pitchfork = "โ‹”";
+    var piv = "ฯ–";
+    var planck = "โ„";
+    var planckh = "โ„Ž";
+    var plankv = "โ„";
+    var plusacir = "โจฃ";
+    var plusb = "โŠž";
+    var pluscir = "โจข";
+    var plus = "+";
+    var plusdo = "โˆ”";
+    var plusdu = "โจฅ";
+    var pluse = "โฉฒ";
+    var PlusMinus = "ยฑ";
+    var plusmn = "ยฑ";
+    var plussim = "โจฆ";
+    var plustwo = "โจง";
+    var pm = "ยฑ";
+    var Poincareplane = "โ„Œ";
+    var pointint = "โจ•";
+    var popf = "๐•ก";
+    var Popf = "โ„™";
+    var pound = "ยฃ";
+    var prap = "โชท";
+    var Pr = "โชป";
+    var pr = "โ‰บ";
+    var prcue = "โ‰ผ";
+    var precapprox = "โชท";
+    var prec = "โ‰บ";
+    var preccurlyeq = "โ‰ผ";
+    var Precedes = "โ‰บ";
+    var PrecedesEqual = "โชฏ";
+    var PrecedesSlantEqual = "โ‰ผ";
+    var PrecedesTilde = "โ‰พ";
+    var preceq = "โชฏ";
+    var precnapprox = "โชน";
+    var precneqq = "โชต";
+    var precnsim = "โ‹จ";
+    var pre = "โชฏ";
+    var prE = "โชณ";
+    var precsim = "โ‰พ";
+    var prime = "โ€ฒ";
+    var Prime = "โ€ณ";
+    var primes = "โ„™";
+    var prnap = "โชน";
+    var prnE = "โชต";
+    var prnsim = "โ‹จ";
+    var prod = "โˆ";
+    var Product = "โˆ";
+    var profalar = "โŒฎ";
+    var profline = "โŒ’";
+    var profsurf = "โŒ“";
+    var prop = "โˆ";
+    var Proportional = "โˆ";
+    var Proportion = "โˆท";
+    var propto = "โˆ";
+    var prsim = "โ‰พ";
+    var prurel = "โŠฐ";
+    var Pscr = "๐’ซ";
+    var pscr = "๐“…";
+    var Psi = "ฮจ";
+    var psi = "ฯˆ";
+    var puncsp = "โ€ˆ";
+    var Qfr = "๐””";
+    var qfr = "๐”ฎ";
+    var qint = "โจŒ";
+    var qopf = "๐•ข";
+    var Qopf = "โ„š";
+    var qprime = "โ—";
+    var Qscr = "๐’ฌ";
+    var qscr = "๐“†";
+    var quaternions = "โ„";
+    var quatint = "โจ–";
+    var quest = "?";
+    var questeq = "โ‰Ÿ";
+    var quot = "\"";
+    var QUOT = "\"";
+    var rAarr = "โ‡›";
+    var race = "โˆฝฬฑ";
+    var Racute = "ล”";
+    var racute = "ล•";
+    var radic = "โˆš";
+    var raemptyv = "โฆณ";
+    var rang = "โŸฉ";
+    var Rang = "โŸซ";
+    var rangd = "โฆ’";
+    var range = "โฆฅ";
+    var rangle = "โŸฉ";
+    var raquo = "ยป";
+    var rarrap = "โฅต";
+    var rarrb = "โ‡ฅ";
+    var rarrbfs = "โค ";
+    var rarrc = "โคณ";
+    var rarr = "โ†’";
+    var Rarr = "โ† ";
+    var rArr = "โ‡’";
+    var rarrfs = "โคž";
+    var rarrhk = "โ†ช";
+    var rarrlp = "โ†ฌ";
+    var rarrpl = "โฅ…";
+    var rarrsim = "โฅด";
+    var Rarrtl = "โค–";
+    var rarrtl = "โ†ฃ";
+    var rarrw = "โ†";
+    var ratail = "โคš";
+    var rAtail = "โคœ";
+    var ratio = "โˆถ";
+    var rationals = "โ„š";
+    var rbarr = "โค";
+    var rBarr = "โค";
+    var RBarr = "โค";
+    var rbbrk = "โณ";
+    var rbrace = "}";
+    var rbrack = "]";
+    var rbrke = "โฆŒ";
+    var rbrksld = "โฆŽ";
+    var rbrkslu = "โฆ";
+    var Rcaron = "ล˜";
+    var rcaron = "ล™";
+    var Rcedil = "ล–";
+    var rcedil = "ล—";
+    var rceil = "โŒ‰";
+    var rcub = "}";
+    var Rcy = "ะ ";
+    var rcy = "ั€";
+    var rdca = "โคท";
+    var rdldhar = "โฅฉ";
+    var rdquo = "โ€";
+    var rdquor = "โ€";
+    var rdsh = "โ†ณ";
+    var real = "โ„œ";
+    var realine = "โ„›";
+    var realpart = "โ„œ";
+    var reals = "โ„";
+    var Re = "โ„œ";
+    var rect = "โ–ญ";
+    var reg = "ยฎ";
+    var REG = "ยฎ";
+    var ReverseElement = "โˆ‹";
+    var ReverseEquilibrium = "โ‡‹";
+    var ReverseUpEquilibrium = "โฅฏ";
+    var rfisht = "โฅฝ";
+    var rfloor = "โŒ‹";
+    var rfr = "๐”ฏ";
+    var Rfr = "โ„œ";
+    var rHar = "โฅค";
+    var rhard = "โ‡";
+    var rharu = "โ‡€";
+    var rharul = "โฅฌ";
+    var Rho = "ฮก";
+    var rho = "ฯ";
+    var rhov = "ฯฑ";
+    var RightAngleBracket = "โŸฉ";
+    var RightArrowBar = "โ‡ฅ";
+    var rightarrow = "โ†’";
+    var RightArrow = "โ†’";
+    var Rightarrow = "โ‡’";
+    var RightArrowLeftArrow = "โ‡„";
+    var rightarrowtail = "โ†ฃ";
+    var RightCeiling = "โŒ‰";
+    var RightDoubleBracket = "โŸง";
+    var RightDownTeeVector = "โฅ";
+    var RightDownVectorBar = "โฅ•";
+    var RightDownVector = "โ‡‚";
+    var RightFloor = "โŒ‹";
+    var rightharpoondown = "โ‡";
+    var rightharpoonup = "โ‡€";
+    var rightleftarrows = "โ‡„";
+    var rightleftharpoons = "โ‡Œ";
+    var rightrightarrows = "โ‡‰";
+    var rightsquigarrow = "โ†";
+    var RightTeeArrow = "โ†ฆ";
+    var RightTee = "โŠข";
+    var RightTeeVector = "โฅ›";
+    var rightthreetimes = "โ‹Œ";
+    var RightTriangleBar = "โง";
+    var RightTriangle = "โŠณ";
+    var RightTriangleEqual = "โŠต";
+    var RightUpDownVector = "โฅ";
+    var RightUpTeeVector = "โฅœ";
+    var RightUpVectorBar = "โฅ”";
+    var RightUpVector = "โ†พ";
+    var RightVectorBar = "โฅ“";
+    var RightVector = "โ‡€";
+    var ring = "หš";
+    var risingdotseq = "โ‰“";
+    var rlarr = "โ‡„";
+    var rlhar = "โ‡Œ";
+    var rlm = "โ€";
+    var rmoustache = "โŽฑ";
+    var rmoust = "โŽฑ";
+    var rnmid = "โซฎ";
+    var roang = "โŸญ";
+    var roarr = "โ‡พ";
+    var robrk = "โŸง";
+    var ropar = "โฆ†";
+    var ropf = "๐•ฃ";
+    var Ropf = "โ„";
+    var roplus = "โจฎ";
+    var rotimes = "โจต";
+    var RoundImplies = "โฅฐ";
+    var rpar = ")";
+    var rpargt = "โฆ”";
+    var rppolint = "โจ’";
+    var rrarr = "โ‡‰";
+    var Rrightarrow = "โ‡›";
+    var rsaquo = "โ€บ";
+    var rscr = "๐“‡";
+    var Rscr = "โ„›";
+    var rsh = "โ†ฑ";
+    var Rsh = "โ†ฑ";
+    var rsqb = "]";
+    var rsquo = "โ€™";
+    var rsquor = "โ€™";
+    var rthree = "โ‹Œ";
+    var rtimes = "โ‹Š";
+    var rtri = "โ–น";
+    var rtrie = "โŠต";
+    var rtrif = "โ–ธ";
+    var rtriltri = "โงŽ";
+    var RuleDelayed = "โงด";
+    var ruluhar = "โฅจ";
+    var rx = "โ„ž";
+    var Sacute = "ลš";
+    var sacute = "ล›";
+    var sbquo = "โ€š";
+    var scap = "โชธ";
+    var Scaron = "ล ";
+    var scaron = "ลก";
+    var Sc = "โชผ";
+    var sc = "โ‰ป";
+    var sccue = "โ‰ฝ";
+    var sce = "โชฐ";
+    var scE = "โชด";
+    var Scedil = "ลž";
+    var scedil = "ลŸ";
+    var Scirc = "ลœ";
+    var scirc = "ล";
+    var scnap = "โชบ";
+    var scnE = "โชถ";
+    var scnsim = "โ‹ฉ";
+    var scpolint = "โจ“";
+    var scsim = "โ‰ฟ";
+    var Scy = "ะก";
+    var scy = "ั";
+    var sdotb = "โŠก";
+    var sdot = "โ‹…";
+    var sdote = "โฉฆ";
+    var searhk = "โคฅ";
+    var searr = "โ†˜";
+    var seArr = "โ‡˜";
+    var searrow = "โ†˜";
+    var sect = "ยง";
+    var semi = ";";
+    var seswar = "โคฉ";
+    var setminus = "โˆ–";
+    var setmn = "โˆ–";
+    var sext = "โœถ";
+    var Sfr = "๐”–";
+    var sfr = "๐”ฐ";
+    var sfrown = "โŒข";
+    var sharp = "โ™ฏ";
+    var SHCHcy = "ะฉ";
+    var shchcy = "ั‰";
+    var SHcy = "ะจ";
+    var shcy = "ัˆ";
+    var ShortDownArrow = "โ†“";
+    var ShortLeftArrow = "โ†";
+    var shortmid = "โˆฃ";
+    var shortparallel = "โˆฅ";
+    var ShortRightArrow = "โ†’";
+    var ShortUpArrow = "โ†‘";
+    var shy = "ยญ";
+    var Sigma = "ฮฃ";
+    var sigma = "ฯƒ";
+    var sigmaf = "ฯ‚";
+    var sigmav = "ฯ‚";
+    var sim = "โˆผ";
+    var simdot = "โฉช";
+    var sime = "โ‰ƒ";
+    var simeq = "โ‰ƒ";
+    var simg = "โชž";
+    var simgE = "โช ";
+    var siml = "โช";
+    var simlE = "โชŸ";
+    var simne = "โ‰†";
+    var simplus = "โจค";
+    var simrarr = "โฅฒ";
+    var slarr = "โ†";
+    var SmallCircle = "โˆ˜";
+    var smallsetminus = "โˆ–";
+    var smashp = "โจณ";
+    var smeparsl = "โงค";
+    var smid = "โˆฃ";
+    var smile = "โŒฃ";
+    var smt = "โชช";
+    var smte = "โชฌ";
+    var smtes = "โชฌ๏ธ€";
+    var SOFTcy = "ะฌ";
+    var softcy = "ัŒ";
+    var solbar = "โŒฟ";
+    var solb = "โง„";
+    var sol = "/";
+    var Sopf = "๐•Š";
+    var sopf = "๐•ค";
+    var spades = "โ™ ";
+    var spadesuit = "โ™ ";
+    var spar = "โˆฅ";
+    var sqcap = "โŠ“";
+    var sqcaps = "โŠ“๏ธ€";
+    var sqcup = "โŠ”";
+    var sqcups = "โŠ”๏ธ€";
+    var Sqrt = "โˆš";
+    var sqsub = "โŠ";
+    var sqsube = "โŠ‘";
+    var sqsubset = "โŠ";
+    var sqsubseteq = "โŠ‘";
+    var sqsup = "โА";
+    var sqsupe = "โŠ’";
+    var sqsupset = "โА";
+    var sqsupseteq = "โŠ’";
+    var square = "โ–ก";
+    var Square = "โ–ก";
+    var SquareIntersection = "โŠ“";
+    var SquareSubset = "โŠ";
+    var SquareSubsetEqual = "โŠ‘";
+    var SquareSuperset = "โА";
+    var SquareSupersetEqual = "โŠ’";
+    var SquareUnion = "โŠ”";
+    var squarf = "โ–ช";
+    var squ = "โ–ก";
+    var squf = "โ–ช";
+    var srarr = "โ†’";
+    var Sscr = "๐’ฎ";
+    var sscr = "๐“ˆ";
+    var ssetmn = "โˆ–";
+    var ssmile = "โŒฃ";
+    var sstarf = "โ‹†";
+    var Star = "โ‹†";
+    var star = "โ˜†";
+    var starf = "โ˜…";
+    var straightepsilon = "ฯต";
+    var straightphi = "ฯ•";
+    var strns = "ยฏ";
+    var sub = "โŠ‚";
+    var Sub = "โ‹";
+    var subdot = "โชฝ";
+    var subE = "โซ…";
+    var sube = "โІ";
+    var subedot = "โซƒ";
+    var submult = "โซ";
+    var subnE = "โซ‹";
+    var subne = "โŠŠ";
+    var subplus = "โชฟ";
+    var subrarr = "โฅน";
+    var subset = "โŠ‚";
+    var Subset = "โ‹";
+    var subseteq = "โІ";
+    var subseteqq = "โซ…";
+    var SubsetEqual = "โІ";
+    var subsetneq = "โŠŠ";
+    var subsetneqq = "โซ‹";
+    var subsim = "โซ‡";
+    var subsub = "โซ•";
+    var subsup = "โซ“";
+    var succapprox = "โชธ";
+    var succ = "โ‰ป";
+    var succcurlyeq = "โ‰ฝ";
+    var Succeeds = "โ‰ป";
+    var SucceedsEqual = "โชฐ";
+    var SucceedsSlantEqual = "โ‰ฝ";
+    var SucceedsTilde = "โ‰ฟ";
+    var succeq = "โชฐ";
+    var succnapprox = "โชบ";
+    var succneqq = "โชถ";
+    var succnsim = "โ‹ฉ";
+    var succsim = "โ‰ฟ";
+    var SuchThat = "โˆ‹";
+    var sum = "โˆ‘";
+    var Sum = "โˆ‘";
+    var sung = "โ™ช";
+    var sup1 = "ยน";
+    var sup2 = "ยฒ";
+    var sup3 = "ยณ";
+    var sup = "โŠƒ";
+    var Sup = "โ‹‘";
+    var supdot = "โชพ";
+    var supdsub = "โซ˜";
+    var supE = "โซ†";
+    var supe = "โЇ";
+    var supedot = "โซ„";
+    var Superset = "โŠƒ";
+    var SupersetEqual = "โЇ";
+    var suphsol = "โŸ‰";
+    var suphsub = "โซ—";
+    var suplarr = "โฅป";
+    var supmult = "โซ‚";
+    var supnE = "โซŒ";
+    var supne = "โŠ‹";
+    var supplus = "โซ€";
+    var supset = "โŠƒ";
+    var Supset = "โ‹‘";
+    var supseteq = "โЇ";
+    var supseteqq = "โซ†";
+    var supsetneq = "โŠ‹";
+    var supsetneqq = "โซŒ";
+    var supsim = "โซˆ";
+    var supsub = "โซ”";
+    var supsup = "โซ–";
+    var swarhk = "โคฆ";
+    var swarr = "โ†™";
+    var swArr = "โ‡™";
+    var swarrow = "โ†™";
+    var swnwar = "โคช";
+    var szlig = "รŸ";
+    var Tab = "\t";
+    var target = "โŒ–";
+    var Tau = "ฮค";
+    var tau = "ฯ„";
+    var tbrk = "โŽด";
+    var Tcaron = "ลค";
+    var tcaron = "ลฅ";
+    var Tcedil = "ลข";
+    var tcedil = "ลฃ";
+    var Tcy = "ะข";
+    var tcy = "ั‚";
+    var tdot = "โƒ›";
+    var telrec = "โŒ•";
+    var Tfr = "๐”—";
+    var tfr = "๐”ฑ";
+    var there4 = "โˆด";
+    var therefore = "โˆด";
+    var Therefore = "โˆด";
+    var Theta = "ฮ˜";
+    var theta = "ฮธ";
+    var thetasym = "ฯ‘";
+    var thetav = "ฯ‘";
+    var thickapprox = "โ‰ˆ";
+    var thicksim = "โˆผ";
+    var ThickSpace = "โŸโ€Š";
+    var ThinSpace = "โ€‰";
+    var thinsp = "โ€‰";
+    var thkap = "โ‰ˆ";
+    var thksim = "โˆผ";
+    var THORN = "รž";
+    var thorn = "รพ";
+    var tilde = "หœ";
+    var Tilde = "โˆผ";
+    var TildeEqual = "โ‰ƒ";
+    var TildeFullEqual = "โ‰…";
+    var TildeTilde = "โ‰ˆ";
+    var timesbar = "โจฑ";
+    var timesb = "โŠ ";
+    var times = "ร—";
+    var timesd = "โจฐ";
+    var tint = "โˆญ";
+    var toea = "โคจ";
+    var topbot = "โŒถ";
+    var topcir = "โซฑ";
+    var top = "โŠค";
+    var Topf = "๐•‹";
+    var topf = "๐•ฅ";
+    var topfork = "โซš";
+    var tosa = "โคฉ";
+    var tprime = "โ€ด";
+    var trade = "โ„ข";
+    var TRADE = "โ„ข";
+    var triangle = "โ–ต";
+    var triangledown = "โ–ฟ";
+    var triangleleft = "โ—ƒ";
+    var trianglelefteq = "โŠด";
+    var triangleq = "โ‰œ";
+    var triangleright = "โ–น";
+    var trianglerighteq = "โŠต";
+    var tridot = "โ—ฌ";
+    var trie = "โ‰œ";
+    var triminus = "โจบ";
+    var TripleDot = "โƒ›";
+    var triplus = "โจน";
+    var trisb = "โง";
+    var tritime = "โจป";
+    var trpezium = "โข";
+    var Tscr = "๐’ฏ";
+    var tscr = "๐“‰";
+    var TScy = "ะฆ";
+    var tscy = "ั†";
+    var TSHcy = "ะ‹";
+    var tshcy = "ั›";
+    var Tstrok = "ลฆ";
+    var tstrok = "ลง";
+    var twixt = "โ‰ฌ";
+    var twoheadleftarrow = "โ†ž";
+    var twoheadrightarrow = "โ† ";
+    var Uacute = "รš";
+    var uacute = "รบ";
+    var uarr = "โ†‘";
+    var Uarr = "โ†Ÿ";
+    var uArr = "โ‡‘";
+    var Uarrocir = "โฅ‰";
+    var Ubrcy = "ะŽ";
+    var ubrcy = "ัž";
+    var Ubreve = "ลฌ";
+    var ubreve = "ลญ";
+    var Ucirc = "ร›";
+    var ucirc = "รป";
+    var Ucy = "ะฃ";
+    var ucy = "ัƒ";
+    var udarr = "โ‡…";
+    var Udblac = "ลฐ";
+    var udblac = "ลฑ";
+    var udhar = "โฅฎ";
+    var ufisht = "โฅพ";
+    var Ufr = "๐”˜";
+    var ufr = "๐”ฒ";
+    var Ugrave = "ร™";
+    var ugrave = "รน";
+    var uHar = "โฅฃ";
+    var uharl = "โ†ฟ";
+    var uharr = "โ†พ";
+    var uhblk = "โ–€";
+    var ulcorn = "โŒœ";
+    var ulcorner = "โŒœ";
+    var ulcrop = "โŒ";
+    var ultri = "โ—ธ";
+    var Umacr = "ลช";
+    var umacr = "ลซ";
+    var uml = "ยจ";
+    var UnderBar = "_";
+    var UnderBrace = "โŸ";
+    var UnderBracket = "โŽต";
+    var UnderParenthesis = "โ";
+    var Union = "โ‹ƒ";
+    var UnionPlus = "โŠŽ";
+    var Uogon = "ลฒ";
+    var uogon = "ลณ";
+    var Uopf = "๐•Œ";
+    var uopf = "๐•ฆ";
+    var UpArrowBar = "โค’";
+    var uparrow = "โ†‘";
+    var UpArrow = "โ†‘";
+    var Uparrow = "โ‡‘";
+    var UpArrowDownArrow = "โ‡…";
+    var updownarrow = "โ†•";
+    var UpDownArrow = "โ†•";
+    var Updownarrow = "โ‡•";
+    var UpEquilibrium = "โฅฎ";
+    var upharpoonleft = "โ†ฟ";
+    var upharpoonright = "โ†พ";
+    var uplus = "โŠŽ";
+    var UpperLeftArrow = "โ†–";
+    var UpperRightArrow = "โ†—";
+    var upsi = "ฯ…";
+    var Upsi = "ฯ’";
+    var upsih = "ฯ’";
+    var Upsilon = "ฮฅ";
+    var upsilon = "ฯ…";
+    var UpTeeArrow = "โ†ฅ";
+    var UpTee = "โŠฅ";
+    var upuparrows = "โ‡ˆ";
+    var urcorn = "โŒ";
+    var urcorner = "โŒ";
+    var urcrop = "โŒŽ";
+    var Uring = "ลฎ";
+    var uring = "ลฏ";
+    var urtri = "โ—น";
+    var Uscr = "๐’ฐ";
+    var uscr = "๐“Š";
+    var utdot = "โ‹ฐ";
+    var Utilde = "ลจ";
+    var utilde = "ลฉ";
+    var utri = "โ–ต";
+    var utrif = "โ–ด";
+    var uuarr = "โ‡ˆ";
+    var Uuml = "รœ";
+    var uuml = "รผ";
+    var uwangle = "โฆง";
+    var vangrt = "โฆœ";
+    var varepsilon = "ฯต";
+    var varkappa = "ฯฐ";
+    var varnothing = "โˆ…";
+    var varphi = "ฯ•";
+    var varpi = "ฯ–";
+    var varpropto = "โˆ";
+    var varr = "โ†•";
+    var vArr = "โ‡•";
+    var varrho = "ฯฑ";
+    var varsigma = "ฯ‚";
+    var varsubsetneq = "โŠŠ๏ธ€";
+    var varsubsetneqq = "โซ‹๏ธ€";
+    var varsupsetneq = "โŠ‹๏ธ€";
+    var varsupsetneqq = "โซŒ๏ธ€";
+    var vartheta = "ฯ‘";
+    var vartriangleleft = "โŠฒ";
+    var vartriangleright = "โŠณ";
+    var vBar = "โซจ";
+    var Vbar = "โซซ";
+    var vBarv = "โซฉ";
+    var Vcy = "ะ’";
+    var vcy = "ะฒ";
+    var vdash = "โŠข";
+    var vDash = "โŠจ";
+    var Vdash = "โŠฉ";
+    var VDash = "โŠซ";
+    var Vdashl = "โซฆ";
+    var veebar = "โŠป";
+    var vee = "โˆจ";
+    var Vee = "โ‹";
+    var veeeq = "โ‰š";
+    var vellip = "โ‹ฎ";
+    var verbar = "|";
+    var Verbar = "โ€–";
+    var vert = "|";
+    var Vert = "โ€–";
+    var VerticalBar = "โˆฃ";
+    var VerticalLine = "|";
+    var VerticalSeparator = "โ˜";
+    var VerticalTilde = "โ‰€";
+    var VeryThinSpace = "โ€Š";
+    var Vfr = "๐”™";
+    var vfr = "๐”ณ";
+    var vltri = "โŠฒ";
+    var vnsub = "โŠ‚โƒ’";
+    var vnsup = "โŠƒโƒ’";
+    var Vopf = "๐•";
+    var vopf = "๐•ง";
+    var vprop = "โˆ";
+    var vrtri = "โŠณ";
+    var Vscr = "๐’ฑ";
+    var vscr = "๐“‹";
+    var vsubnE = "โซ‹๏ธ€";
+    var vsubne = "โŠŠ๏ธ€";
+    var vsupnE = "โซŒ๏ธ€";
+    var vsupne = "โŠ‹๏ธ€";
+    var Vvdash = "โŠช";
+    var vzigzag = "โฆš";
+    var Wcirc = "ลด";
+    var wcirc = "ลต";
+    var wedbar = "โฉŸ";
+    var wedge = "โˆง";
+    var Wedge = "โ‹€";
+    var wedgeq = "โ‰™";
+    var weierp = "โ„˜";
+    var Wfr = "๐”š";
+    var wfr = "๐”ด";
+    var Wopf = "๐•Ž";
+    var wopf = "๐•จ";
+    var wp = "โ„˜";
+    var wr = "โ‰€";
+    var wreath = "โ‰€";
+    var Wscr = "๐’ฒ";
+    var wscr = "๐“Œ";
+    var xcap = "โ‹‚";
+    var xcirc = "โ—ฏ";
+    var xcup = "โ‹ƒ";
+    var xdtri = "โ–ฝ";
+    var Xfr = "๐”›";
+    var xfr = "๐”ต";
+    var xharr = "โŸท";
+    var xhArr = "โŸบ";
+    var Xi = "ฮž";
+    var xi = "ฮพ";
+    var xlarr = "โŸต";
+    var xlArr = "โŸธ";
+    var xmap = "โŸผ";
+    var xnis = "โ‹ป";
+    var xodot = "โจ€";
+    var Xopf = "๐•";
+    var xopf = "๐•ฉ";
+    var xoplus = "โจ";
+    var xotime = "โจ‚";
+    var xrarr = "โŸถ";
+    var xrArr = "โŸน";
+    var Xscr = "๐’ณ";
+    var xscr = "๐“";
+    var xsqcup = "โจ†";
+    var xuplus = "โจ„";
+    var xutri = "โ–ณ";
+    var xvee = "โ‹";
+    var xwedge = "โ‹€";
+    var Yacute = "ร";
+    var yacute = "รฝ";
+    var YAcy = "ะฏ";
+    var yacy = "ั";
+    var Ycirc = "ลถ";
+    var ycirc = "ลท";
+    var Ycy = "ะซ";
+    var ycy = "ั‹";
+    var yen = "ยฅ";
+    var Yfr = "๐”œ";
+    var yfr = "๐”ถ";
+    var YIcy = "ะ‡";
+    var yicy = "ั—";
+    var Yopf = "๐•";
+    var yopf = "๐•ช";
+    var Yscr = "๐’ด";
+    var yscr = "๐“Ž";
+    var YUcy = "ะฎ";
+    var yucy = "ัŽ";
+    var yuml = "รฟ";
+    var Yuml = "ลธ";
+    var Zacute = "ลน";
+    var zacute = "ลบ";
+    var Zcaron = "ลฝ";
+    var zcaron = "ลพ";
+    var Zcy = "ะ—";
+    var zcy = "ะท";
+    var Zdot = "ลป";
+    var zdot = "ลผ";
+    var zeetrf = "โ„จ";
+    var ZeroWidthSpace = "โ€‹";
+    var Zeta = "ฮ–";
+    var zeta = "ฮถ";
+    var zfr = "๐”ท";
+    var Zfr = "โ„จ";
+    var ZHcy = "ะ–";
+    var zhcy = "ะถ";
+    var zigrarr = "โ‡";
+    var zopf = "๐•ซ";
+    var Zopf = "โ„ค";
+    var Zscr = "๐’ต";
+    var zscr = "๐“";
+    var zwj = "โ€";
+    var zwnj = "โ€Œ";
+    var entities = {
+    	Aacute: Aacute,
+    	aacute: aacute,
+    	Abreve: Abreve,
+    	abreve: abreve,
+    	ac: ac,
+    	acd: acd,
+    	acE: acE,
+    	Acirc: Acirc,
+    	acirc: acirc,
+    	acute: acute,
+    	Acy: Acy,
+    	acy: acy,
+    	AElig: AElig,
+    	aelig: aelig,
+    	af: af,
+    	Afr: Afr,
+    	afr: afr,
+    	Agrave: Agrave,
+    	agrave: agrave,
+    	alefsym: alefsym,
+    	aleph: aleph,
+    	Alpha: Alpha,
+    	alpha: alpha,
+    	Amacr: Amacr,
+    	amacr: amacr,
+    	amalg: amalg,
+    	amp: amp,
+    	AMP: AMP,
+    	andand: andand,
+    	And: And,
+    	and: and,
+    	andd: andd,
+    	andslope: andslope,
+    	andv: andv,
+    	ang: ang,
+    	ange: ange,
+    	angle: angle,
+    	angmsdaa: angmsdaa,
+    	angmsdab: angmsdab,
+    	angmsdac: angmsdac,
+    	angmsdad: angmsdad,
+    	angmsdae: angmsdae,
+    	angmsdaf: angmsdaf,
+    	angmsdag: angmsdag,
+    	angmsdah: angmsdah,
+    	angmsd: angmsd,
+    	angrt: angrt,
+    	angrtvb: angrtvb,
+    	angrtvbd: angrtvbd,
+    	angsph: angsph,
+    	angst: angst,
+    	angzarr: angzarr,
+    	Aogon: Aogon,
+    	aogon: aogon,
+    	Aopf: Aopf,
+    	aopf: aopf,
+    	apacir: apacir,
+    	ap: ap,
+    	apE: apE,
+    	ape: ape,
+    	apid: apid,
+    	apos: apos,
+    	ApplyFunction: ApplyFunction,
+    	approx: approx,
+    	approxeq: approxeq,
+    	Aring: Aring,
+    	aring: aring,
+    	Ascr: Ascr,
+    	ascr: ascr,
+    	Assign: Assign,
+    	ast: ast,
+    	asymp: asymp,
+    	asympeq: asympeq,
+    	Atilde: Atilde,
+    	atilde: atilde,
+    	Auml: Auml,
+    	auml: auml,
+    	awconint: awconint,
+    	awint: awint,
+    	backcong: backcong,
+    	backepsilon: backepsilon,
+    	backprime: backprime,
+    	backsim: backsim,
+    	backsimeq: backsimeq,
+    	Backslash: Backslash,
+    	Barv: Barv,
+    	barvee: barvee,
+    	barwed: barwed,
+    	Barwed: Barwed,
+    	barwedge: barwedge,
+    	bbrk: bbrk,
+    	bbrktbrk: bbrktbrk,
+    	bcong: bcong,
+    	Bcy: Bcy,
+    	bcy: bcy,
+    	bdquo: bdquo,
+    	becaus: becaus,
+    	because: because,
+    	Because: Because,
+    	bemptyv: bemptyv,
+    	bepsi: bepsi,
+    	bernou: bernou,
+    	Bernoullis: Bernoullis,
+    	Beta: Beta,
+    	beta: beta,
+    	beth: beth,
+    	between: between,
+    	Bfr: Bfr,
+    	bfr: bfr,
+    	bigcap: bigcap,
+    	bigcirc: bigcirc,
+    	bigcup: bigcup,
+    	bigodot: bigodot,
+    	bigoplus: bigoplus,
+    	bigotimes: bigotimes,
+    	bigsqcup: bigsqcup,
+    	bigstar: bigstar,
+    	bigtriangledown: bigtriangledown,
+    	bigtriangleup: bigtriangleup,
+    	biguplus: biguplus,
+    	bigvee: bigvee,
+    	bigwedge: bigwedge,
+    	bkarow: bkarow,
+    	blacklozenge: blacklozenge,
+    	blacksquare: blacksquare,
+    	blacktriangle: blacktriangle,
+    	blacktriangledown: blacktriangledown,
+    	blacktriangleleft: blacktriangleleft,
+    	blacktriangleright: blacktriangleright,
+    	blank: blank,
+    	blk12: blk12,
+    	blk14: blk14,
+    	blk34: blk34,
+    	block: block,
+    	bne: bne,
+    	bnequiv: bnequiv,
+    	bNot: bNot,
+    	bnot: bnot,
+    	Bopf: Bopf,
+    	bopf: bopf,
+    	bot: bot,
+    	bottom: bottom,
+    	bowtie: bowtie,
+    	boxbox: boxbox,
+    	boxdl: boxdl,
+    	boxdL: boxdL,
+    	boxDl: boxDl,
+    	boxDL: boxDL,
+    	boxdr: boxdr,
+    	boxdR: boxdR,
+    	boxDr: boxDr,
+    	boxDR: boxDR,
+    	boxh: boxh,
+    	boxH: boxH,
+    	boxhd: boxhd,
+    	boxHd: boxHd,
+    	boxhD: boxhD,
+    	boxHD: boxHD,
+    	boxhu: boxhu,
+    	boxHu: boxHu,
+    	boxhU: boxhU,
+    	boxHU: boxHU,
+    	boxminus: boxminus,
+    	boxplus: boxplus,
+    	boxtimes: boxtimes,
+    	boxul: boxul,
+    	boxuL: boxuL,
+    	boxUl: boxUl,
+    	boxUL: boxUL,
+    	boxur: boxur,
+    	boxuR: boxuR,
+    	boxUr: boxUr,
+    	boxUR: boxUR,
+    	boxv: boxv,
+    	boxV: boxV,
+    	boxvh: boxvh,
+    	boxvH: boxvH,
+    	boxVh: boxVh,
+    	boxVH: boxVH,
+    	boxvl: boxvl,
+    	boxvL: boxvL,
+    	boxVl: boxVl,
+    	boxVL: boxVL,
+    	boxvr: boxvr,
+    	boxvR: boxvR,
+    	boxVr: boxVr,
+    	boxVR: boxVR,
+    	bprime: bprime,
+    	breve: breve,
+    	Breve: Breve,
+    	brvbar: brvbar,
+    	bscr: bscr,
+    	Bscr: Bscr,
+    	bsemi: bsemi,
+    	bsim: bsim,
+    	bsime: bsime,
+    	bsolb: bsolb,
+    	bsol: bsol,
+    	bsolhsub: bsolhsub,
+    	bull: bull,
+    	bullet: bullet,
+    	bump: bump,
+    	bumpE: bumpE,
+    	bumpe: bumpe,
+    	Bumpeq: Bumpeq,
+    	bumpeq: bumpeq,
+    	Cacute: Cacute,
+    	cacute: cacute,
+    	capand: capand,
+    	capbrcup: capbrcup,
+    	capcap: capcap,
+    	cap: cap,
+    	Cap: Cap,
+    	capcup: capcup,
+    	capdot: capdot,
+    	CapitalDifferentialD: CapitalDifferentialD,
+    	caps: caps,
+    	caret: caret,
+    	caron: caron,
+    	Cayleys: Cayleys,
+    	ccaps: ccaps,
+    	Ccaron: Ccaron,
+    	ccaron: ccaron,
+    	Ccedil: Ccedil,
+    	ccedil: ccedil,
+    	Ccirc: Ccirc,
+    	ccirc: ccirc,
+    	Cconint: Cconint,
+    	ccups: ccups,
+    	ccupssm: ccupssm,
+    	Cdot: Cdot,
+    	cdot: cdot,
+    	cedil: cedil,
+    	Cedilla: Cedilla,
+    	cemptyv: cemptyv,
+    	cent: cent,
+    	centerdot: centerdot,
+    	CenterDot: CenterDot,
+    	cfr: cfr,
+    	Cfr: Cfr,
+    	CHcy: CHcy,
+    	chcy: chcy,
+    	check: check,
+    	checkmark: checkmark,
+    	Chi: Chi,
+    	chi: chi,
+    	circ: circ,
+    	circeq: circeq,
+    	circlearrowleft: circlearrowleft,
+    	circlearrowright: circlearrowright,
+    	circledast: circledast,
+    	circledcirc: circledcirc,
+    	circleddash: circleddash,
+    	CircleDot: CircleDot,
+    	circledR: circledR,
+    	circledS: circledS,
+    	CircleMinus: CircleMinus,
+    	CirclePlus: CirclePlus,
+    	CircleTimes: CircleTimes,
+    	cir: cir,
+    	cirE: cirE,
+    	cire: cire,
+    	cirfnint: cirfnint,
+    	cirmid: cirmid,
+    	cirscir: cirscir,
+    	ClockwiseContourIntegral: ClockwiseContourIntegral,
+    	CloseCurlyDoubleQuote: CloseCurlyDoubleQuote,
+    	CloseCurlyQuote: CloseCurlyQuote,
+    	clubs: clubs,
+    	clubsuit: clubsuit,
+    	colon: colon,
+    	Colon: Colon,
+    	Colone: Colone,
+    	colone: colone,
+    	coloneq: coloneq,
+    	comma: comma,
+    	commat: commat,
+    	comp: comp,
+    	compfn: compfn,
+    	complement: complement,
+    	complexes: complexes,
+    	cong: cong,
+    	congdot: congdot,
+    	Congruent: Congruent,
+    	conint: conint,
+    	Conint: Conint,
+    	ContourIntegral: ContourIntegral,
+    	copf: copf,
+    	Copf: Copf,
+    	coprod: coprod,
+    	Coproduct: Coproduct,
+    	copy: copy,
+    	COPY: COPY,
+    	copysr: copysr,
+    	CounterClockwiseContourIntegral: CounterClockwiseContourIntegral,
+    	crarr: crarr,
+    	cross: cross,
+    	Cross: Cross,
+    	Cscr: Cscr,
+    	cscr: cscr,
+    	csub: csub,
+    	csube: csube,
+    	csup: csup,
+    	csupe: csupe,
+    	ctdot: ctdot,
+    	cudarrl: cudarrl,
+    	cudarrr: cudarrr,
+    	cuepr: cuepr,
+    	cuesc: cuesc,
+    	cularr: cularr,
+    	cularrp: cularrp,
+    	cupbrcap: cupbrcap,
+    	cupcap: cupcap,
+    	CupCap: CupCap,
+    	cup: cup,
+    	Cup: Cup,
+    	cupcup: cupcup,
+    	cupdot: cupdot,
+    	cupor: cupor,
+    	cups: cups,
+    	curarr: curarr,
+    	curarrm: curarrm,
+    	curlyeqprec: curlyeqprec,
+    	curlyeqsucc: curlyeqsucc,
+    	curlyvee: curlyvee,
+    	curlywedge: curlywedge,
+    	curren: curren,
+    	curvearrowleft: curvearrowleft,
+    	curvearrowright: curvearrowright,
+    	cuvee: cuvee,
+    	cuwed: cuwed,
+    	cwconint: cwconint,
+    	cwint: cwint,
+    	cylcty: cylcty,
+    	dagger: dagger,
+    	Dagger: Dagger,
+    	daleth: daleth,
+    	darr: darr,
+    	Darr: Darr,
+    	dArr: dArr,
+    	dash: dash,
+    	Dashv: Dashv,
+    	dashv: dashv,
+    	dbkarow: dbkarow,
+    	dblac: dblac,
+    	Dcaron: Dcaron,
+    	dcaron: dcaron,
+    	Dcy: Dcy,
+    	dcy: dcy,
+    	ddagger: ddagger,
+    	ddarr: ddarr,
+    	DD: DD,
+    	dd: dd,
+    	DDotrahd: DDotrahd,
+    	ddotseq: ddotseq,
+    	deg: deg,
+    	Del: Del,
+    	Delta: Delta,
+    	delta: delta,
+    	demptyv: demptyv,
+    	dfisht: dfisht,
+    	Dfr: Dfr,
+    	dfr: dfr,
+    	dHar: dHar,
+    	dharl: dharl,
+    	dharr: dharr,
+    	DiacriticalAcute: DiacriticalAcute,
+    	DiacriticalDot: DiacriticalDot,
+    	DiacriticalDoubleAcute: DiacriticalDoubleAcute,
+    	DiacriticalGrave: DiacriticalGrave,
+    	DiacriticalTilde: DiacriticalTilde,
+    	diam: diam,
+    	diamond: diamond,
+    	Diamond: Diamond,
+    	diamondsuit: diamondsuit,
+    	diams: diams,
+    	die: die,
+    	DifferentialD: DifferentialD,
+    	digamma: digamma,
+    	disin: disin,
+    	div: div,
+    	divide: divide,
+    	divideontimes: divideontimes,
+    	divonx: divonx,
+    	DJcy: DJcy,
+    	djcy: djcy,
+    	dlcorn: dlcorn,
+    	dlcrop: dlcrop,
+    	dollar: dollar,
+    	Dopf: Dopf,
+    	dopf: dopf,
+    	Dot: Dot,
+    	dot: dot,
+    	DotDot: DotDot,
+    	doteq: doteq,
+    	doteqdot: doteqdot,
+    	DotEqual: DotEqual,
+    	dotminus: dotminus,
+    	dotplus: dotplus,
+    	dotsquare: dotsquare,
+    	doublebarwedge: doublebarwedge,
+    	DoubleContourIntegral: DoubleContourIntegral,
+    	DoubleDot: DoubleDot,
+    	DoubleDownArrow: DoubleDownArrow,
+    	DoubleLeftArrow: DoubleLeftArrow,
+    	DoubleLeftRightArrow: DoubleLeftRightArrow,
+    	DoubleLeftTee: DoubleLeftTee,
+    	DoubleLongLeftArrow: DoubleLongLeftArrow,
+    	DoubleLongLeftRightArrow: DoubleLongLeftRightArrow,
+    	DoubleLongRightArrow: DoubleLongRightArrow,
+    	DoubleRightArrow: DoubleRightArrow,
+    	DoubleRightTee: DoubleRightTee,
+    	DoubleUpArrow: DoubleUpArrow,
+    	DoubleUpDownArrow: DoubleUpDownArrow,
+    	DoubleVerticalBar: DoubleVerticalBar,
+    	DownArrowBar: DownArrowBar,
+    	downarrow: downarrow,
+    	DownArrow: DownArrow,
+    	Downarrow: Downarrow,
+    	DownArrowUpArrow: DownArrowUpArrow,
+    	DownBreve: DownBreve,
+    	downdownarrows: downdownarrows,
+    	downharpoonleft: downharpoonleft,
+    	downharpoonright: downharpoonright,
+    	DownLeftRightVector: DownLeftRightVector,
+    	DownLeftTeeVector: DownLeftTeeVector,
+    	DownLeftVectorBar: DownLeftVectorBar,
+    	DownLeftVector: DownLeftVector,
+    	DownRightTeeVector: DownRightTeeVector,
+    	DownRightVectorBar: DownRightVectorBar,
+    	DownRightVector: DownRightVector,
+    	DownTeeArrow: DownTeeArrow,
+    	DownTee: DownTee,
+    	drbkarow: drbkarow,
+    	drcorn: drcorn,
+    	drcrop: drcrop,
+    	Dscr: Dscr,
+    	dscr: dscr,
+    	DScy: DScy,
+    	dscy: dscy,
+    	dsol: dsol,
+    	Dstrok: Dstrok,
+    	dstrok: dstrok,
+    	dtdot: dtdot,
+    	dtri: dtri,
+    	dtrif: dtrif,
+    	duarr: duarr,
+    	duhar: duhar,
+    	dwangle: dwangle,
+    	DZcy: DZcy,
+    	dzcy: dzcy,
+    	dzigrarr: dzigrarr,
+    	Eacute: Eacute,
+    	eacute: eacute,
+    	easter: easter,
+    	Ecaron: Ecaron,
+    	ecaron: ecaron,
+    	Ecirc: Ecirc,
+    	ecirc: ecirc,
+    	ecir: ecir,
+    	ecolon: ecolon,
+    	Ecy: Ecy,
+    	ecy: ecy,
+    	eDDot: eDDot,
+    	Edot: Edot,
+    	edot: edot,
+    	eDot: eDot,
+    	ee: ee,
+    	efDot: efDot,
+    	Efr: Efr,
+    	efr: efr,
+    	eg: eg,
+    	Egrave: Egrave,
+    	egrave: egrave,
+    	egs: egs,
+    	egsdot: egsdot,
+    	el: el,
+    	Element: Element,
+    	elinters: elinters,
+    	ell: ell,
+    	els: els,
+    	elsdot: elsdot,
+    	Emacr: Emacr,
+    	emacr: emacr,
+    	empty: empty,
+    	emptyset: emptyset,
+    	EmptySmallSquare: EmptySmallSquare,
+    	emptyv: emptyv,
+    	EmptyVerySmallSquare: EmptyVerySmallSquare,
+    	emsp13: emsp13,
+    	emsp14: emsp14,
+    	emsp: emsp,
+    	ENG: ENG,
+    	eng: eng,
+    	ensp: ensp,
+    	Eogon: Eogon,
+    	eogon: eogon,
+    	Eopf: Eopf,
+    	eopf: eopf,
+    	epar: epar,
+    	eparsl: eparsl,
+    	eplus: eplus,
+    	epsi: epsi,
+    	Epsilon: Epsilon,
+    	epsilon: epsilon,
+    	epsiv: epsiv,
+    	eqcirc: eqcirc,
+    	eqcolon: eqcolon,
+    	eqsim: eqsim,
+    	eqslantgtr: eqslantgtr,
+    	eqslantless: eqslantless,
+    	Equal: Equal,
+    	equals: equals,
+    	EqualTilde: EqualTilde,
+    	equest: equest,
+    	Equilibrium: Equilibrium,
+    	equiv: equiv,
+    	equivDD: equivDD,
+    	eqvparsl: eqvparsl,
+    	erarr: erarr,
+    	erDot: erDot,
+    	escr: escr,
+    	Escr: Escr,
+    	esdot: esdot,
+    	Esim: Esim,
+    	esim: esim,
+    	Eta: Eta,
+    	eta: eta,
+    	ETH: ETH,
+    	eth: eth,
+    	Euml: Euml,
+    	euml: euml,
+    	euro: euro,
+    	excl: excl,
+    	exist: exist,
+    	Exists: Exists,
+    	expectation: expectation,
+    	exponentiale: exponentiale,
+    	ExponentialE: ExponentialE,
+    	fallingdotseq: fallingdotseq,
+    	Fcy: Fcy,
+    	fcy: fcy,
+    	female: female,
+    	ffilig: ffilig,
+    	fflig: fflig,
+    	ffllig: ffllig,
+    	Ffr: Ffr,
+    	ffr: ffr,
+    	filig: filig,
+    	FilledSmallSquare: FilledSmallSquare,
+    	FilledVerySmallSquare: FilledVerySmallSquare,
+    	fjlig: fjlig,
+    	flat: flat,
+    	fllig: fllig,
+    	fltns: fltns,
+    	fnof: fnof,
+    	Fopf: Fopf,
+    	fopf: fopf,
+    	forall: forall,
+    	ForAll: ForAll,
+    	fork: fork,
+    	forkv: forkv,
+    	Fouriertrf: Fouriertrf,
+    	fpartint: fpartint,
+    	frac12: frac12,
+    	frac13: frac13,
+    	frac14: frac14,
+    	frac15: frac15,
+    	frac16: frac16,
+    	frac18: frac18,
+    	frac23: frac23,
+    	frac25: frac25,
+    	frac34: frac34,
+    	frac35: frac35,
+    	frac38: frac38,
+    	frac45: frac45,
+    	frac56: frac56,
+    	frac58: frac58,
+    	frac78: frac78,
+    	frasl: frasl,
+    	frown: frown,
+    	fscr: fscr,
+    	Fscr: Fscr,
+    	gacute: gacute,
+    	Gamma: Gamma,
+    	gamma: gamma,
+    	Gammad: Gammad,
+    	gammad: gammad,
+    	gap: gap,
+    	Gbreve: Gbreve,
+    	gbreve: gbreve,
+    	Gcedil: Gcedil,
+    	Gcirc: Gcirc,
+    	gcirc: gcirc,
+    	Gcy: Gcy,
+    	gcy: gcy,
+    	Gdot: Gdot,
+    	gdot: gdot,
+    	ge: ge,
+    	gE: gE,
+    	gEl: gEl,
+    	gel: gel,
+    	geq: geq,
+    	geqq: geqq,
+    	geqslant: geqslant,
+    	gescc: gescc,
+    	ges: ges,
+    	gesdot: gesdot,
+    	gesdoto: gesdoto,
+    	gesdotol: gesdotol,
+    	gesl: gesl,
+    	gesles: gesles,
+    	Gfr: Gfr,
+    	gfr: gfr,
+    	gg: gg,
+    	Gg: Gg,
+    	ggg: ggg,
+    	gimel: gimel,
+    	GJcy: GJcy,
+    	gjcy: gjcy,
+    	gla: gla,
+    	gl: gl,
+    	glE: glE,
+    	glj: glj,
+    	gnap: gnap,
+    	gnapprox: gnapprox,
+    	gne: gne,
+    	gnE: gnE,
+    	gneq: gneq,
+    	gneqq: gneqq,
+    	gnsim: gnsim,
+    	Gopf: Gopf,
+    	gopf: gopf,
+    	grave: grave,
+    	GreaterEqual: GreaterEqual,
+    	GreaterEqualLess: GreaterEqualLess,
+    	GreaterFullEqual: GreaterFullEqual,
+    	GreaterGreater: GreaterGreater,
+    	GreaterLess: GreaterLess,
+    	GreaterSlantEqual: GreaterSlantEqual,
+    	GreaterTilde: GreaterTilde,
+    	Gscr: Gscr,
+    	gscr: gscr,
+    	gsim: gsim,
+    	gsime: gsime,
+    	gsiml: gsiml,
+    	gtcc: gtcc,
+    	gtcir: gtcir,
+    	gt: gt,
+    	GT: GT,
+    	Gt: Gt,
+    	gtdot: gtdot,
+    	gtlPar: gtlPar,
+    	gtquest: gtquest,
+    	gtrapprox: gtrapprox,
+    	gtrarr: gtrarr,
+    	gtrdot: gtrdot,
+    	gtreqless: gtreqless,
+    	gtreqqless: gtreqqless,
+    	gtrless: gtrless,
+    	gtrsim: gtrsim,
+    	gvertneqq: gvertneqq,
+    	gvnE: gvnE,
+    	Hacek: Hacek,
+    	hairsp: hairsp,
+    	half: half,
+    	hamilt: hamilt,
+    	HARDcy: HARDcy,
+    	hardcy: hardcy,
+    	harrcir: harrcir,
+    	harr: harr,
+    	hArr: hArr,
+    	harrw: harrw,
+    	Hat: Hat,
+    	hbar: hbar,
+    	Hcirc: Hcirc,
+    	hcirc: hcirc,
+    	hearts: hearts,
+    	heartsuit: heartsuit,
+    	hellip: hellip,
+    	hercon: hercon,
+    	hfr: hfr,
+    	Hfr: Hfr,
+    	HilbertSpace: HilbertSpace,
+    	hksearow: hksearow,
+    	hkswarow: hkswarow,
+    	hoarr: hoarr,
+    	homtht: homtht,
+    	hookleftarrow: hookleftarrow,
+    	hookrightarrow: hookrightarrow,
+    	hopf: hopf,
+    	Hopf: Hopf,
+    	horbar: horbar,
+    	HorizontalLine: HorizontalLine,
+    	hscr: hscr,
+    	Hscr: Hscr,
+    	hslash: hslash,
+    	Hstrok: Hstrok,
+    	hstrok: hstrok,
+    	HumpDownHump: HumpDownHump,
+    	HumpEqual: HumpEqual,
+    	hybull: hybull,
+    	hyphen: hyphen,
+    	Iacute: Iacute,
+    	iacute: iacute,
+    	ic: ic,
+    	Icirc: Icirc,
+    	icirc: icirc,
+    	Icy: Icy,
+    	icy: icy,
+    	Idot: Idot,
+    	IEcy: IEcy,
+    	iecy: iecy,
+    	iexcl: iexcl,
+    	iff: iff,
+    	ifr: ifr,
+    	Ifr: Ifr,
+    	Igrave: Igrave,
+    	igrave: igrave,
+    	ii: ii,
+    	iiiint: iiiint,
+    	iiint: iiint,
+    	iinfin: iinfin,
+    	iiota: iiota,
+    	IJlig: IJlig,
+    	ijlig: ijlig,
+    	Imacr: Imacr,
+    	imacr: imacr,
+    	image: image,
+    	ImaginaryI: ImaginaryI,
+    	imagline: imagline,
+    	imagpart: imagpart,
+    	imath: imath,
+    	Im: Im,
+    	imof: imof,
+    	imped: imped,
+    	Implies: Implies,
+    	incare: incare,
+    	"in": "โˆˆ",
+    	infin: infin,
+    	infintie: infintie,
+    	inodot: inodot,
+    	intcal: intcal,
+    	int: int,
+    	Int: Int,
+    	integers: integers,
+    	Integral: Integral,
+    	intercal: intercal,
+    	Intersection: Intersection,
+    	intlarhk: intlarhk,
+    	intprod: intprod,
+    	InvisibleComma: InvisibleComma,
+    	InvisibleTimes: InvisibleTimes,
+    	IOcy: IOcy,
+    	iocy: iocy,
+    	Iogon: Iogon,
+    	iogon: iogon,
+    	Iopf: Iopf,
+    	iopf: iopf,
+    	Iota: Iota,
+    	iota: iota,
+    	iprod: iprod,
+    	iquest: iquest,
+    	iscr: iscr,
+    	Iscr: Iscr,
+    	isin: isin,
+    	isindot: isindot,
+    	isinE: isinE,
+    	isins: isins,
+    	isinsv: isinsv,
+    	isinv: isinv,
+    	it: it,
+    	Itilde: Itilde,
+    	itilde: itilde,
+    	Iukcy: Iukcy,
+    	iukcy: iukcy,
+    	Iuml: Iuml,
+    	iuml: iuml,
+    	Jcirc: Jcirc,
+    	jcirc: jcirc,
+    	Jcy: Jcy,
+    	jcy: jcy,
+    	Jfr: Jfr,
+    	jfr: jfr,
+    	jmath: jmath,
+    	Jopf: Jopf,
+    	jopf: jopf,
+    	Jscr: Jscr,
+    	jscr: jscr,
+    	Jsercy: Jsercy,
+    	jsercy: jsercy,
+    	Jukcy: Jukcy,
+    	jukcy: jukcy,
+    	Kappa: Kappa,
+    	kappa: kappa,
+    	kappav: kappav,
+    	Kcedil: Kcedil,
+    	kcedil: kcedil,
+    	Kcy: Kcy,
+    	kcy: kcy,
+    	Kfr: Kfr,
+    	kfr: kfr,
+    	kgreen: kgreen,
+    	KHcy: KHcy,
+    	khcy: khcy,
+    	KJcy: KJcy,
+    	kjcy: kjcy,
+    	Kopf: Kopf,
+    	kopf: kopf,
+    	Kscr: Kscr,
+    	kscr: kscr,
+    	lAarr: lAarr,
+    	Lacute: Lacute,
+    	lacute: lacute,
+    	laemptyv: laemptyv,
+    	lagran: lagran,
+    	Lambda: Lambda,
+    	lambda: lambda,
+    	lang: lang,
+    	Lang: Lang,
+    	langd: langd,
+    	langle: langle,
+    	lap: lap,
+    	Laplacetrf: Laplacetrf,
+    	laquo: laquo,
+    	larrb: larrb,
+    	larrbfs: larrbfs,
+    	larr: larr,
+    	Larr: Larr,
+    	lArr: lArr,
+    	larrfs: larrfs,
+    	larrhk: larrhk,
+    	larrlp: larrlp,
+    	larrpl: larrpl,
+    	larrsim: larrsim,
+    	larrtl: larrtl,
+    	latail: latail,
+    	lAtail: lAtail,
+    	lat: lat,
+    	late: late,
+    	lates: lates,
+    	lbarr: lbarr,
+    	lBarr: lBarr,
+    	lbbrk: lbbrk,
+    	lbrace: lbrace,
+    	lbrack: lbrack,
+    	lbrke: lbrke,
+    	lbrksld: lbrksld,
+    	lbrkslu: lbrkslu,
+    	Lcaron: Lcaron,
+    	lcaron: lcaron,
+    	Lcedil: Lcedil,
+    	lcedil: lcedil,
+    	lceil: lceil,
+    	lcub: lcub,
+    	Lcy: Lcy,
+    	lcy: lcy,
+    	ldca: ldca,
+    	ldquo: ldquo,
+    	ldquor: ldquor,
+    	ldrdhar: ldrdhar,
+    	ldrushar: ldrushar,
+    	ldsh: ldsh,
+    	le: le,
+    	lE: lE,
+    	LeftAngleBracket: LeftAngleBracket,
+    	LeftArrowBar: LeftArrowBar,
+    	leftarrow: leftarrow,
+    	LeftArrow: LeftArrow,
+    	Leftarrow: Leftarrow,
+    	LeftArrowRightArrow: LeftArrowRightArrow,
+    	leftarrowtail: leftarrowtail,
+    	LeftCeiling: LeftCeiling,
+    	LeftDoubleBracket: LeftDoubleBracket,
+    	LeftDownTeeVector: LeftDownTeeVector,
+    	LeftDownVectorBar: LeftDownVectorBar,
+    	LeftDownVector: LeftDownVector,
+    	LeftFloor: LeftFloor,
+    	leftharpoondown: leftharpoondown,
+    	leftharpoonup: leftharpoonup,
+    	leftleftarrows: leftleftarrows,
+    	leftrightarrow: leftrightarrow,
+    	LeftRightArrow: LeftRightArrow,
+    	Leftrightarrow: Leftrightarrow,
+    	leftrightarrows: leftrightarrows,
+    	leftrightharpoons: leftrightharpoons,
+    	leftrightsquigarrow: leftrightsquigarrow,
+    	LeftRightVector: LeftRightVector,
+    	LeftTeeArrow: LeftTeeArrow,
+    	LeftTee: LeftTee,
+    	LeftTeeVector: LeftTeeVector,
+    	leftthreetimes: leftthreetimes,
+    	LeftTriangleBar: LeftTriangleBar,
+    	LeftTriangle: LeftTriangle,
+    	LeftTriangleEqual: LeftTriangleEqual,
+    	LeftUpDownVector: LeftUpDownVector,
+    	LeftUpTeeVector: LeftUpTeeVector,
+    	LeftUpVectorBar: LeftUpVectorBar,
+    	LeftUpVector: LeftUpVector,
+    	LeftVectorBar: LeftVectorBar,
+    	LeftVector: LeftVector,
+    	lEg: lEg,
+    	leg: leg,
+    	leq: leq,
+    	leqq: leqq,
+    	leqslant: leqslant,
+    	lescc: lescc,
+    	les: les,
+    	lesdot: lesdot,
+    	lesdoto: lesdoto,
+    	lesdotor: lesdotor,
+    	lesg: lesg,
+    	lesges: lesges,
+    	lessapprox: lessapprox,
+    	lessdot: lessdot,
+    	lesseqgtr: lesseqgtr,
+    	lesseqqgtr: lesseqqgtr,
+    	LessEqualGreater: LessEqualGreater,
+    	LessFullEqual: LessFullEqual,
+    	LessGreater: LessGreater,
+    	lessgtr: lessgtr,
+    	LessLess: LessLess,
+    	lesssim: lesssim,
+    	LessSlantEqual: LessSlantEqual,
+    	LessTilde: LessTilde,
+    	lfisht: lfisht,
+    	lfloor: lfloor,
+    	Lfr: Lfr,
+    	lfr: lfr,
+    	lg: lg,
+    	lgE: lgE,
+    	lHar: lHar,
+    	lhard: lhard,
+    	lharu: lharu,
+    	lharul: lharul,
+    	lhblk: lhblk,
+    	LJcy: LJcy,
+    	ljcy: ljcy,
+    	llarr: llarr,
+    	ll: ll,
+    	Ll: Ll,
+    	llcorner: llcorner,
+    	Lleftarrow: Lleftarrow,
+    	llhard: llhard,
+    	lltri: lltri,
+    	Lmidot: Lmidot,
+    	lmidot: lmidot,
+    	lmoustache: lmoustache,
+    	lmoust: lmoust,
+    	lnap: lnap,
+    	lnapprox: lnapprox,
+    	lne: lne,
+    	lnE: lnE,
+    	lneq: lneq,
+    	lneqq: lneqq,
+    	lnsim: lnsim,
+    	loang: loang,
+    	loarr: loarr,
+    	lobrk: lobrk,
+    	longleftarrow: longleftarrow,
+    	LongLeftArrow: LongLeftArrow,
+    	Longleftarrow: Longleftarrow,
+    	longleftrightarrow: longleftrightarrow,
+    	LongLeftRightArrow: LongLeftRightArrow,
+    	Longleftrightarrow: Longleftrightarrow,
+    	longmapsto: longmapsto,
+    	longrightarrow: longrightarrow,
+    	LongRightArrow: LongRightArrow,
+    	Longrightarrow: Longrightarrow,
+    	looparrowleft: looparrowleft,
+    	looparrowright: looparrowright,
+    	lopar: lopar,
+    	Lopf: Lopf,
+    	lopf: lopf,
+    	loplus: loplus,
+    	lotimes: lotimes,
+    	lowast: lowast,
+    	lowbar: lowbar,
+    	LowerLeftArrow: LowerLeftArrow,
+    	LowerRightArrow: LowerRightArrow,
+    	loz: loz,
+    	lozenge: lozenge,
+    	lozf: lozf,
+    	lpar: lpar,
+    	lparlt: lparlt,
+    	lrarr: lrarr,
+    	lrcorner: lrcorner,
+    	lrhar: lrhar,
+    	lrhard: lrhard,
+    	lrm: lrm,
+    	lrtri: lrtri,
+    	lsaquo: lsaquo,
+    	lscr: lscr,
+    	Lscr: Lscr,
+    	lsh: lsh,
+    	Lsh: Lsh,
+    	lsim: lsim,
+    	lsime: lsime,
+    	lsimg: lsimg,
+    	lsqb: lsqb,
+    	lsquo: lsquo,
+    	lsquor: lsquor,
+    	Lstrok: Lstrok,
+    	lstrok: lstrok,
+    	ltcc: ltcc,
+    	ltcir: ltcir,
+    	lt: lt,
+    	LT: LT,
+    	Lt: Lt,
+    	ltdot: ltdot,
+    	lthree: lthree,
+    	ltimes: ltimes,
+    	ltlarr: ltlarr,
+    	ltquest: ltquest,
+    	ltri: ltri,
+    	ltrie: ltrie,
+    	ltrif: ltrif,
+    	ltrPar: ltrPar,
+    	lurdshar: lurdshar,
+    	luruhar: luruhar,
+    	lvertneqq: lvertneqq,
+    	lvnE: lvnE,
+    	macr: macr,
+    	male: male,
+    	malt: malt,
+    	maltese: maltese,
+    	"Map": "โค…",
+    	map: map,
+    	mapsto: mapsto,
+    	mapstodown: mapstodown,
+    	mapstoleft: mapstoleft,
+    	mapstoup: mapstoup,
+    	marker: marker,
+    	mcomma: mcomma,
+    	Mcy: Mcy,
+    	mcy: mcy,
+    	mdash: mdash,
+    	mDDot: mDDot,
+    	measuredangle: measuredangle,
+    	MediumSpace: MediumSpace,
+    	Mellintrf: Mellintrf,
+    	Mfr: Mfr,
+    	mfr: mfr,
+    	mho: mho,
+    	micro: micro,
+    	midast: midast,
+    	midcir: midcir,
+    	mid: mid,
+    	middot: middot,
+    	minusb: minusb,
+    	minus: minus,
+    	minusd: minusd,
+    	minusdu: minusdu,
+    	MinusPlus: MinusPlus,
+    	mlcp: mlcp,
+    	mldr: mldr,
+    	mnplus: mnplus,
+    	models: models,
+    	Mopf: Mopf,
+    	mopf: mopf,
+    	mp: mp,
+    	mscr: mscr,
+    	Mscr: Mscr,
+    	mstpos: mstpos,
+    	Mu: Mu,
+    	mu: mu,
+    	multimap: multimap,
+    	mumap: mumap,
+    	nabla: nabla,
+    	Nacute: Nacute,
+    	nacute: nacute,
+    	nang: nang,
+    	nap: nap,
+    	napE: napE,
+    	napid: napid,
+    	napos: napos,
+    	napprox: napprox,
+    	natural: natural,
+    	naturals: naturals,
+    	natur: natur,
+    	nbsp: nbsp,
+    	nbump: nbump,
+    	nbumpe: nbumpe,
+    	ncap: ncap,
+    	Ncaron: Ncaron,
+    	ncaron: ncaron,
+    	Ncedil: Ncedil,
+    	ncedil: ncedil,
+    	ncong: ncong,
+    	ncongdot: ncongdot,
+    	ncup: ncup,
+    	Ncy: Ncy,
+    	ncy: ncy,
+    	ndash: ndash,
+    	nearhk: nearhk,
+    	nearr: nearr,
+    	neArr: neArr,
+    	nearrow: nearrow,
+    	ne: ne,
+    	nedot: nedot,
+    	NegativeMediumSpace: NegativeMediumSpace,
+    	NegativeThickSpace: NegativeThickSpace,
+    	NegativeThinSpace: NegativeThinSpace,
+    	NegativeVeryThinSpace: NegativeVeryThinSpace,
+    	nequiv: nequiv,
+    	nesear: nesear,
+    	nesim: nesim,
+    	NestedGreaterGreater: NestedGreaterGreater,
+    	NestedLessLess: NestedLessLess,
+    	NewLine: NewLine,
+    	nexist: nexist,
+    	nexists: nexists,
+    	Nfr: Nfr,
+    	nfr: nfr,
+    	ngE: ngE,
+    	nge: nge,
+    	ngeq: ngeq,
+    	ngeqq: ngeqq,
+    	ngeqslant: ngeqslant,
+    	nges: nges,
+    	nGg: nGg,
+    	ngsim: ngsim,
+    	nGt: nGt,
+    	ngt: ngt,
+    	ngtr: ngtr,
+    	nGtv: nGtv,
+    	nharr: nharr,
+    	nhArr: nhArr,
+    	nhpar: nhpar,
+    	ni: ni,
+    	nis: nis,
+    	nisd: nisd,
+    	niv: niv,
+    	NJcy: NJcy,
+    	njcy: njcy,
+    	nlarr: nlarr,
+    	nlArr: nlArr,
+    	nldr: nldr,
+    	nlE: nlE,
+    	nle: nle,
+    	nleftarrow: nleftarrow,
+    	nLeftarrow: nLeftarrow,
+    	nleftrightarrow: nleftrightarrow,
+    	nLeftrightarrow: nLeftrightarrow,
+    	nleq: nleq,
+    	nleqq: nleqq,
+    	nleqslant: nleqslant,
+    	nles: nles,
+    	nless: nless,
+    	nLl: nLl,
+    	nlsim: nlsim,
+    	nLt: nLt,
+    	nlt: nlt,
+    	nltri: nltri,
+    	nltrie: nltrie,
+    	nLtv: nLtv,
+    	nmid: nmid,
+    	NoBreak: NoBreak,
+    	NonBreakingSpace: NonBreakingSpace,
+    	nopf: nopf,
+    	Nopf: Nopf,
+    	Not: Not,
+    	not: not,
+    	NotCongruent: NotCongruent,
+    	NotCupCap: NotCupCap,
+    	NotDoubleVerticalBar: NotDoubleVerticalBar,
+    	NotElement: NotElement,
+    	NotEqual: NotEqual,
+    	NotEqualTilde: NotEqualTilde,
+    	NotExists: NotExists,
+    	NotGreater: NotGreater,
+    	NotGreaterEqual: NotGreaterEqual,
+    	NotGreaterFullEqual: NotGreaterFullEqual,
+    	NotGreaterGreater: NotGreaterGreater,
+    	NotGreaterLess: NotGreaterLess,
+    	NotGreaterSlantEqual: NotGreaterSlantEqual,
+    	NotGreaterTilde: NotGreaterTilde,
+    	NotHumpDownHump: NotHumpDownHump,
+    	NotHumpEqual: NotHumpEqual,
+    	notin: notin,
+    	notindot: notindot,
+    	notinE: notinE,
+    	notinva: notinva,
+    	notinvb: notinvb,
+    	notinvc: notinvc,
+    	NotLeftTriangleBar: NotLeftTriangleBar,
+    	NotLeftTriangle: NotLeftTriangle,
+    	NotLeftTriangleEqual: NotLeftTriangleEqual,
+    	NotLess: NotLess,
+    	NotLessEqual: NotLessEqual,
+    	NotLessGreater: NotLessGreater,
+    	NotLessLess: NotLessLess,
+    	NotLessSlantEqual: NotLessSlantEqual,
+    	NotLessTilde: NotLessTilde,
+    	NotNestedGreaterGreater: NotNestedGreaterGreater,
+    	NotNestedLessLess: NotNestedLessLess,
+    	notni: notni,
+    	notniva: notniva,
+    	notnivb: notnivb,
+    	notnivc: notnivc,
+    	NotPrecedes: NotPrecedes,
+    	NotPrecedesEqual: NotPrecedesEqual,
+    	NotPrecedesSlantEqual: NotPrecedesSlantEqual,
+    	NotReverseElement: NotReverseElement,
+    	NotRightTriangleBar: NotRightTriangleBar,
+    	NotRightTriangle: NotRightTriangle,
+    	NotRightTriangleEqual: NotRightTriangleEqual,
+    	NotSquareSubset: NotSquareSubset,
+    	NotSquareSubsetEqual: NotSquareSubsetEqual,
+    	NotSquareSuperset: NotSquareSuperset,
+    	NotSquareSupersetEqual: NotSquareSupersetEqual,
+    	NotSubset: NotSubset,
+    	NotSubsetEqual: NotSubsetEqual,
+    	NotSucceeds: NotSucceeds,
+    	NotSucceedsEqual: NotSucceedsEqual,
+    	NotSucceedsSlantEqual: NotSucceedsSlantEqual,
+    	NotSucceedsTilde: NotSucceedsTilde,
+    	NotSuperset: NotSuperset,
+    	NotSupersetEqual: NotSupersetEqual,
+    	NotTilde: NotTilde,
+    	NotTildeEqual: NotTildeEqual,
+    	NotTildeFullEqual: NotTildeFullEqual,
+    	NotTildeTilde: NotTildeTilde,
+    	NotVerticalBar: NotVerticalBar,
+    	nparallel: nparallel,
+    	npar: npar,
+    	nparsl: nparsl,
+    	npart: npart,
+    	npolint: npolint,
+    	npr: npr,
+    	nprcue: nprcue,
+    	nprec: nprec,
+    	npreceq: npreceq,
+    	npre: npre,
+    	nrarrc: nrarrc,
+    	nrarr: nrarr,
+    	nrArr: nrArr,
+    	nrarrw: nrarrw,
+    	nrightarrow: nrightarrow,
+    	nRightarrow: nRightarrow,
+    	nrtri: nrtri,
+    	nrtrie: nrtrie,
+    	nsc: nsc,
+    	nsccue: nsccue,
+    	nsce: nsce,
+    	Nscr: Nscr,
+    	nscr: nscr,
+    	nshortmid: nshortmid,
+    	nshortparallel: nshortparallel,
+    	nsim: nsim,
+    	nsime: nsime,
+    	nsimeq: nsimeq,
+    	nsmid: nsmid,
+    	nspar: nspar,
+    	nsqsube: nsqsube,
+    	nsqsupe: nsqsupe,
+    	nsub: nsub,
+    	nsubE: nsubE,
+    	nsube: nsube,
+    	nsubset: nsubset,
+    	nsubseteq: nsubseteq,
+    	nsubseteqq: nsubseteqq,
+    	nsucc: nsucc,
+    	nsucceq: nsucceq,
+    	nsup: nsup,
+    	nsupE: nsupE,
+    	nsupe: nsupe,
+    	nsupset: nsupset,
+    	nsupseteq: nsupseteq,
+    	nsupseteqq: nsupseteqq,
+    	ntgl: ntgl,
+    	Ntilde: Ntilde,
+    	ntilde: ntilde,
+    	ntlg: ntlg,
+    	ntriangleleft: ntriangleleft,
+    	ntrianglelefteq: ntrianglelefteq,
+    	ntriangleright: ntriangleright,
+    	ntrianglerighteq: ntrianglerighteq,
+    	Nu: Nu,
+    	nu: nu,
+    	num: num,
+    	numero: numero,
+    	numsp: numsp,
+    	nvap: nvap,
+    	nvdash: nvdash,
+    	nvDash: nvDash,
+    	nVdash: nVdash,
+    	nVDash: nVDash,
+    	nvge: nvge,
+    	nvgt: nvgt,
+    	nvHarr: nvHarr,
+    	nvinfin: nvinfin,
+    	nvlArr: nvlArr,
+    	nvle: nvle,
+    	nvlt: nvlt,
+    	nvltrie: nvltrie,
+    	nvrArr: nvrArr,
+    	nvrtrie: nvrtrie,
+    	nvsim: nvsim,
+    	nwarhk: nwarhk,
+    	nwarr: nwarr,
+    	nwArr: nwArr,
+    	nwarrow: nwarrow,
+    	nwnear: nwnear,
+    	Oacute: Oacute,
+    	oacute: oacute,
+    	oast: oast,
+    	Ocirc: Ocirc,
+    	ocirc: ocirc,
+    	ocir: ocir,
+    	Ocy: Ocy,
+    	ocy: ocy,
+    	odash: odash,
+    	Odblac: Odblac,
+    	odblac: odblac,
+    	odiv: odiv,
+    	odot: odot,
+    	odsold: odsold,
+    	OElig: OElig,
+    	oelig: oelig,
+    	ofcir: ofcir,
+    	Ofr: Ofr,
+    	ofr: ofr,
+    	ogon: ogon,
+    	Ograve: Ograve,
+    	ograve: ograve,
+    	ogt: ogt,
+    	ohbar: ohbar,
+    	ohm: ohm,
+    	oint: oint,
+    	olarr: olarr,
+    	olcir: olcir,
+    	olcross: olcross,
+    	oline: oline,
+    	olt: olt,
+    	Omacr: Omacr,
+    	omacr: omacr,
+    	Omega: Omega,
+    	omega: omega,
+    	Omicron: Omicron,
+    	omicron: omicron,
+    	omid: omid,
+    	ominus: ominus,
+    	Oopf: Oopf,
+    	oopf: oopf,
+    	opar: opar,
+    	OpenCurlyDoubleQuote: OpenCurlyDoubleQuote,
+    	OpenCurlyQuote: OpenCurlyQuote,
+    	operp: operp,
+    	oplus: oplus,
+    	orarr: orarr,
+    	Or: Or,
+    	or: or,
+    	ord: ord,
+    	order: order,
+    	orderof: orderof,
+    	ordf: ordf,
+    	ordm: ordm,
+    	origof: origof,
+    	oror: oror,
+    	orslope: orslope,
+    	orv: orv,
+    	oS: oS,
+    	Oscr: Oscr,
+    	oscr: oscr,
+    	Oslash: Oslash,
+    	oslash: oslash,
+    	osol: osol,
+    	Otilde: Otilde,
+    	otilde: otilde,
+    	otimesas: otimesas,
+    	Otimes: Otimes,
+    	otimes: otimes,
+    	Ouml: Ouml,
+    	ouml: ouml,
+    	ovbar: ovbar,
+    	OverBar: OverBar,
+    	OverBrace: OverBrace,
+    	OverBracket: OverBracket,
+    	OverParenthesis: OverParenthesis,
+    	para: para,
+    	parallel: parallel,
+    	par: par,
+    	parsim: parsim,
+    	parsl: parsl,
+    	part: part,
+    	PartialD: PartialD,
+    	Pcy: Pcy,
+    	pcy: pcy,
+    	percnt: percnt,
+    	period: period,
+    	permil: permil,
+    	perp: perp,
+    	pertenk: pertenk,
+    	Pfr: Pfr,
+    	pfr: pfr,
+    	Phi: Phi,
+    	phi: phi,
+    	phiv: phiv,
+    	phmmat: phmmat,
+    	phone: phone,
+    	Pi: Pi,
+    	pi: pi,
+    	pitchfork: pitchfork,
+    	piv: piv,
+    	planck: planck,
+    	planckh: planckh,
+    	plankv: plankv,
+    	plusacir: plusacir,
+    	plusb: plusb,
+    	pluscir: pluscir,
+    	plus: plus,
+    	plusdo: plusdo,
+    	plusdu: plusdu,
+    	pluse: pluse,
+    	PlusMinus: PlusMinus,
+    	plusmn: plusmn,
+    	plussim: plussim,
+    	plustwo: plustwo,
+    	pm: pm,
+    	Poincareplane: Poincareplane,
+    	pointint: pointint,
+    	popf: popf,
+    	Popf: Popf,
+    	pound: pound,
+    	prap: prap,
+    	Pr: Pr,
+    	pr: pr,
+    	prcue: prcue,
+    	precapprox: precapprox,
+    	prec: prec,
+    	preccurlyeq: preccurlyeq,
+    	Precedes: Precedes,
+    	PrecedesEqual: PrecedesEqual,
+    	PrecedesSlantEqual: PrecedesSlantEqual,
+    	PrecedesTilde: PrecedesTilde,
+    	preceq: preceq,
+    	precnapprox: precnapprox,
+    	precneqq: precneqq,
+    	precnsim: precnsim,
+    	pre: pre,
+    	prE: prE,
+    	precsim: precsim,
+    	prime: prime,
+    	Prime: Prime,
+    	primes: primes,
+    	prnap: prnap,
+    	prnE: prnE,
+    	prnsim: prnsim,
+    	prod: prod,
+    	Product: Product,
+    	profalar: profalar,
+    	profline: profline,
+    	profsurf: profsurf,
+    	prop: prop,
+    	Proportional: Proportional,
+    	Proportion: Proportion,
+    	propto: propto,
+    	prsim: prsim,
+    	prurel: prurel,
+    	Pscr: Pscr,
+    	pscr: pscr,
+    	Psi: Psi,
+    	psi: psi,
+    	puncsp: puncsp,
+    	Qfr: Qfr,
+    	qfr: qfr,
+    	qint: qint,
+    	qopf: qopf,
+    	Qopf: Qopf,
+    	qprime: qprime,
+    	Qscr: Qscr,
+    	qscr: qscr,
+    	quaternions: quaternions,
+    	quatint: quatint,
+    	quest: quest,
+    	questeq: questeq,
+    	quot: quot,
+    	QUOT: QUOT,
+    	rAarr: rAarr,
+    	race: race,
+    	Racute: Racute,
+    	racute: racute,
+    	radic: radic,
+    	raemptyv: raemptyv,
+    	rang: rang,
+    	Rang: Rang,
+    	rangd: rangd,
+    	range: range,
+    	rangle: rangle,
+    	raquo: raquo,
+    	rarrap: rarrap,
+    	rarrb: rarrb,
+    	rarrbfs: rarrbfs,
+    	rarrc: rarrc,
+    	rarr: rarr,
+    	Rarr: Rarr,
+    	rArr: rArr,
+    	rarrfs: rarrfs,
+    	rarrhk: rarrhk,
+    	rarrlp: rarrlp,
+    	rarrpl: rarrpl,
+    	rarrsim: rarrsim,
+    	Rarrtl: Rarrtl,
+    	rarrtl: rarrtl,
+    	rarrw: rarrw,
+    	ratail: ratail,
+    	rAtail: rAtail,
+    	ratio: ratio,
+    	rationals: rationals,
+    	rbarr: rbarr,
+    	rBarr: rBarr,
+    	RBarr: RBarr,
+    	rbbrk: rbbrk,
+    	rbrace: rbrace,
+    	rbrack: rbrack,
+    	rbrke: rbrke,
+    	rbrksld: rbrksld,
+    	rbrkslu: rbrkslu,
+    	Rcaron: Rcaron,
+    	rcaron: rcaron,
+    	Rcedil: Rcedil,
+    	rcedil: rcedil,
+    	rceil: rceil,
+    	rcub: rcub,
+    	Rcy: Rcy,
+    	rcy: rcy,
+    	rdca: rdca,
+    	rdldhar: rdldhar,
+    	rdquo: rdquo,
+    	rdquor: rdquor,
+    	rdsh: rdsh,
+    	real: real,
+    	realine: realine,
+    	realpart: realpart,
+    	reals: reals,
+    	Re: Re,
+    	rect: rect,
+    	reg: reg,
+    	REG: REG,
+    	ReverseElement: ReverseElement,
+    	ReverseEquilibrium: ReverseEquilibrium,
+    	ReverseUpEquilibrium: ReverseUpEquilibrium,
+    	rfisht: rfisht,
+    	rfloor: rfloor,
+    	rfr: rfr,
+    	Rfr: Rfr,
+    	rHar: rHar,
+    	rhard: rhard,
+    	rharu: rharu,
+    	rharul: rharul,
+    	Rho: Rho,
+    	rho: rho,
+    	rhov: rhov,
+    	RightAngleBracket: RightAngleBracket,
+    	RightArrowBar: RightArrowBar,
+    	rightarrow: rightarrow,
+    	RightArrow: RightArrow,
+    	Rightarrow: Rightarrow,
+    	RightArrowLeftArrow: RightArrowLeftArrow,
+    	rightarrowtail: rightarrowtail,
+    	RightCeiling: RightCeiling,
+    	RightDoubleBracket: RightDoubleBracket,
+    	RightDownTeeVector: RightDownTeeVector,
+    	RightDownVectorBar: RightDownVectorBar,
+    	RightDownVector: RightDownVector,
+    	RightFloor: RightFloor,
+    	rightharpoondown: rightharpoondown,
+    	rightharpoonup: rightharpoonup,
+    	rightleftarrows: rightleftarrows,
+    	rightleftharpoons: rightleftharpoons,
+    	rightrightarrows: rightrightarrows,
+    	rightsquigarrow: rightsquigarrow,
+    	RightTeeArrow: RightTeeArrow,
+    	RightTee: RightTee,
+    	RightTeeVector: RightTeeVector,
+    	rightthreetimes: rightthreetimes,
+    	RightTriangleBar: RightTriangleBar,
+    	RightTriangle: RightTriangle,
+    	RightTriangleEqual: RightTriangleEqual,
+    	RightUpDownVector: RightUpDownVector,
+    	RightUpTeeVector: RightUpTeeVector,
+    	RightUpVectorBar: RightUpVectorBar,
+    	RightUpVector: RightUpVector,
+    	RightVectorBar: RightVectorBar,
+    	RightVector: RightVector,
+    	ring: ring,
+    	risingdotseq: risingdotseq,
+    	rlarr: rlarr,
+    	rlhar: rlhar,
+    	rlm: rlm,
+    	rmoustache: rmoustache,
+    	rmoust: rmoust,
+    	rnmid: rnmid,
+    	roang: roang,
+    	roarr: roarr,
+    	robrk: robrk,
+    	ropar: ropar,
+    	ropf: ropf,
+    	Ropf: Ropf,
+    	roplus: roplus,
+    	rotimes: rotimes,
+    	RoundImplies: RoundImplies,
+    	rpar: rpar,
+    	rpargt: rpargt,
+    	rppolint: rppolint,
+    	rrarr: rrarr,
+    	Rrightarrow: Rrightarrow,
+    	rsaquo: rsaquo,
+    	rscr: rscr,
+    	Rscr: Rscr,
+    	rsh: rsh,
+    	Rsh: Rsh,
+    	rsqb: rsqb,
+    	rsquo: rsquo,
+    	rsquor: rsquor,
+    	rthree: rthree,
+    	rtimes: rtimes,
+    	rtri: rtri,
+    	rtrie: rtrie,
+    	rtrif: rtrif,
+    	rtriltri: rtriltri,
+    	RuleDelayed: RuleDelayed,
+    	ruluhar: ruluhar,
+    	rx: rx,
+    	Sacute: Sacute,
+    	sacute: sacute,
+    	sbquo: sbquo,
+    	scap: scap,
+    	Scaron: Scaron,
+    	scaron: scaron,
+    	Sc: Sc,
+    	sc: sc,
+    	sccue: sccue,
+    	sce: sce,
+    	scE: scE,
+    	Scedil: Scedil,
+    	scedil: scedil,
+    	Scirc: Scirc,
+    	scirc: scirc,
+    	scnap: scnap,
+    	scnE: scnE,
+    	scnsim: scnsim,
+    	scpolint: scpolint,
+    	scsim: scsim,
+    	Scy: Scy,
+    	scy: scy,
+    	sdotb: sdotb,
+    	sdot: sdot,
+    	sdote: sdote,
+    	searhk: searhk,
+    	searr: searr,
+    	seArr: seArr,
+    	searrow: searrow,
+    	sect: sect,
+    	semi: semi,
+    	seswar: seswar,
+    	setminus: setminus,
+    	setmn: setmn,
+    	sext: sext,
+    	Sfr: Sfr,
+    	sfr: sfr,
+    	sfrown: sfrown,
+    	sharp: sharp,
+    	SHCHcy: SHCHcy,
+    	shchcy: shchcy,
+    	SHcy: SHcy,
+    	shcy: shcy,
+    	ShortDownArrow: ShortDownArrow,
+    	ShortLeftArrow: ShortLeftArrow,
+    	shortmid: shortmid,
+    	shortparallel: shortparallel,
+    	ShortRightArrow: ShortRightArrow,
+    	ShortUpArrow: ShortUpArrow,
+    	shy: shy,
+    	Sigma: Sigma,
+    	sigma: sigma,
+    	sigmaf: sigmaf,
+    	sigmav: sigmav,
+    	sim: sim,
+    	simdot: simdot,
+    	sime: sime,
+    	simeq: simeq,
+    	simg: simg,
+    	simgE: simgE,
+    	siml: siml,
+    	simlE: simlE,
+    	simne: simne,
+    	simplus: simplus,
+    	simrarr: simrarr,
+    	slarr: slarr,
+    	SmallCircle: SmallCircle,
+    	smallsetminus: smallsetminus,
+    	smashp: smashp,
+    	smeparsl: smeparsl,
+    	smid: smid,
+    	smile: smile,
+    	smt: smt,
+    	smte: smte,
+    	smtes: smtes,
+    	SOFTcy: SOFTcy,
+    	softcy: softcy,
+    	solbar: solbar,
+    	solb: solb,
+    	sol: sol,
+    	Sopf: Sopf,
+    	sopf: sopf,
+    	spades: spades,
+    	spadesuit: spadesuit,
+    	spar: spar,
+    	sqcap: sqcap,
+    	sqcaps: sqcaps,
+    	sqcup: sqcup,
+    	sqcups: sqcups,
+    	Sqrt: Sqrt,
+    	sqsub: sqsub,
+    	sqsube: sqsube,
+    	sqsubset: sqsubset,
+    	sqsubseteq: sqsubseteq,
+    	sqsup: sqsup,
+    	sqsupe: sqsupe,
+    	sqsupset: sqsupset,
+    	sqsupseteq: sqsupseteq,
+    	square: square,
+    	Square: Square,
+    	SquareIntersection: SquareIntersection,
+    	SquareSubset: SquareSubset,
+    	SquareSubsetEqual: SquareSubsetEqual,
+    	SquareSuperset: SquareSuperset,
+    	SquareSupersetEqual: SquareSupersetEqual,
+    	SquareUnion: SquareUnion,
+    	squarf: squarf,
+    	squ: squ,
+    	squf: squf,
+    	srarr: srarr,
+    	Sscr: Sscr,
+    	sscr: sscr,
+    	ssetmn: ssetmn,
+    	ssmile: ssmile,
+    	sstarf: sstarf,
+    	Star: Star,
+    	star: star,
+    	starf: starf,
+    	straightepsilon: straightepsilon,
+    	straightphi: straightphi,
+    	strns: strns,
+    	sub: sub,
+    	Sub: Sub,
+    	subdot: subdot,
+    	subE: subE,
+    	sube: sube,
+    	subedot: subedot,
+    	submult: submult,
+    	subnE: subnE,
+    	subne: subne,
+    	subplus: subplus,
+    	subrarr: subrarr,
+    	subset: subset,
+    	Subset: Subset,
+    	subseteq: subseteq,
+    	subseteqq: subseteqq,
+    	SubsetEqual: SubsetEqual,
+    	subsetneq: subsetneq,
+    	subsetneqq: subsetneqq,
+    	subsim: subsim,
+    	subsub: subsub,
+    	subsup: subsup,
+    	succapprox: succapprox,
+    	succ: succ,
+    	succcurlyeq: succcurlyeq,
+    	Succeeds: Succeeds,
+    	SucceedsEqual: SucceedsEqual,
+    	SucceedsSlantEqual: SucceedsSlantEqual,
+    	SucceedsTilde: SucceedsTilde,
+    	succeq: succeq,
+    	succnapprox: succnapprox,
+    	succneqq: succneqq,
+    	succnsim: succnsim,
+    	succsim: succsim,
+    	SuchThat: SuchThat,
+    	sum: sum,
+    	Sum: Sum,
+    	sung: sung,
+    	sup1: sup1,
+    	sup2: sup2,
+    	sup3: sup3,
+    	sup: sup,
+    	Sup: Sup,
+    	supdot: supdot,
+    	supdsub: supdsub,
+    	supE: supE,
+    	supe: supe,
+    	supedot: supedot,
+    	Superset: Superset,
+    	SupersetEqual: SupersetEqual,
+    	suphsol: suphsol,
+    	suphsub: suphsub,
+    	suplarr: suplarr,
+    	supmult: supmult,
+    	supnE: supnE,
+    	supne: supne,
+    	supplus: supplus,
+    	supset: supset,
+    	Supset: Supset,
+    	supseteq: supseteq,
+    	supseteqq: supseteqq,
+    	supsetneq: supsetneq,
+    	supsetneqq: supsetneqq,
+    	supsim: supsim,
+    	supsub: supsub,
+    	supsup: supsup,
+    	swarhk: swarhk,
+    	swarr: swarr,
+    	swArr: swArr,
+    	swarrow: swarrow,
+    	swnwar: swnwar,
+    	szlig: szlig,
+    	Tab: Tab,
+    	target: target,
+    	Tau: Tau,
+    	tau: tau,
+    	tbrk: tbrk,
+    	Tcaron: Tcaron,
+    	tcaron: tcaron,
+    	Tcedil: Tcedil,
+    	tcedil: tcedil,
+    	Tcy: Tcy,
+    	tcy: tcy,
+    	tdot: tdot,
+    	telrec: telrec,
+    	Tfr: Tfr,
+    	tfr: tfr,
+    	there4: there4,
+    	therefore: therefore,
+    	Therefore: Therefore,
+    	Theta: Theta,
+    	theta: theta,
+    	thetasym: thetasym,
+    	thetav: thetav,
+    	thickapprox: thickapprox,
+    	thicksim: thicksim,
+    	ThickSpace: ThickSpace,
+    	ThinSpace: ThinSpace,
+    	thinsp: thinsp,
+    	thkap: thkap,
+    	thksim: thksim,
+    	THORN: THORN,
+    	thorn: thorn,
+    	tilde: tilde,
+    	Tilde: Tilde,
+    	TildeEqual: TildeEqual,
+    	TildeFullEqual: TildeFullEqual,
+    	TildeTilde: TildeTilde,
+    	timesbar: timesbar,
+    	timesb: timesb,
+    	times: times,
+    	timesd: timesd,
+    	tint: tint,
+    	toea: toea,
+    	topbot: topbot,
+    	topcir: topcir,
+    	top: top,
+    	Topf: Topf,
+    	topf: topf,
+    	topfork: topfork,
+    	tosa: tosa,
+    	tprime: tprime,
+    	trade: trade,
+    	TRADE: TRADE,
+    	triangle: triangle,
+    	triangledown: triangledown,
+    	triangleleft: triangleleft,
+    	trianglelefteq: trianglelefteq,
+    	triangleq: triangleq,
+    	triangleright: triangleright,
+    	trianglerighteq: trianglerighteq,
+    	tridot: tridot,
+    	trie: trie,
+    	triminus: triminus,
+    	TripleDot: TripleDot,
+    	triplus: triplus,
+    	trisb: trisb,
+    	tritime: tritime,
+    	trpezium: trpezium,
+    	Tscr: Tscr,
+    	tscr: tscr,
+    	TScy: TScy,
+    	tscy: tscy,
+    	TSHcy: TSHcy,
+    	tshcy: tshcy,
+    	Tstrok: Tstrok,
+    	tstrok: tstrok,
+    	twixt: twixt,
+    	twoheadleftarrow: twoheadleftarrow,
+    	twoheadrightarrow: twoheadrightarrow,
+    	Uacute: Uacute,
+    	uacute: uacute,
+    	uarr: uarr,
+    	Uarr: Uarr,
+    	uArr: uArr,
+    	Uarrocir: Uarrocir,
+    	Ubrcy: Ubrcy,
+    	ubrcy: ubrcy,
+    	Ubreve: Ubreve,
+    	ubreve: ubreve,
+    	Ucirc: Ucirc,
+    	ucirc: ucirc,
+    	Ucy: Ucy,
+    	ucy: ucy,
+    	udarr: udarr,
+    	Udblac: Udblac,
+    	udblac: udblac,
+    	udhar: udhar,
+    	ufisht: ufisht,
+    	Ufr: Ufr,
+    	ufr: ufr,
+    	Ugrave: Ugrave,
+    	ugrave: ugrave,
+    	uHar: uHar,
+    	uharl: uharl,
+    	uharr: uharr,
+    	uhblk: uhblk,
+    	ulcorn: ulcorn,
+    	ulcorner: ulcorner,
+    	ulcrop: ulcrop,
+    	ultri: ultri,
+    	Umacr: Umacr,
+    	umacr: umacr,
+    	uml: uml,
+    	UnderBar: UnderBar,
+    	UnderBrace: UnderBrace,
+    	UnderBracket: UnderBracket,
+    	UnderParenthesis: UnderParenthesis,
+    	Union: Union,
+    	UnionPlus: UnionPlus,
+    	Uogon: Uogon,
+    	uogon: uogon,
+    	Uopf: Uopf,
+    	uopf: uopf,
+    	UpArrowBar: UpArrowBar,
+    	uparrow: uparrow,
+    	UpArrow: UpArrow,
+    	Uparrow: Uparrow,
+    	UpArrowDownArrow: UpArrowDownArrow,
+    	updownarrow: updownarrow,
+    	UpDownArrow: UpDownArrow,
+    	Updownarrow: Updownarrow,
+    	UpEquilibrium: UpEquilibrium,
+    	upharpoonleft: upharpoonleft,
+    	upharpoonright: upharpoonright,
+    	uplus: uplus,
+    	UpperLeftArrow: UpperLeftArrow,
+    	UpperRightArrow: UpperRightArrow,
+    	upsi: upsi,
+    	Upsi: Upsi,
+    	upsih: upsih,
+    	Upsilon: Upsilon,
+    	upsilon: upsilon,
+    	UpTeeArrow: UpTeeArrow,
+    	UpTee: UpTee,
+    	upuparrows: upuparrows,
+    	urcorn: urcorn,
+    	urcorner: urcorner,
+    	urcrop: urcrop,
+    	Uring: Uring,
+    	uring: uring,
+    	urtri: urtri,
+    	Uscr: Uscr,
+    	uscr: uscr,
+    	utdot: utdot,
+    	Utilde: Utilde,
+    	utilde: utilde,
+    	utri: utri,
+    	utrif: utrif,
+    	uuarr: uuarr,
+    	Uuml: Uuml,
+    	uuml: uuml,
+    	uwangle: uwangle,
+    	vangrt: vangrt,
+    	varepsilon: varepsilon,
+    	varkappa: varkappa,
+    	varnothing: varnothing,
+    	varphi: varphi,
+    	varpi: varpi,
+    	varpropto: varpropto,
+    	varr: varr,
+    	vArr: vArr,
+    	varrho: varrho,
+    	varsigma: varsigma,
+    	varsubsetneq: varsubsetneq,
+    	varsubsetneqq: varsubsetneqq,
+    	varsupsetneq: varsupsetneq,
+    	varsupsetneqq: varsupsetneqq,
+    	vartheta: vartheta,
+    	vartriangleleft: vartriangleleft,
+    	vartriangleright: vartriangleright,
+    	vBar: vBar,
+    	Vbar: Vbar,
+    	vBarv: vBarv,
+    	Vcy: Vcy,
+    	vcy: vcy,
+    	vdash: vdash,
+    	vDash: vDash,
+    	Vdash: Vdash,
+    	VDash: VDash,
+    	Vdashl: Vdashl,
+    	veebar: veebar,
+    	vee: vee,
+    	Vee: Vee,
+    	veeeq: veeeq,
+    	vellip: vellip,
+    	verbar: verbar,
+    	Verbar: Verbar,
+    	vert: vert,
+    	Vert: Vert,
+    	VerticalBar: VerticalBar,
+    	VerticalLine: VerticalLine,
+    	VerticalSeparator: VerticalSeparator,
+    	VerticalTilde: VerticalTilde,
+    	VeryThinSpace: VeryThinSpace,
+    	Vfr: Vfr,
+    	vfr: vfr,
+    	vltri: vltri,
+    	vnsub: vnsub,
+    	vnsup: vnsup,
+    	Vopf: Vopf,
+    	vopf: vopf,
+    	vprop: vprop,
+    	vrtri: vrtri,
+    	Vscr: Vscr,
+    	vscr: vscr,
+    	vsubnE: vsubnE,
+    	vsubne: vsubne,
+    	vsupnE: vsupnE,
+    	vsupne: vsupne,
+    	Vvdash: Vvdash,
+    	vzigzag: vzigzag,
+    	Wcirc: Wcirc,
+    	wcirc: wcirc,
+    	wedbar: wedbar,
+    	wedge: wedge,
+    	Wedge: Wedge,
+    	wedgeq: wedgeq,
+    	weierp: weierp,
+    	Wfr: Wfr,
+    	wfr: wfr,
+    	Wopf: Wopf,
+    	wopf: wopf,
+    	wp: wp,
+    	wr: wr,
+    	wreath: wreath,
+    	Wscr: Wscr,
+    	wscr: wscr,
+    	xcap: xcap,
+    	xcirc: xcirc,
+    	xcup: xcup,
+    	xdtri: xdtri,
+    	Xfr: Xfr,
+    	xfr: xfr,
+    	xharr: xharr,
+    	xhArr: xhArr,
+    	Xi: Xi,
+    	xi: xi,
+    	xlarr: xlarr,
+    	xlArr: xlArr,
+    	xmap: xmap,
+    	xnis: xnis,
+    	xodot: xodot,
+    	Xopf: Xopf,
+    	xopf: xopf,
+    	xoplus: xoplus,
+    	xotime: xotime,
+    	xrarr: xrarr,
+    	xrArr: xrArr,
+    	Xscr: Xscr,
+    	xscr: xscr,
+    	xsqcup: xsqcup,
+    	xuplus: xuplus,
+    	xutri: xutri,
+    	xvee: xvee,
+    	xwedge: xwedge,
+    	Yacute: Yacute,
+    	yacute: yacute,
+    	YAcy: YAcy,
+    	yacy: yacy,
+    	Ycirc: Ycirc,
+    	ycirc: ycirc,
+    	Ycy: Ycy,
+    	ycy: ycy,
+    	yen: yen,
+    	Yfr: Yfr,
+    	yfr: yfr,
+    	YIcy: YIcy,
+    	yicy: yicy,
+    	Yopf: Yopf,
+    	yopf: yopf,
+    	Yscr: Yscr,
+    	yscr: yscr,
+    	YUcy: YUcy,
+    	yucy: yucy,
+    	yuml: yuml,
+    	Yuml: Yuml,
+    	Zacute: Zacute,
+    	zacute: zacute,
+    	Zcaron: Zcaron,
+    	zcaron: zcaron,
+    	Zcy: Zcy,
+    	zcy: zcy,
+    	Zdot: Zdot,
+    	zdot: zdot,
+    	zeetrf: zeetrf,
+    	ZeroWidthSpace: ZeroWidthSpace,
+    	Zeta: Zeta,
+    	zeta: zeta,
+    	zfr: zfr,
+    	Zfr: Zfr,
+    	ZHcy: ZHcy,
+    	zhcy: zhcy,
+    	zigrarr: zigrarr,
+    	zopf: zopf,
+    	Zopf: Zopf,
+    	Zscr: Zscr,
+    	zscr: zscr,
+    	zwj: zwj,
+    	zwnj: zwnj
+    };
+
+    var entities$1 = /*#__PURE__*/Object.freeze({
+        __proto__: null,
+        Aacute: Aacute,
+        aacute: aacute,
+        Abreve: Abreve,
+        abreve: abreve,
+        ac: ac,
+        acd: acd,
+        acE: acE,
+        Acirc: Acirc,
+        acirc: acirc,
+        acute: acute,
+        Acy: Acy,
+        acy: acy,
+        AElig: AElig,
+        aelig: aelig,
+        af: af,
+        Afr: Afr,
+        afr: afr,
+        Agrave: Agrave,
+        agrave: agrave,
+        alefsym: alefsym,
+        aleph: aleph,
+        Alpha: Alpha,
+        alpha: alpha,
+        Amacr: Amacr,
+        amacr: amacr,
+        amalg: amalg,
+        amp: amp,
+        AMP: AMP,
+        andand: andand,
+        And: And,
+        and: and,
+        andd: andd,
+        andslope: andslope,
+        andv: andv,
+        ang: ang,
+        ange: ange,
+        angle: angle,
+        angmsdaa: angmsdaa,
+        angmsdab: angmsdab,
+        angmsdac: angmsdac,
+        angmsdad: angmsdad,
+        angmsdae: angmsdae,
+        angmsdaf: angmsdaf,
+        angmsdag: angmsdag,
+        angmsdah: angmsdah,
+        angmsd: angmsd,
+        angrt: angrt,
+        angrtvb: angrtvb,
+        angrtvbd: angrtvbd,
+        angsph: angsph,
+        angst: angst,
+        angzarr: angzarr,
+        Aogon: Aogon,
+        aogon: aogon,
+        Aopf: Aopf,
+        aopf: aopf,
+        apacir: apacir,
+        ap: ap,
+        apE: apE,
+        ape: ape,
+        apid: apid,
+        apos: apos,
+        ApplyFunction: ApplyFunction,
+        approx: approx,
+        approxeq: approxeq,
+        Aring: Aring,
+        aring: aring,
+        Ascr: Ascr,
+        ascr: ascr,
+        Assign: Assign,
+        ast: ast,
+        asymp: asymp,
+        asympeq: asympeq,
+        Atilde: Atilde,
+        atilde: atilde,
+        Auml: Auml,
+        auml: auml,
+        awconint: awconint,
+        awint: awint,
+        backcong: backcong,
+        backepsilon: backepsilon,
+        backprime: backprime,
+        backsim: backsim,
+        backsimeq: backsimeq,
+        Backslash: Backslash,
+        Barv: Barv,
+        barvee: barvee,
+        barwed: barwed,
+        Barwed: Barwed,
+        barwedge: barwedge,
+        bbrk: bbrk,
+        bbrktbrk: bbrktbrk,
+        bcong: bcong,
+        Bcy: Bcy,
+        bcy: bcy,
+        bdquo: bdquo,
+        becaus: becaus,
+        because: because,
+        Because: Because,
+        bemptyv: bemptyv,
+        bepsi: bepsi,
+        bernou: bernou,
+        Bernoullis: Bernoullis,
+        Beta: Beta,
+        beta: beta,
+        beth: beth,
+        between: between,
+        Bfr: Bfr,
+        bfr: bfr,
+        bigcap: bigcap,
+        bigcirc: bigcirc,
+        bigcup: bigcup,
+        bigodot: bigodot,
+        bigoplus: bigoplus,
+        bigotimes: bigotimes,
+        bigsqcup: bigsqcup,
+        bigstar: bigstar,
+        bigtriangledown: bigtriangledown,
+        bigtriangleup: bigtriangleup,
+        biguplus: biguplus,
+        bigvee: bigvee,
+        bigwedge: bigwedge,
+        bkarow: bkarow,
+        blacklozenge: blacklozenge,
+        blacksquare: blacksquare,
+        blacktriangle: blacktriangle,
+        blacktriangledown: blacktriangledown,
+        blacktriangleleft: blacktriangleleft,
+        blacktriangleright: blacktriangleright,
+        blank: blank,
+        blk12: blk12,
+        blk14: blk14,
+        blk34: blk34,
+        block: block,
+        bne: bne,
+        bnequiv: bnequiv,
+        bNot: bNot,
+        bnot: bnot,
+        Bopf: Bopf,
+        bopf: bopf,
+        bot: bot,
+        bottom: bottom,
+        bowtie: bowtie,
+        boxbox: boxbox,
+        boxdl: boxdl,
+        boxdL: boxdL,
+        boxDl: boxDl,
+        boxDL: boxDL,
+        boxdr: boxdr,
+        boxdR: boxdR,
+        boxDr: boxDr,
+        boxDR: boxDR,
+        boxh: boxh,
+        boxH: boxH,
+        boxhd: boxhd,
+        boxHd: boxHd,
+        boxhD: boxhD,
+        boxHD: boxHD,
+        boxhu: boxhu,
+        boxHu: boxHu,
+        boxhU: boxhU,
+        boxHU: boxHU,
+        boxminus: boxminus,
+        boxplus: boxplus,
+        boxtimes: boxtimes,
+        boxul: boxul,
+        boxuL: boxuL,
+        boxUl: boxUl,
+        boxUL: boxUL,
+        boxur: boxur,
+        boxuR: boxuR,
+        boxUr: boxUr,
+        boxUR: boxUR,
+        boxv: boxv,
+        boxV: boxV,
+        boxvh: boxvh,
+        boxvH: boxvH,
+        boxVh: boxVh,
+        boxVH: boxVH,
+        boxvl: boxvl,
+        boxvL: boxvL,
+        boxVl: boxVl,
+        boxVL: boxVL,
+        boxvr: boxvr,
+        boxvR: boxvR,
+        boxVr: boxVr,
+        boxVR: boxVR,
+        bprime: bprime,
+        breve: breve,
+        Breve: Breve,
+        brvbar: brvbar,
+        bscr: bscr,
+        Bscr: Bscr,
+        bsemi: bsemi,
+        bsim: bsim,
+        bsime: bsime,
+        bsolb: bsolb,
+        bsol: bsol,
+        bsolhsub: bsolhsub,
+        bull: bull,
+        bullet: bullet,
+        bump: bump,
+        bumpE: bumpE,
+        bumpe: bumpe,
+        Bumpeq: Bumpeq,
+        bumpeq: bumpeq,
+        Cacute: Cacute,
+        cacute: cacute,
+        capand: capand,
+        capbrcup: capbrcup,
+        capcap: capcap,
+        cap: cap,
+        Cap: Cap,
+        capcup: capcup,
+        capdot: capdot,
+        CapitalDifferentialD: CapitalDifferentialD,
+        caps: caps,
+        caret: caret,
+        caron: caron,
+        Cayleys: Cayleys,
+        ccaps: ccaps,
+        Ccaron: Ccaron,
+        ccaron: ccaron,
+        Ccedil: Ccedil,
+        ccedil: ccedil,
+        Ccirc: Ccirc,
+        ccirc: ccirc,
+        Cconint: Cconint,
+        ccups: ccups,
+        ccupssm: ccupssm,
+        Cdot: Cdot,
+        cdot: cdot,
+        cedil: cedil,
+        Cedilla: Cedilla,
+        cemptyv: cemptyv,
+        cent: cent,
+        centerdot: centerdot,
+        CenterDot: CenterDot,
+        cfr: cfr,
+        Cfr: Cfr,
+        CHcy: CHcy,
+        chcy: chcy,
+        check: check,
+        checkmark: checkmark,
+        Chi: Chi,
+        chi: chi,
+        circ: circ,
+        circeq: circeq,
+        circlearrowleft: circlearrowleft,
+        circlearrowright: circlearrowright,
+        circledast: circledast,
+        circledcirc: circledcirc,
+        circleddash: circleddash,
+        CircleDot: CircleDot,
+        circledR: circledR,
+        circledS: circledS,
+        CircleMinus: CircleMinus,
+        CirclePlus: CirclePlus,
+        CircleTimes: CircleTimes,
+        cir: cir,
+        cirE: cirE,
+        cire: cire,
+        cirfnint: cirfnint,
+        cirmid: cirmid,
+        cirscir: cirscir,
+        ClockwiseContourIntegral: ClockwiseContourIntegral,
+        CloseCurlyDoubleQuote: CloseCurlyDoubleQuote,
+        CloseCurlyQuote: CloseCurlyQuote,
+        clubs: clubs,
+        clubsuit: clubsuit,
+        colon: colon,
+        Colon: Colon,
+        Colone: Colone,
+        colone: colone,
+        coloneq: coloneq,
+        comma: comma,
+        commat: commat,
+        comp: comp,
+        compfn: compfn,
+        complement: complement,
+        complexes: complexes,
+        cong: cong,
+        congdot: congdot,
+        Congruent: Congruent,
+        conint: conint,
+        Conint: Conint,
+        ContourIntegral: ContourIntegral,
+        copf: copf,
+        Copf: Copf,
+        coprod: coprod,
+        Coproduct: Coproduct,
+        copy: copy,
+        COPY: COPY,
+        copysr: copysr,
+        CounterClockwiseContourIntegral: CounterClockwiseContourIntegral,
+        crarr: crarr,
+        cross: cross,
+        Cross: Cross,
+        Cscr: Cscr,
+        cscr: cscr,
+        csub: csub,
+        csube: csube,
+        csup: csup,
+        csupe: csupe,
+        ctdot: ctdot,
+        cudarrl: cudarrl,
+        cudarrr: cudarrr,
+        cuepr: cuepr,
+        cuesc: cuesc,
+        cularr: cularr,
+        cularrp: cularrp,
+        cupbrcap: cupbrcap,
+        cupcap: cupcap,
+        CupCap: CupCap,
+        cup: cup,
+        Cup: Cup,
+        cupcup: cupcup,
+        cupdot: cupdot,
+        cupor: cupor,
+        cups: cups,
+        curarr: curarr,
+        curarrm: curarrm,
+        curlyeqprec: curlyeqprec,
+        curlyeqsucc: curlyeqsucc,
+        curlyvee: curlyvee,
+        curlywedge: curlywedge,
+        curren: curren,
+        curvearrowleft: curvearrowleft,
+        curvearrowright: curvearrowright,
+        cuvee: cuvee,
+        cuwed: cuwed,
+        cwconint: cwconint,
+        cwint: cwint,
+        cylcty: cylcty,
+        dagger: dagger,
+        Dagger: Dagger,
+        daleth: daleth,
+        darr: darr,
+        Darr: Darr,
+        dArr: dArr,
+        dash: dash,
+        Dashv: Dashv,
+        dashv: dashv,
+        dbkarow: dbkarow,
+        dblac: dblac,
+        Dcaron: Dcaron,
+        dcaron: dcaron,
+        Dcy: Dcy,
+        dcy: dcy,
+        ddagger: ddagger,
+        ddarr: ddarr,
+        DD: DD,
+        dd: dd,
+        DDotrahd: DDotrahd,
+        ddotseq: ddotseq,
+        deg: deg,
+        Del: Del,
+        Delta: Delta,
+        delta: delta,
+        demptyv: demptyv,
+        dfisht: dfisht,
+        Dfr: Dfr,
+        dfr: dfr,
+        dHar: dHar,
+        dharl: dharl,
+        dharr: dharr,
+        DiacriticalAcute: DiacriticalAcute,
+        DiacriticalDot: DiacriticalDot,
+        DiacriticalDoubleAcute: DiacriticalDoubleAcute,
+        DiacriticalGrave: DiacriticalGrave,
+        DiacriticalTilde: DiacriticalTilde,
+        diam: diam,
+        diamond: diamond,
+        Diamond: Diamond,
+        diamondsuit: diamondsuit,
+        diams: diams,
+        die: die,
+        DifferentialD: DifferentialD,
+        digamma: digamma,
+        disin: disin,
+        div: div,
+        divide: divide,
+        divideontimes: divideontimes,
+        divonx: divonx,
+        DJcy: DJcy,
+        djcy: djcy,
+        dlcorn: dlcorn,
+        dlcrop: dlcrop,
+        dollar: dollar,
+        Dopf: Dopf,
+        dopf: dopf,
+        Dot: Dot,
+        dot: dot,
+        DotDot: DotDot,
+        doteq: doteq,
+        doteqdot: doteqdot,
+        DotEqual: DotEqual,
+        dotminus: dotminus,
+        dotplus: dotplus,
+        dotsquare: dotsquare,
+        doublebarwedge: doublebarwedge,
+        DoubleContourIntegral: DoubleContourIntegral,
+        DoubleDot: DoubleDot,
+        DoubleDownArrow: DoubleDownArrow,
+        DoubleLeftArrow: DoubleLeftArrow,
+        DoubleLeftRightArrow: DoubleLeftRightArrow,
+        DoubleLeftTee: DoubleLeftTee,
+        DoubleLongLeftArrow: DoubleLongLeftArrow,
+        DoubleLongLeftRightArrow: DoubleLongLeftRightArrow,
+        DoubleLongRightArrow: DoubleLongRightArrow,
+        DoubleRightArrow: DoubleRightArrow,
+        DoubleRightTee: DoubleRightTee,
+        DoubleUpArrow: DoubleUpArrow,
+        DoubleUpDownArrow: DoubleUpDownArrow,
+        DoubleVerticalBar: DoubleVerticalBar,
+        DownArrowBar: DownArrowBar,
+        downarrow: downarrow,
+        DownArrow: DownArrow,
+        Downarrow: Downarrow,
+        DownArrowUpArrow: DownArrowUpArrow,
+        DownBreve: DownBreve,
+        downdownarrows: downdownarrows,
+        downharpoonleft: downharpoonleft,
+        downharpoonright: downharpoonright,
+        DownLeftRightVector: DownLeftRightVector,
+        DownLeftTeeVector: DownLeftTeeVector,
+        DownLeftVectorBar: DownLeftVectorBar,
+        DownLeftVector: DownLeftVector,
+        DownRightTeeVector: DownRightTeeVector,
+        DownRightVectorBar: DownRightVectorBar,
+        DownRightVector: DownRightVector,
+        DownTeeArrow: DownTeeArrow,
+        DownTee: DownTee,
+        drbkarow: drbkarow,
+        drcorn: drcorn,
+        drcrop: drcrop,
+        Dscr: Dscr,
+        dscr: dscr,
+        DScy: DScy,
+        dscy: dscy,
+        dsol: dsol,
+        Dstrok: Dstrok,
+        dstrok: dstrok,
+        dtdot: dtdot,
+        dtri: dtri,
+        dtrif: dtrif,
+        duarr: duarr,
+        duhar: duhar,
+        dwangle: dwangle,
+        DZcy: DZcy,
+        dzcy: dzcy,
+        dzigrarr: dzigrarr,
+        Eacute: Eacute,
+        eacute: eacute,
+        easter: easter,
+        Ecaron: Ecaron,
+        ecaron: ecaron,
+        Ecirc: Ecirc,
+        ecirc: ecirc,
+        ecir: ecir,
+        ecolon: ecolon,
+        Ecy: Ecy,
+        ecy: ecy,
+        eDDot: eDDot,
+        Edot: Edot,
+        edot: edot,
+        eDot: eDot,
+        ee: ee,
+        efDot: efDot,
+        Efr: Efr,
+        efr: efr,
+        eg: eg,
+        Egrave: Egrave,
+        egrave: egrave,
+        egs: egs,
+        egsdot: egsdot,
+        el: el,
+        Element: Element,
+        elinters: elinters,
+        ell: ell,
+        els: els,
+        elsdot: elsdot,
+        Emacr: Emacr,
+        emacr: emacr,
+        empty: empty,
+        emptyset: emptyset,
+        EmptySmallSquare: EmptySmallSquare,
+        emptyv: emptyv,
+        EmptyVerySmallSquare: EmptyVerySmallSquare,
+        emsp13: emsp13,
+        emsp14: emsp14,
+        emsp: emsp,
+        ENG: ENG,
+        eng: eng,
+        ensp: ensp,
+        Eogon: Eogon,
+        eogon: eogon,
+        Eopf: Eopf,
+        eopf: eopf,
+        epar: epar,
+        eparsl: eparsl,
+        eplus: eplus,
+        epsi: epsi,
+        Epsilon: Epsilon,
+        epsilon: epsilon,
+        epsiv: epsiv,
+        eqcirc: eqcirc,
+        eqcolon: eqcolon,
+        eqsim: eqsim,
+        eqslantgtr: eqslantgtr,
+        eqslantless: eqslantless,
+        Equal: Equal,
+        equals: equals,
+        EqualTilde: EqualTilde,
+        equest: equest,
+        Equilibrium: Equilibrium,
+        equiv: equiv,
+        equivDD: equivDD,
+        eqvparsl: eqvparsl,
+        erarr: erarr,
+        erDot: erDot,
+        escr: escr,
+        Escr: Escr,
+        esdot: esdot,
+        Esim: Esim,
+        esim: esim,
+        Eta: Eta,
+        eta: eta,
+        ETH: ETH,
+        eth: eth,
+        Euml: Euml,
+        euml: euml,
+        euro: euro,
+        excl: excl,
+        exist: exist,
+        Exists: Exists,
+        expectation: expectation,
+        exponentiale: exponentiale,
+        ExponentialE: ExponentialE,
+        fallingdotseq: fallingdotseq,
+        Fcy: Fcy,
+        fcy: fcy,
+        female: female,
+        ffilig: ffilig,
+        fflig: fflig,
+        ffllig: ffllig,
+        Ffr: Ffr,
+        ffr: ffr,
+        filig: filig,
+        FilledSmallSquare: FilledSmallSquare,
+        FilledVerySmallSquare: FilledVerySmallSquare,
+        fjlig: fjlig,
+        flat: flat,
+        fllig: fllig,
+        fltns: fltns,
+        fnof: fnof,
+        Fopf: Fopf,
+        fopf: fopf,
+        forall: forall,
+        ForAll: ForAll,
+        fork: fork,
+        forkv: forkv,
+        Fouriertrf: Fouriertrf,
+        fpartint: fpartint,
+        frac12: frac12,
+        frac13: frac13,
+        frac14: frac14,
+        frac15: frac15,
+        frac16: frac16,
+        frac18: frac18,
+        frac23: frac23,
+        frac25: frac25,
+        frac34: frac34,
+        frac35: frac35,
+        frac38: frac38,
+        frac45: frac45,
+        frac56: frac56,
+        frac58: frac58,
+        frac78: frac78,
+        frasl: frasl,
+        frown: frown,
+        fscr: fscr,
+        Fscr: Fscr,
+        gacute: gacute,
+        Gamma: Gamma,
+        gamma: gamma,
+        Gammad: Gammad,
+        gammad: gammad,
+        gap: gap,
+        Gbreve: Gbreve,
+        gbreve: gbreve,
+        Gcedil: Gcedil,
+        Gcirc: Gcirc,
+        gcirc: gcirc,
+        Gcy: Gcy,
+        gcy: gcy,
+        Gdot: Gdot,
+        gdot: gdot,
+        ge: ge,
+        gE: gE,
+        gEl: gEl,
+        gel: gel,
+        geq: geq,
+        geqq: geqq,
+        geqslant: geqslant,
+        gescc: gescc,
+        ges: ges,
+        gesdot: gesdot,
+        gesdoto: gesdoto,
+        gesdotol: gesdotol,
+        gesl: gesl,
+        gesles: gesles,
+        Gfr: Gfr,
+        gfr: gfr,
+        gg: gg,
+        Gg: Gg,
+        ggg: ggg,
+        gimel: gimel,
+        GJcy: GJcy,
+        gjcy: gjcy,
+        gla: gla,
+        gl: gl,
+        glE: glE,
+        glj: glj,
+        gnap: gnap,
+        gnapprox: gnapprox,
+        gne: gne,
+        gnE: gnE,
+        gneq: gneq,
+        gneqq: gneqq,
+        gnsim: gnsim,
+        Gopf: Gopf,
+        gopf: gopf,
+        grave: grave,
+        GreaterEqual: GreaterEqual,
+        GreaterEqualLess: GreaterEqualLess,
+        GreaterFullEqual: GreaterFullEqual,
+        GreaterGreater: GreaterGreater,
+        GreaterLess: GreaterLess,
+        GreaterSlantEqual: GreaterSlantEqual,
+        GreaterTilde: GreaterTilde,
+        Gscr: Gscr,
+        gscr: gscr,
+        gsim: gsim,
+        gsime: gsime,
+        gsiml: gsiml,
+        gtcc: gtcc,
+        gtcir: gtcir,
+        gt: gt,
+        GT: GT,
+        Gt: Gt,
+        gtdot: gtdot,
+        gtlPar: gtlPar,
+        gtquest: gtquest,
+        gtrapprox: gtrapprox,
+        gtrarr: gtrarr,
+        gtrdot: gtrdot,
+        gtreqless: gtreqless,
+        gtreqqless: gtreqqless,
+        gtrless: gtrless,
+        gtrsim: gtrsim,
+        gvertneqq: gvertneqq,
+        gvnE: gvnE,
+        Hacek: Hacek,
+        hairsp: hairsp,
+        half: half,
+        hamilt: hamilt,
+        HARDcy: HARDcy,
+        hardcy: hardcy,
+        harrcir: harrcir,
+        harr: harr,
+        hArr: hArr,
+        harrw: harrw,
+        Hat: Hat,
+        hbar: hbar,
+        Hcirc: Hcirc,
+        hcirc: hcirc,
+        hearts: hearts,
+        heartsuit: heartsuit,
+        hellip: hellip,
+        hercon: hercon,
+        hfr: hfr,
+        Hfr: Hfr,
+        HilbertSpace: HilbertSpace,
+        hksearow: hksearow,
+        hkswarow: hkswarow,
+        hoarr: hoarr,
+        homtht: homtht,
+        hookleftarrow: hookleftarrow,
+        hookrightarrow: hookrightarrow,
+        hopf: hopf,
+        Hopf: Hopf,
+        horbar: horbar,
+        HorizontalLine: HorizontalLine,
+        hscr: hscr,
+        Hscr: Hscr,
+        hslash: hslash,
+        Hstrok: Hstrok,
+        hstrok: hstrok,
+        HumpDownHump: HumpDownHump,
+        HumpEqual: HumpEqual,
+        hybull: hybull,
+        hyphen: hyphen,
+        Iacute: Iacute,
+        iacute: iacute,
+        ic: ic,
+        Icirc: Icirc,
+        icirc: icirc,
+        Icy: Icy,
+        icy: icy,
+        Idot: Idot,
+        IEcy: IEcy,
+        iecy: iecy,
+        iexcl: iexcl,
+        iff: iff,
+        ifr: ifr,
+        Ifr: Ifr,
+        Igrave: Igrave,
+        igrave: igrave,
+        ii: ii,
+        iiiint: iiiint,
+        iiint: iiint,
+        iinfin: iinfin,
+        iiota: iiota,
+        IJlig: IJlig,
+        ijlig: ijlig,
+        Imacr: Imacr,
+        imacr: imacr,
+        image: image,
+        ImaginaryI: ImaginaryI,
+        imagline: imagline,
+        imagpart: imagpart,
+        imath: imath,
+        Im: Im,
+        imof: imof,
+        imped: imped,
+        Implies: Implies,
+        incare: incare,
+        infin: infin,
+        infintie: infintie,
+        inodot: inodot,
+        intcal: intcal,
+        int: int,
+        Int: Int,
+        integers: integers,
+        Integral: Integral,
+        intercal: intercal,
+        Intersection: Intersection,
+        intlarhk: intlarhk,
+        intprod: intprod,
+        InvisibleComma: InvisibleComma,
+        InvisibleTimes: InvisibleTimes,
+        IOcy: IOcy,
+        iocy: iocy,
+        Iogon: Iogon,
+        iogon: iogon,
+        Iopf: Iopf,
+        iopf: iopf,
+        Iota: Iota,
+        iota: iota,
+        iprod: iprod,
+        iquest: iquest,
+        iscr: iscr,
+        Iscr: Iscr,
+        isin: isin,
+        isindot: isindot,
+        isinE: isinE,
+        isins: isins,
+        isinsv: isinsv,
+        isinv: isinv,
+        it: it,
+        Itilde: Itilde,
+        itilde: itilde,
+        Iukcy: Iukcy,
+        iukcy: iukcy,
+        Iuml: Iuml,
+        iuml: iuml,
+        Jcirc: Jcirc,
+        jcirc: jcirc,
+        Jcy: Jcy,
+        jcy: jcy,
+        Jfr: Jfr,
+        jfr: jfr,
+        jmath: jmath,
+        Jopf: Jopf,
+        jopf: jopf,
+        Jscr: Jscr,
+        jscr: jscr,
+        Jsercy: Jsercy,
+        jsercy: jsercy,
+        Jukcy: Jukcy,
+        jukcy: jukcy,
+        Kappa: Kappa,
+        kappa: kappa,
+        kappav: kappav,
+        Kcedil: Kcedil,
+        kcedil: kcedil,
+        Kcy: Kcy,
+        kcy: kcy,
+        Kfr: Kfr,
+        kfr: kfr,
+        kgreen: kgreen,
+        KHcy: KHcy,
+        khcy: khcy,
+        KJcy: KJcy,
+        kjcy: kjcy,
+        Kopf: Kopf,
+        kopf: kopf,
+        Kscr: Kscr,
+        kscr: kscr,
+        lAarr: lAarr,
+        Lacute: Lacute,
+        lacute: lacute,
+        laemptyv: laemptyv,
+        lagran: lagran,
+        Lambda: Lambda,
+        lambda: lambda,
+        lang: lang,
+        Lang: Lang,
+        langd: langd,
+        langle: langle,
+        lap: lap,
+        Laplacetrf: Laplacetrf,
+        laquo: laquo,
+        larrb: larrb,
+        larrbfs: larrbfs,
+        larr: larr,
+        Larr: Larr,
+        lArr: lArr,
+        larrfs: larrfs,
+        larrhk: larrhk,
+        larrlp: larrlp,
+        larrpl: larrpl,
+        larrsim: larrsim,
+        larrtl: larrtl,
+        latail: latail,
+        lAtail: lAtail,
+        lat: lat,
+        late: late,
+        lates: lates,
+        lbarr: lbarr,
+        lBarr: lBarr,
+        lbbrk: lbbrk,
+        lbrace: lbrace,
+        lbrack: lbrack,
+        lbrke: lbrke,
+        lbrksld: lbrksld,
+        lbrkslu: lbrkslu,
+        Lcaron: Lcaron,
+        lcaron: lcaron,
+        Lcedil: Lcedil,
+        lcedil: lcedil,
+        lceil: lceil,
+        lcub: lcub,
+        Lcy: Lcy,
+        lcy: lcy,
+        ldca: ldca,
+        ldquo: ldquo,
+        ldquor: ldquor,
+        ldrdhar: ldrdhar,
+        ldrushar: ldrushar,
+        ldsh: ldsh,
+        le: le,
+        lE: lE,
+        LeftAngleBracket: LeftAngleBracket,
+        LeftArrowBar: LeftArrowBar,
+        leftarrow: leftarrow,
+        LeftArrow: LeftArrow,
+        Leftarrow: Leftarrow,
+        LeftArrowRightArrow: LeftArrowRightArrow,
+        leftarrowtail: leftarrowtail,
+        LeftCeiling: LeftCeiling,
+        LeftDoubleBracket: LeftDoubleBracket,
+        LeftDownTeeVector: LeftDownTeeVector,
+        LeftDownVectorBar: LeftDownVectorBar,
+        LeftDownVector: LeftDownVector,
+        LeftFloor: LeftFloor,
+        leftharpoondown: leftharpoondown,
+        leftharpoonup: leftharpoonup,
+        leftleftarrows: leftleftarrows,
+        leftrightarrow: leftrightarrow,
+        LeftRightArrow: LeftRightArrow,
+        Leftrightarrow: Leftrightarrow,
+        leftrightarrows: leftrightarrows,
+        leftrightharpoons: leftrightharpoons,
+        leftrightsquigarrow: leftrightsquigarrow,
+        LeftRightVector: LeftRightVector,
+        LeftTeeArrow: LeftTeeArrow,
+        LeftTee: LeftTee,
+        LeftTeeVector: LeftTeeVector,
+        leftthreetimes: leftthreetimes,
+        LeftTriangleBar: LeftTriangleBar,
+        LeftTriangle: LeftTriangle,
+        LeftTriangleEqual: LeftTriangleEqual,
+        LeftUpDownVector: LeftUpDownVector,
+        LeftUpTeeVector: LeftUpTeeVector,
+        LeftUpVectorBar: LeftUpVectorBar,
+        LeftUpVector: LeftUpVector,
+        LeftVectorBar: LeftVectorBar,
+        LeftVector: LeftVector,
+        lEg: lEg,
+        leg: leg,
+        leq: leq,
+        leqq: leqq,
+        leqslant: leqslant,
+        lescc: lescc,
+        les: les,
+        lesdot: lesdot,
+        lesdoto: lesdoto,
+        lesdotor: lesdotor,
+        lesg: lesg,
+        lesges: lesges,
+        lessapprox: lessapprox,
+        lessdot: lessdot,
+        lesseqgtr: lesseqgtr,
+        lesseqqgtr: lesseqqgtr,
+        LessEqualGreater: LessEqualGreater,
+        LessFullEqual: LessFullEqual,
+        LessGreater: LessGreater,
+        lessgtr: lessgtr,
+        LessLess: LessLess,
+        lesssim: lesssim,
+        LessSlantEqual: LessSlantEqual,
+        LessTilde: LessTilde,
+        lfisht: lfisht,
+        lfloor: lfloor,
+        Lfr: Lfr,
+        lfr: lfr,
+        lg: lg,
+        lgE: lgE,
+        lHar: lHar,
+        lhard: lhard,
+        lharu: lharu,
+        lharul: lharul,
+        lhblk: lhblk,
+        LJcy: LJcy,
+        ljcy: ljcy,
+        llarr: llarr,
+        ll: ll,
+        Ll: Ll,
+        llcorner: llcorner,
+        Lleftarrow: Lleftarrow,
+        llhard: llhard,
+        lltri: lltri,
+        Lmidot: Lmidot,
+        lmidot: lmidot,
+        lmoustache: lmoustache,
+        lmoust: lmoust,
+        lnap: lnap,
+        lnapprox: lnapprox,
+        lne: lne,
+        lnE: lnE,
+        lneq: lneq,
+        lneqq: lneqq,
+        lnsim: lnsim,
+        loang: loang,
+        loarr: loarr,
+        lobrk: lobrk,
+        longleftarrow: longleftarrow,
+        LongLeftArrow: LongLeftArrow,
+        Longleftarrow: Longleftarrow,
+        longleftrightarrow: longleftrightarrow,
+        LongLeftRightArrow: LongLeftRightArrow,
+        Longleftrightarrow: Longleftrightarrow,
+        longmapsto: longmapsto,
+        longrightarrow: longrightarrow,
+        LongRightArrow: LongRightArrow,
+        Longrightarrow: Longrightarrow,
+        looparrowleft: looparrowleft,
+        looparrowright: looparrowright,
+        lopar: lopar,
+        Lopf: Lopf,
+        lopf: lopf,
+        loplus: loplus,
+        lotimes: lotimes,
+        lowast: lowast,
+        lowbar: lowbar,
+        LowerLeftArrow: LowerLeftArrow,
+        LowerRightArrow: LowerRightArrow,
+        loz: loz,
+        lozenge: lozenge,
+        lozf: lozf,
+        lpar: lpar,
+        lparlt: lparlt,
+        lrarr: lrarr,
+        lrcorner: lrcorner,
+        lrhar: lrhar,
+        lrhard: lrhard,
+        lrm: lrm,
+        lrtri: lrtri,
+        lsaquo: lsaquo,
+        lscr: lscr,
+        Lscr: Lscr,
+        lsh: lsh,
+        Lsh: Lsh,
+        lsim: lsim,
+        lsime: lsime,
+        lsimg: lsimg,
+        lsqb: lsqb,
+        lsquo: lsquo,
+        lsquor: lsquor,
+        Lstrok: Lstrok,
+        lstrok: lstrok,
+        ltcc: ltcc,
+        ltcir: ltcir,
+        lt: lt,
+        LT: LT,
+        Lt: Lt,
+        ltdot: ltdot,
+        lthree: lthree,
+        ltimes: ltimes,
+        ltlarr: ltlarr,
+        ltquest: ltquest,
+        ltri: ltri,
+        ltrie: ltrie,
+        ltrif: ltrif,
+        ltrPar: ltrPar,
+        lurdshar: lurdshar,
+        luruhar: luruhar,
+        lvertneqq: lvertneqq,
+        lvnE: lvnE,
+        macr: macr,
+        male: male,
+        malt: malt,
+        maltese: maltese,
+        map: map,
+        mapsto: mapsto,
+        mapstodown: mapstodown,
+        mapstoleft: mapstoleft,
+        mapstoup: mapstoup,
+        marker: marker,
+        mcomma: mcomma,
+        Mcy: Mcy,
+        mcy: mcy,
+        mdash: mdash,
+        mDDot: mDDot,
+        measuredangle: measuredangle,
+        MediumSpace: MediumSpace,
+        Mellintrf: Mellintrf,
+        Mfr: Mfr,
+        mfr: mfr,
+        mho: mho,
+        micro: micro,
+        midast: midast,
+        midcir: midcir,
+        mid: mid,
+        middot: middot,
+        minusb: minusb,
+        minus: minus,
+        minusd: minusd,
+        minusdu: minusdu,
+        MinusPlus: MinusPlus,
+        mlcp: mlcp,
+        mldr: mldr,
+        mnplus: mnplus,
+        models: models,
+        Mopf: Mopf,
+        mopf: mopf,
+        mp: mp,
+        mscr: mscr,
+        Mscr: Mscr,
+        mstpos: mstpos,
+        Mu: Mu,
+        mu: mu,
+        multimap: multimap,
+        mumap: mumap,
+        nabla: nabla,
+        Nacute: Nacute,
+        nacute: nacute,
+        nang: nang,
+        nap: nap,
+        napE: napE,
+        napid: napid,
+        napos: napos,
+        napprox: napprox,
+        natural: natural,
+        naturals: naturals,
+        natur: natur,
+        nbsp: nbsp,
+        nbump: nbump,
+        nbumpe: nbumpe,
+        ncap: ncap,
+        Ncaron: Ncaron,
+        ncaron: ncaron,
+        Ncedil: Ncedil,
+        ncedil: ncedil,
+        ncong: ncong,
+        ncongdot: ncongdot,
+        ncup: ncup,
+        Ncy: Ncy,
+        ncy: ncy,
+        ndash: ndash,
+        nearhk: nearhk,
+        nearr: nearr,
+        neArr: neArr,
+        nearrow: nearrow,
+        ne: ne,
+        nedot: nedot,
+        NegativeMediumSpace: NegativeMediumSpace,
+        NegativeThickSpace: NegativeThickSpace,
+        NegativeThinSpace: NegativeThinSpace,
+        NegativeVeryThinSpace: NegativeVeryThinSpace,
+        nequiv: nequiv,
+        nesear: nesear,
+        nesim: nesim,
+        NestedGreaterGreater: NestedGreaterGreater,
+        NestedLessLess: NestedLessLess,
+        NewLine: NewLine,
+        nexist: nexist,
+        nexists: nexists,
+        Nfr: Nfr,
+        nfr: nfr,
+        ngE: ngE,
+        nge: nge,
+        ngeq: ngeq,
+        ngeqq: ngeqq,
+        ngeqslant: ngeqslant,
+        nges: nges,
+        nGg: nGg,
+        ngsim: ngsim,
+        nGt: nGt,
+        ngt: ngt,
+        ngtr: ngtr,
+        nGtv: nGtv,
+        nharr: nharr,
+        nhArr: nhArr,
+        nhpar: nhpar,
+        ni: ni,
+        nis: nis,
+        nisd: nisd,
+        niv: niv,
+        NJcy: NJcy,
+        njcy: njcy,
+        nlarr: nlarr,
+        nlArr: nlArr,
+        nldr: nldr,
+        nlE: nlE,
+        nle: nle,
+        nleftarrow: nleftarrow,
+        nLeftarrow: nLeftarrow,
+        nleftrightarrow: nleftrightarrow,
+        nLeftrightarrow: nLeftrightarrow,
+        nleq: nleq,
+        nleqq: nleqq,
+        nleqslant: nleqslant,
+        nles: nles,
+        nless: nless,
+        nLl: nLl,
+        nlsim: nlsim,
+        nLt: nLt,
+        nlt: nlt,
+        nltri: nltri,
+        nltrie: nltrie,
+        nLtv: nLtv,
+        nmid: nmid,
+        NoBreak: NoBreak,
+        NonBreakingSpace: NonBreakingSpace,
+        nopf: nopf,
+        Nopf: Nopf,
+        Not: Not,
+        not: not,
+        NotCongruent: NotCongruent,
+        NotCupCap: NotCupCap,
+        NotDoubleVerticalBar: NotDoubleVerticalBar,
+        NotElement: NotElement,
+        NotEqual: NotEqual,
+        NotEqualTilde: NotEqualTilde,
+        NotExists: NotExists,
+        NotGreater: NotGreater,
+        NotGreaterEqual: NotGreaterEqual,
+        NotGreaterFullEqual: NotGreaterFullEqual,
+        NotGreaterGreater: NotGreaterGreater,
+        NotGreaterLess: NotGreaterLess,
+        NotGreaterSlantEqual: NotGreaterSlantEqual,
+        NotGreaterTilde: NotGreaterTilde,
+        NotHumpDownHump: NotHumpDownHump,
+        NotHumpEqual: NotHumpEqual,
+        notin: notin,
+        notindot: notindot,
+        notinE: notinE,
+        notinva: notinva,
+        notinvb: notinvb,
+        notinvc: notinvc,
+        NotLeftTriangleBar: NotLeftTriangleBar,
+        NotLeftTriangle: NotLeftTriangle,
+        NotLeftTriangleEqual: NotLeftTriangleEqual,
+        NotLess: NotLess,
+        NotLessEqual: NotLessEqual,
+        NotLessGreater: NotLessGreater,
+        NotLessLess: NotLessLess,
+        NotLessSlantEqual: NotLessSlantEqual,
+        NotLessTilde: NotLessTilde,
+        NotNestedGreaterGreater: NotNestedGreaterGreater,
+        NotNestedLessLess: NotNestedLessLess,
+        notni: notni,
+        notniva: notniva,
+        notnivb: notnivb,
+        notnivc: notnivc,
+        NotPrecedes: NotPrecedes,
+        NotPrecedesEqual: NotPrecedesEqual,
+        NotPrecedesSlantEqual: NotPrecedesSlantEqual,
+        NotReverseElement: NotReverseElement,
+        NotRightTriangleBar: NotRightTriangleBar,
+        NotRightTriangle: NotRightTriangle,
+        NotRightTriangleEqual: NotRightTriangleEqual,
+        NotSquareSubset: NotSquareSubset,
+        NotSquareSubsetEqual: NotSquareSubsetEqual,
+        NotSquareSuperset: NotSquareSuperset,
+        NotSquareSupersetEqual: NotSquareSupersetEqual,
+        NotSubset: NotSubset,
+        NotSubsetEqual: NotSubsetEqual,
+        NotSucceeds: NotSucceeds,
+        NotSucceedsEqual: NotSucceedsEqual,
+        NotSucceedsSlantEqual: NotSucceedsSlantEqual,
+        NotSucceedsTilde: NotSucceedsTilde,
+        NotSuperset: NotSuperset,
+        NotSupersetEqual: NotSupersetEqual,
+        NotTilde: NotTilde,
+        NotTildeEqual: NotTildeEqual,
+        NotTildeFullEqual: NotTildeFullEqual,
+        NotTildeTilde: NotTildeTilde,
+        NotVerticalBar: NotVerticalBar,
+        nparallel: nparallel,
+        npar: npar,
+        nparsl: nparsl,
+        npart: npart,
+        npolint: npolint,
+        npr: npr,
+        nprcue: nprcue,
+        nprec: nprec,
+        npreceq: npreceq,
+        npre: npre,
+        nrarrc: nrarrc,
+        nrarr: nrarr,
+        nrArr: nrArr,
+        nrarrw: nrarrw,
+        nrightarrow: nrightarrow,
+        nRightarrow: nRightarrow,
+        nrtri: nrtri,
+        nrtrie: nrtrie,
+        nsc: nsc,
+        nsccue: nsccue,
+        nsce: nsce,
+        Nscr: Nscr,
+        nscr: nscr,
+        nshortmid: nshortmid,
+        nshortparallel: nshortparallel,
+        nsim: nsim,
+        nsime: nsime,
+        nsimeq: nsimeq,
+        nsmid: nsmid,
+        nspar: nspar,
+        nsqsube: nsqsube,
+        nsqsupe: nsqsupe,
+        nsub: nsub,
+        nsubE: nsubE,
+        nsube: nsube,
+        nsubset: nsubset,
+        nsubseteq: nsubseteq,
+        nsubseteqq: nsubseteqq,
+        nsucc: nsucc,
+        nsucceq: nsucceq,
+        nsup: nsup,
+        nsupE: nsupE,
+        nsupe: nsupe,
+        nsupset: nsupset,
+        nsupseteq: nsupseteq,
+        nsupseteqq: nsupseteqq,
+        ntgl: ntgl,
+        Ntilde: Ntilde,
+        ntilde: ntilde,
+        ntlg: ntlg,
+        ntriangleleft: ntriangleleft,
+        ntrianglelefteq: ntrianglelefteq,
+        ntriangleright: ntriangleright,
+        ntrianglerighteq: ntrianglerighteq,
+        Nu: Nu,
+        nu: nu,
+        num: num,
+        numero: numero,
+        numsp: numsp,
+        nvap: nvap,
+        nvdash: nvdash,
+        nvDash: nvDash,
+        nVdash: nVdash,
+        nVDash: nVDash,
+        nvge: nvge,
+        nvgt: nvgt,
+        nvHarr: nvHarr,
+        nvinfin: nvinfin,
+        nvlArr: nvlArr,
+        nvle: nvle,
+        nvlt: nvlt,
+        nvltrie: nvltrie,
+        nvrArr: nvrArr,
+        nvrtrie: nvrtrie,
+        nvsim: nvsim,
+        nwarhk: nwarhk,
+        nwarr: nwarr,
+        nwArr: nwArr,
+        nwarrow: nwarrow,
+        nwnear: nwnear,
+        Oacute: Oacute,
+        oacute: oacute,
+        oast: oast,
+        Ocirc: Ocirc,
+        ocirc: ocirc,
+        ocir: ocir,
+        Ocy: Ocy,
+        ocy: ocy,
+        odash: odash,
+        Odblac: Odblac,
+        odblac: odblac,
+        odiv: odiv,
+        odot: odot,
+        odsold: odsold,
+        OElig: OElig,
+        oelig: oelig,
+        ofcir: ofcir,
+        Ofr: Ofr,
+        ofr: ofr,
+        ogon: ogon,
+        Ograve: Ograve,
+        ograve: ograve,
+        ogt: ogt,
+        ohbar: ohbar,
+        ohm: ohm,
+        oint: oint,
+        olarr: olarr,
+        olcir: olcir,
+        olcross: olcross,
+        oline: oline,
+        olt: olt,
+        Omacr: Omacr,
+        omacr: omacr,
+        Omega: Omega,
+        omega: omega,
+        Omicron: Omicron,
+        omicron: omicron,
+        omid: omid,
+        ominus: ominus,
+        Oopf: Oopf,
+        oopf: oopf,
+        opar: opar,
+        OpenCurlyDoubleQuote: OpenCurlyDoubleQuote,
+        OpenCurlyQuote: OpenCurlyQuote,
+        operp: operp,
+        oplus: oplus,
+        orarr: orarr,
+        Or: Or,
+        or: or,
+        ord: ord,
+        order: order,
+        orderof: orderof,
+        ordf: ordf,
+        ordm: ordm,
+        origof: origof,
+        oror: oror,
+        orslope: orslope,
+        orv: orv,
+        oS: oS,
+        Oscr: Oscr,
+        oscr: oscr,
+        Oslash: Oslash,
+        oslash: oslash,
+        osol: osol,
+        Otilde: Otilde,
+        otilde: otilde,
+        otimesas: otimesas,
+        Otimes: Otimes,
+        otimes: otimes,
+        Ouml: Ouml,
+        ouml: ouml,
+        ovbar: ovbar,
+        OverBar: OverBar,
+        OverBrace: OverBrace,
+        OverBracket: OverBracket,
+        OverParenthesis: OverParenthesis,
+        para: para,
+        parallel: parallel,
+        par: par,
+        parsim: parsim,
+        parsl: parsl,
+        part: part,
+        PartialD: PartialD,
+        Pcy: Pcy,
+        pcy: pcy,
+        percnt: percnt,
+        period: period,
+        permil: permil,
+        perp: perp,
+        pertenk: pertenk,
+        Pfr: Pfr,
+        pfr: pfr,
+        Phi: Phi,
+        phi: phi,
+        phiv: phiv,
+        phmmat: phmmat,
+        phone: phone,
+        Pi: Pi,
+        pi: pi,
+        pitchfork: pitchfork,
+        piv: piv,
+        planck: planck,
+        planckh: planckh,
+        plankv: plankv,
+        plusacir: plusacir,
+        plusb: plusb,
+        pluscir: pluscir,
+        plus: plus,
+        plusdo: plusdo,
+        plusdu: plusdu,
+        pluse: pluse,
+        PlusMinus: PlusMinus,
+        plusmn: plusmn,
+        plussim: plussim,
+        plustwo: plustwo,
+        pm: pm,
+        Poincareplane: Poincareplane,
+        pointint: pointint,
+        popf: popf,
+        Popf: Popf,
+        pound: pound,
+        prap: prap,
+        Pr: Pr,
+        pr: pr,
+        prcue: prcue,
+        precapprox: precapprox,
+        prec: prec,
+        preccurlyeq: preccurlyeq,
+        Precedes: Precedes,
+        PrecedesEqual: PrecedesEqual,
+        PrecedesSlantEqual: PrecedesSlantEqual,
+        PrecedesTilde: PrecedesTilde,
+        preceq: preceq,
+        precnapprox: precnapprox,
+        precneqq: precneqq,
+        precnsim: precnsim,
+        pre: pre,
+        prE: prE,
+        precsim: precsim,
+        prime: prime,
+        Prime: Prime,
+        primes: primes,
+        prnap: prnap,
+        prnE: prnE,
+        prnsim: prnsim,
+        prod: prod,
+        Product: Product,
+        profalar: profalar,
+        profline: profline,
+        profsurf: profsurf,
+        prop: prop,
+        Proportional: Proportional,
+        Proportion: Proportion,
+        propto: propto,
+        prsim: prsim,
+        prurel: prurel,
+        Pscr: Pscr,
+        pscr: pscr,
+        Psi: Psi,
+        psi: psi,
+        puncsp: puncsp,
+        Qfr: Qfr,
+        qfr: qfr,
+        qint: qint,
+        qopf: qopf,
+        Qopf: Qopf,
+        qprime: qprime,
+        Qscr: Qscr,
+        qscr: qscr,
+        quaternions: quaternions,
+        quatint: quatint,
+        quest: quest,
+        questeq: questeq,
+        quot: quot,
+        QUOT: QUOT,
+        rAarr: rAarr,
+        race: race,
+        Racute: Racute,
+        racute: racute,
+        radic: radic,
+        raemptyv: raemptyv,
+        rang: rang,
+        Rang: Rang,
+        rangd: rangd,
+        range: range,
+        rangle: rangle,
+        raquo: raquo,
+        rarrap: rarrap,
+        rarrb: rarrb,
+        rarrbfs: rarrbfs,
+        rarrc: rarrc,
+        rarr: rarr,
+        Rarr: Rarr,
+        rArr: rArr,
+        rarrfs: rarrfs,
+        rarrhk: rarrhk,
+        rarrlp: rarrlp,
+        rarrpl: rarrpl,
+        rarrsim: rarrsim,
+        Rarrtl: Rarrtl,
+        rarrtl: rarrtl,
+        rarrw: rarrw,
+        ratail: ratail,
+        rAtail: rAtail,
+        ratio: ratio,
+        rationals: rationals,
+        rbarr: rbarr,
+        rBarr: rBarr,
+        RBarr: RBarr,
+        rbbrk: rbbrk,
+        rbrace: rbrace,
+        rbrack: rbrack,
+        rbrke: rbrke,
+        rbrksld: rbrksld,
+        rbrkslu: rbrkslu,
+        Rcaron: Rcaron,
+        rcaron: rcaron,
+        Rcedil: Rcedil,
+        rcedil: rcedil,
+        rceil: rceil,
+        rcub: rcub,
+        Rcy: Rcy,
+        rcy: rcy,
+        rdca: rdca,
+        rdldhar: rdldhar,
+        rdquo: rdquo,
+        rdquor: rdquor,
+        rdsh: rdsh,
+        real: real,
+        realine: realine,
+        realpart: realpart,
+        reals: reals,
+        Re: Re,
+        rect: rect,
+        reg: reg,
+        REG: REG,
+        ReverseElement: ReverseElement,
+        ReverseEquilibrium: ReverseEquilibrium,
+        ReverseUpEquilibrium: ReverseUpEquilibrium,
+        rfisht: rfisht,
+        rfloor: rfloor,
+        rfr: rfr,
+        Rfr: Rfr,
+        rHar: rHar,
+        rhard: rhard,
+        rharu: rharu,
+        rharul: rharul,
+        Rho: Rho,
+        rho: rho,
+        rhov: rhov,
+        RightAngleBracket: RightAngleBracket,
+        RightArrowBar: RightArrowBar,
+        rightarrow: rightarrow,
+        RightArrow: RightArrow,
+        Rightarrow: Rightarrow,
+        RightArrowLeftArrow: RightArrowLeftArrow,
+        rightarrowtail: rightarrowtail,
+        RightCeiling: RightCeiling,
+        RightDoubleBracket: RightDoubleBracket,
+        RightDownTeeVector: RightDownTeeVector,
+        RightDownVectorBar: RightDownVectorBar,
+        RightDownVector: RightDownVector,
+        RightFloor: RightFloor,
+        rightharpoondown: rightharpoondown,
+        rightharpoonup: rightharpoonup,
+        rightleftarrows: rightleftarrows,
+        rightleftharpoons: rightleftharpoons,
+        rightrightarrows: rightrightarrows,
+        rightsquigarrow: rightsquigarrow,
+        RightTeeArrow: RightTeeArrow,
+        RightTee: RightTee,
+        RightTeeVector: RightTeeVector,
+        rightthreetimes: rightthreetimes,
+        RightTriangleBar: RightTriangleBar,
+        RightTriangle: RightTriangle,
+        RightTriangleEqual: RightTriangleEqual,
+        RightUpDownVector: RightUpDownVector,
+        RightUpTeeVector: RightUpTeeVector,
+        RightUpVectorBar: RightUpVectorBar,
+        RightUpVector: RightUpVector,
+        RightVectorBar: RightVectorBar,
+        RightVector: RightVector,
+        ring: ring,
+        risingdotseq: risingdotseq,
+        rlarr: rlarr,
+        rlhar: rlhar,
+        rlm: rlm,
+        rmoustache: rmoustache,
+        rmoust: rmoust,
+        rnmid: rnmid,
+        roang: roang,
+        roarr: roarr,
+        robrk: robrk,
+        ropar: ropar,
+        ropf: ropf,
+        Ropf: Ropf,
+        roplus: roplus,
+        rotimes: rotimes,
+        RoundImplies: RoundImplies,
+        rpar: rpar,
+        rpargt: rpargt,
+        rppolint: rppolint,
+        rrarr: rrarr,
+        Rrightarrow: Rrightarrow,
+        rsaquo: rsaquo,
+        rscr: rscr,
+        Rscr: Rscr,
+        rsh: rsh,
+        Rsh: Rsh,
+        rsqb: rsqb,
+        rsquo: rsquo,
+        rsquor: rsquor,
+        rthree: rthree,
+        rtimes: rtimes,
+        rtri: rtri,
+        rtrie: rtrie,
+        rtrif: rtrif,
+        rtriltri: rtriltri,
+        RuleDelayed: RuleDelayed,
+        ruluhar: ruluhar,
+        rx: rx,
+        Sacute: Sacute,
+        sacute: sacute,
+        sbquo: sbquo,
+        scap: scap,
+        Scaron: Scaron,
+        scaron: scaron,
+        Sc: Sc,
+        sc: sc,
+        sccue: sccue,
+        sce: sce,
+        scE: scE,
+        Scedil: Scedil,
+        scedil: scedil,
+        Scirc: Scirc,
+        scirc: scirc,
+        scnap: scnap,
+        scnE: scnE,
+        scnsim: scnsim,
+        scpolint: scpolint,
+        scsim: scsim,
+        Scy: Scy,
+        scy: scy,
+        sdotb: sdotb,
+        sdot: sdot,
+        sdote: sdote,
+        searhk: searhk,
+        searr: searr,
+        seArr: seArr,
+        searrow: searrow,
+        sect: sect,
+        semi: semi,
+        seswar: seswar,
+        setminus: setminus,
+        setmn: setmn,
+        sext: sext,
+        Sfr: Sfr,
+        sfr: sfr,
+        sfrown: sfrown,
+        sharp: sharp,
+        SHCHcy: SHCHcy,
+        shchcy: shchcy,
+        SHcy: SHcy,
+        shcy: shcy,
+        ShortDownArrow: ShortDownArrow,
+        ShortLeftArrow: ShortLeftArrow,
+        shortmid: shortmid,
+        shortparallel: shortparallel,
+        ShortRightArrow: ShortRightArrow,
+        ShortUpArrow: ShortUpArrow,
+        shy: shy,
+        Sigma: Sigma,
+        sigma: sigma,
+        sigmaf: sigmaf,
+        sigmav: sigmav,
+        sim: sim,
+        simdot: simdot,
+        sime: sime,
+        simeq: simeq,
+        simg: simg,
+        simgE: simgE,
+        siml: siml,
+        simlE: simlE,
+        simne: simne,
+        simplus: simplus,
+        simrarr: simrarr,
+        slarr: slarr,
+        SmallCircle: SmallCircle,
+        smallsetminus: smallsetminus,
+        smashp: smashp,
+        smeparsl: smeparsl,
+        smid: smid,
+        smile: smile,
+        smt: smt,
+        smte: smte,
+        smtes: smtes,
+        SOFTcy: SOFTcy,
+        softcy: softcy,
+        solbar: solbar,
+        solb: solb,
+        sol: sol,
+        Sopf: Sopf,
+        sopf: sopf,
+        spades: spades,
+        spadesuit: spadesuit,
+        spar: spar,
+        sqcap: sqcap,
+        sqcaps: sqcaps,
+        sqcup: sqcup,
+        sqcups: sqcups,
+        Sqrt: Sqrt,
+        sqsub: sqsub,
+        sqsube: sqsube,
+        sqsubset: sqsubset,
+        sqsubseteq: sqsubseteq,
+        sqsup: sqsup,
+        sqsupe: sqsupe,
+        sqsupset: sqsupset,
+        sqsupseteq: sqsupseteq,
+        square: square,
+        Square: Square,
+        SquareIntersection: SquareIntersection,
+        SquareSubset: SquareSubset,
+        SquareSubsetEqual: SquareSubsetEqual,
+        SquareSuperset: SquareSuperset,
+        SquareSupersetEqual: SquareSupersetEqual,
+        SquareUnion: SquareUnion,
+        squarf: squarf,
+        squ: squ,
+        squf: squf,
+        srarr: srarr,
+        Sscr: Sscr,
+        sscr: sscr,
+        ssetmn: ssetmn,
+        ssmile: ssmile,
+        sstarf: sstarf,
+        Star: Star,
+        star: star,
+        starf: starf,
+        straightepsilon: straightepsilon,
+        straightphi: straightphi,
+        strns: strns,
+        sub: sub,
+        Sub: Sub,
+        subdot: subdot,
+        subE: subE,
+        sube: sube,
+        subedot: subedot,
+        submult: submult,
+        subnE: subnE,
+        subne: subne,
+        subplus: subplus,
+        subrarr: subrarr,
+        subset: subset,
+        Subset: Subset,
+        subseteq: subseteq,
+        subseteqq: subseteqq,
+        SubsetEqual: SubsetEqual,
+        subsetneq: subsetneq,
+        subsetneqq: subsetneqq,
+        subsim: subsim,
+        subsub: subsub,
+        subsup: subsup,
+        succapprox: succapprox,
+        succ: succ,
+        succcurlyeq: succcurlyeq,
+        Succeeds: Succeeds,
+        SucceedsEqual: SucceedsEqual,
+        SucceedsSlantEqual: SucceedsSlantEqual,
+        SucceedsTilde: SucceedsTilde,
+        succeq: succeq,
+        succnapprox: succnapprox,
+        succneqq: succneqq,
+        succnsim: succnsim,
+        succsim: succsim,
+        SuchThat: SuchThat,
+        sum: sum,
+        Sum: Sum,
+        sung: sung,
+        sup1: sup1,
+        sup2: sup2,
+        sup3: sup3,
+        sup: sup,
+        Sup: Sup,
+        supdot: supdot,
+        supdsub: supdsub,
+        supE: supE,
+        supe: supe,
+        supedot: supedot,
+        Superset: Superset,
+        SupersetEqual: SupersetEqual,
+        suphsol: suphsol,
+        suphsub: suphsub,
+        suplarr: suplarr,
+        supmult: supmult,
+        supnE: supnE,
+        supne: supne,
+        supplus: supplus,
+        supset: supset,
+        Supset: Supset,
+        supseteq: supseteq,
+        supseteqq: supseteqq,
+        supsetneq: supsetneq,
+        supsetneqq: supsetneqq,
+        supsim: supsim,
+        supsub: supsub,
+        supsup: supsup,
+        swarhk: swarhk,
+        swarr: swarr,
+        swArr: swArr,
+        swarrow: swarrow,
+        swnwar: swnwar,
+        szlig: szlig,
+        Tab: Tab,
+        target: target,
+        Tau: Tau,
+        tau: tau,
+        tbrk: tbrk,
+        Tcaron: Tcaron,
+        tcaron: tcaron,
+        Tcedil: Tcedil,
+        tcedil: tcedil,
+        Tcy: Tcy,
+        tcy: tcy,
+        tdot: tdot,
+        telrec: telrec,
+        Tfr: Tfr,
+        tfr: tfr,
+        there4: there4,
+        therefore: therefore,
+        Therefore: Therefore,
+        Theta: Theta,
+        theta: theta,
+        thetasym: thetasym,
+        thetav: thetav,
+        thickapprox: thickapprox,
+        thicksim: thicksim,
+        ThickSpace: ThickSpace,
+        ThinSpace: ThinSpace,
+        thinsp: thinsp,
+        thkap: thkap,
+        thksim: thksim,
+        THORN: THORN,
+        thorn: thorn,
+        tilde: tilde,
+        Tilde: Tilde,
+        TildeEqual: TildeEqual,
+        TildeFullEqual: TildeFullEqual,
+        TildeTilde: TildeTilde,
+        timesbar: timesbar,
+        timesb: timesb,
+        times: times,
+        timesd: timesd,
+        tint: tint,
+        toea: toea,
+        topbot: topbot,
+        topcir: topcir,
+        top: top,
+        Topf: Topf,
+        topf: topf,
+        topfork: topfork,
+        tosa: tosa,
+        tprime: tprime,
+        trade: trade,
+        TRADE: TRADE,
+        triangle: triangle,
+        triangledown: triangledown,
+        triangleleft: triangleleft,
+        trianglelefteq: trianglelefteq,
+        triangleq: triangleq,
+        triangleright: triangleright,
+        trianglerighteq: trianglerighteq,
+        tridot: tridot,
+        trie: trie,
+        triminus: triminus,
+        TripleDot: TripleDot,
+        triplus: triplus,
+        trisb: trisb,
+        tritime: tritime,
+        trpezium: trpezium,
+        Tscr: Tscr,
+        tscr: tscr,
+        TScy: TScy,
+        tscy: tscy,
+        TSHcy: TSHcy,
+        tshcy: tshcy,
+        Tstrok: Tstrok,
+        tstrok: tstrok,
+        twixt: twixt,
+        twoheadleftarrow: twoheadleftarrow,
+        twoheadrightarrow: twoheadrightarrow,
+        Uacute: Uacute,
+        uacute: uacute,
+        uarr: uarr,
+        Uarr: Uarr,
+        uArr: uArr,
+        Uarrocir: Uarrocir,
+        Ubrcy: Ubrcy,
+        ubrcy: ubrcy,
+        Ubreve: Ubreve,
+        ubreve: ubreve,
+        Ucirc: Ucirc,
+        ucirc: ucirc,
+        Ucy: Ucy,
+        ucy: ucy,
+        udarr: udarr,
+        Udblac: Udblac,
+        udblac: udblac,
+        udhar: udhar,
+        ufisht: ufisht,
+        Ufr: Ufr,
+        ufr: ufr,
+        Ugrave: Ugrave,
+        ugrave: ugrave,
+        uHar: uHar,
+        uharl: uharl,
+        uharr: uharr,
+        uhblk: uhblk,
+        ulcorn: ulcorn,
+        ulcorner: ulcorner,
+        ulcrop: ulcrop,
+        ultri: ultri,
+        Umacr: Umacr,
+        umacr: umacr,
+        uml: uml,
+        UnderBar: UnderBar,
+        UnderBrace: UnderBrace,
+        UnderBracket: UnderBracket,
+        UnderParenthesis: UnderParenthesis,
+        Union: Union,
+        UnionPlus: UnionPlus,
+        Uogon: Uogon,
+        uogon: uogon,
+        Uopf: Uopf,
+        uopf: uopf,
+        UpArrowBar: UpArrowBar,
+        uparrow: uparrow,
+        UpArrow: UpArrow,
+        Uparrow: Uparrow,
+        UpArrowDownArrow: UpArrowDownArrow,
+        updownarrow: updownarrow,
+        UpDownArrow: UpDownArrow,
+        Updownarrow: Updownarrow,
+        UpEquilibrium: UpEquilibrium,
+        upharpoonleft: upharpoonleft,
+        upharpoonright: upharpoonright,
+        uplus: uplus,
+        UpperLeftArrow: UpperLeftArrow,
+        UpperRightArrow: UpperRightArrow,
+        upsi: upsi,
+        Upsi: Upsi,
+        upsih: upsih,
+        Upsilon: Upsilon,
+        upsilon: upsilon,
+        UpTeeArrow: UpTeeArrow,
+        UpTee: UpTee,
+        upuparrows: upuparrows,
+        urcorn: urcorn,
+        urcorner: urcorner,
+        urcrop: urcrop,
+        Uring: Uring,
+        uring: uring,
+        urtri: urtri,
+        Uscr: Uscr,
+        uscr: uscr,
+        utdot: utdot,
+        Utilde: Utilde,
+        utilde: utilde,
+        utri: utri,
+        utrif: utrif,
+        uuarr: uuarr,
+        Uuml: Uuml,
+        uuml: uuml,
+        uwangle: uwangle,
+        vangrt: vangrt,
+        varepsilon: varepsilon,
+        varkappa: varkappa,
+        varnothing: varnothing,
+        varphi: varphi,
+        varpi: varpi,
+        varpropto: varpropto,
+        varr: varr,
+        vArr: vArr,
+        varrho: varrho,
+        varsigma: varsigma,
+        varsubsetneq: varsubsetneq,
+        varsubsetneqq: varsubsetneqq,
+        varsupsetneq: varsupsetneq,
+        varsupsetneqq: varsupsetneqq,
+        vartheta: vartheta,
+        vartriangleleft: vartriangleleft,
+        vartriangleright: vartriangleright,
+        vBar: vBar,
+        Vbar: Vbar,
+        vBarv: vBarv,
+        Vcy: Vcy,
+        vcy: vcy,
+        vdash: vdash,
+        vDash: vDash,
+        Vdash: Vdash,
+        VDash: VDash,
+        Vdashl: Vdashl,
+        veebar: veebar,
+        vee: vee,
+        Vee: Vee,
+        veeeq: veeeq,
+        vellip: vellip,
+        verbar: verbar,
+        Verbar: Verbar,
+        vert: vert,
+        Vert: Vert,
+        VerticalBar: VerticalBar,
+        VerticalLine: VerticalLine,
+        VerticalSeparator: VerticalSeparator,
+        VerticalTilde: VerticalTilde,
+        VeryThinSpace: VeryThinSpace,
+        Vfr: Vfr,
+        vfr: vfr,
+        vltri: vltri,
+        vnsub: vnsub,
+        vnsup: vnsup,
+        Vopf: Vopf,
+        vopf: vopf,
+        vprop: vprop,
+        vrtri: vrtri,
+        Vscr: Vscr,
+        vscr: vscr,
+        vsubnE: vsubnE,
+        vsubne: vsubne,
+        vsupnE: vsupnE,
+        vsupne: vsupne,
+        Vvdash: Vvdash,
+        vzigzag: vzigzag,
+        Wcirc: Wcirc,
+        wcirc: wcirc,
+        wedbar: wedbar,
+        wedge: wedge,
+        Wedge: Wedge,
+        wedgeq: wedgeq,
+        weierp: weierp,
+        Wfr: Wfr,
+        wfr: wfr,
+        Wopf: Wopf,
+        wopf: wopf,
+        wp: wp,
+        wr: wr,
+        wreath: wreath,
+        Wscr: Wscr,
+        wscr: wscr,
+        xcap: xcap,
+        xcirc: xcirc,
+        xcup: xcup,
+        xdtri: xdtri,
+        Xfr: Xfr,
+        xfr: xfr,
+        xharr: xharr,
+        xhArr: xhArr,
+        Xi: Xi,
+        xi: xi,
+        xlarr: xlarr,
+        xlArr: xlArr,
+        xmap: xmap,
+        xnis: xnis,
+        xodot: xodot,
+        Xopf: Xopf,
+        xopf: xopf,
+        xoplus: xoplus,
+        xotime: xotime,
+        xrarr: xrarr,
+        xrArr: xrArr,
+        Xscr: Xscr,
+        xscr: xscr,
+        xsqcup: xsqcup,
+        xuplus: xuplus,
+        xutri: xutri,
+        xvee: xvee,
+        xwedge: xwedge,
+        Yacute: Yacute,
+        yacute: yacute,
+        YAcy: YAcy,
+        yacy: yacy,
+        Ycirc: Ycirc,
+        ycirc: ycirc,
+        Ycy: Ycy,
+        ycy: ycy,
+        yen: yen,
+        Yfr: Yfr,
+        yfr: yfr,
+        YIcy: YIcy,
+        yicy: yicy,
+        Yopf: Yopf,
+        yopf: yopf,
+        Yscr: Yscr,
+        yscr: yscr,
+        YUcy: YUcy,
+        yucy: yucy,
+        yuml: yuml,
+        Yuml: Yuml,
+        Zacute: Zacute,
+        zacute: zacute,
+        Zcaron: Zcaron,
+        zcaron: zcaron,
+        Zcy: Zcy,
+        zcy: zcy,
+        Zdot: Zdot,
+        zdot: zdot,
+        zeetrf: zeetrf,
+        ZeroWidthSpace: ZeroWidthSpace,
+        Zeta: Zeta,
+        zeta: zeta,
+        zfr: zfr,
+        Zfr: Zfr,
+        ZHcy: ZHcy,
+        zhcy: zhcy,
+        zigrarr: zigrarr,
+        zopf: zopf,
+        Zopf: Zopf,
+        Zscr: Zscr,
+        zscr: zscr,
+        zwj: zwj,
+        zwnj: zwnj,
+        'default': entities
+    });
+
+    var Aacute$1 = "ร";
+    var aacute$1 = "รก";
+    var Acirc$1 = "ร‚";
+    var acirc$1 = "รข";
+    var acute$1 = "ยด";
+    var AElig$1 = "ร†";
+    var aelig$1 = "รฆ";
+    var Agrave$1 = "ร€";
+    var agrave$1 = "ร ";
+    var amp$1 = "&";
+    var AMP$1 = "&";
+    var Aring$1 = "ร…";
+    var aring$1 = "รฅ";
+    var Atilde$1 = "รƒ";
+    var atilde$1 = "รฃ";
+    var Auml$1 = "ร„";
+    var auml$1 = "รค";
+    var brvbar$1 = "ยฆ";
+    var Ccedil$1 = "ร‡";
+    var ccedil$1 = "รง";
+    var cedil$1 = "ยธ";
+    var cent$1 = "ยข";
+    var copy$1 = "ยฉ";
+    var COPY$1 = "ยฉ";
+    var curren$1 = "ยค";
+    var deg$1 = "ยฐ";
+    var divide$1 = "รท";
+    var Eacute$1 = "ร‰";
+    var eacute$1 = "รฉ";
+    var Ecirc$1 = "รŠ";
+    var ecirc$1 = "รช";
+    var Egrave$1 = "รˆ";
+    var egrave$1 = "รจ";
+    var ETH$1 = "ร";
+    var eth$1 = "รฐ";
+    var Euml$1 = "ร‹";
+    var euml$1 = "รซ";
+    var frac12$1 = "ยฝ";
+    var frac14$1 = "ยผ";
+    var frac34$1 = "ยพ";
+    var gt$1 = ">";
+    var GT$1 = ">";
+    var Iacute$1 = "ร";
+    var iacute$1 = "รญ";
+    var Icirc$1 = "รŽ";
+    var icirc$1 = "รฎ";
+    var iexcl$1 = "ยก";
+    var Igrave$1 = "รŒ";
+    var igrave$1 = "รฌ";
+    var iquest$1 = "ยฟ";
+    var Iuml$1 = "ร";
+    var iuml$1 = "รฏ";
+    var laquo$1 = "ยซ";
+    var lt$1 = "<";
+    var LT$1 = "<";
+    var macr$1 = "ยฏ";
+    var micro$1 = "ยต";
+    var middot$1 = "ยท";
+    var nbsp$1 = "ย ";
+    var not$1 = "ยฌ";
+    var Ntilde$1 = "ร‘";
+    var ntilde$1 = "รฑ";
+    var Oacute$1 = "ร“";
+    var oacute$1 = "รณ";
+    var Ocirc$1 = "ร”";
+    var ocirc$1 = "รด";
+    var Ograve$1 = "ร’";
+    var ograve$1 = "รฒ";
+    var ordf$1 = "ยช";
+    var ordm$1 = "ยบ";
+    var Oslash$1 = "ร˜";
+    var oslash$1 = "รธ";
+    var Otilde$1 = "ร•";
+    var otilde$1 = "รต";
+    var Ouml$1 = "ร–";
+    var ouml$1 = "รถ";
+    var para$1 = "ยถ";
+    var plusmn$1 = "ยฑ";
+    var pound$1 = "ยฃ";
+    var quot$1 = "\"";
+    var QUOT$1 = "\"";
+    var raquo$1 = "ยป";
+    var reg$1 = "ยฎ";
+    var REG$1 = "ยฎ";
+    var sect$1 = "ยง";
+    var shy$1 = "ยญ";
+    var sup1$1 = "ยน";
+    var sup2$1 = "ยฒ";
+    var sup3$1 = "ยณ";
+    var szlig$1 = "รŸ";
+    var THORN$1 = "รž";
+    var thorn$1 = "รพ";
+    var times$1 = "ร—";
+    var Uacute$1 = "รš";
+    var uacute$1 = "รบ";
+    var Ucirc$1 = "ร›";
+    var ucirc$1 = "รป";
+    var Ugrave$1 = "ร™";
+    var ugrave$1 = "รน";
+    var uml$1 = "ยจ";
+    var Uuml$1 = "รœ";
+    var uuml$1 = "รผ";
+    var Yacute$1 = "ร";
+    var yacute$1 = "รฝ";
+    var yen$1 = "ยฅ";
+    var yuml$1 = "รฟ";
+    var legacy = {
+    	Aacute: Aacute$1,
+    	aacute: aacute$1,
+    	Acirc: Acirc$1,
+    	acirc: acirc$1,
+    	acute: acute$1,
+    	AElig: AElig$1,
+    	aelig: aelig$1,
+    	Agrave: Agrave$1,
+    	agrave: agrave$1,
+    	amp: amp$1,
+    	AMP: AMP$1,
+    	Aring: Aring$1,
+    	aring: aring$1,
+    	Atilde: Atilde$1,
+    	atilde: atilde$1,
+    	Auml: Auml$1,
+    	auml: auml$1,
+    	brvbar: brvbar$1,
+    	Ccedil: Ccedil$1,
+    	ccedil: ccedil$1,
+    	cedil: cedil$1,
+    	cent: cent$1,
+    	copy: copy$1,
+    	COPY: COPY$1,
+    	curren: curren$1,
+    	deg: deg$1,
+    	divide: divide$1,
+    	Eacute: Eacute$1,
+    	eacute: eacute$1,
+    	Ecirc: Ecirc$1,
+    	ecirc: ecirc$1,
+    	Egrave: Egrave$1,
+    	egrave: egrave$1,
+    	ETH: ETH$1,
+    	eth: eth$1,
+    	Euml: Euml$1,
+    	euml: euml$1,
+    	frac12: frac12$1,
+    	frac14: frac14$1,
+    	frac34: frac34$1,
+    	gt: gt$1,
+    	GT: GT$1,
+    	Iacute: Iacute$1,
+    	iacute: iacute$1,
+    	Icirc: Icirc$1,
+    	icirc: icirc$1,
+    	iexcl: iexcl$1,
+    	Igrave: Igrave$1,
+    	igrave: igrave$1,
+    	iquest: iquest$1,
+    	Iuml: Iuml$1,
+    	iuml: iuml$1,
+    	laquo: laquo$1,
+    	lt: lt$1,
+    	LT: LT$1,
+    	macr: macr$1,
+    	micro: micro$1,
+    	middot: middot$1,
+    	nbsp: nbsp$1,
+    	not: not$1,
+    	Ntilde: Ntilde$1,
+    	ntilde: ntilde$1,
+    	Oacute: Oacute$1,
+    	oacute: oacute$1,
+    	Ocirc: Ocirc$1,
+    	ocirc: ocirc$1,
+    	Ograve: Ograve$1,
+    	ograve: ograve$1,
+    	ordf: ordf$1,
+    	ordm: ordm$1,
+    	Oslash: Oslash$1,
+    	oslash: oslash$1,
+    	Otilde: Otilde$1,
+    	otilde: otilde$1,
+    	Ouml: Ouml$1,
+    	ouml: ouml$1,
+    	para: para$1,
+    	plusmn: plusmn$1,
+    	pound: pound$1,
+    	quot: quot$1,
+    	QUOT: QUOT$1,
+    	raquo: raquo$1,
+    	reg: reg$1,
+    	REG: REG$1,
+    	sect: sect$1,
+    	shy: shy$1,
+    	sup1: sup1$1,
+    	sup2: sup2$1,
+    	sup3: sup3$1,
+    	szlig: szlig$1,
+    	THORN: THORN$1,
+    	thorn: thorn$1,
+    	times: times$1,
+    	Uacute: Uacute$1,
+    	uacute: uacute$1,
+    	Ucirc: Ucirc$1,
+    	ucirc: ucirc$1,
+    	Ugrave: Ugrave$1,
+    	ugrave: ugrave$1,
+    	uml: uml$1,
+    	Uuml: Uuml$1,
+    	uuml: uuml$1,
+    	Yacute: Yacute$1,
+    	yacute: yacute$1,
+    	yen: yen$1,
+    	yuml: yuml$1
+    };
+
+    var legacy$1 = /*#__PURE__*/Object.freeze({
+        __proto__: null,
+        Aacute: Aacute$1,
+        aacute: aacute$1,
+        Acirc: Acirc$1,
+        acirc: acirc$1,
+        acute: acute$1,
+        AElig: AElig$1,
+        aelig: aelig$1,
+        Agrave: Agrave$1,
+        agrave: agrave$1,
+        amp: amp$1,
+        AMP: AMP$1,
+        Aring: Aring$1,
+        aring: aring$1,
+        Atilde: Atilde$1,
+        atilde: atilde$1,
+        Auml: Auml$1,
+        auml: auml$1,
+        brvbar: brvbar$1,
+        Ccedil: Ccedil$1,
+        ccedil: ccedil$1,
+        cedil: cedil$1,
+        cent: cent$1,
+        copy: copy$1,
+        COPY: COPY$1,
+        curren: curren$1,
+        deg: deg$1,
+        divide: divide$1,
+        Eacute: Eacute$1,
+        eacute: eacute$1,
+        Ecirc: Ecirc$1,
+        ecirc: ecirc$1,
+        Egrave: Egrave$1,
+        egrave: egrave$1,
+        ETH: ETH$1,
+        eth: eth$1,
+        Euml: Euml$1,
+        euml: euml$1,
+        frac12: frac12$1,
+        frac14: frac14$1,
+        frac34: frac34$1,
+        gt: gt$1,
+        GT: GT$1,
+        Iacute: Iacute$1,
+        iacute: iacute$1,
+        Icirc: Icirc$1,
+        icirc: icirc$1,
+        iexcl: iexcl$1,
+        Igrave: Igrave$1,
+        igrave: igrave$1,
+        iquest: iquest$1,
+        Iuml: Iuml$1,
+        iuml: iuml$1,
+        laquo: laquo$1,
+        lt: lt$1,
+        LT: LT$1,
+        macr: macr$1,
+        micro: micro$1,
+        middot: middot$1,
+        nbsp: nbsp$1,
+        not: not$1,
+        Ntilde: Ntilde$1,
+        ntilde: ntilde$1,
+        Oacute: Oacute$1,
+        oacute: oacute$1,
+        Ocirc: Ocirc$1,
+        ocirc: ocirc$1,
+        Ograve: Ograve$1,
+        ograve: ograve$1,
+        ordf: ordf$1,
+        ordm: ordm$1,
+        Oslash: Oslash$1,
+        oslash: oslash$1,
+        Otilde: Otilde$1,
+        otilde: otilde$1,
+        Ouml: Ouml$1,
+        ouml: ouml$1,
+        para: para$1,
+        plusmn: plusmn$1,
+        pound: pound$1,
+        quot: quot$1,
+        QUOT: QUOT$1,
+        raquo: raquo$1,
+        reg: reg$1,
+        REG: REG$1,
+        sect: sect$1,
+        shy: shy$1,
+        sup1: sup1$1,
+        sup2: sup2$1,
+        sup3: sup3$1,
+        szlig: szlig$1,
+        THORN: THORN$1,
+        thorn: thorn$1,
+        times: times$1,
+        Uacute: Uacute$1,
+        uacute: uacute$1,
+        Ucirc: Ucirc$1,
+        ucirc: ucirc$1,
+        Ugrave: Ugrave$1,
+        ugrave: ugrave$1,
+        uml: uml$1,
+        Uuml: Uuml$1,
+        uuml: uuml$1,
+        Yacute: Yacute$1,
+        yacute: yacute$1,
+        yen: yen$1,
+        yuml: yuml$1,
+        'default': legacy
+    });
+
+    var amp$2 = "&";
+    var apos$1 = "'";
+    var gt$2 = ">";
+    var lt$2 = "<";
+    var quot$2 = "\"";
+    var xml = {
+    	amp: amp$2,
+    	apos: apos$1,
+    	gt: gt$2,
+    	lt: lt$2,
+    	quot: quot$2
+    };
+
+    var xml$1 = /*#__PURE__*/Object.freeze({
+        __proto__: null,
+        amp: amp$2,
+        apos: apos$1,
+        gt: gt$2,
+        lt: lt$2,
+        quot: quot$2,
+        'default': xml
+    });
+
+    var decode = {
+    	"0": 65533,
+    	"128": 8364,
+    	"130": 8218,
+    	"131": 402,
+    	"132": 8222,
+    	"133": 8230,
+    	"134": 8224,
+    	"135": 8225,
+    	"136": 710,
+    	"137": 8240,
+    	"138": 352,
+    	"139": 8249,
+    	"140": 338,
+    	"142": 381,
+    	"145": 8216,
+    	"146": 8217,
+    	"147": 8220,
+    	"148": 8221,
+    	"149": 8226,
+    	"150": 8211,
+    	"151": 8212,
+    	"152": 732,
+    	"153": 8482,
+    	"154": 353,
+    	"155": 8250,
+    	"156": 339,
+    	"158": 382,
+    	"159": 376
+    };
+
+    var decode$1 = /*#__PURE__*/Object.freeze({
+        __proto__: null,
+        'default': decode
+    });
+
+    var require$$0 = getCjsExportFromNamespace(decode$1);
+
+    var decode_codepoint = createCommonjsModule(function (module, exports) {
+    var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) {
+        return (mod && mod.__esModule) ? mod : { "default": mod };
+    };
+    Object.defineProperty(exports, "__esModule", { value: true });
+    var decode_json_1 = __importDefault(require$$0);
+    // modified version of https://github.com/mathiasbynens/he/blob/master/src/he.js#L94-L119
+    function decodeCodePoint(codePoint) {
+        if ((codePoint >= 0xd800 && codePoint <= 0xdfff) || codePoint > 0x10ffff) {
+            return "\uFFFD";
+        }
+        if (codePoint in decode_json_1.default) {
+            codePoint = decode_json_1.default[codePoint];
+        }
+        var output = "";
+        if (codePoint > 0xffff) {
+            codePoint -= 0x10000;
+            output += String.fromCharCode(((codePoint >>> 10) & 0x3ff) | 0xd800);
+            codePoint = 0xdc00 | (codePoint & 0x3ff);
+        }
+        output += String.fromCharCode(codePoint);
+        return output;
+    }
+    exports.default = decodeCodePoint;
+    });
+
+    unwrapExports(decode_codepoint);
+
+    var require$$1 = getCjsExportFromNamespace(entities$1);
+
+    var require$$1$1 = getCjsExportFromNamespace(legacy$1);
+
+    var require$$0$1 = getCjsExportFromNamespace(xml$1);
+
+    var decode$2 = createCommonjsModule(function (module, exports) {
+    var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) {
+        return (mod && mod.__esModule) ? mod : { "default": mod };
+    };
+    Object.defineProperty(exports, "__esModule", { value: true });
+    exports.decodeHTML = exports.decodeHTMLStrict = exports.decodeXML = void 0;
+    var entities_json_1 = __importDefault(require$$1);
+    var legacy_json_1 = __importDefault(require$$1$1);
+    var xml_json_1 = __importDefault(require$$0$1);
+    var decode_codepoint_1 = __importDefault(decode_codepoint);
+    exports.decodeXML = getStrictDecoder(xml_json_1.default);
+    exports.decodeHTMLStrict = getStrictDecoder(entities_json_1.default);
+    function getStrictDecoder(map) {
+        var keys = Object.keys(map).join("|");
+        var replace = getReplacer(map);
+        keys += "|#[xX][\\da-fA-F]+|#\\d+";
+        var re = new RegExp("&(?:" + keys + ");", "g");
+        return function (str) { return String(str).replace(re, replace); };
+    }
+    var sorter = function (a, b) { return (a < b ? 1 : -1); };
+    exports.decodeHTML = (function () {
+        var legacy = Object.keys(legacy_json_1.default).sort(sorter);
+        var keys = Object.keys(entities_json_1.default).sort(sorter);
+        for (var i = 0, j = 0; i < keys.length; i++) {
+            if (legacy[j] === keys[i]) {
+                keys[i] += ";?";
+                j++;
+            }
+            else {
+                keys[i] += ";";
+            }
+        }
+        var re = new RegExp("&(?:" + keys.join("|") + "|#[xX][\\da-fA-F]+;?|#\\d+;?)", "g");
+        var replace = getReplacer(entities_json_1.default);
+        function replacer(str) {
+            if (str.substr(-1) !== ";")
+                str += ";";
+            return replace(str);
+        }
+        //TODO consider creating a merged map
+        return function (str) { return String(str).replace(re, replacer); };
+    })();
+    function getReplacer(map) {
+        return function replace(str) {
+            if (str.charAt(1) === "#") {
+                var secondChar = str.charAt(2);
+                if (secondChar === "X" || secondChar === "x") {
+                    return decode_codepoint_1.default(parseInt(str.substr(3), 16));
+                }
+                return decode_codepoint_1.default(parseInt(str.substr(2), 10));
+            }
+            return map[str.slice(1, -1)];
+        };
+    }
+    });
+
+    unwrapExports(decode$2);
+    var decode_1 = decode$2.decodeHTML;
+    var decode_2 = decode$2.decodeHTMLStrict;
+    var decode_3 = decode$2.decodeXML;
+
+    var encode$1 = createCommonjsModule(function (module, exports) {
+    var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) {
+        return (mod && mod.__esModule) ? mod : { "default": mod };
+    };
+    Object.defineProperty(exports, "__esModule", { value: true });
+    exports.escape = exports.encodeHTML = exports.encodeXML = void 0;
+    var xml_json_1 = __importDefault(require$$0$1);
+    var inverseXML = getInverseObj(xml_json_1.default);
+    var xmlReplacer = getInverseReplacer(inverseXML);
+    exports.encodeXML = getInverse(inverseXML, xmlReplacer);
+    var entities_json_1 = __importDefault(require$$1);
+    var inverseHTML = getInverseObj(entities_json_1.default);
+    var htmlReplacer = getInverseReplacer(inverseHTML);
+    exports.encodeHTML = getInverse(inverseHTML, htmlReplacer);
+    function getInverseObj(obj) {
+        return Object.keys(obj)
+            .sort()
+            .reduce(function (inverse, name) {
+            inverse[obj[name]] = "&" + name + ";";
+            return inverse;
+        }, {});
+    }
+    function getInverseReplacer(inverse) {
+        var single = [];
+        var multiple = [];
+        for (var _i = 0, _a = Object.keys(inverse); _i < _a.length; _i++) {
+            var k = _a[_i];
+            if (k.length === 1) {
+                // Add value to single array
+                single.push("\\" + k);
+            }
+            else {
+                // Add value to multiple array
+                multiple.push(k);
+            }
+        }
+        // Add ranges to single characters.
+        single.sort();
+        for (var start = 0; start < single.length - 1; start++) {
+            // Find the end of a run of characters
+            var end = start;
+            while (end < single.length - 1 &&
+                single[end].charCodeAt(1) + 1 === single[end + 1].charCodeAt(1)) {
+                end += 1;
+            }
+            var count = 1 + end - start;
+            // We want to replace at least three characters
+            if (count < 3)
+                continue;
+            single.splice(start, count, single[start] + "-" + single[end]);
+        }
+        multiple.unshift("[" + single.join("") + "]");
+        return new RegExp(multiple.join("|"), "g");
+    }
+    var reNonASCII = /(?:[\x80-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/g;
+    function singleCharReplacer(c) {
+        // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
+        return "&#x" + c.codePointAt(0).toString(16).toUpperCase() + ";";
+    }
+    function getInverse(inverse, re) {
+        return function (data) {
+            return data
+                .replace(re, function (name) { return inverse[name]; })
+                .replace(reNonASCII, singleCharReplacer);
+        };
+    }
+    var reXmlChars = getInverseReplacer(inverseXML);
+    function escape(data) {
+        return data
+            .replace(reXmlChars, singleCharReplacer)
+            .replace(reNonASCII, singleCharReplacer);
+    }
+    exports.escape = escape;
+    });
+
+    unwrapExports(encode$1);
+    var encode_1$1 = encode$1.escape;
+    var encode_2 = encode$1.encodeHTML;
+    var encode_3 = encode$1.encodeXML;
+
+    var lib = createCommonjsModule(function (module, exports) {
+    Object.defineProperty(exports, "__esModule", { value: true });
+    exports.encode = exports.decodeStrict = exports.decode = void 0;
+
+
+    /**
+     * Decodes a string with entities.
+     *
+     * @param data String to decode.
+     * @param level Optional level to decode at. 0 = XML, 1 = HTML. Default is 0.
+     */
+    function decode(data, level) {
+        return (!level || level <= 0 ? decode$2.decodeXML : decode$2.decodeHTML)(data);
+    }
+    exports.decode = decode;
+    /**
+     * Decodes a string with entities. Does not allow missing trailing semicolons for entities.
+     *
+     * @param data String to decode.
+     * @param level Optional level to decode at. 0 = XML, 1 = HTML. Default is 0.
+     */
+    function decodeStrict(data, level) {
+        return (!level || level <= 0 ? decode$2.decodeXML : decode$2.decodeHTMLStrict)(data);
+    }
+    exports.decodeStrict = decodeStrict;
+    /**
+     * Encodes a string with entities.
+     *
+     * @param data String to encode.
+     * @param level Optional level to encode at. 0 = XML, 1 = HTML. Default is 0.
+     */
+    function encode(data, level) {
+        return (!level || level <= 0 ? encode$1.encodeXML : encode$1.encodeHTML)(data);
+    }
+    exports.encode = encode;
+    var encode_2 = encode$1;
+    Object.defineProperty(exports, "encodeXML", { enumerable: true, get: function () { return encode_2.encodeXML; } });
+    Object.defineProperty(exports, "encodeHTML", { enumerable: true, get: function () { return encode_2.encodeHTML; } });
+    Object.defineProperty(exports, "escape", { enumerable: true, get: function () { return encode_2.escape; } });
+    // Legacy aliases
+    Object.defineProperty(exports, "encodeHTML4", { enumerable: true, get: function () { return encode_2.encodeHTML; } });
+    Object.defineProperty(exports, "encodeHTML5", { enumerable: true, get: function () { return encode_2.encodeHTML; } });
+    var decode_2 = decode$2;
+    Object.defineProperty(exports, "decodeXML", { enumerable: true, get: function () { return decode_2.decodeXML; } });
+    Object.defineProperty(exports, "decodeHTML", { enumerable: true, get: function () { return decode_2.decodeHTML; } });
+    Object.defineProperty(exports, "decodeHTMLStrict", { enumerable: true, get: function () { return decode_2.decodeHTMLStrict; } });
+    // Legacy aliases
+    Object.defineProperty(exports, "decodeHTML4", { enumerable: true, get: function () { return decode_2.decodeHTML; } });
+    Object.defineProperty(exports, "decodeHTML5", { enumerable: true, get: function () { return decode_2.decodeHTML; } });
+    Object.defineProperty(exports, "decodeHTML4Strict", { enumerable: true, get: function () { return decode_2.decodeHTMLStrict; } });
+    Object.defineProperty(exports, "decodeHTML5Strict", { enumerable: true, get: function () { return decode_2.decodeHTMLStrict; } });
+    Object.defineProperty(exports, "decodeXMLStrict", { enumerable: true, get: function () { return decode_2.decodeXML; } });
+    });
+
+    unwrapExports(lib);
+    var lib_1 = lib.encode;
+    var lib_2 = lib.decodeStrict;
+    var lib_3 = lib.decode;
+    var lib_4 = lib.encodeXML;
+    var lib_5 = lib.encodeHTML;
+    var lib_6 = lib.encodeHTML4;
+    var lib_7 = lib.encodeHTML5;
+    var lib_8 = lib.decodeXML;
+    var lib_9 = lib.decodeHTML;
+    var lib_10 = lib.decodeHTMLStrict;
+    var lib_11 = lib.decodeHTML4;
+    var lib_12 = lib.decodeHTML5;
+    var lib_13 = lib.decodeHTML4Strict;
+    var lib_14 = lib.decodeHTML5Strict;
+    var lib_15 = lib.decodeXMLStrict;
+
+    var C_BACKSLASH = 92;
+
+    var ENTITY = "&(?:#x[a-f0-9]{1,6}|#[0-9]{1,7}|[a-z][a-z0-9]{1,31});";
+
+    var TAGNAME = "[A-Za-z][A-Za-z0-9-]*";
+    var ATTRIBUTENAME = "[a-zA-Z_:][a-zA-Z0-9:._-]*";
+    var UNQUOTEDVALUE = "[^\"'=<>`\\x00-\\x20]+";
+    var SINGLEQUOTEDVALUE = "'[^']*'";
+    var DOUBLEQUOTEDVALUE = '"[^"]*"';
+    var ATTRIBUTEVALUE =
+        "(?:" +
+        UNQUOTEDVALUE +
+        "|" +
+        SINGLEQUOTEDVALUE +
+        "|" +
+        DOUBLEQUOTEDVALUE +
+        ")";
+    var ATTRIBUTEVALUESPEC = "(?:" + "\\s*=" + "\\s*" + ATTRIBUTEVALUE + ")";
+    var ATTRIBUTE = "(?:" + "\\s+" + ATTRIBUTENAME + ATTRIBUTEVALUESPEC + "?)";
+    var OPENTAG = "<" + TAGNAME + ATTRIBUTE + "*" + "\\s*/?>";
+    var CLOSETAG = "</" + TAGNAME + "\\s*[>]";
+    var HTMLCOMMENT = "<!---->|<!--(?:-?[^>-])(?:-?[^-])*-->";
+    var PROCESSINGINSTRUCTION = "[<][?][\\s\\S]*?[?][>]";
+    var DECLARATION = "<![A-Z]+" + "\\s+[^>]*>";
+    var CDATA = "<!\\[CDATA\\[[\\s\\S]*?\\]\\]>";
+    var HTMLTAG =
+        "(?:" +
+        OPENTAG +
+        "|" +
+        CLOSETAG +
+        "|" +
+        HTMLCOMMENT +
+        "|" +
+        PROCESSINGINSTRUCTION +
+        "|" +
+        DECLARATION +
+        "|" +
+        CDATA +
+        ")";
+    var reHtmlTag = new RegExp("^" + HTMLTAG);
+
+    var reBackslashOrAmp = /[\\&]/;
+
+    var ESCAPABLE = "[!\"#$%&'()*+,./:;<=>?@[\\\\\\]^_`{|}~-]";
+
+    var reEntityOrEscapedChar = new RegExp("\\\\" + ESCAPABLE + "|" + ENTITY, "gi");
+
+    var XMLSPECIAL = '[&<>"]';
+
+    var reXmlSpecial = new RegExp(XMLSPECIAL, "g");
+
+    var unescapeChar = function(s) {
+        if (s.charCodeAt(0) === C_BACKSLASH) {
+            return s.charAt(1);
+        } else {
+            return lib_9(s);
+        }
+    };
+
+    // Replace entities and backslash escapes with literal characters.
+    var unescapeString = function(s) {
+        if (reBackslashOrAmp.test(s)) {
+            return s.replace(reEntityOrEscapedChar, unescapeChar);
+        } else {
+            return s;
+        }
+    };
+
+    var normalizeURI = function(uri) {
+        try {
+            return encode_1(uri);
+        } catch (err) {
+            return uri;
+        }
+    };
+
+    var replaceUnsafeChar = function(s) {
+        switch (s) {
+            case "&":
+                return "&amp;";
+            case "<":
+                return "&lt;";
+            case ">":
+                return "&gt;";
+            case '"':
+                return "&quot;";
+            default:
+                return s;
+        }
+    };
+
+    var escapeXml = function(s) {
+        if (reXmlSpecial.test(s)) {
+            return s.replace(reXmlSpecial, replaceUnsafeChar);
+        } else {
+            return s;
+        }
+    };
+
+    // derived from https://github.com/mathiasbynens/String.fromCodePoint
+    /*! http://mths.be/fromcodepoint v0.2.1 by @mathias */
+
+    var _fromCodePoint;
+
+    function fromCodePoint(_) {
+        return _fromCodePoint(_);
+    }
+
+    if (String.fromCodePoint) {
+        _fromCodePoint = function(_) {
+            try {
+                return String.fromCodePoint(_);
+            } catch (e) {
+                if (e instanceof RangeError) {
+                    return String.fromCharCode(0xfffd);
+                }
+                throw e;
+            }
+        };
+    } else {
+        var stringFromCharCode = String.fromCharCode;
+        var floor = Math.floor;
+        _fromCodePoint = function() {
+            var MAX_SIZE = 0x4000;
+            var codeUnits = [];
+            var highSurrogate;
+            var lowSurrogate;
+            var index = -1;
+            var length = arguments.length;
+            if (!length) {
+                return "";
+            }
+            var result = "";
+            while (++index < length) {
+                var codePoint = Number(arguments[index]);
+                if (
+                    !isFinite(codePoint) || // `NaN`, `+Infinity`, or `-Infinity`
+                    codePoint < 0 || // not a valid Unicode code point
+                    codePoint > 0x10ffff || // not a valid Unicode code point
+                    floor(codePoint) !== codePoint // not an integer
+                ) {
+                    return String.fromCharCode(0xfffd);
+                }
+                if (codePoint <= 0xffff) {
+                    // BMP code point
+                    codeUnits.push(codePoint);
+                } else {
+                    // Astral code point; split in surrogate halves
+                    // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae
+                    codePoint -= 0x10000;
+                    highSurrogate = (codePoint >> 10) + 0xd800;
+                    lowSurrogate = (codePoint % 0x400) + 0xdc00;
+                    codeUnits.push(highSurrogate, lowSurrogate);
+                }
+                if (index + 1 === length || codeUnits.length > MAX_SIZE) {
+                    result += stringFromCharCode.apply(null, codeUnits);
+                    codeUnits.length = 0;
+                }
+            }
+            return result;
+        };
+    }
+
+    /*! http://mths.be/repeat v0.2.0 by @mathias */
+    if (!String.prototype.repeat) {
+    	(function() {
+    		var defineProperty = (function() {
+    			// IE 8 only supports `Object.defineProperty` on DOM elements
+    			try {
+    				var object = {};
+    				var $defineProperty = Object.defineProperty;
+    				var result = $defineProperty(object, object, object) && $defineProperty;
+    			} catch(error) {}
+    			return result;
+    		}());
+    		var repeat = function(count) {
+    			if (this == null) {
+    				throw TypeError();
+    			}
+    			var string = String(this);
+    			// `ToInteger`
+    			var n = count ? Number(count) : 0;
+    			if (n != n) { // better `isNaN`
+    				n = 0;
+    			}
+    			// Account for out-of-bounds indices
+    			if (n < 0 || n == Infinity) {
+    				throw RangeError();
+    			}
+    			var result = '';
+    			while (n) {
+    				if (n % 2 == 1) {
+    					result += string;
+    				}
+    				if (n > 1) {
+    					string += string;
+    				}
+    				n >>= 1;
+    			}
+    			return result;
+    		};
+    		if (defineProperty) {
+    			defineProperty(String.prototype, 'repeat', {
+    				'value': repeat,
+    				'configurable': true,
+    				'writable': true
+    			});
+    		} else {
+    			String.prototype.repeat = repeat;
+    		}
+    	}());
+    }
+
+    var normalizeURI$1 = normalizeURI;
+    var unescapeString$1 = unescapeString;
+
+    // Constants for character codes:
+
+    var C_NEWLINE = 10;
+    var C_ASTERISK = 42;
+    var C_UNDERSCORE = 95;
+    var C_BACKTICK = 96;
+    var C_OPEN_BRACKET = 91;
+    var C_CLOSE_BRACKET = 93;
+    var C_LESSTHAN = 60;
+    var C_BANG = 33;
+    var C_BACKSLASH$1 = 92;
+    var C_AMPERSAND = 38;
+    var C_OPEN_PAREN = 40;
+    var C_CLOSE_PAREN = 41;
+    var C_COLON = 58;
+    var C_SINGLEQUOTE = 39;
+    var C_DOUBLEQUOTE = 34;
+
+    // Some regexps used in inline parser:
+
+    var ESCAPABLE$1 = ESCAPABLE;
+    var ESCAPED_CHAR = "\\\\" + ESCAPABLE$1;
+
+    var ENTITY$1 = ENTITY;
+    var reHtmlTag$1 = reHtmlTag;
+
+    var rePunctuation = new RegExp(
+        /^[!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~\xA1\xA7\xAB\xB6\xB7\xBB\xBF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u0AF0\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166D\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E42\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65]|\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC9\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9]|\uD805[\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDF3C-\uDF3E]|\uD809[\uDC70-\uDC74]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B]/
+    );
+
+    var reLinkTitle = new RegExp(
+        '^(?:"(' +
+            ESCAPED_CHAR +
+            '|[^"\\x00])*"' +
+            "|" +
+            "'(" +
+            ESCAPED_CHAR +
+            "|[^'\\x00])*'" +
+            "|" +
+            "\\((" +
+            ESCAPED_CHAR +
+            "|[^()\\x00])*\\))"
+    );
+
+    var reLinkDestinationBraces = /^(?:<(?:[^<>\n\\\x00]|\\.)*>)/;
+
+    var reEscapable = new RegExp("^" + ESCAPABLE$1);
+
+    var reEntityHere = new RegExp("^" + ENTITY$1, "i");
+
+    var reTicks = /`+/;
+
+    var reTicksHere = /^`+/;
+
+    var reEllipses = /\.\.\./g;
+
+    var reDash = /--+/g;
+
+    var reEmailAutolink = /^<([a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)>/;
+
+    var reAutolink = /^<[A-Za-z][A-Za-z0-9.+-]{1,31}:[^<>\x00-\x20]*>/i;
+
+    var reSpnl = /^ *(?:\n *)?/;
+
+    var reWhitespaceChar = /^[ \t\n\x0b\x0c\x0d]/;
+
+    var reUnicodeWhitespaceChar = /^\s/;
+
+    var reFinalSpace = / *$/;
+
+    var reInitialSpace = /^ */;
+
+    var reSpaceAtEndOfLine = /^ *(?:\n|$)/;
+
+    var reLinkLabel = /^\[(?:[^\\\[\]]|\\.){0,1000}\]/s;
+
+    // Matches a string of non-special characters.
+    var reMain = /^[^\n`\[\]\\!<&*_'"]+/m;
+
+    var text = function(s) {
+        var node = new Node("text");
+        node._literal = s;
+        return node;
+    };
+
+    // normalize a reference in reference link (remove []s, trim,
+    // collapse internal space, unicode case fold.
+    // See commonmark/commonmark.js#168.
+    var normalizeReference = function(string) {
+        return string
+            .slice(1, string.length - 1)
+            .trim()
+            .replace(/[ \t\r\n]+/, " ")
+            .toLowerCase()
+            .toUpperCase();
+    };
+
+    // INLINE PARSER
+
+    // These are methods of an InlineParser object, defined below.
+    // An InlineParser keeps track of a subject (a string to be
+    // parsed) and a position in that subject.
+
+    // If re matches at current position in the subject, advance
+    // position in subject and return the match; otherwise return null.
+    var match = function(re) {
+        var m = re.exec(this.subject.slice(this.pos));
+        if (m === null) {
+            return null;
+        } else {
+            this.pos += m.index + m[0].length;
+            return m[0];
+        }
+    };
+
+    // Returns the code for the character at the current subject position, or -1
+    // there are no more characters.
+    var peek = function() {
+        if (this.pos < this.subject.length) {
+            return this.subject.charCodeAt(this.pos);
+        } else {
+            return -1;
+        }
+    };
+
+    // Parse zero or more space characters, including at most one newline
+    var spnl = function() {
+        this.match(reSpnl);
+        return true;
+    };
+
+    // All of the parsers below try to match something at the current position
+    // in the subject.  If they succeed in matching anything, they
+    // return the inline matched, advancing the subject.
+
+    // Attempt to parse backticks, adding either a backtick code span or a
+    // literal sequence of backticks.
+    var parseBackticks = function(block) {
+        var ticks = this.match(reTicksHere);
+        if (ticks === null) {
+            return false;
+        }
+        var afterOpenTicks = this.pos;
+        var matched;
+        var node;
+        var contents;
+        while ((matched = this.match(reTicks)) !== null) {
+            if (matched === ticks) {
+                node = new Node("code");
+                contents = this.subject
+                    .slice(afterOpenTicks, this.pos - ticks.length)
+                    .replace(/\n/gm, " ");
+                if (
+                    contents.length > 0 &&
+                    contents.match(/[^ ]/) !== null &&
+                    contents[0] == " " &&
+                    contents[contents.length - 1] == " "
+                ) {
+                    node._literal = contents.slice(1, contents.length - 1);
+                } else {
+                    node._literal = contents;
+                }
+                block.appendChild(node);
+                return true;
+            }
+        }
+        // If we got here, we didn't match a closing backtick sequence.
+        this.pos = afterOpenTicks;
+        block.appendChild(text(ticks));
+        return true;
+    };
+
+    // Parse a backslash-escaped special character, adding either the escaped
+    // character, a hard line break (if the backslash is followed by a newline),
+    // or a literal backslash to the block's children.  Assumes current character
+    // is a backslash.
+    var parseBackslash = function(block) {
+        var subj = this.subject;
+        var node;
+        this.pos += 1;
+        if (this.peek() === C_NEWLINE) {
+            this.pos += 1;
+            node = new Node("linebreak");
+            block.appendChild(node);
+        } else if (reEscapable.test(subj.charAt(this.pos))) {
+            block.appendChild(text(subj.charAt(this.pos)));
+            this.pos += 1;
+        } else {
+            block.appendChild(text("\\"));
+        }
+        return true;
+    };
+
+    // Attempt to parse an autolink (URL or email in pointy brackets).
+    var parseAutolink = function(block) {
+        var m;
+        var dest;
+        var node;
+        if ((m = this.match(reEmailAutolink))) {
+            dest = m.slice(1, m.length - 1);
+            node = new Node("link");
+            node._destination = normalizeURI$1("mailto:" + dest);
+            node._title = "";
+            node.appendChild(text(dest));
+            block.appendChild(node);
+            return true;
+        } else if ((m = this.match(reAutolink))) {
+            dest = m.slice(1, m.length - 1);
+            node = new Node("link");
+            node._destination = normalizeURI$1(dest);
+            node._title = "";
+            node.appendChild(text(dest));
+            block.appendChild(node);
+            return true;
+        } else {
+            return false;
+        }
+    };
+
+    // Attempt to parse a raw HTML tag.
+    var parseHtmlTag = function(block) {
+        var m = this.match(reHtmlTag$1);
+        if (m === null) {
+            return false;
+        } else {
+            var node = new Node("html_inline");
+            node._literal = m;
+            block.appendChild(node);
+            return true;
+        }
+    };
+
+    // Scan a sequence of characters with code cc, and return information about
+    // the number of delimiters and whether they are positioned such that
+    // they can open and/or close emphasis or strong emphasis.  A utility
+    // function for strong/emph parsing.
+    var scanDelims = function(cc) {
+        var numdelims = 0;
+        var char_before, char_after, cc_after;
+        var startpos = this.pos;
+        var left_flanking, right_flanking, can_open, can_close;
+        var after_is_whitespace,
+            after_is_punctuation,
+            before_is_whitespace,
+            before_is_punctuation;
+
+        if (cc === C_SINGLEQUOTE || cc === C_DOUBLEQUOTE) {
+            numdelims++;
+            this.pos++;
+        } else {
+            while (this.peek() === cc) {
+                numdelims++;
+                this.pos++;
+            }
+        }
+
+        if (numdelims === 0) {
+            return null;
+        }
+
+        char_before = startpos === 0 ? "\n" : this.subject.charAt(startpos - 1);
+
+        cc_after = this.peek();
+        if (cc_after === -1) {
+            char_after = "\n";
+        } else {
+            char_after = fromCodePoint(cc_after);
+        }
+
+        after_is_whitespace = reUnicodeWhitespaceChar.test(char_after);
+        after_is_punctuation = rePunctuation.test(char_after);
+        before_is_whitespace = reUnicodeWhitespaceChar.test(char_before);
+        before_is_punctuation = rePunctuation.test(char_before);
+
+        left_flanking =
+            !after_is_whitespace &&
+            (!after_is_punctuation ||
+                before_is_whitespace ||
+                before_is_punctuation);
+        right_flanking =
+            !before_is_whitespace &&
+            (!before_is_punctuation || after_is_whitespace || after_is_punctuation);
+        if (cc === C_UNDERSCORE) {
+            can_open = left_flanking && (!right_flanking || before_is_punctuation);
+            can_close = right_flanking && (!left_flanking || after_is_punctuation);
+        } else if (cc === C_SINGLEQUOTE || cc === C_DOUBLEQUOTE) {
+            can_open = left_flanking && !right_flanking;
+            can_close = right_flanking;
+        } else {
+            can_open = left_flanking;
+            can_close = right_flanking;
+        }
+        this.pos = startpos;
+        return { numdelims: numdelims, can_open: can_open, can_close: can_close };
+    };
+
+    // Handle a delimiter marker for emphasis or a quote.
+    var handleDelim = function(cc, block) {
+        var res = this.scanDelims(cc);
+        if (!res) {
+            return false;
+        }
+        var numdelims = res.numdelims;
+        var startpos = this.pos;
+        var contents;
+
+        this.pos += numdelims;
+        if (cc === C_SINGLEQUOTE) {
+            contents = "\u2019";
+        } else if (cc === C_DOUBLEQUOTE) {
+            contents = "\u201C";
+        } else {
+            contents = this.subject.slice(startpos, this.pos);
+        }
+        var node = text(contents);
+        block.appendChild(node);
+
+        // Add entry to stack for this opener
+        if (
+            (res.can_open || res.can_close) &&
+            (this.options.smart || (cc !== C_SINGLEQUOTE && cc !== C_DOUBLEQUOTE))
+        ) {
+            this.delimiters = {
+                cc: cc,
+                numdelims: numdelims,
+                origdelims: numdelims,
+                node: node,
+                previous: this.delimiters,
+                next: null,
+                can_open: res.can_open,
+                can_close: res.can_close
+            };
+            if (this.delimiters.previous !== null) {
+                this.delimiters.previous.next = this.delimiters;
+            }
+        }
+
+        return true;
+    };
+
+    var removeDelimiter = function(delim) {
+        if (delim.previous !== null) {
+            delim.previous.next = delim.next;
+        }
+        if (delim.next === null) {
+            // top of stack
+            this.delimiters = delim.previous;
+        } else {
+            delim.next.previous = delim.previous;
+        }
+    };
+
+    var removeDelimitersBetween = function(bottom, top) {
+        if (bottom.next !== top) {
+            bottom.next = top;
+            top.previous = bottom;
+        }
+    };
+
+    var processEmphasis = function(stack_bottom) {
+        var opener, closer, old_closer;
+        var opener_inl, closer_inl;
+        var tempstack;
+        var use_delims;
+        var tmp, next;
+        var opener_found;
+        var openers_bottom = [];
+        var openers_bottom_index;
+        var odd_match = false;
+
+        for (var i = 0; i < 8; i++) {
+            openers_bottom[i] = stack_bottom;
+        }
+        // find first closer above stack_bottom:
+        closer = this.delimiters;
+        while (closer !== null && closer.previous !== stack_bottom) {
+            closer = closer.previous;
+        }
+        // move forward, looking for closers, and handling each
+        while (closer !== null) {
+            var closercc = closer.cc;
+            if (!closer.can_close) {
+                closer = closer.next;
+            } else {
+                // found emphasis closer. now look back for first matching opener:
+                opener = closer.previous;
+                opener_found = false;
+                switch (closercc) {
+                   case C_SINGLEQUOTE:
+                     openers_bottom_index = 0;
+                     break;
+                   case C_DOUBLEQUOTE:
+                     openers_bottom_index = 1;
+                     break;
+                   case C_UNDERSCORE:
+                     openers_bottom_index = 2;
+                     break;
+                   case C_ASTERISK:
+                     openers_bottom_index = 3 + (closer.can_open ? 3 : 0)
+                                              + (closer.origdelims % 3);
+                     break;
+                }
+                while (
+                    opener !== null &&
+                    opener !== stack_bottom &&
+                    opener !== openers_bottom[openers_bottom_index]
+                ) {
+                    odd_match =
+                        (closer.can_open || opener.can_close) &&
+                        closer.origdelims % 3 !== 0 &&
+                        (opener.origdelims + closer.origdelims) % 3 === 0;
+                    if (opener.cc === closer.cc && opener.can_open && !odd_match) {
+                        opener_found = true;
+                        break;
+                    }
+                    opener = opener.previous;
+                }
+                old_closer = closer;
+
+                if (closercc === C_ASTERISK || closercc === C_UNDERSCORE) {
+                    if (!opener_found) {
+                        closer = closer.next;
+                    } else {
+                        // calculate actual number of delimiters used from closer
+                        use_delims =
+                            closer.numdelims >= 2 && opener.numdelims >= 2 ? 2 : 1;
+
+                        opener_inl = opener.node;
+                        closer_inl = closer.node;
+
+                        // remove used delimiters from stack elts and inlines
+                        opener.numdelims -= use_delims;
+                        closer.numdelims -= use_delims;
+                        opener_inl._literal = opener_inl._literal.slice(
+                            0,
+                            opener_inl._literal.length - use_delims
+                        );
+                        closer_inl._literal = closer_inl._literal.slice(
+                            0,
+                            closer_inl._literal.length - use_delims
+                        );
+
+                        // build contents for new emph element
+                        var emph = new Node(use_delims === 1 ? "emph" : "strong");
+
+                        tmp = opener_inl._next;
+                        while (tmp && tmp !== closer_inl) {
+                            next = tmp._next;
+                            tmp.unlink();
+                            emph.appendChild(tmp);
+                            tmp = next;
+                        }
+
+                        opener_inl.insertAfter(emph);
+
+                        // remove elts between opener and closer in delimiters stack
+                        removeDelimitersBetween(opener, closer);
+
+                        // if opener has 0 delims, remove it and the inline
+                        if (opener.numdelims === 0) {
+                            opener_inl.unlink();
+                            this.removeDelimiter(opener);
+                        }
+
+                        if (closer.numdelims === 0) {
+                            closer_inl.unlink();
+                            tempstack = closer.next;
+                            this.removeDelimiter(closer);
+                            closer = tempstack;
+                        }
+                    }
+                } else if (closercc === C_SINGLEQUOTE) {
+                    closer.node._literal = "\u2019";
+                    if (opener_found) {
+                        opener.node._literal = "\u2018";
+                    }
+                    closer = closer.next;
+                } else if (closercc === C_DOUBLEQUOTE) {
+                    closer.node._literal = "\u201D";
+                    if (opener_found) {
+                        opener.node.literal = "\u201C";
+                    }
+                    closer = closer.next;
+                }
+                if (!opener_found) {
+                    // Set lower bound for future searches for openers:
+                    openers_bottom[openers_bottom_index] =
+                        old_closer.previous;
+                    if (!old_closer.can_open) {
+                        // We can remove a closer that can't be an opener,
+                        // once we've seen there's no matching opener:
+                        this.removeDelimiter(old_closer);
+                    }
+                }
+            }
+        }
+
+        // remove all delimiters
+        while (this.delimiters !== null && this.delimiters !== stack_bottom) {
+            this.removeDelimiter(this.delimiters);
+        }
+    };
+
+    // Attempt to parse link title (sans quotes), returning the string
+    // or null if no match.
+    var parseLinkTitle = function() {
+        var title = this.match(reLinkTitle);
+        if (title === null) {
+            return null;
+        } else {
+            // chop off quotes from title and unescape:
+            return unescapeString$1(title.substr(1, title.length - 2));
+        }
+    };
+
+    // Attempt to parse link destination, returning the string or
+    // null if no match.
+    var parseLinkDestination = function() {
+        var res = this.match(reLinkDestinationBraces);
+        if (res === null) {
+            if (this.peek() === C_LESSTHAN) {
+                return null;
+            }
+            // TODO handrolled parser; res should be null or the string
+            var savepos = this.pos;
+            var openparens = 0;
+            var c;
+            while ((c = this.peek()) !== -1) {
+                if (
+                    c === C_BACKSLASH$1 &&
+                    reEscapable.test(this.subject.charAt(this.pos + 1))
+                ) {
+                    this.pos += 1;
+                    if (this.peek() !== -1) {
+                        this.pos += 1;
+                    }
+                } else if (c === C_OPEN_PAREN) {
+                    this.pos += 1;
+                    openparens += 1;
+                } else if (c === C_CLOSE_PAREN) {
+                    if (openparens < 1) {
+                        break;
+                    } else {
+                        this.pos += 1;
+                        openparens -= 1;
+                    }
+                } else if (reWhitespaceChar.exec(fromCodePoint(c)) !== null) {
+                    break;
+                } else {
+                    this.pos += 1;
+                }
+            }
+            if (this.pos === savepos && c !== C_CLOSE_PAREN) {
+                return null;
+            }
+            if (openparens !== 0) {
+                return null;
+            }
+            res = this.subject.substr(savepos, this.pos - savepos);
+            return normalizeURI$1(unescapeString$1(res));
+        } else {
+            // chop off surrounding <..>:
+            return normalizeURI$1(unescapeString$1(res.substr(1, res.length - 2)));
+        }
+    };
+
+    // Attempt to parse a link label, returning number of characters parsed.
+    var parseLinkLabel = function() {
+        var m = this.match(reLinkLabel);
+        if (m === null || m.length > 1001) {
+            return 0;
+        } else {
+            return m.length;
+        }
+    };
+
+    // Add open bracket to delimiter stack and add a text node to block's children.
+    var parseOpenBracket = function(block) {
+        var startpos = this.pos;
+        this.pos += 1;
+
+        var node = text("[");
+        block.appendChild(node);
+
+        // Add entry to stack for this opener
+        this.addBracket(node, startpos, false);
+        return true;
+    };
+
+    // IF next character is [, and ! delimiter to delimiter stack and
+    // add a text node to block's children.  Otherwise just add a text node.
+    var parseBang = function(block) {
+        var startpos = this.pos;
+        this.pos += 1;
+        if (this.peek() === C_OPEN_BRACKET) {
+            this.pos += 1;
+
+            var node = text("![");
+            block.appendChild(node);
+
+            // Add entry to stack for this opener
+            this.addBracket(node, startpos + 1, true);
+        } else {
+            block.appendChild(text("!"));
+        }
+        return true;
+    };
+
+    // Try to match close bracket against an opening in the delimiter
+    // stack.  Add either a link or image, or a plain [ character,
+    // to block's children.  If there is a matching delimiter,
+    // remove it from the delimiter stack.
+    var parseCloseBracket = function(block) {
+        var startpos;
+        var is_image;
+        var dest;
+        var title;
+        var matched = false;
+        var reflabel;
+        var opener;
+
+        this.pos += 1;
+        startpos = this.pos;
+
+        // get last [ or ![
+        opener = this.brackets;
+
+        if (opener === null) {
+            // no matched opener, just return a literal
+            block.appendChild(text("]"));
+            return true;
+        }
+
+        if (!opener.active) {
+            // no matched opener, just return a literal
+            block.appendChild(text("]"));
+            // take opener off brackets stack
+            this.removeBracket();
+            return true;
+        }
+
+        // If we got here, open is a potential opener
+        is_image = opener.image;
+
+        // Check to see if we have a link/image
+
+        var savepos = this.pos;
+
+        // Inline link?
+        if (this.peek() === C_OPEN_PAREN) {
+            this.pos++;
+            if (
+                this.spnl() &&
+                (dest = this.parseLinkDestination()) !== null &&
+                this.spnl() &&
+                // make sure there's a space before the title:
+                ((reWhitespaceChar.test(this.subject.charAt(this.pos - 1)) &&
+                    (title = this.parseLinkTitle())) ||
+                    true) &&
+                this.spnl() &&
+                this.peek() === C_CLOSE_PAREN
+            ) {
+                this.pos += 1;
+                matched = true;
+            } else {
+                this.pos = savepos;
+            }
+        }
+
+        if (!matched) {
+            // Next, see if there's a link label
+            var beforelabel = this.pos;
+            var n = this.parseLinkLabel();
+            if (n > 2) {
+                reflabel = this.subject.slice(beforelabel, beforelabel + n);
+            } else if (!opener.bracketAfter) {
+                // Empty or missing second label means to use the first label as the reference.
+                // The reference must not contain a bracket. If we know there's a bracket, we don't even bother checking it.
+                reflabel = this.subject.slice(opener.index, startpos);
+            }
+            if (n === 0) {
+                // If shortcut reference link, rewind before spaces we skipped.
+                this.pos = savepos;
+            }
+
+            if (reflabel) {
+                // lookup rawlabel in refmap
+                var link = this.refmap[normalizeReference(reflabel)];
+                if (link) {
+                    dest = link.destination;
+                    title = link.title;
+                    matched = true;
+                }
+            }
+        }
+
+        if (matched) {
+            var node = new Node(is_image ? "image" : "link");
+            node._destination = dest;
+            node._title = title || "";
+
+            var tmp, next;
+            tmp = opener.node._next;
+            while (tmp) {
+                next = tmp._next;
+                tmp.unlink();
+                node.appendChild(tmp);
+                tmp = next;
+            }
+            block.appendChild(node);
+            this.processEmphasis(opener.previousDelimiter);
+            this.removeBracket();
+            opener.node.unlink();
+
+            // We remove this bracket and processEmphasis will remove later delimiters.
+            // Now, for a link, we also deactivate earlier link openers.
+            // (no links in links)
+            if (!is_image) {
+                opener = this.brackets;
+                while (opener !== null) {
+                    if (!opener.image) {
+                        opener.active = false; // deactivate this opener
+                    }
+                    opener = opener.previous;
+                }
+            }
+
+            return true;
+        } else {
+            // no match
+
+            this.removeBracket(); // remove this opener from stack
+            this.pos = startpos;
+            block.appendChild(text("]"));
+            return true;
+        }
+    };
+
+    var addBracket = function(node, index, image) {
+        if (this.brackets !== null) {
+            this.brackets.bracketAfter = true;
+        }
+        this.brackets = {
+            node: node,
+            previous: this.brackets,
+            previousDelimiter: this.delimiters,
+            index: index,
+            image: image,
+            active: true
+        };
+    };
+
+    var removeBracket = function() {
+        this.brackets = this.brackets.previous;
+    };
+
+    // Attempt to parse an entity.
+    var parseEntity = function(block) {
+        var m;
+        if ((m = this.match(reEntityHere))) {
+            block.appendChild(text(lib_9(m)));
+            return true;
+        } else {
+            return false;
+        }
+    };
+
+    // Parse a run of ordinary characters, or a single character with
+    // a special meaning in markdown, as a plain string.
+    var parseString = function(block) {
+        var m;
+        if ((m = this.match(reMain))) {
+            if (this.options.smart) {
+                block.appendChild(
+                    text(
+                        m
+                            .replace(reEllipses, "\u2026")
+                            .replace(reDash, function(chars) {
+                                var enCount = 0;
+                                var emCount = 0;
+                                if (chars.length % 3 === 0) {
+                                    // If divisible by 3, use all em dashes
+                                    emCount = chars.length / 3;
+                                } else if (chars.length % 2 === 0) {
+                                    // If divisible by 2, use all en dashes
+                                    enCount = chars.length / 2;
+                                } else if (chars.length % 3 === 2) {
+                                    // If 2 extra dashes, use en dash for last 2; em dashes for rest
+                                    enCount = 1;
+                                    emCount = (chars.length - 2) / 3;
+                                } else {
+                                    // Use en dashes for last 4 hyphens; em dashes for rest
+                                    enCount = 2;
+                                    emCount = (chars.length - 4) / 3;
+                                }
+                                return (
+                                    "\u2014".repeat(emCount) +
+                                    "\u2013".repeat(enCount)
+                                );
+                            })
+                    )
+                );
+            } else {
+                block.appendChild(text(m));
+            }
+            return true;
+        } else {
+            return false;
+        }
+    };
+
+    // Parse a newline.  If it was preceded by two spaces, return a hard
+    // line break; otherwise a soft line break.
+    var parseNewline = function(block) {
+        this.pos += 1; // assume we're at a \n
+        // check previous node for trailing spaces
+        var lastc = block._lastChild;
+        if (
+            lastc &&
+            lastc.type === "text" &&
+            lastc._literal[lastc._literal.length - 1] === " "
+        ) {
+            var hardbreak = lastc._literal[lastc._literal.length - 2] === " ";
+            lastc._literal = lastc._literal.replace(reFinalSpace, "");
+            block.appendChild(new Node(hardbreak ? "linebreak" : "softbreak"));
+        } else {
+            block.appendChild(new Node("softbreak"));
+        }
+        this.match(reInitialSpace); // gobble leading spaces in next line
+        return true;
+    };
+
+    // Attempt to parse a link reference, modifying refmap.
+    var parseReference = function(s, refmap) {
+        this.subject = s;
+        this.pos = 0;
+        var rawlabel;
+        var dest;
+        var title;
+        var matchChars;
+        var startpos = this.pos;
+
+        // label:
+        matchChars = this.parseLinkLabel();
+        if (matchChars === 0) {
+            return 0;
+        } else {
+            rawlabel = this.subject.substr(0, matchChars);
+        }
+
+        // colon:
+        if (this.peek() === C_COLON) {
+            this.pos++;
+        } else {
+            this.pos = startpos;
+            return 0;
+        }
+
+        //  link url
+        this.spnl();
+
+        dest = this.parseLinkDestination();
+        if (dest === null) {
+            this.pos = startpos;
+            return 0;
+        }
+
+        var beforetitle = this.pos;
+        this.spnl();
+        if (this.pos !== beforetitle) {
+            title = this.parseLinkTitle();
+        }
+        if (title === null) {
+            title = "";
+            // rewind before spaces
+            this.pos = beforetitle;
+        }
+
+        // make sure we're at line end:
+        var atLineEnd = true;
+        if (this.match(reSpaceAtEndOfLine) === null) {
+            if (title === "") {
+                atLineEnd = false;
+            } else {
+                // the potential title we found is not at the line end,
+                // but it could still be a legal link reference if we
+                // discard the title
+                title = "";
+                // rewind before spaces
+                this.pos = beforetitle;
+                // and instead check if the link URL is at the line end
+                atLineEnd = this.match(reSpaceAtEndOfLine) !== null;
+            }
+        }
+
+        if (!atLineEnd) {
+            this.pos = startpos;
+            return 0;
+        }
+
+        var normlabel = normalizeReference(rawlabel);
+        if (normlabel === "") {
+            // label must contain non-whitespace characters
+            this.pos = startpos;
+            return 0;
+        }
+
+        if (!refmap[normlabel]) {
+            refmap[normlabel] = { destination: dest, title: title };
+        }
+        return this.pos - startpos;
+    };
+
+    // Parse the next inline element in subject, advancing subject position.
+    // On success, add the result to block's children and return true.
+    // On failure, return false.
+    var parseInline = function(block) {
+        var res = false;
+        var c = this.peek();
+        if (c === -1) {
+            return false;
+        }
+        switch (c) {
+            case C_NEWLINE:
+                res = this.parseNewline(block);
+                break;
+            case C_BACKSLASH$1:
+                res = this.parseBackslash(block);
+                break;
+            case C_BACKTICK:
+                res = this.parseBackticks(block);
+                break;
+            case C_ASTERISK:
+            case C_UNDERSCORE:
+                res = this.handleDelim(c, block);
+                break;
+            case C_SINGLEQUOTE:
+            case C_DOUBLEQUOTE:
+                res = this.options.smart && this.handleDelim(c, block);
+                break;
+            case C_OPEN_BRACKET:
+                res = this.parseOpenBracket(block);
+                break;
+            case C_BANG:
+                res = this.parseBang(block);
+                break;
+            case C_CLOSE_BRACKET:
+                res = this.parseCloseBracket(block);
+                break;
+            case C_LESSTHAN:
+                res = this.parseAutolink(block) || this.parseHtmlTag(block);
+                break;
+            case C_AMPERSAND:
+                res = this.parseEntity(block);
+                break;
+            default:
+                res = this.parseString(block);
+                break;
+        }
+        if (!res) {
+            this.pos += 1;
+            block.appendChild(text(fromCodePoint(c)));
+        }
+
+        return true;
+    };
+
+    // Parse string content in block into inline children,
+    // using refmap to resolve references.
+    var parseInlines = function(block) {
+        this.subject = block._string_content.trim();
+        this.pos = 0;
+        this.delimiters = null;
+        this.brackets = null;
+        while (this.parseInline(block)) {}
+        block._string_content = null; // allow raw string to be garbage collected
+        this.processEmphasis(null);
+    };
+
+    // The InlineParser object.
+    function InlineParser(options) {
+        return {
+            subject: "",
+            delimiters: null, // used by handleDelim method
+            brackets: null,
+            pos: 0,
+            refmap: {},
+            match: match,
+            peek: peek,
+            spnl: spnl,
+            parseBackticks: parseBackticks,
+            parseBackslash: parseBackslash,
+            parseAutolink: parseAutolink,
+            parseHtmlTag: parseHtmlTag,
+            scanDelims: scanDelims,
+            handleDelim: handleDelim,
+            parseLinkTitle: parseLinkTitle,
+            parseLinkDestination: parseLinkDestination,
+            parseLinkLabel: parseLinkLabel,
+            parseOpenBracket: parseOpenBracket,
+            parseBang: parseBang,
+            parseCloseBracket: parseCloseBracket,
+            addBracket: addBracket,
+            removeBracket: removeBracket,
+            parseEntity: parseEntity,
+            parseString: parseString,
+            parseNewline: parseNewline,
+            parseReference: parseReference,
+            parseInline: parseInline,
+            processEmphasis: processEmphasis,
+            removeDelimiter: removeDelimiter,
+            options: options || {},
+            parse: parseInlines
+        };
+    }
+
+    var CODE_INDENT = 4;
+
+    var C_TAB = 9;
+    var C_NEWLINE$1 = 10;
+    var C_GREATERTHAN = 62;
+    var C_LESSTHAN$1 = 60;
+    var C_SPACE = 32;
+    var C_OPEN_BRACKET$1 = 91;
+
+    var reHtmlBlockOpen = [
+        /./, // dummy for 0
+        /^<(?:script|pre|textarea|style)(?:\s|>|$)/i,
+        /^<!--/,
+        /^<[?]/,
+        /^<![A-Z]/,
+        /^<!\[CDATA\[/,
+        /^<[/]?(?:address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[123456]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|nav|noframes|ol|optgroup|option|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul)(?:\s|[/]?[>]|$)/i,
+        new RegExp("^(?:" + OPENTAG + "|" + CLOSETAG + ")\\s*$", "i")
+    ];
+
+    var reHtmlBlockClose = [
+        /./, // dummy for 0
+        /<\/(?:script|pre|textarea|style)>/i,
+        /-->/,
+        /\?>/,
+        />/,
+        /\]\]>/
+    ];
+
+    var reThematicBreak = /^(?:\*[ \t]*){3,}$|^(?:_[ \t]*){3,}$|^(?:-[ \t]*){3,}$/;
+
+    var reMaybeSpecial = /^[#`~*+_=<>0-9-]/;
+
+    var reNonSpace = /[^ \t\f\v\r\n]/;
+
+    var reBulletListMarker = /^[*+-]/;
+
+    var reOrderedListMarker = /^(\d{1,9})([.)])/;
+
+    var reATXHeadingMarker = /^#{1,6}(?:[ \t]+|$)/;
+
+    var reCodeFence = /^`{3,}(?!.*`)|^~{3,}/;
+
+    var reClosingCodeFence = /^(?:`{3,}|~{3,})(?= *$)/;
+
+    var reSetextHeadingLine = /^(?:=+|-+)[ \t]*$/;
+
+    var reLineEnding = /\r\n|\n|\r/;
+
+    // Returns true if string contains only space characters.
+    var isBlank = function(s) {
+        return !reNonSpace.test(s);
+    };
+
+    var isSpaceOrTab = function(c) {
+        return c === C_SPACE || c === C_TAB;
+    };
+
+    var peek$1 = function(ln, pos) {
+        if (pos < ln.length) {
+            return ln.charCodeAt(pos);
+        } else {
+            return -1;
+        }
+    };
+
+    // DOC PARSER
+
+    // These are methods of a Parser object, defined below.
+
+    // Returns true if block ends with a blank line, descending if needed
+    // into lists and sublists.
+    var endsWithBlankLine = function(block) {
+        while (block) {
+            if (block._lastLineBlank) {
+                return true;
+            }
+            var t = block.type;
+            if (!block._lastLineChecked && (t === "list" || t === "item")) {
+                block._lastLineChecked = true;
+                block = block._lastChild;
+            } else {
+                block._lastLineChecked = true;
+                break;
+            }
+        }
+        return false;
+    };
+
+    // Add a line to the block at the tip.  We assume the tip
+    // can accept lines -- that check should be done before calling this.
+    var addLine = function() {
+        if (this.partiallyConsumedTab) {
+            this.offset += 1; // skip over tab
+            // add space characters:
+            var charsToTab = 4 - (this.column % 4);
+            this.tip._string_content += " ".repeat(charsToTab);
+        }
+        this.tip._string_content += this.currentLine.slice(this.offset) + "\n";
+    };
+
+    // Add block of type tag as a child of the tip.  If the tip can't
+    // accept children, close and finalize it and try its parent,
+    // and so on til we find a block that can accept children.
+    var addChild = function(tag, offset) {
+        while (!this.blocks[this.tip.type].canContain(tag)) {
+            this.finalize(this.tip, this.lineNumber - 1);
+        }
+
+        var column_number = offset + 1; // offset 0 = column 1
+        var newBlock = new Node(tag, [
+            [this.lineNumber, column_number],
+            [0, 0]
+        ]);
+        newBlock._string_content = "";
+        this.tip.appendChild(newBlock);
+        this.tip = newBlock;
+        return newBlock;
+    };
+
+    // Parse a list marker and return data on the marker (type,
+    // start, delimiter, bullet character, padding) or null.
+    var parseListMarker = function(parser, container) {
+        var rest = parser.currentLine.slice(parser.nextNonspace);
+        var match;
+        var nextc;
+        var spacesStartCol;
+        var spacesStartOffset;
+        var data = {
+            type: null,
+            tight: true, // lists are tight by default
+            bulletChar: null,
+            start: null,
+            delimiter: null,
+            padding: null,
+            markerOffset: parser.indent
+        };
+        if (parser.indent >= 4) {
+            return null;
+        }
+        if ((match = rest.match(reBulletListMarker))) {
+            data.type = "bullet";
+            data.bulletChar = match[0][0];
+        } else if (
+            (match = rest.match(reOrderedListMarker)) &&
+            (container.type !== "paragraph" || match[1] == 1)
+        ) {
+            data.type = "ordered";
+            data.start = parseInt(match[1]);
+            data.delimiter = match[2];
+        } else {
+            return null;
+        }
+        // make sure we have spaces after
+        nextc = peek$1(parser.currentLine, parser.nextNonspace + match[0].length);
+        if (!(nextc === -1 || nextc === C_TAB || nextc === C_SPACE)) {
+            return null;
+        }
+
+        // if it interrupts paragraph, make sure first line isn't blank
+        if (
+            container.type === "paragraph" &&
+            !parser.currentLine
+                .slice(parser.nextNonspace + match[0].length)
+                .match(reNonSpace)
+        ) {
+            return null;
+        }
+
+        // we've got a match! advance offset and calculate padding
+        parser.advanceNextNonspace(); // to start of marker
+        parser.advanceOffset(match[0].length, true); // to end of marker
+        spacesStartCol = parser.column;
+        spacesStartOffset = parser.offset;
+        do {
+            parser.advanceOffset(1, true);
+            nextc = peek$1(parser.currentLine, parser.offset);
+        } while (parser.column - spacesStartCol < 5 && isSpaceOrTab(nextc));
+        var blank_item = peek$1(parser.currentLine, parser.offset) === -1;
+        var spaces_after_marker = parser.column - spacesStartCol;
+        if (spaces_after_marker >= 5 || spaces_after_marker < 1 || blank_item) {
+            data.padding = match[0].length + 1;
+            parser.column = spacesStartCol;
+            parser.offset = spacesStartOffset;
+            if (isSpaceOrTab(peek$1(parser.currentLine, parser.offset))) {
+                parser.advanceOffset(1, true);
+            }
+        } else {
+            data.padding = match[0].length + spaces_after_marker;
+        }
+        return data;
+    };
+
+    // Returns true if the two list items are of the same type,
+    // with the same delimiter and bullet character.  This is used
+    // in agglomerating list items into lists.
+    var listsMatch = function(list_data, item_data) {
+        return (
+            list_data.type === item_data.type &&
+            list_data.delimiter === item_data.delimiter &&
+            list_data.bulletChar === item_data.bulletChar
+        );
+    };
+
+    // Finalize and close any unmatched blocks.
+    var closeUnmatchedBlocks = function() {
+        if (!this.allClosed) {
+            // finalize any blocks not matched
+            while (this.oldtip !== this.lastMatchedContainer) {
+                var parent = this.oldtip._parent;
+                this.finalize(this.oldtip, this.lineNumber - 1);
+                this.oldtip = parent;
+            }
+            this.allClosed = true;
+        }
+    };
+
+    // 'finalize' is run when the block is closed.
+    // 'continue' is run to check whether the block is continuing
+    // at a certain line and offset (e.g. whether a block quote
+    // contains a `>`.  It returns 0 for matched, 1 for not matched,
+    // and 2 for "we've dealt with this line completely, go to next."
+    var blocks = {
+        document: {
+            continue: function() {
+                return 0;
+            },
+            finalize: function() {
+                return;
+            },
+            canContain: function(t) {
+                return t !== "item";
+            },
+            acceptsLines: false
+        },
+        list: {
+            continue: function() {
+                return 0;
+            },
+            finalize: function(parser, block) {
+                var item = block._firstChild;
+                while (item) {
+                    // check for non-final list item ending with blank line:
+                    if (endsWithBlankLine(item) && item._next) {
+                        block._listData.tight = false;
+                        break;
+                    }
+                    // recurse into children of list item, to see if there are
+                    // spaces between any of them:
+                    var subitem = item._firstChild;
+                    while (subitem) {
+                        if (
+                            endsWithBlankLine(subitem) &&
+                            (item._next || subitem._next)
+                        ) {
+                            block._listData.tight = false;
+                            break;
+                        }
+                        subitem = subitem._next;
+                    }
+                    item = item._next;
+                }
+            },
+            canContain: function(t) {
+                return t === "item";
+            },
+            acceptsLines: false
+        },
+        block_quote: {
+            continue: function(parser) {
+                var ln = parser.currentLine;
+                if (
+                    !parser.indented &&
+                    peek$1(ln, parser.nextNonspace) === C_GREATERTHAN
+                ) {
+                    parser.advanceNextNonspace();
+                    parser.advanceOffset(1, false);
+                    if (isSpaceOrTab(peek$1(ln, parser.offset))) {
+                        parser.advanceOffset(1, true);
+                    }
+                } else {
+                    return 1;
+                }
+                return 0;
+            },
+            finalize: function() {
+                return;
+            },
+            canContain: function(t) {
+                return t !== "item";
+            },
+            acceptsLines: false
+        },
+        item: {
+            continue: function(parser, container) {
+                if (parser.blank) {
+                    if (container._firstChild == null) {
+                        // Blank line after empty list item
+                        return 1;
+                    } else {
+                        parser.advanceNextNonspace();
+                    }
+                } else if (
+                    parser.indent >=
+                    container._listData.markerOffset + container._listData.padding
+                ) {
+                    parser.advanceOffset(
+                        container._listData.markerOffset +
+                            container._listData.padding,
+                        true
+                    );
+                } else {
+                    return 1;
+                }
+                return 0;
+            },
+            finalize: function() {
+                return;
+            },
+            canContain: function(t) {
+                return t !== "item";
+            },
+            acceptsLines: false
+        },
+        heading: {
+            continue: function() {
+                // a heading can never container > 1 line, so fail to match:
+                return 1;
+            },
+            finalize: function() {
+                return;
+            },
+            canContain: function() {
+                return false;
+            },
+            acceptsLines: false
+        },
+        thematic_break: {
+            continue: function() {
+                // a thematic break can never container > 1 line, so fail to match:
+                return 1;
+            },
+            finalize: function() {
+                return;
+            },
+            canContain: function() {
+                return false;
+            },
+            acceptsLines: false
+        },
+        code_block: {
+            continue: function(parser, container) {
+                var ln = parser.currentLine;
+                var indent = parser.indent;
+                if (container._isFenced) {
+                    // fenced
+                    var match =
+                        indent <= 3 &&
+                        ln.charAt(parser.nextNonspace) === container._fenceChar &&
+                        ln.slice(parser.nextNonspace).match(reClosingCodeFence);
+                    if (match && match[0].length >= container._fenceLength) {
+                        // closing fence - we're at end of line, so we can return
+                        parser.lastLineLength =
+                            parser.offset + indent + match[0].length;
+                        parser.finalize(container, parser.lineNumber);
+                        return 2;
+                    } else {
+                        // skip optional spaces of fence offset
+                        var i = container._fenceOffset;
+                        while (i > 0 && isSpaceOrTab(peek$1(ln, parser.offset))) {
+                            parser.advanceOffset(1, true);
+                            i--;
+                        }
+                    }
+                } else {
+                    // indented
+                    if (indent >= CODE_INDENT) {
+                        parser.advanceOffset(CODE_INDENT, true);
+                    } else if (parser.blank) {
+                        parser.advanceNextNonspace();
+                    } else {
+                        return 1;
+                    }
+                }
+                return 0;
+            },
+            finalize: function(parser, block) {
+                if (block._isFenced) {
+                    // fenced
+                    // first line becomes info string
+                    var content = block._string_content;
+                    var newlinePos = content.indexOf("\n");
+                    var firstLine = content.slice(0, newlinePos);
+                    var rest = content.slice(newlinePos + 1);
+                    block.info = unescapeString(firstLine.trim());
+                    block._literal = rest;
+                } else {
+                    // indented
+                    block._literal = block._string_content.replace(
+                        /(\n *)+$/,
+                        "\n"
+                    );
+                }
+                block._string_content = null; // allow GC
+            },
+            canContain: function() {
+                return false;
+            },
+            acceptsLines: true
+        },
+        html_block: {
+            continue: function(parser, container) {
+                return parser.blank &&
+                    (container._htmlBlockType === 6 ||
+                        container._htmlBlockType === 7)
+                    ? 1
+                    : 0;
+            },
+            finalize: function(parser, block) {
+                block._literal = block._string_content.replace(/(\n *)+$/, "");
+                block._string_content = null; // allow GC
+            },
+            canContain: function() {
+                return false;
+            },
+            acceptsLines: true
+        },
+        paragraph: {
+            continue: function(parser) {
+                return parser.blank ? 1 : 0;
+            },
+            finalize: function(parser, block) {
+                var pos;
+                var hasReferenceDefs = false;
+
+                // try parsing the beginning as link reference definitions:
+                while (
+                    peek$1(block._string_content, 0) === C_OPEN_BRACKET$1 &&
+                    (pos = parser.inlineParser.parseReference(
+                        block._string_content,
+                        parser.refmap
+                    ))
+                ) {
+                    block._string_content = block._string_content.slice(pos);
+                    hasReferenceDefs = true;
+                }
+                if (hasReferenceDefs && isBlank(block._string_content)) {
+                    block.unlink();
+                }
+            },
+            canContain: function() {
+                return false;
+            },
+            acceptsLines: true
+        }
+    };
+
+    // block start functions.  Return values:
+    // 0 = no match
+    // 1 = matched container, keep going
+    // 2 = matched leaf, no more block starts
+    var blockStarts = [
+        // block quote
+        function(parser) {
+            if (
+                !parser.indented &&
+                peek$1(parser.currentLine, parser.nextNonspace) === C_GREATERTHAN
+            ) {
+                parser.advanceNextNonspace();
+                parser.advanceOffset(1, false);
+                // optional following space
+                if (isSpaceOrTab(peek$1(parser.currentLine, parser.offset))) {
+                    parser.advanceOffset(1, true);
+                }
+                parser.closeUnmatchedBlocks();
+                parser.addChild("block_quote", parser.nextNonspace);
+                return 1;
+            } else {
+                return 0;
+            }
+        },
+
+        // ATX heading
+        function(parser) {
+            var match;
+            if (
+                !parser.indented &&
+                (match = parser.currentLine
+                    .slice(parser.nextNonspace)
+                    .match(reATXHeadingMarker))
+            ) {
+                parser.advanceNextNonspace();
+                parser.advanceOffset(match[0].length, false);
+                parser.closeUnmatchedBlocks();
+                var container = parser.addChild("heading", parser.nextNonspace);
+                container.level = match[0].trim().length; // number of #s
+                // remove trailing ###s:
+                container._string_content = parser.currentLine
+                    .slice(parser.offset)
+                    .replace(/^[ \t]*#+[ \t]*$/, "")
+                    .replace(/[ \t]+#+[ \t]*$/, "");
+                parser.advanceOffset(parser.currentLine.length - parser.offset);
+                return 2;
+            } else {
+                return 0;
+            }
+        },
+
+        // Fenced code block
+        function(parser) {
+            var match;
+            if (
+                !parser.indented &&
+                (match = parser.currentLine
+                    .slice(parser.nextNonspace)
+                    .match(reCodeFence))
+            ) {
+                var fenceLength = match[0].length;
+                parser.closeUnmatchedBlocks();
+                var container = parser.addChild("code_block", parser.nextNonspace);
+                container._isFenced = true;
+                container._fenceLength = fenceLength;
+                container._fenceChar = match[0][0];
+                container._fenceOffset = parser.indent;
+                parser.advanceNextNonspace();
+                parser.advanceOffset(fenceLength, false);
+                return 2;
+            } else {
+                return 0;
+            }
+        },
+
+        // HTML block
+        function(parser, container) {
+            if (
+                !parser.indented &&
+                peek$1(parser.currentLine, parser.nextNonspace) === C_LESSTHAN$1
+            ) {
+                var s = parser.currentLine.slice(parser.nextNonspace);
+                var blockType;
+
+                for (blockType = 1; blockType <= 7; blockType++) {
+                    if (
+                        reHtmlBlockOpen[blockType].test(s) &&
+                        (blockType < 7 || (container.type !== "paragraph" &&
+                         !(!parser.allClosed && !parser.blank &&
+                           parser.tip.type === "paragraph") // maybe lazy
+                        ))
+                    ) {
+                        parser.closeUnmatchedBlocks();
+                        // We don't adjust parser.offset;
+                        // spaces are part of the HTML block:
+                        var b = parser.addChild("html_block", parser.offset);
+                        b._htmlBlockType = blockType;
+                        return 2;
+                    }
+                }
+            }
+
+            return 0;
+        },
+
+        // Setext heading
+        function(parser, container) {
+            var match;
+            if (
+                !parser.indented &&
+                container.type === "paragraph" &&
+                (match = parser.currentLine
+                    .slice(parser.nextNonspace)
+                    .match(reSetextHeadingLine))
+            ) {
+                parser.closeUnmatchedBlocks();
+                // resolve reference link definitiosn
+                var pos;
+                while (
+                    peek$1(container._string_content, 0) === C_OPEN_BRACKET$1 &&
+                    (pos = parser.inlineParser.parseReference(
+                        container._string_content,
+                        parser.refmap
+                    ))
+                ) {
+                    container._string_content = container._string_content.slice(
+                        pos
+                    );
+                }
+                if (container._string_content.length > 0) {
+                    var heading = new Node("heading", container.sourcepos);
+                    heading.level = match[0][0] === "=" ? 1 : 2;
+                    heading._string_content = container._string_content;
+                    container.insertAfter(heading);
+                    container.unlink();
+                    parser.tip = heading;
+                    parser.advanceOffset(
+                        parser.currentLine.length - parser.offset,
+                        false
+                    );
+                    return 2;
+                } else {
+                    return 0;
+                }
+            } else {
+                return 0;
+            }
+        },
+
+        // thematic break
+        function(parser) {
+            if (
+                !parser.indented &&
+                reThematicBreak.test(parser.currentLine.slice(parser.nextNonspace))
+            ) {
+                parser.closeUnmatchedBlocks();
+                parser.addChild("thematic_break", parser.nextNonspace);
+                parser.advanceOffset(
+                    parser.currentLine.length - parser.offset,
+                    false
+                );
+                return 2;
+            } else {
+                return 0;
+            }
+        },
+
+        // list item
+        function(parser, container) {
+            var data;
+
+            if (
+                (!parser.indented || container.type === "list") &&
+                (data = parseListMarker(parser, container))
+            ) {
+                parser.closeUnmatchedBlocks();
+
+                // add the list if needed
+                if (
+                    parser.tip.type !== "list" ||
+                    !listsMatch(container._listData, data)
+                ) {
+                    container = parser.addChild("list", parser.nextNonspace);
+                    container._listData = data;
+                }
+
+                // add the list item
+                container = parser.addChild("item", parser.nextNonspace);
+                container._listData = data;
+                return 1;
+            } else {
+                return 0;
+            }
+        },
+
+        // indented code block
+        function(parser) {
+            if (
+                parser.indented &&
+                parser.tip.type !== "paragraph" &&
+                !parser.blank
+            ) {
+                // indented code
+                parser.advanceOffset(CODE_INDENT, true);
+                parser.closeUnmatchedBlocks();
+                parser.addChild("code_block", parser.offset);
+                return 2;
+            } else {
+                return 0;
+            }
+        }
+    ];
+
+    var advanceOffset = function(count, columns) {
+        var currentLine = this.currentLine;
+        var charsToTab, charsToAdvance;
+        var c;
+        while (count > 0 && (c = currentLine[this.offset])) {
+            if (c === "\t") {
+                charsToTab = 4 - (this.column % 4);
+                if (columns) {
+                    this.partiallyConsumedTab = charsToTab > count;
+                    charsToAdvance = charsToTab > count ? count : charsToTab;
+                    this.column += charsToAdvance;
+                    this.offset += this.partiallyConsumedTab ? 0 : 1;
+                    count -= charsToAdvance;
+                } else {
+                    this.partiallyConsumedTab = false;
+                    this.column += charsToTab;
+                    this.offset += 1;
+                    count -= 1;
+                }
+            } else {
+                this.partiallyConsumedTab = false;
+                this.offset += 1;
+                this.column += 1; // assume ascii; block starts are ascii
+                count -= 1;
+            }
+        }
+    };
+
+    var advanceNextNonspace = function() {
+        this.offset = this.nextNonspace;
+        this.column = this.nextNonspaceColumn;
+        this.partiallyConsumedTab = false;
+    };
+
+    var findNextNonspace = function() {
+        var currentLine = this.currentLine;
+        var i = this.offset;
+        var cols = this.column;
+        var c;
+
+        while ((c = currentLine.charAt(i)) !== "") {
+            if (c === " ") {
+                i++;
+                cols++;
+            } else if (c === "\t") {
+                i++;
+                cols += 4 - (cols % 4);
+            } else {
+                break;
+            }
+        }
+        this.blank = c === "\n" || c === "\r" || c === "";
+        this.nextNonspace = i;
+        this.nextNonspaceColumn = cols;
+        this.indent = this.nextNonspaceColumn - this.column;
+        this.indented = this.indent >= CODE_INDENT;
+    };
+
+    // Analyze a line of text and update the document appropriately.
+    // We parse markdown text by calling this on each line of input,
+    // then finalizing the document.
+    var incorporateLine = function(ln) {
+        var all_matched = true;
+        var t;
+
+        var container = this.doc;
+        this.oldtip = this.tip;
+        this.offset = 0;
+        this.column = 0;
+        this.blank = false;
+        this.partiallyConsumedTab = false;
+        this.lineNumber += 1;
+
+        // replace NUL characters for security
+        if (ln.indexOf("\u0000") !== -1) {
+            ln = ln.replace(/\0/g, "\uFFFD");
+        }
+
+        this.currentLine = ln;
+
+        // For each containing block, try to parse the associated line start.
+        // Bail out on failure: container will point to the last matching block.
+        // Set all_matched to false if not all containers match.
+        var lastChild;
+        while ((lastChild = container._lastChild) && lastChild._open) {
+            container = lastChild;
+
+            this.findNextNonspace();
+
+            switch (this.blocks[container.type].continue(this, container)) {
+                case 0: // we've matched, keep going
+                    break;
+                case 1: // we've failed to match a block
+                    all_matched = false;
+                    break;
+                case 2: // we've hit end of line for fenced code close and can return
+                    return;
+                default:
+                    throw "continue returned illegal value, must be 0, 1, or 2";
+            }
+            if (!all_matched) {
+                container = container._parent; // back up to last matching block
+                break;
+            }
+        }
+
+        this.allClosed = container === this.oldtip;
+        this.lastMatchedContainer = container;
+
+        var matchedLeaf =
+            container.type !== "paragraph" && blocks[container.type].acceptsLines;
+        var starts = this.blockStarts;
+        var startsLen = starts.length;
+        // Unless last matched container is a code block, try new container starts,
+        // adding children to the last matched container:
+        while (!matchedLeaf) {
+            this.findNextNonspace();
+
+            // this is a little performance optimization:
+            if (
+                !this.indented &&
+                !reMaybeSpecial.test(ln.slice(this.nextNonspace))
+            ) {
+                this.advanceNextNonspace();
+                break;
+            }
+
+            var i = 0;
+            while (i < startsLen) {
+                var res = starts[i](this, container);
+                if (res === 1) {
+                    container = this.tip;
+                    break;
+                } else if (res === 2) {
+                    container = this.tip;
+                    matchedLeaf = true;
+                    break;
+                } else {
+                    i++;
+                }
+            }
+
+            if (i === startsLen) {
+                // nothing matched
+                this.advanceNextNonspace();
+                break;
+            }
+        }
+
+        // What remains at the offset is a text line.  Add the text to the
+        // appropriate container.
+
+        // First check for a lazy paragraph continuation:
+        if (!this.allClosed && !this.blank && this.tip.type === "paragraph") {
+            // lazy paragraph continuation
+            this.addLine();
+        } else {
+            // not a lazy continuation
+
+            // finalize any blocks not matched
+            this.closeUnmatchedBlocks();
+            if (this.blank && container.lastChild) {
+                container.lastChild._lastLineBlank = true;
+            }
+
+            t = container.type;
+
+            // Block quote lines are never blank as they start with >
+            // and we don't count blanks in fenced code for purposes of tight/loose
+            // lists or breaking out of lists.  We also don't set _lastLineBlank
+            // on an empty list item, or if we just closed a fenced block.
+            var lastLineBlank =
+                this.blank &&
+                !(
+                    t === "block_quote" ||
+                    (t === "code_block" && container._isFenced) ||
+                    (t === "item" &&
+                        !container._firstChild &&
+                        container.sourcepos[0][0] === this.lineNumber)
+                );
+
+            // propagate lastLineBlank up through parents:
+            var cont = container;
+            while (cont) {
+                cont._lastLineBlank = lastLineBlank;
+                cont = cont._parent;
+            }
+
+            if (this.blocks[t].acceptsLines) {
+                this.addLine();
+                // if HtmlBlock, check for end condition
+                if (
+                    t === "html_block" &&
+                    container._htmlBlockType >= 1 &&
+                    container._htmlBlockType <= 5 &&
+                    reHtmlBlockClose[container._htmlBlockType].test(
+                        this.currentLine.slice(this.offset)
+                    )
+                ) {
+                    this.lastLineLength = ln.length;
+                    this.finalize(container, this.lineNumber);
+                }
+            } else if (this.offset < ln.length && !this.blank) {
+                // create paragraph container for line
+                container = this.addChild("paragraph", this.offset);
+                this.advanceNextNonspace();
+                this.addLine();
+            }
+        }
+        this.lastLineLength = ln.length;
+    };
+
+    // Finalize a block.  Close it and do any necessary postprocessing,
+    // e.g. creating string_content from strings, setting the 'tight'
+    // or 'loose' status of a list, and parsing the beginnings
+    // of paragraphs for reference definitions.  Reset the tip to the
+    // parent of the closed block.
+    var finalize = function(block, lineNumber) {
+        var above = block._parent;
+        block._open = false;
+        block.sourcepos[1] = [lineNumber, this.lastLineLength];
+
+        this.blocks[block.type].finalize(this, block);
+
+        this.tip = above;
+    };
+
+    // Walk through a block & children recursively, parsing string content
+    // into inline content where appropriate.
+    var processInlines = function(block) {
+        var node, event, t;
+        var walker = block.walker();
+        this.inlineParser.refmap = this.refmap;
+        this.inlineParser.options = this.options;
+        while ((event = walker.next())) {
+            node = event.node;
+            t = node.type;
+            if (!event.entering && (t === "paragraph" || t === "heading")) {
+                this.inlineParser.parse(node);
+            }
+        }
+    };
+
+    var Document = function() {
+        var doc = new Node("document", [
+            [1, 1],
+            [0, 0]
+        ]);
+        return doc;
+    };
+
+    // The main parsing function.  Returns a parsed document AST.
+    var parse = function(input) {
+        this.doc = new Document();
+        this.tip = this.doc;
+        this.refmap = {};
+        this.lineNumber = 0;
+        this.lastLineLength = 0;
+        this.offset = 0;
+        this.column = 0;
+        this.lastMatchedContainer = this.doc;
+        this.currentLine = "";
+        if (this.options.time) {
+            console.time("preparing input");
+        }
+        var lines = input.split(reLineEnding);
+        var len = lines.length;
+        if (input.charCodeAt(input.length - 1) === C_NEWLINE$1) {
+            // ignore last blank line created by final newline
+            len -= 1;
+        }
+        if (this.options.time) {
+            console.timeEnd("preparing input");
+        }
+        if (this.options.time) {
+            console.time("block parsing");
+        }
+        for (var i = 0; i < len; i++) {
+            this.incorporateLine(lines[i]);
+        }
+        while (this.tip) {
+            this.finalize(this.tip, len);
+        }
+        if (this.options.time) {
+            console.timeEnd("block parsing");
+        }
+        if (this.options.time) {
+            console.time("inline parsing");
+        }
+        this.processInlines(this.doc);
+        if (this.options.time) {
+            console.timeEnd("inline parsing");
+        }
+        return this.doc;
+    };
+
+    // The Parser object.
+    function Parser(options) {
+        return {
+            doc: new Document(),
+            blocks: blocks,
+            blockStarts: blockStarts,
+            tip: this.doc,
+            oldtip: this.doc,
+            currentLine: "",
+            lineNumber: 0,
+            offset: 0,
+            column: 0,
+            nextNonspace: 0,
+            nextNonspaceColumn: 0,
+            indent: 0,
+            indented: false,
+            blank: false,
+            partiallyConsumedTab: false,
+            allClosed: true,
+            lastMatchedContainer: this.doc,
+            refmap: {},
+            lastLineLength: 0,
+            inlineParser: new InlineParser(options),
+            findNextNonspace: findNextNonspace,
+            advanceOffset: advanceOffset,
+            advanceNextNonspace: advanceNextNonspace,
+            addLine: addLine,
+            addChild: addChild,
+            incorporateLine: incorporateLine,
+            finalize: finalize,
+            processInlines: processInlines,
+            closeUnmatchedBlocks: closeUnmatchedBlocks,
+            parse: parse,
+            options: options || {}
+        };
+    }
+
+    function Renderer() {}
+
+    /**
+     *  Walks the AST and calls member methods for each Node type.
+     *
+     *  @param ast {Node} The root of the abstract syntax tree.
+     */
+    function render(ast) {
+        var walker = ast.walker(),
+            event,
+            type;
+
+        this.buffer = "";
+        this.lastOut = "\n";
+
+        while ((event = walker.next())) {
+            type = event.node.type;
+            if (this[type]) {
+                this[type](event.node, event.entering);
+            }
+        }
+        return this.buffer;
+    }
+
+    /**
+     *  Concatenate a literal string to the buffer.
+     *
+     *  @param str {String} The string to concatenate.
+     */
+    function lit(str) {
+        this.buffer += str;
+        this.lastOut = str;
+    }
+
+    /**
+     *  Output a newline to the buffer.
+     */
+    function cr() {
+        if (this.lastOut !== "\n") {
+            this.lit("\n");
+        }
+    }
+
+    /**
+     *  Concatenate a string to the buffer possibly escaping the content.
+     *
+     *  Concrete renderer implementations should override this method.
+     *
+     *  @param str {String} The string to concatenate.
+     */
+    function out(str) {
+        this.lit(str);
+    }
+
+    /**
+     *  Escape a string for the target renderer.
+     *
+     *  Abstract function that should be implemented by concrete
+     *  renderer implementations.
+     *
+     *  @param str {String} The string to escape.
+     */
+    function esc(str) {
+        return str;
+    }
+
+    Renderer.prototype.render = render;
+    Renderer.prototype.out = out;
+    Renderer.prototype.lit = lit;
+    Renderer.prototype.cr = cr;
+    Renderer.prototype.esc = esc;
+
+    var reUnsafeProtocol = /^javascript:|vbscript:|file:|data:/i;
+    var reSafeDataProtocol = /^data:image\/(?:png|gif|jpeg|webp)/i;
+
+    var potentiallyUnsafe = function(url) {
+        return reUnsafeProtocol.test(url) && !reSafeDataProtocol.test(url);
+    };
+
+    // Helper function to produce an HTML tag.
+    function tag(name, attrs, selfclosing) {
+        if (this.disableTags > 0) {
+            return;
+        }
+        this.buffer += "<" + name;
+        if (attrs && attrs.length > 0) {
+            var i = 0;
+            var attrib;
+            while ((attrib = attrs[i]) !== undefined) {
+                this.buffer += " " + attrib[0] + '="' + attrib[1] + '"';
+                i++;
+            }
+        }
+        if (selfclosing) {
+            this.buffer += " /";
+        }
+        this.buffer += ">";
+        this.lastOut = ">";
+    }
+
+    function HtmlRenderer(options) {
+        options = options || {};
+        // by default, soft breaks are rendered as newlines in HTML
+        options.softbreak = options.softbreak || "\n";
+        // set to "<br />" to make them hard breaks
+        // set to " " if you want to ignore line wrapping in source
+        this.esc = options.esc || escapeXml;
+        // escape html with a custom function
+        // else use escapeXml
+
+        this.disableTags = 0;
+        this.lastOut = "\n";
+        this.options = options;
+    }
+
+    /* Node methods */
+
+    function text$1(node) {
+        this.out(node.literal);
+    }
+
+    function softbreak() {
+        this.lit(this.options.softbreak);
+    }
+
+    function linebreak() {
+        this.tag("br", [], true);
+        this.cr();
+    }
+
+    function link(node, entering) {
+        var attrs = this.attrs(node);
+        if (entering) {
+            if (!(this.options.safe && potentiallyUnsafe(node.destination))) {
+                attrs.push(["href", this.esc(node.destination)]);
+            }
+            if (node.title) {
+                attrs.push(["title", this.esc(node.title)]);
+            }
+            this.tag("a", attrs);
+        } else {
+            this.tag("/a");
+        }
+    }
+
+    function image$1(node, entering) {
+        if (entering) {
+            if (this.disableTags === 0) {
+                if (this.options.safe && potentiallyUnsafe(node.destination)) {
+                    this.lit('<img src="" alt="');
+                } else {
+                    this.lit('<img src="' + this.esc(node.destination) + '" alt="');
+                }
+            }
+            this.disableTags += 1;
+        } else {
+            this.disableTags -= 1;
+            if (this.disableTags === 0) {
+                if (node.title) {
+                    this.lit('" title="' + this.esc(node.title));
+                }
+                this.lit('" />');
+            }
+        }
+    }
+
+    function emph(node, entering) {
+        this.tag(entering ? "em" : "/em");
+    }
+
+    function strong(node, entering) {
+        this.tag(entering ? "strong" : "/strong");
+    }
+
+    function paragraph(node, entering) {
+        var grandparent = node.parent.parent,
+            attrs = this.attrs(node);
+        if (grandparent !== null && grandparent.type === "list") {
+            if (grandparent.listTight) {
+                return;
+            }
+        }
+        if (entering) {
+            this.cr();
+            this.tag("p", attrs);
+        } else {
+            this.tag("/p");
+            this.cr();
+        }
+    }
+
+    function heading(node, entering) {
+        var tagname = "h" + node.level,
+            attrs = this.attrs(node);
+        if (entering) {
+            this.cr();
+            this.tag(tagname, attrs);
+        } else {
+            this.tag("/" + tagname);
+            this.cr();
+        }
+    }
+
+    function code(node) {
+        this.tag("code");
+        this.out(node.literal);
+        this.tag("/code");
+    }
+
+    function code_block(node) {
+        var info_words = node.info ? node.info.split(/\s+/) : [],
+            attrs = this.attrs(node);
+        if (info_words.length > 0 && info_words[0].length > 0) {
+            attrs.push(["class", "language-" + this.esc(info_words[0])]);
+        }
+        this.cr();
+        this.tag("pre");
+        this.tag("code", attrs);
+        this.out(node.literal);
+        this.tag("/code");
+        this.tag("/pre");
+        this.cr();
+    }
+
+    function thematic_break(node) {
+        var attrs = this.attrs(node);
+        this.cr();
+        this.tag("hr", attrs, true);
+        this.cr();
+    }
+
+    function block_quote(node, entering) {
+        var attrs = this.attrs(node);
+        if (entering) {
+            this.cr();
+            this.tag("blockquote", attrs);
+            this.cr();
+        } else {
+            this.cr();
+            this.tag("/blockquote");
+            this.cr();
+        }
+    }
+
+    function list(node, entering) {
+        var tagname = node.listType === "bullet" ? "ul" : "ol",
+            attrs = this.attrs(node);
+
+        if (entering) {
+            var start = node.listStart;
+            if (start !== null && start !== 1) {
+                attrs.push(["start", start.toString()]);
+            }
+            this.cr();
+            this.tag(tagname, attrs);
+            this.cr();
+        } else {
+            this.cr();
+            this.tag("/" + tagname);
+            this.cr();
+        }
+    }
+
+    function item(node, entering) {
+        var attrs = this.attrs(node);
+        if (entering) {
+            this.tag("li", attrs);
+        } else {
+            this.tag("/li");
+            this.cr();
+        }
+    }
+
+    function html_inline(node) {
+        if (this.options.safe) {
+            this.lit("<!-- raw HTML omitted -->");
+        } else {
+            this.lit(node.literal);
+        }
+    }
+
+    function html_block(node) {
+        this.cr();
+        if (this.options.safe) {
+            this.lit("<!-- raw HTML omitted -->");
+        } else {
+            this.lit(node.literal);
+        }
+        this.cr();
+    }
+
+    function custom_inline(node, entering) {
+        if (entering && node.onEnter) {
+            this.lit(node.onEnter);
+        } else if (!entering && node.onExit) {
+            this.lit(node.onExit);
+        }
+    }
+
+    function custom_block(node, entering) {
+        this.cr();
+        if (entering && node.onEnter) {
+            this.lit(node.onEnter);
+        } else if (!entering && node.onExit) {
+            this.lit(node.onExit);
+        }
+        this.cr();
+    }
+
+    /* Helper methods */
+
+    function out$1(s) {
+        this.lit(this.esc(s));
+    }
+
+    function attrs(node) {
+        var att = [];
+        if (this.options.sourcepos) {
+            var pos = node.sourcepos;
+            if (pos) {
+                att.push([
+                    "data-sourcepos",
+                    String(pos[0][0]) +
+                        ":" +
+                        String(pos[0][1]) +
+                        "-" +
+                        String(pos[1][0]) +
+                        ":" +
+                        String(pos[1][1])
+                ]);
+            }
+        }
+        return att;
+    }
+
+    // quick browser-compatible inheritance
+    HtmlRenderer.prototype = Object.create(Renderer.prototype);
+
+    HtmlRenderer.prototype.text = text$1;
+    HtmlRenderer.prototype.html_inline = html_inline;
+    HtmlRenderer.prototype.html_block = html_block;
+    HtmlRenderer.prototype.softbreak = softbreak;
+    HtmlRenderer.prototype.linebreak = linebreak;
+    HtmlRenderer.prototype.link = link;
+    HtmlRenderer.prototype.image = image$1;
+    HtmlRenderer.prototype.emph = emph;
+    HtmlRenderer.prototype.strong = strong;
+    HtmlRenderer.prototype.paragraph = paragraph;
+    HtmlRenderer.prototype.heading = heading;
+    HtmlRenderer.prototype.code = code;
+    HtmlRenderer.prototype.code_block = code_block;
+    HtmlRenderer.prototype.thematic_break = thematic_break;
+    HtmlRenderer.prototype.block_quote = block_quote;
+    HtmlRenderer.prototype.list = list;
+    HtmlRenderer.prototype.item = item;
+    HtmlRenderer.prototype.custom_inline = custom_inline;
+    HtmlRenderer.prototype.custom_block = custom_block;
+
+    HtmlRenderer.prototype.esc = escapeXml;
+
+    HtmlRenderer.prototype.out = out$1;
+    HtmlRenderer.prototype.tag = tag;
+    HtmlRenderer.prototype.attrs = attrs;
+
+    var reXMLTag = /\<[^>]*\>/;
+
+    function toTagName(s) {
+        return s.replace(/([a-z])([A-Z])/g, "$1_$2").toLowerCase();
+    }
+
+    function XmlRenderer(options) {
+        options = options || {};
+
+        this.disableTags = 0;
+        this.lastOut = "\n";
+
+        this.indentLevel = 0;
+        this.indent = "  ";
+        
+        this.esc = options.esc || escapeXml;
+        // escape html with a custom function
+        // else use escapeXml
+
+        this.options = options;
+    }
+
+    function render$1(ast) {
+        this.buffer = "";
+
+        var attrs;
+        var tagname;
+        var walker = ast.walker();
+        var event, node, entering;
+        var container;
+        var selfClosing;
+        var nodetype;
+
+        var options = this.options;
+
+        if (options.time) {
+            console.time("rendering");
+        }
+
+        this.buffer += '<?xml version="1.0" encoding="UTF-8"?>\n';
+        this.buffer += '<!DOCTYPE document SYSTEM "CommonMark.dtd">\n';
+
+        while ((event = walker.next())) {
+            entering = event.entering;
+            node = event.node;
+            nodetype = node.type;
+
+            container = node.isContainer;
+
+            selfClosing =
+                nodetype === "thematic_break" ||
+                nodetype === "linebreak" ||
+                nodetype === "softbreak";
+
+            tagname = toTagName(nodetype);
+
+            if (entering) {
+                attrs = [];
+
+                switch (nodetype) {
+                    case "document":
+                        attrs.push(["xmlns", "http://commonmark.org/xml/1.0"]);
+                        break;
+                    case "list":
+                        if (node.listType !== null) {
+                            attrs.push(["type", node.listType.toLowerCase()]);
+                        }
+                        if (node.listStart !== null) {
+                            attrs.push(["start", String(node.listStart)]);
+                        }
+                        if (node.listTight !== null) {
+                            attrs.push([
+                                "tight",
+                                node.listTight ? "true" : "false"
+                            ]);
+                        }
+                        var delim = node.listDelimiter;
+                        if (delim !== null) {
+                            var delimword = "";
+                            if (delim === ".") {
+                                delimword = "period";
+                            } else {
+                                delimword = "paren";
+                            }
+                            attrs.push(["delimiter", delimword]);
+                        }
+                        break;
+                    case "code_block":
+                        if (node.info) {
+                            attrs.push(["info", node.info]);
+                        }
+                        break;
+                    case "heading":
+                        attrs.push(["level", String(node.level)]);
+                        break;
+                    case "link":
+                    case "image":
+                        attrs.push(["destination", node.destination]);
+                        attrs.push(["title", node.title]);
+                        break;
+                    case "custom_inline":
+                    case "custom_block":
+                        attrs.push(["on_enter", node.onEnter]);
+                        attrs.push(["on_exit", node.onExit]);
+                        break;
+                }
+                if (options.sourcepos) {
+                    var pos = node.sourcepos;
+                    if (pos) {
+                        attrs.push([
+                            "sourcepos",
+                            String(pos[0][0]) +
+                                ":" +
+                                String(pos[0][1]) +
+                                "-" +
+                                String(pos[1][0]) +
+                                ":" +
+                                String(pos[1][1])
+                        ]);
+                    }
+                }
+
+                this.cr();
+                this.out(this.tag(tagname, attrs, selfClosing));
+                if (container) {
+                    this.indentLevel += 1;
+                } else if (!container && !selfClosing) {
+                    var lit = node.literal;
+                    if (lit) {
+                        this.out(this.esc(lit));
+                    }
+                    this.out(this.tag("/" + tagname));
+                }
+            } else {
+                this.indentLevel -= 1;
+                this.cr();
+                this.out(this.tag("/" + tagname));
+            }
+        }
+        if (options.time) {
+            console.timeEnd("rendering");
+        }
+        this.buffer += "\n";
+        return this.buffer;
+    }
+
+    function out$2(s) {
+        if (this.disableTags > 0) {
+            this.buffer += s.replace(reXMLTag, "");
+        } else {
+            this.buffer += s;
+        }
+        this.lastOut = s;
+    }
+
+    function cr$1() {
+        if (this.lastOut !== "\n") {
+            this.buffer += "\n";
+            this.lastOut = "\n";
+            for (var i = this.indentLevel; i > 0; i--) {
+                this.buffer += this.indent;
+            }
+        }
+    }
+
+    // Helper function to produce an XML tag.
+    function tag$1(name, attrs, selfclosing) {
+        var result = "<" + name;
+        if (attrs && attrs.length > 0) {
+            var i = 0;
+            var attrib;
+            while ((attrib = attrs[i]) !== undefined) {
+                result += " " + attrib[0] + '="' + this.esc(attrib[1]) + '"';
+                i++;
+            }
+        }
+        if (selfclosing) {
+            result += " /";
+        }
+        result += ">";
+        return result;
+    }
+
+    // quick browser-compatible inheritance
+    XmlRenderer.prototype = Object.create(Renderer.prototype);
+
+    XmlRenderer.prototype.render = render$1;
+    XmlRenderer.prototype.out = out$2;
+    XmlRenderer.prototype.cr = cr$1;
+    XmlRenderer.prototype.tag = tag$1;
+    XmlRenderer.prototype.esc = escapeXml;
+
+    exports.HtmlRenderer = HtmlRenderer;
+    exports.Node = Node;
+    exports.Parser = Parser;
+    exports.Renderer = Renderer;
+    exports.XmlRenderer = XmlRenderer;
+
+    Object.defineProperty(exports, '__esModule', { value: true });
+
+})));
lib/docs/index.html
@@ -24,6 +24,7 @@
         --search-bg-color: #f3f3f3;
         --search-bg-color-focus: #ffffff;
         --search-sh-color: rgba(0, 0, 0, 0.18);
+        --search-other-results-color: rgb(100, 100, 100);
         --help-sh-color: rgba(0, 0, 0, 0.75);
         --help-bg-color: #aaa;
       }
@@ -83,6 +84,7 @@
 
       .flex-right {
         display: flex;
+        flex-direction: column;
         overflow: auto;
         -webkit-overflow-scrolling: touch;
         flex-grow: 1;
@@ -200,7 +202,7 @@
       }
 
       #guides {
-        padding: 1rem 0.7rem 2.4rem 1.4rem;
+        padding: 0rem 0.7rem 2.4rem 1.4rem;
         box-sizing: border-box;
         font-size: 1rem;
         background-color: var(--bg-color);
@@ -209,7 +211,7 @@
 
       /* docs section */
       .docs {
-        padding: 1rem 0.7rem 2.4rem 1.4rem;
+        padding: 0rem 0.7rem 2.4rem 1.4rem;
         font-size: 1rem;
         background-color: var(--bg-color);
         overflow-wrap: break-word;
@@ -247,7 +249,38 @@
         top: 5px;
         left: 5px;
       }
-
+      
+      .other-results {
+        line-height: 1em;
+        position: relative;
+        outline: 0;
+        border: 0;
+        color: var(--search-other-results-color);
+        text-align: center;
+        height: 1.5em;
+        opacity: .5;
+      }
+      .other-results:before {
+        content: '';
+        background: var(--search-other-results-color);
+        position: absolute;
+        left: 0;
+        top: 50%;
+        width: 100%;
+        height: 1px;
+      }
+        
+      .other-results:after {
+        content: "other results";
+        position: relative;
+        display: inline-block;
+        padding: 0 .5em;
+        line-height: 1.5em;
+        color: var(--search-other-results-color);
+        background-color: var(--bg-color);
+      }
+      
+      
       .docs a {
         color: var(--link-color);
       }
@@ -505,6 +538,7 @@
           --search-bg-color: #3c3c3c;
           --search-bg-color-focus: #000;
           --search-sh-color: rgba(255, 255, 255, 0.28);
+          --search-other-results-color: rgba(255, 255, 255, 0.28);
           --help-sh-color: rgba(142, 142, 142, 0.5);
           --help-bg-color: #333;
         }
@@ -717,22 +751,38 @@
               <h2><span>Zig Version</span></h2>
               <p class="str" id="tdZigVer"></p>
             </div>
-            <div>
-              <input id="privDeclsBox" type="checkbox"/>
-              <label for="privDeclsBox">Internal Doc Mode</label>
-            </div>
           </div>
         </nav>
       </div>
       <div class="flex-right">
+        <div class="wrap">
+          <section class="docs" style="padding-top: 1.5rem; padding-bottom:0;">
+          <div style="position: relative">
+            <span id="searchPlaceholder"><kbd>s</kbd> to search, <kbd>?</kbd> for more options</span>
+            <input type="search" class="search" id="search" autocomplete="off" spellcheck="false" disabled>
+          </div>
+          </section>
+        </div>
+        <div id="sectSearchResults" class="docs hidden">
+          <h2>Search Results</h2>
+          <ul id="listSearchResults"></ul>
+          <p id="sectSearchAllResultsLink" class="hidden"><a href="">show all results</a></p>
+        </div>
+        <div id="sectSearchNoResults" class="docs hidden">
+          <h2>No Results Found</h2>
+          <p>Here are some things you can try:</p>
+          <ul>
+            <li>Check out the <a id="langRefLink">Language Reference</a> for the language itself.</li>
+            <li>Check out the <a href="https://ziglang.org/learn/">Learn page</a> for other helpful resources for learning Zig.</li>
+            <li>Use your search engine.</li>
+          </ul>
+          <p>Press <kbd>?</kbd> to see keyboard shortcuts and <kbd>Esc</kbd> to return.</p>
+        </div>
         <div id="guides" class="wrap hidden">
+          <div id="activeGuide" class="hidden"></div>
         </div> 
         <div id="docs" class="wrap hidden">
           <section class="docs">
-            <div style="position: relative">
-              <span id="searchPlaceholder"><kbd>s</kbd> to search, <kbd>?</kbd> for more options</span>
-              <input type="search" class="search" id="search" autocomplete="off" spellcheck="false" disabled>
-            </div>
             <p id="status">Loading...</p>
             <div id="sectNav" class="hidden"><ul id="listNav"></ul></div>
             <div id="fnProto" class="hidden">
@@ -762,21 +812,6 @@
               </div>
               <div id="tableFnErrors"><dl id="listFnErrors"></dl></div>
             </div>
-            <div id="sectSearchResults" class="hidden">
-              <h2>Search Results</h2>
-              <ul id="listSearchResults"></ul>
-              <p id="sectSearchAllResultsLink" class="hidden"><a href="">show all results</a></p>
-            </div>
-            <div id="sectSearchNoResults" class="hidden">
-              <h2>No Results Found</h2>
-              <p>Here are some things you can try:</p>
-              <ul>
-                <li>Check out the <a id="langRefLink">Language Reference</a> for the language itself.</li>
-                <li>Check out the <a href="https://ziglang.org/learn/">Learn page</a> for other helpful resources for learning Zig.</li>
-                <li>Use your search engine.</li>
-              </ul>
-              <p>Press <kbd>?</kbd> to see keyboard shortcuts and <kbd>Esc</kbd> to return.</p>
-            </div>
             <div id="sectFields" class="hidden">
               <h2>Fields</h2>
               <div id="listFields"></div>
@@ -852,6 +887,7 @@
       </div>
     </div>
     <script src="data.js"></script>
+    <script src="commonmark.js"></script>
     <script src="main.js"></script>
   </body>
 </html>
lib/docs/main.js
@@ -4,7 +4,6 @@ var zigAnalysis;
 
 const NAV_MODES = {
   API: "#A;",
-  API_INTERNAL: "#a;",
   GUIDES: "#G;",
 };
 
@@ -56,12 +55,13 @@ const NAV_MODES = {
   const domSectSearchResults = document.getElementById("sectSearchResults");
   const domSectSearchAllResultsLink = document.getElementById("sectSearchAllResultsLink");
   const domDocs = document.getElementById("docs");
-  const domGuides = document.getElementById("guides");
+  const domGuidesSection = document.getElementById("guides");
+  const domActiveGuide = document.getElementById("activeGuide");
+  
   const domListSearchResults = document.getElementById("listSearchResults");
   const domSectSearchNoResults = document.getElementById("sectSearchNoResults");
   const domSectInfo = document.getElementById("sectInfo");
   // const domTdTarget = (document.getElementById("tdTarget"));
-  const domPrivDeclsBox = document.getElementById("privDeclsBox");
   const domTdZigVer = document.getElementById("tdZigVer");
   const domHdrName = document.getElementById("hdrName");
   const domHelpModal = document.getElementById("helpModal");
@@ -83,15 +83,16 @@ const NAV_MODES = {
   let typeTypeId = findTypeTypeId();
   let pointerSizeEnum = { One: 0, Many: 1, Slice: 2, C: 3 };
 
+  let declSearchIndex = new RadixTree();
+  window.search = declSearchIndex;
+
   // for each module, is an array with modules to get to this one
   let canonModPaths = computeCanonicalModulePaths();
 
   // for each decl, is an array with {declNames, modNames} to get to this one
-
   let canonDeclPaths = null; // lazy; use getCanonDeclPath
 
   // for each type, is an array with {declNames, modNames} to get to this one
-
   let canonTypeDecls = null; // lazy; use getCanonTypeDecl
 
   let curNav = {
@@ -122,6 +123,12 @@ const NAV_MODES = {
   // map of decl index to list of comptime fn calls
   // let nodesToCallsMap = indexNodesToCalls();
 
+  let guidesSearchIndex = {}; 
+  window.guideSearch = guidesSearchIndex;
+  parseGuides();
+
+  
+
   domSearch.disabled = false;
   domSearch.addEventListener("keydown", onSearchKeyDown, false);
   domSearch.addEventListener("focus", ev => {
@@ -139,31 +146,6 @@ const NAV_MODES = {
     onHashChange();
   }
 
-  domPrivDeclsBox.addEventListener(
-    "change",
-    function () {
-      if (this.checked != curNav.showPrivDecls) {
-        if (
-          this.checked &&
-          location.hash.length > 1 &&
-          location.hash[1] != "*"
-        ) {
-          location.hash = "#*" + location.hash.substring(1);
-          return;
-        }
-        if (
-          !this.checked &&
-          location.hash.length > 1 &&
-          location.hash[1] == "*"
-        ) {
-          location.hash = "#" + location.hash.substring(2);
-          return;
-        }
-      }
-    },
-    false
-  );
-
   if (location.hash == "") {
     location.hash = "#A;";
   }
@@ -189,7 +171,6 @@ const NAV_MODES = {
     let suffix = " - Zig";
     switch (curNav.mode) {
       case NAV_MODES.API:
-      case NAV_MODES.API_INTERNAL:
         let list = curNav.modNames.concat(curNav.declNames);
         if (list.length === 0) {
           document.title = zigAnalysis.modules[zigAnalysis.rootMod].name + suffix;
@@ -284,8 +265,11 @@ const NAV_MODES = {
 
   function resolveValue(value) {
     let i = 0;
-    while (i < 1000) {
+    while (true) {
       i += 1;
+      if (i >= 10000) {
+        throw "resolveValue quota exceeded"
+      }
 
       if ("refPath" in value.expr) {
         value = { expr: value.expr.refPath[value.expr.refPath.length - 1] };
@@ -307,8 +291,31 @@ const NAV_MODES = {
 
       return value;
     }
-    console.assert(false);
-    return {};
+  }
+
+  function resolveGenericRet(genericFunc) {
+    if (genericFunc.generic_ret == null) return null;
+    let result = resolveValue({expr: genericFunc.generic_ret});
+    
+    let i = 0;
+    while (true) {
+      i += 1;
+      if (i >= 10000) {
+        throw "resolveGenericRet quota exceeded"
+      }
+
+      if ("call" in result.expr) {
+        let call = zigAnalysis.calls[result.expr.call];
+        let resolvedFunc = resolveValue({ expr: call.func });
+        if (!("type" in resolvedFunc.expr)) return null;
+        let callee = getType(resolvedFunc.expr.type);
+        if (!callee.generic_ret) return null;
+        result = resolveValue({ expr: callee.generic_ret });
+        continue;
+      }
+
+      return result;
+    }
   }
 
   //    function typeOfDecl(decl){
@@ -401,8 +408,12 @@ const NAV_MODES = {
     domGuideSwitch.classList.add("active");
     domApiSwitch.classList.remove("active");
     domDocs.classList.add("hidden");
-    domGuides.classList.remove("hidden");
+    domGuidesSection.classList.remove("hidden");
+    domActiveGuide.classList.add("hidden");
     domApiMenu.classList.add("hidden");
+    domSectSearchResults.classList.add("hidden");
+    domSectSearchAllResultsLink.classList.add("hidden");
+    domSectSearchNoResults.classList.add("hidden");
 
     // sidebar guides list
     const section_list = zigAnalysis.guide_sections;
@@ -417,7 +428,7 @@ const NAV_MODES = {
           const guide = section.guides[i];
           let liDom = domGuides.children[i];
           let aDom = liDom.children[0];
-          aDom.textContent = guide.name;
+          aDom.textContent = guide.title;
           aDom.setAttribute("href", NAV_MODES.GUIDES + guide.name);
           if (guide.name === curNav.activeGuide) {
             aDom.classList.add("active");
@@ -431,6 +442,11 @@ const NAV_MODES = {
       domGuidesMenu.classList.remove("hidden");
     }
 
+    
+    if (curNavSearch !== "") {
+          return renderSearchGuides();
+    }
+
     // main content
     let activeGuide = undefined;
     outer: for (let i = 0; i < zigAnalysis.guide_sections.length; i += 1) {
@@ -447,7 +463,7 @@ const NAV_MODES = {
     if (activeGuide == undefined) {
       const root_file_idx = zigAnalysis.modules[zigAnalysis.rootMod].file;
       const root_file_name = getFile(root_file_idx).name;
-      domGuides.innerHTML = markdown(`
+      domActiveGuide.innerHTML = markdown(`
           # Zig Guides
           These autodocs don't contain any guide.
 
@@ -461,13 +477,21 @@ const NAV_MODES = {
           You can add guides by specifying which markdown files to include
           in the top level doc comment of your root file, like so:
 
-          (At the top of \`${root_file_name}\`)
+          (At the top of *${root_file_name}*)
           \`\`\`
           //!zig-autodoc-guide: intro.md
           //!zig-autodoc-guide: quickstart.md
-          //!zig-autodoc-section: Advanced topics
-          //!zig-autodoc-guide: ../advanced-docs/advanced-stuff.md
+          //!zig-autodoc-guide: advanced-docs/advanced-stuff.md
+          \`\`\`
+
+          You can also create sections to group guides together:
+
           \`\`\`
+          //!zig-autodoc-section: CLI Usage
+          //!zig-autodoc-guide: cli-basics.md
+          //!zig-autodoc-guide: cli-advanced.md
+          \`\`\`
+           
         
           **Note that this feature is still under heavy development so expect bugs**
           **and missing features!**
@@ -475,15 +499,16 @@ const NAV_MODES = {
           Happy writing!
         `);
     } else {
-      domGuides.innerHTML = markdown(activeGuide.body);
+      domActiveGuide.innerHTML = markdown(activeGuide.body);
     }
+    domActiveGuide.classList.remove("hidden");
   }
 
   function renderApi() {
     // set Api mode
     domApiSwitch.classList.add("active");
     domGuideSwitch.classList.remove("active");
-    domGuides.classList.add("hidden");
+    domGuidesSection.classList.add("hidden");
     domDocs.classList.remove("hidden");
     domApiMenu.classList.remove("hidden");
     domGuidesMenu.classList.add("hidden");
@@ -520,10 +545,8 @@ const NAV_MODES = {
     renderInfo();
     renderModList();
 
-    domPrivDeclsBox.checked = curNav.mode == NAV_MODES.API_INTERNAL;
-
     if (curNavSearch !== "") {
-      return renderSearch();
+          return renderSearchAPI();
     }
 
     let rootMod = zigAnalysis.modules[zigAnalysis.rootMod];
@@ -542,6 +565,7 @@ const NAV_MODES = {
     curNav.declObjs = [currentType];
     for (let i = 0; i < curNav.declNames.length; i += 1) {
       let childDecl = findSubDecl(currentType, curNav.declNames[i]);
+      window.last_decl = childDecl;
       if (childDecl == null) {
         return render404();
       }
@@ -605,7 +629,6 @@ const NAV_MODES = {
   function render() {
     switch (curNav.mode) {
       case NAV_MODES.API:
-      case NAV_MODES.API_INTERNAL:
         return renderApi();
       case NAV_MODES.GUIDES:
         return renderGuides();
@@ -3123,22 +3146,21 @@ const NAV_MODES = {
     const mode = location.hash.substring(0, 3);
     let query = location.hash.substring(3);
 
+    let qpos = query.indexOf("?");
+    let nonSearchPart;
+    if (qpos === -1) {
+      nonSearchPart = query;
+    } else {
+      nonSearchPart = query.substring(0, qpos);
+      curNavSearch = decodeURIComponent(query.substring(qpos + 1));
+    }
+
     const DEFAULT_HASH = NAV_MODES.API + zigAnalysis.modules[zigAnalysis.rootMod].name;
     switch (mode) {
       case NAV_MODES.API:
-      case NAV_MODES.API_INTERNAL:
-        // #A;MODULE:decl.decl.decl?search-term
+       // #A;MODULE:decl.decl.decl?search-term
         curNav.mode = mode;
 
-        let qpos = query.indexOf("?");
-        let nonSearchPart;
-        if (qpos === -1) {
-          nonSearchPart = query;
-        } else {
-          nonSearchPart = query.substring(0, qpos);
-          curNavSearch = decodeURIComponent(query.substring(qpos + 1));
-        }
-
         let parts = nonSearchPart.split(":");
         if (parts[0] == "") {
           location.hash = DEFAULT_HASH;
@@ -3152,14 +3174,18 @@ const NAV_MODES = {
 
         return;
       case NAV_MODES.GUIDES:
+        
         const sections = zigAnalysis.guide_sections;
-        if (sections.length != 0 && sections[0].guides.length != 0 && query == "") {
+        if (sections.length != 0 && sections[0].guides.length != 0 && nonSearchPart == "") {
           location.hash = NAV_MODES.GUIDES + sections[0].guides[0].name;
+          if (qpos != -1) {
+            location.hash += query.substring(qpos);
+          }
           return;
         }
 
         curNav.mode = mode;
-        curNav.activeGuide = query;
+        curNav.activeGuide = nonSearchPart;
 
         return;
       default:
@@ -3230,22 +3256,6 @@ const NAV_MODES = {
       }
     }
 
-    if (parentType.privDecls) {
-      for (let i = 0; i < parentType.privDecls.length; i += 1) {
-        let declIndex = parentType.privDecls[i];
-        let childDecl = getDecl(declIndex);
-        if (childDecl.name === childName) {
-          childDecl.find_subdecl_idx = declIndex;
-          return childDecl;
-        } else if (childDecl.is_uns) {
-          let declValue = resolveValue(childDecl.value);
-          if (!("type" in declValue.expr)) continue;
-          let uns_container = getType(declValue.expr.type);
-          let uns_res = findSubDecl(uns_container, childName);
-          if (uns_res !== null) return uns_res;
-        }
-      }
-    }
     return null;
   }
 
@@ -3276,6 +3286,12 @@ const NAV_MODES = {
         });
       }
     }
+
+    for (let i = 0; i < zigAnalysis.modules.length; i += 1) {
+      const p = zigAnalysis.modules[i];
+      // TODO
+      // declSearchIndex.add(p.name, {moduleId: i});
+    }
     return list;
   }
 
@@ -3291,6 +3307,7 @@ const NAV_MODES = {
       let stack = [
         {
           declNames: [],
+          declIndexes: [],
           type: getType(mod.main),
         },
       ];
@@ -3334,18 +3351,27 @@ const NAV_MODES = {
         }
       }
     }
+    window.cdp = list;
     return list;
   }
 
 function addDeclToSearchResults(decl, declIndex, modNames, item, list, stack) {
   let declVal = resolveValue(decl.value);
   let declNames = item.declNames.concat([decl.name]);
+  let declIndexes = item.declIndexes.concat([declIndex]);
 
   if (list[declIndex] != null) return;
   list[declIndex] = {
     modNames: modNames,
     declNames: declNames,
+    declIndexes: declIndexes,
   };
+
+  // add to search index
+  {
+    declSearchIndex.add(decl.name, {declIndex});
+  }
+  
   
   if ("type" in declVal.expr) {
     let value = getType(declVal.expr.type);
@@ -3356,18 +3382,20 @@ function addDeclToSearchResults(decl, declIndex, modNames, item, list, stack) {
     if (isContainerType(value)) {
       stack.push({
         declNames: declNames,
+        declIndexes: declIndexes,
         type: value,
       });
     }
 
     // Generic function
-    if (value.kind == typeKinds.Fn && value.generic_ret != null) {
-      let resolvedVal = resolveValue({ expr: value.generic_ret });
-      if ("type" in resolvedVal.expr) {
-        let generic_type = getType(resolvedVal.expr.type);
+    if (typeIsGenericFn(declVal.expr.type)) {
+      let ret = resolveGenericRet(value);
+      if (ret != null && "type" in ret.expr) {
+        let generic_type = getType(ret.expr.type);
         if (isContainerType(generic_type)) {
           stack.push({
             declNames: declNames,
+            declIndexes: declIndexes,
             type: generic_type,
           });
         }
@@ -3419,6 +3447,53 @@ function addDeclToSearchResults(decl, declIndex, modNames, item, list, stack) {
     return markdown(shortDesc(docs));
   }
 
+  function parseGuides() {
+    for (let j = 0; j < zigAnalysis.guide_sections.length; j+=1){
+      const section = zigAnalysis.guide_sections[j];
+      for (let i = 0; i < section.guides.length; i+=1){
+        let reader = new commonmark.Parser({smart: true});
+        const guide = section.guides[i];
+        const ast = reader.parse(guide.body);        
+        
+        // Find the first text thing to use as a sidebar title
+        guide.title = "[empty guide]";
+        {
+          let walker = ast.walker();
+          let event, node;
+          while ((event = walker.next())) {
+            node = event.node;
+            if (node.type === 'text') {
+              guide.title = node.literal;
+              break;
+            }
+          }        
+        }
+        // Index this guide
+        {
+          let walker = ast.walker();
+          let event, node;
+          while ((event = walker.next())) {
+            node = event.node;
+            if (event.entering == true && node.type === 'text') {
+                indexTextForGuide(j, i, node);          
+            }
+          }        
+        }
+      }  
+    }
+  }
+
+  function indexTextForGuide(section_idx, guide_idx, node){
+    const terms = node.literal.split(" ");
+    for (let i = 0; i < terms.length; i += 1){
+      const t = terms[i];
+      if (!guidesSearchIndex[t]) guidesSearchIndex[t] = new Set();
+      node.guide = {section_idx, guide_idx};
+      guidesSearchIndex[t].add(node);
+    }  
+  }
+  
+
   function markdown(input, contextType) {
     const raw_lines = input.split("\n"); // zig allows no '\r', so we don't need to split on CR
 
@@ -3841,6 +3916,7 @@ function addDeclToSearchResults(decl, declIndex, modNames, item, list, stack) {
       startSearch();
     }
   }
+  
 
   function onSearchKeyDown(ev) {
     switch (getKeyString(ev)) {
@@ -3982,16 +4058,207 @@ function addDeclToSearchResults(decl, declIndex, modNames, item, list, stack) {
     clearAsyncSearch();
     let oldHash = location.hash;
     let parts = oldHash.split("?");
-    let newPart2 = domSearch.value === "" ? "" : "?" + domSearch.value;
+    // TODO: make a tooltip that shows the user that we've replaced their dots
+    let box_text = domSearch.value.replaceAll(".", " ");
+    let newPart2 = box_text === "" ? "" : "?" + box_text;
     location.replace(parts.length === 1 ? oldHash + newPart2 : parts[0] + newPart2);
   }
   function getSearchTerms() {
     let list = curNavSearch.trim().split(/[ \r\n\t]+/);
-    list.sort();
     return list;
   }
 
-  function renderSearch() {
+  function renderSearchGuides() {
+    const searchTrimmed = false;
+    let ignoreCase = curNavSearch.toLowerCase() === curNavSearch;
+    
+    let terms = getSearchTerms();
+    let matchedItems = new Set();
+
+    for (let i = 0; i < terms.length; i += 1) {
+      const nodes = guidesSearchIndex[terms[i]];
+      if (nodes) {
+        for (const n of nodes) {      
+          matchedItems.add(n);
+        }
+      }
+    }
+
+    
+    
+    if (matchedItems.size !== 0) {
+      // Build up the list of search results
+      let matchedItemsHTML = "";
+
+      for (const node of matchedItems) {
+        const text = node.literal;
+        const href = "";
+
+        matchedItemsHTML += "<li><a href=\"" + href + "\">" + text + "</a></li>";
+      }
+
+      // Replace the search results using our newly constructed HTML string
+      domListSearchResults.innerHTML = matchedItemsHTML;
+      if (searchTrimmed) {
+        domSectSearchAllResultsLink.classList.remove("hidden");
+      }
+      renderSearchCursor();
+
+      domSectSearchResults.classList.remove("hidden");
+    } else {
+      domSectSearchNoResults.classList.remove("hidden");
+    }
+  }
+
+  function renderSearchAPI(){
+    if (canonDeclPaths == null) {
+      canonDeclPaths = computeCanonDeclPaths();
+    }
+    let declSet = new Set();
+    let otherDeclSet = new Set(); // for low quality results
+    let declScores = {};
+    
+    let ignoreCase = curNavSearch.toLowerCase() === curNavSearch;
+    let term_list = getSearchTerms();
+    for (let i = 0; i < term_list.length; i += 1) {
+      let term = term_list[i];
+      let result = declSearchIndex.search(term.toLowerCase());
+      if (result == null) {
+        domSectSearchNoResults.classList.remove("hidden");
+        domSectSearchResults.classList.add("hidden");
+        return;
+      }
+
+      let termSet = new Set();
+      let termOtherSet = new Set();
+
+      for (let list of [result.full, result.partial]) {
+        for (let r of list) {
+          const d = r.declIndex;
+          const decl = getDecl(d);
+          const canonPath = getCanonDeclPath(d);
+
+          // collect unconditionally for the first term
+          if (i == 0) {
+            declSet.add(d);
+          } else {
+            // path intersection for subsequent terms
+            let found = false;
+            for (let p of canonPath.declIndexes) {
+              if (declSet.has(p)) {
+                found = true;
+                break;
+              }   
+            }
+            if (!found) {
+              otherDeclSet.add(d);
+            } else {
+              termSet.add(d);
+            }
+          }
+          
+          if (declScores[d] == undefined) declScores[d] = 0;
+        
+          // scores (lower is better)
+          let decl_name = decl.name;
+          if (ignoreCase) decl_name = decl_name.toLowerCase();
+
+          // shallow path are preferable
+          const path_depth = canonPath.declNames.length * 50;
+          // matching the start of a decl name is good
+          const match_from_start = decl_name.startsWith(term) ? -term.length * (1 -ignoreCase) : (decl_name.length - term.length) + 1; 
+          // being a perfect match is good
+          const is_full_match = (list == result.full) ? -decl_name.length * (2 - ignoreCase) : decl_name.length - term.length;
+          // matching the end of a decl name is good
+          const matches_the_end = decl_name.endsWith(term) ? -term.length * (1 - ignoreCase) : (decl_name.length - term.length) + 1;
+          // explicitly penalizing scream case decls
+          const decl_is_scream_case = decl.name.toUpperCase() != decl.name ? 0 : decl.name.length;  
+        
+          const score =  path_depth 
+            + match_from_start 
+            + is_full_match 
+            + matches_the_end 
+            + decl_is_scream_case;
+
+          declScores[d] += score;        
+        }
+      }
+      if (i != 0) {
+        for (let d of declSet) {
+          if (termSet.has(d)) continue;
+          let found = false;
+          for (let p of getCanonDeclPath(d).declIndexes) {
+            if (termSet.has(p) || otherDeclSet.has(p)) {
+              found = true;
+              break;
+            }   
+          }
+          if (found) {
+            declScores[d] = declScores[d] / term_list.length;
+          }
+          
+          termOtherSet.add(d);
+        }
+        declSet = termSet;
+        for (let d of termOtherSet) {
+          otherDeclSet.add(d);
+        }
+        
+      }
+    }
+
+    let matchedItems = {
+      high_quality: [],
+      low_quality: [],
+    };
+    for (let idx of declSet) {
+      matchedItems.high_quality.push({points: declScores[idx], declIndex: idx})
+    }
+    for (let idx of otherDeclSet) {
+      matchedItems.low_quality.push({points: declScores[idx], declIndex: idx})
+    }
+    
+    matchedItems.high_quality.sort(function (a, b) {
+      let cmp = operatorCompare(a.points, b.points);
+      return cmp;
+    });
+    matchedItems.low_quality.sort(function (a, b) {
+      let cmp = operatorCompare(a.points, b.points);
+      return cmp;
+    });
+    
+    // Build up the list of search results
+    let matchedItemsHTML = "";
+
+    for (let list of [matchedItems.high_quality, matchedItems.low_quality]) {
+      if (list == matchedItems.low_quality && list.length > 0) {
+        matchedItemsHTML += "<hr class='other-results'>"
+      }
+      for (let result of list) {
+        const points = result.points;
+        const match = result.declIndex;
+
+        let canonPath = getCanonDeclPath(match);
+        if (canonPath == null) continue;
+
+        let lastModName = canonPath.modNames[canonPath.modNames.length - 1];
+        let text = lastModName + "." + canonPath.declNames.join(".");
+      
+
+        const href = navLink(canonPath.modNames, canonPath.declNames);
+
+        matchedItemsHTML += "<li><a href=\"" + href + "\">" +  text + "</a></li>";
+      }
+    }
+
+    // Replace the search results using our newly constructed HTML string
+    domListSearchResults.innerHTML = matchedItemsHTML;
+    renderSearchCursor();
+
+    domSectSearchResults.classList.remove("hidden");
+  }
+   
+  function renderSearchAPIOld() {
     let matchedItems = [];
     let ignoreCase = curNavSearch.toLowerCase() === curNavSearch;
     let terms = getSearchTerms();
@@ -4063,7 +4330,7 @@ function addDeclToSearchResults(decl, declIndex, modNames, item, list, stack) {
       });
 
       let searchTrimmed = false;
-      const searchTrimResultsMaxItems = 200;
+      const searchTrimResultsMaxItems = 60;
       if (searchTrimResults && matchedItems.length > searchTrimResultsMaxItems) {
         matchedItems = matchedItems.slice(0, searchTrimResultsMaxItems);
         searchTrimmed = true;
@@ -4314,3 +4581,255 @@ function toggleExpand(event) {
     parent.parentElement.parentElement.scrollIntoView(true);
   }
 }
+
+function RadixTree() {
+  this.root = null;
+
+  RadixTree.prototype.search = function (query) {
+    return this.root.search(query);
+    
+  }
+
+  RadixTree.prototype.add = function (declName, value) {
+    if (this.root == null) {
+      this.root = new Node(declName.toLowerCase(), null, [value]);
+    } else {
+      this.root.add(declName.toLowerCase(), value);
+    }
+
+    const not_scream_case = declName.toUpperCase() != declName;
+    let found_separator = false;
+    for (let i = 1; i < declName.length; i +=1) {
+      if (declName[i] == '_' || declName[i] == '.') {
+        found_separator = true;
+        continue;
+      }
+
+
+      if (found_separator || (declName[i].toLowerCase() !== declName[i])) {
+        if (declName.length > i+1 
+          && declName[i+1].toLowerCase() != declName[i+1]) continue;
+        let suffix = declName.slice(i);
+        this.root.add(suffix.toLowerCase(), value);
+        found_separator = false;
+      }
+    }
+  }
+  
+  function Node(labels, next, values) {
+    this.labels = labels; 
+    this.next = next;
+    this.values = values;
+  }
+
+  Node.prototype.isCompressed = function () {
+    return !Array.isArray(this.next);
+  }
+
+  Node.prototype.search = function (word) {
+    let full_matches = [];
+    let partial_matches = [];
+    let subtree_root = null;
+    
+    let cn = this;
+    char_loop: for (let i = 0; i < word.length;) {
+      if (cn.isCompressed()) {
+        for (let j = 0; j < cn.labels.length; j += 1) {
+          let current_idx = i+j;
+
+          if (current_idx == word.length) {
+            partial_matches = cn.values;
+            subtree_root = cn.next;
+            break char_loop; 
+          }
+          
+          if (word[current_idx] != cn.labels[j]) return null;
+        }
+
+        // the full label matched
+        let new_idx = i + cn.labels.length;
+        if (new_idx == word.length) {
+          full_matches = cn.values;
+          subtree_root = cn.next;
+          break char_loop;
+        }
+        
+        
+        i = new_idx;
+        cn = cn.next;
+        continue;
+      } else {
+        for (let j = 0; j < cn.labels.length; j += 1) {
+          if (word[i] == cn.labels[j]) {
+            if (i == word.length - 1) { 
+              full_matches = cn.values[j];
+              subtree_root = cn.next[j];
+              break char_loop;
+            }
+              
+            let next = cn.next[j];
+            if (next == null) return null;
+            cn = next;
+            i += 1;
+            continue char_loop; 
+          } 
+        }
+        
+        // didn't find a match
+        return null;
+      }
+    }
+    
+    // Match was found, let's collect all other 
+    // partial matches from the subtree
+    let stack = [subtree_root];
+    let node;
+    while (node = stack.pop()) {
+      if (node.isCompressed()) {
+        partial_matches = partial_matches.concat(node.values);
+        if (node.next != null) {
+          stack.push(node.next);
+        }
+      } else {
+        for (let v of node.values) {
+          partial_matches = partial_matches.concat(v);
+        }
+        
+        for (let n of node.next) {
+          if (n != null) stack.push(n);
+        }
+      }
+    }
+
+    return {full: full_matches, partial: partial_matches};
+  }
+
+  Node.prototype.add = function (word, value) {
+    let cn = this;
+    char_loop: for (let i = 0; i < word.length;) {
+      if (cn.isCompressed()) {
+        for(let j = 0; j < cn.labels.length; j += 1) {
+          let current_idx = i+j;
+
+          if (current_idx == word.length) {
+            if (j < cn.labels.length - 1) {
+              let node = new Node(cn.labels.slice(j), cn.next, cn.values);
+              cn.labels = cn.labels.slice(0, j);
+              cn.next = node;
+              cn.values = [];
+            }
+            cn.values.push(value);
+            return;
+          }
+          
+          if (word[current_idx] == cn.labels[j]) continue;
+          
+          // if we're here, a mismatch was found
+          if (j != cn.labels.length - 1) {
+            // create a suffix node
+            const label_suffix = cn.labels.slice(j+1);
+            let node = new Node(label_suffix, cn.next, [...cn.values]);
+            cn.next = node;
+            cn.values = [];
+          }
+
+          // turn current node into a split node
+          let node = null;
+          let word_values = [];
+          if (current_idx == word.length - 1) {
+            // mismatch happened in the last character of word
+            // meaning that the current node should hold its value
+            word_values.push(value);
+          } else {
+             node = new Node(word.slice(current_idx+1), null, [value]);
+          }
+        
+          cn.labels = cn.labels[j] + word[current_idx];
+          cn.next = [cn.next, node];          
+          cn.values = [cn.values, word_values];
+
+          if (j != 0) {
+            // current node must be turned into a prefix node
+            let splitNode = new Node(cn.labels, cn.next, cn.values);
+            cn.labels = word.slice(i, current_idx);
+            cn.next = splitNode;
+            cn.values = [];
+          }
+
+          return;
+        }        
+        // label matched fully with word, are there any more chars?
+        const new_idx = i + cn.labels.length;
+        if (new_idx == word.length) {
+          cn.values.push(value);
+          return;
+        } else {
+          if (cn.next == null) {
+            let node = new Node(word.slice(new_idx), null, [value]);
+            cn.next = node;
+            return;
+          } else {
+            cn = cn.next;
+            i = new_idx;
+            continue;
+          }
+        } 
+      } else { // node is not compressed
+        let letter = word[i];
+        for (let j = 0; j < cn.labels.length; j += 1) {
+          if (letter == cn.labels[j]) {
+            if (i == word.length - 1) {
+              cn.values[j].push(value);
+              return;
+            }
+            if (cn.next[j] == null) {
+              let node = new Node(word.slice(i+1), null, [value]);
+              cn.next[j] = node;
+              return;
+            } else {
+              cn = cn.next[j];
+              i += 1;
+              continue char_loop;
+            }
+          }
+        }
+
+        // if we're here we didn't find a match
+        cn.labels += letter;
+        if (i == word.length - 1) {
+          cn.next.push(null);
+          cn.values.push([value]);
+        } else {
+          let node = new Node(word.slice(i+1), null, [value]);
+          cn.next.push(node);
+          cn.values.push([]);
+        }
+        return;
+      }
+    }
+  }
+}
+
+// RADIX TREE:
+
+// apple 
+// appliance
+
+// "appl" => [
+//   'e', => $
+//   'i' => "ance" => $
+// ]
+
+// OUR STUFF:
+
+// AutoHashMap
+// AutoArrayHashMap
+
+// "Auto" => [
+//   'A', => "rrayHashMap" => $
+//   'H'  => "ashMap" => $
+// ]
+
+// BUT!
+
+// We want to be able to search "Hash", for example!
\ No newline at end of file
src/Autodoc.zig
@@ -234,12 +234,13 @@ pub fn generateZirData(self: *Autodoc) !void {
     };
 
     const tldoc_comment = try self.getTLDocComment(file);
+    const cleaned_tldoc_comment = try self.findGuidePaths(file, tldoc_comment);
+    defer self.arena.free(cleaned_tldoc_comment);
     try self.ast_nodes.append(self.arena, .{
         .name = "(root)",
-        .docs = tldoc_comment,
+        .docs = cleaned_tldoc_comment,
     });
     try self.files.put(self.arena, file, main_type_index);
-    try self.findGuidePaths(file, tldoc_comment);
 
     _ = try self.walkInstruction(file, &root_scope, .{}, Zir.main_struct_inst, false);
 
@@ -349,6 +350,7 @@ pub fn generateZirData(self: *Autodoc) !void {
     var docs_dir = try self.comp_module.comp.zig_lib_directory.handle.openDir("docs", .{});
     defer docs_dir.close();
     try docs_dir.copyFile("main.js", output_dir, "main.js", .{});
+    try docs_dir.copyFile("commonmark.js", output_dir, "commonmark.js", .{});
     try docs_dir.copyFile("index.html", output_dir, "index.html", .{});
 }
 
@@ -4754,14 +4756,20 @@ fn getTLDocComment(self: *Autodoc, file: *File) ![]const u8 {
     return comment.items;
 }
 
-fn findGuidePaths(self: *Autodoc, file: *File, str: []const u8) !void {
+/// Returns the doc comment cleared of autodoc directives.
+fn findGuidePaths(self: *Autodoc, file: *File, str: []const u8) ![]const u8 {
     const guide_prefix = "zig-autodoc-guide:";
     const section_prefix = "zig-autodoc-section:";
 
     try self.guide_sections.append(self.arena, .{}); // add a default section
     var current_section = &self.guide_sections.items[self.guide_sections.items.len - 1];
 
-    var it = std.mem.tokenize(u8, str, "\n");
+    var clean_docs: std.ArrayListUnmanaged(u8) = .{};
+    errdefer clean_docs.deinit(self.arena);
+
+    // TODO: this algo is kinda inefficient
+
+    var it = std.mem.split(u8, str, "\n");
     while (it.next()) |line| {
         const trimmed_line = std.mem.trim(u8, line, " ");
         if (std.mem.startsWith(u8, trimmed_line, guide_prefix)) {
@@ -4775,8 +4783,13 @@ fn findGuidePaths(self: *Autodoc, file: *File, str: []const u8) !void {
                 .name = trimmed_section_name,
             });
             current_section = &self.guide_sections.items[self.guide_sections.items.len - 1];
+        } else {
+            try clean_docs.appendSlice(self.arena, line);
+            try clean_docs.append(self.arena, '\n');
         }
     }
+
+    return clean_docs.toOwnedSlice(self.arena);
 }
 
 fn addGuide(self: *Autodoc, file: *File, guide_path: []const u8, section: *Section) !void {