Explorar el Código

Merge pull request #9381 from overleaf/td-galileo-panel-cite

Display citations and regular prediction in panel when cursor is in a /cite command

GitOrigin-RevId: 42598c2f5231dd5cee8639b13cb6433c83c6e0b3
Tim Down hace 4 años
padre
commit
7288ef0370

+ 1952 - 0
services/web/app/src/util/bib2json.js

@@ -0,0 +1,1952 @@
+/* eslint-disable */
+/**
+ * Parser.js
+ * Copyright 2012-13 Mayank Lahiri
+ * mlahiri@gmail.com
+ * Released under the BSD License.
+ *
+ * Modifications 2016 Sharelatex
+ * Modifications 2017-2020 Overleaf
+ *
+ * A forgiving Bibtex parser that can:
+ *
+ * (1) operate in streaming or block mode, extracting entries as dictionaries.
+ * (2) convert Latex special characters to UTF-8.
+ * (3) best-effort parse malformed entries.
+ * (4) run in a CommonJS environment or a browser, without any dependencies.
+ * (5) be advanced-compiled by Google Closure Compiler.
+ *
+ * Handwritten as a labor of love, not auto-generated from a grammar.
+ *
+ * Modes of usage:
+ *
+ * (1) Synchronous, string
+ *
+ *   var entries = BibtexParser(text);
+ *   console.log(entries);
+ *
+ * (2) Asynchronous, stream
+ *
+ *   function entryCallback(entry) { console.log(entry); }
+ *   var parser = new BibtexParser(entryCallback);
+ *   parser.parse(chunk1);
+ *   parser.parse(chunk2);
+ *   ...
+ *
+ * @param {text|function(Object)} arg0 Either a Bibtex string or callback
+ *                                    function for processing parsed entries.
+ * @param {array} allowedKeys optimization: do not output key/value pairs that are not on this allowlist
+ * @constructor
+ */
+function BibtexParser(arg0, allowedKeys) {
+  // Determine how this function is to be used
+  if (typeof arg0 === 'string') {
+    // Passed a string, synchronous call without 'new'
+    let entries = []
+    function accumulator(entry) {
+      entries.push(entry)
+    }
+    let parser = new BibtexParser(accumulator, allowedKeys)
+    parser.parse(arg0)
+    return {
+      entries: entries,
+      errors: parser.getErrors(),
+    }
+  }
+  if (typeof arg0 !== 'function') {
+    throw 'Invalid parser construction.'
+  }
+  this.ALLOWEDKEYS_ = allowedKeys || []
+  this.reset_(arg0)
+  this.initMacros_()
+  return this
+}
+
+/** @enum {number} */
+BibtexParser.prototype.STATES_ = {
+  ENTRY_OR_JUNK: 0,
+  OBJECT_TYPE: 1,
+  ENTRY_KEY: 2,
+  KV_KEY: 3,
+  EQUALS: 4,
+  KV_VALUE: 5,
+}
+BibtexParser.prototype.reset_ = function (arg0) {
+  /** @private */ this.DATA_ = {}
+  /** @private */ this.CALLBACK_ = arg0
+  /** @private */ this.CHAR_ = 0
+  /** @private */ this.LINE_ = 1
+  /** @private */ this.CHAR_IN_LINE_ = 0
+  /** @private */ this.SKIPWS_ = true
+  /** @private */ this.SKIPCOMMENT_ = true
+  /** @private */ this.SKIPKVPAIR_ = false
+  /** @private */ this.PARSETMP_ = {}
+  /** @private */ this.SKIPTILLEOL_ = false
+  /** @private */ this.VALBRACES_ = null
+  /** @private */ this.BRACETYPE_ = null
+  /** @private */ this.BRACECOUNT_ = 0
+  /** @private */ this.STATE_ = this.STATES_.ENTRY_OR_JUNK
+  /** @private */ this.ERRORS_ = []
+}
+/** @private */ BibtexParser.prototype.ENTRY_TYPES_ = {
+  inproceedings: 1,
+  proceedings: 2,
+  article: 3,
+  techreport: 4,
+  misc: 5,
+  mastersthesis: 6,
+  book: 7,
+  phdthesis: 8,
+  incollection: 9,
+  unpublished: 10,
+  inbook: 11,
+  manual: 12,
+  periodical: 13,
+  booklet: 14,
+  masterthesis: 15,
+  conference: 16,
+  /* additional fields from biblatex */
+  artwork: 17,
+  audio: 18,
+  bibnote: 19,
+  bookinbook: 20,
+  collection: 21,
+  commentary: 22,
+  customa: 23,
+  customb: 24,
+  customc: 25,
+  customd: 26,
+  custome: 27,
+  customf: 28,
+  image: 29,
+  inreference: 30,
+  jurisdiction: 31,
+  legal: 32,
+  legislation: 33,
+  letter: 34,
+  movie: 35,
+  music: 36,
+  mvbook: 37,
+  mvcollection: 38,
+  mvproceedings: 39,
+  mvreference: 40,
+  online: 41,
+  patent: 42,
+  performance: 43,
+  reference: 44,
+  report: 45,
+  review: 46,
+  set: 47,
+  software: 48,
+  standard: 49,
+  suppbook: 50,
+  suppcollection: 51,
+  thesis: 52,
+  video: 53,
+}
+BibtexParser.prototype.initMacros_ = function () {
+  // macros can be extended by the user via
+  //   @string { macroName = "macroValue" }
+  /** @private */ this.MACROS_ = {
+    jan: 'January',
+    feb: 'February',
+    mar: 'March',
+    apr: 'April',
+    may: 'May',
+    jun: 'June',
+    jul: 'July',
+    aug: 'August',
+    sep: 'September',
+    oct: 'October',
+    nov: 'November',
+    dec: 'December',
+    Jan: 'January',
+    Feb: 'February',
+    Mar: 'March',
+    Apr: 'April',
+    May: 'May',
+    Jun: 'June',
+    Jul: 'July',
+    Aug: 'August',
+    Sep: 'September',
+    Oct: 'October',
+    Nov: 'November',
+    Dec: 'December',
+  }
+}
+
+/**
+ * Gets an array of all errors encountered during parsing.
+ * Array entries are of the format:
+ *  [ line number, character in line, character in stream, error text ]
+ *
+ * @returns Array<Array>
+ * @public
+ */
+BibtexParser.prototype.getErrors = function () {
+  return this.ERRORS_
+}
+
+/**
+ * Processes a chunk of data
+ * @public
+ */
+BibtexParser.prototype.parse = function (chunk) {
+  for (let i = 0; i < chunk.length; i++) this.processCharacter_(chunk[i])
+}
+
+/**
+ * Logs error at current stream position.
+ *
+ * @private
+ */
+BibtexParser.prototype.error_ = function (text) {
+  this.ERRORS_.push([this.LINE_, this.CHAR_IN_LINE_, this.CHAR_, text])
+}
+
+/**
+ * Called after an entire entry has been parsed from the stream.
+ * Performs post-processing and invokes the entry callback pointed to by
+ * this.CALLBACK_. Parsed (but unprocessed) entry data is in this.DATA_.
+ */
+BibtexParser.prototype.processEntry_ = function () {
+  let data = this.DATA_
+  if (data.Fields)
+    for (let f in data.Fields) {
+      let raw = data.Fields[f]
+
+      // Convert Latex/Bibtex special characters to UTF-8 equivalents
+      for (let i = 0; i < this.CHARCONV_.length; i++) {
+        let re = this.CHARCONV_[i][0]
+        let rep = this.CHARCONV_[i][1]
+        raw = raw.replace(re, rep)
+      }
+
+      // Basic substitutions
+      raw = raw
+        .replace(/[\n\r\t]/g, ' ')
+        .replace(/\s\s+/g, ' ')
+        .replace(/^\s+|\s+$/g, '')
+
+      // Remove braces and backslashes
+      let len = raw.length
+      let processedArr = []
+      for (let i = 0; i < len; i++) {
+        let c = raw[i]
+        let skip = false
+        if (c == '\\' && i < len - 1) c = raw[++i]
+        else {
+          if (c == '{' || c == '}') skip = true
+        }
+        if (!skip) processedArr.push(c)
+      }
+      data.Fields[f] = processedArr.join('')
+      processedArr = null
+    }
+
+  if (data.ObjectType == 'string') {
+    for (let f in data.Fields) {
+      this.MACROS_[f] = data.Fields[f]
+    }
+  } else {
+    // Parsed a new Bibtex entry
+    this.CALLBACK_(data)
+  }
+}
+
+/**
+ * Processes next character in the stream, invoking the callback after
+ * each entry has been found and processed.
+ *
+ * @private
+ * @param {string} c Next character in input stream
+ */
+BibtexParser.prototype.processCharacter_ = function (c) {
+  // Housekeeping
+  this.CHAR_++
+  this.CHAR_IN_LINE_++
+  if (c == '\n') {
+    this.LINE_++
+    this.CHAR_IN_LINE_ = 1
+  }
+
+  // Convenience states for skipping whitespace when needed
+  if (this.SKIPTILLEOL_) {
+    if (c == '\n') this.SKIPTILLEOL_ = false
+    return
+  }
+  if (this.SKIPCOMMENT_ && c == '%') {
+    this.SKIPTILLEOL_ = true
+    return
+  }
+  if (this.SKIPWS_ && /\s/.test(c)) return
+  this.SKIPWS_ = false
+  this.SKIPCOMMENT_ = false
+  this.SKIPTILLEOL_ = false
+
+  // Main state machine
+  let AnotherIteration = true
+  while (AnotherIteration) {
+    // console.log(this.LINE_, this.CHAR_IN_LINE_, this.STATE_, c)
+    AnotherIteration = false
+    switch (this.STATE_) {
+      // -- Scan for an object marker ('@')
+      // -- Reset temporary data structure in case previous entry was garbled
+      case this.STATES_.ENTRY_OR_JUNK:
+        if (c == '@') {
+          // SUCCESS:     Parsed a valid start-of-object marker.
+          // NEXT_STATE:  OBJECT_TYPE
+          this.STATE_ = this.STATES_.OBJECT_TYPE
+          this.DATA_ = {
+            ObjectType: '',
+          }
+        }
+        this.BRACETYPE_ = null
+        this.SKIPWS_ = true
+        this.SKIPCOMMENT_ = true
+        break
+
+      // Start at first non-whitespace character after start-of-object '@'
+      // -- Accept [A-Za-z], break on non-matching character
+      // -- Populate this.DATA_.EntryType and this.DATA_.ObjectType
+      case this.STATES_.OBJECT_TYPE:
+        if (/[A-Za-z]/.test(c)) {
+          this.DATA_.ObjectType += c.toLowerCase()
+          this.SKIPWS_ = true
+          this.SKIPCOMMENT_ = true
+        } else {
+          // Break from state and validate object type
+          let ot = this.DATA_.ObjectType
+          if (ot == 'comment') {
+            this.STATE_ = this.STATES_.ENTRY_OR_JUNK
+          } else {
+            if (ot == 'string') {
+              this.DATA_.ObjectType = ot
+              this.DATA_.Fields = {}
+              this.BRACETYPE_ = c
+              this.BRACECOUNT_ = 1
+              this.STATE_ = this.STATES_.KV_KEY
+              this.SKIPWS_ = true
+              this.SKIPCOMMENT_ = true
+              this.PARSETMP_ = {
+                Key: '',
+              }
+            } else {
+              if (ot == 'preamble') {
+                this.STATE_ = this.STATES_.ENTRY_OR_JUNK
+              } else {
+                if (ot in this.ENTRY_TYPES_) {
+                  // SUCCESS:     Parsed a valid object type.
+                  // NEXT_STATE:  ENTRY_KEY
+                  this.DATA_.ObjectType = 'entry'
+                  this.DATA_.EntryType = ot
+                  this.DATA_.EntryKey = ''
+                  this.STATE_ = this.STATES_.ENTRY_KEY
+                  AnotherIteration = true
+                } else {
+                  // ERROR:       Unrecognized object type.
+                  // NEXT_STATE:  ENTRY_OR_JUNK
+                  this.error_(
+                    'Unrecognized object type: "' + this.DATA_.ObjectType + '"'
+                  )
+                  this.STATE_ = this.STATES_.ENTRY_OR_JUNK
+                }
+              }
+            }
+          }
+        }
+        break
+
+      // Start at first non-alphabetic character after an entry type
+      // -- Populate this.DATA_.EntryKey
+      case this.STATES_.ENTRY_KEY:
+        if ((c === '{' || c === '(') && this.BRACETYPE_ == null) {
+          this.BRACETYPE_ = c
+          this.BRACECOUNT_ = 1
+          this.SKIPWS_ = true
+          this.SKIPCOMMENT_ = true
+          break
+        }
+        if (/[,%\s]/.test(c)) {
+          if (this.DATA_.EntryKey.length < 1) {
+            // Skip comments and whitespace before entry key
+            this.SKIPWS_ = true
+            this.SKIPCOMMENT_ = true
+          } else {
+            if (this.BRACETYPE_ == null) {
+              // ERROR:       No opening brace for object
+              // NEXT_STATE:  ENTRY_OR_JUNK
+              this.error_('No opening brace for object.')
+              this.STATE_ = this.STATES_.ENTRY_OR_JUNK
+            } else {
+              // SUCCESS:     Parsed an entry key
+              // NEXT_STATE:  KV_KEY
+              this.SKIPWS_ = true
+              this.SKIPCOMMENT_ = true
+              AnotherIteration = true
+              this.STATE_ = this.STATES_.KV_KEY
+              this.PARSETMP_.Key = ''
+              this.DATA_.Fields = {}
+            }
+          }
+        } else {
+          this.DATA_.EntryKey += c
+          this.SKIPWS_ = false
+          this.SKIPCOMMENT_ = false
+        }
+        break
+
+      // Start at first non-whitespace/comment character after entry key.
+      // -- Populate this.PARSETMP_.Key
+      case this.STATES_.KV_KEY:
+        // Test for end of entry
+        if (
+          (c == '}' && this.BRACETYPE_ == '{') ||
+          (c == ')' && this.BRACETYPE_ == '(')
+        ) {
+          // SUCCESS:       Parsed an entry, possible incomplete
+          // NEXT_STATE:    ENTRY_OR_JUNK
+          this.processEntry_()
+          this.SKIPWS_ = true
+          this.SKIPCOMMENT_ = true
+          this.STATE_ = this.STATES_.ENTRY_OR_JUNK
+          break
+        }
+        if (/[\-A-Za-z:]/.test(c)) {
+          // Add to key
+          this.PARSETMP_.Key += c
+          this.SKIPWS_ = false
+          this.SKIPCOMMENT_ = false
+        } else {
+          // Either end of key or we haven't encountered start of key
+          if (this.PARSETMP_.Key.length < 1) {
+            // Keep going till we see a key
+            this.SKIPWS_ = true
+            this.SKIPCOMMENT_ = true
+          } else {
+            // SUCCESS:       Found full key in K/V pair
+            // NEXT_STATE:    EQUALS
+            this.SKIPWS_ = true
+            this.SKIPCOMMENT_ = true
+            this.STATE_ = this.STATES_.EQUALS
+            AnotherIteration = true
+
+            if (this.DATA_.ObjectType !== 'string') {
+              // this entry is not a macro
+              // normalize the key to lower case
+              this.PARSETMP_.Key = this.PARSETMP_.Key.toLowerCase()
+
+              // optimization: skip key/value pairs that are not on the allowlist
+              this.SKIPKVPAIR_ =
+                // has allowedKeys set
+                this.ALLOWEDKEYS_.length &&
+                // key is not on the allowlist
+                this.ALLOWEDKEYS_.indexOf(this.PARSETMP_.Key) === -1
+            } else {
+              this.SKIPKVPAIR_ = false
+            }
+          }
+        }
+        break
+
+      // Start at first non-alphabetic character after K/V pair key.
+      case this.STATES_.EQUALS:
+        if (
+          (c == '}' && this.BRACETYPE_ == '{') ||
+          (c == ')' && this.BRACETYPE_ == '(')
+        ) {
+          // ERROR:         K/V pair with key but no value
+          // NEXT_STATE:    ENTRY_OR_JUNK
+          this.error_(
+            'Key-value pair has key "' + this.PARSETMP_.Key + '", but no value.'
+          )
+          this.processEntry_()
+          this.SKIPWS_ = true
+          this.SKIPCOMMENT_ = true
+          this.STATE_ = this.STATES_.ENTRY_OR_JUNK
+          break
+        }
+        if (c == '=') {
+          // SUCCESS:       found an equal signs separating key and value
+          // NEXT_STATE:    KV_VALUE
+          this.SKIPWS_ = true
+          this.SKIPCOMMENT_ = true
+          this.STATE_ = this.STATES_.KV_VALUE
+          this.PARSETMP_.Value = []
+          this.VALBRACES_ = { '"': [], '{': [] }
+        }
+        break
+
+      // Start at first non-whitespace/comment character after '='
+      // -- Populate this.PARSETMP_.Value
+      case this.STATES_.KV_VALUE:
+        let delim = this.VALBRACES_
+        // valueCharsArray is the list of characters that make up the
+        // current value
+        let valueCharsArray = this.PARSETMP_.Value
+        let doneParsingValue = false
+
+        // Test for special characters
+        if (c == '"' || c == '{' || c == '}' || c == ',') {
+          if (c == ',') {
+            // This comma can mean:
+            // (1) just another comma literal
+            // (2) end of a macro reference
+            if (delim['"'].length + delim['{'].length === 0) {
+              // end of a macro reference
+              let macro = this.PARSETMP_.Value.join('').trim()
+              if (macro in this.MACROS_) {
+                // Successful macro reference
+                this.PARSETMP_.Value = [this.MACROS_[macro]]
+              } else {
+                // Reference to an undefined macro
+                this.error_('Reference to an undefined macro: ' + macro)
+              }
+              doneParsingValue = true
+            }
+          }
+          if (c == '"') {
+            // This quote can mean:
+            // (1) opening delimiter
+            // (2) closing delimiter
+            // (3) literal, if we have a '{' on the stack
+            if (delim['"'].length + delim['{'].length === 0) {
+              // opening delimiter
+              delim['"'].push(this.CHAR_)
+              this.SKIPWS_ = false
+              this.SKIPCOMMENT_ = false
+              break
+            }
+            if (
+              delim['"'].length == 1 &&
+              delim['{'].length == 0 &&
+              (valueCharsArray.length == 0 ||
+                valueCharsArray[valueCharsArray.length - 1] != '\\')
+            ) {
+              // closing delimiter
+              doneParsingValue = true
+            } else {
+              // literal, add to value
+            }
+          }
+          if (c == '{') {
+            // This brace can mean:
+            // (1) opening delimiter
+            // (2) stacked verbatim delimiter
+            if (
+              valueCharsArray.length == 0 ||
+              valueCharsArray[valueCharsArray.length - 1] != '\\'
+            ) {
+              delim['{'].push(this.CHAR_)
+              this.SKIPWS_ = false
+              this.SKIPCOMMENT_ = false
+            } else {
+              // literal, add to value
+            }
+          }
+          if (c == '}') {
+            // This brace can mean:
+            // (1) closing delimiter
+            // (2) closing stacked verbatim delimiter
+            // (3) end of object definition if value was a macro
+            if (delim['"'].length + delim['{'].length === 0) {
+              // end of object definition, after macro
+              let macro = this.PARSETMP_.Value.join('').trim()
+              if (macro in this.MACROS_) {
+                // Successful macro reference
+                this.PARSETMP_.Value = [this.MACROS_[macro]]
+              } else {
+                // Reference to an undefined macro
+                this.error_('Reference to an undefined macro: ' + macro)
+              }
+              AnotherIteration = true
+              doneParsingValue = true
+            } else {
+              if (
+                valueCharsArray.length == 0 ||
+                valueCharsArray[valueCharsArray.length - 1] != '\\'
+              ) {
+                if (delim['{'].length > 0) {
+                  // pop stack for stacked verbatim delimiter
+                  delim['{'].splice(delim['{'].length - 1, 1)
+                  if (delim['{'].length + delim['"'].length == 0) {
+                    // closing delimiter
+                    doneParsingValue = true
+                  } else {
+                    // end verbatim block
+                  }
+                }
+              } else {
+                // literal, add to value
+              }
+            }
+          }
+        }
+
+        // If here, then we are either done parsing the value or
+        // have a literal that should be added to the value.
+        if (doneParsingValue) {
+          // SUCCESS:     value parsed
+          // NEXT_STATE:  KV_KEY
+          this.SKIPWS_ = true
+          this.SKIPCOMMENT_ = true
+          this.STATE_ = this.STATES_.KV_KEY
+          if (!this.SKIPKVPAIR_) {
+            this.DATA_.Fields[this.PARSETMP_.Key] =
+              this.PARSETMP_.Value.join('')
+          }
+          this.PARSETMP_ = { Key: '' }
+          this.VALBRACES_ = null
+        } else {
+          this.PARSETMP_.Value.push(c)
+          if (this.PARSETMP_.Value.length >= 1000 * 20) {
+            this.PARSETMP_.Value = []
+            this.STATE_ = this.STATES_.ENTRY_OR_JUNK
+            this.DATA_ = { ObjectType: '' }
+            this.BRACETYPE_ = null
+            this.SKIPWS_ = true
+            this.SKIPCOMMENT_ = true
+          }
+        }
+        break
+    } // end switch (this.STATE_)
+  } // end while(AnotherIteration)
+} // end function processCharacter
+
+/** @private */ BibtexParser.prototype.CHARCONV_ = [
+  [/\\space /g, '\u0020'],
+  [/\\textdollar /g, '\u0024'],
+  [/\\textquotesingle /g, '\u0027'],
+  [/\\ast /g, '\u002A'],
+  [/\\textbackslash /g, '\u005C'],
+  [/\\\^\{\}/g, '\u005E'],
+  [/\\textasciigrave /g, '\u0060'],
+  [/\\lbrace /g, '\u007B'],
+  [/\\vert /g, '\u007C'],
+  [/\\rbrace /g, '\u007D'],
+  [/\\textasciitilde /g, '\u007E'],
+  [/\\textexclamdown /g, '\u00A1'],
+  [/\\textcent /g, '\u00A2'],
+  [/\\textsterling /g, '\u00A3'],
+  [/\\textcurrency /g, '\u00A4'],
+  [/\\textyen /g, '\u00A5'],
+  [/\\textbrokenbar /g, '\u00A6'],
+  [/\\textsection /g, '\u00A7'],
+  [/\\textasciidieresis /g, '\u00A8'],
+  [/\\textcopyright /g, '\u00A9'],
+  [/\\textordfeminine /g, '\u00AA'],
+  [/\\guillemotleft /g, '\u00AB'],
+  [/\\lnot /g, '\u00AC'],
+  [/\\textregistered /g, '\u00AE'],
+  [/\\textasciimacron /g, '\u00AF'],
+  [/\\textdegree /g, '\u00B0'],
+  [/\\pm /g, '\u00B1'],
+  [/\\textasciiacute /g, '\u00B4'],
+  [/\\mathrm\{\\mu\}/g, '\u00B5'],
+  [/\\textparagraph /g, '\u00B6'],
+  [/\\cdot /g, '\u00B7'],
+  [/\\c\{\}/g, '\u00B8'],
+  [/\\textordmasculine /g, '\u00BA'],
+  [/\\guillemotright /g, '\u00BB'],
+  [/\\textonequarter /g, '\u00BC'],
+  [/\\textonehalf /g, '\u00BD'],
+  [/\\textthreequarters /g, '\u00BE'],
+  [/\\textquestiondown /g, '\u00BF'],
+  [/\\`\{A\}/g, '\u00C0'],
+  [/\\'\{A\}/g, '\u00C1'],
+  [/\\\^\{A\}/g, '\u00C2'],
+  [/\\~\{A\}/g, '\u00C3'],
+  [/\\"\{A\}/g, '\u00C4'],
+  [/\\AA /g, '\u00C5'],
+  [/\\AE /g, '\u00C6'],
+  [/\\c\{C\}/g, '\u00C7'],
+  [/\\`\{E\}/g, '\u00C8'],
+  [/\\'\{E\}/g, '\u00C9'],
+  [/\\\^\{E\}/g, '\u00CA'],
+  [/\\"\{E\}/g, '\u00CB'],
+  [/\\`\{I\}/g, '\u00CC'],
+  [/\\'\{I\}/g, '\u00CD'],
+  [/\\\^\{I\}/g, '\u00CE'],
+  [/\\"\{I\}/g, '\u00CF'],
+  [/\\DH /g, '\u00D0'],
+  [/\\~\{N\}/g, '\u00D1'],
+  [/\\`\{O\}/g, '\u00D2'],
+  [/\\'\{O\}/g, '\u00D3'],
+  [/\\\^\{O\}/g, '\u00D4'],
+  [/\\~\{O\}/g, '\u00D5'],
+  [/\\"\{O\}/g, '\u00D6'],
+  [/\\texttimes /g, '\u00D7'],
+  [/\\O /g, '\u00D8'],
+  [/\\`\{U\}/g, '\u00D9'],
+  [/\\'\{U\}/g, '\u00DA'],
+  [/\\\^\{U\}/g, '\u00DB'],
+  [/\\"\{U\}/g, '\u00DC'],
+  [/\\'\{Y\}/g, '\u00DD'],
+  [/\\TH /g, '\u00DE'],
+  [/\\ss /g, '\u00DF'],
+  [/\\`\{a\}/g, '\u00E0'],
+  [/\\'\{a\}/g, '\u00E1'],
+  [/\\\^\{a\}/g, '\u00E2'],
+  [/\\~\{a\}/g, '\u00E3'],
+  [/\\"\{a\}/g, '\u00E4'],
+  [/\\aa /g, '\u00E5'],
+  [/\\ae /g, '\u00E6'],
+  [/\\c\{c\}/g, '\u00E7'],
+  [/\\`\{e\}/g, '\u00E8'],
+  [/\\'\{e\}/g, '\u00E9'],
+  [/\\\^\{e\}/g, '\u00EA'],
+  [/\\"\{e\}/g, '\u00EB'],
+  [/\\`\{\\i\}/g, '\u00EC'],
+  [/\\'\{\\i\}/g, '\u00ED'],
+  [/\\\^\{\\i\}/g, '\u00EE'],
+  [/\\"\{\\i\}/g, '\u00EF'],
+  [/\\dh /g, '\u00F0'],
+  [/\\~\{n\}/g, '\u00F1'],
+  [/\\`\{o\}/g, '\u00F2'],
+  [/\\'\{o\}/g, '\u00F3'],
+  [/\\\^\{o\}/g, '\u00F4'],
+  [/\\~\{o\}/g, '\u00F5'],
+  [/\\"\{o\}/g, '\u00F6'],
+  [/\\div /g, '\u00F7'],
+  [/\\o /g, '\u00F8'],
+  [/\\`\{u\}/g, '\u00F9'],
+  [/\\'\{u\}/g, '\u00FA'],
+  [/\\\^\{u\}/g, '\u00FB'],
+  [/\\"\{u\}/g, '\u00FC'],
+  [/\\'\{y\}/g, '\u00FD'],
+  [/\\th /g, '\u00FE'],
+  [/\\"\{y\}/g, '\u00FF'],
+  [/\\=\{A\}/g, '\u0100'],
+  [/\\=\{a\}/g, '\u0101'],
+  [/\\u\{A\}/g, '\u0102'],
+  [/\\u\{a\}/g, '\u0103'],
+  [/\\k\{A\}/g, '\u0104'],
+  [/\\k\{a\}/g, '\u0105'],
+  [/\\'\{C\}/g, '\u0106'],
+  [/\\'\{c\}/g, '\u0107'],
+  [/\\\^\{C\}/g, '\u0108'],
+  [/\\\^\{c\}/g, '\u0109'],
+  [/\\.\{C\}/g, '\u010A'],
+  [/\\.\{c\}/g, '\u010B'],
+  [/\\v\{C\}/g, '\u010C'],
+  [/\\v\{c\}/g, '\u010D'],
+  [/\\v\{D\}/g, '\u010E'],
+  [/\\v\{d\}/g, '\u010F'],
+  [/\\DJ /g, '\u0110'],
+  [/\\dj /g, '\u0111'],
+  [/\\=\{E\}/g, '\u0112'],
+  [/\\=\{e\}/g, '\u0113'],
+  [/\\u\{E\}/g, '\u0114'],
+  [/\\u\{e\}/g, '\u0115'],
+  [/\\.\{E\}/g, '\u0116'],
+  [/\\.\{e\}/g, '\u0117'],
+  [/\\k\{E\}/g, '\u0118'],
+  [/\\k\{e\}/g, '\u0119'],
+  [/\\v\{E\}/g, '\u011A'],
+  [/\\v\{e\}/g, '\u011B'],
+  [/\\\^\{G\}/g, '\u011C'],
+  [/\\\^\{g\}/g, '\u011D'],
+  [/\\u\{G\}/g, '\u011E'],
+  [/\\u\{g\}/g, '\u011F'],
+  [/\\.\{G\}/g, '\u0120'],
+  [/\\.\{g\}/g, '\u0121'],
+  [/\\c\{G\}/g, '\u0122'],
+  [/\\c\{g\}/g, '\u0123'],
+  [/\\\^\{H\}/g, '\u0124'],
+  [/\\\^\{h\}/g, '\u0125'],
+  [/\\Elzxh /g, '\u0127'],
+  [/\\~\{I\}/g, '\u0128'],
+  [/\\~\{\\i\}/g, '\u0129'],
+  [/\\=\{I\}/g, '\u012A'],
+  [/\\=\{\\i\}/g, '\u012B'],
+  [/\\u\{I\}/g, '\u012C'],
+  [/\\u\{\\i\}/g, '\u012D'],
+  [/\\k\{I\}/g, '\u012E'],
+  [/\\k\{i\}/g, '\u012F'],
+  [/\\.\{I\}/g, '\u0130'],
+  [/\\i /g, '\u0131'],
+  [/\\\^\{J\}/g, '\u0134'],
+  [/\\\^\{\\j\}/g, '\u0135'],
+  [/\\c\{K\}/g, '\u0136'],
+  [/\\c\{k\}/g, '\u0137'],
+  [/\\'\{L\}/g, '\u0139'],
+  [/\\'\{l\}/g, '\u013A'],
+  [/\\c\{L\}/g, '\u013B'],
+  [/\\c\{l\}/g, '\u013C'],
+  [/\\v\{L\}/g, '\u013D'],
+  [/\\v\{l\}/g, '\u013E'],
+  [/\\L /g, '\u0141'],
+  [/\\l /g, '\u0142'],
+  [/\\'\{N\}/g, '\u0143'],
+  [/\\'\{n\}/g, '\u0144'],
+  [/\\c\{N\}/g, '\u0145'],
+  [/\\c\{n\}/g, '\u0146'],
+  [/\\v\{N\}/g, '\u0147'],
+  [/\\v\{n\}/g, '\u0148'],
+  [/\\NG /g, '\u014A'],
+  [/\\ng /g, '\u014B'],
+  [/\\=\{O\}/g, '\u014C'],
+  [/\\=\{o\}/g, '\u014D'],
+  [/\\u\{O\}/g, '\u014E'],
+  [/\\u\{o\}/g, '\u014F'],
+  [/\\H\{O\}/g, '\u0150'],
+  [/\\H\{o\}/g, '\u0151'],
+  [/\\OE /g, '\u0152'],
+  [/\\oe /g, '\u0153'],
+  [/\\'\{R\}/g, '\u0154'],
+  [/\\'\{r\}/g, '\u0155'],
+  [/\\c\{R\}/g, '\u0156'],
+  [/\\c\{r\}/g, '\u0157'],
+  [/\\v\{R\}/g, '\u0158'],
+  [/\\v\{r\}/g, '\u0159'],
+  [/\\'\{S\}/g, '\u015A'],
+  [/\\'\{s\}/g, '\u015B'],
+  [/\\\^\{S\}/g, '\u015C'],
+  [/\\\^\{s\}/g, '\u015D'],
+  [/\\c\{S\}/g, '\u015E'],
+  [/\\c\{s\}/g, '\u015F'],
+  [/\\v\{S\}/g, '\u0160'],
+  [/\\v\{s\}/g, '\u0161'],
+  [/\\c\{T\}/g, '\u0162'],
+  [/\\c\{t\}/g, '\u0163'],
+  [/\\v\{T\}/g, '\u0164'],
+  [/\\v\{t\}/g, '\u0165'],
+  [/\\~\{U\}/g, '\u0168'],
+  [/\\~\{u\}/g, '\u0169'],
+  [/\\=\{U\}/g, '\u016A'],
+  [/\\=\{u\}/g, '\u016B'],
+  [/\\u\{U\}/g, '\u016C'],
+  [/\\u\{u\}/g, '\u016D'],
+  [/\\r\{U\}/g, '\u016E'],
+  [/\\r\{u\}/g, '\u016F'],
+  [/\\H\{U\}/g, '\u0170'],
+  [/\\H\{u\}/g, '\u0171'],
+  [/\\k\{U\}/g, '\u0172'],
+  [/\\k\{u\}/g, '\u0173'],
+  [/\\\^\{W\}/g, '\u0174'],
+  [/\\\^\{w\}/g, '\u0175'],
+  [/\\\^\{Y\}/g, '\u0176'],
+  [/\\\^\{y\}/g, '\u0177'],
+  [/\\"\{Y\}/g, '\u0178'],
+  [/\\'\{Z\}/g, '\u0179'],
+  [/\\'\{z\}/g, '\u017A'],
+  [/\\.\{Z\}/g, '\u017B'],
+  [/\\.\{z\}/g, '\u017C'],
+  [/\\v\{Z\}/g, '\u017D'],
+  [/\\v\{z\}/g, '\u017E'],
+  [/\\texthvlig /g, '\u0195'],
+  [/\\textnrleg /g, '\u019E'],
+  [/\\eth /g, '\u01AA'],
+  [/\\textdoublepipe /g, '\u01C2'],
+  [/\\'\{g\}/g, '\u01F5'],
+  [/\\Elztrna /g, '\u0250'],
+  [/\\Elztrnsa /g, '\u0252'],
+  [/\\Elzopeno /g, '\u0254'],
+  [/\\Elzrtld /g, '\u0256'],
+  [/\\Elzschwa /g, '\u0259'],
+  [/\\varepsilon /g, '\u025B'],
+  [/\\Elzpgamma /g, '\u0263'],
+  [/\\Elzpbgam /g, '\u0264'],
+  [/\\Elztrnh /g, '\u0265'],
+  [/\\Elzbtdl /g, '\u026C'],
+  [/\\Elzrtll /g, '\u026D'],
+  [/\\Elztrnm /g, '\u026F'],
+  [/\\Elztrnmlr /g, '\u0270'],
+  [/\\Elzltlmr /g, '\u0271'],
+  [/\\Elzltln /g, '\u0272'],
+  [/\\Elzrtln /g, '\u0273'],
+  [/\\Elzclomeg /g, '\u0277'],
+  [/\\textphi /g, '\u0278'],
+  [/\\Elztrnr /g, '\u0279'],
+  [/\\Elztrnrl /g, '\u027A'],
+  [/\\Elzrttrnr /g, '\u027B'],
+  [/\\Elzrl /g, '\u027C'],
+  [/\\Elzrtlr /g, '\u027D'],
+  [/\\Elzfhr /g, '\u027E'],
+  [/\\Elzrtls /g, '\u0282'],
+  [/\\Elzesh /g, '\u0283'],
+  [/\\Elztrnt /g, '\u0287'],
+  [/\\Elzrtlt /g, '\u0288'],
+  [/\\Elzpupsil /g, '\u028A'],
+  [/\\Elzpscrv /g, '\u028B'],
+  [/\\Elzinvv /g, '\u028C'],
+  [/\\Elzinvw /g, '\u028D'],
+  [/\\Elztrny /g, '\u028E'],
+  [/\\Elzrtlz /g, '\u0290'],
+  [/\\Elzyogh /g, '\u0292'],
+  [/\\Elzglst /g, '\u0294'],
+  [/\\Elzreglst /g, '\u0295'],
+  [/\\Elzinglst /g, '\u0296'],
+  [/\\textturnk /g, '\u029E'],
+  [/\\Elzdyogh /g, '\u02A4'],
+  [/\\Elztesh /g, '\u02A7'],
+  [/\\textasciicaron /g, '\u02C7'],
+  [/\\Elzverts /g, '\u02C8'],
+  [/\\Elzverti /g, '\u02CC'],
+  [/\\Elzlmrk /g, '\u02D0'],
+  [/\\Elzhlmrk /g, '\u02D1'],
+  [/\\Elzsbrhr /g, '\u02D2'],
+  [/\\Elzsblhr /g, '\u02D3'],
+  [/\\Elzrais /g, '\u02D4'],
+  [/\\Elzlow /g, '\u02D5'],
+  [/\\textasciibreve /g, '\u02D8'],
+  [/\\textperiodcentered /g, '\u02D9'],
+  [/\\r\{\}/g, '\u02DA'],
+  [/\\k\{\}/g, '\u02DB'],
+  [/\\texttildelow /g, '\u02DC'],
+  [/\\H\{\}/g, '\u02DD'],
+  [/\\tone\{55\}/g, '\u02E5'],
+  [/\\tone\{44\}/g, '\u02E6'],
+  [/\\tone\{33\}/g, '\u02E7'],
+  [/\\tone\{22\}/g, '\u02E8'],
+  [/\\tone\{11\}/g, '\u02E9'],
+  [/\\cyrchar\\C/g, '\u030F'],
+  [/\\Elzpalh /g, '\u0321'],
+  [/\\Elzrh /g, '\u0322'],
+  [/\\Elzsbbrg /g, '\u032A'],
+  [/\\Elzxl /g, '\u0335'],
+  [/\\Elzbar /g, '\u0336'],
+  [/\\'\{A\}/g, '\u0386'],
+  [/\\'\{E\}/g, '\u0388'],
+  [/\\'\{H\}/g, '\u0389'],
+  [/\\'\{\}\{I\}/g, '\u038A'],
+  [/\\'\{\}O/g, '\u038C'],
+  [/\\mathrm\{'Y\}/g, '\u038E'],
+  [/\\mathrm\{'\\Omega\}/g, '\u038F'],
+  [/\\acute\{\\ddot\{\\iota\}\}/g, '\u0390'],
+  [/\\Alpha /g, '\u0391'],
+  [/\\Beta /g, '\u0392'],
+  [/\\Gamma /g, '\u0393'],
+  [/\\Delta /g, '\u0394'],
+  [/\\Epsilon /g, '\u0395'],
+  [/\\Zeta /g, '\u0396'],
+  [/\\Eta /g, '\u0397'],
+  [/\\Theta /g, '\u0398'],
+  [/\\Iota /g, '\u0399'],
+  [/\\Kappa /g, '\u039A'],
+  [/\\Lambda /g, '\u039B'],
+  [/\\Xi /g, '\u039E'],
+  [/\\Pi /g, '\u03A0'],
+  [/\\Rho /g, '\u03A1'],
+  [/\\Sigma /g, '\u03A3'],
+  [/\\Tau /g, '\u03A4'],
+  [/\\Upsilon /g, '\u03A5'],
+  [/\\Phi /g, '\u03A6'],
+  [/\\Chi /g, '\u03A7'],
+  [/\\Psi /g, '\u03A8'],
+  [/\\Omega /g, '\u03A9'],
+  [/\\mathrm\{\\ddot\{I\}\}/g, '\u03AA'],
+  [/\\mathrm\{\\ddot\{Y\}\}/g, '\u03AB'],
+  [/\\'\{\$\\alpha\$\}/g, '\u03AC'],
+  [/\\acute\{\\epsilon\}/g, '\u03AD'],
+  [/\\acute\{\\eta\}/g, '\u03AE'],
+  [/\\acute\{\\iota\}/g, '\u03AF'],
+  [/\\acute\{\\ddot\{\\upsilon\}\}/g, '\u03B0'],
+  [/\\alpha /g, '\u03B1'],
+  [/\\beta /g, '\u03B2'],
+  [/\\gamma /g, '\u03B3'],
+  [/\\delta /g, '\u03B4'],
+  [/\\epsilon /g, '\u03B5'],
+  [/\\zeta /g, '\u03B6'],
+  [/\\eta /g, '\u03B7'],
+  [/\\texttheta /g, '\u03B8'],
+  [/\\iota /g, '\u03B9'],
+  [/\\kappa /g, '\u03BA'],
+  [/\\lambda /g, '\u03BB'],
+  [/\\mu /g, '\u03BC'],
+  [/\\nu /g, '\u03BD'],
+  [/\\xi /g, '\u03BE'],
+  [/\\pi /g, '\u03C0'],
+  [/\\rho /g, '\u03C1'],
+  [/\\varsigma /g, '\u03C2'],
+  [/\\sigma /g, '\u03C3'],
+  [/\\tau /g, '\u03C4'],
+  [/\\upsilon /g, '\u03C5'],
+  [/\\varphi /g, '\u03C6'],
+  [/\\chi /g, '\u03C7'],
+  [/\\psi /g, '\u03C8'],
+  [/\\omega /g, '\u03C9'],
+  [/\\ddot\{\\iota\}/g, '\u03CA'],
+  [/\\ddot\{\\upsilon\}/g, '\u03CB'],
+  [/\\'\{o\}/g, '\u03CC'],
+  [/\\acute\{\\upsilon\}/g, '\u03CD'],
+  [/\\acute\{\\omega\}/g, '\u03CE'],
+  [/\\Pisymbol\{ppi022\}\{87\}/g, '\u03D0'],
+  [/\\textvartheta /g, '\u03D1'],
+  [/\\Upsilon /g, '\u03D2'],
+  [/\\phi /g, '\u03D5'],
+  [/\\varpi /g, '\u03D6'],
+  [/\\Stigma /g, '\u03DA'],
+  [/\\Digamma /g, '\u03DC'],
+  [/\\digamma /g, '\u03DD'],
+  [/\\Koppa /g, '\u03DE'],
+  [/\\Sampi /g, '\u03E0'],
+  [/\\varkappa /g, '\u03F0'],
+  [/\\varrho /g, '\u03F1'],
+  [/\\textTheta /g, '\u03F4'],
+  [/\\backepsilon /g, '\u03F6'],
+  [/\\cyrchar\\CYRYO /g, '\u0401'],
+  [/\\cyrchar\\CYRDJE /g, '\u0402'],
+  [/\\cyrchar\{\\'\\CYRG\}/g, '\u0403'],
+  [/\\cyrchar\\CYRIE /g, '\u0404'],
+  [/\\cyrchar\\CYRDZE /g, '\u0405'],
+  [/\\cyrchar\\CYRII /g, '\u0406'],
+  [/\\cyrchar\\CYRYI /g, '\u0407'],
+  [/\\cyrchar\\CYRJE /g, '\u0408'],
+  [/\\cyrchar\\CYRLJE /g, '\u0409'],
+  [/\\cyrchar\\CYRNJE /g, '\u040A'],
+  [/\\cyrchar\\CYRTSHE /g, '\u040B'],
+  [/\\cyrchar\{\\'\\CYRK\}/g, '\u040C'],
+  [/\\cyrchar\\CYRUSHRT /g, '\u040E'],
+  [/\\cyrchar\\CYRDZHE /g, '\u040F'],
+  [/\\cyrchar\\CYRA /g, '\u0410'],
+  [/\\cyrchar\\CYRB /g, '\u0411'],
+  [/\\cyrchar\\CYRV /g, '\u0412'],
+  [/\\cyrchar\\CYRG /g, '\u0413'],
+  [/\\cyrchar\\CYRD /g, '\u0414'],
+  [/\\cyrchar\\CYRE /g, '\u0415'],
+  [/\\cyrchar\\CYRZH /g, '\u0416'],
+  [/\\cyrchar\\CYRZ /g, '\u0417'],
+  [/\\cyrchar\\CYRI /g, '\u0418'],
+  [/\\cyrchar\\CYRISHRT /g, '\u0419'],
+  [/\\cyrchar\\CYRK /g, '\u041A'],
+  [/\\cyrchar\\CYRL /g, '\u041B'],
+  [/\\cyrchar\\CYRM /g, '\u041C'],
+  [/\\cyrchar\\CYRN /g, '\u041D'],
+  [/\\cyrchar\\CYRO /g, '\u041E'],
+  [/\\cyrchar\\CYRP /g, '\u041F'],
+  [/\\cyrchar\\CYRR /g, '\u0420'],
+  [/\\cyrchar\\CYRS /g, '\u0421'],
+  [/\\cyrchar\\CYRT /g, '\u0422'],
+  [/\\cyrchar\\CYRU /g, '\u0423'],
+  [/\\cyrchar\\CYRF /g, '\u0424'],
+  [/\\cyrchar\\CYRH /g, '\u0425'],
+  [/\\cyrchar\\CYRC /g, '\u0426'],
+  [/\\cyrchar\\CYRCH /g, '\u0427'],
+  [/\\cyrchar\\CYRSH /g, '\u0428'],
+  [/\\cyrchar\\CYRSHCH /g, '\u0429'],
+  [/\\cyrchar\\CYRHRDSN /g, '\u042A'],
+  [/\\cyrchar\\CYRERY /g, '\u042B'],
+  [/\\cyrchar\\CYRSFTSN /g, '\u042C'],
+  [/\\cyrchar\\CYREREV /g, '\u042D'],
+  [/\\cyrchar\\CYRYU /g, '\u042E'],
+  [/\\cyrchar\\CYRYA /g, '\u042F'],
+  [/\\cyrchar\\cyra /g, '\u0430'],
+  [/\\cyrchar\\cyrb /g, '\u0431'],
+  [/\\cyrchar\\cyrv /g, '\u0432'],
+  [/\\cyrchar\\cyrg /g, '\u0433'],
+  [/\\cyrchar\\cyrd /g, '\u0434'],
+  [/\\cyrchar\\cyre /g, '\u0435'],
+  [/\\cyrchar\\cyrzh /g, '\u0436'],
+  [/\\cyrchar\\cyrz /g, '\u0437'],
+  [/\\cyrchar\\cyri /g, '\u0438'],
+  [/\\cyrchar\\cyrishrt /g, '\u0439'],
+  [/\\cyrchar\\cyrk /g, '\u043A'],
+  [/\\cyrchar\\cyrl /g, '\u043B'],
+  [/\\cyrchar\\cyrm /g, '\u043C'],
+  [/\\cyrchar\\cyrn /g, '\u043D'],
+  [/\\cyrchar\\cyro /g, '\u043E'],
+  [/\\cyrchar\\cyrp /g, '\u043F'],
+  [/\\cyrchar\\cyrr /g, '\u0440'],
+  [/\\cyrchar\\cyrs /g, '\u0441'],
+  [/\\cyrchar\\cyrt /g, '\u0442'],
+  [/\\cyrchar\\cyru /g, '\u0443'],
+  [/\\cyrchar\\cyrf /g, '\u0444'],
+  [/\\cyrchar\\cyrh /g, '\u0445'],
+  [/\\cyrchar\\cyrc /g, '\u0446'],
+  [/\\cyrchar\\cyrch /g, '\u0447'],
+  [/\\cyrchar\\cyrsh /g, '\u0448'],
+  [/\\cyrchar\\cyrshch /g, '\u0449'],
+  [/\\cyrchar\\cyrhrdsn /g, '\u044A'],
+  [/\\cyrchar\\cyrery /g, '\u044B'],
+  [/\\cyrchar\\cyrsftsn /g, '\u044C'],
+  [/\\cyrchar\\cyrerev /g, '\u044D'],
+  [/\\cyrchar\\cyryu /g, '\u044E'],
+  [/\\cyrchar\\cyrya /g, '\u044F'],
+  [/\\cyrchar\\cyryo /g, '\u0451'],
+  [/\\cyrchar\\cyrdje /g, '\u0452'],
+  [/\\cyrchar\{\\'\\cyrg\}/g, '\u0453'],
+  [/\\cyrchar\\cyrie /g, '\u0454'],
+  [/\\cyrchar\\cyrdze /g, '\u0455'],
+  [/\\cyrchar\\cyrii /g, '\u0456'],
+  [/\\cyrchar\\cyryi /g, '\u0457'],
+  [/\\cyrchar\\cyrje /g, '\u0458'],
+  [/\\cyrchar\\cyrlje /g, '\u0459'],
+  [/\\cyrchar\\cyrnje /g, '\u045A'],
+  [/\\cyrchar\\cyrtshe /g, '\u045B'],
+  [/\\cyrchar\{\\'\\cyrk\}/g, '\u045C'],
+  [/\\cyrchar\\cyrushrt /g, '\u045E'],
+  [/\\cyrchar\\cyrdzhe /g, '\u045F'],
+  [/\\cyrchar\\CYROMEGA /g, '\u0460'],
+  [/\\cyrchar\\cyromega /g, '\u0461'],
+  [/\\cyrchar\\CYRYAT /g, '\u0462'],
+  [/\\cyrchar\\CYRIOTE /g, '\u0464'],
+  [/\\cyrchar\\cyriote /g, '\u0465'],
+  [/\\cyrchar\\CYRLYUS /g, '\u0466'],
+  [/\\cyrchar\\cyrlyus /g, '\u0467'],
+  [/\\cyrchar\\CYRIOTLYUS /g, '\u0468'],
+  [/\\cyrchar\\cyriotlyus /g, '\u0469'],
+  [/\\cyrchar\\CYRBYUS /g, '\u046A'],
+  [/\\cyrchar\\CYRIOTBYUS /g, '\u046C'],
+  [/\\cyrchar\\cyriotbyus /g, '\u046D'],
+  [/\\cyrchar\\CYRKSI /g, '\u046E'],
+  [/\\cyrchar\\cyrksi /g, '\u046F'],
+  [/\\cyrchar\\CYRPSI /g, '\u0470'],
+  [/\\cyrchar\\cyrpsi /g, '\u0471'],
+  [/\\cyrchar\\CYRFITA /g, '\u0472'],
+  [/\\cyrchar\\CYRIZH /g, '\u0474'],
+  [/\\cyrchar\\CYRUK /g, '\u0478'],
+  [/\\cyrchar\\cyruk /g, '\u0479'],
+  [/\\cyrchar\\CYROMEGARND /g, '\u047A'],
+  [/\\cyrchar\\cyromegarnd /g, '\u047B'],
+  [/\\cyrchar\\CYROMEGATITLO /g, '\u047C'],
+  [/\\cyrchar\\cyromegatitlo /g, '\u047D'],
+  [/\\cyrchar\\CYROT /g, '\u047E'],
+  [/\\cyrchar\\cyrot /g, '\u047F'],
+  [/\\cyrchar\\CYRKOPPA /g, '\u0480'],
+  [/\\cyrchar\\cyrkoppa /g, '\u0481'],
+  [/\\cyrchar\\cyrthousands /g, '\u0482'],
+  [/\\cyrchar\\cyrhundredthousands /g, '\u0488'],
+  [/\\cyrchar\\cyrmillions /g, '\u0489'],
+  [/\\cyrchar\\CYRSEMISFTSN /g, '\u048C'],
+  [/\\cyrchar\\cyrsemisftsn /g, '\u048D'],
+  [/\\cyrchar\\CYRRTICK /g, '\u048E'],
+  [/\\cyrchar\\cyrrtick /g, '\u048F'],
+  [/\\cyrchar\\CYRGUP /g, '\u0490'],
+  [/\\cyrchar\\cyrgup /g, '\u0491'],
+  [/\\cyrchar\\CYRGHCRS /g, '\u0492'],
+  [/\\cyrchar\\cyrghcrs /g, '\u0493'],
+  [/\\cyrchar\\CYRGHK /g, '\u0494'],
+  [/\\cyrchar\\cyrghk /g, '\u0495'],
+  [/\\cyrchar\\CYRZHDSC /g, '\u0496'],
+  [/\\cyrchar\\cyrzhdsc /g, '\u0497'],
+  [/\\cyrchar\\CYRZDSC /g, '\u0498'],
+  [/\\cyrchar\\cyrzdsc /g, '\u0499'],
+  [/\\cyrchar\\CYRKDSC /g, '\u049A'],
+  [/\\cyrchar\\cyrkdsc /g, '\u049B'],
+  [/\\cyrchar\\CYRKVCRS /g, '\u049C'],
+  [/\\cyrchar\\cyrkvcrs /g, '\u049D'],
+  [/\\cyrchar\\CYRKHCRS /g, '\u049E'],
+  [/\\cyrchar\\cyrkhcrs /g, '\u049F'],
+  [/\\cyrchar\\CYRKBEAK /g, '\u04A0'],
+  [/\\cyrchar\\cyrkbeak /g, '\u04A1'],
+  [/\\cyrchar\\CYRNDSC /g, '\u04A2'],
+  [/\\cyrchar\\cyrndsc /g, '\u04A3'],
+  [/\\cyrchar\\CYRNG /g, '\u04A4'],
+  [/\\cyrchar\\cyrng /g, '\u04A5'],
+  [/\\cyrchar\\CYRPHK /g, '\u04A6'],
+  [/\\cyrchar\\cyrphk /g, '\u04A7'],
+  [/\\cyrchar\\CYRABHHA /g, '\u04A8'],
+  [/\\cyrchar\\cyrabhha /g, '\u04A9'],
+  [/\\cyrchar\\CYRSDSC /g, '\u04AA'],
+  [/\\cyrchar\\cyrsdsc /g, '\u04AB'],
+  [/\\cyrchar\\CYRTDSC /g, '\u04AC'],
+  [/\\cyrchar\\cyrtdsc /g, '\u04AD'],
+  [/\\cyrchar\\CYRY /g, '\u04AE'],
+  [/\\cyrchar\\cyry /g, '\u04AF'],
+  [/\\cyrchar\\CYRYHCRS /g, '\u04B0'],
+  [/\\cyrchar\\cyryhcrs /g, '\u04B1'],
+  [/\\cyrchar\\CYRHDSC /g, '\u04B2'],
+  [/\\cyrchar\\cyrhdsc /g, '\u04B3'],
+  [/\\cyrchar\\CYRTETSE /g, '\u04B4'],
+  [/\\cyrchar\\cyrtetse /g, '\u04B5'],
+  [/\\cyrchar\\CYRCHRDSC /g, '\u04B6'],
+  [/\\cyrchar\\cyrchrdsc /g, '\u04B7'],
+  [/\\cyrchar\\CYRCHVCRS /g, '\u04B8'],
+  [/\\cyrchar\\cyrchvcrs /g, '\u04B9'],
+  [/\\cyrchar\\CYRSHHA /g, '\u04BA'],
+  [/\\cyrchar\\cyrshha /g, '\u04BB'],
+  [/\\cyrchar\\CYRABHCH /g, '\u04BC'],
+  [/\\cyrchar\\cyrabhch /g, '\u04BD'],
+  [/\\cyrchar\\CYRABHCHDSC /g, '\u04BE'],
+  [/\\cyrchar\\cyrabhchdsc /g, '\u04BF'],
+  [/\\cyrchar\\CYRpalochka /g, '\u04C0'],
+  [/\\cyrchar\\CYRKHK /g, '\u04C3'],
+  [/\\cyrchar\\cyrkhk /g, '\u04C4'],
+  [/\\cyrchar\\CYRNHK /g, '\u04C7'],
+  [/\\cyrchar\\cyrnhk /g, '\u04C8'],
+  [/\\cyrchar\\CYRCHLDSC /g, '\u04CB'],
+  [/\\cyrchar\\cyrchldsc /g, '\u04CC'],
+  [/\\cyrchar\\CYRAE /g, '\u04D4'],
+  [/\\cyrchar\\cyrae /g, '\u04D5'],
+  [/\\cyrchar\\CYRSCHWA /g, '\u04D8'],
+  [/\\cyrchar\\cyrschwa /g, '\u04D9'],
+  [/\\cyrchar\\CYRABHDZE /g, '\u04E0'],
+  [/\\cyrchar\\cyrabhdze /g, '\u04E1'],
+  [/\\cyrchar\\CYROTLD /g, '\u04E8'],
+  [/\\cyrchar\\cyrotld /g, '\u04E9'],
+  [/\\hspace\{0.6em\}/g, '\u2002'],
+  [/\\hspace\{1em\}/g, '\u2003'],
+  [/\\hspace\{0.33em\}/g, '\u2004'],
+  [/\\hspace\{0.25em\}/g, '\u2005'],
+  [/\\hspace\{0.166em\}/g, '\u2006'],
+  [/\\hphantom\{0\}/g, '\u2007'],
+  [/\\hphantom\{,\}/g, '\u2008'],
+  [/\\hspace\{0.167em\}/g, '\u2009'],
+  [/\\mkern1mu /g, '\u200A'],
+  [/\\textendash /g, '\u2013'],
+  [/\\textemdash /g, '\u2014'],
+  [/\\rule\{1em\}\{1pt\}/g, '\u2015'],
+  [/\\Vert /g, '\u2016'],
+  [/\\Elzreapos /g, '\u201B'],
+  [/\\textquotedblleft /g, '\u201C'],
+  [/\\textquotedblright /g, '\u201D'],
+  [/\\textdagger /g, '\u2020'],
+  [/\\textdaggerdbl /g, '\u2021'],
+  [/\\textbullet /g, '\u2022'],
+  [/\\ldots /g, '\u2026'],
+  [/\\textperthousand /g, '\u2030'],
+  [/\\textpertenthousand /g, '\u2031'],
+  [/\\backprime /g, '\u2035'],
+  [/\\guilsinglleft /g, '\u2039'],
+  [/\\guilsinglright /g, '\u203A'],
+  [/\\mkern4mu /g, '\u205F'],
+  [/\\nolinebreak /g, '\u2060'],
+  [/\\ensuremath\{\\Elzpes\}/g, '\u20A7'],
+  [/\\mbox\{\\texteuro\} /g, '\u20AC'],
+  [/\\dddot /g, '\u20DB'],
+  [/\\ddddot /g, '\u20DC'],
+  [/\\mathbb\{C\}/g, '\u2102'],
+  [/\\mathscr\{g\}/g, '\u210A'],
+  [/\\mathscr\{H\}/g, '\u210B'],
+  [/\\mathfrak\{H\}/g, '\u210C'],
+  [/\\mathbb\{H\}/g, '\u210D'],
+  [/\\hslash /g, '\u210F'],
+  [/\\mathscr\{I\}/g, '\u2110'],
+  [/\\mathfrak\{I\}/g, '\u2111'],
+  [/\\mathscr\{L\}/g, '\u2112'],
+  [/\\mathscr\{l\}/g, '\u2113'],
+  [/\\mathbb\{N\}/g, '\u2115'],
+  [/\\cyrchar\\textnumero /g, '\u2116'],
+  [/\\wp /g, '\u2118'],
+  [/\\mathbb\{P\}/g, '\u2119'],
+  [/\\mathbb\{Q\}/g, '\u211A'],
+  [/\\mathscr\{R\}/g, '\u211B'],
+  [/\\mathfrak\{R\}/g, '\u211C'],
+  [/\\mathbb\{R\}/g, '\u211D'],
+  [/\\Elzxrat /g, '\u211E'],
+  [/\\texttrademark /g, '\u2122'],
+  [/\\mathbb\{Z\}/g, '\u2124'],
+  [/\\Omega /g, '\u2126'],
+  [/\\mho /g, '\u2127'],
+  [/\\mathfrak\{Z\}/g, '\u2128'],
+  [/\\ElsevierGlyph\{2129\}/g, '\u2129'],
+  [/\\AA /g, '\u212B'],
+  [/\\mathscr\{B\}/g, '\u212C'],
+  [/\\mathfrak\{C\}/g, '\u212D'],
+  [/\\mathscr\{e\}/g, '\u212F'],
+  [/\\mathscr\{E\}/g, '\u2130'],
+  [/\\mathscr\{F\}/g, '\u2131'],
+  [/\\mathscr\{M\}/g, '\u2133'],
+  [/\\mathscr\{o\}/g, '\u2134'],
+  [/\\aleph /g, '\u2135'],
+  [/\\beth /g, '\u2136'],
+  [/\\gimel /g, '\u2137'],
+  [/\\daleth /g, '\u2138'],
+  [/\\textfrac\{1\}\{3\}/g, '\u2153'],
+  [/\\textfrac\{2\}\{3\}/g, '\u2154'],
+  [/\\textfrac\{1\}\{5\}/g, '\u2155'],
+  [/\\textfrac\{2\}\{5\}/g, '\u2156'],
+  [/\\textfrac\{3\}\{5\}/g, '\u2157'],
+  [/\\textfrac\{4\}\{5\}/g, '\u2158'],
+  [/\\textfrac\{1\}\{6\}/g, '\u2159'],
+  [/\\textfrac\{5\}\{6\}/g, '\u215A'],
+  [/\\textfrac\{1\}\{8\}/g, '\u215B'],
+  [/\\textfrac\{3\}\{8\}/g, '\u215C'],
+  [/\\textfrac\{5\}\{8\}/g, '\u215D'],
+  [/\\textfrac\{7\}\{8\}/g, '\u215E'],
+  [/\\leftarrow /g, '\u2190'],
+  [/\\uparrow /g, '\u2191'],
+  [/\\rightarrow /g, '\u2192'],
+  [/\\downarrow /g, '\u2193'],
+  [/\\leftrightarrow /g, '\u2194'],
+  [/\\updownarrow /g, '\u2195'],
+  [/\\nwarrow /g, '\u2196'],
+  [/\\nearrow /g, '\u2197'],
+  [/\\searrow /g, '\u2198'],
+  [/\\swarrow /g, '\u2199'],
+  [/\\nleftarrow /g, '\u219A'],
+  [/\\nrightarrow /g, '\u219B'],
+  [/\\arrowwaveright /g, '\u219C'],
+  [/\\arrowwaveright /g, '\u219D'],
+  [/\\twoheadleftarrow /g, '\u219E'],
+  [/\\twoheadrightarrow /g, '\u21A0'],
+  [/\\leftarrowtail /g, '\u21A2'],
+  [/\\rightarrowtail /g, '\u21A3'],
+  [/\\mapsto /g, '\u21A6'],
+  [/\\hookleftarrow /g, '\u21A9'],
+  [/\\hookrightarrow /g, '\u21AA'],
+  [/\\looparrowleft /g, '\u21AB'],
+  [/\\looparrowright /g, '\u21AC'],
+  [/\\leftrightsquigarrow /g, '\u21AD'],
+  [/\\nleftrightarrow /g, '\u21AE'],
+  [/\\Lsh /g, '\u21B0'],
+  [/\\Rsh /g, '\u21B1'],
+  [/\\ElsevierGlyph\{21B3\}/g, '\u21B3'],
+  [/\\curvearrowleft /g, '\u21B6'],
+  [/\\curvearrowright /g, '\u21B7'],
+  [/\\circlearrowleft /g, '\u21BA'],
+  [/\\circlearrowright /g, '\u21BB'],
+  [/\\leftharpoonup /g, '\u21BC'],
+  [/\\leftharpoondown /g, '\u21BD'],
+  [/\\upharpoonright /g, '\u21BE'],
+  [/\\upharpoonleft /g, '\u21BF'],
+  [/\\rightharpoonup /g, '\u21C0'],
+  [/\\rightharpoondown /g, '\u21C1'],
+  [/\\downharpoonright /g, '\u21C2'],
+  [/\\downharpoonleft /g, '\u21C3'],
+  [/\\rightleftarrows /g, '\u21C4'],
+  [/\\dblarrowupdown /g, '\u21C5'],
+  [/\\leftrightarrows /g, '\u21C6'],
+  [/\\leftleftarrows /g, '\u21C7'],
+  [/\\upuparrows /g, '\u21C8'],
+  [/\\rightrightarrows /g, '\u21C9'],
+  [/\\downdownarrows /g, '\u21CA'],
+  [/\\leftrightharpoons /g, '\u21CB'],
+  [/\\rightleftharpoons /g, '\u21CC'],
+  [/\\nLeftarrow /g, '\u21CD'],
+  [/\\nLeftrightarrow /g, '\u21CE'],
+  [/\\nRightarrow /g, '\u21CF'],
+  [/\\Leftarrow /g, '\u21D0'],
+  [/\\Uparrow /g, '\u21D1'],
+  [/\\Rightarrow /g, '\u21D2'],
+  [/\\Downarrow /g, '\u21D3'],
+  [/\\Leftrightarrow /g, '\u21D4'],
+  [/\\Updownarrow /g, '\u21D5'],
+  [/\\Lleftarrow /g, '\u21DA'],
+  [/\\Rrightarrow /g, '\u21DB'],
+  [/\\rightsquigarrow /g, '\u21DD'],
+  [/\\DownArrowUpArrow /g, '\u21F5'],
+  [/\\forall /g, '\u2200'],
+  [/\\complement /g, '\u2201'],
+  [/\\partial /g, '\u2202'],
+  [/\\exists /g, '\u2203'],
+  [/\\nexists /g, '\u2204'],
+  [/\\varnothing /g, '\u2205'],
+  [/\\nabla /g, '\u2207'],
+  [/\\in /g, '\u2208'],
+  [/\\not\\in /g, '\u2209'],
+  [/\\ni /g, '\u220B'],
+  [/\\not\\ni /g, '\u220C'],
+  [/\\prod /g, '\u220F'],
+  [/\\coprod /g, '\u2210'],
+  [/\\sum /g, '\u2211'],
+  [/\\mp /g, '\u2213'],
+  [/\\dotplus /g, '\u2214'],
+  [/\\setminus /g, '\u2216'],
+  [/\\circ /g, '\u2218'],
+  [/\\bullet /g, '\u2219'],
+  [/\\surd /g, '\u221A'],
+  [/\\propto /g, '\u221D'],
+  [/\\infty /g, '\u221E'],
+  [/\\rightangle /g, '\u221F'],
+  [/\\angle /g, '\u2220'],
+  [/\\measuredangle /g, '\u2221'],
+  [/\\sphericalangle /g, '\u2222'],
+  [/\\mid /g, '\u2223'],
+  [/\\nmid /g, '\u2224'],
+  [/\\parallel /g, '\u2225'],
+  [/\\nparallel /g, '\u2226'],
+  [/\\wedge /g, '\u2227'],
+  [/\\vee /g, '\u2228'],
+  [/\\cap /g, '\u2229'],
+  [/\\cup /g, '\u222A'],
+  [/\\int /g, '\u222B'],
+  [/\\int\\!\\int /g, '\u222C'],
+  [/\\int\\!\\int\\!\\int /g, '\u222D'],
+  [/\\oint /g, '\u222E'],
+  [/\\surfintegral /g, '\u222F'],
+  [/\\volintegral /g, '\u2230'],
+  [/\\clwintegral /g, '\u2231'],
+  [/\\ElsevierGlyph\{2232\}/g, '\u2232'],
+  [/\\ElsevierGlyph\{2233\}/g, '\u2233'],
+  [/\\therefore /g, '\u2234'],
+  [/\\because /g, '\u2235'],
+  [/\\Colon /g, '\u2237'],
+  [/\\ElsevierGlyph\{2238\}/g, '\u2238'],
+  [/\\mathbin\{\{:\}\\!\\!\{\-\}\\!\\!\{:\}\}/g, '\u223A'],
+  [/\\homothetic /g, '\u223B'],
+  [/\\sim /g, '\u223C'],
+  [/\\backsim /g, '\u223D'],
+  [/\\lazysinv /g, '\u223E'],
+  [/\\wr /g, '\u2240'],
+  [/\\not\\sim /g, '\u2241'],
+  [/\\ElsevierGlyph\{2242\}/g, '\u2242'],
+  [/\\NotEqualTilde /g, '\u2242-00338'],
+  [/\\simeq /g, '\u2243'],
+  [/\\not\\simeq /g, '\u2244'],
+  [/\\cong /g, '\u2245'],
+  [/\\approxnotequal /g, '\u2246'],
+  [/\\not\\cong /g, '\u2247'],
+  [/\\approx /g, '\u2248'],
+  [/\\not\\approx /g, '\u2249'],
+  [/\\approxeq /g, '\u224A'],
+  [/\\tildetrpl /g, '\u224B'],
+  [/\\not\\apid /g, '\u224B-00338'],
+  [/\\allequal /g, '\u224C'],
+  [/\\asymp /g, '\u224D'],
+  [/\\Bumpeq /g, '\u224E'],
+  [/\\NotHumpDownHump /g, '\u224E-00338'],
+  [/\\bumpeq /g, '\u224F'],
+  [/\\NotHumpEqual /g, '\u224F-00338'],
+  [/\\doteq /g, '\u2250'],
+  [/\\not\\doteq/g, '\u2250-00338'],
+  [/\\doteqdot /g, '\u2251'],
+  [/\\fallingdotseq /g, '\u2252'],
+  [/\\risingdotseq /g, '\u2253'],
+  [/\\eqcirc /g, '\u2256'],
+  [/\\circeq /g, '\u2257'],
+  [/\\estimates /g, '\u2259'],
+  [/\\ElsevierGlyph\{225A\}/g, '\u225A'],
+  [/\\starequal /g, '\u225B'],
+  [/\\triangleq /g, '\u225C'],
+  [/\\ElsevierGlyph\{225F\}/g, '\u225F'],
+  [/\\not =/g, '\u2260'],
+  [/\\equiv /g, '\u2261'],
+  [/\\not\\equiv /g, '\u2262'],
+  [/\\leq /g, '\u2264'],
+  [/\\geq /g, '\u2265'],
+  [/\\leqq /g, '\u2266'],
+  [/\\geqq /g, '\u2267'],
+  [/\\lneqq /g, '\u2268'],
+  [/\\lvertneqq /g, '\u2268-0FE00'],
+  [/\\gneqq /g, '\u2269'],
+  [/\\gvertneqq /g, '\u2269-0FE00'],
+  [/\\ll /g, '\u226A'],
+  [/\\NotLessLess /g, '\u226A-00338'],
+  [/\\gg /g, '\u226B'],
+  [/\\NotGreaterGreater /g, '\u226B-00338'],
+  [/\\between /g, '\u226C'],
+  [/\\not\\kern\-0.3em\\times /g, '\u226D'],
+  [/\\not</g, '\u226E'],
+  [/\\not>/g, '\u226F'],
+  [/\\not\\leq /g, '\u2270'],
+  [/\\not\\geq /g, '\u2271'],
+  [/\\lessequivlnt /g, '\u2272'],
+  [/\\greaterequivlnt /g, '\u2273'],
+  [/\\ElsevierGlyph\{2274\}/g, '\u2274'],
+  [/\\ElsevierGlyph\{2275\}/g, '\u2275'],
+  [/\\lessgtr /g, '\u2276'],
+  [/\\gtrless /g, '\u2277'],
+  [/\\notlessgreater /g, '\u2278'],
+  [/\\notgreaterless /g, '\u2279'],
+  [/\\prec /g, '\u227A'],
+  [/\\succ /g, '\u227B'],
+  [/\\preccurlyeq /g, '\u227C'],
+  [/\\succcurlyeq /g, '\u227D'],
+  [/\\precapprox /g, '\u227E'],
+  [/\\NotPrecedesTilde /g, '\u227E-00338'],
+  [/\\succapprox /g, '\u227F'],
+  [/\\NotSucceedsTilde /g, '\u227F-00338'],
+  [/\\not\\prec /g, '\u2280'],
+  [/\\not\\succ /g, '\u2281'],
+  [/\\subset /g, '\u2282'],
+  [/\\supset /g, '\u2283'],
+  [/\\not\\subset /g, '\u2284'],
+  [/\\not\\supset /g, '\u2285'],
+  [/\\subseteq /g, '\u2286'],
+  [/\\supseteq /g, '\u2287'],
+  [/\\not\\subseteq /g, '\u2288'],
+  [/\\not\\supseteq /g, '\u2289'],
+  [/\\subsetneq /g, '\u228A'],
+  [/\\varsubsetneqq /g, '\u228A-0FE00'],
+  [/\\supsetneq /g, '\u228B'],
+  [/\\varsupsetneq /g, '\u228B-0FE00'],
+  [/\\uplus /g, '\u228E'],
+  [/\\sqsubset /g, '\u228F'],
+  [/\\NotSquareSubset /g, '\u228F-00338'],
+  [/\\sqsupset /g, '\u2290'],
+  [/\\NotSquareSuperset /g, '\u2290-00338'],
+  [/\\sqsubseteq /g, '\u2291'],
+  [/\\sqsupseteq /g, '\u2292'],
+  [/\\sqcap /g, '\u2293'],
+  [/\\sqcup /g, '\u2294'],
+  [/\\oplus /g, '\u2295'],
+  [/\\ominus /g, '\u2296'],
+  [/\\otimes /g, '\u2297'],
+  [/\\oslash /g, '\u2298'],
+  [/\\odot /g, '\u2299'],
+  [/\\circledcirc /g, '\u229A'],
+  [/\\circledast /g, '\u229B'],
+  [/\\circleddash /g, '\u229D'],
+  [/\\boxplus /g, '\u229E'],
+  [/\\boxminus /g, '\u229F'],
+  [/\\boxtimes /g, '\u22A0'],
+  [/\\boxdot /g, '\u22A1'],
+  [/\\vdash /g, '\u22A2'],
+  [/\\dashv /g, '\u22A3'],
+  [/\\top /g, '\u22A4'],
+  [/\\perp /g, '\u22A5'],
+  [/\\truestate /g, '\u22A7'],
+  [/\\forcesextra /g, '\u22A8'],
+  [/\\Vdash /g, '\u22A9'],
+  [/\\Vvdash /g, '\u22AA'],
+  [/\\VDash /g, '\u22AB'],
+  [/\\nvdash /g, '\u22AC'],
+  [/\\nvDash /g, '\u22AD'],
+  [/\\nVdash /g, '\u22AE'],
+  [/\\nVDash /g, '\u22AF'],
+  [/\\vartriangleleft /g, '\u22B2'],
+  [/\\vartriangleright /g, '\u22B3'],
+  [/\\trianglelefteq /g, '\u22B4'],
+  [/\\trianglerighteq /g, '\u22B5'],
+  [/\\original /g, '\u22B6'],
+  [/\\image /g, '\u22B7'],
+  [/\\multimap /g, '\u22B8'],
+  [/\\hermitconjmatrix /g, '\u22B9'],
+  [/\\intercal /g, '\u22BA'],
+  [/\\veebar /g, '\u22BB'],
+  [/\\rightanglearc /g, '\u22BE'],
+  [/\\ElsevierGlyph\{22C0\}/g, '\u22C0'],
+  [/\\ElsevierGlyph\{22C1\}/g, '\u22C1'],
+  [/\\bigcap /g, '\u22C2'],
+  [/\\bigcup /g, '\u22C3'],
+  [/\\diamond /g, '\u22C4'],
+  [/\\cdot /g, '\u22C5'],
+  [/\\star /g, '\u22C6'],
+  [/\\divideontimes /g, '\u22C7'],
+  [/\\bowtie /g, '\u22C8'],
+  [/\\ltimes /g, '\u22C9'],
+  [/\\rtimes /g, '\u22CA'],
+  [/\\leftthreetimes /g, '\u22CB'],
+  [/\\rightthreetimes /g, '\u22CC'],
+  [/\\backsimeq /g, '\u22CD'],
+  [/\\curlyvee /g, '\u22CE'],
+  [/\\curlywedge /g, '\u22CF'],
+  [/\\Subset /g, '\u22D0'],
+  [/\\Supset /g, '\u22D1'],
+  [/\\Cap /g, '\u22D2'],
+  [/\\Cup /g, '\u22D3'],
+  [/\\pitchfork /g, '\u22D4'],
+  [/\\lessdot /g, '\u22D6'],
+  [/\\gtrdot /g, '\u22D7'],
+  [/\\verymuchless /g, '\u22D8'],
+  [/\\verymuchgreater /g, '\u22D9'],
+  [/\\lesseqgtr /g, '\u22DA'],
+  [/\\gtreqless /g, '\u22DB'],
+  [/\\curlyeqprec /g, '\u22DE'],
+  [/\\curlyeqsucc /g, '\u22DF'],
+  [/\\not\\sqsubseteq /g, '\u22E2'],
+  [/\\not\\sqsupseteq /g, '\u22E3'],
+  [/\\Elzsqspne /g, '\u22E5'],
+  [/\\lnsim /g, '\u22E6'],
+  [/\\gnsim /g, '\u22E7'],
+  [/\\precedesnotsimilar /g, '\u22E8'],
+  [/\\succnsim /g, '\u22E9'],
+  [/\\ntriangleleft /g, '\u22EA'],
+  [/\\ntriangleright /g, '\u22EB'],
+  [/\\ntrianglelefteq /g, '\u22EC'],
+  [/\\ntrianglerighteq /g, '\u22ED'],
+  [/\\vdots /g, '\u22EE'],
+  [/\\cdots /g, '\u22EF'],
+  [/\\upslopeellipsis /g, '\u22F0'],
+  [/\\downslopeellipsis /g, '\u22F1'],
+  [/\\barwedge /g, '\u2305'],
+  [/\\perspcorrespond /g, '\u2306'],
+  [/\\lceil /g, '\u2308'],
+  [/\\rceil /g, '\u2309'],
+  [/\\lfloor /g, '\u230A'],
+  [/\\rfloor /g, '\u230B'],
+  [/\\recorder /g, '\u2315'],
+  [/\\mathchar"2208/g, '\u2316'],
+  [/\\ulcorner /g, '\u231C'],
+  [/\\urcorner /g, '\u231D'],
+  [/\\llcorner /g, '\u231E'],
+  [/\\lrcorner /g, '\u231F'],
+  [/\\frown /g, '\u2322'],
+  [/\\smile /g, '\u2323'],
+  [/\\langle /g, '\u2329'],
+  [/\\rangle /g, '\u232A'],
+  [/\\ElsevierGlyph\{E838\}/g, '\u233D'],
+  [/\\Elzdlcorn /g, '\u23A3'],
+  [/\\lmoustache /g, '\u23B0'],
+  [/\\rmoustache /g, '\u23B1'],
+  [/\\textvisiblespace /g, '\u2423'],
+  [/\\ding\{172\}/g, '\u2460'],
+  [/\\ding\{173\}/g, '\u2461'],
+  [/\\ding\{174\}/g, '\u2462'],
+  [/\\ding\{175\}/g, '\u2463'],
+  [/\\ding\{176\}/g, '\u2464'],
+  [/\\ding\{177\}/g, '\u2465'],
+  [/\\ding\{178\}/g, '\u2466'],
+  [/\\ding\{179\}/g, '\u2467'],
+  [/\\ding\{180\}/g, '\u2468'],
+  [/\\ding\{181\}/g, '\u2469'],
+  [/\\circledS /g, '\u24C8'],
+  [/\\Elzdshfnc /g, '\u2506'],
+  [/\\Elzsqfnw /g, '\u2519'],
+  [/\\diagup /g, '\u2571'],
+  [/\\ding\{110\}/g, '\u25A0'],
+  [/\\square /g, '\u25A1'],
+  [/\\blacksquare /g, '\u25AA'],
+  [/\\fbox\{~~\}/g, '\u25AD'],
+  [/\\Elzvrecto /g, '\u25AF'],
+  [/\\ElsevierGlyph\{E381\}/g, '\u25B1'],
+  [/\\ding\{115\}/g, '\u25B2'],
+  [/\\bigtriangleup /g, '\u25B3'],
+  [/\\blacktriangle /g, '\u25B4'],
+  [/\\vartriangle /g, '\u25B5'],
+  [/\\blacktriangleright /g, '\u25B8'],
+  [/\\triangleright /g, '\u25B9'],
+  [/\\ding\{116\}/g, '\u25BC'],
+  [/\\bigtriangledown /g, '\u25BD'],
+  [/\\blacktriangledown /g, '\u25BE'],
+  [/\\triangledown /g, '\u25BF'],
+  [/\\blacktriangleleft /g, '\u25C2'],
+  [/\\triangleleft /g, '\u25C3'],
+  [/\\ding\{117\}/g, '\u25C6'],
+  [/\\lozenge /g, '\u25CA'],
+  [/\\bigcirc /g, '\u25CB'],
+  [/\\ding\{108\}/g, '\u25CF'],
+  [/\\Elzcirfl /g, '\u25D0'],
+  [/\\Elzcirfr /g, '\u25D1'],
+  [/\\Elzcirfb /g, '\u25D2'],
+  [/\\ding\{119\}/g, '\u25D7'],
+  [/\\Elzrvbull /g, '\u25D8'],
+  [/\\Elzsqfl /g, '\u25E7'],
+  [/\\Elzsqfr /g, '\u25E8'],
+  [/\\Elzsqfse /g, '\u25EA'],
+  [/\\bigcirc /g, '\u25EF'],
+  [/\\ding\{72\}/g, '\u2605'],
+  [/\\ding\{73\}/g, '\u2606'],
+  [/\\ding\{37\}/g, '\u260E'],
+  [/\\ding\{42\}/g, '\u261B'],
+  [/\\ding\{43\}/g, '\u261E'],
+  [/\\rightmoon /g, '\u263E'],
+  [/\\mercury /g, '\u263F'],
+  [/\\venus /g, '\u2640'],
+  [/\\male /g, '\u2642'],
+  [/\\jupiter /g, '\u2643'],
+  [/\\saturn /g, '\u2644'],
+  [/\\uranus /g, '\u2645'],
+  [/\\neptune /g, '\u2646'],
+  [/\\pluto /g, '\u2647'],
+  [/\\aries /g, '\u2648'],
+  [/\\taurus /g, '\u2649'],
+  [/\\gemini /g, '\u264A'],
+  [/\\cancer /g, '\u264B'],
+  [/\\leo /g, '\u264C'],
+  [/\\virgo /g, '\u264D'],
+  [/\\libra /g, '\u264E'],
+  [/\\scorpio /g, '\u264F'],
+  [/\\sagittarius /g, '\u2650'],
+  [/\\capricornus /g, '\u2651'],
+  [/\\aquarius /g, '\u2652'],
+  [/\\pisces /g, '\u2653'],
+  [/\\ding\{171\}/g, '\u2660'],
+  [/\\diamond /g, '\u2662'],
+  [/\\ding\{168\}/g, '\u2663'],
+  [/\\ding\{170\}/g, '\u2665'],
+  [/\\ding\{169\}/g, '\u2666'],
+  [/\\quarternote /g, '\u2669'],
+  [/\\eighthnote /g, '\u266A'],
+  [/\\flat /g, '\u266D'],
+  [/\\natural /g, '\u266E'],
+  [/\\sharp /g, '\u266F'],
+  [/\\ding\{33\}/g, '\u2701'],
+  [/\\ding\{34\}/g, '\u2702'],
+  [/\\ding\{35\}/g, '\u2703'],
+  [/\\ding\{36\}/g, '\u2704'],
+  [/\\ding\{38\}/g, '\u2706'],
+  [/\\ding\{39\}/g, '\u2707'],
+  [/\\ding\{40\}/g, '\u2708'],
+  [/\\ding\{41\}/g, '\u2709'],
+  [/\\ding\{44\}/g, '\u270C'],
+  [/\\ding\{45\}/g, '\u270D'],
+  [/\\ding\{46\}/g, '\u270E'],
+  [/\\ding\{47\}/g, '\u270F'],
+  [/\\ding\{48\}/g, '\u2710'],
+  [/\\ding\{49\}/g, '\u2711'],
+  [/\\ding\{50\}/g, '\u2712'],
+  [/\\ding\{51\}/g, '\u2713'],
+  [/\\ding\{52\}/g, '\u2714'],
+  [/\\ding\{53\}/g, '\u2715'],
+  [/\\ding\{54\}/g, '\u2716'],
+  [/\\ding\{55\}/g, '\u2717'],
+  [/\\ding\{56\}/g, '\u2718'],
+  [/\\ding\{57\}/g, '\u2719'],
+  [/\\ding\{58\}/g, '\u271A'],
+  [/\\ding\{59\}/g, '\u271B'],
+  [/\\ding\{60\}/g, '\u271C'],
+  [/\\ding\{61\}/g, '\u271D'],
+  [/\\ding\{62\}/g, '\u271E'],
+  [/\\ding\{63\}/g, '\u271F'],
+  [/\\ding\{64\}/g, '\u2720'],
+  [/\\ding\{65\}/g, '\u2721'],
+  [/\\ding\{66\}/g, '\u2722'],
+  [/\\ding\{67\}/g, '\u2723'],
+  [/\\ding\{68\}/g, '\u2724'],
+  [/\\ding\{69\}/g, '\u2725'],
+  [/\\ding\{70\}/g, '\u2726'],
+  [/\\ding\{71\}/g, '\u2727'],
+  [/\\ding\{73\}/g, '\u2729'],
+  [/\\ding\{74\}/g, '\u272A'],
+  [/\\ding\{75\}/g, '\u272B'],
+  [/\\ding\{76\}/g, '\u272C'],
+  [/\\ding\{77\}/g, '\u272D'],
+  [/\\ding\{78\}/g, '\u272E'],
+  [/\\ding\{79\}/g, '\u272F'],
+  [/\\ding\{80\}/g, '\u2730'],
+  [/\\ding\{81\}/g, '\u2731'],
+  [/\\ding\{82\}/g, '\u2732'],
+  [/\\ding\{83\}/g, '\u2733'],
+  [/\\ding\{84\}/g, '\u2734'],
+  [/\\ding\{85\}/g, '\u2735'],
+  [/\\ding\{86\}/g, '\u2736'],
+  [/\\ding\{87\}/g, '\u2737'],
+  [/\\ding\{88\}/g, '\u2738'],
+  [/\\ding\{89\}/g, '\u2739'],
+  [/\\ding\{90\}/g, '\u273A'],
+  [/\\ding\{91\}/g, '\u273B'],
+  [/\\ding\{92\}/g, '\u273C'],
+  [/\\ding\{93\}/g, '\u273D'],
+  [/\\ding\{94\}/g, '\u273E'],
+  [/\\ding\{95\}/g, '\u273F'],
+  [/\\ding\{96\}/g, '\u2740'],
+  [/\\ding\{97\}/g, '\u2741'],
+  [/\\ding\{98\}/g, '\u2742'],
+  [/\\ding\{99\}/g, '\u2743'],
+  [/\\ding\{100\}/g, '\u2744'],
+  [/\\ding\{101\}/g, '\u2745'],
+  [/\\ding\{102\}/g, '\u2746'],
+  [/\\ding\{103\}/g, '\u2747'],
+  [/\\ding\{104\}/g, '\u2748'],
+  [/\\ding\{105\}/g, '\u2749'],
+  [/\\ding\{106\}/g, '\u274A'],
+  [/\\ding\{107\}/g, '\u274B'],
+  [/\\ding\{109\}/g, '\u274D'],
+  [/\\ding\{111\}/g, '\u274F'],
+  [/\\ding\{112\}/g, '\u2750'],
+  [/\\ding\{113\}/g, '\u2751'],
+  [/\\ding\{114\}/g, '\u2752'],
+  [/\\ding\{118\}/g, '\u2756'],
+  [/\\ding\{120\}/g, '\u2758'],
+  [/\\ding\{121\}/g, '\u2759'],
+  [/\\ding\{122\}/g, '\u275A'],
+  [/\\ding\{123\}/g, '\u275B'],
+  [/\\ding\{124\}/g, '\u275C'],
+  [/\\ding\{125\}/g, '\u275D'],
+  [/\\ding\{126\}/g, '\u275E'],
+  [/\\ding\{161\}/g, '\u2761'],
+  [/\\ding\{162\}/g, '\u2762'],
+  [/\\ding\{163\}/g, '\u2763'],
+  [/\\ding\{164\}/g, '\u2764'],
+  [/\\ding\{165\}/g, '\u2765'],
+  [/\\ding\{166\}/g, '\u2766'],
+  [/\\ding\{167\}/g, '\u2767'],
+  [/\\ding\{182\}/g, '\u2776'],
+  [/\\ding\{183\}/g, '\u2777'],
+  [/\\ding\{184\}/g, '\u2778'],
+  [/\\ding\{185\}/g, '\u2779'],
+  [/\\ding\{186\}/g, '\u277A'],
+  [/\\ding\{187\}/g, '\u277B'],
+  [/\\ding\{188\}/g, '\u277C'],
+  [/\\ding\{189\}/g, '\u277D'],
+  [/\\ding\{190\}/g, '\u277E'],
+  [/\\ding\{191\}/g, '\u277F'],
+  [/\\ding\{192\}/g, '\u2780'],
+  [/\\ding\{193\}/g, '\u2781'],
+  [/\\ding\{194\}/g, '\u2782'],
+  [/\\ding\{195\}/g, '\u2783'],
+  [/\\ding\{196\}/g, '\u2784'],
+  [/\\ding\{197\}/g, '\u2785'],
+  [/\\ding\{198\}/g, '\u2786'],
+  [/\\ding\{199\}/g, '\u2787'],
+  [/\\ding\{200\}/g, '\u2788'],
+  [/\\ding\{201\}/g, '\u2789'],
+  [/\\ding\{202\}/g, '\u278A'],
+  [/\\ding\{203\}/g, '\u278B'],
+  [/\\ding\{204\}/g, '\u278C'],
+  [/\\ding\{205\}/g, '\u278D'],
+  [/\\ding\{206\}/g, '\u278E'],
+  [/\\ding\{207\}/g, '\u278F'],
+  [/\\ding\{208\}/g, '\u2790'],
+  [/\\ding\{209\}/g, '\u2791'],
+  [/\\ding\{210\}/g, '\u2792'],
+  [/\\ding\{211\}/g, '\u2793'],
+  [/\\ding\{212\}/g, '\u2794'],
+  [/\\ding\{216\}/g, '\u2798'],
+  [/\\ding\{217\}/g, '\u2799'],
+  [/\\ding\{218\}/g, '\u279A'],
+  [/\\ding\{219\}/g, '\u279B'],
+  [/\\ding\{220\}/g, '\u279C'],
+  [/\\ding\{221\}/g, '\u279D'],
+  [/\\ding\{222\}/g, '\u279E'],
+  [/\\ding\{223\}/g, '\u279F'],
+  [/\\ding\{224\}/g, '\u27A0'],
+  [/\\ding\{225\}/g, '\u27A1'],
+  [/\\ding\{226\}/g, '\u27A2'],
+  [/\\ding\{227\}/g, '\u27A3'],
+  [/\\ding\{228\}/g, '\u27A4'],
+  [/\\ding\{229\}/g, '\u27A5'],
+  [/\\ding\{230\}/g, '\u27A6'],
+  [/\\ding\{231\}/g, '\u27A7'],
+  [/\\ding\{232\}/g, '\u27A8'],
+  [/\\ding\{233\}/g, '\u27A9'],
+  [/\\ding\{234\}/g, '\u27AA'],
+  [/\\ding\{235\}/g, '\u27AB'],
+  [/\\ding\{236\}/g, '\u27AC'],
+  [/\\ding\{237\}/g, '\u27AD'],
+  [/\\ding\{238\}/g, '\u27AE'],
+  [/\\ding\{239\}/g, '\u27AF'],
+  [/\\ding\{241\}/g, '\u27B1'],
+  [/\\ding\{242\}/g, '\u27B2'],
+  [/\\ding\{243\}/g, '\u27B3'],
+  [/\\ding\{244\}/g, '\u27B4'],
+  [/\\ding\{245\}/g, '\u27B5'],
+  [/\\ding\{246\}/g, '\u27B6'],
+  [/\\ding\{247\}/g, '\u27B7'],
+  [/\\ding\{248\}/g, '\u27B8'],
+  [/\\ding\{249\}/g, '\u27B9'],
+  [/\\ding\{250\}/g, '\u27BA'],
+  [/\\ding\{251\}/g, '\u27BB'],
+  [/\\ding\{252\}/g, '\u27BC'],
+  [/\\ding\{253\}/g, '\u27BD'],
+  [/\\ding\{254\}/g, '\u27BE'],
+  [/\\longleftarrow /g, '\u27F5'],
+  [/\\longrightarrow /g, '\u27F6'],
+  [/\\longleftrightarrow /g, '\u27F7'],
+  [/\\Longleftarrow /g, '\u27F8'],
+  [/\\Longrightarrow /g, '\u27F9'],
+  [/\\Longleftrightarrow /g, '\u27FA'],
+  [/\\longmapsto /g, '\u27FC'],
+  [/\\sim\\joinrel\\leadsto/g, '\u27FF'],
+  [/\\ElsevierGlyph\{E212\}/g, '\u2905'],
+  [/\\UpArrowBar /g, '\u2912'],
+  [/\\DownArrowBar /g, '\u2913'],
+  [/\\ElsevierGlyph\{E20C\}/g, '\u2923'],
+  [/\\ElsevierGlyph\{E20D\}/g, '\u2924'],
+  [/\\ElsevierGlyph\{E20B\}/g, '\u2925'],
+  [/\\ElsevierGlyph\{E20A\}/g, '\u2926'],
+  [/\\ElsevierGlyph\{E211\}/g, '\u2927'],
+  [/\\ElsevierGlyph\{E20E\}/g, '\u2928'],
+  [/\\ElsevierGlyph\{E20F\}/g, '\u2929'],
+  [/\\ElsevierGlyph\{E210\}/g, '\u292A'],
+  [/\\ElsevierGlyph\{E21C\}/g, '\u2933'],
+  [/\\ElsevierGlyph\{E21D\}/g, '\u2933-00338'],
+  [/\\ElsevierGlyph\{E21A\}/g, '\u2936'],
+  [/\\ElsevierGlyph\{E219\}/g, '\u2937'],
+  [/\\Elolarr /g, '\u2940'],
+  [/\\Elorarr /g, '\u2941'],
+  [/\\ElzRlarr /g, '\u2942'],
+  [/\\ElzrLarr /g, '\u2944'],
+  [/\\Elzrarrx /g, '\u2947'],
+  [/\\LeftRightVector /g, '\u294E'],
+  [/\\RightUpDownVector /g, '\u294F'],
+  [/\\DownLeftRightVector /g, '\u2950'],
+  [/\\LeftUpDownVector /g, '\u2951'],
+  [/\\LeftVectorBar /g, '\u2952'],
+  [/\\RightVectorBar /g, '\u2953'],
+  [/\\RightUpVectorBar /g, '\u2954'],
+  [/\\RightDownVectorBar /g, '\u2955'],
+  [/\\DownLeftVectorBar /g, '\u2956'],
+  [/\\DownRightVectorBar /g, '\u2957'],
+  [/\\LeftUpVectorBar /g, '\u2958'],
+  [/\\LeftDownVectorBar /g, '\u2959'],
+  [/\\LeftTeeVector /g, '\u295A'],
+  [/\\RightTeeVector /g, '\u295B'],
+  [/\\RightUpTeeVector /g, '\u295C'],
+  [/\\RightDownTeeVector /g, '\u295D'],
+  [/\\DownLeftTeeVector /g, '\u295E'],
+  [/\\DownRightTeeVector /g, '\u295F'],
+  [/\\LeftUpTeeVector /g, '\u2960'],
+  [/\\LeftDownTeeVector /g, '\u2961'],
+  [/\\UpEquilibrium /g, '\u296E'],
+  [/\\ReverseUpEquilibrium /g, '\u296F'],
+  [/\\RoundImplies /g, '\u2970'],
+  [/\\ElsevierGlyph\{E214\}/g, '\u297C'],
+  [/\\ElsevierGlyph\{E215\}/g, '\u297D'],
+  [/\\Elztfnc /g, '\u2980'],
+  [/\\ElsevierGlyph\{3018\}/g, '\u2985'],
+  [/\\Elroang /g, '\u2986'],
+  [/\\ElsevierGlyph\{E291\}/g, '\u2994'],
+  [/\\Elzddfnc /g, '\u2999'],
+  [/\\Angle /g, '\u299C'],
+  [/\\Elzlpargt /g, '\u29A0'],
+  [/\\ElsevierGlyph\{E260\}/g, '\u29B5'],
+  [/\\ElsevierGlyph\{E61B\}/g, '\u29B6'],
+  [/\\ElzLap /g, '\u29CA'],
+  [/\\Elzdefas /g, '\u29CB'],
+  [/\\LeftTriangleBar /g, '\u29CF'],
+  [/\\NotLeftTriangleBar /g, '\u29CF-00338'],
+  [/\\RightTriangleBar /g, '\u29D0'],
+  [/\\NotRightTriangleBar /g, '\u29D0-00338'],
+  [/\\ElsevierGlyph\{E372\}/g, '\u29DC'],
+  [/\\blacklozenge /g, '\u29EB'],
+  [/\\RuleDelayed /g, '\u29F4'],
+  [/\\Elxuplus /g, '\u2A04'],
+  [/\\ElzThr /g, '\u2A05'],
+  [/\\Elxsqcup /g, '\u2A06'],
+  [/\\ElzInf /g, '\u2A07'],
+  [/\\ElzSup /g, '\u2A08'],
+  [/\\ElzCint /g, '\u2A0D'],
+  [/\\clockoint /g, '\u2A0F'],
+  [/\\ElsevierGlyph\{E395\}/g, '\u2A10'],
+  [/\\sqrint /g, '\u2A16'],
+  [/\\ElsevierGlyph\{E25A\}/g, '\u2A25'],
+  [/\\ElsevierGlyph\{E25B\}/g, '\u2A2A'],
+  [/\\ElsevierGlyph\{E25C\}/g, '\u2A2D'],
+  [/\\ElsevierGlyph\{E25D\}/g, '\u2A2E'],
+  [/\\ElzTimes /g, '\u2A2F'],
+  [/\\ElsevierGlyph\{E25E\}/g, '\u2A34'],
+  [/\\ElsevierGlyph\{E25E\}/g, '\u2A35'],
+  [/\\ElsevierGlyph\{E259\}/g, '\u2A3C'],
+  [/\\amalg /g, '\u2A3F'],
+  [/\\ElzAnd /g, '\u2A53'],
+  [/\\ElzOr /g, '\u2A54'],
+  [/\\ElsevierGlyph\{E36E\}/g, '\u2A55'],
+  [/\\ElOr /g, '\u2A56'],
+  [/\\perspcorrespond /g, '\u2A5E'],
+  [/\\Elzminhat /g, '\u2A5F'],
+  [/\\ElsevierGlyph\{225A\}/g, '\u2A63'],
+  [/\\stackrel\{*\}\{=\}/g, '\u2A6E'],
+  [/\\Equal /g, '\u2A75'],
+  [/\\leqslant /g, '\u2A7D'],
+  [/\\nleqslant /g, '\u2A7D-00338'],
+  [/\\geqslant /g, '\u2A7E'],
+  [/\\ngeqslant /g, '\u2A7E-00338'],
+  [/\\lessapprox /g, '\u2A85'],
+  [/\\gtrapprox /g, '\u2A86'],
+  [/\\lneq /g, '\u2A87'],
+  [/\\gneq /g, '\u2A88'],
+  [/\\lnapprox /g, '\u2A89'],
+  [/\\gnapprox /g, '\u2A8A'],
+  [/\\lesseqqgtr /g, '\u2A8B'],
+  [/\\gtreqqless /g, '\u2A8C'],
+  [/\\eqslantless /g, '\u2A95'],
+  [/\\eqslantgtr /g, '\u2A96'],
+  [/\\Pisymbol\{ppi020\}\{117\}/g, '\u2A9D'],
+  [/\\Pisymbol\{ppi020\}\{105\}/g, '\u2A9E'],
+  [/\\NestedLessLess /g, '\u2AA1'],
+  [/\\NotNestedLessLess /g, '\u2AA1-00338'],
+  [/\\NestedGreaterGreater /g, '\u2AA2'],
+  [/\\NotNestedGreaterGreater /g, '\u2AA2-00338'],
+  [/\\preceq /g, '\u2AAF'],
+  [/\\not\\preceq /g, '\u2AAF-00338'],
+  [/\\succeq /g, '\u2AB0'],
+  [/\\not\\succeq /g, '\u2AB0-00338'],
+  [/\\precneqq /g, '\u2AB5'],
+  [/\\succneqq /g, '\u2AB6'],
+  [/\\precapprox /g, '\u2AB7'],
+  [/\\succapprox /g, '\u2AB8'],
+  [/\\precnapprox /g, '\u2AB9'],
+  [/\\succnapprox /g, '\u2ABA'],
+  [/\\subseteqq /g, '\u2AC5'],
+  [/\\nsubseteqq /g, '\u2AC5-00338'],
+  [/\\supseteqq /g, '\u2AC6'],
+  [/\\nsupseteqq/g, '\u2AC6-00338'],
+  [/\\subsetneqq /g, '\u2ACB'],
+  [/\\supsetneqq /g, '\u2ACC'],
+  [/\\ElsevierGlyph\{E30D\}/g, '\u2AEB'],
+  [/\\Elztdcol /g, '\u2AF6'],
+  [/\\ElsevierGlyph\{300A\}/g, '\u300A'],
+  [/\\ElsevierGlyph\{300B\}/g, '\u300B'],
+  [/\\ElsevierGlyph\{3018\}/g, '\u3018'],
+  [/\\ElsevierGlyph\{3019\}/g, '\u3019'],
+  [/\\openbracketleft /g, '\u301A'],
+  [/\\openbracketright /g, '\u301B'],
+]
+
+if (typeof module !== 'undefined' && module.exports) {
+  module.exports = BibtexParser
+}

+ 12 - 1
services/web/frontend/js/shared/context/editor-context.js

@@ -36,6 +36,7 @@ EditorContext.Provider.propTypes = {
     showGalileo: PropTypes.bool,
     toggleGalileo: PropTypes.func,
     insertGalileoAutocomplete: PropTypes.func,
+    insertGalileoCiteAutocomplete: PropTypes.func,
     isProjectOwner: PropTypes.bool,
     isRestrictedTokenMember: PropTypes.bool,
     permissionsLevel: PropTypes.oneOf(['readOnly', 'readAndWrite', 'owner']),
@@ -145,7 +146,15 @@ export function EditorProvider({ children, settings }) {
   const insertGalileoAutocomplete = useCallback(text => {
     window.dispatchEvent(
       new CustomEvent('editor:insert-galileo-completion', {
-        detail: text,
+        detail: { text, cite: false },
+      })
+    )
+  }, [])
+
+  const insertGalileoCiteAutocomplete = useCallback(text => {
+    window.dispatchEvent(
+      new CustomEvent('editor:insert-galileo-completion', {
+        detail: { text, cite: true },
       })
     )
   }, [])
@@ -165,6 +174,7 @@ export function EditorProvider({ children, settings }) {
       showGalileo,
       toggleGalileo,
       insertGalileoAutocomplete,
+      insertGalileoCiteAutocomplete,
     }),
     [
       cobranding,
@@ -179,6 +189,7 @@ export function EditorProvider({ children, settings }) {
       showGalileo,
       toggleGalileo,
       insertGalileoAutocomplete,
+      insertGalileoCiteAutocomplete,
     ]
   )
 

+ 9 - 5
services/web/frontend/stylesheets/modules/galileo.less

@@ -39,7 +39,7 @@
     padding: 5px;
     overflow-y: auto;
 
-    .galileo-items {
+    .galileo-suggestions {
       h2 {
         font-size: 120%;
         font-weight: normal;
@@ -48,16 +48,20 @@
         color: inherit;
       }
 
-      .galileo-item {
+      .galileo-suggestion-body {
+        background-color: @content-alt-bg-color;
+        color: black;
         display: flex;
         align-items: flex-start;
         gap: 5px;
+        padding: 5px;
         margin-bottom: 5px;
 
-        .galileo-item-text {
+        :first-child {
           flex: 1;
-          background-color: white;
-          color: black;
+        }
+
+        .galileo-suggestion-text {
           white-space: break-spaces;
         }
       }