bib2json.js 61 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966
  1. /* eslint-disable */
  2. /**
  3. * Parser.js
  4. * Copyright 2012-13 Mayank Lahiri
  5. * mlahiri@gmail.com
  6. * Released under the BSD License.
  7. *
  8. * Modifications 2016 Sharelatex
  9. * Modifications 2017-2020 Overleaf
  10. *
  11. * A forgiving Bibtex parser that can:
  12. *
  13. * (1) operate in streaming or block mode, extracting entries as dictionaries.
  14. * (2) convert Latex special characters to UTF-8.
  15. * (3) best-effort parse malformed entries.
  16. * (4) run in a CommonJS environment or a browser, without any dependencies.
  17. * (5) be advanced-compiled by Google Closure Compiler.
  18. *
  19. * Handwritten as a labor of love, not auto-generated from a grammar.
  20. *
  21. * Modes of usage:
  22. *
  23. * (1) Synchronous, string
  24. *
  25. * var entries = BibtexParser(text);
  26. * console.log(entries);
  27. *
  28. * (2) Asynchronous, stream
  29. *
  30. * function entryCallback(entry) { console.log(entry); }
  31. * var parser = new BibtexParser(entryCallback);
  32. * parser.parse(chunk1);
  33. * parser.parse(chunk2);
  34. * ...
  35. *
  36. * @param {text|function(Object)} arg0 Either a Bibtex string or callback
  37. * function for processing parsed entries.
  38. * @param {array} allowedKeys optimization: do not output key/value pairs that are not on this allowlist
  39. * @constructor
  40. */
  41. function BibtexParser(arg0, allowedKeys) {
  42. // Determine how this function is to be used
  43. if (typeof arg0 === 'string') {
  44. // Passed a string, synchronous call without 'new'
  45. const entries = []
  46. function accumulator(entry) {
  47. entries.push(entry)
  48. }
  49. const parser = new BibtexParser(accumulator, allowedKeys)
  50. parser.parse(arg0)
  51. return {
  52. entries,
  53. errors: parser.getErrors(),
  54. }
  55. }
  56. if (typeof arg0 !== 'function') {
  57. throw 'Invalid parser construction.'
  58. }
  59. this.ALLOWEDKEYS_ = allowedKeys || []
  60. this.reset_(arg0)
  61. this.initMacros_()
  62. return this
  63. }
  64. /** @enum {number} */
  65. BibtexParser.prototype.STATES_ = {
  66. ENTRY_OR_JUNK: 0,
  67. OBJECT_TYPE: 1,
  68. ENTRY_KEY: 2,
  69. KV_KEY: 3,
  70. EQUALS: 4,
  71. KV_VALUE: 5,
  72. }
  73. BibtexParser.prototype.reset_ = function (arg0) {
  74. /** @private */ this.DATA_ = {}
  75. /** @private */ this.CALLBACK_ = arg0
  76. /** @private */ this.CHAR_ = 0
  77. /** @private */ this.LINE_ = 1
  78. /** @private */ this.CHAR_IN_LINE_ = 0
  79. /** @private */ this.SKIPWS_ = true
  80. /** @private */ this.SKIPCOMMENT_ = true
  81. /** @private */ this.SKIPKVPAIR_ = false
  82. /** @private */ this.PARSETMP_ = {}
  83. /** @private */ this.SKIPTILLEOL_ = false
  84. /** @private */ this.VALBRACES_ = null
  85. /** @private */ this.BRACETYPE_ = null
  86. /** @private */ this.BRACECOUNT_ = 0
  87. /** @private */ this.STATE_ = this.STATES_.ENTRY_OR_JUNK
  88. /** @private */ this.ERRORS_ = []
  89. }
  90. /** @private */ BibtexParser.prototype.ENTRY_TYPES_ = {
  91. inproceedings: 1,
  92. proceedings: 2,
  93. article: 3,
  94. techreport: 4,
  95. misc: 5,
  96. mastersthesis: 6,
  97. book: 7,
  98. phdthesis: 8,
  99. incollection: 9,
  100. unpublished: 10,
  101. inbook: 11,
  102. manual: 12,
  103. periodical: 13,
  104. booklet: 14,
  105. masterthesis: 15,
  106. conference: 16,
  107. /* additional fields from biblatex */
  108. artwork: 17,
  109. audio: 18,
  110. bibnote: 19,
  111. bookinbook: 20,
  112. collection: 21,
  113. commentary: 22,
  114. customa: 23,
  115. customb: 24,
  116. customc: 25,
  117. customd: 26,
  118. custome: 27,
  119. customf: 28,
  120. image: 29,
  121. inreference: 30,
  122. jurisdiction: 31,
  123. legal: 32,
  124. legislation: 33,
  125. letter: 34,
  126. movie: 35,
  127. music: 36,
  128. mvbook: 37,
  129. mvcollection: 38,
  130. mvproceedings: 39,
  131. mvreference: 40,
  132. online: 41,
  133. patent: 42,
  134. performance: 43,
  135. reference: 44,
  136. report: 45,
  137. review: 46,
  138. set: 47,
  139. software: 48,
  140. standard: 49,
  141. suppbook: 50,
  142. suppcollection: 51,
  143. thesis: 52,
  144. video: 53,
  145. }
  146. BibtexParser.prototype.initMacros_ = function () {
  147. // macros can be extended by the user via
  148. // @string { macroName = "macroValue" }
  149. /** @private */ this.MACROS_ = {
  150. jan: 'January',
  151. feb: 'February',
  152. mar: 'March',
  153. apr: 'April',
  154. may: 'May',
  155. jun: 'June',
  156. jul: 'July',
  157. aug: 'August',
  158. sep: 'September',
  159. oct: 'October',
  160. nov: 'November',
  161. dec: 'December',
  162. Jan: 'January',
  163. Feb: 'February',
  164. Mar: 'March',
  165. Apr: 'April',
  166. May: 'May',
  167. Jun: 'June',
  168. Jul: 'July',
  169. Aug: 'August',
  170. Sep: 'September',
  171. Oct: 'October',
  172. Nov: 'November',
  173. Dec: 'December',
  174. }
  175. }
  176. /**
  177. * Gets an array of all errors encountered during parsing.
  178. * Array entries are of the format:
  179. * [ line number, character in line, character in stream, error text ]
  180. *
  181. * @returns Array<Array>
  182. * @public
  183. */
  184. BibtexParser.prototype.getErrors = function () {
  185. return this.ERRORS_
  186. }
  187. /**
  188. * Processes a chunk of data
  189. * @public
  190. */
  191. BibtexParser.prototype.parse = function (chunk) {
  192. for (let i = 0; i < chunk.length; i++) this.processCharacter_(chunk[i])
  193. }
  194. /**
  195. * Logs error at current stream position.
  196. *
  197. * @private
  198. */
  199. BibtexParser.prototype.error_ = function (text) {
  200. this.ERRORS_.push([this.LINE_, this.CHAR_IN_LINE_, this.CHAR_, text])
  201. }
  202. /**
  203. * Called after an entire entry has been parsed from the stream.
  204. * Performs post-processing and invokes the entry callback pointed to by
  205. * this.CALLBACK_. Parsed (but unprocessed) entry data is in this.DATA_.
  206. */
  207. BibtexParser.prototype.processEntry_ = function () {
  208. const data = this.DATA_
  209. if (data.Fields)
  210. for (const f in data.Fields) {
  211. let raw = data.Fields[f]
  212. // Convert Latex/Bibtex special characters to UTF-8 equivalents
  213. for (let i = 0; i < this.CHARCONV_.length; i++) {
  214. const re = this.CHARCONV_[i][0]
  215. const rep = this.CHARCONV_[i][1]
  216. raw = raw.replace(re, rep)
  217. }
  218. // Basic substitutions
  219. raw = raw
  220. .replace(/[\n\r\t]/g, ' ')
  221. .replace(/\s\s+/g, ' ')
  222. .replace(/^\s+|\s+$/g, '')
  223. // Remove braces and backslashes
  224. const len = raw.length
  225. let processedArr = []
  226. for (let i = 0; i < len; i++) {
  227. let c = raw[i]
  228. let skip = false
  229. if (c == '\\' && i < len - 1) c = raw[++i]
  230. else {
  231. if (c == '{' || c == '}') skip = true
  232. }
  233. if (!skip) processedArr.push(c)
  234. }
  235. data.Fields[f] = processedArr.join('')
  236. processedArr = null
  237. }
  238. if (data.ObjectType == 'string') {
  239. for (const f in data.Fields) {
  240. this.MACROS_[f] = data.Fields[f]
  241. }
  242. } else {
  243. // Parsed a new Bibtex entry
  244. this.CALLBACK_(data)
  245. }
  246. }
  247. /**
  248. * Processes next character in the stream, invoking the callback after
  249. * each entry has been found and processed.
  250. *
  251. * @private
  252. * @param {string} c Next character in input stream
  253. */
  254. BibtexParser.prototype.processCharacter_ = function (c) {
  255. // Housekeeping
  256. this.CHAR_++
  257. this.CHAR_IN_LINE_++
  258. if (c == '\n') {
  259. this.LINE_++
  260. this.CHAR_IN_LINE_ = 1
  261. }
  262. // Convenience states for skipping whitespace when needed
  263. if (this.SKIPTILLEOL_) {
  264. if (c == '\n') this.SKIPTILLEOL_ = false
  265. return
  266. }
  267. if (this.SKIPCOMMENT_ && c == '%') {
  268. this.SKIPTILLEOL_ = true
  269. return
  270. }
  271. if (this.SKIPWS_ && /\s/.test(c)) return
  272. this.SKIPWS_ = false
  273. this.SKIPCOMMENT_ = false
  274. this.SKIPTILLEOL_ = false
  275. // Main state machine
  276. let AnotherIteration = true
  277. while (AnotherIteration) {
  278. // console.log(this.LINE_, this.CHAR_IN_LINE_, this.STATE_, c)
  279. AnotherIteration = false
  280. switch (this.STATE_) {
  281. // -- Scan for an object marker ('@')
  282. // -- Reset temporary data structure in case previous entry was garbled
  283. case this.STATES_.ENTRY_OR_JUNK:
  284. if (c == '@') {
  285. // SUCCESS: Parsed a valid start-of-object marker.
  286. // NEXT_STATE: OBJECT_TYPE
  287. this.STATE_ = this.STATES_.OBJECT_TYPE
  288. this.DATA_ = {
  289. ObjectType: '',
  290. }
  291. }
  292. this.BRACETYPE_ = null
  293. this.SKIPWS_ = true
  294. this.SKIPCOMMENT_ = true
  295. break
  296. // Start at first non-whitespace character after start-of-object '@'
  297. // -- Accept [A-Za-z], break on non-matching character
  298. // -- Populate this.DATA_.EntryType and this.DATA_.ObjectType
  299. case this.STATES_.OBJECT_TYPE:
  300. if (/[A-Za-z]/.test(c)) {
  301. this.DATA_.ObjectType += c.toLowerCase()
  302. this.SKIPWS_ = true
  303. this.SKIPCOMMENT_ = true
  304. } else {
  305. // Break from state and validate object type
  306. const ot = this.DATA_.ObjectType
  307. if (ot == 'comment') {
  308. this.STATE_ = this.STATES_.ENTRY_OR_JUNK
  309. } else {
  310. if (ot == 'string') {
  311. this.DATA_.ObjectType = ot
  312. this.DATA_.Fields = {}
  313. this.BRACETYPE_ = c
  314. this.BRACECOUNT_ = 1
  315. this.STATE_ = this.STATES_.KV_KEY
  316. this.SKIPWS_ = true
  317. this.SKIPCOMMENT_ = true
  318. this.PARSETMP_ = {
  319. Key: '',
  320. }
  321. } else {
  322. if (ot == 'preamble') {
  323. this.STATE_ = this.STATES_.ENTRY_OR_JUNK
  324. } else {
  325. if (ot in this.ENTRY_TYPES_) {
  326. // SUCCESS: Parsed a valid object type.
  327. // NEXT_STATE: ENTRY_KEY
  328. this.DATA_.ObjectType = 'entry'
  329. this.DATA_.EntryType = ot
  330. this.DATA_.EntryKey = ''
  331. this.STATE_ = this.STATES_.ENTRY_KEY
  332. AnotherIteration = true
  333. } else {
  334. // ERROR: Unrecognized object type.
  335. // NEXT_STATE: ENTRY_OR_JUNK
  336. this.error_(
  337. 'Unrecognized object type: "' + this.DATA_.ObjectType + '"'
  338. )
  339. this.STATE_ = this.STATES_.ENTRY_OR_JUNK
  340. }
  341. }
  342. }
  343. }
  344. }
  345. break
  346. // Start at first non-alphabetic character after an entry type
  347. // -- Populate this.DATA_.EntryKey
  348. case this.STATES_.ENTRY_KEY:
  349. if ((c === '{' || c === '(') && this.BRACETYPE_ == null) {
  350. this.BRACETYPE_ = c
  351. this.BRACECOUNT_ = 1
  352. this.SKIPWS_ = true
  353. this.SKIPCOMMENT_ = true
  354. break
  355. }
  356. if (/[,%\s]/.test(c)) {
  357. if (this.DATA_.EntryKey.length < 1) {
  358. // Skip comments and whitespace before entry key
  359. this.SKIPWS_ = true
  360. this.SKIPCOMMENT_ = true
  361. } else {
  362. if (this.BRACETYPE_ == null) {
  363. // ERROR: No opening brace for object
  364. // NEXT_STATE: ENTRY_OR_JUNK
  365. this.error_('No opening brace for object.')
  366. this.STATE_ = this.STATES_.ENTRY_OR_JUNK
  367. } else {
  368. // SUCCESS: Parsed an entry key
  369. // NEXT_STATE: KV_KEY
  370. this.SKIPWS_ = true
  371. this.SKIPCOMMENT_ = true
  372. AnotherIteration = true
  373. this.STATE_ = this.STATES_.KV_KEY
  374. this.PARSETMP_.Key = ''
  375. this.DATA_.Fields = {}
  376. }
  377. }
  378. } else {
  379. this.DATA_.EntryKey += c
  380. this.SKIPWS_ = false
  381. this.SKIPCOMMENT_ = false
  382. }
  383. break
  384. // Start at first non-whitespace/comment character after entry key.
  385. // -- Populate this.PARSETMP_.Key
  386. case this.STATES_.KV_KEY:
  387. // Test for end of entry
  388. if (
  389. (c == '}' && this.BRACETYPE_ == '{') ||
  390. (c == ')' && this.BRACETYPE_ == '(')
  391. ) {
  392. // SUCCESS: Parsed an entry, possible incomplete
  393. // NEXT_STATE: ENTRY_OR_JUNK
  394. this.processEntry_()
  395. this.SKIPWS_ = true
  396. this.SKIPCOMMENT_ = true
  397. this.STATE_ = this.STATES_.ENTRY_OR_JUNK
  398. break
  399. }
  400. if (/[\-A-Za-z:]/.test(c)) {
  401. // Add to key
  402. this.PARSETMP_.Key += c
  403. this.SKIPWS_ = false
  404. this.SKIPCOMMENT_ = false
  405. } else {
  406. // Either end of key or we haven't encountered start of key
  407. if (this.PARSETMP_.Key.length < 1) {
  408. // Keep going till we see a key
  409. this.SKIPWS_ = true
  410. this.SKIPCOMMENT_ = true
  411. } else {
  412. // SUCCESS: Found full key in K/V pair
  413. // NEXT_STATE: EQUALS
  414. this.SKIPWS_ = true
  415. this.SKIPCOMMENT_ = true
  416. this.STATE_ = this.STATES_.EQUALS
  417. AnotherIteration = true
  418. if (this.DATA_.ObjectType !== 'string') {
  419. // this entry is not a macro
  420. // normalize the key to lower case
  421. this.PARSETMP_.Key = this.PARSETMP_.Key.toLowerCase()
  422. // optimization: skip key/value pairs that are not on the allowlist
  423. this.SKIPKVPAIR_ =
  424. // has allowedKeys set
  425. this.ALLOWEDKEYS_.length &&
  426. // key is not on the allowlist
  427. this.ALLOWEDKEYS_.indexOf(this.PARSETMP_.Key) === -1
  428. } else {
  429. this.SKIPKVPAIR_ = false
  430. }
  431. }
  432. }
  433. break
  434. // Start at first non-alphabetic character after K/V pair key.
  435. case this.STATES_.EQUALS:
  436. if (
  437. (c == '}' && this.BRACETYPE_ == '{') ||
  438. (c == ')' && this.BRACETYPE_ == '(')
  439. ) {
  440. // ERROR: K/V pair with key but no value
  441. // NEXT_STATE: ENTRY_OR_JUNK
  442. this.error_(
  443. 'Key-value pair has key "' + this.PARSETMP_.Key + '", but no value.'
  444. )
  445. this.processEntry_()
  446. this.SKIPWS_ = true
  447. this.SKIPCOMMENT_ = true
  448. this.STATE_ = this.STATES_.ENTRY_OR_JUNK
  449. break
  450. }
  451. if (c == '=') {
  452. // SUCCESS: found an equal signs separating key and value
  453. // NEXT_STATE: KV_VALUE
  454. this.SKIPWS_ = true
  455. this.SKIPCOMMENT_ = true
  456. this.STATE_ = this.STATES_.KV_VALUE
  457. this.PARSETMP_.Value = []
  458. this.VALBRACES_ = { '"': [], '{': [] }
  459. }
  460. break
  461. // Start at first non-whitespace/comment character after '='
  462. // -- Populate this.PARSETMP_.Value
  463. case this.STATES_.KV_VALUE:
  464. const delim = this.VALBRACES_
  465. // valueCharsArray is the list of characters that make up the
  466. // current value
  467. const valueCharsArray = this.PARSETMP_.Value
  468. let doneParsingValue = false
  469. // Test for special characters
  470. if (c == '"' || c == '{' || c == '}' || c == ',') {
  471. if (c == ',') {
  472. // This comma can mean:
  473. // (1) just another comma literal
  474. // (2) end of a macro reference
  475. if (delim['"'].length + delim['{'].length === 0) {
  476. // end of a macro reference
  477. const macro = this.PARSETMP_.Value.join('').trim()
  478. if (macro in this.MACROS_) {
  479. // Successful macro reference
  480. this.PARSETMP_.Value = [this.MACROS_[macro]]
  481. } else {
  482. // Reference to an undefined macro
  483. this.error_('Reference to an undefined macro: ' + macro)
  484. }
  485. doneParsingValue = true
  486. }
  487. }
  488. if (c == '"') {
  489. // This quote can mean:
  490. // (1) opening delimiter
  491. // (2) closing delimiter
  492. // (3) literal, if we have a '{' on the stack
  493. if (delim['"'].length + delim['{'].length === 0) {
  494. // opening delimiter
  495. delim['"'].push(this.CHAR_)
  496. this.SKIPWS_ = false
  497. this.SKIPCOMMENT_ = false
  498. break
  499. }
  500. if (
  501. delim['"'].length == 1 &&
  502. delim['{'].length == 0 &&
  503. (valueCharsArray.length == 0 ||
  504. valueCharsArray[valueCharsArray.length - 1] != '\\')
  505. ) {
  506. // closing delimiter
  507. doneParsingValue = true
  508. } else {
  509. // literal, add to value
  510. }
  511. }
  512. if (c == '{') {
  513. // This brace can mean:
  514. // (1) opening delimiter
  515. // (2) stacked verbatim delimiter
  516. if (
  517. valueCharsArray.length == 0 ||
  518. valueCharsArray[valueCharsArray.length - 1] != '\\'
  519. ) {
  520. delim['{'].push(this.CHAR_)
  521. this.SKIPWS_ = false
  522. this.SKIPCOMMENT_ = false
  523. } else {
  524. // literal, add to value
  525. }
  526. }
  527. if (c == '}') {
  528. // This brace can mean:
  529. // (1) closing delimiter
  530. // (2) closing stacked verbatim delimiter
  531. // (3) end of object definition if value was a macro
  532. if (delim['"'].length + delim['{'].length === 0) {
  533. // end of object definition, after macro
  534. const macro = this.PARSETMP_.Value.join('').trim()
  535. if (macro in this.MACROS_) {
  536. // Successful macro reference
  537. this.PARSETMP_.Value = [this.MACROS_[macro]]
  538. } else {
  539. // Reference to an undefined macro
  540. this.error_('Reference to an undefined macro: ' + macro)
  541. }
  542. AnotherIteration = true
  543. doneParsingValue = true
  544. } else {
  545. // sometimes imported bibs will have {\},{\\}, {\\\}, {\\\\}, etc for whitespace,
  546. // which would otherwise break the parsing. we watch for these occurences of
  547. // 1+ backslashes in an empty bracket pair to gracefully handle the malformed bib file
  548. const doubleSlash =
  549. valueCharsArray.length >= 2 &&
  550. valueCharsArray[valueCharsArray.length - 1] === '\\' && // for \\}
  551. valueCharsArray[valueCharsArray.length - 2] === '\\'
  552. const singleSlash =
  553. valueCharsArray.length >= 2 &&
  554. valueCharsArray[valueCharsArray.length - 1] === '\\' && // for {\}
  555. valueCharsArray[valueCharsArray.length - 2] === '{'
  556. if (
  557. valueCharsArray.length == 0 ||
  558. valueCharsArray[valueCharsArray.length - 1] != '\\' || // for }
  559. doubleSlash ||
  560. singleSlash
  561. ) {
  562. if (delim['{'].length > 0) {
  563. // pop stack for stacked verbatim delimiter
  564. delim['{'].splice(delim['{'].length - 1, 1)
  565. if (delim['{'].length + delim['"'].length == 0) {
  566. // closing delimiter
  567. doneParsingValue = true
  568. } else {
  569. // end verbatim block
  570. }
  571. }
  572. } else {
  573. // literal, add to value
  574. }
  575. }
  576. }
  577. }
  578. // If here, then we are either done parsing the value or
  579. // have a literal that should be added to the value.
  580. if (doneParsingValue) {
  581. // SUCCESS: value parsed
  582. // NEXT_STATE: KV_KEY
  583. this.SKIPWS_ = true
  584. this.SKIPCOMMENT_ = true
  585. this.STATE_ = this.STATES_.KV_KEY
  586. if (!this.SKIPKVPAIR_) {
  587. this.DATA_.Fields[this.PARSETMP_.Key] =
  588. this.PARSETMP_.Value.join('')
  589. }
  590. this.PARSETMP_ = { Key: '' }
  591. this.VALBRACES_ = null
  592. } else {
  593. this.PARSETMP_.Value.push(c)
  594. if (this.PARSETMP_.Value.length >= 1000 * 20) {
  595. this.PARSETMP_.Value = []
  596. this.STATE_ = this.STATES_.ENTRY_OR_JUNK
  597. this.DATA_ = { ObjectType: '' }
  598. this.BRACETYPE_ = null
  599. this.SKIPWS_ = true
  600. this.SKIPCOMMENT_ = true
  601. }
  602. }
  603. break
  604. } // end switch (this.STATE_)
  605. } // end while(AnotherIteration)
  606. } // end function processCharacter
  607. /** @private */ BibtexParser.prototype.CHARCONV_ = [
  608. [/\\space /g, '\u0020'],
  609. [/\\textdollar /g, '\u0024'],
  610. [/\\textquotesingle /g, '\u0027'],
  611. [/\\ast /g, '\u002A'],
  612. [/\\textbackslash /g, '\u005C'],
  613. [/\\\^\{\}/g, '\u005E'],
  614. [/\\textasciigrave /g, '\u0060'],
  615. [/\\lbrace /g, '\u007B'],
  616. [/\\vert /g, '\u007C'],
  617. [/\\rbrace /g, '\u007D'],
  618. [/\\textasciitilde /g, '\u007E'],
  619. [/\\textexclamdown /g, '\u00A1'],
  620. [/\\textcent /g, '\u00A2'],
  621. [/\\textsterling /g, '\u00A3'],
  622. [/\\textcurrency /g, '\u00A4'],
  623. [/\\textyen /g, '\u00A5'],
  624. [/\\textbrokenbar /g, '\u00A6'],
  625. [/\\textsection /g, '\u00A7'],
  626. [/\\textasciidieresis /g, '\u00A8'],
  627. [/\\textcopyright /g, '\u00A9'],
  628. [/\\textordfeminine /g, '\u00AA'],
  629. [/\\guillemotleft /g, '\u00AB'],
  630. [/\\lnot /g, '\u00AC'],
  631. [/\\textregistered /g, '\u00AE'],
  632. [/\\textasciimacron /g, '\u00AF'],
  633. [/\\textdegree /g, '\u00B0'],
  634. [/\\pm /g, '\u00B1'],
  635. [/\\textasciiacute /g, '\u00B4'],
  636. [/\\mathrm\{\\mu\}/g, '\u00B5'],
  637. [/\\textparagraph /g, '\u00B6'],
  638. [/\\cdot /g, '\u00B7'],
  639. [/\\c\{\}/g, '\u00B8'],
  640. [/\\textordmasculine /g, '\u00BA'],
  641. [/\\guillemotright /g, '\u00BB'],
  642. [/\\textonequarter /g, '\u00BC'],
  643. [/\\textonehalf /g, '\u00BD'],
  644. [/\\textthreequarters /g, '\u00BE'],
  645. [/\\textquestiondown /g, '\u00BF'],
  646. [/\\`\{A\}/g, '\u00C0'],
  647. [/\\'\{A\}/g, '\u00C1'],
  648. [/\\\^\{A\}/g, '\u00C2'],
  649. [/\\~\{A\}/g, '\u00C3'],
  650. [/\\"\{A\}/g, '\u00C4'],
  651. [/\\AA /g, '\u00C5'],
  652. [/\\AE /g, '\u00C6'],
  653. [/\\c\{C\}/g, '\u00C7'],
  654. [/\\`\{E\}/g, '\u00C8'],
  655. [/\\'\{E\}/g, '\u00C9'],
  656. [/\\\^\{E\}/g, '\u00CA'],
  657. [/\\"\{E\}/g, '\u00CB'],
  658. [/\\`\{I\}/g, '\u00CC'],
  659. [/\\'\{I\}/g, '\u00CD'],
  660. [/\\\^\{I\}/g, '\u00CE'],
  661. [/\\"\{I\}/g, '\u00CF'],
  662. [/\\DH /g, '\u00D0'],
  663. [/\\~\{N\}/g, '\u00D1'],
  664. [/\\`\{O\}/g, '\u00D2'],
  665. [/\\'\{O\}/g, '\u00D3'],
  666. [/\\\^\{O\}/g, '\u00D4'],
  667. [/\\~\{O\}/g, '\u00D5'],
  668. [/\\"\{O\}/g, '\u00D6'],
  669. [/\\texttimes /g, '\u00D7'],
  670. [/\\O /g, '\u00D8'],
  671. [/\\`\{U\}/g, '\u00D9'],
  672. [/\\'\{U\}/g, '\u00DA'],
  673. [/\\\^\{U\}/g, '\u00DB'],
  674. [/\\"\{U\}/g, '\u00DC'],
  675. [/\\'\{Y\}/g, '\u00DD'],
  676. [/\\TH /g, '\u00DE'],
  677. [/\\ss /g, '\u00DF'],
  678. [/\\`\{a\}/g, '\u00E0'],
  679. [/\\'\{a\}/g, '\u00E1'],
  680. [/\\\^\{a\}/g, '\u00E2'],
  681. [/\\~\{a\}/g, '\u00E3'],
  682. [/\\"\{a\}/g, '\u00E4'],
  683. [/\\aa /g, '\u00E5'],
  684. [/\\ae /g, '\u00E6'],
  685. [/\\c\{c\}/g, '\u00E7'],
  686. [/\\`\{e\}/g, '\u00E8'],
  687. [/\\'\{e\}/g, '\u00E9'],
  688. [/\\\^\{e\}/g, '\u00EA'],
  689. [/\\"\{e\}/g, '\u00EB'],
  690. [/\\`\{\\i\}/g, '\u00EC'],
  691. [/\\'\{\\i\}/g, '\u00ED'],
  692. [/\\\^\{\\i\}/g, '\u00EE'],
  693. [/\\"\{\\i\}/g, '\u00EF'],
  694. [/\\dh /g, '\u00F0'],
  695. [/\\~\{n\}/g, '\u00F1'],
  696. [/\\`\{o\}/g, '\u00F2'],
  697. [/\\'\{o\}/g, '\u00F3'],
  698. [/\\\^\{o\}/g, '\u00F4'],
  699. [/\\~\{o\}/g, '\u00F5'],
  700. [/\\"\{o\}/g, '\u00F6'],
  701. [/\\div /g, '\u00F7'],
  702. [/\\o /g, '\u00F8'],
  703. [/\\`\{u\}/g, '\u00F9'],
  704. [/\\'\{u\}/g, '\u00FA'],
  705. [/\\\^\{u\}/g, '\u00FB'],
  706. [/\\"\{u\}/g, '\u00FC'],
  707. [/\\'\{y\}/g, '\u00FD'],
  708. [/\\th /g, '\u00FE'],
  709. [/\\"\{y\}/g, '\u00FF'],
  710. [/\\=\{A\}/g, '\u0100'],
  711. [/\\=\{a\}/g, '\u0101'],
  712. [/\\u\{A\}/g, '\u0102'],
  713. [/\\u\{a\}/g, '\u0103'],
  714. [/\\k\{A\}/g, '\u0104'],
  715. [/\\k\{a\}/g, '\u0105'],
  716. [/\\'\{C\}/g, '\u0106'],
  717. [/\\'\{c\}/g, '\u0107'],
  718. [/\\\^\{C\}/g, '\u0108'],
  719. [/\\\^\{c\}/g, '\u0109'],
  720. [/\\.\{C\}/g, '\u010A'],
  721. [/\\.\{c\}/g, '\u010B'],
  722. [/\\v\{C\}/g, '\u010C'],
  723. [/\\v\{c\}/g, '\u010D'],
  724. [/\\v\{D\}/g, '\u010E'],
  725. [/\\v\{d\}/g, '\u010F'],
  726. [/\\DJ /g, '\u0110'],
  727. [/\\dj /g, '\u0111'],
  728. [/\\=\{E\}/g, '\u0112'],
  729. [/\\=\{e\}/g, '\u0113'],
  730. [/\\u\{E\}/g, '\u0114'],
  731. [/\\u\{e\}/g, '\u0115'],
  732. [/\\.\{E\}/g, '\u0116'],
  733. [/\\.\{e\}/g, '\u0117'],
  734. [/\\k\{E\}/g, '\u0118'],
  735. [/\\k\{e\}/g, '\u0119'],
  736. [/\\v\{E\}/g, '\u011A'],
  737. [/\\v\{e\}/g, '\u011B'],
  738. [/\\\^\{G\}/g, '\u011C'],
  739. [/\\\^\{g\}/g, '\u011D'],
  740. [/\\u\{G\}/g, '\u011E'],
  741. [/\\u\{g\}/g, '\u011F'],
  742. [/\\.\{G\}/g, '\u0120'],
  743. [/\\.\{g\}/g, '\u0121'],
  744. [/\\c\{G\}/g, '\u0122'],
  745. [/\\c\{g\}/g, '\u0123'],
  746. [/\\\^\{H\}/g, '\u0124'],
  747. [/\\\^\{h\}/g, '\u0125'],
  748. [/\\Elzxh /g, '\u0127'],
  749. [/\\~\{I\}/g, '\u0128'],
  750. [/\\~\{\\i\}/g, '\u0129'],
  751. [/\\=\{I\}/g, '\u012A'],
  752. [/\\=\{\\i\}/g, '\u012B'],
  753. [/\\u\{I\}/g, '\u012C'],
  754. [/\\u\{\\i\}/g, '\u012D'],
  755. [/\\k\{I\}/g, '\u012E'],
  756. [/\\k\{i\}/g, '\u012F'],
  757. [/\\.\{I\}/g, '\u0130'],
  758. [/\\i /g, '\u0131'],
  759. [/\\\^\{J\}/g, '\u0134'],
  760. [/\\\^\{\\j\}/g, '\u0135'],
  761. [/\\c\{K\}/g, '\u0136'],
  762. [/\\c\{k\}/g, '\u0137'],
  763. [/\\'\{L\}/g, '\u0139'],
  764. [/\\'\{l\}/g, '\u013A'],
  765. [/\\c\{L\}/g, '\u013B'],
  766. [/\\c\{l\}/g, '\u013C'],
  767. [/\\v\{L\}/g, '\u013D'],
  768. [/\\v\{l\}/g, '\u013E'],
  769. [/\\L /g, '\u0141'],
  770. [/\\l /g, '\u0142'],
  771. [/\\'\{N\}/g, '\u0143'],
  772. [/\\'\{n\}/g, '\u0144'],
  773. [/\\c\{N\}/g, '\u0145'],
  774. [/\\c\{n\}/g, '\u0146'],
  775. [/\\v\{N\}/g, '\u0147'],
  776. [/\\v\{n\}/g, '\u0148'],
  777. [/\\NG /g, '\u014A'],
  778. [/\\ng /g, '\u014B'],
  779. [/\\=\{O\}/g, '\u014C'],
  780. [/\\=\{o\}/g, '\u014D'],
  781. [/\\u\{O\}/g, '\u014E'],
  782. [/\\u\{o\}/g, '\u014F'],
  783. [/\\H\{O\}/g, '\u0150'],
  784. [/\\H\{o\}/g, '\u0151'],
  785. [/\\OE /g, '\u0152'],
  786. [/\\oe /g, '\u0153'],
  787. [/\\'\{R\}/g, '\u0154'],
  788. [/\\'\{r\}/g, '\u0155'],
  789. [/\\c\{R\}/g, '\u0156'],
  790. [/\\c\{r\}/g, '\u0157'],
  791. [/\\v\{R\}/g, '\u0158'],
  792. [/\\v\{r\}/g, '\u0159'],
  793. [/\\'\{S\}/g, '\u015A'],
  794. [/\\'\{s\}/g, '\u015B'],
  795. [/\\\^\{S\}/g, '\u015C'],
  796. [/\\\^\{s\}/g, '\u015D'],
  797. [/\\c\{S\}/g, '\u015E'],
  798. [/\\c\{s\}/g, '\u015F'],
  799. [/\\v\{S\}/g, '\u0160'],
  800. [/\\v\{s\}/g, '\u0161'],
  801. [/\\c\{T\}/g, '\u0162'],
  802. [/\\c\{t\}/g, '\u0163'],
  803. [/\\v\{T\}/g, '\u0164'],
  804. [/\\v\{t\}/g, '\u0165'],
  805. [/\\~\{U\}/g, '\u0168'],
  806. [/\\~\{u\}/g, '\u0169'],
  807. [/\\=\{U\}/g, '\u016A'],
  808. [/\\=\{u\}/g, '\u016B'],
  809. [/\\u\{U\}/g, '\u016C'],
  810. [/\\u\{u\}/g, '\u016D'],
  811. [/\\r\{U\}/g, '\u016E'],
  812. [/\\r\{u\}/g, '\u016F'],
  813. [/\\H\{U\}/g, '\u0170'],
  814. [/\\H\{u\}/g, '\u0171'],
  815. [/\\k\{U\}/g, '\u0172'],
  816. [/\\k\{u\}/g, '\u0173'],
  817. [/\\\^\{W\}/g, '\u0174'],
  818. [/\\\^\{w\}/g, '\u0175'],
  819. [/\\\^\{Y\}/g, '\u0176'],
  820. [/\\\^\{y\}/g, '\u0177'],
  821. [/\\"\{Y\}/g, '\u0178'],
  822. [/\\'\{Z\}/g, '\u0179'],
  823. [/\\'\{z\}/g, '\u017A'],
  824. [/\\.\{Z\}/g, '\u017B'],
  825. [/\\.\{z\}/g, '\u017C'],
  826. [/\\v\{Z\}/g, '\u017D'],
  827. [/\\v\{z\}/g, '\u017E'],
  828. [/\\texthvlig /g, '\u0195'],
  829. [/\\textnrleg /g, '\u019E'],
  830. [/\\eth /g, '\u01AA'],
  831. [/\\textdoublepipe /g, '\u01C2'],
  832. [/\\'\{g\}/g, '\u01F5'],
  833. [/\\Elztrna /g, '\u0250'],
  834. [/\\Elztrnsa /g, '\u0252'],
  835. [/\\Elzopeno /g, '\u0254'],
  836. [/\\Elzrtld /g, '\u0256'],
  837. [/\\Elzschwa /g, '\u0259'],
  838. [/\\varepsilon /g, '\u025B'],
  839. [/\\Elzpgamma /g, '\u0263'],
  840. [/\\Elzpbgam /g, '\u0264'],
  841. [/\\Elztrnh /g, '\u0265'],
  842. [/\\Elzbtdl /g, '\u026C'],
  843. [/\\Elzrtll /g, '\u026D'],
  844. [/\\Elztrnm /g, '\u026F'],
  845. [/\\Elztrnmlr /g, '\u0270'],
  846. [/\\Elzltlmr /g, '\u0271'],
  847. [/\\Elzltln /g, '\u0272'],
  848. [/\\Elzrtln /g, '\u0273'],
  849. [/\\Elzclomeg /g, '\u0277'],
  850. [/\\textphi /g, '\u0278'],
  851. [/\\Elztrnr /g, '\u0279'],
  852. [/\\Elztrnrl /g, '\u027A'],
  853. [/\\Elzrttrnr /g, '\u027B'],
  854. [/\\Elzrl /g, '\u027C'],
  855. [/\\Elzrtlr /g, '\u027D'],
  856. [/\\Elzfhr /g, '\u027E'],
  857. [/\\Elzrtls /g, '\u0282'],
  858. [/\\Elzesh /g, '\u0283'],
  859. [/\\Elztrnt /g, '\u0287'],
  860. [/\\Elzrtlt /g, '\u0288'],
  861. [/\\Elzpupsil /g, '\u028A'],
  862. [/\\Elzpscrv /g, '\u028B'],
  863. [/\\Elzinvv /g, '\u028C'],
  864. [/\\Elzinvw /g, '\u028D'],
  865. [/\\Elztrny /g, '\u028E'],
  866. [/\\Elzrtlz /g, '\u0290'],
  867. [/\\Elzyogh /g, '\u0292'],
  868. [/\\Elzglst /g, '\u0294'],
  869. [/\\Elzreglst /g, '\u0295'],
  870. [/\\Elzinglst /g, '\u0296'],
  871. [/\\textturnk /g, '\u029E'],
  872. [/\\Elzdyogh /g, '\u02A4'],
  873. [/\\Elztesh /g, '\u02A7'],
  874. [/\\textasciicaron /g, '\u02C7'],
  875. [/\\Elzverts /g, '\u02C8'],
  876. [/\\Elzverti /g, '\u02CC'],
  877. [/\\Elzlmrk /g, '\u02D0'],
  878. [/\\Elzhlmrk /g, '\u02D1'],
  879. [/\\Elzsbrhr /g, '\u02D2'],
  880. [/\\Elzsblhr /g, '\u02D3'],
  881. [/\\Elzrais /g, '\u02D4'],
  882. [/\\Elzlow /g, '\u02D5'],
  883. [/\\textasciibreve /g, '\u02D8'],
  884. [/\\textperiodcentered /g, '\u02D9'],
  885. [/\\r\{\}/g, '\u02DA'],
  886. [/\\k\{\}/g, '\u02DB'],
  887. [/\\texttildelow /g, '\u02DC'],
  888. [/\\H\{\}/g, '\u02DD'],
  889. [/\\tone\{55\}/g, '\u02E5'],
  890. [/\\tone\{44\}/g, '\u02E6'],
  891. [/\\tone\{33\}/g, '\u02E7'],
  892. [/\\tone\{22\}/g, '\u02E8'],
  893. [/\\tone\{11\}/g, '\u02E9'],
  894. [/\\cyrchar\\C/g, '\u030F'],
  895. [/\\Elzpalh /g, '\u0321'],
  896. [/\\Elzrh /g, '\u0322'],
  897. [/\\Elzsbbrg /g, '\u032A'],
  898. [/\\Elzxl /g, '\u0335'],
  899. [/\\Elzbar /g, '\u0336'],
  900. [/\\'\{A\}/g, '\u0386'],
  901. [/\\'\{E\}/g, '\u0388'],
  902. [/\\'\{H\}/g, '\u0389'],
  903. [/\\'\{\}\{I\}/g, '\u038A'],
  904. [/\\'\{\}O/g, '\u038C'],
  905. [/\\mathrm\{'Y\}/g, '\u038E'],
  906. [/\\mathrm\{'\\Omega\}/g, '\u038F'],
  907. [/\\acute\{\\ddot\{\\iota\}\}/g, '\u0390'],
  908. [/\\Alpha /g, '\u0391'],
  909. [/\\Beta /g, '\u0392'],
  910. [/\\Gamma /g, '\u0393'],
  911. [/\\Delta /g, '\u0394'],
  912. [/\\Epsilon /g, '\u0395'],
  913. [/\\Zeta /g, '\u0396'],
  914. [/\\Eta /g, '\u0397'],
  915. [/\\Theta /g, '\u0398'],
  916. [/\\Iota /g, '\u0399'],
  917. [/\\Kappa /g, '\u039A'],
  918. [/\\Lambda /g, '\u039B'],
  919. [/\\Xi /g, '\u039E'],
  920. [/\\Pi /g, '\u03A0'],
  921. [/\\Rho /g, '\u03A1'],
  922. [/\\Sigma /g, '\u03A3'],
  923. [/\\Tau /g, '\u03A4'],
  924. [/\\Upsilon /g, '\u03A5'],
  925. [/\\Phi /g, '\u03A6'],
  926. [/\\Chi /g, '\u03A7'],
  927. [/\\Psi /g, '\u03A8'],
  928. [/\\Omega /g, '\u03A9'],
  929. [/\\mathrm\{\\ddot\{I\}\}/g, '\u03AA'],
  930. [/\\mathrm\{\\ddot\{Y\}\}/g, '\u03AB'],
  931. [/\\'\{\$\\alpha\$\}/g, '\u03AC'],
  932. [/\\acute\{\\epsilon\}/g, '\u03AD'],
  933. [/\\acute\{\\eta\}/g, '\u03AE'],
  934. [/\\acute\{\\iota\}/g, '\u03AF'],
  935. [/\\acute\{\\ddot\{\\upsilon\}\}/g, '\u03B0'],
  936. [/\\alpha /g, '\u03B1'],
  937. [/\\beta /g, '\u03B2'],
  938. [/\\gamma /g, '\u03B3'],
  939. [/\\delta /g, '\u03B4'],
  940. [/\\epsilon /g, '\u03B5'],
  941. [/\\zeta /g, '\u03B6'],
  942. [/\\eta /g, '\u03B7'],
  943. [/\\texttheta /g, '\u03B8'],
  944. [/\\iota /g, '\u03B9'],
  945. [/\\kappa /g, '\u03BA'],
  946. [/\\lambda /g, '\u03BB'],
  947. [/\\mu /g, '\u03BC'],
  948. [/\\nu /g, '\u03BD'],
  949. [/\\xi /g, '\u03BE'],
  950. [/\\pi /g, '\u03C0'],
  951. [/\\rho /g, '\u03C1'],
  952. [/\\varsigma /g, '\u03C2'],
  953. [/\\sigma /g, '\u03C3'],
  954. [/\\tau /g, '\u03C4'],
  955. [/\\upsilon /g, '\u03C5'],
  956. [/\\varphi /g, '\u03C6'],
  957. [/\\chi /g, '\u03C7'],
  958. [/\\psi /g, '\u03C8'],
  959. [/\\omega /g, '\u03C9'],
  960. [/\\ddot\{\\iota\}/g, '\u03CA'],
  961. [/\\ddot\{\\upsilon\}/g, '\u03CB'],
  962. [/\\'\{o\}/g, '\u03CC'],
  963. [/\\acute\{\\upsilon\}/g, '\u03CD'],
  964. [/\\acute\{\\omega\}/g, '\u03CE'],
  965. [/\\Pisymbol\{ppi022\}\{87\}/g, '\u03D0'],
  966. [/\\textvartheta /g, '\u03D1'],
  967. [/\\Upsilon /g, '\u03D2'],
  968. [/\\phi /g, '\u03D5'],
  969. [/\\varpi /g, '\u03D6'],
  970. [/\\Stigma /g, '\u03DA'],
  971. [/\\Digamma /g, '\u03DC'],
  972. [/\\digamma /g, '\u03DD'],
  973. [/\\Koppa /g, '\u03DE'],
  974. [/\\Sampi /g, '\u03E0'],
  975. [/\\varkappa /g, '\u03F0'],
  976. [/\\varrho /g, '\u03F1'],
  977. [/\\textTheta /g, '\u03F4'],
  978. [/\\backepsilon /g, '\u03F6'],
  979. [/\\cyrchar\\CYRYO /g, '\u0401'],
  980. [/\\cyrchar\\CYRDJE /g, '\u0402'],
  981. [/\\cyrchar\{\\'\\CYRG\}/g, '\u0403'],
  982. [/\\cyrchar\\CYRIE /g, '\u0404'],
  983. [/\\cyrchar\\CYRDZE /g, '\u0405'],
  984. [/\\cyrchar\\CYRII /g, '\u0406'],
  985. [/\\cyrchar\\CYRYI /g, '\u0407'],
  986. [/\\cyrchar\\CYRJE /g, '\u0408'],
  987. [/\\cyrchar\\CYRLJE /g, '\u0409'],
  988. [/\\cyrchar\\CYRNJE /g, '\u040A'],
  989. [/\\cyrchar\\CYRTSHE /g, '\u040B'],
  990. [/\\cyrchar\{\\'\\CYRK\}/g, '\u040C'],
  991. [/\\cyrchar\\CYRUSHRT /g, '\u040E'],
  992. [/\\cyrchar\\CYRDZHE /g, '\u040F'],
  993. [/\\cyrchar\\CYRA /g, '\u0410'],
  994. [/\\cyrchar\\CYRB /g, '\u0411'],
  995. [/\\cyrchar\\CYRV /g, '\u0412'],
  996. [/\\cyrchar\\CYRG /g, '\u0413'],
  997. [/\\cyrchar\\CYRD /g, '\u0414'],
  998. [/\\cyrchar\\CYRE /g, '\u0415'],
  999. [/\\cyrchar\\CYRZH /g, '\u0416'],
  1000. [/\\cyrchar\\CYRZ /g, '\u0417'],
  1001. [/\\cyrchar\\CYRI /g, '\u0418'],
  1002. [/\\cyrchar\\CYRISHRT /g, '\u0419'],
  1003. [/\\cyrchar\\CYRK /g, '\u041A'],
  1004. [/\\cyrchar\\CYRL /g, '\u041B'],
  1005. [/\\cyrchar\\CYRM /g, '\u041C'],
  1006. [/\\cyrchar\\CYRN /g, '\u041D'],
  1007. [/\\cyrchar\\CYRO /g, '\u041E'],
  1008. [/\\cyrchar\\CYRP /g, '\u041F'],
  1009. [/\\cyrchar\\CYRR /g, '\u0420'],
  1010. [/\\cyrchar\\CYRS /g, '\u0421'],
  1011. [/\\cyrchar\\CYRT /g, '\u0422'],
  1012. [/\\cyrchar\\CYRU /g, '\u0423'],
  1013. [/\\cyrchar\\CYRF /g, '\u0424'],
  1014. [/\\cyrchar\\CYRH /g, '\u0425'],
  1015. [/\\cyrchar\\CYRC /g, '\u0426'],
  1016. [/\\cyrchar\\CYRCH /g, '\u0427'],
  1017. [/\\cyrchar\\CYRSH /g, '\u0428'],
  1018. [/\\cyrchar\\CYRSHCH /g, '\u0429'],
  1019. [/\\cyrchar\\CYRHRDSN /g, '\u042A'],
  1020. [/\\cyrchar\\CYRERY /g, '\u042B'],
  1021. [/\\cyrchar\\CYRSFTSN /g, '\u042C'],
  1022. [/\\cyrchar\\CYREREV /g, '\u042D'],
  1023. [/\\cyrchar\\CYRYU /g, '\u042E'],
  1024. [/\\cyrchar\\CYRYA /g, '\u042F'],
  1025. [/\\cyrchar\\cyra /g, '\u0430'],
  1026. [/\\cyrchar\\cyrb /g, '\u0431'],
  1027. [/\\cyrchar\\cyrv /g, '\u0432'],
  1028. [/\\cyrchar\\cyrg /g, '\u0433'],
  1029. [/\\cyrchar\\cyrd /g, '\u0434'],
  1030. [/\\cyrchar\\cyre /g, '\u0435'],
  1031. [/\\cyrchar\\cyrzh /g, '\u0436'],
  1032. [/\\cyrchar\\cyrz /g, '\u0437'],
  1033. [/\\cyrchar\\cyri /g, '\u0438'],
  1034. [/\\cyrchar\\cyrishrt /g, '\u0439'],
  1035. [/\\cyrchar\\cyrk /g, '\u043A'],
  1036. [/\\cyrchar\\cyrl /g, '\u043B'],
  1037. [/\\cyrchar\\cyrm /g, '\u043C'],
  1038. [/\\cyrchar\\cyrn /g, '\u043D'],
  1039. [/\\cyrchar\\cyro /g, '\u043E'],
  1040. [/\\cyrchar\\cyrp /g, '\u043F'],
  1041. [/\\cyrchar\\cyrr /g, '\u0440'],
  1042. [/\\cyrchar\\cyrs /g, '\u0441'],
  1043. [/\\cyrchar\\cyrt /g, '\u0442'],
  1044. [/\\cyrchar\\cyru /g, '\u0443'],
  1045. [/\\cyrchar\\cyrf /g, '\u0444'],
  1046. [/\\cyrchar\\cyrh /g, '\u0445'],
  1047. [/\\cyrchar\\cyrc /g, '\u0446'],
  1048. [/\\cyrchar\\cyrch /g, '\u0447'],
  1049. [/\\cyrchar\\cyrsh /g, '\u0448'],
  1050. [/\\cyrchar\\cyrshch /g, '\u0449'],
  1051. [/\\cyrchar\\cyrhrdsn /g, '\u044A'],
  1052. [/\\cyrchar\\cyrery /g, '\u044B'],
  1053. [/\\cyrchar\\cyrsftsn /g, '\u044C'],
  1054. [/\\cyrchar\\cyrerev /g, '\u044D'],
  1055. [/\\cyrchar\\cyryu /g, '\u044E'],
  1056. [/\\cyrchar\\cyrya /g, '\u044F'],
  1057. [/\\cyrchar\\cyryo /g, '\u0451'],
  1058. [/\\cyrchar\\cyrdje /g, '\u0452'],
  1059. [/\\cyrchar\{\\'\\cyrg\}/g, '\u0453'],
  1060. [/\\cyrchar\\cyrie /g, '\u0454'],
  1061. [/\\cyrchar\\cyrdze /g, '\u0455'],
  1062. [/\\cyrchar\\cyrii /g, '\u0456'],
  1063. [/\\cyrchar\\cyryi /g, '\u0457'],
  1064. [/\\cyrchar\\cyrje /g, '\u0458'],
  1065. [/\\cyrchar\\cyrlje /g, '\u0459'],
  1066. [/\\cyrchar\\cyrnje /g, '\u045A'],
  1067. [/\\cyrchar\\cyrtshe /g, '\u045B'],
  1068. [/\\cyrchar\{\\'\\cyrk\}/g, '\u045C'],
  1069. [/\\cyrchar\\cyrushrt /g, '\u045E'],
  1070. [/\\cyrchar\\cyrdzhe /g, '\u045F'],
  1071. [/\\cyrchar\\CYROMEGA /g, '\u0460'],
  1072. [/\\cyrchar\\cyromega /g, '\u0461'],
  1073. [/\\cyrchar\\CYRYAT /g, '\u0462'],
  1074. [/\\cyrchar\\CYRIOTE /g, '\u0464'],
  1075. [/\\cyrchar\\cyriote /g, '\u0465'],
  1076. [/\\cyrchar\\CYRLYUS /g, '\u0466'],
  1077. [/\\cyrchar\\cyrlyus /g, '\u0467'],
  1078. [/\\cyrchar\\CYRIOTLYUS /g, '\u0468'],
  1079. [/\\cyrchar\\cyriotlyus /g, '\u0469'],
  1080. [/\\cyrchar\\CYRBYUS /g, '\u046A'],
  1081. [/\\cyrchar\\CYRIOTBYUS /g, '\u046C'],
  1082. [/\\cyrchar\\cyriotbyus /g, '\u046D'],
  1083. [/\\cyrchar\\CYRKSI /g, '\u046E'],
  1084. [/\\cyrchar\\cyrksi /g, '\u046F'],
  1085. [/\\cyrchar\\CYRPSI /g, '\u0470'],
  1086. [/\\cyrchar\\cyrpsi /g, '\u0471'],
  1087. [/\\cyrchar\\CYRFITA /g, '\u0472'],
  1088. [/\\cyrchar\\CYRIZH /g, '\u0474'],
  1089. [/\\cyrchar\\CYRUK /g, '\u0478'],
  1090. [/\\cyrchar\\cyruk /g, '\u0479'],
  1091. [/\\cyrchar\\CYROMEGARND /g, '\u047A'],
  1092. [/\\cyrchar\\cyromegarnd /g, '\u047B'],
  1093. [/\\cyrchar\\CYROMEGATITLO /g, '\u047C'],
  1094. [/\\cyrchar\\cyromegatitlo /g, '\u047D'],
  1095. [/\\cyrchar\\CYROT /g, '\u047E'],
  1096. [/\\cyrchar\\cyrot /g, '\u047F'],
  1097. [/\\cyrchar\\CYRKOPPA /g, '\u0480'],
  1098. [/\\cyrchar\\cyrkoppa /g, '\u0481'],
  1099. [/\\cyrchar\\cyrthousands /g, '\u0482'],
  1100. [/\\cyrchar\\cyrhundredthousands /g, '\u0488'],
  1101. [/\\cyrchar\\cyrmillions /g, '\u0489'],
  1102. [/\\cyrchar\\CYRSEMISFTSN /g, '\u048C'],
  1103. [/\\cyrchar\\cyrsemisftsn /g, '\u048D'],
  1104. [/\\cyrchar\\CYRRTICK /g, '\u048E'],
  1105. [/\\cyrchar\\cyrrtick /g, '\u048F'],
  1106. [/\\cyrchar\\CYRGUP /g, '\u0490'],
  1107. [/\\cyrchar\\cyrgup /g, '\u0491'],
  1108. [/\\cyrchar\\CYRGHCRS /g, '\u0492'],
  1109. [/\\cyrchar\\cyrghcrs /g, '\u0493'],
  1110. [/\\cyrchar\\CYRGHK /g, '\u0494'],
  1111. [/\\cyrchar\\cyrghk /g, '\u0495'],
  1112. [/\\cyrchar\\CYRZHDSC /g, '\u0496'],
  1113. [/\\cyrchar\\cyrzhdsc /g, '\u0497'],
  1114. [/\\cyrchar\\CYRZDSC /g, '\u0498'],
  1115. [/\\cyrchar\\cyrzdsc /g, '\u0499'],
  1116. [/\\cyrchar\\CYRKDSC /g, '\u049A'],
  1117. [/\\cyrchar\\cyrkdsc /g, '\u049B'],
  1118. [/\\cyrchar\\CYRKVCRS /g, '\u049C'],
  1119. [/\\cyrchar\\cyrkvcrs /g, '\u049D'],
  1120. [/\\cyrchar\\CYRKHCRS /g, '\u049E'],
  1121. [/\\cyrchar\\cyrkhcrs /g, '\u049F'],
  1122. [/\\cyrchar\\CYRKBEAK /g, '\u04A0'],
  1123. [/\\cyrchar\\cyrkbeak /g, '\u04A1'],
  1124. [/\\cyrchar\\CYRNDSC /g, '\u04A2'],
  1125. [/\\cyrchar\\cyrndsc /g, '\u04A3'],
  1126. [/\\cyrchar\\CYRNG /g, '\u04A4'],
  1127. [/\\cyrchar\\cyrng /g, '\u04A5'],
  1128. [/\\cyrchar\\CYRPHK /g, '\u04A6'],
  1129. [/\\cyrchar\\cyrphk /g, '\u04A7'],
  1130. [/\\cyrchar\\CYRABHHA /g, '\u04A8'],
  1131. [/\\cyrchar\\cyrabhha /g, '\u04A9'],
  1132. [/\\cyrchar\\CYRSDSC /g, '\u04AA'],
  1133. [/\\cyrchar\\cyrsdsc /g, '\u04AB'],
  1134. [/\\cyrchar\\CYRTDSC /g, '\u04AC'],
  1135. [/\\cyrchar\\cyrtdsc /g, '\u04AD'],
  1136. [/\\cyrchar\\CYRY /g, '\u04AE'],
  1137. [/\\cyrchar\\cyry /g, '\u04AF'],
  1138. [/\\cyrchar\\CYRYHCRS /g, '\u04B0'],
  1139. [/\\cyrchar\\cyryhcrs /g, '\u04B1'],
  1140. [/\\cyrchar\\CYRHDSC /g, '\u04B2'],
  1141. [/\\cyrchar\\cyrhdsc /g, '\u04B3'],
  1142. [/\\cyrchar\\CYRTETSE /g, '\u04B4'],
  1143. [/\\cyrchar\\cyrtetse /g, '\u04B5'],
  1144. [/\\cyrchar\\CYRCHRDSC /g, '\u04B6'],
  1145. [/\\cyrchar\\cyrchrdsc /g, '\u04B7'],
  1146. [/\\cyrchar\\CYRCHVCRS /g, '\u04B8'],
  1147. [/\\cyrchar\\cyrchvcrs /g, '\u04B9'],
  1148. [/\\cyrchar\\CYRSHHA /g, '\u04BA'],
  1149. [/\\cyrchar\\cyrshha /g, '\u04BB'],
  1150. [/\\cyrchar\\CYRABHCH /g, '\u04BC'],
  1151. [/\\cyrchar\\cyrabhch /g, '\u04BD'],
  1152. [/\\cyrchar\\CYRABHCHDSC /g, '\u04BE'],
  1153. [/\\cyrchar\\cyrabhchdsc /g, '\u04BF'],
  1154. [/\\cyrchar\\CYRpalochka /g, '\u04C0'],
  1155. [/\\cyrchar\\CYRKHK /g, '\u04C3'],
  1156. [/\\cyrchar\\cyrkhk /g, '\u04C4'],
  1157. [/\\cyrchar\\CYRNHK /g, '\u04C7'],
  1158. [/\\cyrchar\\cyrnhk /g, '\u04C8'],
  1159. [/\\cyrchar\\CYRCHLDSC /g, '\u04CB'],
  1160. [/\\cyrchar\\cyrchldsc /g, '\u04CC'],
  1161. [/\\cyrchar\\CYRAE /g, '\u04D4'],
  1162. [/\\cyrchar\\cyrae /g, '\u04D5'],
  1163. [/\\cyrchar\\CYRSCHWA /g, '\u04D8'],
  1164. [/\\cyrchar\\cyrschwa /g, '\u04D9'],
  1165. [/\\cyrchar\\CYRABHDZE /g, '\u04E0'],
  1166. [/\\cyrchar\\cyrabhdze /g, '\u04E1'],
  1167. [/\\cyrchar\\CYROTLD /g, '\u04E8'],
  1168. [/\\cyrchar\\cyrotld /g, '\u04E9'],
  1169. [/\\hspace\{0.6em\}/g, '\u2002'],
  1170. [/\\hspace\{1em\}/g, '\u2003'],
  1171. [/\\hspace\{0.33em\}/g, '\u2004'],
  1172. [/\\hspace\{0.25em\}/g, '\u2005'],
  1173. [/\\hspace\{0.166em\}/g, '\u2006'],
  1174. [/\\hphantom\{0\}/g, '\u2007'],
  1175. [/\\hphantom\{,\}/g, '\u2008'],
  1176. [/\\hspace\{0.167em\}/g, '\u2009'],
  1177. [/\\mkern1mu /g, '\u200A'],
  1178. [/\\textendash /g, '\u2013'],
  1179. [/\\textemdash /g, '\u2014'],
  1180. [/\\rule\{1em\}\{1pt\}/g, '\u2015'],
  1181. [/\\Vert /g, '\u2016'],
  1182. [/\\Elzreapos /g, '\u201B'],
  1183. [/\\textquotedblleft /g, '\u201C'],
  1184. [/\\textquotedblright /g, '\u201D'],
  1185. [/\\textdagger /g, '\u2020'],
  1186. [/\\textdaggerdbl /g, '\u2021'],
  1187. [/\\textbullet /g, '\u2022'],
  1188. [/\\ldots /g, '\u2026'],
  1189. [/\\textperthousand /g, '\u2030'],
  1190. [/\\textpertenthousand /g, '\u2031'],
  1191. [/\\backprime /g, '\u2035'],
  1192. [/\\guilsinglleft /g, '\u2039'],
  1193. [/\\guilsinglright /g, '\u203A'],
  1194. [/\\mkern4mu /g, '\u205F'],
  1195. [/\\nolinebreak /g, '\u2060'],
  1196. [/\\ensuremath\{\\Elzpes\}/g, '\u20A7'],
  1197. [/\\mbox\{\\texteuro\} /g, '\u20AC'],
  1198. [/\\dddot /g, '\u20DB'],
  1199. [/\\ddddot /g, '\u20DC'],
  1200. [/\\mathbb\{C\}/g, '\u2102'],
  1201. [/\\mathscr\{g\}/g, '\u210A'],
  1202. [/\\mathscr\{H\}/g, '\u210B'],
  1203. [/\\mathfrak\{H\}/g, '\u210C'],
  1204. [/\\mathbb\{H\}/g, '\u210D'],
  1205. [/\\hslash /g, '\u210F'],
  1206. [/\\mathscr\{I\}/g, '\u2110'],
  1207. [/\\mathfrak\{I\}/g, '\u2111'],
  1208. [/\\mathscr\{L\}/g, '\u2112'],
  1209. [/\\mathscr\{l\}/g, '\u2113'],
  1210. [/\\mathbb\{N\}/g, '\u2115'],
  1211. [/\\cyrchar\\textnumero /g, '\u2116'],
  1212. [/\\wp /g, '\u2118'],
  1213. [/\\mathbb\{P\}/g, '\u2119'],
  1214. [/\\mathbb\{Q\}/g, '\u211A'],
  1215. [/\\mathscr\{R\}/g, '\u211B'],
  1216. [/\\mathfrak\{R\}/g, '\u211C'],
  1217. [/\\mathbb\{R\}/g, '\u211D'],
  1218. [/\\Elzxrat /g, '\u211E'],
  1219. [/\\texttrademark /g, '\u2122'],
  1220. [/\\mathbb\{Z\}/g, '\u2124'],
  1221. [/\\Omega /g, '\u2126'],
  1222. [/\\mho /g, '\u2127'],
  1223. [/\\mathfrak\{Z\}/g, '\u2128'],
  1224. [/\\ElsevierGlyph\{2129\}/g, '\u2129'],
  1225. [/\\AA /g, '\u212B'],
  1226. [/\\mathscr\{B\}/g, '\u212C'],
  1227. [/\\mathfrak\{C\}/g, '\u212D'],
  1228. [/\\mathscr\{e\}/g, '\u212F'],
  1229. [/\\mathscr\{E\}/g, '\u2130'],
  1230. [/\\mathscr\{F\}/g, '\u2131'],
  1231. [/\\mathscr\{M\}/g, '\u2133'],
  1232. [/\\mathscr\{o\}/g, '\u2134'],
  1233. [/\\aleph /g, '\u2135'],
  1234. [/\\beth /g, '\u2136'],
  1235. [/\\gimel /g, '\u2137'],
  1236. [/\\daleth /g, '\u2138'],
  1237. [/\\textfrac\{1\}\{3\}/g, '\u2153'],
  1238. [/\\textfrac\{2\}\{3\}/g, '\u2154'],
  1239. [/\\textfrac\{1\}\{5\}/g, '\u2155'],
  1240. [/\\textfrac\{2\}\{5\}/g, '\u2156'],
  1241. [/\\textfrac\{3\}\{5\}/g, '\u2157'],
  1242. [/\\textfrac\{4\}\{5\}/g, '\u2158'],
  1243. [/\\textfrac\{1\}\{6\}/g, '\u2159'],
  1244. [/\\textfrac\{5\}\{6\}/g, '\u215A'],
  1245. [/\\textfrac\{1\}\{8\}/g, '\u215B'],
  1246. [/\\textfrac\{3\}\{8\}/g, '\u215C'],
  1247. [/\\textfrac\{5\}\{8\}/g, '\u215D'],
  1248. [/\\textfrac\{7\}\{8\}/g, '\u215E'],
  1249. [/\\leftarrow /g, '\u2190'],
  1250. [/\\uparrow /g, '\u2191'],
  1251. [/\\rightarrow /g, '\u2192'],
  1252. [/\\downarrow /g, '\u2193'],
  1253. [/\\leftrightarrow /g, '\u2194'],
  1254. [/\\updownarrow /g, '\u2195'],
  1255. [/\\nwarrow /g, '\u2196'],
  1256. [/\\nearrow /g, '\u2197'],
  1257. [/\\searrow /g, '\u2198'],
  1258. [/\\swarrow /g, '\u2199'],
  1259. [/\\nleftarrow /g, '\u219A'],
  1260. [/\\nrightarrow /g, '\u219B'],
  1261. [/\\arrowwaveright /g, '\u219C'],
  1262. [/\\arrowwaveright /g, '\u219D'],
  1263. [/\\twoheadleftarrow /g, '\u219E'],
  1264. [/\\twoheadrightarrow /g, '\u21A0'],
  1265. [/\\leftarrowtail /g, '\u21A2'],
  1266. [/\\rightarrowtail /g, '\u21A3'],
  1267. [/\\mapsto /g, '\u21A6'],
  1268. [/\\hookleftarrow /g, '\u21A9'],
  1269. [/\\hookrightarrow /g, '\u21AA'],
  1270. [/\\looparrowleft /g, '\u21AB'],
  1271. [/\\looparrowright /g, '\u21AC'],
  1272. [/\\leftrightsquigarrow /g, '\u21AD'],
  1273. [/\\nleftrightarrow /g, '\u21AE'],
  1274. [/\\Lsh /g, '\u21B0'],
  1275. [/\\Rsh /g, '\u21B1'],
  1276. [/\\ElsevierGlyph\{21B3\}/g, '\u21B3'],
  1277. [/\\curvearrowleft /g, '\u21B6'],
  1278. [/\\curvearrowright /g, '\u21B7'],
  1279. [/\\circlearrowleft /g, '\u21BA'],
  1280. [/\\circlearrowright /g, '\u21BB'],
  1281. [/\\leftharpoonup /g, '\u21BC'],
  1282. [/\\leftharpoondown /g, '\u21BD'],
  1283. [/\\upharpoonright /g, '\u21BE'],
  1284. [/\\upharpoonleft /g, '\u21BF'],
  1285. [/\\rightharpoonup /g, '\u21C0'],
  1286. [/\\rightharpoondown /g, '\u21C1'],
  1287. [/\\downharpoonright /g, '\u21C2'],
  1288. [/\\downharpoonleft /g, '\u21C3'],
  1289. [/\\rightleftarrows /g, '\u21C4'],
  1290. [/\\dblarrowupdown /g, '\u21C5'],
  1291. [/\\leftrightarrows /g, '\u21C6'],
  1292. [/\\leftleftarrows /g, '\u21C7'],
  1293. [/\\upuparrows /g, '\u21C8'],
  1294. [/\\rightrightarrows /g, '\u21C9'],
  1295. [/\\downdownarrows /g, '\u21CA'],
  1296. [/\\leftrightharpoons /g, '\u21CB'],
  1297. [/\\rightleftharpoons /g, '\u21CC'],
  1298. [/\\nLeftarrow /g, '\u21CD'],
  1299. [/\\nLeftrightarrow /g, '\u21CE'],
  1300. [/\\nRightarrow /g, '\u21CF'],
  1301. [/\\Leftarrow /g, '\u21D0'],
  1302. [/\\Uparrow /g, '\u21D1'],
  1303. [/\\Rightarrow /g, '\u21D2'],
  1304. [/\\Downarrow /g, '\u21D3'],
  1305. [/\\Leftrightarrow /g, '\u21D4'],
  1306. [/\\Updownarrow /g, '\u21D5'],
  1307. [/\\Lleftarrow /g, '\u21DA'],
  1308. [/\\Rrightarrow /g, '\u21DB'],
  1309. [/\\rightsquigarrow /g, '\u21DD'],
  1310. [/\\DownArrowUpArrow /g, '\u21F5'],
  1311. [/\\forall /g, '\u2200'],
  1312. [/\\complement /g, '\u2201'],
  1313. [/\\partial /g, '\u2202'],
  1314. [/\\exists /g, '\u2203'],
  1315. [/\\nexists /g, '\u2204'],
  1316. [/\\varnothing /g, '\u2205'],
  1317. [/\\nabla /g, '\u2207'],
  1318. [/\\in /g, '\u2208'],
  1319. [/\\not\\in /g, '\u2209'],
  1320. [/\\ni /g, '\u220B'],
  1321. [/\\not\\ni /g, '\u220C'],
  1322. [/\\prod /g, '\u220F'],
  1323. [/\\coprod /g, '\u2210'],
  1324. [/\\sum /g, '\u2211'],
  1325. [/\\mp /g, '\u2213'],
  1326. [/\\dotplus /g, '\u2214'],
  1327. [/\\setminus /g, '\u2216'],
  1328. [/\\circ /g, '\u2218'],
  1329. [/\\bullet /g, '\u2219'],
  1330. [/\\surd /g, '\u221A'],
  1331. [/\\propto /g, '\u221D'],
  1332. [/\\infty /g, '\u221E'],
  1333. [/\\rightangle /g, '\u221F'],
  1334. [/\\angle /g, '\u2220'],
  1335. [/\\measuredangle /g, '\u2221'],
  1336. [/\\sphericalangle /g, '\u2222'],
  1337. [/\\mid /g, '\u2223'],
  1338. [/\\nmid /g, '\u2224'],
  1339. [/\\parallel /g, '\u2225'],
  1340. [/\\nparallel /g, '\u2226'],
  1341. [/\\wedge /g, '\u2227'],
  1342. [/\\vee /g, '\u2228'],
  1343. [/\\cap /g, '\u2229'],
  1344. [/\\cup /g, '\u222A'],
  1345. [/\\int /g, '\u222B'],
  1346. [/\\int\\!\\int /g, '\u222C'],
  1347. [/\\int\\!\\int\\!\\int /g, '\u222D'],
  1348. [/\\oint /g, '\u222E'],
  1349. [/\\surfintegral /g, '\u222F'],
  1350. [/\\volintegral /g, '\u2230'],
  1351. [/\\clwintegral /g, '\u2231'],
  1352. [/\\ElsevierGlyph\{2232\}/g, '\u2232'],
  1353. [/\\ElsevierGlyph\{2233\}/g, '\u2233'],
  1354. [/\\therefore /g, '\u2234'],
  1355. [/\\because /g, '\u2235'],
  1356. [/\\Colon /g, '\u2237'],
  1357. [/\\ElsevierGlyph\{2238\}/g, '\u2238'],
  1358. [/\\mathbin\{\{:\}\\!\\!\{\-\}\\!\\!\{:\}\}/g, '\u223A'],
  1359. [/\\homothetic /g, '\u223B'],
  1360. [/\\sim /g, '\u223C'],
  1361. [/\\backsim /g, '\u223D'],
  1362. [/\\lazysinv /g, '\u223E'],
  1363. [/\\wr /g, '\u2240'],
  1364. [/\\not\\sim /g, '\u2241'],
  1365. [/\\ElsevierGlyph\{2242\}/g, '\u2242'],
  1366. [/\\NotEqualTilde /g, '\u2242-00338'],
  1367. [/\\simeq /g, '\u2243'],
  1368. [/\\not\\simeq /g, '\u2244'],
  1369. [/\\cong /g, '\u2245'],
  1370. [/\\approxnotequal /g, '\u2246'],
  1371. [/\\not\\cong /g, '\u2247'],
  1372. [/\\approx /g, '\u2248'],
  1373. [/\\not\\approx /g, '\u2249'],
  1374. [/\\approxeq /g, '\u224A'],
  1375. [/\\tildetrpl /g, '\u224B'],
  1376. [/\\not\\apid /g, '\u224B-00338'],
  1377. [/\\allequal /g, '\u224C'],
  1378. [/\\asymp /g, '\u224D'],
  1379. [/\\Bumpeq /g, '\u224E'],
  1380. [/\\NotHumpDownHump /g, '\u224E-00338'],
  1381. [/\\bumpeq /g, '\u224F'],
  1382. [/\\NotHumpEqual /g, '\u224F-00338'],
  1383. [/\\doteq /g, '\u2250'],
  1384. [/\\not\\doteq/g, '\u2250-00338'],
  1385. [/\\doteqdot /g, '\u2251'],
  1386. [/\\fallingdotseq /g, '\u2252'],
  1387. [/\\risingdotseq /g, '\u2253'],
  1388. [/\\eqcirc /g, '\u2256'],
  1389. [/\\circeq /g, '\u2257'],
  1390. [/\\estimates /g, '\u2259'],
  1391. [/\\ElsevierGlyph\{225A\}/g, '\u225A'],
  1392. [/\\starequal /g, '\u225B'],
  1393. [/\\triangleq /g, '\u225C'],
  1394. [/\\ElsevierGlyph\{225F\}/g, '\u225F'],
  1395. [/\\not =/g, '\u2260'],
  1396. [/\\equiv /g, '\u2261'],
  1397. [/\\not\\equiv /g, '\u2262'],
  1398. [/\\leq /g, '\u2264'],
  1399. [/\\geq /g, '\u2265'],
  1400. [/\\leqq /g, '\u2266'],
  1401. [/\\geqq /g, '\u2267'],
  1402. [/\\lneqq /g, '\u2268'],
  1403. [/\\lvertneqq /g, '\u2268-0FE00'],
  1404. [/\\gneqq /g, '\u2269'],
  1405. [/\\gvertneqq /g, '\u2269-0FE00'],
  1406. [/\\ll /g, '\u226A'],
  1407. [/\\NotLessLess /g, '\u226A-00338'],
  1408. [/\\gg /g, '\u226B'],
  1409. [/\\NotGreaterGreater /g, '\u226B-00338'],
  1410. [/\\between /g, '\u226C'],
  1411. [/\\not\\kern\-0.3em\\times /g, '\u226D'],
  1412. [/\\not</g, '\u226E'],
  1413. [/\\not>/g, '\u226F'],
  1414. [/\\not\\leq /g, '\u2270'],
  1415. [/\\not\\geq /g, '\u2271'],
  1416. [/\\lessequivlnt /g, '\u2272'],
  1417. [/\\greaterequivlnt /g, '\u2273'],
  1418. [/\\ElsevierGlyph\{2274\}/g, '\u2274'],
  1419. [/\\ElsevierGlyph\{2275\}/g, '\u2275'],
  1420. [/\\lessgtr /g, '\u2276'],
  1421. [/\\gtrless /g, '\u2277'],
  1422. [/\\notlessgreater /g, '\u2278'],
  1423. [/\\notgreaterless /g, '\u2279'],
  1424. [/\\prec /g, '\u227A'],
  1425. [/\\succ /g, '\u227B'],
  1426. [/\\preccurlyeq /g, '\u227C'],
  1427. [/\\succcurlyeq /g, '\u227D'],
  1428. [/\\precapprox /g, '\u227E'],
  1429. [/\\NotPrecedesTilde /g, '\u227E-00338'],
  1430. [/\\succapprox /g, '\u227F'],
  1431. [/\\NotSucceedsTilde /g, '\u227F-00338'],
  1432. [/\\not\\prec /g, '\u2280'],
  1433. [/\\not\\succ /g, '\u2281'],
  1434. [/\\subset /g, '\u2282'],
  1435. [/\\supset /g, '\u2283'],
  1436. [/\\not\\subset /g, '\u2284'],
  1437. [/\\not\\supset /g, '\u2285'],
  1438. [/\\subseteq /g, '\u2286'],
  1439. [/\\supseteq /g, '\u2287'],
  1440. [/\\not\\subseteq /g, '\u2288'],
  1441. [/\\not\\supseteq /g, '\u2289'],
  1442. [/\\subsetneq /g, '\u228A'],
  1443. [/\\varsubsetneqq /g, '\u228A-0FE00'],
  1444. [/\\supsetneq /g, '\u228B'],
  1445. [/\\varsupsetneq /g, '\u228B-0FE00'],
  1446. [/\\uplus /g, '\u228E'],
  1447. [/\\sqsubset /g, '\u228F'],
  1448. [/\\NotSquareSubset /g, '\u228F-00338'],
  1449. [/\\sqsupset /g, '\u2290'],
  1450. [/\\NotSquareSuperset /g, '\u2290-00338'],
  1451. [/\\sqsubseteq /g, '\u2291'],
  1452. [/\\sqsupseteq /g, '\u2292'],
  1453. [/\\sqcap /g, '\u2293'],
  1454. [/\\sqcup /g, '\u2294'],
  1455. [/\\oplus /g, '\u2295'],
  1456. [/\\ominus /g, '\u2296'],
  1457. [/\\otimes /g, '\u2297'],
  1458. [/\\oslash /g, '\u2298'],
  1459. [/\\odot /g, '\u2299'],
  1460. [/\\circledcirc /g, '\u229A'],
  1461. [/\\circledast /g, '\u229B'],
  1462. [/\\circleddash /g, '\u229D'],
  1463. [/\\boxplus /g, '\u229E'],
  1464. [/\\boxminus /g, '\u229F'],
  1465. [/\\boxtimes /g, '\u22A0'],
  1466. [/\\boxdot /g, '\u22A1'],
  1467. [/\\vdash /g, '\u22A2'],
  1468. [/\\dashv /g, '\u22A3'],
  1469. [/\\top /g, '\u22A4'],
  1470. [/\\perp /g, '\u22A5'],
  1471. [/\\truestate /g, '\u22A7'],
  1472. [/\\forcesextra /g, '\u22A8'],
  1473. [/\\Vdash /g, '\u22A9'],
  1474. [/\\Vvdash /g, '\u22AA'],
  1475. [/\\VDash /g, '\u22AB'],
  1476. [/\\nvdash /g, '\u22AC'],
  1477. [/\\nvDash /g, '\u22AD'],
  1478. [/\\nVdash /g, '\u22AE'],
  1479. [/\\nVDash /g, '\u22AF'],
  1480. [/\\vartriangleleft /g, '\u22B2'],
  1481. [/\\vartriangleright /g, '\u22B3'],
  1482. [/\\trianglelefteq /g, '\u22B4'],
  1483. [/\\trianglerighteq /g, '\u22B5'],
  1484. [/\\original /g, '\u22B6'],
  1485. [/\\image /g, '\u22B7'],
  1486. [/\\multimap /g, '\u22B8'],
  1487. [/\\hermitconjmatrix /g, '\u22B9'],
  1488. [/\\intercal /g, '\u22BA'],
  1489. [/\\veebar /g, '\u22BB'],
  1490. [/\\rightanglearc /g, '\u22BE'],
  1491. [/\\ElsevierGlyph\{22C0\}/g, '\u22C0'],
  1492. [/\\ElsevierGlyph\{22C1\}/g, '\u22C1'],
  1493. [/\\bigcap /g, '\u22C2'],
  1494. [/\\bigcup /g, '\u22C3'],
  1495. [/\\diamond /g, '\u22C4'],
  1496. [/\\cdot /g, '\u22C5'],
  1497. [/\\star /g, '\u22C6'],
  1498. [/\\divideontimes /g, '\u22C7'],
  1499. [/\\bowtie /g, '\u22C8'],
  1500. [/\\ltimes /g, '\u22C9'],
  1501. [/\\rtimes /g, '\u22CA'],
  1502. [/\\leftthreetimes /g, '\u22CB'],
  1503. [/\\rightthreetimes /g, '\u22CC'],
  1504. [/\\backsimeq /g, '\u22CD'],
  1505. [/\\curlyvee /g, '\u22CE'],
  1506. [/\\curlywedge /g, '\u22CF'],
  1507. [/\\Subset /g, '\u22D0'],
  1508. [/\\Supset /g, '\u22D1'],
  1509. [/\\Cap /g, '\u22D2'],
  1510. [/\\Cup /g, '\u22D3'],
  1511. [/\\pitchfork /g, '\u22D4'],
  1512. [/\\lessdot /g, '\u22D6'],
  1513. [/\\gtrdot /g, '\u22D7'],
  1514. [/\\verymuchless /g, '\u22D8'],
  1515. [/\\verymuchgreater /g, '\u22D9'],
  1516. [/\\lesseqgtr /g, '\u22DA'],
  1517. [/\\gtreqless /g, '\u22DB'],
  1518. [/\\curlyeqprec /g, '\u22DE'],
  1519. [/\\curlyeqsucc /g, '\u22DF'],
  1520. [/\\not\\sqsubseteq /g, '\u22E2'],
  1521. [/\\not\\sqsupseteq /g, '\u22E3'],
  1522. [/\\Elzsqspne /g, '\u22E5'],
  1523. [/\\lnsim /g, '\u22E6'],
  1524. [/\\gnsim /g, '\u22E7'],
  1525. [/\\precedesnotsimilar /g, '\u22E8'],
  1526. [/\\succnsim /g, '\u22E9'],
  1527. [/\\ntriangleleft /g, '\u22EA'],
  1528. [/\\ntriangleright /g, '\u22EB'],
  1529. [/\\ntrianglelefteq /g, '\u22EC'],
  1530. [/\\ntrianglerighteq /g, '\u22ED'],
  1531. [/\\vdots /g, '\u22EE'],
  1532. [/\\cdots /g, '\u22EF'],
  1533. [/\\upslopeellipsis /g, '\u22F0'],
  1534. [/\\downslopeellipsis /g, '\u22F1'],
  1535. [/\\barwedge /g, '\u2305'],
  1536. [/\\perspcorrespond /g, '\u2306'],
  1537. [/\\lceil /g, '\u2308'],
  1538. [/\\rceil /g, '\u2309'],
  1539. [/\\lfloor /g, '\u230A'],
  1540. [/\\rfloor /g, '\u230B'],
  1541. [/\\recorder /g, '\u2315'],
  1542. [/\\mathchar"2208/g, '\u2316'],
  1543. [/\\ulcorner /g, '\u231C'],
  1544. [/\\urcorner /g, '\u231D'],
  1545. [/\\llcorner /g, '\u231E'],
  1546. [/\\lrcorner /g, '\u231F'],
  1547. [/\\frown /g, '\u2322'],
  1548. [/\\smile /g, '\u2323'],
  1549. [/\\langle /g, '\u2329'],
  1550. [/\\rangle /g, '\u232A'],
  1551. [/\\ElsevierGlyph\{E838\}/g, '\u233D'],
  1552. [/\\Elzdlcorn /g, '\u23A3'],
  1553. [/\\lmoustache /g, '\u23B0'],
  1554. [/\\rmoustache /g, '\u23B1'],
  1555. [/\\textvisiblespace /g, '\u2423'],
  1556. [/\\ding\{172\}/g, '\u2460'],
  1557. [/\\ding\{173\}/g, '\u2461'],
  1558. [/\\ding\{174\}/g, '\u2462'],
  1559. [/\\ding\{175\}/g, '\u2463'],
  1560. [/\\ding\{176\}/g, '\u2464'],
  1561. [/\\ding\{177\}/g, '\u2465'],
  1562. [/\\ding\{178\}/g, '\u2466'],
  1563. [/\\ding\{179\}/g, '\u2467'],
  1564. [/\\ding\{180\}/g, '\u2468'],
  1565. [/\\ding\{181\}/g, '\u2469'],
  1566. [/\\circledS /g, '\u24C8'],
  1567. [/\\Elzdshfnc /g, '\u2506'],
  1568. [/\\Elzsqfnw /g, '\u2519'],
  1569. [/\\diagup /g, '\u2571'],
  1570. [/\\ding\{110\}/g, '\u25A0'],
  1571. [/\\square /g, '\u25A1'],
  1572. [/\\blacksquare /g, '\u25AA'],
  1573. [/\\fbox\{~~\}/g, '\u25AD'],
  1574. [/\\Elzvrecto /g, '\u25AF'],
  1575. [/\\ElsevierGlyph\{E381\}/g, '\u25B1'],
  1576. [/\\ding\{115\}/g, '\u25B2'],
  1577. [/\\bigtriangleup /g, '\u25B3'],
  1578. [/\\blacktriangle /g, '\u25B4'],
  1579. [/\\vartriangle /g, '\u25B5'],
  1580. [/\\blacktriangleright /g, '\u25B8'],
  1581. [/\\triangleright /g, '\u25B9'],
  1582. [/\\ding\{116\}/g, '\u25BC'],
  1583. [/\\bigtriangledown /g, '\u25BD'],
  1584. [/\\blacktriangledown /g, '\u25BE'],
  1585. [/\\triangledown /g, '\u25BF'],
  1586. [/\\blacktriangleleft /g, '\u25C2'],
  1587. [/\\triangleleft /g, '\u25C3'],
  1588. [/\\ding\{117\}/g, '\u25C6'],
  1589. [/\\lozenge /g, '\u25CA'],
  1590. [/\\bigcirc /g, '\u25CB'],
  1591. [/\\ding\{108\}/g, '\u25CF'],
  1592. [/\\Elzcirfl /g, '\u25D0'],
  1593. [/\\Elzcirfr /g, '\u25D1'],
  1594. [/\\Elzcirfb /g, '\u25D2'],
  1595. [/\\ding\{119\}/g, '\u25D7'],
  1596. [/\\Elzrvbull /g, '\u25D8'],
  1597. [/\\Elzsqfl /g, '\u25E7'],
  1598. [/\\Elzsqfr /g, '\u25E8'],
  1599. [/\\Elzsqfse /g, '\u25EA'],
  1600. [/\\bigcirc /g, '\u25EF'],
  1601. [/\\ding\{72\}/g, '\u2605'],
  1602. [/\\ding\{73\}/g, '\u2606'],
  1603. [/\\ding\{37\}/g, '\u260E'],
  1604. [/\\ding\{42\}/g, '\u261B'],
  1605. [/\\ding\{43\}/g, '\u261E'],
  1606. [/\\rightmoon /g, '\u263E'],
  1607. [/\\mercury /g, '\u263F'],
  1608. [/\\venus /g, '\u2640'],
  1609. [/\\male /g, '\u2642'],
  1610. [/\\jupiter /g, '\u2643'],
  1611. [/\\saturn /g, '\u2644'],
  1612. [/\\uranus /g, '\u2645'],
  1613. [/\\neptune /g, '\u2646'],
  1614. [/\\pluto /g, '\u2647'],
  1615. [/\\aries /g, '\u2648'],
  1616. [/\\taurus /g, '\u2649'],
  1617. [/\\gemini /g, '\u264A'],
  1618. [/\\cancer /g, '\u264B'],
  1619. [/\\leo /g, '\u264C'],
  1620. [/\\virgo /g, '\u264D'],
  1621. [/\\libra /g, '\u264E'],
  1622. [/\\scorpio /g, '\u264F'],
  1623. [/\\sagittarius /g, '\u2650'],
  1624. [/\\capricornus /g, '\u2651'],
  1625. [/\\aquarius /g, '\u2652'],
  1626. [/\\pisces /g, '\u2653'],
  1627. [/\\ding\{171\}/g, '\u2660'],
  1628. [/\\diamond /g, '\u2662'],
  1629. [/\\ding\{168\}/g, '\u2663'],
  1630. [/\\ding\{170\}/g, '\u2665'],
  1631. [/\\ding\{169\}/g, '\u2666'],
  1632. [/\\quarternote /g, '\u2669'],
  1633. [/\\eighthnote /g, '\u266A'],
  1634. [/\\flat /g, '\u266D'],
  1635. [/\\natural /g, '\u266E'],
  1636. [/\\sharp /g, '\u266F'],
  1637. [/\\ding\{33\}/g, '\u2701'],
  1638. [/\\ding\{34\}/g, '\u2702'],
  1639. [/\\ding\{35\}/g, '\u2703'],
  1640. [/\\ding\{36\}/g, '\u2704'],
  1641. [/\\ding\{38\}/g, '\u2706'],
  1642. [/\\ding\{39\}/g, '\u2707'],
  1643. [/\\ding\{40\}/g, '\u2708'],
  1644. [/\\ding\{41\}/g, '\u2709'],
  1645. [/\\ding\{44\}/g, '\u270C'],
  1646. [/\\ding\{45\}/g, '\u270D'],
  1647. [/\\ding\{46\}/g, '\u270E'],
  1648. [/\\ding\{47\}/g, '\u270F'],
  1649. [/\\ding\{48\}/g, '\u2710'],
  1650. [/\\ding\{49\}/g, '\u2711'],
  1651. [/\\ding\{50\}/g, '\u2712'],
  1652. [/\\ding\{51\}/g, '\u2713'],
  1653. [/\\ding\{52\}/g, '\u2714'],
  1654. [/\\ding\{53\}/g, '\u2715'],
  1655. [/\\ding\{54\}/g, '\u2716'],
  1656. [/\\ding\{55\}/g, '\u2717'],
  1657. [/\\ding\{56\}/g, '\u2718'],
  1658. [/\\ding\{57\}/g, '\u2719'],
  1659. [/\\ding\{58\}/g, '\u271A'],
  1660. [/\\ding\{59\}/g, '\u271B'],
  1661. [/\\ding\{60\}/g, '\u271C'],
  1662. [/\\ding\{61\}/g, '\u271D'],
  1663. [/\\ding\{62\}/g, '\u271E'],
  1664. [/\\ding\{63\}/g, '\u271F'],
  1665. [/\\ding\{64\}/g, '\u2720'],
  1666. [/\\ding\{65\}/g, '\u2721'],
  1667. [/\\ding\{66\}/g, '\u2722'],
  1668. [/\\ding\{67\}/g, '\u2723'],
  1669. [/\\ding\{68\}/g, '\u2724'],
  1670. [/\\ding\{69\}/g, '\u2725'],
  1671. [/\\ding\{70\}/g, '\u2726'],
  1672. [/\\ding\{71\}/g, '\u2727'],
  1673. [/\\ding\{73\}/g, '\u2729'],
  1674. [/\\ding\{74\}/g, '\u272A'],
  1675. [/\\ding\{75\}/g, '\u272B'],
  1676. [/\\ding\{76\}/g, '\u272C'],
  1677. [/\\ding\{77\}/g, '\u272D'],
  1678. [/\\ding\{78\}/g, '\u272E'],
  1679. [/\\ding\{79\}/g, '\u272F'],
  1680. [/\\ding\{80\}/g, '\u2730'],
  1681. [/\\ding\{81\}/g, '\u2731'],
  1682. [/\\ding\{82\}/g, '\u2732'],
  1683. [/\\ding\{83\}/g, '\u2733'],
  1684. [/\\ding\{84\}/g, '\u2734'],
  1685. [/\\ding\{85\}/g, '\u2735'],
  1686. [/\\ding\{86\}/g, '\u2736'],
  1687. [/\\ding\{87\}/g, '\u2737'],
  1688. [/\\ding\{88\}/g, '\u2738'],
  1689. [/\\ding\{89\}/g, '\u2739'],
  1690. [/\\ding\{90\}/g, '\u273A'],
  1691. [/\\ding\{91\}/g, '\u273B'],
  1692. [/\\ding\{92\}/g, '\u273C'],
  1693. [/\\ding\{93\}/g, '\u273D'],
  1694. [/\\ding\{94\}/g, '\u273E'],
  1695. [/\\ding\{95\}/g, '\u273F'],
  1696. [/\\ding\{96\}/g, '\u2740'],
  1697. [/\\ding\{97\}/g, '\u2741'],
  1698. [/\\ding\{98\}/g, '\u2742'],
  1699. [/\\ding\{99\}/g, '\u2743'],
  1700. [/\\ding\{100\}/g, '\u2744'],
  1701. [/\\ding\{101\}/g, '\u2745'],
  1702. [/\\ding\{102\}/g, '\u2746'],
  1703. [/\\ding\{103\}/g, '\u2747'],
  1704. [/\\ding\{104\}/g, '\u2748'],
  1705. [/\\ding\{105\}/g, '\u2749'],
  1706. [/\\ding\{106\}/g, '\u274A'],
  1707. [/\\ding\{107\}/g, '\u274B'],
  1708. [/\\ding\{109\}/g, '\u274D'],
  1709. [/\\ding\{111\}/g, '\u274F'],
  1710. [/\\ding\{112\}/g, '\u2750'],
  1711. [/\\ding\{113\}/g, '\u2751'],
  1712. [/\\ding\{114\}/g, '\u2752'],
  1713. [/\\ding\{118\}/g, '\u2756'],
  1714. [/\\ding\{120\}/g, '\u2758'],
  1715. [/\\ding\{121\}/g, '\u2759'],
  1716. [/\\ding\{122\}/g, '\u275A'],
  1717. [/\\ding\{123\}/g, '\u275B'],
  1718. [/\\ding\{124\}/g, '\u275C'],
  1719. [/\\ding\{125\}/g, '\u275D'],
  1720. [/\\ding\{126\}/g, '\u275E'],
  1721. [/\\ding\{161\}/g, '\u2761'],
  1722. [/\\ding\{162\}/g, '\u2762'],
  1723. [/\\ding\{163\}/g, '\u2763'],
  1724. [/\\ding\{164\}/g, '\u2764'],
  1725. [/\\ding\{165\}/g, '\u2765'],
  1726. [/\\ding\{166\}/g, '\u2766'],
  1727. [/\\ding\{167\}/g, '\u2767'],
  1728. [/\\ding\{182\}/g, '\u2776'],
  1729. [/\\ding\{183\}/g, '\u2777'],
  1730. [/\\ding\{184\}/g, '\u2778'],
  1731. [/\\ding\{185\}/g, '\u2779'],
  1732. [/\\ding\{186\}/g, '\u277A'],
  1733. [/\\ding\{187\}/g, '\u277B'],
  1734. [/\\ding\{188\}/g, '\u277C'],
  1735. [/\\ding\{189\}/g, '\u277D'],
  1736. [/\\ding\{190\}/g, '\u277E'],
  1737. [/\\ding\{191\}/g, '\u277F'],
  1738. [/\\ding\{192\}/g, '\u2780'],
  1739. [/\\ding\{193\}/g, '\u2781'],
  1740. [/\\ding\{194\}/g, '\u2782'],
  1741. [/\\ding\{195\}/g, '\u2783'],
  1742. [/\\ding\{196\}/g, '\u2784'],
  1743. [/\\ding\{197\}/g, '\u2785'],
  1744. [/\\ding\{198\}/g, '\u2786'],
  1745. [/\\ding\{199\}/g, '\u2787'],
  1746. [/\\ding\{200\}/g, '\u2788'],
  1747. [/\\ding\{201\}/g, '\u2789'],
  1748. [/\\ding\{202\}/g, '\u278A'],
  1749. [/\\ding\{203\}/g, '\u278B'],
  1750. [/\\ding\{204\}/g, '\u278C'],
  1751. [/\\ding\{205\}/g, '\u278D'],
  1752. [/\\ding\{206\}/g, '\u278E'],
  1753. [/\\ding\{207\}/g, '\u278F'],
  1754. [/\\ding\{208\}/g, '\u2790'],
  1755. [/\\ding\{209\}/g, '\u2791'],
  1756. [/\\ding\{210\}/g, '\u2792'],
  1757. [/\\ding\{211\}/g, '\u2793'],
  1758. [/\\ding\{212\}/g, '\u2794'],
  1759. [/\\ding\{216\}/g, '\u2798'],
  1760. [/\\ding\{217\}/g, '\u2799'],
  1761. [/\\ding\{218\}/g, '\u279A'],
  1762. [/\\ding\{219\}/g, '\u279B'],
  1763. [/\\ding\{220\}/g, '\u279C'],
  1764. [/\\ding\{221\}/g, '\u279D'],
  1765. [/\\ding\{222\}/g, '\u279E'],
  1766. [/\\ding\{223\}/g, '\u279F'],
  1767. [/\\ding\{224\}/g, '\u27A0'],
  1768. [/\\ding\{225\}/g, '\u27A1'],
  1769. [/\\ding\{226\}/g, '\u27A2'],
  1770. [/\\ding\{227\}/g, '\u27A3'],
  1771. [/\\ding\{228\}/g, '\u27A4'],
  1772. [/\\ding\{229\}/g, '\u27A5'],
  1773. [/\\ding\{230\}/g, '\u27A6'],
  1774. [/\\ding\{231\}/g, '\u27A7'],
  1775. [/\\ding\{232\}/g, '\u27A8'],
  1776. [/\\ding\{233\}/g, '\u27A9'],
  1777. [/\\ding\{234\}/g, '\u27AA'],
  1778. [/\\ding\{235\}/g, '\u27AB'],
  1779. [/\\ding\{236\}/g, '\u27AC'],
  1780. [/\\ding\{237\}/g, '\u27AD'],
  1781. [/\\ding\{238\}/g, '\u27AE'],
  1782. [/\\ding\{239\}/g, '\u27AF'],
  1783. [/\\ding\{241\}/g, '\u27B1'],
  1784. [/\\ding\{242\}/g, '\u27B2'],
  1785. [/\\ding\{243\}/g, '\u27B3'],
  1786. [/\\ding\{244\}/g, '\u27B4'],
  1787. [/\\ding\{245\}/g, '\u27B5'],
  1788. [/\\ding\{246\}/g, '\u27B6'],
  1789. [/\\ding\{247\}/g, '\u27B7'],
  1790. [/\\ding\{248\}/g, '\u27B8'],
  1791. [/\\ding\{249\}/g, '\u27B9'],
  1792. [/\\ding\{250\}/g, '\u27BA'],
  1793. [/\\ding\{251\}/g, '\u27BB'],
  1794. [/\\ding\{252\}/g, '\u27BC'],
  1795. [/\\ding\{253\}/g, '\u27BD'],
  1796. [/\\ding\{254\}/g, '\u27BE'],
  1797. [/\\longleftarrow /g, '\u27F5'],
  1798. [/\\longrightarrow /g, '\u27F6'],
  1799. [/\\longleftrightarrow /g, '\u27F7'],
  1800. [/\\Longleftarrow /g, '\u27F8'],
  1801. [/\\Longrightarrow /g, '\u27F9'],
  1802. [/\\Longleftrightarrow /g, '\u27FA'],
  1803. [/\\longmapsto /g, '\u27FC'],
  1804. [/\\sim\\joinrel\\leadsto/g, '\u27FF'],
  1805. [/\\ElsevierGlyph\{E212\}/g, '\u2905'],
  1806. [/\\UpArrowBar /g, '\u2912'],
  1807. [/\\DownArrowBar /g, '\u2913'],
  1808. [/\\ElsevierGlyph\{E20C\}/g, '\u2923'],
  1809. [/\\ElsevierGlyph\{E20D\}/g, '\u2924'],
  1810. [/\\ElsevierGlyph\{E20B\}/g, '\u2925'],
  1811. [/\\ElsevierGlyph\{E20A\}/g, '\u2926'],
  1812. [/\\ElsevierGlyph\{E211\}/g, '\u2927'],
  1813. [/\\ElsevierGlyph\{E20E\}/g, '\u2928'],
  1814. [/\\ElsevierGlyph\{E20F\}/g, '\u2929'],
  1815. [/\\ElsevierGlyph\{E210\}/g, '\u292A'],
  1816. [/\\ElsevierGlyph\{E21C\}/g, '\u2933'],
  1817. [/\\ElsevierGlyph\{E21D\}/g, '\u2933-00338'],
  1818. [/\\ElsevierGlyph\{E21A\}/g, '\u2936'],
  1819. [/\\ElsevierGlyph\{E219\}/g, '\u2937'],
  1820. [/\\Elolarr /g, '\u2940'],
  1821. [/\\Elorarr /g, '\u2941'],
  1822. [/\\ElzRlarr /g, '\u2942'],
  1823. [/\\ElzrLarr /g, '\u2944'],
  1824. [/\\Elzrarrx /g, '\u2947'],
  1825. [/\\LeftRightVector /g, '\u294E'],
  1826. [/\\RightUpDownVector /g, '\u294F'],
  1827. [/\\DownLeftRightVector /g, '\u2950'],
  1828. [/\\LeftUpDownVector /g, '\u2951'],
  1829. [/\\LeftVectorBar /g, '\u2952'],
  1830. [/\\RightVectorBar /g, '\u2953'],
  1831. [/\\RightUpVectorBar /g, '\u2954'],
  1832. [/\\RightDownVectorBar /g, '\u2955'],
  1833. [/\\DownLeftVectorBar /g, '\u2956'],
  1834. [/\\DownRightVectorBar /g, '\u2957'],
  1835. [/\\LeftUpVectorBar /g, '\u2958'],
  1836. [/\\LeftDownVectorBar /g, '\u2959'],
  1837. [/\\LeftTeeVector /g, '\u295A'],
  1838. [/\\RightTeeVector /g, '\u295B'],
  1839. [/\\RightUpTeeVector /g, '\u295C'],
  1840. [/\\RightDownTeeVector /g, '\u295D'],
  1841. [/\\DownLeftTeeVector /g, '\u295E'],
  1842. [/\\DownRightTeeVector /g, '\u295F'],
  1843. [/\\LeftUpTeeVector /g, '\u2960'],
  1844. [/\\LeftDownTeeVector /g, '\u2961'],
  1845. [/\\UpEquilibrium /g, '\u296E'],
  1846. [/\\ReverseUpEquilibrium /g, '\u296F'],
  1847. [/\\RoundImplies /g, '\u2970'],
  1848. [/\\ElsevierGlyph\{E214\}/g, '\u297C'],
  1849. [/\\ElsevierGlyph\{E215\}/g, '\u297D'],
  1850. [/\\Elztfnc /g, '\u2980'],
  1851. [/\\ElsevierGlyph\{3018\}/g, '\u2985'],
  1852. [/\\Elroang /g, '\u2986'],
  1853. [/\\ElsevierGlyph\{E291\}/g, '\u2994'],
  1854. [/\\Elzddfnc /g, '\u2999'],
  1855. [/\\Angle /g, '\u299C'],
  1856. [/\\Elzlpargt /g, '\u29A0'],
  1857. [/\\ElsevierGlyph\{E260\}/g, '\u29B5'],
  1858. [/\\ElsevierGlyph\{E61B\}/g, '\u29B6'],
  1859. [/\\ElzLap /g, '\u29CA'],
  1860. [/\\Elzdefas /g, '\u29CB'],
  1861. [/\\LeftTriangleBar /g, '\u29CF'],
  1862. [/\\NotLeftTriangleBar /g, '\u29CF-00338'],
  1863. [/\\RightTriangleBar /g, '\u29D0'],
  1864. [/\\NotRightTriangleBar /g, '\u29D0-00338'],
  1865. [/\\ElsevierGlyph\{E372\}/g, '\u29DC'],
  1866. [/\\blacklozenge /g, '\u29EB'],
  1867. [/\\RuleDelayed /g, '\u29F4'],
  1868. [/\\Elxuplus /g, '\u2A04'],
  1869. [/\\ElzThr /g, '\u2A05'],
  1870. [/\\Elxsqcup /g, '\u2A06'],
  1871. [/\\ElzInf /g, '\u2A07'],
  1872. [/\\ElzSup /g, '\u2A08'],
  1873. [/\\ElzCint /g, '\u2A0D'],
  1874. [/\\clockoint /g, '\u2A0F'],
  1875. [/\\ElsevierGlyph\{E395\}/g, '\u2A10'],
  1876. [/\\sqrint /g, '\u2A16'],
  1877. [/\\ElsevierGlyph\{E25A\}/g, '\u2A25'],
  1878. [/\\ElsevierGlyph\{E25B\}/g, '\u2A2A'],
  1879. [/\\ElsevierGlyph\{E25C\}/g, '\u2A2D'],
  1880. [/\\ElsevierGlyph\{E25D\}/g, '\u2A2E'],
  1881. [/\\ElzTimes /g, '\u2A2F'],
  1882. [/\\ElsevierGlyph\{E25E\}/g, '\u2A34'],
  1883. [/\\ElsevierGlyph\{E25E\}/g, '\u2A35'],
  1884. [/\\ElsevierGlyph\{E259\}/g, '\u2A3C'],
  1885. [/\\amalg /g, '\u2A3F'],
  1886. [/\\ElzAnd /g, '\u2A53'],
  1887. [/\\ElzOr /g, '\u2A54'],
  1888. [/\\ElsevierGlyph\{E36E\}/g, '\u2A55'],
  1889. [/\\ElOr /g, '\u2A56'],
  1890. [/\\perspcorrespond /g, '\u2A5E'],
  1891. [/\\Elzminhat /g, '\u2A5F'],
  1892. [/\\ElsevierGlyph\{225A\}/g, '\u2A63'],
  1893. [/\\stackrel\{*\}\{=\}/g, '\u2A6E'],
  1894. [/\\Equal /g, '\u2A75'],
  1895. [/\\leqslant /g, '\u2A7D'],
  1896. [/\\nleqslant /g, '\u2A7D-00338'],
  1897. [/\\geqslant /g, '\u2A7E'],
  1898. [/\\ngeqslant /g, '\u2A7E-00338'],
  1899. [/\\lessapprox /g, '\u2A85'],
  1900. [/\\gtrapprox /g, '\u2A86'],
  1901. [/\\lneq /g, '\u2A87'],
  1902. [/\\gneq /g, '\u2A88'],
  1903. [/\\lnapprox /g, '\u2A89'],
  1904. [/\\gnapprox /g, '\u2A8A'],
  1905. [/\\lesseqqgtr /g, '\u2A8B'],
  1906. [/\\gtreqqless /g, '\u2A8C'],
  1907. [/\\eqslantless /g, '\u2A95'],
  1908. [/\\eqslantgtr /g, '\u2A96'],
  1909. [/\\Pisymbol\{ppi020\}\{117\}/g, '\u2A9D'],
  1910. [/\\Pisymbol\{ppi020\}\{105\}/g, '\u2A9E'],
  1911. [/\\NestedLessLess /g, '\u2AA1'],
  1912. [/\\NotNestedLessLess /g, '\u2AA1-00338'],
  1913. [/\\NestedGreaterGreater /g, '\u2AA2'],
  1914. [/\\NotNestedGreaterGreater /g, '\u2AA2-00338'],
  1915. [/\\preceq /g, '\u2AAF'],
  1916. [/\\not\\preceq /g, '\u2AAF-00338'],
  1917. [/\\succeq /g, '\u2AB0'],
  1918. [/\\not\\succeq /g, '\u2AB0-00338'],
  1919. [/\\precneqq /g, '\u2AB5'],
  1920. [/\\succneqq /g, '\u2AB6'],
  1921. [/\\precapprox /g, '\u2AB7'],
  1922. [/\\succapprox /g, '\u2AB8'],
  1923. [/\\precnapprox /g, '\u2AB9'],
  1924. [/\\succnapprox /g, '\u2ABA'],
  1925. [/\\subseteqq /g, '\u2AC5'],
  1926. [/\\nsubseteqq /g, '\u2AC5-00338'],
  1927. [/\\supseteqq /g, '\u2AC6'],
  1928. [/\\nsupseteqq/g, '\u2AC6-00338'],
  1929. [/\\subsetneqq /g, '\u2ACB'],
  1930. [/\\supsetneqq /g, '\u2ACC'],
  1931. [/\\ElsevierGlyph\{E30D\}/g, '\u2AEB'],
  1932. [/\\Elztdcol /g, '\u2AF6'],
  1933. [/\\ElsevierGlyph\{300A\}/g, '\u300A'],
  1934. [/\\ElsevierGlyph\{300B\}/g, '\u300B'],
  1935. [/\\ElsevierGlyph\{3018\}/g, '\u3018'],
  1936. [/\\ElsevierGlyph\{3019\}/g, '\u3019'],
  1937. [/\\openbracketleft /g, '\u301A'],
  1938. [/\\openbracketright /g, '\u301B'],
  1939. ]
  1940. if (typeof module !== 'undefined' && module.exports) {
  1941. module.exports = BibtexParser
  1942. }