{"version":3,"file":"index.js","mappings":"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","sources":["webpack://theme.vail/./node_modules/codemirror-spell-checker/src/js/spell-checker.js","webpack://theme.vail/./node_modules/codemirror/addon/display/autorefresh.js","webpack://theme.vail/./node_modules/codemirror/addon/display/fullscreen.js","webpack://theme.vail/./node_modules/codemirror/addon/display/placeholder.js","webpack://theme.vail/./node_modules/codemirror/addon/edit/continuelist.js","webpack://theme.vail/./node_modules/codemirror/addon/mode/overlay.js","webpack://theme.vail/./node_modules/codemirror/addon/search/searchcursor.js","webpack://theme.vail/./node_modules/codemirror/addon/selection/mark-selection.js","webpack://theme.vail/./node_modules/codemirror/lib/codemirror.js","webpack://theme.vail/./node_modules/codemirror/mode/gfm/gfm.js","webpack://theme.vail/./node_modules/codemirror/mode/markdown/markdown.js","webpack://theme.vail/./node_modules/codemirror/mode/meta.js","webpack://theme.vail/./node_modules/codemirror/mode/xml/xml.js","webpack://theme.vail/./node_modules/easymde/src/js/codemirror/tablist.js","webpack://theme.vail/./node_modules/easymde/src/js/easymde.js","webpack://theme.vail/./node_modules/ev-emitter/ev-emitter.js","webpack://theme.vail/./node_modules/fizzy-ui-utils/utils.js","webpack://theme.vail/./node_modules/flickity/js/add-remove-cell.js","webpack://theme.vail/./node_modules/flickity/js/animate.js","webpack://theme.vail/./node_modules/flickity/js/cell.js","webpack://theme.vail/./node_modules/flickity/js/core.js","webpack://theme.vail/./node_modules/flickity/js/drag.js","webpack://theme.vail/./node_modules/flickity/js/imagesloaded.js","webpack://theme.vail/./node_modules/flickity/js/index.js","webpack://theme.vail/./node_modules/flickity/js/lazyload.js","webpack://theme.vail/./node_modules/flickity/js/page-dots.js","webpack://theme.vail/./node_modules/flickity/js/player.js","webpack://theme.vail/./node_modules/flickity/js/prev-next-button.js","webpack://theme.vail/./node_modules/flickity/js/slide.js","webpack://theme.vail/./node_modules/get-size/get-size.js","webpack://theme.vail/./node_modules/imagesloaded/imagesloaded.js","webpack://theme.vail/./node_modules/path-browserify/index.js","webpack://theme.vail/./www/assets/src/theme/vail/scripts/liveChat.ts","webpack://theme.vail/./www/assets/src/theme/vail/scripts/products/gallery.ts","webpack://theme.vail/./www/assets/src/theme/vail/scripts/products/productPage.ts","webpack://theme.vail/./www/assets/src/theme/vail/scripts/swipe.ts","webpack://theme.vail/./node_modules/typo-js/typo.js","webpack://theme.vail/./node_modules/unidragger/unidragger.js","webpack://theme.vail/./www/assets/src/api/api_component.js","webpack://theme.vail/./www/assets/src/api/brandgroups.js","webpack://theme.vail/./www/assets/src/api/brands.js","webpack://theme.vail/./www/assets/src/api/cart.js","webpack://theme.vail/./www/assets/src/api/catalogue.js","webpack://theme.vail/./www/assets/src/api/client.js","webpack://theme.vail/./www/assets/src/api/collections.js","webpack://theme.vail/./www/assets/src/api/discounts.js","webpack://theme.vail/./www/assets/src/api/freight.js","webpack://theme.vail/./www/assets/src/api/index.js","webpack://theme.vail/./www/assets/src/api/orders.js","webpack://theme.vail/./www/assets/src/api/products.js","webpack://theme.vail/./www/assets/src/api/reboxed_items.js","webpack://theme.vail/./www/assets/src/api/recent_sales.js","webpack://theme.vail/./www/assets/src/theme/vail/scripts/products/product-form/productFormFilesManager.js","webpack://theme.vail/./www/assets/src/theme/vail/scripts/products/product-form/productFormManager.js","webpack://theme.vail/./www/assets/src/theme/vail/scripts/products/product-form/productFormUtils.js","webpack://theme.vail/./www/assets/src/theme/vail/scripts/products/product-form/stores/productStore.js","webpack://theme.vail/./node_modules/easymde/node_modules/marked/lib/marked.cjs","webpack://theme.vail/webpack/bootstrap","webpack://theme.vail/webpack/runtime/compat get default export","webpack://theme.vail/webpack/runtime/define property getters","webpack://theme.vail/webpack/runtime/hasOwnProperty shorthand","webpack://theme.vail/webpack/runtime/make namespace object","webpack://theme.vail/./www/assets/src/theme/vail/scripts/index.ts"],"sourcesContent":["// Use strict mode (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode)\n\"use strict\";\n\n\n// Requires\nvar Typo = require(\"typo-js\");\n\n\n// Create function\nfunction CodeMirrorSpellChecker(options) {\n\t// Initialize\n\toptions = options || {};\n\n\n\t// Verify\n\tif(typeof options.codeMirrorInstance !== \"function\" || typeof options.codeMirrorInstance.defineMode !== \"function\") {\n\t\tconsole.log(\"CodeMirror Spell Checker: You must provide an instance of CodeMirror via the option `codeMirrorInstance`\");\n\t\treturn;\n\t}\n\n\n\t// Because some browsers don't support this functionality yet\n\tif(!String.prototype.includes) {\n\t\tString.prototype.includes = function() {\n\t\t\t\"use strict\";\n\t\t\treturn String.prototype.indexOf.apply(this, arguments) !== -1;\n\t\t};\n\t}\n\n\n\t// Define the new mode\n\toptions.codeMirrorInstance.defineMode(\"spell-checker\", function(config) {\n\t\t// Load AFF/DIC data\n\t\tif(!CodeMirrorSpellChecker.aff_loading) {\n\t\t\tCodeMirrorSpellChecker.aff_loading = true;\n\t\t\tvar xhr_aff = new XMLHttpRequest();\n\t\t\txhr_aff.open(\"GET\", \"https://cdn.jsdelivr.net/codemirror.spell-checker/latest/en_US.aff\", true);\n\t\t\txhr_aff.onload = function() {\n\t\t\t\tif(xhr_aff.readyState === 4 && xhr_aff.status === 200) {\n\t\t\t\t\tCodeMirrorSpellChecker.aff_data = xhr_aff.responseText;\n\t\t\t\t\tCodeMirrorSpellChecker.num_loaded++;\n\n\t\t\t\t\tif(CodeMirrorSpellChecker.num_loaded == 2) {\n\t\t\t\t\t\tCodeMirrorSpellChecker.typo = new Typo(\"en_US\", CodeMirrorSpellChecker.aff_data, CodeMirrorSpellChecker.dic_data, {\n\t\t\t\t\t\t\tplatform: \"any\"\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t\txhr_aff.send(null);\n\t\t}\n\n\t\tif(!CodeMirrorSpellChecker.dic_loading) {\n\t\t\tCodeMirrorSpellChecker.dic_loading = true;\n\t\t\tvar xhr_dic = new XMLHttpRequest();\n\t\t\txhr_dic.open(\"GET\", \"https://cdn.jsdelivr.net/codemirror.spell-checker/latest/en_US.dic\", true);\n\t\t\txhr_dic.onload = function() {\n\t\t\t\tif(xhr_dic.readyState === 4 && xhr_dic.status === 200) {\n\t\t\t\t\tCodeMirrorSpellChecker.dic_data = xhr_dic.responseText;\n\t\t\t\t\tCodeMirrorSpellChecker.num_loaded++;\n\n\t\t\t\t\tif(CodeMirrorSpellChecker.num_loaded == 2) {\n\t\t\t\t\t\tCodeMirrorSpellChecker.typo = new Typo(\"en_US\", CodeMirrorSpellChecker.aff_data, CodeMirrorSpellChecker.dic_data, {\n\t\t\t\t\t\t\tplatform: \"any\"\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t\txhr_dic.send(null);\n\t\t}\n\n\n\t\t// Define what separates a word\n\t\tvar rx_word = \"!\\\"#$%&()*+,-./:;<=>?@[\\\\]^_`{|}~ \";\n\n\n\t\t// Create the overlay and such\n\t\tvar overlay = {\n\t\t\ttoken: function(stream) {\n\t\t\t\tvar ch = stream.peek();\n\t\t\t\tvar word = \"\";\n\n\t\t\t\tif(rx_word.includes(ch)) {\n\t\t\t\t\tstream.next();\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\twhile((ch = stream.peek()) != null && !rx_word.includes(ch)) {\n\t\t\t\t\tword += ch;\n\t\t\t\t\tstream.next();\n\t\t\t\t}\n\n\t\t\t\tif(CodeMirrorSpellChecker.typo && !CodeMirrorSpellChecker.typo.check(word))\n\t\t\t\t\treturn \"spell-error\"; // CSS class: cm-spell-error\n\n\t\t\t\treturn null;\n\t\t\t}\n\t\t};\n\n\t\tvar mode = options.codeMirrorInstance.getMode(\n\t\t\tconfig, config.backdrop || \"text/plain\"\n\t\t);\n\n\t\treturn options.codeMirrorInstance.overlayMode(mode, overlay, true);\n\t});\n}\n\n\n// Initialize data globally to reduce memory consumption\nCodeMirrorSpellChecker.num_loaded = 0;\nCodeMirrorSpellChecker.aff_loading = false;\nCodeMirrorSpellChecker.dic_loading = false;\nCodeMirrorSpellChecker.aff_data = \"\";\nCodeMirrorSpellChecker.dic_data = \"\";\nCodeMirrorSpellChecker.typo;\n\n\n// Export\nmodule.exports = CodeMirrorSpellChecker;","// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/5/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"))\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod)\n  else // Plain browser env\n    mod(CodeMirror)\n})(function(CodeMirror) {\n  \"use strict\"\n\n  CodeMirror.defineOption(\"autoRefresh\", false, function(cm, val) {\n    if (cm.state.autoRefresh) {\n      stopListening(cm, cm.state.autoRefresh)\n      cm.state.autoRefresh = null\n    }\n    if (val && cm.display.wrapper.offsetHeight == 0)\n      startListening(cm, cm.state.autoRefresh = {delay: val.delay || 250})\n  })\n\n  function startListening(cm, state) {\n    function check() {\n      if (cm.display.wrapper.offsetHeight) {\n        stopListening(cm, state)\n        if (cm.display.lastWrapHeight != cm.display.wrapper.clientHeight)\n          cm.refresh()\n      } else {\n        state.timeout = setTimeout(check, state.delay)\n      }\n    }\n    state.timeout = setTimeout(check, state.delay)\n    state.hurry = function() {\n      clearTimeout(state.timeout)\n      state.timeout = setTimeout(check, 50)\n    }\n    CodeMirror.on(window, \"mouseup\", state.hurry)\n    CodeMirror.on(window, \"keyup\", state.hurry)\n  }\n\n  function stopListening(_cm, state) {\n    clearTimeout(state.timeout)\n    CodeMirror.off(window, \"mouseup\", state.hurry)\n    CodeMirror.off(window, \"keyup\", state.hurry)\n  }\n});\n","// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/5/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.defineOption(\"fullScreen\", false, function(cm, val, old) {\n    if (old == CodeMirror.Init) old = false;\n    if (!old == !val) return;\n    if (val) setFullscreen(cm);\n    else setNormal(cm);\n  });\n\n  function setFullscreen(cm) {\n    var wrap = cm.getWrapperElement();\n    cm.state.fullScreenRestore = {scrollTop: window.pageYOffset, scrollLeft: window.pageXOffset,\n                                  width: wrap.style.width, height: wrap.style.height};\n    wrap.style.width = \"\";\n    wrap.style.height = \"auto\";\n    wrap.className += \" CodeMirror-fullscreen\";\n    document.documentElement.style.overflow = \"hidden\";\n    cm.refresh();\n  }\n\n  function setNormal(cm) {\n    var wrap = cm.getWrapperElement();\n    wrap.className = wrap.className.replace(/\\s*CodeMirror-fullscreen\\b/, \"\");\n    document.documentElement.style.overflow = \"\";\n    var info = cm.state.fullScreenRestore;\n    wrap.style.width = info.width; wrap.style.height = info.height;\n    window.scrollTo(info.scrollLeft, info.scrollTop);\n    cm.refresh();\n  }\n});\n","// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/5/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  CodeMirror.defineOption(\"placeholder\", \"\", function(cm, val, old) {\n    var prev = old && old != CodeMirror.Init;\n    if (val && !prev) {\n      cm.on(\"blur\", onBlur);\n      cm.on(\"change\", onChange);\n      cm.on(\"swapDoc\", onChange);\n      CodeMirror.on(cm.getInputField(), \"compositionupdate\", cm.state.placeholderCompose = function() { onComposition(cm) })\n      onChange(cm);\n    } else if (!val && prev) {\n      cm.off(\"blur\", onBlur);\n      cm.off(\"change\", onChange);\n      cm.off(\"swapDoc\", onChange);\n      CodeMirror.off(cm.getInputField(), \"compositionupdate\", cm.state.placeholderCompose)\n      clearPlaceholder(cm);\n      var wrapper = cm.getWrapperElement();\n      wrapper.className = wrapper.className.replace(\" CodeMirror-empty\", \"\");\n    }\n\n    if (val && !cm.hasFocus()) onBlur(cm);\n  });\n\n  function clearPlaceholder(cm) {\n    if (cm.state.placeholder) {\n      cm.state.placeholder.parentNode.removeChild(cm.state.placeholder);\n      cm.state.placeholder = null;\n    }\n  }\n  function setPlaceholder(cm) {\n    clearPlaceholder(cm);\n    var elt = cm.state.placeholder = document.createElement(\"pre\");\n    elt.style.cssText = \"height: 0; overflow: visible\";\n    elt.style.direction = cm.getOption(\"direction\");\n    elt.className = \"CodeMirror-placeholder CodeMirror-line-like\";\n    var placeHolder = cm.getOption(\"placeholder\")\n    if (typeof placeHolder == \"string\") placeHolder = document.createTextNode(placeHolder)\n    elt.appendChild(placeHolder)\n    cm.display.lineSpace.insertBefore(elt, cm.display.lineSpace.firstChild);\n  }\n\n  function onComposition(cm) {\n    setTimeout(function() {\n      var empty = false\n      if (cm.lineCount() == 1) {\n        var input = cm.getInputField()\n        empty = input.nodeName == \"TEXTAREA\" ? !cm.getLine(0).length\n          : !/[^\\u200b]/.test(input.querySelector(\".CodeMirror-line\").textContent)\n      }\n      if (empty) setPlaceholder(cm)\n      else clearPlaceholder(cm)\n    }, 20)\n  }\n\n  function onBlur(cm) {\n    if (isEmpty(cm)) setPlaceholder(cm);\n  }\n  function onChange(cm) {\n    var wrapper = cm.getWrapperElement(), empty = isEmpty(cm);\n    wrapper.className = wrapper.className.replace(\" CodeMirror-empty\", \"\") + (empty ? \" CodeMirror-empty\" : \"\");\n\n    if (empty) setPlaceholder(cm);\n    else clearPlaceholder(cm);\n  }\n\n  function isEmpty(cm) {\n    return (cm.lineCount() === 1) && (cm.getLine(0) === \"\");\n  }\n});\n","// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/5/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  var listRE = /^(\\s*)(>[> ]*|[*+-] \\[[x ]\\]\\s|[*+-]\\s|(\\d+)([.)]))(\\s*)/,\n      emptyListRE = /^(\\s*)(>[> ]*|[*+-] \\[[x ]\\]|[*+-]|(\\d+)[.)])(\\s*)$/,\n      unorderedListRE = /[*+-]\\s/;\n\n  CodeMirror.commands.newlineAndIndentContinueMarkdownList = function(cm) {\n    if (cm.getOption(\"disableInput\")) return CodeMirror.Pass;\n    var ranges = cm.listSelections(), replacements = [];\n    for (var i = 0; i < ranges.length; i++) {\n      var pos = ranges[i].head;\n\n      // If we're not in Markdown mode, fall back to normal newlineAndIndent\n      var eolState = cm.getStateAfter(pos.line);\n      var inner = CodeMirror.innerMode(cm.getMode(), eolState);\n      if (inner.mode.name !== \"markdown\" && inner.mode.helperType !== \"markdown\") {\n        cm.execCommand(\"newlineAndIndent\");\n        return;\n      } else {\n        eolState = inner.state;\n      }\n\n      var inList = eolState.list !== false;\n      var inQuote = eolState.quote !== 0;\n\n      var line = cm.getLine(pos.line), match = listRE.exec(line);\n      var cursorBeforeBullet = /^\\s*$/.test(line.slice(0, pos.ch));\n      if (!ranges[i].empty() || (!inList && !inQuote) || !match || cursorBeforeBullet) {\n        cm.execCommand(\"newlineAndIndent\");\n        return;\n      }\n      if (emptyListRE.test(line)) {\n        var endOfQuote = inQuote && />\\s*$/.test(line)\n        var endOfList = !/>\\s*$/.test(line)\n        if (endOfQuote || endOfList) cm.replaceRange(\"\", {\n          line: pos.line, ch: 0\n        }, {\n          line: pos.line, ch: pos.ch + 1\n        });\n        replacements[i] = \"\\n\";\n      } else {\n        var indent = match[1], after = match[5];\n        var numbered = !(unorderedListRE.test(match[2]) || match[2].indexOf(\">\") >= 0);\n        var bullet = numbered ? (parseInt(match[3], 10) + 1) + match[4] : match[2].replace(\"x\", \" \");\n        replacements[i] = \"\\n\" + indent + bullet + after;\n\n        if (numbered) incrementRemainingMarkdownListNumbers(cm, pos);\n      }\n    }\n\n    cm.replaceSelections(replacements);\n  };\n\n  // Auto-updating Markdown list numbers when a new item is added to the\n  // middle of a list\n  function incrementRemainingMarkdownListNumbers(cm, pos) {\n    var startLine = pos.line, lookAhead = 0, skipCount = 0;\n    var startItem = listRE.exec(cm.getLine(startLine)), startIndent = startItem[1];\n\n    do {\n      lookAhead += 1;\n      var nextLineNumber = startLine + lookAhead;\n      var nextLine = cm.getLine(nextLineNumber), nextItem = listRE.exec(nextLine);\n\n      if (nextItem) {\n        var nextIndent = nextItem[1];\n        var newNumber = (parseInt(startItem[3], 10) + lookAhead - skipCount);\n        var nextNumber = (parseInt(nextItem[3], 10)), itemNumber = nextNumber;\n\n        if (startIndent === nextIndent && !isNaN(nextNumber)) {\n          if (newNumber === nextNumber) itemNumber = nextNumber + 1;\n          if (newNumber > nextNumber) itemNumber = newNumber + 1;\n          cm.replaceRange(\n            nextLine.replace(listRE, nextIndent + itemNumber + nextItem[4] + nextItem[5]),\n          {\n            line: nextLineNumber, ch: 0\n          }, {\n            line: nextLineNumber, ch: nextLine.length\n          });\n        } else {\n          if (startIndent.length > nextIndent.length) return;\n          // This doesn't run if the next line immediately indents, as it is\n          // not clear of the users intention (new indented item or same level)\n          if ((startIndent.length < nextIndent.length) && (lookAhead === 1)) return;\n          skipCount += 1;\n        }\n      }\n    } while (nextItem);\n  }\n});\n","// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/5/LICENSE\n\n// Utility function that allows modes to be combined. The mode given\n// as the base argument takes care of most of the normal mode\n// functionality, but a second (typically simple) mode is used, which\n// can override the style of text. Both modes get to parse all of the\n// text, but when both assign a non-null style to a piece of code, the\n// overlay wins, unless the combine argument was true and not overridden,\n// or state.overlay.combineTokens was true, in which case the styles are\n// combined.\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.overlayMode = function(base, overlay, combine) {\n  return {\n    startState: function() {\n      return {\n        base: CodeMirror.startState(base),\n        overlay: CodeMirror.startState(overlay),\n        basePos: 0, baseCur: null,\n        overlayPos: 0, overlayCur: null,\n        streamSeen: null\n      };\n    },\n    copyState: function(state) {\n      return {\n        base: CodeMirror.copyState(base, state.base),\n        overlay: CodeMirror.copyState(overlay, state.overlay),\n        basePos: state.basePos, baseCur: null,\n        overlayPos: state.overlayPos, overlayCur: null\n      };\n    },\n\n    token: function(stream, state) {\n      if (stream != state.streamSeen ||\n          Math.min(state.basePos, state.overlayPos) < stream.start) {\n        state.streamSeen = stream;\n        state.basePos = state.overlayPos = stream.start;\n      }\n\n      if (stream.start == state.basePos) {\n        state.baseCur = base.token(stream, state.base);\n        state.basePos = stream.pos;\n      }\n      if (stream.start == state.overlayPos) {\n        stream.pos = stream.start;\n        state.overlayCur = overlay.token(stream, state.overlay);\n        state.overlayPos = stream.pos;\n      }\n      stream.pos = Math.min(state.basePos, state.overlayPos);\n\n      // state.overlay.combineTokens always takes precedence over combine,\n      // unless set to null\n      if (state.overlayCur == null) return state.baseCur;\n      else if (state.baseCur != null &&\n               state.overlay.combineTokens ||\n               combine && state.overlay.combineTokens == null)\n        return state.baseCur + \" \" + state.overlayCur;\n      else return state.overlayCur;\n    },\n\n    indent: base.indent && function(state, textAfter, line) {\n      return base.indent(state.base, textAfter, line);\n    },\n    electricChars: base.electricChars,\n\n    innerMode: function(state) { return {state: state.base, mode: base}; },\n\n    blankLine: function(state) {\n      var baseToken, overlayToken;\n      if (base.blankLine) baseToken = base.blankLine(state.base);\n      if (overlay.blankLine) overlayToken = overlay.blankLine(state.overlay);\n\n      return overlayToken == null ?\n        baseToken :\n        (combine && baseToken != null ? baseToken + \" \" + overlayToken : overlayToken);\n    }\n  };\n};\n\n});\n","// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/5/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"))\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod)\n  else // Plain browser env\n    mod(CodeMirror)\n})(function(CodeMirror) {\n  \"use strict\"\n  var Pos = CodeMirror.Pos\n\n  function regexpFlags(regexp) {\n    var flags = regexp.flags\n    return flags != null ? flags : (regexp.ignoreCase ? \"i\" : \"\")\n      + (regexp.global ? \"g\" : \"\")\n      + (regexp.multiline ? \"m\" : \"\")\n  }\n\n  function ensureFlags(regexp, flags) {\n    var current = regexpFlags(regexp), target = current\n    for (var i = 0; i < flags.length; i++) if (target.indexOf(flags.charAt(i)) == -1)\n      target += flags.charAt(i)\n    return current == target ? regexp : new RegExp(regexp.source, target)\n  }\n\n  function maybeMultiline(regexp) {\n    return /\\\\s|\\\\n|\\n|\\\\W|\\\\D|\\[\\^/.test(regexp.source)\n  }\n\n  function searchRegexpForward(doc, regexp, start) {\n    regexp = ensureFlags(regexp, \"g\")\n    for (var line = start.line, ch = start.ch, last = doc.lastLine(); line <= last; line++, ch = 0) {\n      regexp.lastIndex = ch\n      var string = doc.getLine(line), match = regexp.exec(string)\n      if (match)\n        return {from: Pos(line, match.index),\n                to: Pos(line, match.index + match[0].length),\n                match: match}\n    }\n  }\n\n  function searchRegexpForwardMultiline(doc, regexp, start) {\n    if (!maybeMultiline(regexp)) return searchRegexpForward(doc, regexp, start)\n\n    regexp = ensureFlags(regexp, \"gm\")\n    var string, chunk = 1\n    for (var line = start.line, last = doc.lastLine(); line <= last;) {\n      // This grows the search buffer in exponentially-sized chunks\n      // between matches, so that nearby matches are fast and don't\n      // require concatenating the whole document (in case we're\n      // searching for something that has tons of matches), but at the\n      // same time, the amount of retries is limited.\n      for (var i = 0; i < chunk; i++) {\n        if (line > last) break\n        var curLine = doc.getLine(line++)\n        string = string == null ? curLine : string + \"\\n\" + curLine\n      }\n      chunk = chunk * 2\n      regexp.lastIndex = start.ch\n      var match = regexp.exec(string)\n      if (match) {\n        var before = string.slice(0, match.index).split(\"\\n\"), inside = match[0].split(\"\\n\")\n        var startLine = start.line + before.length - 1, startCh = before[before.length - 1].length\n        return {from: Pos(startLine, startCh),\n                to: Pos(startLine + inside.length - 1,\n                        inside.length == 1 ? startCh + inside[0].length : inside[inside.length - 1].length),\n                match: match}\n      }\n    }\n  }\n\n  function lastMatchIn(string, regexp, endMargin) {\n    var match, from = 0\n    while (from <= string.length) {\n      regexp.lastIndex = from\n      var newMatch = regexp.exec(string)\n      if (!newMatch) break\n      var end = newMatch.index + newMatch[0].length\n      if (end > string.length - endMargin) break\n      if (!match || end > match.index + match[0].length)\n        match = newMatch\n      from = newMatch.index + 1\n    }\n    return match\n  }\n\n  function searchRegexpBackward(doc, regexp, start) {\n    regexp = ensureFlags(regexp, \"g\")\n    for (var line = start.line, ch = start.ch, first = doc.firstLine(); line >= first; line--, ch = -1) {\n      var string = doc.getLine(line)\n      var match = lastMatchIn(string, regexp, ch < 0 ? 0 : string.length - ch)\n      if (match)\n        return {from: Pos(line, match.index),\n                to: Pos(line, match.index + match[0].length),\n                match: match}\n    }\n  }\n\n  function searchRegexpBackwardMultiline(doc, regexp, start) {\n    if (!maybeMultiline(regexp)) return searchRegexpBackward(doc, regexp, start)\n    regexp = ensureFlags(regexp, \"gm\")\n    var string, chunkSize = 1, endMargin = doc.getLine(start.line).length - start.ch\n    for (var line = start.line, first = doc.firstLine(); line >= first;) {\n      for (var i = 0; i < chunkSize && line >= first; i++) {\n        var curLine = doc.getLine(line--)\n        string = string == null ? curLine : curLine + \"\\n\" + string\n      }\n      chunkSize *= 2\n\n      var match = lastMatchIn(string, regexp, endMargin)\n      if (match) {\n        var before = string.slice(0, match.index).split(\"\\n\"), inside = match[0].split(\"\\n\")\n        var startLine = line + before.length, startCh = before[before.length - 1].length\n        return {from: Pos(startLine, startCh),\n                to: Pos(startLine + inside.length - 1,\n                        inside.length == 1 ? startCh + inside[0].length : inside[inside.length - 1].length),\n                match: match}\n      }\n    }\n  }\n\n  var doFold, noFold\n  if (String.prototype.normalize) {\n    doFold = function(str) { return str.normalize(\"NFD\").toLowerCase() }\n    noFold = function(str) { return str.normalize(\"NFD\") }\n  } else {\n    doFold = function(str) { return str.toLowerCase() }\n    noFold = function(str) { return str }\n  }\n\n  // Maps a position in a case-folded line back to a position in the original line\n  // (compensating for codepoints increasing in number during folding)\n  function adjustPos(orig, folded, pos, foldFunc) {\n    if (orig.length == folded.length) return pos\n    for (var min = 0, max = pos + Math.max(0, orig.length - folded.length);;) {\n      if (min == max) return min\n      var mid = (min + max) >> 1\n      var len = foldFunc(orig.slice(0, mid)).length\n      if (len == pos) return mid\n      else if (len > pos) max = mid\n      else min = mid + 1\n    }\n  }\n\n  function searchStringForward(doc, query, start, caseFold) {\n    // Empty string would match anything and never progress, so we\n    // define it to match nothing instead.\n    if (!query.length) return null\n    var fold = caseFold ? doFold : noFold\n    var lines = fold(query).split(/\\r|\\n\\r?/)\n\n    search: for (var line = start.line, ch = start.ch, last = doc.lastLine() + 1 - lines.length; line <= last; line++, ch = 0) {\n      var orig = doc.getLine(line).slice(ch), string = fold(orig)\n      if (lines.length == 1) {\n        var found = string.indexOf(lines[0])\n        if (found == -1) continue search\n        var start = adjustPos(orig, string, found, fold) + ch\n        return {from: Pos(line, adjustPos(orig, string, found, fold) + ch),\n                to: Pos(line, adjustPos(orig, string, found + lines[0].length, fold) + ch)}\n      } else {\n        var cutFrom = string.length - lines[0].length\n        if (string.slice(cutFrom) != lines[0]) continue search\n        for (var i = 1; i < lines.length - 1; i++)\n          if (fold(doc.getLine(line + i)) != lines[i]) continue search\n        var end = doc.getLine(line + lines.length - 1), endString = fold(end), lastLine = lines[lines.length - 1]\n        if (endString.slice(0, lastLine.length) != lastLine) continue search\n        return {from: Pos(line, adjustPos(orig, string, cutFrom, fold) + ch),\n                to: Pos(line + lines.length - 1, adjustPos(end, endString, lastLine.length, fold))}\n      }\n    }\n  }\n\n  function searchStringBackward(doc, query, start, caseFold) {\n    if (!query.length) return null\n    var fold = caseFold ? doFold : noFold\n    var lines = fold(query).split(/\\r|\\n\\r?/)\n\n    search: for (var line = start.line, ch = start.ch, first = doc.firstLine() - 1 + lines.length; line >= first; line--, ch = -1) {\n      var orig = doc.getLine(line)\n      if (ch > -1) orig = orig.slice(0, ch)\n      var string = fold(orig)\n      if (lines.length == 1) {\n        var found = string.lastIndexOf(lines[0])\n        if (found == -1) continue search\n        return {from: Pos(line, adjustPos(orig, string, found, fold)),\n                to: Pos(line, adjustPos(orig, string, found + lines[0].length, fold))}\n      } else {\n        var lastLine = lines[lines.length - 1]\n        if (string.slice(0, lastLine.length) != lastLine) continue search\n        for (var i = 1, start = line - lines.length + 1; i < lines.length - 1; i++)\n          if (fold(doc.getLine(start + i)) != lines[i]) continue search\n        var top = doc.getLine(line + 1 - lines.length), topString = fold(top)\n        if (topString.slice(topString.length - lines[0].length) != lines[0]) continue search\n        return {from: Pos(line + 1 - lines.length, adjustPos(top, topString, top.length - lines[0].length, fold)),\n                to: Pos(line, adjustPos(orig, string, lastLine.length, fold))}\n      }\n    }\n  }\n\n  function SearchCursor(doc, query, pos, options) {\n    this.atOccurrence = false\n    this.afterEmptyMatch = false\n    this.doc = doc\n    pos = pos ? doc.clipPos(pos) : Pos(0, 0)\n    this.pos = {from: pos, to: pos}\n\n    var caseFold\n    if (typeof options == \"object\") {\n      caseFold = options.caseFold\n    } else { // Backwards compat for when caseFold was the 4th argument\n      caseFold = options\n      options = null\n    }\n\n    if (typeof query == \"string\") {\n      if (caseFold == null) caseFold = false\n      this.matches = function(reverse, pos) {\n        return (reverse ? searchStringBackward : searchStringForward)(doc, query, pos, caseFold)\n      }\n    } else {\n      query = ensureFlags(query, \"gm\")\n      if (!options || options.multiline !== false)\n        this.matches = function(reverse, pos) {\n          return (reverse ? searchRegexpBackwardMultiline : searchRegexpForwardMultiline)(doc, query, pos)\n        }\n      else\n        this.matches = function(reverse, pos) {\n          return (reverse ? searchRegexpBackward : searchRegexpForward)(doc, query, pos)\n        }\n    }\n  }\n\n  SearchCursor.prototype = {\n    findNext: function() {return this.find(false)},\n    findPrevious: function() {return this.find(true)},\n\n    find: function(reverse) {\n      var head = this.doc.clipPos(reverse ? this.pos.from : this.pos.to);\n      if (this.afterEmptyMatch && this.atOccurrence) {\n        // do not return the same 0 width match twice\n        head = Pos(head.line, head.ch)\n        if (reverse) {\n          head.ch--;\n          if (head.ch < 0) {\n            head.line--;\n            head.ch = (this.doc.getLine(head.line) || \"\").length;\n          }\n        } else {\n          head.ch++;\n          if (head.ch > (this.doc.getLine(head.line) || \"\").length) {\n            head.ch = 0;\n            head.line++;\n          }\n        }\n        if (CodeMirror.cmpPos(head, this.doc.clipPos(head)) != 0) {\n           return this.atOccurrence = false\n        }\n      }\n      var result = this.matches(reverse, head)\n      this.afterEmptyMatch = result && CodeMirror.cmpPos(result.from, result.to) == 0\n\n      if (result) {\n        this.pos = result\n        this.atOccurrence = true\n        return this.pos.match || true\n      } else {\n        var end = Pos(reverse ? this.doc.firstLine() : this.doc.lastLine() + 1, 0)\n        this.pos = {from: end, to: end}\n        return this.atOccurrence = false\n      }\n    },\n\n    from: function() {if (this.atOccurrence) return this.pos.from},\n    to: function() {if (this.atOccurrence) return this.pos.to},\n\n    replace: function(newText, origin) {\n      if (!this.atOccurrence) return\n      var lines = CodeMirror.splitLines(newText)\n      this.doc.replaceRange(lines, this.pos.from, this.pos.to, origin)\n      this.pos.to = Pos(this.pos.from.line + lines.length - 1,\n                        lines[lines.length - 1].length + (lines.length == 1 ? this.pos.from.ch : 0))\n    }\n  }\n\n  CodeMirror.defineExtension(\"getSearchCursor\", function(query, pos, caseFold) {\n    return new SearchCursor(this.doc, query, pos, caseFold)\n  })\n  CodeMirror.defineDocExtension(\"getSearchCursor\", function(query, pos, caseFold) {\n    return new SearchCursor(this, query, pos, caseFold)\n  })\n\n  CodeMirror.defineExtension(\"selectMatches\", function(query, caseFold) {\n    var ranges = []\n    var cur = this.getSearchCursor(query, this.getCursor(\"from\"), caseFold)\n    while (cur.findNext()) {\n      if (CodeMirror.cmpPos(cur.to(), this.getCursor(\"to\")) > 0) break\n      ranges.push({anchor: cur.from(), head: cur.to()})\n    }\n    if (ranges.length)\n      this.setSelections(ranges, 0)\n  })\n});\n","// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/5/LICENSE\n\n// Because sometimes you need to mark the selected *text*.\n//\n// Adds an option 'styleSelectedText' which, when enabled, gives\n// selected text the CSS class given as option value, or\n// \"CodeMirror-selectedtext\" when the value is not a string.\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.defineOption(\"styleSelectedText\", false, function(cm, val, old) {\n    var prev = old && old != CodeMirror.Init;\n    if (val && !prev) {\n      cm.state.markedSelection = [];\n      cm.state.markedSelectionStyle = typeof val == \"string\" ? val : \"CodeMirror-selectedtext\";\n      reset(cm);\n      cm.on(\"cursorActivity\", onCursorActivity);\n      cm.on(\"change\", onChange);\n    } else if (!val && prev) {\n      cm.off(\"cursorActivity\", onCursorActivity);\n      cm.off(\"change\", onChange);\n      clear(cm);\n      cm.state.markedSelection = cm.state.markedSelectionStyle = null;\n    }\n  });\n\n  function onCursorActivity(cm) {\n    if (cm.state.markedSelection)\n      cm.operation(function() { update(cm); });\n  }\n\n  function onChange(cm) {\n    if (cm.state.markedSelection && cm.state.markedSelection.length)\n      cm.operation(function() { clear(cm); });\n  }\n\n  var CHUNK_SIZE = 8;\n  var Pos = CodeMirror.Pos;\n  var cmp = CodeMirror.cmpPos;\n\n  function coverRange(cm, from, to, addAt) {\n    if (cmp(from, to) == 0) return;\n    var array = cm.state.markedSelection;\n    var cls = cm.state.markedSelectionStyle;\n    for (var line = from.line;;) {\n      var start = line == from.line ? from : Pos(line, 0);\n      var endLine = line + CHUNK_SIZE, atEnd = endLine >= to.line;\n      var end = atEnd ? to : Pos(endLine, 0);\n      var mark = cm.markText(start, end, {className: cls});\n      if (addAt == null) array.push(mark);\n      else array.splice(addAt++, 0, mark);\n      if (atEnd) break;\n      line = endLine;\n    }\n  }\n\n  function clear(cm) {\n    var array = cm.state.markedSelection;\n    for (var i = 0; i < array.length; ++i) array[i].clear();\n    array.length = 0;\n  }\n\n  function reset(cm) {\n    clear(cm);\n    var ranges = cm.listSelections();\n    for (var i = 0; i < ranges.length; i++)\n      coverRange(cm, ranges[i].from(), ranges[i].to());\n  }\n\n  function update(cm) {\n    if (!cm.somethingSelected()) return clear(cm);\n    if (cm.listSelections().length > 1) return reset(cm);\n\n    var from = cm.getCursor(\"start\"), to = cm.getCursor(\"end\");\n\n    var array = cm.state.markedSelection;\n    if (!array.length) return coverRange(cm, from, to);\n\n    var coverStart = array[0].find(), coverEnd = array[array.length - 1].find();\n    if (!coverStart || !coverEnd || to.line - from.line <= CHUNK_SIZE ||\n        cmp(from, coverEnd.to) >= 0 || cmp(to, coverStart.from) <= 0)\n      return reset(cm);\n\n    while (cmp(from, coverStart.from) > 0) {\n      array.shift().clear();\n      coverStart = array[0].find();\n    }\n    if (cmp(from, coverStart.from) < 0) {\n      if (coverStart.to.line - from.line < CHUNK_SIZE) {\n        array.shift().clear();\n        coverRange(cm, from, coverStart.to, 0);\n      } else {\n        coverRange(cm, from, coverStart.from, 0);\n      }\n    }\n\n    while (cmp(to, coverEnd.to) < 0) {\n      array.pop().clear();\n      coverEnd = array[array.length - 1].find();\n    }\n    if (cmp(to, coverEnd.to) > 0) {\n      if (to.line - coverEnd.from.line < CHUNK_SIZE) {\n        array.pop().clear();\n        coverRange(cm, coverEnd.from, to);\n      } else {\n        coverRange(cm, coverEnd.to, to);\n      }\n    }\n  }\n});\n","// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/5/LICENSE\n\n// This is CodeMirror (https://codemirror.net/5), a code editor\n// implemented in JavaScript on top of the browser's DOM.\n//\n// You can find some technical background for some of the code below\n// at http://marijnhaverbeke.nl/blog/#cm-internals .\n\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n  typeof define === 'function' && define.amd ? define(factory) :\n  (global = global || self, global.CodeMirror = factory());\n}(this, (function () { 'use strict';\n\n  // Kludges for bugs and behavior differences that can't be feature\n  // detected are enabled based on userAgent etc sniffing.\n  var userAgent = navigator.userAgent;\n  var platform = navigator.platform;\n\n  var gecko = /gecko\\/\\d/i.test(userAgent);\n  var ie_upto10 = /MSIE \\d/.test(userAgent);\n  var ie_11up = /Trident\\/(?:[7-9]|\\d{2,})\\..*rv:(\\d+)/.exec(userAgent);\n  var edge = /Edge\\/(\\d+)/.exec(userAgent);\n  var ie = ie_upto10 || ie_11up || edge;\n  var ie_version = ie && (ie_upto10 ? document.documentMode || 6 : +(edge || ie_11up)[1]);\n  var webkit = !edge && /WebKit\\//.test(userAgent);\n  var qtwebkit = webkit && /Qt\\/\\d+\\.\\d+/.test(userAgent);\n  var chrome = !edge && /Chrome\\/(\\d+)/.exec(userAgent);\n  var chrome_version = chrome && +chrome[1];\n  var presto = /Opera\\//.test(userAgent);\n  var safari = /Apple Computer/.test(navigator.vendor);\n  var mac_geMountainLion = /Mac OS X 1\\d\\D([8-9]|\\d\\d)\\D/.test(userAgent);\n  var phantom = /PhantomJS/.test(userAgent);\n\n  var ios = safari && (/Mobile\\/\\w+/.test(userAgent) || navigator.maxTouchPoints > 2);\n  var android = /Android/.test(userAgent);\n  // This is woefully incomplete. Suggestions for alternative methods welcome.\n  var mobile = ios || android || /webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(userAgent);\n  var mac = ios || /Mac/.test(platform);\n  var chromeOS = /\\bCrOS\\b/.test(userAgent);\n  var windows = /win/i.test(platform);\n\n  var presto_version = presto && userAgent.match(/Version\\/(\\d*\\.\\d*)/);\n  if (presto_version) { presto_version = Number(presto_version[1]); }\n  if (presto_version && presto_version >= 15) { presto = false; webkit = true; }\n  // Some browsers use the wrong event properties to signal cmd/ctrl on OS X\n  var flipCtrlCmd = mac && (qtwebkit || presto && (presto_version == null || presto_version < 12.11));\n  var captureRightClick = gecko || (ie && ie_version >= 9);\n\n  function classTest(cls) { return new RegExp(\"(^|\\\\s)\" + cls + \"(?:$|\\\\s)\\\\s*\") }\n\n  var rmClass = function(node, cls) {\n    var current = node.className;\n    var match = classTest(cls).exec(current);\n    if (match) {\n      var after = current.slice(match.index + match[0].length);\n      node.className = current.slice(0, match.index) + (after ? match[1] + after : \"\");\n    }\n  };\n\n  function removeChildren(e) {\n    for (var count = e.childNodes.length; count > 0; --count)\n      { e.removeChild(e.firstChild); }\n    return e\n  }\n\n  function removeChildrenAndAdd(parent, e) {\n    return removeChildren(parent).appendChild(e)\n  }\n\n  function elt(tag, content, className, style) {\n    var e = document.createElement(tag);\n    if (className) { e.className = className; }\n    if (style) { e.style.cssText = style; }\n    if (typeof content == \"string\") { e.appendChild(document.createTextNode(content)); }\n    else if (content) { for (var i = 0; i < content.length; ++i) { e.appendChild(content[i]); } }\n    return e\n  }\n  // wrapper for elt, which removes the elt from the accessibility tree\n  function eltP(tag, content, className, style) {\n    var e = elt(tag, content, className, style);\n    e.setAttribute(\"role\", \"presentation\");\n    return e\n  }\n\n  var range;\n  if (document.createRange) { range = function(node, start, end, endNode) {\n    var r = document.createRange();\n    r.setEnd(endNode || node, end);\n    r.setStart(node, start);\n    return r\n  }; }\n  else { range = function(node, start, end) {\n    var r = document.body.createTextRange();\n    try { r.moveToElementText(node.parentNode); }\n    catch(e) { return r }\n    r.collapse(true);\n    r.moveEnd(\"character\", end);\n    r.moveStart(\"character\", start);\n    return r\n  }; }\n\n  function contains(parent, child) {\n    if (child.nodeType == 3) // Android browser always returns false when child is a textnode\n      { child = child.parentNode; }\n    if (parent.contains)\n      { return parent.contains(child) }\n    do {\n      if (child.nodeType == 11) { child = child.host; }\n      if (child == parent) { return true }\n    } while (child = child.parentNode)\n  }\n\n  function activeElt(rootNode) {\n    // IE and Edge may throw an \"Unspecified Error\" when accessing document.activeElement.\n    // IE < 10 will throw when accessed while the page is loading or in an iframe.\n    // IE > 9 and Edge will throw when accessed in an iframe if document.body is unavailable.\n    var doc = rootNode.ownerDocument || rootNode;\n    var activeElement;\n    try {\n      activeElement = rootNode.activeElement;\n    } catch(e) {\n      activeElement = doc.body || null;\n    }\n    while (activeElement && activeElement.shadowRoot && activeElement.shadowRoot.activeElement)\n      { activeElement = activeElement.shadowRoot.activeElement; }\n    return activeElement\n  }\n\n  function addClass(node, cls) {\n    var current = node.className;\n    if (!classTest(cls).test(current)) { node.className += (current ? \" \" : \"\") + cls; }\n  }\n  function joinClasses(a, b) {\n    var as = a.split(\" \");\n    for (var i = 0; i < as.length; i++)\n      { if (as[i] && !classTest(as[i]).test(b)) { b += \" \" + as[i]; } }\n    return b\n  }\n\n  var selectInput = function(node) { node.select(); };\n  if (ios) // Mobile Safari apparently has a bug where select() is broken.\n    { selectInput = function(node) { node.selectionStart = 0; node.selectionEnd = node.value.length; }; }\n  else if (ie) // Suppress mysterious IE10 errors\n    { selectInput = function(node) { try { node.select(); } catch(_e) {} }; }\n\n  function doc(cm) { return cm.display.wrapper.ownerDocument }\n\n  function root(cm) {\n    return rootNode(cm.display.wrapper)\n  }\n\n  function rootNode(element) {\n    // Detect modern browsers (2017+).\n    return element.getRootNode ? element.getRootNode() : element.ownerDocument\n  }\n\n  function win(cm) { return doc(cm).defaultView }\n\n  function bind(f) {\n    var args = Array.prototype.slice.call(arguments, 1);\n    return function(){return f.apply(null, args)}\n  }\n\n  function copyObj(obj, target, overwrite) {\n    if (!target) { target = {}; }\n    for (var prop in obj)\n      { if (Object.prototype.hasOwnProperty.call(obj, prop) && (overwrite !== false || !Object.prototype.hasOwnProperty.call(target, prop)))\n        { target[prop] = obj[prop]; } }\n    return target\n  }\n\n  // Counts the column offset in a string, taking tabs into account.\n  // Used mostly to find indentation.\n  function countColumn(string, end, tabSize, startIndex, startValue) {\n    if (end == null) {\n      end = string.search(/[^\\s\\u00a0]/);\n      if (end == -1) { end = string.length; }\n    }\n    for (var i = startIndex || 0, n = startValue || 0;;) {\n      var nextTab = string.indexOf(\"\\t\", i);\n      if (nextTab < 0 || nextTab >= end)\n        { return n + (end - i) }\n      n += nextTab - i;\n      n += tabSize - (n % tabSize);\n      i = nextTab + 1;\n    }\n  }\n\n  var Delayed = function() {\n    this.id = null;\n    this.f = null;\n    this.time = 0;\n    this.handler = bind(this.onTimeout, this);\n  };\n  Delayed.prototype.onTimeout = function (self) {\n    self.id = 0;\n    if (self.time <= +new Date) {\n      self.f();\n    } else {\n      setTimeout(self.handler, self.time - +new Date);\n    }\n  };\n  Delayed.prototype.set = function (ms, f) {\n    this.f = f;\n    var time = +new Date + ms;\n    if (!this.id || time < this.time) {\n      clearTimeout(this.id);\n      this.id = setTimeout(this.handler, ms);\n      this.time = time;\n    }\n  };\n\n  function indexOf(array, elt) {\n    for (var i = 0; i < array.length; ++i)\n      { if (array[i] == elt) { return i } }\n    return -1\n  }\n\n  // Number of pixels added to scroller and sizer to hide scrollbar\n  var scrollerGap = 50;\n\n  // Returned or thrown by various protocols to signal 'I'm not\n  // handling this'.\n  var Pass = {toString: function(){return \"CodeMirror.Pass\"}};\n\n  // Reused option objects for setSelection & friends\n  var sel_dontScroll = {scroll: false}, sel_mouse = {origin: \"*mouse\"}, sel_move = {origin: \"+move\"};\n\n  // The inverse of countColumn -- find the offset that corresponds to\n  // a particular column.\n  function findColumn(string, goal, tabSize) {\n    for (var pos = 0, col = 0;;) {\n      var nextTab = string.indexOf(\"\\t\", pos);\n      if (nextTab == -1) { nextTab = string.length; }\n      var skipped = nextTab - pos;\n      if (nextTab == string.length || col + skipped >= goal)\n        { return pos + Math.min(skipped, goal - col) }\n      col += nextTab - pos;\n      col += tabSize - (col % tabSize);\n      pos = nextTab + 1;\n      if (col >= goal) { return pos }\n    }\n  }\n\n  var spaceStrs = [\"\"];\n  function spaceStr(n) {\n    while (spaceStrs.length <= n)\n      { spaceStrs.push(lst(spaceStrs) + \" \"); }\n    return spaceStrs[n]\n  }\n\n  function lst(arr) { return arr[arr.length-1] }\n\n  function map(array, f) {\n    var out = [];\n    for (var i = 0; i < array.length; i++) { out[i] = f(array[i], i); }\n    return out\n  }\n\n  function insertSorted(array, value, score) {\n    var pos = 0, priority = score(value);\n    while (pos < array.length && score(array[pos]) <= priority) { pos++; }\n    array.splice(pos, 0, value);\n  }\n\n  function nothing() {}\n\n  function createObj(base, props) {\n    var inst;\n    if (Object.create) {\n      inst = Object.create(base);\n    } else {\n      nothing.prototype = base;\n      inst = new nothing();\n    }\n    if (props) { copyObj(props, inst); }\n    return inst\n  }\n\n  var nonASCIISingleCaseWordChar = /[\\u00df\\u0587\\u0590-\\u05f4\\u0600-\\u06ff\\u3040-\\u309f\\u30a0-\\u30ff\\u3400-\\u4db5\\u4e00-\\u9fcc\\uac00-\\ud7af]/;\n  function isWordCharBasic(ch) {\n    return /\\w/.test(ch) || ch > \"\\x80\" &&\n      (ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch))\n  }\n  function isWordChar(ch, helper) {\n    if (!helper) { return isWordCharBasic(ch) }\n    if (helper.source.indexOf(\"\\\\w\") > -1 && isWordCharBasic(ch)) { return true }\n    return helper.test(ch)\n  }\n\n  function isEmpty(obj) {\n    for (var n in obj) { if (obj.hasOwnProperty(n) && obj[n]) { return false } }\n    return true\n  }\n\n  // Extending unicode characters. A series of a non-extending char +\n  // any number of extending chars is treated as a single unit as far\n  // as editing and measuring is concerned. This is not fully correct,\n  // since some scripts/fonts/browsers also treat other configurations\n  // of code points as a group.\n  var extendingChars = /[\\u0300-\\u036f\\u0483-\\u0489\\u0591-\\u05bd\\u05bf\\u05c1\\u05c2\\u05c4\\u05c5\\u05c7\\u0610-\\u061a\\u064b-\\u065e\\u0670\\u06d6-\\u06dc\\u06de-\\u06e4\\u06e7\\u06e8\\u06ea-\\u06ed\\u0711\\u0730-\\u074a\\u07a6-\\u07b0\\u07eb-\\u07f3\\u0816-\\u0819\\u081b-\\u0823\\u0825-\\u0827\\u0829-\\u082d\\u0900-\\u0902\\u093c\\u0941-\\u0948\\u094d\\u0951-\\u0955\\u0962\\u0963\\u0981\\u09bc\\u09be\\u09c1-\\u09c4\\u09cd\\u09d7\\u09e2\\u09e3\\u0a01\\u0a02\\u0a3c\\u0a41\\u0a42\\u0a47\\u0a48\\u0a4b-\\u0a4d\\u0a51\\u0a70\\u0a71\\u0a75\\u0a81\\u0a82\\u0abc\\u0ac1-\\u0ac5\\u0ac7\\u0ac8\\u0acd\\u0ae2\\u0ae3\\u0b01\\u0b3c\\u0b3e\\u0b3f\\u0b41-\\u0b44\\u0b4d\\u0b56\\u0b57\\u0b62\\u0b63\\u0b82\\u0bbe\\u0bc0\\u0bcd\\u0bd7\\u0c3e-\\u0c40\\u0c46-\\u0c48\\u0c4a-\\u0c4d\\u0c55\\u0c56\\u0c62\\u0c63\\u0cbc\\u0cbf\\u0cc2\\u0cc6\\u0ccc\\u0ccd\\u0cd5\\u0cd6\\u0ce2\\u0ce3\\u0d3e\\u0d41-\\u0d44\\u0d4d\\u0d57\\u0d62\\u0d63\\u0dca\\u0dcf\\u0dd2-\\u0dd4\\u0dd6\\u0ddf\\u0e31\\u0e34-\\u0e3a\\u0e47-\\u0e4e\\u0eb1\\u0eb4-\\u0eb9\\u0ebb\\u0ebc\\u0ec8-\\u0ecd\\u0f18\\u0f19\\u0f35\\u0f37\\u0f39\\u0f71-\\u0f7e\\u0f80-\\u0f84\\u0f86\\u0f87\\u0f90-\\u0f97\\u0f99-\\u0fbc\\u0fc6\\u102d-\\u1030\\u1032-\\u1037\\u1039\\u103a\\u103d\\u103e\\u1058\\u1059\\u105e-\\u1060\\u1071-\\u1074\\u1082\\u1085\\u1086\\u108d\\u109d\\u135f\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17b7-\\u17bd\\u17c6\\u17c9-\\u17d3\\u17dd\\u180b-\\u180d\\u18a9\\u1920-\\u1922\\u1927\\u1928\\u1932\\u1939-\\u193b\\u1a17\\u1a18\\u1a56\\u1a58-\\u1a5e\\u1a60\\u1a62\\u1a65-\\u1a6c\\u1a73-\\u1a7c\\u1a7f\\u1b00-\\u1b03\\u1b34\\u1b36-\\u1b3a\\u1b3c\\u1b42\\u1b6b-\\u1b73\\u1b80\\u1b81\\u1ba2-\\u1ba5\\u1ba8\\u1ba9\\u1c2c-\\u1c33\\u1c36\\u1c37\\u1cd0-\\u1cd2\\u1cd4-\\u1ce0\\u1ce2-\\u1ce8\\u1ced\\u1dc0-\\u1de6\\u1dfd-\\u1dff\\u200c\\u200d\\u20d0-\\u20f0\\u2cef-\\u2cf1\\u2de0-\\u2dff\\u302a-\\u302f\\u3099\\u309a\\ua66f-\\ua672\\ua67c\\ua67d\\ua6f0\\ua6f1\\ua802\\ua806\\ua80b\\ua825\\ua826\\ua8c4\\ua8e0-\\ua8f1\\ua926-\\ua92d\\ua947-\\ua951\\ua980-\\ua982\\ua9b3\\ua9b6-\\ua9b9\\ua9bc\\uaa29-\\uaa2e\\uaa31\\uaa32\\uaa35\\uaa36\\uaa43\\uaa4c\\uaab0\\uaab2-\\uaab4\\uaab7\\uaab8\\uaabe\\uaabf\\uaac1\\uabe5\\uabe8\\uabed\\udc00-\\udfff\\ufb1e\\ufe00-\\ufe0f\\ufe20-\\ufe26\\uff9e\\uff9f]/;\n  function isExtendingChar(ch) { return ch.charCodeAt(0) >= 768 && extendingChars.test(ch) }\n\n  // Returns a number from the range [`0`; `str.length`] unless `pos` is outside that range.\n  function skipExtendingChars(str, pos, dir) {\n    while ((dir < 0 ? pos > 0 : pos < str.length) && isExtendingChar(str.charAt(pos))) { pos += dir; }\n    return pos\n  }\n\n  // Returns the value from the range [`from`; `to`] that satisfies\n  // `pred` and is closest to `from`. Assumes that at least `to`\n  // satisfies `pred`. Supports `from` being greater than `to`.\n  function findFirst(pred, from, to) {\n    // At any point we are certain `to` satisfies `pred`, don't know\n    // whether `from` does.\n    var dir = from > to ? -1 : 1;\n    for (;;) {\n      if (from == to) { return from }\n      var midF = (from + to) / 2, mid = dir < 0 ? Math.ceil(midF) : Math.floor(midF);\n      if (mid == from) { return pred(mid) ? from : to }\n      if (pred(mid)) { to = mid; }\n      else { from = mid + dir; }\n    }\n  }\n\n  // BIDI HELPERS\n\n  function iterateBidiSections(order, from, to, f) {\n    if (!order) { return f(from, to, \"ltr\", 0) }\n    var found = false;\n    for (var i = 0; i < order.length; ++i) {\n      var part = order[i];\n      if (part.from < to && part.to > from || from == to && part.to == from) {\n        f(Math.max(part.from, from), Math.min(part.to, to), part.level == 1 ? \"rtl\" : \"ltr\", i);\n        found = true;\n      }\n    }\n    if (!found) { f(from, to, \"ltr\"); }\n  }\n\n  var bidiOther = null;\n  function getBidiPartAt(order, ch, sticky) {\n    var found;\n    bidiOther = null;\n    for (var i = 0; i < order.length; ++i) {\n      var cur = order[i];\n      if (cur.from < ch && cur.to > ch) { return i }\n      if (cur.to == ch) {\n        if (cur.from != cur.to && sticky == \"before\") { found = i; }\n        else { bidiOther = i; }\n      }\n      if (cur.from == ch) {\n        if (cur.from != cur.to && sticky != \"before\") { found = i; }\n        else { bidiOther = i; }\n      }\n    }\n    return found != null ? found : bidiOther\n  }\n\n  // Bidirectional ordering algorithm\n  // See http://unicode.org/reports/tr9/tr9-13.html for the algorithm\n  // that this (partially) implements.\n\n  // One-char codes used for character types:\n  // L (L):   Left-to-Right\n  // R (R):   Right-to-Left\n  // r (AL):  Right-to-Left Arabic\n  // 1 (EN):  European Number\n  // + (ES):  European Number Separator\n  // % (ET):  European Number Terminator\n  // n (AN):  Arabic Number\n  // , (CS):  Common Number Separator\n  // m (NSM): Non-Spacing Mark\n  // b (BN):  Boundary Neutral\n  // s (B):   Paragraph Separator\n  // t (S):   Segment Separator\n  // w (WS):  Whitespace\n  // N (ON):  Other Neutrals\n\n  // Returns null if characters are ordered as they appear\n  // (left-to-right), or an array of sections ({from, to, level}\n  // objects) in the order in which they occur visually.\n  var bidiOrdering = (function() {\n    // Character types for codepoints 0 to 0xff\n    var lowTypes = \"bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN\";\n    // Character types for codepoints 0x600 to 0x6f9\n    var arabicTypes = \"nnnnnnNNr%%r,rNNmmmmmmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmmmnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmnNmmmmmmrrmmNmmmmrr1111111111\";\n    function charType(code) {\n      if (code <= 0xf7) { return lowTypes.charAt(code) }\n      else if (0x590 <= code && code <= 0x5f4) { return \"R\" }\n      else if (0x600 <= code && code <= 0x6f9) { return arabicTypes.charAt(code - 0x600) }\n      else if (0x6ee <= code && code <= 0x8ac) { return \"r\" }\n      else if (0x2000 <= code && code <= 0x200b) { return \"w\" }\n      else if (code == 0x200c) { return \"b\" }\n      else { return \"L\" }\n    }\n\n    var bidiRE = /[\\u0590-\\u05f4\\u0600-\\u06ff\\u0700-\\u08ac]/;\n    var isNeutral = /[stwN]/, isStrong = /[LRr]/, countsAsLeft = /[Lb1n]/, countsAsNum = /[1n]/;\n\n    function BidiSpan(level, from, to) {\n      this.level = level;\n      this.from = from; this.to = to;\n    }\n\n    return function(str, direction) {\n      var outerType = direction == \"ltr\" ? \"L\" : \"R\";\n\n      if (str.length == 0 || direction == \"ltr\" && !bidiRE.test(str)) { return false }\n      var len = str.length, types = [];\n      for (var i = 0; i < len; ++i)\n        { types.push(charType(str.charCodeAt(i))); }\n\n      // W1. Examine each non-spacing mark (NSM) in the level run, and\n      // change the type of the NSM to the type of the previous\n      // character. If the NSM is at the start of the level run, it will\n      // get the type of sor.\n      for (var i$1 = 0, prev = outerType; i$1 < len; ++i$1) {\n        var type = types[i$1];\n        if (type == \"m\") { types[i$1] = prev; }\n        else { prev = type; }\n      }\n\n      // W2. Search backwards from each instance of a European number\n      // until the first strong type (R, L, AL, or sor) is found. If an\n      // AL is found, change the type of the European number to Arabic\n      // number.\n      // W3. Change all ALs to R.\n      for (var i$2 = 0, cur = outerType; i$2 < len; ++i$2) {\n        var type$1 = types[i$2];\n        if (type$1 == \"1\" && cur == \"r\") { types[i$2] = \"n\"; }\n        else if (isStrong.test(type$1)) { cur = type$1; if (type$1 == \"r\") { types[i$2] = \"R\"; } }\n      }\n\n      // W4. A single European separator between two European numbers\n      // changes to a European number. A single common separator between\n      // two numbers of the same type changes to that type.\n      for (var i$3 = 1, prev$1 = types[0]; i$3 < len - 1; ++i$3) {\n        var type$2 = types[i$3];\n        if (type$2 == \"+\" && prev$1 == \"1\" && types[i$3+1] == \"1\") { types[i$3] = \"1\"; }\n        else if (type$2 == \",\" && prev$1 == types[i$3+1] &&\n                 (prev$1 == \"1\" || prev$1 == \"n\")) { types[i$3] = prev$1; }\n        prev$1 = type$2;\n      }\n\n      // W5. A sequence of European terminators adjacent to European\n      // numbers changes to all European numbers.\n      // W6. Otherwise, separators and terminators change to Other\n      // Neutral.\n      for (var i$4 = 0; i$4 < len; ++i$4) {\n        var type$3 = types[i$4];\n        if (type$3 == \",\") { types[i$4] = \"N\"; }\n        else if (type$3 == \"%\") {\n          var end = (void 0);\n          for (end = i$4 + 1; end < len && types[end] == \"%\"; ++end) {}\n          var replace = (i$4 && types[i$4-1] == \"!\") || (end < len && types[end] == \"1\") ? \"1\" : \"N\";\n          for (var j = i$4; j < end; ++j) { types[j] = replace; }\n          i$4 = end - 1;\n        }\n      }\n\n      // W7. Search backwards from each instance of a European number\n      // until the first strong type (R, L, or sor) is found. If an L is\n      // found, then change the type of the European number to L.\n      for (var i$5 = 0, cur$1 = outerType; i$5 < len; ++i$5) {\n        var type$4 = types[i$5];\n        if (cur$1 == \"L\" && type$4 == \"1\") { types[i$5] = \"L\"; }\n        else if (isStrong.test(type$4)) { cur$1 = type$4; }\n      }\n\n      // N1. A sequence of neutrals takes the direction of the\n      // surrounding strong text if the text on both sides has the same\n      // direction. European and Arabic numbers act as if they were R in\n      // terms of their influence on neutrals. Start-of-level-run (sor)\n      // and end-of-level-run (eor) are used at level run boundaries.\n      // N2. Any remaining neutrals take the embedding direction.\n      for (var i$6 = 0; i$6 < len; ++i$6) {\n        if (isNeutral.test(types[i$6])) {\n          var end$1 = (void 0);\n          for (end$1 = i$6 + 1; end$1 < len && isNeutral.test(types[end$1]); ++end$1) {}\n          var before = (i$6 ? types[i$6-1] : outerType) == \"L\";\n          var after = (end$1 < len ? types[end$1] : outerType) == \"L\";\n          var replace$1 = before == after ? (before ? \"L\" : \"R\") : outerType;\n          for (var j$1 = i$6; j$1 < end$1; ++j$1) { types[j$1] = replace$1; }\n          i$6 = end$1 - 1;\n        }\n      }\n\n      // Here we depart from the documented algorithm, in order to avoid\n      // building up an actual levels array. Since there are only three\n      // levels (0, 1, 2) in an implementation that doesn't take\n      // explicit embedding into account, we can build up the order on\n      // the fly, without following the level-based algorithm.\n      var order = [], m;\n      for (var i$7 = 0; i$7 < len;) {\n        if (countsAsLeft.test(types[i$7])) {\n          var start = i$7;\n          for (++i$7; i$7 < len && countsAsLeft.test(types[i$7]); ++i$7) {}\n          order.push(new BidiSpan(0, start, i$7));\n        } else {\n          var pos = i$7, at = order.length, isRTL = direction == \"rtl\" ? 1 : 0;\n          for (++i$7; i$7 < len && types[i$7] != \"L\"; ++i$7) {}\n          for (var j$2 = pos; j$2 < i$7;) {\n            if (countsAsNum.test(types[j$2])) {\n              if (pos < j$2) { order.splice(at, 0, new BidiSpan(1, pos, j$2)); at += isRTL; }\n              var nstart = j$2;\n              for (++j$2; j$2 < i$7 && countsAsNum.test(types[j$2]); ++j$2) {}\n              order.splice(at, 0, new BidiSpan(2, nstart, j$2));\n              at += isRTL;\n              pos = j$2;\n            } else { ++j$2; }\n          }\n          if (pos < i$7) { order.splice(at, 0, new BidiSpan(1, pos, i$7)); }\n        }\n      }\n      if (direction == \"ltr\") {\n        if (order[0].level == 1 && (m = str.match(/^\\s+/))) {\n          order[0].from = m[0].length;\n          order.unshift(new BidiSpan(0, 0, m[0].length));\n        }\n        if (lst(order).level == 1 && (m = str.match(/\\s+$/))) {\n          lst(order).to -= m[0].length;\n          order.push(new BidiSpan(0, len - m[0].length, len));\n        }\n      }\n\n      return direction == \"rtl\" ? order.reverse() : order\n    }\n  })();\n\n  // Get the bidi ordering for the given line (and cache it). Returns\n  // false for lines that are fully left-to-right, and an array of\n  // BidiSpan objects otherwise.\n  function getOrder(line, direction) {\n    var order = line.order;\n    if (order == null) { order = line.order = bidiOrdering(line.text, direction); }\n    return order\n  }\n\n  // EVENT HANDLING\n\n  // Lightweight event framework. on/off also work on DOM nodes,\n  // registering native DOM handlers.\n\n  var noHandlers = [];\n\n  var on = function(emitter, type, f) {\n    if (emitter.addEventListener) {\n      emitter.addEventListener(type, f, false);\n    } else if (emitter.attachEvent) {\n      emitter.attachEvent(\"on\" + type, f);\n    } else {\n      var map = emitter._handlers || (emitter._handlers = {});\n      map[type] = (map[type] || noHandlers).concat(f);\n    }\n  };\n\n  function getHandlers(emitter, type) {\n    return emitter._handlers && emitter._handlers[type] || noHandlers\n  }\n\n  function off(emitter, type, f) {\n    if (emitter.removeEventListener) {\n      emitter.removeEventListener(type, f, false);\n    } else if (emitter.detachEvent) {\n      emitter.detachEvent(\"on\" + type, f);\n    } else {\n      var map = emitter._handlers, arr = map && map[type];\n      if (arr) {\n        var index = indexOf(arr, f);\n        if (index > -1)\n          { map[type] = arr.slice(0, index).concat(arr.slice(index + 1)); }\n      }\n    }\n  }\n\n  function signal(emitter, type /*, values...*/) {\n    var handlers = getHandlers(emitter, type);\n    if (!handlers.length) { return }\n    var args = Array.prototype.slice.call(arguments, 2);\n    for (var i = 0; i < handlers.length; ++i) { handlers[i].apply(null, args); }\n  }\n\n  // The DOM events that CodeMirror handles can be overridden by\n  // registering a (non-DOM) handler on the editor for the event name,\n  // and preventDefault-ing the event in that handler.\n  function signalDOMEvent(cm, e, override) {\n    if (typeof e == \"string\")\n      { e = {type: e, preventDefault: function() { this.defaultPrevented = true; }}; }\n    signal(cm, override || e.type, cm, e);\n    return e_defaultPrevented(e) || e.codemirrorIgnore\n  }\n\n  function signalCursorActivity(cm) {\n    var arr = cm._handlers && cm._handlers.cursorActivity;\n    if (!arr) { return }\n    var set = cm.curOp.cursorActivityHandlers || (cm.curOp.cursorActivityHandlers = []);\n    for (var i = 0; i < arr.length; ++i) { if (indexOf(set, arr[i]) == -1)\n      { set.push(arr[i]); } }\n  }\n\n  function hasHandler(emitter, type) {\n    return getHandlers(emitter, type).length > 0\n  }\n\n  // Add on and off methods to a constructor's prototype, to make\n  // registering events on such objects more convenient.\n  function eventMixin(ctor) {\n    ctor.prototype.on = function(type, f) {on(this, type, f);};\n    ctor.prototype.off = function(type, f) {off(this, type, f);};\n  }\n\n  // Due to the fact that we still support jurassic IE versions, some\n  // compatibility wrappers are needed.\n\n  function e_preventDefault(e) {\n    if (e.preventDefault) { e.preventDefault(); }\n    else { e.returnValue = false; }\n  }\n  function e_stopPropagation(e) {\n    if (e.stopPropagation) { e.stopPropagation(); }\n    else { e.cancelBubble = true; }\n  }\n  function e_defaultPrevented(e) {\n    return e.defaultPrevented != null ? e.defaultPrevented : e.returnValue == false\n  }\n  function e_stop(e) {e_preventDefault(e); e_stopPropagation(e);}\n\n  function e_target(e) {return e.target || e.srcElement}\n  function e_button(e) {\n    var b = e.which;\n    if (b == null) {\n      if (e.button & 1) { b = 1; }\n      else if (e.button & 2) { b = 3; }\n      else if (e.button & 4) { b = 2; }\n    }\n    if (mac && e.ctrlKey && b == 1) { b = 3; }\n    return b\n  }\n\n  // Detect drag-and-drop\n  var dragAndDrop = function() {\n    // There is *some* kind of drag-and-drop support in IE6-8, but I\n    // couldn't get it to work yet.\n    if (ie && ie_version < 9) { return false }\n    var div = elt('div');\n    return \"draggable\" in div || \"dragDrop\" in div\n  }();\n\n  var zwspSupported;\n  function zeroWidthElement(measure) {\n    if (zwspSupported == null) {\n      var test = elt(\"span\", \"\\u200b\");\n      removeChildrenAndAdd(measure, elt(\"span\", [test, document.createTextNode(\"x\")]));\n      if (measure.firstChild.offsetHeight != 0)\n        { zwspSupported = test.offsetWidth <= 1 && test.offsetHeight > 2 && !(ie && ie_version < 8); }\n    }\n    var node = zwspSupported ? elt(\"span\", \"\\u200b\") :\n      elt(\"span\", \"\\u00a0\", null, \"display: inline-block; width: 1px; margin-right: -1px\");\n    node.setAttribute(\"cm-text\", \"\");\n    return node\n  }\n\n  // Feature-detect IE's crummy client rect reporting for bidi text\n  var badBidiRects;\n  function hasBadBidiRects(measure) {\n    if (badBidiRects != null) { return badBidiRects }\n    var txt = removeChildrenAndAdd(measure, document.createTextNode(\"A\\u062eA\"));\n    var r0 = range(txt, 0, 1).getBoundingClientRect();\n    var r1 = range(txt, 1, 2).getBoundingClientRect();\n    removeChildren(measure);\n    if (!r0 || r0.left == r0.right) { return false } // Safari returns null in some cases (#2780)\n    return badBidiRects = (r1.right - r0.right < 3)\n  }\n\n  // See if \"\".split is the broken IE version, if so, provide an\n  // alternative way to split lines.\n  var splitLinesAuto = \"\\n\\nb\".split(/\\n/).length != 3 ? function (string) {\n    var pos = 0, result = [], l = string.length;\n    while (pos <= l) {\n      var nl = string.indexOf(\"\\n\", pos);\n      if (nl == -1) { nl = string.length; }\n      var line = string.slice(pos, string.charAt(nl - 1) == \"\\r\" ? nl - 1 : nl);\n      var rt = line.indexOf(\"\\r\");\n      if (rt != -1) {\n        result.push(line.slice(0, rt));\n        pos += rt + 1;\n      } else {\n        result.push(line);\n        pos = nl + 1;\n      }\n    }\n    return result\n  } : function (string) { return string.split(/\\r\\n?|\\n/); };\n\n  var hasSelection = window.getSelection ? function (te) {\n    try { return te.selectionStart != te.selectionEnd }\n    catch(e) { return false }\n  } : function (te) {\n    var range;\n    try {range = te.ownerDocument.selection.createRange();}\n    catch(e) {}\n    if (!range || range.parentElement() != te) { return false }\n    return range.compareEndPoints(\"StartToEnd\", range) != 0\n  };\n\n  var hasCopyEvent = (function () {\n    var e = elt(\"div\");\n    if (\"oncopy\" in e) { return true }\n    e.setAttribute(\"oncopy\", \"return;\");\n    return typeof e.oncopy == \"function\"\n  })();\n\n  var badZoomedRects = null;\n  function hasBadZoomedRects(measure) {\n    if (badZoomedRects != null) { return badZoomedRects }\n    var node = removeChildrenAndAdd(measure, elt(\"span\", \"x\"));\n    var normal = node.getBoundingClientRect();\n    var fromRange = range(node, 0, 1).getBoundingClientRect();\n    return badZoomedRects = Math.abs(normal.left - fromRange.left) > 1\n  }\n\n  // Known modes, by name and by MIME\n  var modes = {}, mimeModes = {};\n\n  // Extra arguments are stored as the mode's dependencies, which is\n  // used by (legacy) mechanisms like loadmode.js to automatically\n  // load a mode. (Preferred mechanism is the require/define calls.)\n  function defineMode(name, mode) {\n    if (arguments.length > 2)\n      { mode.dependencies = Array.prototype.slice.call(arguments, 2); }\n    modes[name] = mode;\n  }\n\n  function defineMIME(mime, spec) {\n    mimeModes[mime] = spec;\n  }\n\n  // Given a MIME type, a {name, ...options} config object, or a name\n  // string, return a mode config object.\n  function resolveMode(spec) {\n    if (typeof spec == \"string\" && mimeModes.hasOwnProperty(spec)) {\n      spec = mimeModes[spec];\n    } else if (spec && typeof spec.name == \"string\" && mimeModes.hasOwnProperty(spec.name)) {\n      var found = mimeModes[spec.name];\n      if (typeof found == \"string\") { found = {name: found}; }\n      spec = createObj(found, spec);\n      spec.name = found.name;\n    } else if (typeof spec == \"string\" && /^[\\w\\-]+\\/[\\w\\-]+\\+xml$/.test(spec)) {\n      return resolveMode(\"application/xml\")\n    } else if (typeof spec == \"string\" && /^[\\w\\-]+\\/[\\w\\-]+\\+json$/.test(spec)) {\n      return resolveMode(\"application/json\")\n    }\n    if (typeof spec == \"string\") { return {name: spec} }\n    else { return spec || {name: \"null\"} }\n  }\n\n  // Given a mode spec (anything that resolveMode accepts), find and\n  // initialize an actual mode object.\n  function getMode(options, spec) {\n    spec = resolveMode(spec);\n    var mfactory = modes[spec.name];\n    if (!mfactory) { return getMode(options, \"text/plain\") }\n    var modeObj = mfactory(options, spec);\n    if (modeExtensions.hasOwnProperty(spec.name)) {\n      var exts = modeExtensions[spec.name];\n      for (var prop in exts) {\n        if (!exts.hasOwnProperty(prop)) { continue }\n        if (modeObj.hasOwnProperty(prop)) { modeObj[\"_\" + prop] = modeObj[prop]; }\n        modeObj[prop] = exts[prop];\n      }\n    }\n    modeObj.name = spec.name;\n    if (spec.helperType) { modeObj.helperType = spec.helperType; }\n    if (spec.modeProps) { for (var prop$1 in spec.modeProps)\n      { modeObj[prop$1] = spec.modeProps[prop$1]; } }\n\n    return modeObj\n  }\n\n  // This can be used to attach properties to mode objects from\n  // outside the actual mode definition.\n  var modeExtensions = {};\n  function extendMode(mode, properties) {\n    var exts = modeExtensions.hasOwnProperty(mode) ? modeExtensions[mode] : (modeExtensions[mode] = {});\n    copyObj(properties, exts);\n  }\n\n  function copyState(mode, state) {\n    if (state === true) { return state }\n    if (mode.copyState) { return mode.copyState(state) }\n    var nstate = {};\n    for (var n in state) {\n      var val = state[n];\n      if (val instanceof Array) { val = val.concat([]); }\n      nstate[n] = val;\n    }\n    return nstate\n  }\n\n  // Given a mode and a state (for that mode), find the inner mode and\n  // state at the position that the state refers to.\n  function innerMode(mode, state) {\n    var info;\n    while (mode.innerMode) {\n      info = mode.innerMode(state);\n      if (!info || info.mode == mode) { break }\n      state = info.state;\n      mode = info.mode;\n    }\n    return info || {mode: mode, state: state}\n  }\n\n  function startState(mode, a1, a2) {\n    return mode.startState ? mode.startState(a1, a2) : true\n  }\n\n  // STRING STREAM\n\n  // Fed to the mode parsers, provides helper functions to make\n  // parsers more succinct.\n\n  var StringStream = function(string, tabSize, lineOracle) {\n    this.pos = this.start = 0;\n    this.string = string;\n    this.tabSize = tabSize || 8;\n    this.lastColumnPos = this.lastColumnValue = 0;\n    this.lineStart = 0;\n    this.lineOracle = lineOracle;\n  };\n\n  StringStream.prototype.eol = function () {return this.pos >= this.string.length};\n  StringStream.prototype.sol = function () {return this.pos == this.lineStart};\n  StringStream.prototype.peek = function () {return this.string.charAt(this.pos) || undefined};\n  StringStream.prototype.next = function () {\n    if (this.pos < this.string.length)\n      { return this.string.charAt(this.pos++) }\n  };\n  StringStream.prototype.eat = function (match) {\n    var ch = this.string.charAt(this.pos);\n    var ok;\n    if (typeof match == \"string\") { ok = ch == match; }\n    else { ok = ch && (match.test ? match.test(ch) : match(ch)); }\n    if (ok) {++this.pos; return ch}\n  };\n  StringStream.prototype.eatWhile = function (match) {\n    var start = this.pos;\n    while (this.eat(match)){}\n    return this.pos > start\n  };\n  StringStream.prototype.eatSpace = function () {\n    var start = this.pos;\n    while (/[\\s\\u00a0]/.test(this.string.charAt(this.pos))) { ++this.pos; }\n    return this.pos > start\n  };\n  StringStream.prototype.skipToEnd = function () {this.pos = this.string.length;};\n  StringStream.prototype.skipTo = function (ch) {\n    var found = this.string.indexOf(ch, this.pos);\n    if (found > -1) {this.pos = found; return true}\n  };\n  StringStream.prototype.backUp = function (n) {this.pos -= n;};\n  StringStream.prototype.column = function () {\n    if (this.lastColumnPos < this.start) {\n      this.lastColumnValue = countColumn(this.string, this.start, this.tabSize, this.lastColumnPos, this.lastColumnValue);\n      this.lastColumnPos = this.start;\n    }\n    return this.lastColumnValue - (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0)\n  };\n  StringStream.prototype.indentation = function () {\n    return countColumn(this.string, null, this.tabSize) -\n      (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0)\n  };\n  StringStream.prototype.match = function (pattern, consume, caseInsensitive) {\n    if (typeof pattern == \"string\") {\n      var cased = function (str) { return caseInsensitive ? str.toLowerCase() : str; };\n      var substr = this.string.substr(this.pos, pattern.length);\n      if (cased(substr) == cased(pattern)) {\n        if (consume !== false) { this.pos += pattern.length; }\n        return true\n      }\n    } else {\n      var match = this.string.slice(this.pos).match(pattern);\n      if (match && match.index > 0) { return null }\n      if (match && consume !== false) { this.pos += match[0].length; }\n      return match\n    }\n  };\n  StringStream.prototype.current = function (){return this.string.slice(this.start, this.pos)};\n  StringStream.prototype.hideFirstChars = function (n, inner) {\n    this.lineStart += n;\n    try { return inner() }\n    finally { this.lineStart -= n; }\n  };\n  StringStream.prototype.lookAhead = function (n) {\n    var oracle = this.lineOracle;\n    return oracle && oracle.lookAhead(n)\n  };\n  StringStream.prototype.baseToken = function () {\n    var oracle = this.lineOracle;\n    return oracle && oracle.baseToken(this.pos)\n  };\n\n  // Find the line object corresponding to the given line number.\n  function getLine(doc, n) {\n    n -= doc.first;\n    if (n < 0 || n >= doc.size) { throw new Error(\"There is no line \" + (n + doc.first) + \" in the document.\") }\n    var chunk = doc;\n    while (!chunk.lines) {\n      for (var i = 0;; ++i) {\n        var child = chunk.children[i], sz = child.chunkSize();\n        if (n < sz) { chunk = child; break }\n        n -= sz;\n      }\n    }\n    return chunk.lines[n]\n  }\n\n  // Get the part of a document between two positions, as an array of\n  // strings.\n  function getBetween(doc, start, end) {\n    var out = [], n = start.line;\n    doc.iter(start.line, end.line + 1, function (line) {\n      var text = line.text;\n      if (n == end.line) { text = text.slice(0, end.ch); }\n      if (n == start.line) { text = text.slice(start.ch); }\n      out.push(text);\n      ++n;\n    });\n    return out\n  }\n  // Get the lines between from and to, as array of strings.\n  function getLines(doc, from, to) {\n    var out = [];\n    doc.iter(from, to, function (line) { out.push(line.text); }); // iter aborts when callback returns truthy value\n    return out\n  }\n\n  // Update the height of a line, propagating the height change\n  // upwards to parent nodes.\n  function updateLineHeight(line, height) {\n    var diff = height - line.height;\n    if (diff) { for (var n = line; n; n = n.parent) { n.height += diff; } }\n  }\n\n  // Given a line object, find its line number by walking up through\n  // its parent links.\n  function lineNo(line) {\n    if (line.parent == null) { return null }\n    var cur = line.parent, no = indexOf(cur.lines, line);\n    for (var chunk = cur.parent; chunk; cur = chunk, chunk = chunk.parent) {\n      for (var i = 0;; ++i) {\n        if (chunk.children[i] == cur) { break }\n        no += chunk.children[i].chunkSize();\n      }\n    }\n    return no + cur.first\n  }\n\n  // Find the line at the given vertical position, using the height\n  // information in the document tree.\n  function lineAtHeight(chunk, h) {\n    var n = chunk.first;\n    outer: do {\n      for (var i$1 = 0; i$1 < chunk.children.length; ++i$1) {\n        var child = chunk.children[i$1], ch = child.height;\n        if (h < ch) { chunk = child; continue outer }\n        h -= ch;\n        n += child.chunkSize();\n      }\n      return n\n    } while (!chunk.lines)\n    var i = 0;\n    for (; i < chunk.lines.length; ++i) {\n      var line = chunk.lines[i], lh = line.height;\n      if (h < lh) { break }\n      h -= lh;\n    }\n    return n + i\n  }\n\n  function isLine(doc, l) {return l >= doc.first && l < doc.first + doc.size}\n\n  function lineNumberFor(options, i) {\n    return String(options.lineNumberFormatter(i + options.firstLineNumber))\n  }\n\n  // A Pos instance represents a position within the text.\n  function Pos(line, ch, sticky) {\n    if ( sticky === void 0 ) sticky = null;\n\n    if (!(this instanceof Pos)) { return new Pos(line, ch, sticky) }\n    this.line = line;\n    this.ch = ch;\n    this.sticky = sticky;\n  }\n\n  // Compare two positions, return 0 if they are the same, a negative\n  // number when a is less, and a positive number otherwise.\n  function cmp(a, b) { return a.line - b.line || a.ch - b.ch }\n\n  function equalCursorPos(a, b) { return a.sticky == b.sticky && cmp(a, b) == 0 }\n\n  function copyPos(x) {return Pos(x.line, x.ch)}\n  function maxPos(a, b) { return cmp(a, b) < 0 ? b : a }\n  function minPos(a, b) { return cmp(a, b) < 0 ? a : b }\n\n  // Most of the external API clips given positions to make sure they\n  // actually exist within the document.\n  function clipLine(doc, n) {return Math.max(doc.first, Math.min(n, doc.first + doc.size - 1))}\n  function clipPos(doc, pos) {\n    if (pos.line < doc.first) { return Pos(doc.first, 0) }\n    var last = doc.first + doc.size - 1;\n    if (pos.line > last) { return Pos(last, getLine(doc, last).text.length) }\n    return clipToLen(pos, getLine(doc, pos.line).text.length)\n  }\n  function clipToLen(pos, linelen) {\n    var ch = pos.ch;\n    if (ch == null || ch > linelen) { return Pos(pos.line, linelen) }\n    else if (ch < 0) { return Pos(pos.line, 0) }\n    else { return pos }\n  }\n  function clipPosArray(doc, array) {\n    var out = [];\n    for (var i = 0; i < array.length; i++) { out[i] = clipPos(doc, array[i]); }\n    return out\n  }\n\n  var SavedContext = function(state, lookAhead) {\n    this.state = state;\n    this.lookAhead = lookAhead;\n  };\n\n  var Context = function(doc, state, line, lookAhead) {\n    this.state = state;\n    this.doc = doc;\n    this.line = line;\n    this.maxLookAhead = lookAhead || 0;\n    this.baseTokens = null;\n    this.baseTokenPos = 1;\n  };\n\n  Context.prototype.lookAhead = function (n) {\n    var line = this.doc.getLine(this.line + n);\n    if (line != null && n > this.maxLookAhead) { this.maxLookAhead = n; }\n    return line\n  };\n\n  Context.prototype.baseToken = function (n) {\n    if (!this.baseTokens) { return null }\n    while (this.baseTokens[this.baseTokenPos] <= n)\n      { this.baseTokenPos += 2; }\n    var type = this.baseTokens[this.baseTokenPos + 1];\n    return {type: type && type.replace(/( |^)overlay .*/, \"\"),\n            size: this.baseTokens[this.baseTokenPos] - n}\n  };\n\n  Context.prototype.nextLine = function () {\n    this.line++;\n    if (this.maxLookAhead > 0) { this.maxLookAhead--; }\n  };\n\n  Context.fromSaved = function (doc, saved, line) {\n    if (saved instanceof SavedContext)\n      { return new Context(doc, copyState(doc.mode, saved.state), line, saved.lookAhead) }\n    else\n      { return new Context(doc, copyState(doc.mode, saved), line) }\n  };\n\n  Context.prototype.save = function (copy) {\n    var state = copy !== false ? copyState(this.doc.mode, this.state) : this.state;\n    return this.maxLookAhead > 0 ? new SavedContext(state, this.maxLookAhead) : state\n  };\n\n\n  // Compute a style array (an array starting with a mode generation\n  // -- for invalidation -- followed by pairs of end positions and\n  // style strings), which is used to highlight the tokens on the\n  // line.\n  function highlightLine(cm, line, context, forceToEnd) {\n    // A styles array always starts with a number identifying the\n    // mode/overlays that it is based on (for easy invalidation).\n    var st = [cm.state.modeGen], lineClasses = {};\n    // Compute the base array of styles\n    runMode(cm, line.text, cm.doc.mode, context, function (end, style) { return st.push(end, style); },\n            lineClasses, forceToEnd);\n    var state = context.state;\n\n    // Run overlays, adjust style array.\n    var loop = function ( o ) {\n      context.baseTokens = st;\n      var overlay = cm.state.overlays[o], i = 1, at = 0;\n      context.state = true;\n      runMode(cm, line.text, overlay.mode, context, function (end, style) {\n        var start = i;\n        // Ensure there's a token end at the current position, and that i points at it\n        while (at < end) {\n          var i_end = st[i];\n          if (i_end > end)\n            { st.splice(i, 1, end, st[i+1], i_end); }\n          i += 2;\n          at = Math.min(end, i_end);\n        }\n        if (!style) { return }\n        if (overlay.opaque) {\n          st.splice(start, i - start, end, \"overlay \" + style);\n          i = start + 2;\n        } else {\n          for (; start < i; start += 2) {\n            var cur = st[start+1];\n            st[start+1] = (cur ? cur + \" \" : \"\") + \"overlay \" + style;\n          }\n        }\n      }, lineClasses);\n      context.state = state;\n      context.baseTokens = null;\n      context.baseTokenPos = 1;\n    };\n\n    for (var o = 0; o < cm.state.overlays.length; ++o) loop( o );\n\n    return {styles: st, classes: lineClasses.bgClass || lineClasses.textClass ? lineClasses : null}\n  }\n\n  function getLineStyles(cm, line, updateFrontier) {\n    if (!line.styles || line.styles[0] != cm.state.modeGen) {\n      var context = getContextBefore(cm, lineNo(line));\n      var resetState = line.text.length > cm.options.maxHighlightLength && copyState(cm.doc.mode, context.state);\n      var result = highlightLine(cm, line, context);\n      if (resetState) { context.state = resetState; }\n      line.stateAfter = context.save(!resetState);\n      line.styles = result.styles;\n      if (result.classes) { line.styleClasses = result.classes; }\n      else if (line.styleClasses) { line.styleClasses = null; }\n      if (updateFrontier === cm.doc.highlightFrontier)\n        { cm.doc.modeFrontier = Math.max(cm.doc.modeFrontier, ++cm.doc.highlightFrontier); }\n    }\n    return line.styles\n  }\n\n  function getContextBefore(cm, n, precise) {\n    var doc = cm.doc, display = cm.display;\n    if (!doc.mode.startState) { return new Context(doc, true, n) }\n    var start = findStartLine(cm, n, precise);\n    var saved = start > doc.first && getLine(doc, start - 1).stateAfter;\n    var context = saved ? Context.fromSaved(doc, saved, start) : new Context(doc, startState(doc.mode), start);\n\n    doc.iter(start, n, function (line) {\n      processLine(cm, line.text, context);\n      var pos = context.line;\n      line.stateAfter = pos == n - 1 || pos % 5 == 0 || pos >= display.viewFrom && pos < display.viewTo ? context.save() : null;\n      context.nextLine();\n    });\n    if (precise) { doc.modeFrontier = context.line; }\n    return context\n  }\n\n  // Lightweight form of highlight -- proceed over this line and\n  // update state, but don't save a style array. Used for lines that\n  // aren't currently visible.\n  function processLine(cm, text, context, startAt) {\n    var mode = cm.doc.mode;\n    var stream = new StringStream(text, cm.options.tabSize, context);\n    stream.start = stream.pos = startAt || 0;\n    if (text == \"\") { callBlankLine(mode, context.state); }\n    while (!stream.eol()) {\n      readToken(mode, stream, context.state);\n      stream.start = stream.pos;\n    }\n  }\n\n  function callBlankLine(mode, state) {\n    if (mode.blankLine) { return mode.blankLine(state) }\n    if (!mode.innerMode) { return }\n    var inner = innerMode(mode, state);\n    if (inner.mode.blankLine) { return inner.mode.blankLine(inner.state) }\n  }\n\n  function readToken(mode, stream, state, inner) {\n    for (var i = 0; i < 10; i++) {\n      if (inner) { inner[0] = innerMode(mode, state).mode; }\n      var style = mode.token(stream, state);\n      if (stream.pos > stream.start) { return style }\n    }\n    throw new Error(\"Mode \" + mode.name + \" failed to advance stream.\")\n  }\n\n  var Token = function(stream, type, state) {\n    this.start = stream.start; this.end = stream.pos;\n    this.string = stream.current();\n    this.type = type || null;\n    this.state = state;\n  };\n\n  // Utility for getTokenAt and getLineTokens\n  function takeToken(cm, pos, precise, asArray) {\n    var doc = cm.doc, mode = doc.mode, style;\n    pos = clipPos(doc, pos);\n    var line = getLine(doc, pos.line), context = getContextBefore(cm, pos.line, precise);\n    var stream = new StringStream(line.text, cm.options.tabSize, context), tokens;\n    if (asArray) { tokens = []; }\n    while ((asArray || stream.pos < pos.ch) && !stream.eol()) {\n      stream.start = stream.pos;\n      style = readToken(mode, stream, context.state);\n      if (asArray) { tokens.push(new Token(stream, style, copyState(doc.mode, context.state))); }\n    }\n    return asArray ? tokens : new Token(stream, style, context.state)\n  }\n\n  function extractLineClasses(type, output) {\n    if (type) { for (;;) {\n      var lineClass = type.match(/(?:^|\\s+)line-(background-)?(\\S+)/);\n      if (!lineClass) { break }\n      type = type.slice(0, lineClass.index) + type.slice(lineClass.index + lineClass[0].length);\n      var prop = lineClass[1] ? \"bgClass\" : \"textClass\";\n      if (output[prop] == null)\n        { output[prop] = lineClass[2]; }\n      else if (!(new RegExp(\"(?:^|\\\\s)\" + lineClass[2] + \"(?:$|\\\\s)\")).test(output[prop]))\n        { output[prop] += \" \" + lineClass[2]; }\n    } }\n    return type\n  }\n\n  // Run the given mode's parser over a line, calling f for each token.\n  function runMode(cm, text, mode, context, f, lineClasses, forceToEnd) {\n    var flattenSpans = mode.flattenSpans;\n    if (flattenSpans == null) { flattenSpans = cm.options.flattenSpans; }\n    var curStart = 0, curStyle = null;\n    var stream = new StringStream(text, cm.options.tabSize, context), style;\n    var inner = cm.options.addModeClass && [null];\n    if (text == \"\") { extractLineClasses(callBlankLine(mode, context.state), lineClasses); }\n    while (!stream.eol()) {\n      if (stream.pos > cm.options.maxHighlightLength) {\n        flattenSpans = false;\n        if (forceToEnd) { processLine(cm, text, context, stream.pos); }\n        stream.pos = text.length;\n        style = null;\n      } else {\n        style = extractLineClasses(readToken(mode, stream, context.state, inner), lineClasses);\n      }\n      if (inner) {\n        var mName = inner[0].name;\n        if (mName) { style = \"m-\" + (style ? mName + \" \" + style : mName); }\n      }\n      if (!flattenSpans || curStyle != style) {\n        while (curStart < stream.start) {\n          curStart = Math.min(stream.start, curStart + 5000);\n          f(curStart, curStyle);\n        }\n        curStyle = style;\n      }\n      stream.start = stream.pos;\n    }\n    while (curStart < stream.pos) {\n      // Webkit seems to refuse to render text nodes longer than 57444\n      // characters, and returns inaccurate measurements in nodes\n      // starting around 5000 chars.\n      var pos = Math.min(stream.pos, curStart + 5000);\n      f(pos, curStyle);\n      curStart = pos;\n    }\n  }\n\n  // Finds the line to start with when starting a parse. Tries to\n  // find a line with a stateAfter, so that it can start with a\n  // valid state. If that fails, it returns the line with the\n  // smallest indentation, which tends to need the least context to\n  // parse correctly.\n  function findStartLine(cm, n, precise) {\n    var minindent, minline, doc = cm.doc;\n    var lim = precise ? -1 : n - (cm.doc.mode.innerMode ? 1000 : 100);\n    for (var search = n; search > lim; --search) {\n      if (search <= doc.first) { return doc.first }\n      var line = getLine(doc, search - 1), after = line.stateAfter;\n      if (after && (!precise || search + (after instanceof SavedContext ? after.lookAhead : 0) <= doc.modeFrontier))\n        { return search }\n      var indented = countColumn(line.text, null, cm.options.tabSize);\n      if (minline == null || minindent > indented) {\n        minline = search - 1;\n        minindent = indented;\n      }\n    }\n    return minline\n  }\n\n  function retreatFrontier(doc, n) {\n    doc.modeFrontier = Math.min(doc.modeFrontier, n);\n    if (doc.highlightFrontier < n - 10) { return }\n    var start = doc.first;\n    for (var line = n - 1; line > start; line--) {\n      var saved = getLine(doc, line).stateAfter;\n      // change is on 3\n      // state on line 1 looked ahead 2 -- so saw 3\n      // test 1 + 2 < 3 should cover this\n      if (saved && (!(saved instanceof SavedContext) || line + saved.lookAhead < n)) {\n        start = line + 1;\n        break\n      }\n    }\n    doc.highlightFrontier = Math.min(doc.highlightFrontier, start);\n  }\n\n  // Optimize some code when these features are not used.\n  var sawReadOnlySpans = false, sawCollapsedSpans = false;\n\n  function seeReadOnlySpans() {\n    sawReadOnlySpans = true;\n  }\n\n  function seeCollapsedSpans() {\n    sawCollapsedSpans = true;\n  }\n\n  // TEXTMARKER SPANS\n\n  function MarkedSpan(marker, from, to) {\n    this.marker = marker;\n    this.from = from; this.to = to;\n  }\n\n  // Search an array of spans for a span matching the given marker.\n  function getMarkedSpanFor(spans, marker) {\n    if (spans) { for (var i = 0; i < spans.length; ++i) {\n      var span = spans[i];\n      if (span.marker == marker) { return span }\n    } }\n  }\n\n  // Remove a span from an array, returning undefined if no spans are\n  // left (we don't store arrays for lines without spans).\n  function removeMarkedSpan(spans, span) {\n    var r;\n    for (var i = 0; i < spans.length; ++i)\n      { if (spans[i] != span) { (r || (r = [])).push(spans[i]); } }\n    return r\n  }\n\n  // Add a span to a line.\n  function addMarkedSpan(line, span, op) {\n    var inThisOp = op && window.WeakSet && (op.markedSpans || (op.markedSpans = new WeakSet));\n    if (inThisOp && line.markedSpans && inThisOp.has(line.markedSpans)) {\n      line.markedSpans.push(span);\n    } else {\n      line.markedSpans = line.markedSpans ? line.markedSpans.concat([span]) : [span];\n      if (inThisOp) { inThisOp.add(line.markedSpans); }\n    }\n    span.marker.attachLine(line);\n  }\n\n  // Used for the algorithm that adjusts markers for a change in the\n  // document. These functions cut an array of spans at a given\n  // character position, returning an array of remaining chunks (or\n  // undefined if nothing remains).\n  function markedSpansBefore(old, startCh, isInsert) {\n    var nw;\n    if (old) { for (var i = 0; i < old.length; ++i) {\n      var span = old[i], marker = span.marker;\n      var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= startCh : span.from < startCh);\n      if (startsBefore || span.from == startCh && marker.type == \"bookmark\" && (!isInsert || !span.marker.insertLeft)) {\n        var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= startCh : span.to > startCh)\n        ;(nw || (nw = [])).push(new MarkedSpan(marker, span.from, endsAfter ? null : span.to));\n      }\n    } }\n    return nw\n  }\n  function markedSpansAfter(old, endCh, isInsert) {\n    var nw;\n    if (old) { for (var i = 0; i < old.length; ++i) {\n      var span = old[i], marker = span.marker;\n      var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= endCh : span.to > endCh);\n      if (endsAfter || span.from == endCh && marker.type == \"bookmark\" && (!isInsert || span.marker.insertLeft)) {\n        var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= endCh : span.from < endCh)\n        ;(nw || (nw = [])).push(new MarkedSpan(marker, startsBefore ? null : span.from - endCh,\n                                              span.to == null ? null : span.to - endCh));\n      }\n    } }\n    return nw\n  }\n\n  // Given a change object, compute the new set of marker spans that\n  // cover the line in which the change took place. Removes spans\n  // entirely within the change, reconnects spans belonging to the\n  // same marker that appear on both sides of the change, and cuts off\n  // spans partially within the change. Returns an array of span\n  // arrays with one element for each line in (after) the change.\n  function stretchSpansOverChange(doc, change) {\n    if (change.full) { return null }\n    var oldFirst = isLine(doc, change.from.line) && getLine(doc, change.from.line).markedSpans;\n    var oldLast = isLine(doc, change.to.line) && getLine(doc, change.to.line).markedSpans;\n    if (!oldFirst && !oldLast) { return null }\n\n    var startCh = change.from.ch, endCh = change.to.ch, isInsert = cmp(change.from, change.to) == 0;\n    // Get the spans that 'stick out' on both sides\n    var first = markedSpansBefore(oldFirst, startCh, isInsert);\n    var last = markedSpansAfter(oldLast, endCh, isInsert);\n\n    // Next, merge those two ends\n    var sameLine = change.text.length == 1, offset = lst(change.text).length + (sameLine ? startCh : 0);\n    if (first) {\n      // Fix up .to properties of first\n      for (var i = 0; i < first.length; ++i) {\n        var span = first[i];\n        if (span.to == null) {\n          var found = getMarkedSpanFor(last, span.marker);\n          if (!found) { span.to = startCh; }\n          else if (sameLine) { span.to = found.to == null ? null : found.to + offset; }\n        }\n      }\n    }\n    if (last) {\n      // Fix up .from in last (or move them into first in case of sameLine)\n      for (var i$1 = 0; i$1 < last.length; ++i$1) {\n        var span$1 = last[i$1];\n        if (span$1.to != null) { span$1.to += offset; }\n        if (span$1.from == null) {\n          var found$1 = getMarkedSpanFor(first, span$1.marker);\n          if (!found$1) {\n            span$1.from = offset;\n            if (sameLine) { (first || (first = [])).push(span$1); }\n          }\n        } else {\n          span$1.from += offset;\n          if (sameLine) { (first || (first = [])).push(span$1); }\n        }\n      }\n    }\n    // Make sure we didn't create any zero-length spans\n    if (first) { first = clearEmptySpans(first); }\n    if (last && last != first) { last = clearEmptySpans(last); }\n\n    var newMarkers = [first];\n    if (!sameLine) {\n      // Fill gap with whole-line-spans\n      var gap = change.text.length - 2, gapMarkers;\n      if (gap > 0 && first)\n        { for (var i$2 = 0; i$2 < first.length; ++i$2)\n          { if (first[i$2].to == null)\n            { (gapMarkers || (gapMarkers = [])).push(new MarkedSpan(first[i$2].marker, null, null)); } } }\n      for (var i$3 = 0; i$3 < gap; ++i$3)\n        { newMarkers.push(gapMarkers); }\n      newMarkers.push(last);\n    }\n    return newMarkers\n  }\n\n  // Remove spans that are empty and don't have a clearWhenEmpty\n  // option of false.\n  function clearEmptySpans(spans) {\n    for (var i = 0; i < spans.length; ++i) {\n      var span = spans[i];\n      if (span.from != null && span.from == span.to && span.marker.clearWhenEmpty !== false)\n        { spans.splice(i--, 1); }\n    }\n    if (!spans.length) { return null }\n    return spans\n  }\n\n  // Used to 'clip' out readOnly ranges when making a change.\n  function removeReadOnlyRanges(doc, from, to) {\n    var markers = null;\n    doc.iter(from.line, to.line + 1, function (line) {\n      if (line.markedSpans) { for (var i = 0; i < line.markedSpans.length; ++i) {\n        var mark = line.markedSpans[i].marker;\n        if (mark.readOnly && (!markers || indexOf(markers, mark) == -1))\n          { (markers || (markers = [])).push(mark); }\n      } }\n    });\n    if (!markers) { return null }\n    var parts = [{from: from, to: to}];\n    for (var i = 0; i < markers.length; ++i) {\n      var mk = markers[i], m = mk.find(0);\n      for (var j = 0; j < parts.length; ++j) {\n        var p = parts[j];\n        if (cmp(p.to, m.from) < 0 || cmp(p.from, m.to) > 0) { continue }\n        var newParts = [j, 1], dfrom = cmp(p.from, m.from), dto = cmp(p.to, m.to);\n        if (dfrom < 0 || !mk.inclusiveLeft && !dfrom)\n          { newParts.push({from: p.from, to: m.from}); }\n        if (dto > 0 || !mk.inclusiveRight && !dto)\n          { newParts.push({from: m.to, to: p.to}); }\n        parts.splice.apply(parts, newParts);\n        j += newParts.length - 3;\n      }\n    }\n    return parts\n  }\n\n  // Connect or disconnect spans from a line.\n  function detachMarkedSpans(line) {\n    var spans = line.markedSpans;\n    if (!spans) { return }\n    for (var i = 0; i < spans.length; ++i)\n      { spans[i].marker.detachLine(line); }\n    line.markedSpans = null;\n  }\n  function attachMarkedSpans(line, spans) {\n    if (!spans) { return }\n    for (var i = 0; i < spans.length; ++i)\n      { spans[i].marker.attachLine(line); }\n    line.markedSpans = spans;\n  }\n\n  // Helpers used when computing which overlapping collapsed span\n  // counts as the larger one.\n  function extraLeft(marker) { return marker.inclusiveLeft ? -1 : 0 }\n  function extraRight(marker) { return marker.inclusiveRight ? 1 : 0 }\n\n  // Returns a number indicating which of two overlapping collapsed\n  // spans is larger (and thus includes the other). Falls back to\n  // comparing ids when the spans cover exactly the same range.\n  function compareCollapsedMarkers(a, b) {\n    var lenDiff = a.lines.length - b.lines.length;\n    if (lenDiff != 0) { return lenDiff }\n    var aPos = a.find(), bPos = b.find();\n    var fromCmp = cmp(aPos.from, bPos.from) || extraLeft(a) - extraLeft(b);\n    if (fromCmp) { return -fromCmp }\n    var toCmp = cmp(aPos.to, bPos.to) || extraRight(a) - extraRight(b);\n    if (toCmp) { return toCmp }\n    return b.id - a.id\n  }\n\n  // Find out whether a line ends or starts in a collapsed span. If\n  // so, return the marker for that span.\n  function collapsedSpanAtSide(line, start) {\n    var sps = sawCollapsedSpans && line.markedSpans, found;\n    if (sps) { for (var sp = (void 0), i = 0; i < sps.length; ++i) {\n      sp = sps[i];\n      if (sp.marker.collapsed && (start ? sp.from : sp.to) == null &&\n          (!found || compareCollapsedMarkers(found, sp.marker) < 0))\n        { found = sp.marker; }\n    } }\n    return found\n  }\n  function collapsedSpanAtStart(line) { return collapsedSpanAtSide(line, true) }\n  function collapsedSpanAtEnd(line) { return collapsedSpanAtSide(line, false) }\n\n  function collapsedSpanAround(line, ch) {\n    var sps = sawCollapsedSpans && line.markedSpans, found;\n    if (sps) { for (var i = 0; i < sps.length; ++i) {\n      var sp = sps[i];\n      if (sp.marker.collapsed && (sp.from == null || sp.from < ch) && (sp.to == null || sp.to > ch) &&\n          (!found || compareCollapsedMarkers(found, sp.marker) < 0)) { found = sp.marker; }\n    } }\n    return found\n  }\n\n  // Test whether there exists a collapsed span that partially\n  // overlaps (covers the start or end, but not both) of a new span.\n  // Such overlap is not allowed.\n  function conflictingCollapsedRange(doc, lineNo, from, to, marker) {\n    var line = getLine(doc, lineNo);\n    var sps = sawCollapsedSpans && line.markedSpans;\n    if (sps) { for (var i = 0; i < sps.length; ++i) {\n      var sp = sps[i];\n      if (!sp.marker.collapsed) { continue }\n      var found = sp.marker.find(0);\n      var fromCmp = cmp(found.from, from) || extraLeft(sp.marker) - extraLeft(marker);\n      var toCmp = cmp(found.to, to) || extraRight(sp.marker) - extraRight(marker);\n      if (fromCmp >= 0 && toCmp <= 0 || fromCmp <= 0 && toCmp >= 0) { continue }\n      if (fromCmp <= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.to, from) >= 0 : cmp(found.to, from) > 0) ||\n          fromCmp >= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.from, to) <= 0 : cmp(found.from, to) < 0))\n        { return true }\n    } }\n  }\n\n  // A visual line is a line as drawn on the screen. Folding, for\n  // example, can cause multiple logical lines to appear on the same\n  // visual line. This finds the start of the visual line that the\n  // given line is part of (usually that is the line itself).\n  function visualLine(line) {\n    var merged;\n    while (merged = collapsedSpanAtStart(line))\n      { line = merged.find(-1, true).line; }\n    return line\n  }\n\n  function visualLineEnd(line) {\n    var merged;\n    while (merged = collapsedSpanAtEnd(line))\n      { line = merged.find(1, true).line; }\n    return line\n  }\n\n  // Returns an array of logical lines that continue the visual line\n  // started by the argument, or undefined if there are no such lines.\n  function visualLineContinued(line) {\n    var merged, lines;\n    while (merged = collapsedSpanAtEnd(line)) {\n      line = merged.find(1, true).line\n      ;(lines || (lines = [])).push(line);\n    }\n    return lines\n  }\n\n  // Get the line number of the start of the visual line that the\n  // given line number is part of.\n  function visualLineNo(doc, lineN) {\n    var line = getLine(doc, lineN), vis = visualLine(line);\n    if (line == vis) { return lineN }\n    return lineNo(vis)\n  }\n\n  // Get the line number of the start of the next visual line after\n  // the given line.\n  function visualLineEndNo(doc, lineN) {\n    if (lineN > doc.lastLine()) { return lineN }\n    var line = getLine(doc, lineN), merged;\n    if (!lineIsHidden(doc, line)) { return lineN }\n    while (merged = collapsedSpanAtEnd(line))\n      { line = merged.find(1, true).line; }\n    return lineNo(line) + 1\n  }\n\n  // Compute whether a line is hidden. Lines count as hidden when they\n  // are part of a visual line that starts with another line, or when\n  // they are entirely covered by collapsed, non-widget span.\n  function lineIsHidden(doc, line) {\n    var sps = sawCollapsedSpans && line.markedSpans;\n    if (sps) { for (var sp = (void 0), i = 0; i < sps.length; ++i) {\n      sp = sps[i];\n      if (!sp.marker.collapsed) { continue }\n      if (sp.from == null) { return true }\n      if (sp.marker.widgetNode) { continue }\n      if (sp.from == 0 && sp.marker.inclusiveLeft && lineIsHiddenInner(doc, line, sp))\n        { return true }\n    } }\n  }\n  function lineIsHiddenInner(doc, line, span) {\n    if (span.to == null) {\n      var end = span.marker.find(1, true);\n      return lineIsHiddenInner(doc, end.line, getMarkedSpanFor(end.line.markedSpans, span.marker))\n    }\n    if (span.marker.inclusiveRight && span.to == line.text.length)\n      { return true }\n    for (var sp = (void 0), i = 0; i < line.markedSpans.length; ++i) {\n      sp = line.markedSpans[i];\n      if (sp.marker.collapsed && !sp.marker.widgetNode && sp.from == span.to &&\n          (sp.to == null || sp.to != span.from) &&\n          (sp.marker.inclusiveLeft || span.marker.inclusiveRight) &&\n          lineIsHiddenInner(doc, line, sp)) { return true }\n    }\n  }\n\n  // Find the height above the given line.\n  function heightAtLine(lineObj) {\n    lineObj = visualLine(lineObj);\n\n    var h = 0, chunk = lineObj.parent;\n    for (var i = 0; i < chunk.lines.length; ++i) {\n      var line = chunk.lines[i];\n      if (line == lineObj) { break }\n      else { h += line.height; }\n    }\n    for (var p = chunk.parent; p; chunk = p, p = chunk.parent) {\n      for (var i$1 = 0; i$1 < p.children.length; ++i$1) {\n        var cur = p.children[i$1];\n        if (cur == chunk) { break }\n        else { h += cur.height; }\n      }\n    }\n    return h\n  }\n\n  // Compute the character length of a line, taking into account\n  // collapsed ranges (see markText) that might hide parts, and join\n  // other lines onto it.\n  function lineLength(line) {\n    if (line.height == 0) { return 0 }\n    var len = line.text.length, merged, cur = line;\n    while (merged = collapsedSpanAtStart(cur)) {\n      var found = merged.find(0, true);\n      cur = found.from.line;\n      len += found.from.ch - found.to.ch;\n    }\n    cur = line;\n    while (merged = collapsedSpanAtEnd(cur)) {\n      var found$1 = merged.find(0, true);\n      len -= cur.text.length - found$1.from.ch;\n      cur = found$1.to.line;\n      len += cur.text.length - found$1.to.ch;\n    }\n    return len\n  }\n\n  // Find the longest line in the document.\n  function findMaxLine(cm) {\n    var d = cm.display, doc = cm.doc;\n    d.maxLine = getLine(doc, doc.first);\n    d.maxLineLength = lineLength(d.maxLine);\n    d.maxLineChanged = true;\n    doc.iter(function (line) {\n      var len = lineLength(line);\n      if (len > d.maxLineLength) {\n        d.maxLineLength = len;\n        d.maxLine = line;\n      }\n    });\n  }\n\n  // LINE DATA STRUCTURE\n\n  // Line objects. These hold state related to a line, including\n  // highlighting info (the styles array).\n  var Line = function(text, markedSpans, estimateHeight) {\n    this.text = text;\n    attachMarkedSpans(this, markedSpans);\n    this.height = estimateHeight ? estimateHeight(this) : 1;\n  };\n\n  Line.prototype.lineNo = function () { return lineNo(this) };\n  eventMixin(Line);\n\n  // Change the content (text, markers) of a line. Automatically\n  // invalidates cached information and tries to re-estimate the\n  // line's height.\n  function updateLine(line, text, markedSpans, estimateHeight) {\n    line.text = text;\n    if (line.stateAfter) { line.stateAfter = null; }\n    if (line.styles) { line.styles = null; }\n    if (line.order != null) { line.order = null; }\n    detachMarkedSpans(line);\n    attachMarkedSpans(line, markedSpans);\n    var estHeight = estimateHeight ? estimateHeight(line) : 1;\n    if (estHeight != line.height) { updateLineHeight(line, estHeight); }\n  }\n\n  // Detach a line from the document tree and its markers.\n  function cleanUpLine(line) {\n    line.parent = null;\n    detachMarkedSpans(line);\n  }\n\n  // Convert a style as returned by a mode (either null, or a string\n  // containing one or more styles) to a CSS style. This is cached,\n  // and also looks for line-wide styles.\n  var styleToClassCache = {}, styleToClassCacheWithMode = {};\n  function interpretTokenStyle(style, options) {\n    if (!style || /^\\s*$/.test(style)) { return null }\n    var cache = options.addModeClass ? styleToClassCacheWithMode : styleToClassCache;\n    return cache[style] ||\n      (cache[style] = style.replace(/\\S+/g, \"cm-$&\"))\n  }\n\n  // Render the DOM representation of the text of a line. Also builds\n  // up a 'line map', which points at the DOM nodes that represent\n  // specific stretches of text, and is used by the measuring code.\n  // The returned object contains the DOM node, this map, and\n  // information about line-wide styles that were set by the mode.\n  function buildLineContent(cm, lineView) {\n    // The padding-right forces the element to have a 'border', which\n    // is needed on Webkit to be able to get line-level bounding\n    // rectangles for it (in measureChar).\n    var content = eltP(\"span\", null, null, webkit ? \"padding-right: .1px\" : null);\n    var builder = {pre: eltP(\"pre\", [content], \"CodeMirror-line\"), content: content,\n                   col: 0, pos: 0, cm: cm,\n                   trailingSpace: false,\n                   splitSpaces: cm.getOption(\"lineWrapping\")};\n    lineView.measure = {};\n\n    // Iterate over the logical lines that make up this visual line.\n    for (var i = 0; i <= (lineView.rest ? lineView.rest.length : 0); i++) {\n      var line = i ? lineView.rest[i - 1] : lineView.line, order = (void 0);\n      builder.pos = 0;\n      builder.addToken = buildToken;\n      // Optionally wire in some hacks into the token-rendering\n      // algorithm, to deal with browser quirks.\n      if (hasBadBidiRects(cm.display.measure) && (order = getOrder(line, cm.doc.direction)))\n        { builder.addToken = buildTokenBadBidi(builder.addToken, order); }\n      builder.map = [];\n      var allowFrontierUpdate = lineView != cm.display.externalMeasured && lineNo(line);\n      insertLineContent(line, builder, getLineStyles(cm, line, allowFrontierUpdate));\n      if (line.styleClasses) {\n        if (line.styleClasses.bgClass)\n          { builder.bgClass = joinClasses(line.styleClasses.bgClass, builder.bgClass || \"\"); }\n        if (line.styleClasses.textClass)\n          { builder.textClass = joinClasses(line.styleClasses.textClass, builder.textClass || \"\"); }\n      }\n\n      // Ensure at least a single node is present, for measuring.\n      if (builder.map.length == 0)\n        { builder.map.push(0, 0, builder.content.appendChild(zeroWidthElement(cm.display.measure))); }\n\n      // Store the map and a cache object for the current logical line\n      if (i == 0) {\n        lineView.measure.map = builder.map;\n        lineView.measure.cache = {};\n      } else {\n  (lineView.measure.maps || (lineView.measure.maps = [])).push(builder.map)\n        ;(lineView.measure.caches || (lineView.measure.caches = [])).push({});\n      }\n    }\n\n    // See issue #2901\n    if (webkit) {\n      var last = builder.content.lastChild;\n      if (/\\bcm-tab\\b/.test(last.className) || (last.querySelector && last.querySelector(\".cm-tab\")))\n        { builder.content.className = \"cm-tab-wrap-hack\"; }\n    }\n\n    signal(cm, \"renderLine\", cm, lineView.line, builder.pre);\n    if (builder.pre.className)\n      { builder.textClass = joinClasses(builder.pre.className, builder.textClass || \"\"); }\n\n    return builder\n  }\n\n  function defaultSpecialCharPlaceholder(ch) {\n    var token = elt(\"span\", \"\\u2022\", \"cm-invalidchar\");\n    token.title = \"\\\\u\" + ch.charCodeAt(0).toString(16);\n    token.setAttribute(\"aria-label\", token.title);\n    return token\n  }\n\n  // Build up the DOM representation for a single token, and add it to\n  // the line map. Takes care to render special characters separately.\n  function buildToken(builder, text, style, startStyle, endStyle, css, attributes) {\n    if (!text) { return }\n    var displayText = builder.splitSpaces ? splitSpaces(text, builder.trailingSpace) : text;\n    var special = builder.cm.state.specialChars, mustWrap = false;\n    var content;\n    if (!special.test(text)) {\n      builder.col += text.length;\n      content = document.createTextNode(displayText);\n      builder.map.push(builder.pos, builder.pos + text.length, content);\n      if (ie && ie_version < 9) { mustWrap = true; }\n      builder.pos += text.length;\n    } else {\n      content = document.createDocumentFragment();\n      var pos = 0;\n      while (true) {\n        special.lastIndex = pos;\n        var m = special.exec(text);\n        var skipped = m ? m.index - pos : text.length - pos;\n        if (skipped) {\n          var txt = document.createTextNode(displayText.slice(pos, pos + skipped));\n          if (ie && ie_version < 9) { content.appendChild(elt(\"span\", [txt])); }\n          else { content.appendChild(txt); }\n          builder.map.push(builder.pos, builder.pos + skipped, txt);\n          builder.col += skipped;\n          builder.pos += skipped;\n        }\n        if (!m) { break }\n        pos += skipped + 1;\n        var txt$1 = (void 0);\n        if (m[0] == \"\\t\") {\n          var tabSize = builder.cm.options.tabSize, tabWidth = tabSize - builder.col % tabSize;\n          txt$1 = content.appendChild(elt(\"span\", spaceStr(tabWidth), \"cm-tab\"));\n          txt$1.setAttribute(\"role\", \"presentation\");\n          txt$1.setAttribute(\"cm-text\", \"\\t\");\n          builder.col += tabWidth;\n        } else if (m[0] == \"\\r\" || m[0] == \"\\n\") {\n          txt$1 = content.appendChild(elt(\"span\", m[0] == \"\\r\" ? \"\\u240d\" : \"\\u2424\", \"cm-invalidchar\"));\n          txt$1.setAttribute(\"cm-text\", m[0]);\n          builder.col += 1;\n        } else {\n          txt$1 = builder.cm.options.specialCharPlaceholder(m[0]);\n          txt$1.setAttribute(\"cm-text\", m[0]);\n          if (ie && ie_version < 9) { content.appendChild(elt(\"span\", [txt$1])); }\n          else { content.appendChild(txt$1); }\n          builder.col += 1;\n        }\n        builder.map.push(builder.pos, builder.pos + 1, txt$1);\n        builder.pos++;\n      }\n    }\n    builder.trailingSpace = displayText.charCodeAt(text.length - 1) == 32;\n    if (style || startStyle || endStyle || mustWrap || css || attributes) {\n      var fullStyle = style || \"\";\n      if (startStyle) { fullStyle += startStyle; }\n      if (endStyle) { fullStyle += endStyle; }\n      var token = elt(\"span\", [content], fullStyle, css);\n      if (attributes) {\n        for (var attr in attributes) { if (attributes.hasOwnProperty(attr) && attr != \"style\" && attr != \"class\")\n          { token.setAttribute(attr, attributes[attr]); } }\n      }\n      return builder.content.appendChild(token)\n    }\n    builder.content.appendChild(content);\n  }\n\n  // Change some spaces to NBSP to prevent the browser from collapsing\n  // trailing spaces at the end of a line when rendering text (issue #1362).\n  function splitSpaces(text, trailingBefore) {\n    if (text.length > 1 && !/  /.test(text)) { return text }\n    var spaceBefore = trailingBefore, result = \"\";\n    for (var i = 0; i < text.length; i++) {\n      var ch = text.charAt(i);\n      if (ch == \" \" && spaceBefore && (i == text.length - 1 || text.charCodeAt(i + 1) == 32))\n        { ch = \"\\u00a0\"; }\n      result += ch;\n      spaceBefore = ch == \" \";\n    }\n    return result\n  }\n\n  // Work around nonsense dimensions being reported for stretches of\n  // right-to-left text.\n  function buildTokenBadBidi(inner, order) {\n    return function (builder, text, style, startStyle, endStyle, css, attributes) {\n      style = style ? style + \" cm-force-border\" : \"cm-force-border\";\n      var start = builder.pos, end = start + text.length;\n      for (;;) {\n        // Find the part that overlaps with the start of this text\n        var part = (void 0);\n        for (var i = 0; i < order.length; i++) {\n          part = order[i];\n          if (part.to > start && part.from <= start) { break }\n        }\n        if (part.to >= end) { return inner(builder, text, style, startStyle, endStyle, css, attributes) }\n        inner(builder, text.slice(0, part.to - start), style, startStyle, null, css, attributes);\n        startStyle = null;\n        text = text.slice(part.to - start);\n        start = part.to;\n      }\n    }\n  }\n\n  function buildCollapsedSpan(builder, size, marker, ignoreWidget) {\n    var widget = !ignoreWidget && marker.widgetNode;\n    if (widget) { builder.map.push(builder.pos, builder.pos + size, widget); }\n    if (!ignoreWidget && builder.cm.display.input.needsContentAttribute) {\n      if (!widget)\n        { widget = builder.content.appendChild(document.createElement(\"span\")); }\n      widget.setAttribute(\"cm-marker\", marker.id);\n    }\n    if (widget) {\n      builder.cm.display.input.setUneditable(widget);\n      builder.content.appendChild(widget);\n    }\n    builder.pos += size;\n    builder.trailingSpace = false;\n  }\n\n  // Outputs a number of spans to make up a line, taking highlighting\n  // and marked text into account.\n  function insertLineContent(line, builder, styles) {\n    var spans = line.markedSpans, allText = line.text, at = 0;\n    if (!spans) {\n      for (var i$1 = 1; i$1 < styles.length; i$1+=2)\n        { builder.addToken(builder, allText.slice(at, at = styles[i$1]), interpretTokenStyle(styles[i$1+1], builder.cm.options)); }\n      return\n    }\n\n    var len = allText.length, pos = 0, i = 1, text = \"\", style, css;\n    var nextChange = 0, spanStyle, spanEndStyle, spanStartStyle, collapsed, attributes;\n    for (;;) {\n      if (nextChange == pos) { // Update current marker set\n        spanStyle = spanEndStyle = spanStartStyle = css = \"\";\n        attributes = null;\n        collapsed = null; nextChange = Infinity;\n        var foundBookmarks = [], endStyles = (void 0);\n        for (var j = 0; j < spans.length; ++j) {\n          var sp = spans[j], m = sp.marker;\n          if (m.type == \"bookmark\" && sp.from == pos && m.widgetNode) {\n            foundBookmarks.push(m);\n          } else if (sp.from <= pos && (sp.to == null || sp.to > pos || m.collapsed && sp.to == pos && sp.from == pos)) {\n            if (sp.to != null && sp.to != pos && nextChange > sp.to) {\n              nextChange = sp.to;\n              spanEndStyle = \"\";\n            }\n            if (m.className) { spanStyle += \" \" + m.className; }\n            if (m.css) { css = (css ? css + \";\" : \"\") + m.css; }\n            if (m.startStyle && sp.from == pos) { spanStartStyle += \" \" + m.startStyle; }\n            if (m.endStyle && sp.to == nextChange) { (endStyles || (endStyles = [])).push(m.endStyle, sp.to); }\n            // support for the old title property\n            // https://github.com/codemirror/CodeMirror/pull/5673\n            if (m.title) { (attributes || (attributes = {})).title = m.title; }\n            if (m.attributes) {\n              for (var attr in m.attributes)\n                { (attributes || (attributes = {}))[attr] = m.attributes[attr]; }\n            }\n            if (m.collapsed && (!collapsed || compareCollapsedMarkers(collapsed.marker, m) < 0))\n              { collapsed = sp; }\n          } else if (sp.from > pos && nextChange > sp.from) {\n            nextChange = sp.from;\n          }\n        }\n        if (endStyles) { for (var j$1 = 0; j$1 < endStyles.length; j$1 += 2)\n          { if (endStyles[j$1 + 1] == nextChange) { spanEndStyle += \" \" + endStyles[j$1]; } } }\n\n        if (!collapsed || collapsed.from == pos) { for (var j$2 = 0; j$2 < foundBookmarks.length; ++j$2)\n          { buildCollapsedSpan(builder, 0, foundBookmarks[j$2]); } }\n        if (collapsed && (collapsed.from || 0) == pos) {\n          buildCollapsedSpan(builder, (collapsed.to == null ? len + 1 : collapsed.to) - pos,\n                             collapsed.marker, collapsed.from == null);\n          if (collapsed.to == null) { return }\n          if (collapsed.to == pos) { collapsed = false; }\n        }\n      }\n      if (pos >= len) { break }\n\n      var upto = Math.min(len, nextChange);\n      while (true) {\n        if (text) {\n          var end = pos + text.length;\n          if (!collapsed) {\n            var tokenText = end > upto ? text.slice(0, upto - pos) : text;\n            builder.addToken(builder, tokenText, style ? style + spanStyle : spanStyle,\n                             spanStartStyle, pos + tokenText.length == nextChange ? spanEndStyle : \"\", css, attributes);\n          }\n          if (end >= upto) {text = text.slice(upto - pos); pos = upto; break}\n          pos = end;\n          spanStartStyle = \"\";\n        }\n        text = allText.slice(at, at = styles[i++]);\n        style = interpretTokenStyle(styles[i++], builder.cm.options);\n      }\n    }\n  }\n\n\n  // These objects are used to represent the visible (currently drawn)\n  // part of the document. A LineView may correspond to multiple\n  // logical lines, if those are connected by collapsed ranges.\n  function LineView(doc, line, lineN) {\n    // The starting line\n    this.line = line;\n    // Continuing lines, if any\n    this.rest = visualLineContinued(line);\n    // Number of logical lines in this visual line\n    this.size = this.rest ? lineNo(lst(this.rest)) - lineN + 1 : 1;\n    this.node = this.text = null;\n    this.hidden = lineIsHidden(doc, line);\n  }\n\n  // Create a range of LineView objects for the given lines.\n  function buildViewArray(cm, from, to) {\n    var array = [], nextPos;\n    for (var pos = from; pos < to; pos = nextPos) {\n      var view = new LineView(cm.doc, getLine(cm.doc, pos), pos);\n      nextPos = pos + view.size;\n      array.push(view);\n    }\n    return array\n  }\n\n  var operationGroup = null;\n\n  function pushOperation(op) {\n    if (operationGroup) {\n      operationGroup.ops.push(op);\n    } else {\n      op.ownsGroup = operationGroup = {\n        ops: [op],\n        delayedCallbacks: []\n      };\n    }\n  }\n\n  function fireCallbacksForOps(group) {\n    // Calls delayed callbacks and cursorActivity handlers until no\n    // new ones appear\n    var callbacks = group.delayedCallbacks, i = 0;\n    do {\n      for (; i < callbacks.length; i++)\n        { callbacks[i].call(null); }\n      for (var j = 0; j < group.ops.length; j++) {\n        var op = group.ops[j];\n        if (op.cursorActivityHandlers)\n          { while (op.cursorActivityCalled < op.cursorActivityHandlers.length)\n            { op.cursorActivityHandlers[op.cursorActivityCalled++].call(null, op.cm); } }\n      }\n    } while (i < callbacks.length)\n  }\n\n  function finishOperation(op, endCb) {\n    var group = op.ownsGroup;\n    if (!group) { return }\n\n    try { fireCallbacksForOps(group); }\n    finally {\n      operationGroup = null;\n      endCb(group);\n    }\n  }\n\n  var orphanDelayedCallbacks = null;\n\n  // Often, we want to signal events at a point where we are in the\n  // middle of some work, but don't want the handler to start calling\n  // other methods on the editor, which might be in an inconsistent\n  // state or simply not expect any other events to happen.\n  // signalLater looks whether there are any handlers, and schedules\n  // them to be executed when the last operation ends, or, if no\n  // operation is active, when a timeout fires.\n  function signalLater(emitter, type /*, values...*/) {\n    var arr = getHandlers(emitter, type);\n    if (!arr.length) { return }\n    var args = Array.prototype.slice.call(arguments, 2), list;\n    if (operationGroup) {\n      list = operationGroup.delayedCallbacks;\n    } else if (orphanDelayedCallbacks) {\n      list = orphanDelayedCallbacks;\n    } else {\n      list = orphanDelayedCallbacks = [];\n      setTimeout(fireOrphanDelayed, 0);\n    }\n    var loop = function ( i ) {\n      list.push(function () { return arr[i].apply(null, args); });\n    };\n\n    for (var i = 0; i < arr.length; ++i)\n      loop( i );\n  }\n\n  function fireOrphanDelayed() {\n    var delayed = orphanDelayedCallbacks;\n    orphanDelayedCallbacks = null;\n    for (var i = 0; i < delayed.length; ++i) { delayed[i](); }\n  }\n\n  // When an aspect of a line changes, a string is added to\n  // lineView.changes. This updates the relevant part of the line's\n  // DOM structure.\n  function updateLineForChanges(cm, lineView, lineN, dims) {\n    for (var j = 0; j < lineView.changes.length; j++) {\n      var type = lineView.changes[j];\n      if (type == \"text\") { updateLineText(cm, lineView); }\n      else if (type == \"gutter\") { updateLineGutter(cm, lineView, lineN, dims); }\n      else if (type == \"class\") { updateLineClasses(cm, lineView); }\n      else if (type == \"widget\") { updateLineWidgets(cm, lineView, dims); }\n    }\n    lineView.changes = null;\n  }\n\n  // Lines with gutter elements, widgets or a background class need to\n  // be wrapped, and have the extra elements added to the wrapper div\n  function ensureLineWrapped(lineView) {\n    if (lineView.node == lineView.text) {\n      lineView.node = elt(\"div\", null, null, \"position: relative\");\n      if (lineView.text.parentNode)\n        { lineView.text.parentNode.replaceChild(lineView.node, lineView.text); }\n      lineView.node.appendChild(lineView.text);\n      if (ie && ie_version < 8) { lineView.node.style.zIndex = 2; }\n    }\n    return lineView.node\n  }\n\n  function updateLineBackground(cm, lineView) {\n    var cls = lineView.bgClass ? lineView.bgClass + \" \" + (lineView.line.bgClass || \"\") : lineView.line.bgClass;\n    if (cls) { cls += \" CodeMirror-linebackground\"; }\n    if (lineView.background) {\n      if (cls) { lineView.background.className = cls; }\n      else { lineView.background.parentNode.removeChild(lineView.background); lineView.background = null; }\n    } else if (cls) {\n      var wrap = ensureLineWrapped(lineView);\n      lineView.background = wrap.insertBefore(elt(\"div\", null, cls), wrap.firstChild);\n      cm.display.input.setUneditable(lineView.background);\n    }\n  }\n\n  // Wrapper around buildLineContent which will reuse the structure\n  // in display.externalMeasured when possible.\n  function getLineContent(cm, lineView) {\n    var ext = cm.display.externalMeasured;\n    if (ext && ext.line == lineView.line) {\n      cm.display.externalMeasured = null;\n      lineView.measure = ext.measure;\n      return ext.built\n    }\n    return buildLineContent(cm, lineView)\n  }\n\n  // Redraw the line's text. Interacts with the background and text\n  // classes because the mode may output tokens that influence these\n  // classes.\n  function updateLineText(cm, lineView) {\n    var cls = lineView.text.className;\n    var built = getLineContent(cm, lineView);\n    if (lineView.text == lineView.node) { lineView.node = built.pre; }\n    lineView.text.parentNode.replaceChild(built.pre, lineView.text);\n    lineView.text = built.pre;\n    if (built.bgClass != lineView.bgClass || built.textClass != lineView.textClass) {\n      lineView.bgClass = built.bgClass;\n      lineView.textClass = built.textClass;\n      updateLineClasses(cm, lineView);\n    } else if (cls) {\n      lineView.text.className = cls;\n    }\n  }\n\n  function updateLineClasses(cm, lineView) {\n    updateLineBackground(cm, lineView);\n    if (lineView.line.wrapClass)\n      { ensureLineWrapped(lineView).className = lineView.line.wrapClass; }\n    else if (lineView.node != lineView.text)\n      { lineView.node.className = \"\"; }\n    var textClass = lineView.textClass ? lineView.textClass + \" \" + (lineView.line.textClass || \"\") : lineView.line.textClass;\n    lineView.text.className = textClass || \"\";\n  }\n\n  function updateLineGutter(cm, lineView, lineN, dims) {\n    if (lineView.gutter) {\n      lineView.node.removeChild(lineView.gutter);\n      lineView.gutter = null;\n    }\n    if (lineView.gutterBackground) {\n      lineView.node.removeChild(lineView.gutterBackground);\n      lineView.gutterBackground = null;\n    }\n    if (lineView.line.gutterClass) {\n      var wrap = ensureLineWrapped(lineView);\n      lineView.gutterBackground = elt(\"div\", null, \"CodeMirror-gutter-background \" + lineView.line.gutterClass,\n                                      (\"left: \" + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + \"px; width: \" + (dims.gutterTotalWidth) + \"px\"));\n      cm.display.input.setUneditable(lineView.gutterBackground);\n      wrap.insertBefore(lineView.gutterBackground, lineView.text);\n    }\n    var markers = lineView.line.gutterMarkers;\n    if (cm.options.lineNumbers || markers) {\n      var wrap$1 = ensureLineWrapped(lineView);\n      var gutterWrap = lineView.gutter = elt(\"div\", null, \"CodeMirror-gutter-wrapper\", (\"left: \" + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + \"px\"));\n      gutterWrap.setAttribute(\"aria-hidden\", \"true\");\n      cm.display.input.setUneditable(gutterWrap);\n      wrap$1.insertBefore(gutterWrap, lineView.text);\n      if (lineView.line.gutterClass)\n        { gutterWrap.className += \" \" + lineView.line.gutterClass; }\n      if (cm.options.lineNumbers && (!markers || !markers[\"CodeMirror-linenumbers\"]))\n        { lineView.lineNumber = gutterWrap.appendChild(\n          elt(\"div\", lineNumberFor(cm.options, lineN),\n              \"CodeMirror-linenumber CodeMirror-gutter-elt\",\n              (\"left: \" + (dims.gutterLeft[\"CodeMirror-linenumbers\"]) + \"px; width: \" + (cm.display.lineNumInnerWidth) + \"px\"))); }\n      if (markers) { for (var k = 0; k < cm.display.gutterSpecs.length; ++k) {\n        var id = cm.display.gutterSpecs[k].className, found = markers.hasOwnProperty(id) && markers[id];\n        if (found)\n          { gutterWrap.appendChild(elt(\"div\", [found], \"CodeMirror-gutter-elt\",\n                                     (\"left: \" + (dims.gutterLeft[id]) + \"px; width: \" + (dims.gutterWidth[id]) + \"px\"))); }\n      } }\n    }\n  }\n\n  function updateLineWidgets(cm, lineView, dims) {\n    if (lineView.alignable) { lineView.alignable = null; }\n    var isWidget = classTest(\"CodeMirror-linewidget\");\n    for (var node = lineView.node.firstChild, next = (void 0); node; node = next) {\n      next = node.nextSibling;\n      if (isWidget.test(node.className)) { lineView.node.removeChild(node); }\n    }\n    insertLineWidgets(cm, lineView, dims);\n  }\n\n  // Build a line's DOM representation from scratch\n  function buildLineElement(cm, lineView, lineN, dims) {\n    var built = getLineContent(cm, lineView);\n    lineView.text = lineView.node = built.pre;\n    if (built.bgClass) { lineView.bgClass = built.bgClass; }\n    if (built.textClass) { lineView.textClass = built.textClass; }\n\n    updateLineClasses(cm, lineView);\n    updateLineGutter(cm, lineView, lineN, dims);\n    insertLineWidgets(cm, lineView, dims);\n    return lineView.node\n  }\n\n  // A lineView may contain multiple logical lines (when merged by\n  // collapsed spans). The widgets for all of them need to be drawn.\n  function insertLineWidgets(cm, lineView, dims) {\n    insertLineWidgetsFor(cm, lineView.line, lineView, dims, true);\n    if (lineView.rest) { for (var i = 0; i < lineView.rest.length; i++)\n      { insertLineWidgetsFor(cm, lineView.rest[i], lineView, dims, false); } }\n  }\n\n  function insertLineWidgetsFor(cm, line, lineView, dims, allowAbove) {\n    if (!line.widgets) { return }\n    var wrap = ensureLineWrapped(lineView);\n    for (var i = 0, ws = line.widgets; i < ws.length; ++i) {\n      var widget = ws[i], node = elt(\"div\", [widget.node], \"CodeMirror-linewidget\" + (widget.className ? \" \" + widget.className : \"\"));\n      if (!widget.handleMouseEvents) { node.setAttribute(\"cm-ignore-events\", \"true\"); }\n      positionLineWidget(widget, node, lineView, dims);\n      cm.display.input.setUneditable(node);\n      if (allowAbove && widget.above)\n        { wrap.insertBefore(node, lineView.gutter || lineView.text); }\n      else\n        { wrap.appendChild(node); }\n      signalLater(widget, \"redraw\");\n    }\n  }\n\n  function positionLineWidget(widget, node, lineView, dims) {\n    if (widget.noHScroll) {\n  (lineView.alignable || (lineView.alignable = [])).push(node);\n      var width = dims.wrapperWidth;\n      node.style.left = dims.fixedPos + \"px\";\n      if (!widget.coverGutter) {\n        width -= dims.gutterTotalWidth;\n        node.style.paddingLeft = dims.gutterTotalWidth + \"px\";\n      }\n      node.style.width = width + \"px\";\n    }\n    if (widget.coverGutter) {\n      node.style.zIndex = 5;\n      node.style.position = \"relative\";\n      if (!widget.noHScroll) { node.style.marginLeft = -dims.gutterTotalWidth + \"px\"; }\n    }\n  }\n\n  function widgetHeight(widget) {\n    if (widget.height != null) { return widget.height }\n    var cm = widget.doc.cm;\n    if (!cm) { return 0 }\n    if (!contains(document.body, widget.node)) {\n      var parentStyle = \"position: relative;\";\n      if (widget.coverGutter)\n        { parentStyle += \"margin-left: -\" + cm.display.gutters.offsetWidth + \"px;\"; }\n      if (widget.noHScroll)\n        { parentStyle += \"width: \" + cm.display.wrapper.clientWidth + \"px;\"; }\n      removeChildrenAndAdd(cm.display.measure, elt(\"div\", [widget.node], null, parentStyle));\n    }\n    return widget.height = widget.node.parentNode.offsetHeight\n  }\n\n  // Return true when the given mouse event happened in a widget\n  function eventInWidget(display, e) {\n    for (var n = e_target(e); n != display.wrapper; n = n.parentNode) {\n      if (!n || (n.nodeType == 1 && n.getAttribute(\"cm-ignore-events\") == \"true\") ||\n          (n.parentNode == display.sizer && n != display.mover))\n        { return true }\n    }\n  }\n\n  // POSITION MEASUREMENT\n\n  function paddingTop(display) {return display.lineSpace.offsetTop}\n  function paddingVert(display) {return display.mover.offsetHeight - display.lineSpace.offsetHeight}\n  function paddingH(display) {\n    if (display.cachedPaddingH) { return display.cachedPaddingH }\n    var e = removeChildrenAndAdd(display.measure, elt(\"pre\", \"x\", \"CodeMirror-line-like\"));\n    var style = window.getComputedStyle ? window.getComputedStyle(e) : e.currentStyle;\n    var data = {left: parseInt(style.paddingLeft), right: parseInt(style.paddingRight)};\n    if (!isNaN(data.left) && !isNaN(data.right)) { display.cachedPaddingH = data; }\n    return data\n  }\n\n  function scrollGap(cm) { return scrollerGap - cm.display.nativeBarWidth }\n  function displayWidth(cm) {\n    return cm.display.scroller.clientWidth - scrollGap(cm) - cm.display.barWidth\n  }\n  function displayHeight(cm) {\n    return cm.display.scroller.clientHeight - scrollGap(cm) - cm.display.barHeight\n  }\n\n  // Ensure the lineView.wrapping.heights array is populated. This is\n  // an array of bottom offsets for the lines that make up a drawn\n  // line. When lineWrapping is on, there might be more than one\n  // height.\n  function ensureLineHeights(cm, lineView, rect) {\n    var wrapping = cm.options.lineWrapping;\n    var curWidth = wrapping && displayWidth(cm);\n    if (!lineView.measure.heights || wrapping && lineView.measure.width != curWidth) {\n      var heights = lineView.measure.heights = [];\n      if (wrapping) {\n        lineView.measure.width = curWidth;\n        var rects = lineView.text.firstChild.getClientRects();\n        for (var i = 0; i < rects.length - 1; i++) {\n          var cur = rects[i], next = rects[i + 1];\n          if (Math.abs(cur.bottom - next.bottom) > 2)\n            { heights.push((cur.bottom + next.top) / 2 - rect.top); }\n        }\n      }\n      heights.push(rect.bottom - rect.top);\n    }\n  }\n\n  // Find a line map (mapping character offsets to text nodes) and a\n  // measurement cache for the given line number. (A line view might\n  // contain multiple lines when collapsed ranges are present.)\n  function mapFromLineView(lineView, line, lineN) {\n    if (lineView.line == line)\n      { return {map: lineView.measure.map, cache: lineView.measure.cache} }\n    if (lineView.rest) {\n      for (var i = 0; i < lineView.rest.length; i++)\n        { if (lineView.rest[i] == line)\n          { return {map: lineView.measure.maps[i], cache: lineView.measure.caches[i]} } }\n      for (var i$1 = 0; i$1 < lineView.rest.length; i$1++)\n        { if (lineNo(lineView.rest[i$1]) > lineN)\n          { return {map: lineView.measure.maps[i$1], cache: lineView.measure.caches[i$1], before: true} } }\n    }\n  }\n\n  // Render a line into the hidden node display.externalMeasured. Used\n  // when measurement is needed for a line that's not in the viewport.\n  function updateExternalMeasurement(cm, line) {\n    line = visualLine(line);\n    var lineN = lineNo(line);\n    var view = cm.display.externalMeasured = new LineView(cm.doc, line, lineN);\n    view.lineN = lineN;\n    var built = view.built = buildLineContent(cm, view);\n    view.text = built.pre;\n    removeChildrenAndAdd(cm.display.lineMeasure, built.pre);\n    return view\n  }\n\n  // Get a {top, bottom, left, right} box (in line-local coordinates)\n  // for a given character.\n  function measureChar(cm, line, ch, bias) {\n    return measureCharPrepared(cm, prepareMeasureForLine(cm, line), ch, bias)\n  }\n\n  // Find a line view that corresponds to the given line number.\n  function findViewForLine(cm, lineN) {\n    if (lineN >= cm.display.viewFrom && lineN < cm.display.viewTo)\n      { return cm.display.view[findViewIndex(cm, lineN)] }\n    var ext = cm.display.externalMeasured;\n    if (ext && lineN >= ext.lineN && lineN < ext.lineN + ext.size)\n      { return ext }\n  }\n\n  // Measurement can be split in two steps, the set-up work that\n  // applies to the whole line, and the measurement of the actual\n  // character. Functions like coordsChar, that need to do a lot of\n  // measurements in a row, can thus ensure that the set-up work is\n  // only done once.\n  function prepareMeasureForLine(cm, line) {\n    var lineN = lineNo(line);\n    var view = findViewForLine(cm, lineN);\n    if (view && !view.text) {\n      view = null;\n    } else if (view && view.changes) {\n      updateLineForChanges(cm, view, lineN, getDimensions(cm));\n      cm.curOp.forceUpdate = true;\n    }\n    if (!view)\n      { view = updateExternalMeasurement(cm, line); }\n\n    var info = mapFromLineView(view, line, lineN);\n    return {\n      line: line, view: view, rect: null,\n      map: info.map, cache: info.cache, before: info.before,\n      hasHeights: false\n    }\n  }\n\n  // Given a prepared measurement object, measures the position of an\n  // actual character (or fetches it from the cache).\n  function measureCharPrepared(cm, prepared, ch, bias, varHeight) {\n    if (prepared.before) { ch = -1; }\n    var key = ch + (bias || \"\"), found;\n    if (prepared.cache.hasOwnProperty(key)) {\n      found = prepared.cache[key];\n    } else {\n      if (!prepared.rect)\n        { prepared.rect = prepared.view.text.getBoundingClientRect(); }\n      if (!prepared.hasHeights) {\n        ensureLineHeights(cm, prepared.view, prepared.rect);\n        prepared.hasHeights = true;\n      }\n      found = measureCharInner(cm, prepared, ch, bias);\n      if (!found.bogus) { prepared.cache[key] = found; }\n    }\n    return {left: found.left, right: found.right,\n            top: varHeight ? found.rtop : found.top,\n            bottom: varHeight ? found.rbottom : found.bottom}\n  }\n\n  var nullRect = {left: 0, right: 0, top: 0, bottom: 0};\n\n  function nodeAndOffsetInLineMap(map, ch, bias) {\n    var node, start, end, collapse, mStart, mEnd;\n    // First, search the line map for the text node corresponding to,\n    // or closest to, the target character.\n    for (var i = 0; i < map.length; i += 3) {\n      mStart = map[i];\n      mEnd = map[i + 1];\n      if (ch < mStart) {\n        start = 0; end = 1;\n        collapse = \"left\";\n      } else if (ch < mEnd) {\n        start = ch - mStart;\n        end = start + 1;\n      } else if (i == map.length - 3 || ch == mEnd && map[i + 3] > ch) {\n        end = mEnd - mStart;\n        start = end - 1;\n        if (ch >= mEnd) { collapse = \"right\"; }\n      }\n      if (start != null) {\n        node = map[i + 2];\n        if (mStart == mEnd && bias == (node.insertLeft ? \"left\" : \"right\"))\n          { collapse = bias; }\n        if (bias == \"left\" && start == 0)\n          { while (i && map[i - 2] == map[i - 3] && map[i - 1].insertLeft) {\n            node = map[(i -= 3) + 2];\n            collapse = \"left\";\n          } }\n        if (bias == \"right\" && start == mEnd - mStart)\n          { while (i < map.length - 3 && map[i + 3] == map[i + 4] && !map[i + 5].insertLeft) {\n            node = map[(i += 3) + 2];\n            collapse = \"right\";\n          } }\n        break\n      }\n    }\n    return {node: node, start: start, end: end, collapse: collapse, coverStart: mStart, coverEnd: mEnd}\n  }\n\n  function getUsefulRect(rects, bias) {\n    var rect = nullRect;\n    if (bias == \"left\") { for (var i = 0; i < rects.length; i++) {\n      if ((rect = rects[i]).left != rect.right) { break }\n    } } else { for (var i$1 = rects.length - 1; i$1 >= 0; i$1--) {\n      if ((rect = rects[i$1]).left != rect.right) { break }\n    } }\n    return rect\n  }\n\n  function measureCharInner(cm, prepared, ch, bias) {\n    var place = nodeAndOffsetInLineMap(prepared.map, ch, bias);\n    var node = place.node, start = place.start, end = place.end, collapse = place.collapse;\n\n    var rect;\n    if (node.nodeType == 3) { // If it is a text node, use a range to retrieve the coordinates.\n      for (var i$1 = 0; i$1 < 4; i$1++) { // Retry a maximum of 4 times when nonsense rectangles are returned\n        while (start && isExtendingChar(prepared.line.text.charAt(place.coverStart + start))) { --start; }\n        while (place.coverStart + end < place.coverEnd && isExtendingChar(prepared.line.text.charAt(place.coverStart + end))) { ++end; }\n        if (ie && ie_version < 9 && start == 0 && end == place.coverEnd - place.coverStart)\n          { rect = node.parentNode.getBoundingClientRect(); }\n        else\n          { rect = getUsefulRect(range(node, start, end).getClientRects(), bias); }\n        if (rect.left || rect.right || start == 0) { break }\n        end = start;\n        start = start - 1;\n        collapse = \"right\";\n      }\n      if (ie && ie_version < 11) { rect = maybeUpdateRectForZooming(cm.display.measure, rect); }\n    } else { // If it is a widget, simply get the box for the whole widget.\n      if (start > 0) { collapse = bias = \"right\"; }\n      var rects;\n      if (cm.options.lineWrapping && (rects = node.getClientRects()).length > 1)\n        { rect = rects[bias == \"right\" ? rects.length - 1 : 0]; }\n      else\n        { rect = node.getBoundingClientRect(); }\n    }\n    if (ie && ie_version < 9 && !start && (!rect || !rect.left && !rect.right)) {\n      var rSpan = node.parentNode.getClientRects()[0];\n      if (rSpan)\n        { rect = {left: rSpan.left, right: rSpan.left + charWidth(cm.display), top: rSpan.top, bottom: rSpan.bottom}; }\n      else\n        { rect = nullRect; }\n    }\n\n    var rtop = rect.top - prepared.rect.top, rbot = rect.bottom - prepared.rect.top;\n    var mid = (rtop + rbot) / 2;\n    var heights = prepared.view.measure.heights;\n    var i = 0;\n    for (; i < heights.length - 1; i++)\n      { if (mid < heights[i]) { break } }\n    var top = i ? heights[i - 1] : 0, bot = heights[i];\n    var result = {left: (collapse == \"right\" ? rect.right : rect.left) - prepared.rect.left,\n                  right: (collapse == \"left\" ? rect.left : rect.right) - prepared.rect.left,\n                  top: top, bottom: bot};\n    if (!rect.left && !rect.right) { result.bogus = true; }\n    if (!cm.options.singleCursorHeightPerLine) { result.rtop = rtop; result.rbottom = rbot; }\n\n    return result\n  }\n\n  // Work around problem with bounding client rects on ranges being\n  // returned incorrectly when zoomed on IE10 and below.\n  function maybeUpdateRectForZooming(measure, rect) {\n    if (!window.screen || screen.logicalXDPI == null ||\n        screen.logicalXDPI == screen.deviceXDPI || !hasBadZoomedRects(measure))\n      { return rect }\n    var scaleX = screen.logicalXDPI / screen.deviceXDPI;\n    var scaleY = screen.logicalYDPI / screen.deviceYDPI;\n    return {left: rect.left * scaleX, right: rect.right * scaleX,\n            top: rect.top * scaleY, bottom: rect.bottom * scaleY}\n  }\n\n  function clearLineMeasurementCacheFor(lineView) {\n    if (lineView.measure) {\n      lineView.measure.cache = {};\n      lineView.measure.heights = null;\n      if (lineView.rest) { for (var i = 0; i < lineView.rest.length; i++)\n        { lineView.measure.caches[i] = {}; } }\n    }\n  }\n\n  function clearLineMeasurementCache(cm) {\n    cm.display.externalMeasure = null;\n    removeChildren(cm.display.lineMeasure);\n    for (var i = 0; i < cm.display.view.length; i++)\n      { clearLineMeasurementCacheFor(cm.display.view[i]); }\n  }\n\n  function clearCaches(cm) {\n    clearLineMeasurementCache(cm);\n    cm.display.cachedCharWidth = cm.display.cachedTextHeight = cm.display.cachedPaddingH = null;\n    if (!cm.options.lineWrapping) { cm.display.maxLineChanged = true; }\n    cm.display.lineNumChars = null;\n  }\n\n  function pageScrollX(doc) {\n    // Work around https://bugs.chromium.org/p/chromium/issues/detail?id=489206\n    // which causes page_Offset and bounding client rects to use\n    // different reference viewports and invalidate our calculations.\n    if (chrome && android) { return -(doc.body.getBoundingClientRect().left - parseInt(getComputedStyle(doc.body).marginLeft)) }\n    return doc.defaultView.pageXOffset || (doc.documentElement || doc.body).scrollLeft\n  }\n  function pageScrollY(doc) {\n    if (chrome && android) { return -(doc.body.getBoundingClientRect().top - parseInt(getComputedStyle(doc.body).marginTop)) }\n    return doc.defaultView.pageYOffset || (doc.documentElement || doc.body).scrollTop\n  }\n\n  function widgetTopHeight(lineObj) {\n    var ref = visualLine(lineObj);\n    var widgets = ref.widgets;\n    var height = 0;\n    if (widgets) { for (var i = 0; i < widgets.length; ++i) { if (widgets[i].above)\n      { height += widgetHeight(widgets[i]); } } }\n    return height\n  }\n\n  // Converts a {top, bottom, left, right} box from line-local\n  // coordinates into another coordinate system. Context may be one of\n  // \"line\", \"div\" (display.lineDiv), \"local\"./null (editor), \"window\",\n  // or \"page\".\n  function intoCoordSystem(cm, lineObj, rect, context, includeWidgets) {\n    if (!includeWidgets) {\n      var height = widgetTopHeight(lineObj);\n      rect.top += height; rect.bottom += height;\n    }\n    if (context == \"line\") { return rect }\n    if (!context) { context = \"local\"; }\n    var yOff = heightAtLine(lineObj);\n    if (context == \"local\") { yOff += paddingTop(cm.display); }\n    else { yOff -= cm.display.viewOffset; }\n    if (context == \"page\" || context == \"window\") {\n      var lOff = cm.display.lineSpace.getBoundingClientRect();\n      yOff += lOff.top + (context == \"window\" ? 0 : pageScrollY(doc(cm)));\n      var xOff = lOff.left + (context == \"window\" ? 0 : pageScrollX(doc(cm)));\n      rect.left += xOff; rect.right += xOff;\n    }\n    rect.top += yOff; rect.bottom += yOff;\n    return rect\n  }\n\n  // Coverts a box from \"div\" coords to another coordinate system.\n  // Context may be \"window\", \"page\", \"div\", or \"local\"./null.\n  function fromCoordSystem(cm, coords, context) {\n    if (context == \"div\") { return coords }\n    var left = coords.left, top = coords.top;\n    // First move into \"page\" coordinate system\n    if (context == \"page\") {\n      left -= pageScrollX(doc(cm));\n      top -= pageScrollY(doc(cm));\n    } else if (context == \"local\" || !context) {\n      var localBox = cm.display.sizer.getBoundingClientRect();\n      left += localBox.left;\n      top += localBox.top;\n    }\n\n    var lineSpaceBox = cm.display.lineSpace.getBoundingClientRect();\n    return {left: left - lineSpaceBox.left, top: top - lineSpaceBox.top}\n  }\n\n  function charCoords(cm, pos, context, lineObj, bias) {\n    if (!lineObj) { lineObj = getLine(cm.doc, pos.line); }\n    return intoCoordSystem(cm, lineObj, measureChar(cm, lineObj, pos.ch, bias), context)\n  }\n\n  // Returns a box for a given cursor position, which may have an\n  // 'other' property containing the position of the secondary cursor\n  // on a bidi boundary.\n  // A cursor Pos(line, char, \"before\") is on the same visual line as `char - 1`\n  // and after `char - 1` in writing order of `char - 1`\n  // A cursor Pos(line, char, \"after\") is on the same visual line as `char`\n  // and before `char` in writing order of `char`\n  // Examples (upper-case letters are RTL, lower-case are LTR):\n  //     Pos(0, 1, ...)\n  //     before   after\n  // ab     a|b     a|b\n  // aB     a|B     aB|\n  // Ab     |Ab     A|b\n  // AB     B|A     B|A\n  // Every position after the last character on a line is considered to stick\n  // to the last character on the line.\n  function cursorCoords(cm, pos, context, lineObj, preparedMeasure, varHeight) {\n    lineObj = lineObj || getLine(cm.doc, pos.line);\n    if (!preparedMeasure) { preparedMeasure = prepareMeasureForLine(cm, lineObj); }\n    function get(ch, right) {\n      var m = measureCharPrepared(cm, preparedMeasure, ch, right ? \"right\" : \"left\", varHeight);\n      if (right) { m.left = m.right; } else { m.right = m.left; }\n      return intoCoordSystem(cm, lineObj, m, context)\n    }\n    var order = getOrder(lineObj, cm.doc.direction), ch = pos.ch, sticky = pos.sticky;\n    if (ch >= lineObj.text.length) {\n      ch = lineObj.text.length;\n      sticky = \"before\";\n    } else if (ch <= 0) {\n      ch = 0;\n      sticky = \"after\";\n    }\n    if (!order) { return get(sticky == \"before\" ? ch - 1 : ch, sticky == \"before\") }\n\n    function getBidi(ch, partPos, invert) {\n      var part = order[partPos], right = part.level == 1;\n      return get(invert ? ch - 1 : ch, right != invert)\n    }\n    var partPos = getBidiPartAt(order, ch, sticky);\n    var other = bidiOther;\n    var val = getBidi(ch, partPos, sticky == \"before\");\n    if (other != null) { val.other = getBidi(ch, other, sticky != \"before\"); }\n    return val\n  }\n\n  // Used to cheaply estimate the coordinates for a position. Used for\n  // intermediate scroll updates.\n  function estimateCoords(cm, pos) {\n    var left = 0;\n    pos = clipPos(cm.doc, pos);\n    if (!cm.options.lineWrapping) { left = charWidth(cm.display) * pos.ch; }\n    var lineObj = getLine(cm.doc, pos.line);\n    var top = heightAtLine(lineObj) + paddingTop(cm.display);\n    return {left: left, right: left, top: top, bottom: top + lineObj.height}\n  }\n\n  // Positions returned by coordsChar contain some extra information.\n  // xRel is the relative x position of the input coordinates compared\n  // to the found position (so xRel > 0 means the coordinates are to\n  // the right of the character position, for example). When outside\n  // is true, that means the coordinates lie outside the line's\n  // vertical range.\n  function PosWithInfo(line, ch, sticky, outside, xRel) {\n    var pos = Pos(line, ch, sticky);\n    pos.xRel = xRel;\n    if (outside) { pos.outside = outside; }\n    return pos\n  }\n\n  // Compute the character position closest to the given coordinates.\n  // Input must be lineSpace-local (\"div\" coordinate system).\n  function coordsChar(cm, x, y) {\n    var doc = cm.doc;\n    y += cm.display.viewOffset;\n    if (y < 0) { return PosWithInfo(doc.first, 0, null, -1, -1) }\n    var lineN = lineAtHeight(doc, y), last = doc.first + doc.size - 1;\n    if (lineN > last)\n      { return PosWithInfo(doc.first + doc.size - 1, getLine(doc, last).text.length, null, 1, 1) }\n    if (x < 0) { x = 0; }\n\n    var lineObj = getLine(doc, lineN);\n    for (;;) {\n      var found = coordsCharInner(cm, lineObj, lineN, x, y);\n      var collapsed = collapsedSpanAround(lineObj, found.ch + (found.xRel > 0 || found.outside > 0 ? 1 : 0));\n      if (!collapsed) { return found }\n      var rangeEnd = collapsed.find(1);\n      if (rangeEnd.line == lineN) { return rangeEnd }\n      lineObj = getLine(doc, lineN = rangeEnd.line);\n    }\n  }\n\n  function wrappedLineExtent(cm, lineObj, preparedMeasure, y) {\n    y -= widgetTopHeight(lineObj);\n    var end = lineObj.text.length;\n    var begin = findFirst(function (ch) { return measureCharPrepared(cm, preparedMeasure, ch - 1).bottom <= y; }, end, 0);\n    end = findFirst(function (ch) { return measureCharPrepared(cm, preparedMeasure, ch).top > y; }, begin, end);\n    return {begin: begin, end: end}\n  }\n\n  function wrappedLineExtentChar(cm, lineObj, preparedMeasure, target) {\n    if (!preparedMeasure) { preparedMeasure = prepareMeasureForLine(cm, lineObj); }\n    var targetTop = intoCoordSystem(cm, lineObj, measureCharPrepared(cm, preparedMeasure, target), \"line\").top;\n    return wrappedLineExtent(cm, lineObj, preparedMeasure, targetTop)\n  }\n\n  // Returns true if the given side of a box is after the given\n  // coordinates, in top-to-bottom, left-to-right order.\n  function boxIsAfter(box, x, y, left) {\n    return box.bottom <= y ? false : box.top > y ? true : (left ? box.left : box.right) > x\n  }\n\n  function coordsCharInner(cm, lineObj, lineNo, x, y) {\n    // Move y into line-local coordinate space\n    y -= heightAtLine(lineObj);\n    var preparedMeasure = prepareMeasureForLine(cm, lineObj);\n    // When directly calling `measureCharPrepared`, we have to adjust\n    // for the widgets at this line.\n    var widgetHeight = widgetTopHeight(lineObj);\n    var begin = 0, end = lineObj.text.length, ltr = true;\n\n    var order = getOrder(lineObj, cm.doc.direction);\n    // If the line isn't plain left-to-right text, first figure out\n    // which bidi section the coordinates fall into.\n    if (order) {\n      var part = (cm.options.lineWrapping ? coordsBidiPartWrapped : coordsBidiPart)\n                   (cm, lineObj, lineNo, preparedMeasure, order, x, y);\n      ltr = part.level != 1;\n      // The awkward -1 offsets are needed because findFirst (called\n      // on these below) will treat its first bound as inclusive,\n      // second as exclusive, but we want to actually address the\n      // characters in the part's range\n      begin = ltr ? part.from : part.to - 1;\n      end = ltr ? part.to : part.from - 1;\n    }\n\n    // A binary search to find the first character whose bounding box\n    // starts after the coordinates. If we run across any whose box wrap\n    // the coordinates, store that.\n    var chAround = null, boxAround = null;\n    var ch = findFirst(function (ch) {\n      var box = measureCharPrepared(cm, preparedMeasure, ch);\n      box.top += widgetHeight; box.bottom += widgetHeight;\n      if (!boxIsAfter(box, x, y, false)) { return false }\n      if (box.top <= y && box.left <= x) {\n        chAround = ch;\n        boxAround = box;\n      }\n      return true\n    }, begin, end);\n\n    var baseX, sticky, outside = false;\n    // If a box around the coordinates was found, use that\n    if (boxAround) {\n      // Distinguish coordinates nearer to the left or right side of the box\n      var atLeft = x - boxAround.left < boxAround.right - x, atStart = atLeft == ltr;\n      ch = chAround + (atStart ? 0 : 1);\n      sticky = atStart ? \"after\" : \"before\";\n      baseX = atLeft ? boxAround.left : boxAround.right;\n    } else {\n      // (Adjust for extended bound, if necessary.)\n      if (!ltr && (ch == end || ch == begin)) { ch++; }\n      // To determine which side to associate with, get the box to the\n      // left of the character and compare it's vertical position to the\n      // coordinates\n      sticky = ch == 0 ? \"after\" : ch == lineObj.text.length ? \"before\" :\n        (measureCharPrepared(cm, preparedMeasure, ch - (ltr ? 1 : 0)).bottom + widgetHeight <= y) == ltr ?\n        \"after\" : \"before\";\n      // Now get accurate coordinates for this place, in order to get a\n      // base X position\n      var coords = cursorCoords(cm, Pos(lineNo, ch, sticky), \"line\", lineObj, preparedMeasure);\n      baseX = coords.left;\n      outside = y < coords.top ? -1 : y >= coords.bottom ? 1 : 0;\n    }\n\n    ch = skipExtendingChars(lineObj.text, ch, 1);\n    return PosWithInfo(lineNo, ch, sticky, outside, x - baseX)\n  }\n\n  function coordsBidiPart(cm, lineObj, lineNo, preparedMeasure, order, x, y) {\n    // Bidi parts are sorted left-to-right, and in a non-line-wrapping\n    // situation, we can take this ordering to correspond to the visual\n    // ordering. This finds the first part whose end is after the given\n    // coordinates.\n    var index = findFirst(function (i) {\n      var part = order[i], ltr = part.level != 1;\n      return boxIsAfter(cursorCoords(cm, Pos(lineNo, ltr ? part.to : part.from, ltr ? \"before\" : \"after\"),\n                                     \"line\", lineObj, preparedMeasure), x, y, true)\n    }, 0, order.length - 1);\n    var part = order[index];\n    // If this isn't the first part, the part's start is also after\n    // the coordinates, and the coordinates aren't on the same line as\n    // that start, move one part back.\n    if (index > 0) {\n      var ltr = part.level != 1;\n      var start = cursorCoords(cm, Pos(lineNo, ltr ? part.from : part.to, ltr ? \"after\" : \"before\"),\n                               \"line\", lineObj, preparedMeasure);\n      if (boxIsAfter(start, x, y, true) && start.top > y)\n        { part = order[index - 1]; }\n    }\n    return part\n  }\n\n  function coordsBidiPartWrapped(cm, lineObj, _lineNo, preparedMeasure, order, x, y) {\n    // In a wrapped line, rtl text on wrapping boundaries can do things\n    // that don't correspond to the ordering in our `order` array at\n    // all, so a binary search doesn't work, and we want to return a\n    // part that only spans one line so that the binary search in\n    // coordsCharInner is safe. As such, we first find the extent of the\n    // wrapped line, and then do a flat search in which we discard any\n    // spans that aren't on the line.\n    var ref = wrappedLineExtent(cm, lineObj, preparedMeasure, y);\n    var begin = ref.begin;\n    var end = ref.end;\n    if (/\\s/.test(lineObj.text.charAt(end - 1))) { end--; }\n    var part = null, closestDist = null;\n    for (var i = 0; i < order.length; i++) {\n      var p = order[i];\n      if (p.from >= end || p.to <= begin) { continue }\n      var ltr = p.level != 1;\n      var endX = measureCharPrepared(cm, preparedMeasure, ltr ? Math.min(end, p.to) - 1 : Math.max(begin, p.from)).right;\n      // Weigh against spans ending before this, so that they are only\n      // picked if nothing ends after\n      var dist = endX < x ? x - endX + 1e9 : endX - x;\n      if (!part || closestDist > dist) {\n        part = p;\n        closestDist = dist;\n      }\n    }\n    if (!part) { part = order[order.length - 1]; }\n    // Clip the part to the wrapped line.\n    if (part.from < begin) { part = {from: begin, to: part.to, level: part.level}; }\n    if (part.to > end) { part = {from: part.from, to: end, level: part.level}; }\n    return part\n  }\n\n  var measureText;\n  // Compute the default text height.\n  function textHeight(display) {\n    if (display.cachedTextHeight != null) { return display.cachedTextHeight }\n    if (measureText == null) {\n      measureText = elt(\"pre\", null, \"CodeMirror-line-like\");\n      // Measure a bunch of lines, for browsers that compute\n      // fractional heights.\n      for (var i = 0; i < 49; ++i) {\n        measureText.appendChild(document.createTextNode(\"x\"));\n        measureText.appendChild(elt(\"br\"));\n      }\n      measureText.appendChild(document.createTextNode(\"x\"));\n    }\n    removeChildrenAndAdd(display.measure, measureText);\n    var height = measureText.offsetHeight / 50;\n    if (height > 3) { display.cachedTextHeight = height; }\n    removeChildren(display.measure);\n    return height || 1\n  }\n\n  // Compute the default character width.\n  function charWidth(display) {\n    if (display.cachedCharWidth != null) { return display.cachedCharWidth }\n    var anchor = elt(\"span\", \"xxxxxxxxxx\");\n    var pre = elt(\"pre\", [anchor], \"CodeMirror-line-like\");\n    removeChildrenAndAdd(display.measure, pre);\n    var rect = anchor.getBoundingClientRect(), width = (rect.right - rect.left) / 10;\n    if (width > 2) { display.cachedCharWidth = width; }\n    return width || 10\n  }\n\n  // Do a bulk-read of the DOM positions and sizes needed to draw the\n  // view, so that we don't interleave reading and writing to the DOM.\n  function getDimensions(cm) {\n    var d = cm.display, left = {}, width = {};\n    var gutterLeft = d.gutters.clientLeft;\n    for (var n = d.gutters.firstChild, i = 0; n; n = n.nextSibling, ++i) {\n      var id = cm.display.gutterSpecs[i].className;\n      left[id] = n.offsetLeft + n.clientLeft + gutterLeft;\n      width[id] = n.clientWidth;\n    }\n    return {fixedPos: compensateForHScroll(d),\n            gutterTotalWidth: d.gutters.offsetWidth,\n            gutterLeft: left,\n            gutterWidth: width,\n            wrapperWidth: d.wrapper.clientWidth}\n  }\n\n  // Computes display.scroller.scrollLeft + display.gutters.offsetWidth,\n  // but using getBoundingClientRect to get a sub-pixel-accurate\n  // result.\n  function compensateForHScroll(display) {\n    return display.scroller.getBoundingClientRect().left - display.sizer.getBoundingClientRect().left\n  }\n\n  // Returns a function that estimates the height of a line, to use as\n  // first approximation until the line becomes visible (and is thus\n  // properly measurable).\n  function estimateHeight(cm) {\n    var th = textHeight(cm.display), wrapping = cm.options.lineWrapping;\n    var perLine = wrapping && Math.max(5, cm.display.scroller.clientWidth / charWidth(cm.display) - 3);\n    return function (line) {\n      if (lineIsHidden(cm.doc, line)) { return 0 }\n\n      var widgetsHeight = 0;\n      if (line.widgets) { for (var i = 0; i < line.widgets.length; i++) {\n        if (line.widgets[i].height) { widgetsHeight += line.widgets[i].height; }\n      } }\n\n      if (wrapping)\n        { return widgetsHeight + (Math.ceil(line.text.length / perLine) || 1) * th }\n      else\n        { return widgetsHeight + th }\n    }\n  }\n\n  function estimateLineHeights(cm) {\n    var doc = cm.doc, est = estimateHeight(cm);\n    doc.iter(function (line) {\n      var estHeight = est(line);\n      if (estHeight != line.height) { updateLineHeight(line, estHeight); }\n    });\n  }\n\n  // Given a mouse event, find the corresponding position. If liberal\n  // is false, it checks whether a gutter or scrollbar was clicked,\n  // and returns null if it was. forRect is used by rectangular\n  // selections, and tries to estimate a character position even for\n  // coordinates beyond the right of the text.\n  function posFromMouse(cm, e, liberal, forRect) {\n    var display = cm.display;\n    if (!liberal && e_target(e).getAttribute(\"cm-not-content\") == \"true\") { return null }\n\n    var x, y, space = display.lineSpace.getBoundingClientRect();\n    // Fails unpredictably on IE[67] when mouse is dragged around quickly.\n    try { x = e.clientX - space.left; y = e.clientY - space.top; }\n    catch (e$1) { return null }\n    var coords = coordsChar(cm, x, y), line;\n    if (forRect && coords.xRel > 0 && (line = getLine(cm.doc, coords.line).text).length == coords.ch) {\n      var colDiff = countColumn(line, line.length, cm.options.tabSize) - line.length;\n      coords = Pos(coords.line, Math.max(0, Math.round((x - paddingH(cm.display).left) / charWidth(cm.display)) - colDiff));\n    }\n    return coords\n  }\n\n  // Find the view element corresponding to a given line. Return null\n  // when the line isn't visible.\n  function findViewIndex(cm, n) {\n    if (n >= cm.display.viewTo) { return null }\n    n -= cm.display.viewFrom;\n    if (n < 0) { return null }\n    var view = cm.display.view;\n    for (var i = 0; i < view.length; i++) {\n      n -= view[i].size;\n      if (n < 0) { return i }\n    }\n  }\n\n  // Updates the display.view data structure for a given change to the\n  // document. From and to are in pre-change coordinates. Lendiff is\n  // the amount of lines added or subtracted by the change. This is\n  // used for changes that span multiple lines, or change the way\n  // lines are divided into visual lines. regLineChange (below)\n  // registers single-line changes.\n  function regChange(cm, from, to, lendiff) {\n    if (from == null) { from = cm.doc.first; }\n    if (to == null) { to = cm.doc.first + cm.doc.size; }\n    if (!lendiff) { lendiff = 0; }\n\n    var display = cm.display;\n    if (lendiff && to < display.viewTo &&\n        (display.updateLineNumbers == null || display.updateLineNumbers > from))\n      { display.updateLineNumbers = from; }\n\n    cm.curOp.viewChanged = true;\n\n    if (from >= display.viewTo) { // Change after\n      if (sawCollapsedSpans && visualLineNo(cm.doc, from) < display.viewTo)\n        { resetView(cm); }\n    } else if (to <= display.viewFrom) { // Change before\n      if (sawCollapsedSpans && visualLineEndNo(cm.doc, to + lendiff) > display.viewFrom) {\n        resetView(cm);\n      } else {\n        display.viewFrom += lendiff;\n        display.viewTo += lendiff;\n      }\n    } else if (from <= display.viewFrom && to >= display.viewTo) { // Full overlap\n      resetView(cm);\n    } else if (from <= display.viewFrom) { // Top overlap\n      var cut = viewCuttingPoint(cm, to, to + lendiff, 1);\n      if (cut) {\n        display.view = display.view.slice(cut.index);\n        display.viewFrom = cut.lineN;\n        display.viewTo += lendiff;\n      } else {\n        resetView(cm);\n      }\n    } else if (to >= display.viewTo) { // Bottom overlap\n      var cut$1 = viewCuttingPoint(cm, from, from, -1);\n      if (cut$1) {\n        display.view = display.view.slice(0, cut$1.index);\n        display.viewTo = cut$1.lineN;\n      } else {\n        resetView(cm);\n      }\n    } else { // Gap in the middle\n      var cutTop = viewCuttingPoint(cm, from, from, -1);\n      var cutBot = viewCuttingPoint(cm, to, to + lendiff, 1);\n      if (cutTop && cutBot) {\n        display.view = display.view.slice(0, cutTop.index)\n          .concat(buildViewArray(cm, cutTop.lineN, cutBot.lineN))\n          .concat(display.view.slice(cutBot.index));\n        display.viewTo += lendiff;\n      } else {\n        resetView(cm);\n      }\n    }\n\n    var ext = display.externalMeasured;\n    if (ext) {\n      if (to < ext.lineN)\n        { ext.lineN += lendiff; }\n      else if (from < ext.lineN + ext.size)\n        { display.externalMeasured = null; }\n    }\n  }\n\n  // Register a change to a single line. Type must be one of \"text\",\n  // \"gutter\", \"class\", \"widget\"\n  function regLineChange(cm, line, type) {\n    cm.curOp.viewChanged = true;\n    var display = cm.display, ext = cm.display.externalMeasured;\n    if (ext && line >= ext.lineN && line < ext.lineN + ext.size)\n      { display.externalMeasured = null; }\n\n    if (line < display.viewFrom || line >= display.viewTo) { return }\n    var lineView = display.view[findViewIndex(cm, line)];\n    if (lineView.node == null) { return }\n    var arr = lineView.changes || (lineView.changes = []);\n    if (indexOf(arr, type) == -1) { arr.push(type); }\n  }\n\n  // Clear the view.\n  function resetView(cm) {\n    cm.display.viewFrom = cm.display.viewTo = cm.doc.first;\n    cm.display.view = [];\n    cm.display.viewOffset = 0;\n  }\n\n  function viewCuttingPoint(cm, oldN, newN, dir) {\n    var index = findViewIndex(cm, oldN), diff, view = cm.display.view;\n    if (!sawCollapsedSpans || newN == cm.doc.first + cm.doc.size)\n      { return {index: index, lineN: newN} }\n    var n = cm.display.viewFrom;\n    for (var i = 0; i < index; i++)\n      { n += view[i].size; }\n    if (n != oldN) {\n      if (dir > 0) {\n        if (index == view.length - 1) { return null }\n        diff = (n + view[index].size) - oldN;\n        index++;\n      } else {\n        diff = n - oldN;\n      }\n      oldN += diff; newN += diff;\n    }\n    while (visualLineNo(cm.doc, newN) != newN) {\n      if (index == (dir < 0 ? 0 : view.length - 1)) { return null }\n      newN += dir * view[index - (dir < 0 ? 1 : 0)].size;\n      index += dir;\n    }\n    return {index: index, lineN: newN}\n  }\n\n  // Force the view to cover a given range, adding empty view element\n  // or clipping off existing ones as needed.\n  function adjustView(cm, from, to) {\n    var display = cm.display, view = display.view;\n    if (view.length == 0 || from >= display.viewTo || to <= display.viewFrom) {\n      display.view = buildViewArray(cm, from, to);\n      display.viewFrom = from;\n    } else {\n      if (display.viewFrom > from)\n        { display.view = buildViewArray(cm, from, display.viewFrom).concat(display.view); }\n      else if (display.viewFrom < from)\n        { display.view = display.view.slice(findViewIndex(cm, from)); }\n      display.viewFrom = from;\n      if (display.viewTo < to)\n        { display.view = display.view.concat(buildViewArray(cm, display.viewTo, to)); }\n      else if (display.viewTo > to)\n        { display.view = display.view.slice(0, findViewIndex(cm, to)); }\n    }\n    display.viewTo = to;\n  }\n\n  // Count the number of lines in the view whose DOM representation is\n  // out of date (or nonexistent).\n  function countDirtyView(cm) {\n    var view = cm.display.view, dirty = 0;\n    for (var i = 0; i < view.length; i++) {\n      var lineView = view[i];\n      if (!lineView.hidden && (!lineView.node || lineView.changes)) { ++dirty; }\n    }\n    return dirty\n  }\n\n  function updateSelection(cm) {\n    cm.display.input.showSelection(cm.display.input.prepareSelection());\n  }\n\n  function prepareSelection(cm, primary) {\n    if ( primary === void 0 ) primary = true;\n\n    var doc = cm.doc, result = {};\n    var curFragment = result.cursors = document.createDocumentFragment();\n    var selFragment = result.selection = document.createDocumentFragment();\n\n    var customCursor = cm.options.$customCursor;\n    if (customCursor) { primary = true; }\n    for (var i = 0; i < doc.sel.ranges.length; i++) {\n      if (!primary && i == doc.sel.primIndex) { continue }\n      var range = doc.sel.ranges[i];\n      if (range.from().line >= cm.display.viewTo || range.to().line < cm.display.viewFrom) { continue }\n      var collapsed = range.empty();\n      if (customCursor) {\n        var head = customCursor(cm, range);\n        if (head) { drawSelectionCursor(cm, head, curFragment); }\n      } else if (collapsed || cm.options.showCursorWhenSelecting) {\n        drawSelectionCursor(cm, range.head, curFragment);\n      }\n      if (!collapsed)\n        { drawSelectionRange(cm, range, selFragment); }\n    }\n    return result\n  }\n\n  // Draws a cursor for the given range\n  function drawSelectionCursor(cm, head, output) {\n    var pos = cursorCoords(cm, head, \"div\", null, null, !cm.options.singleCursorHeightPerLine);\n\n    var cursor = output.appendChild(elt(\"div\", \"\\u00a0\", \"CodeMirror-cursor\"));\n    cursor.style.left = pos.left + \"px\";\n    cursor.style.top = pos.top + \"px\";\n    cursor.style.height = Math.max(0, pos.bottom - pos.top) * cm.options.cursorHeight + \"px\";\n\n    if (/\\bcm-fat-cursor\\b/.test(cm.getWrapperElement().className)) {\n      var charPos = charCoords(cm, head, \"div\", null, null);\n      var width = charPos.right - charPos.left;\n      cursor.style.width = (width > 0 ? width : cm.defaultCharWidth()) + \"px\";\n    }\n\n    if (pos.other) {\n      // Secondary cursor, shown when on a 'jump' in bi-directional text\n      var otherCursor = output.appendChild(elt(\"div\", \"\\u00a0\", \"CodeMirror-cursor CodeMirror-secondarycursor\"));\n      otherCursor.style.display = \"\";\n      otherCursor.style.left = pos.other.left + \"px\";\n      otherCursor.style.top = pos.other.top + \"px\";\n      otherCursor.style.height = (pos.other.bottom - pos.other.top) * .85 + \"px\";\n    }\n  }\n\n  function cmpCoords(a, b) { return a.top - b.top || a.left - b.left }\n\n  // Draws the given range as a highlighted selection\n  function drawSelectionRange(cm, range, output) {\n    var display = cm.display, doc = cm.doc;\n    var fragment = document.createDocumentFragment();\n    var padding = paddingH(cm.display), leftSide = padding.left;\n    var rightSide = Math.max(display.sizerWidth, displayWidth(cm) - display.sizer.offsetLeft) - padding.right;\n    var docLTR = doc.direction == \"ltr\";\n\n    function add(left, top, width, bottom) {\n      if (top < 0) { top = 0; }\n      top = Math.round(top);\n      bottom = Math.round(bottom);\n      fragment.appendChild(elt(\"div\", null, \"CodeMirror-selected\", (\"position: absolute; left: \" + left + \"px;\\n                             top: \" + top + \"px; width: \" + (width == null ? rightSide - left : width) + \"px;\\n                             height: \" + (bottom - top) + \"px\")));\n    }\n\n    function drawForLine(line, fromArg, toArg) {\n      var lineObj = getLine(doc, line);\n      var lineLen = lineObj.text.length;\n      var start, end;\n      function coords(ch, bias) {\n        return charCoords(cm, Pos(line, ch), \"div\", lineObj, bias)\n      }\n\n      function wrapX(pos, dir, side) {\n        var extent = wrappedLineExtentChar(cm, lineObj, null, pos);\n        var prop = (dir == \"ltr\") == (side == \"after\") ? \"left\" : \"right\";\n        var ch = side == \"after\" ? extent.begin : extent.end - (/\\s/.test(lineObj.text.charAt(extent.end - 1)) ? 2 : 1);\n        return coords(ch, prop)[prop]\n      }\n\n      var order = getOrder(lineObj, doc.direction);\n      iterateBidiSections(order, fromArg || 0, toArg == null ? lineLen : toArg, function (from, to, dir, i) {\n        var ltr = dir == \"ltr\";\n        var fromPos = coords(from, ltr ? \"left\" : \"right\");\n        var toPos = coords(to - 1, ltr ? \"right\" : \"left\");\n\n        var openStart = fromArg == null && from == 0, openEnd = toArg == null && to == lineLen;\n        var first = i == 0, last = !order || i == order.length - 1;\n        if (toPos.top - fromPos.top <= 3) { // Single line\n          var openLeft = (docLTR ? openStart : openEnd) && first;\n          var openRight = (docLTR ? openEnd : openStart) && last;\n          var left = openLeft ? leftSide : (ltr ? fromPos : toPos).left;\n          var right = openRight ? rightSide : (ltr ? toPos : fromPos).right;\n          add(left, fromPos.top, right - left, fromPos.bottom);\n        } else { // Multiple lines\n          var topLeft, topRight, botLeft, botRight;\n          if (ltr) {\n            topLeft = docLTR && openStart && first ? leftSide : fromPos.left;\n            topRight = docLTR ? rightSide : wrapX(from, dir, \"before\");\n            botLeft = docLTR ? leftSide : wrapX(to, dir, \"after\");\n            botRight = docLTR && openEnd && last ? rightSide : toPos.right;\n          } else {\n            topLeft = !docLTR ? leftSide : wrapX(from, dir, \"before\");\n            topRight = !docLTR && openStart && first ? rightSide : fromPos.right;\n            botLeft = !docLTR && openEnd && last ? leftSide : toPos.left;\n            botRight = !docLTR ? rightSide : wrapX(to, dir, \"after\");\n          }\n          add(topLeft, fromPos.top, topRight - topLeft, fromPos.bottom);\n          if (fromPos.bottom < toPos.top) { add(leftSide, fromPos.bottom, null, toPos.top); }\n          add(botLeft, toPos.top, botRight - botLeft, toPos.bottom);\n        }\n\n        if (!start || cmpCoords(fromPos, start) < 0) { start = fromPos; }\n        if (cmpCoords(toPos, start) < 0) { start = toPos; }\n        if (!end || cmpCoords(fromPos, end) < 0) { end = fromPos; }\n        if (cmpCoords(toPos, end) < 0) { end = toPos; }\n      });\n      return {start: start, end: end}\n    }\n\n    var sFrom = range.from(), sTo = range.to();\n    if (sFrom.line == sTo.line) {\n      drawForLine(sFrom.line, sFrom.ch, sTo.ch);\n    } else {\n      var fromLine = getLine(doc, sFrom.line), toLine = getLine(doc, sTo.line);\n      var singleVLine = visualLine(fromLine) == visualLine(toLine);\n      var leftEnd = drawForLine(sFrom.line, sFrom.ch, singleVLine ? fromLine.text.length + 1 : null).end;\n      var rightStart = drawForLine(sTo.line, singleVLine ? 0 : null, sTo.ch).start;\n      if (singleVLine) {\n        if (leftEnd.top < rightStart.top - 2) {\n          add(leftEnd.right, leftEnd.top, null, leftEnd.bottom);\n          add(leftSide, rightStart.top, rightStart.left, rightStart.bottom);\n        } else {\n          add(leftEnd.right, leftEnd.top, rightStart.left - leftEnd.right, leftEnd.bottom);\n        }\n      }\n      if (leftEnd.bottom < rightStart.top)\n        { add(leftSide, leftEnd.bottom, null, rightStart.top); }\n    }\n\n    output.appendChild(fragment);\n  }\n\n  // Cursor-blinking\n  function restartBlink(cm) {\n    if (!cm.state.focused) { return }\n    var display = cm.display;\n    clearInterval(display.blinker);\n    var on = true;\n    display.cursorDiv.style.visibility = \"\";\n    if (cm.options.cursorBlinkRate > 0)\n      { display.blinker = setInterval(function () {\n        if (!cm.hasFocus()) { onBlur(cm); }\n        display.cursorDiv.style.visibility = (on = !on) ? \"\" : \"hidden\";\n      }, cm.options.cursorBlinkRate); }\n    else if (cm.options.cursorBlinkRate < 0)\n      { display.cursorDiv.style.visibility = \"hidden\"; }\n  }\n\n  function ensureFocus(cm) {\n    if (!cm.hasFocus()) {\n      cm.display.input.focus();\n      if (!cm.state.focused) { onFocus(cm); }\n    }\n  }\n\n  function delayBlurEvent(cm) {\n    cm.state.delayingBlurEvent = true;\n    setTimeout(function () { if (cm.state.delayingBlurEvent) {\n      cm.state.delayingBlurEvent = false;\n      if (cm.state.focused) { onBlur(cm); }\n    } }, 100);\n  }\n\n  function onFocus(cm, e) {\n    if (cm.state.delayingBlurEvent && !cm.state.draggingText) { cm.state.delayingBlurEvent = false; }\n\n    if (cm.options.readOnly == \"nocursor\") { return }\n    if (!cm.state.focused) {\n      signal(cm, \"focus\", cm, e);\n      cm.state.focused = true;\n      addClass(cm.display.wrapper, \"CodeMirror-focused\");\n      // This test prevents this from firing when a context\n      // menu is closed (since the input reset would kill the\n      // select-all detection hack)\n      if (!cm.curOp && cm.display.selForContextMenu != cm.doc.sel) {\n        cm.display.input.reset();\n        if (webkit) { setTimeout(function () { return cm.display.input.reset(true); }, 20); } // Issue #1730\n      }\n      cm.display.input.receivedFocus();\n    }\n    restartBlink(cm);\n  }\n  function onBlur(cm, e) {\n    if (cm.state.delayingBlurEvent) { return }\n\n    if (cm.state.focused) {\n      signal(cm, \"blur\", cm, e);\n      cm.state.focused = false;\n      rmClass(cm.display.wrapper, \"CodeMirror-focused\");\n    }\n    clearInterval(cm.display.blinker);\n    setTimeout(function () { if (!cm.state.focused) { cm.display.shift = false; } }, 150);\n  }\n\n  // Read the actual heights of the rendered lines, and update their\n  // stored heights to match.\n  function updateHeightsInViewport(cm) {\n    var display = cm.display;\n    var prevBottom = display.lineDiv.offsetTop;\n    var viewTop = Math.max(0, display.scroller.getBoundingClientRect().top);\n    var oldHeight = display.lineDiv.getBoundingClientRect().top;\n    var mustScroll = 0;\n    for (var i = 0; i < display.view.length; i++) {\n      var cur = display.view[i], wrapping = cm.options.lineWrapping;\n      var height = (void 0), width = 0;\n      if (cur.hidden) { continue }\n      oldHeight += cur.line.height;\n      if (ie && ie_version < 8) {\n        var bot = cur.node.offsetTop + cur.node.offsetHeight;\n        height = bot - prevBottom;\n        prevBottom = bot;\n      } else {\n        var box = cur.node.getBoundingClientRect();\n        height = box.bottom - box.top;\n        // Check that lines don't extend past the right of the current\n        // editor width\n        if (!wrapping && cur.text.firstChild)\n          { width = cur.text.firstChild.getBoundingClientRect().right - box.left - 1; }\n      }\n      var diff = cur.line.height - height;\n      if (diff > .005 || diff < -.005) {\n        if (oldHeight < viewTop) { mustScroll -= diff; }\n        updateLineHeight(cur.line, height);\n        updateWidgetHeight(cur.line);\n        if (cur.rest) { for (var j = 0; j < cur.rest.length; j++)\n          { updateWidgetHeight(cur.rest[j]); } }\n      }\n      if (width > cm.display.sizerWidth) {\n        var chWidth = Math.ceil(width / charWidth(cm.display));\n        if (chWidth > cm.display.maxLineLength) {\n          cm.display.maxLineLength = chWidth;\n          cm.display.maxLine = cur.line;\n          cm.display.maxLineChanged = true;\n        }\n      }\n    }\n    if (Math.abs(mustScroll) > 2) { display.scroller.scrollTop += mustScroll; }\n  }\n\n  // Read and store the height of line widgets associated with the\n  // given line.\n  function updateWidgetHeight(line) {\n    if (line.widgets) { for (var i = 0; i < line.widgets.length; ++i) {\n      var w = line.widgets[i], parent = w.node.parentNode;\n      if (parent) { w.height = parent.offsetHeight; }\n    } }\n  }\n\n  // Compute the lines that are visible in a given viewport (defaults\n  // the current scroll position). viewport may contain top,\n  // height, and ensure (see op.scrollToPos) properties.\n  function visibleLines(display, doc, viewport) {\n    var top = viewport && viewport.top != null ? Math.max(0, viewport.top) : display.scroller.scrollTop;\n    top = Math.floor(top - paddingTop(display));\n    var bottom = viewport && viewport.bottom != null ? viewport.bottom : top + display.wrapper.clientHeight;\n\n    var from = lineAtHeight(doc, top), to = lineAtHeight(doc, bottom);\n    // Ensure is a {from: {line, ch}, to: {line, ch}} object, and\n    // forces those lines into the viewport (if possible).\n    if (viewport && viewport.ensure) {\n      var ensureFrom = viewport.ensure.from.line, ensureTo = viewport.ensure.to.line;\n      if (ensureFrom < from) {\n        from = ensureFrom;\n        to = lineAtHeight(doc, heightAtLine(getLine(doc, ensureFrom)) + display.wrapper.clientHeight);\n      } else if (Math.min(ensureTo, doc.lastLine()) >= to) {\n        from = lineAtHeight(doc, heightAtLine(getLine(doc, ensureTo)) - display.wrapper.clientHeight);\n        to = ensureTo;\n      }\n    }\n    return {from: from, to: Math.max(to, from + 1)}\n  }\n\n  // SCROLLING THINGS INTO VIEW\n\n  // If an editor sits on the top or bottom of the window, partially\n  // scrolled out of view, this ensures that the cursor is visible.\n  function maybeScrollWindow(cm, rect) {\n    if (signalDOMEvent(cm, \"scrollCursorIntoView\")) { return }\n\n    var display = cm.display, box = display.sizer.getBoundingClientRect(), doScroll = null;\n    var doc = display.wrapper.ownerDocument;\n    if (rect.top + box.top < 0) { doScroll = true; }\n    else if (rect.bottom + box.top > (doc.defaultView.innerHeight || doc.documentElement.clientHeight)) { doScroll = false; }\n    if (doScroll != null && !phantom) {\n      var scrollNode = elt(\"div\", \"\\u200b\", null, (\"position: absolute;\\n                         top: \" + (rect.top - display.viewOffset - paddingTop(cm.display)) + \"px;\\n                         height: \" + (rect.bottom - rect.top + scrollGap(cm) + display.barHeight) + \"px;\\n                         left: \" + (rect.left) + \"px; width: \" + (Math.max(2, rect.right - rect.left)) + \"px;\"));\n      cm.display.lineSpace.appendChild(scrollNode);\n      scrollNode.scrollIntoView(doScroll);\n      cm.display.lineSpace.removeChild(scrollNode);\n    }\n  }\n\n  // Scroll a given position into view (immediately), verifying that\n  // it actually became visible (as line heights are accurately\n  // measured, the position of something may 'drift' during drawing).\n  function scrollPosIntoView(cm, pos, end, margin) {\n    if (margin == null) { margin = 0; }\n    var rect;\n    if (!cm.options.lineWrapping && pos == end) {\n      // Set pos and end to the cursor positions around the character pos sticks to\n      // If pos.sticky == \"before\", that is around pos.ch - 1, otherwise around pos.ch\n      // If pos == Pos(_, 0, \"before\"), pos and end are unchanged\n      end = pos.sticky == \"before\" ? Pos(pos.line, pos.ch + 1, \"before\") : pos;\n      pos = pos.ch ? Pos(pos.line, pos.sticky == \"before\" ? pos.ch - 1 : pos.ch, \"after\") : pos;\n    }\n    for (var limit = 0; limit < 5; limit++) {\n      var changed = false;\n      var coords = cursorCoords(cm, pos);\n      var endCoords = !end || end == pos ? coords : cursorCoords(cm, end);\n      rect = {left: Math.min(coords.left, endCoords.left),\n              top: Math.min(coords.top, endCoords.top) - margin,\n              right: Math.max(coords.left, endCoords.left),\n              bottom: Math.max(coords.bottom, endCoords.bottom) + margin};\n      var scrollPos = calculateScrollPos(cm, rect);\n      var startTop = cm.doc.scrollTop, startLeft = cm.doc.scrollLeft;\n      if (scrollPos.scrollTop != null) {\n        updateScrollTop(cm, scrollPos.scrollTop);\n        if (Math.abs(cm.doc.scrollTop - startTop) > 1) { changed = true; }\n      }\n      if (scrollPos.scrollLeft != null) {\n        setScrollLeft(cm, scrollPos.scrollLeft);\n        if (Math.abs(cm.doc.scrollLeft - startLeft) > 1) { changed = true; }\n      }\n      if (!changed) { break }\n    }\n    return rect\n  }\n\n  // Scroll a given set of coordinates into view (immediately).\n  function scrollIntoView(cm, rect) {\n    var scrollPos = calculateScrollPos(cm, rect);\n    if (scrollPos.scrollTop != null) { updateScrollTop(cm, scrollPos.scrollTop); }\n    if (scrollPos.scrollLeft != null) { setScrollLeft(cm, scrollPos.scrollLeft); }\n  }\n\n  // Calculate a new scroll position needed to scroll the given\n  // rectangle into view. Returns an object with scrollTop and\n  // scrollLeft properties. When these are undefined, the\n  // vertical/horizontal position does not need to be adjusted.\n  function calculateScrollPos(cm, rect) {\n    var display = cm.display, snapMargin = textHeight(cm.display);\n    if (rect.top < 0) { rect.top = 0; }\n    var screentop = cm.curOp && cm.curOp.scrollTop != null ? cm.curOp.scrollTop : display.scroller.scrollTop;\n    var screen = displayHeight(cm), result = {};\n    if (rect.bottom - rect.top > screen) { rect.bottom = rect.top + screen; }\n    var docBottom = cm.doc.height + paddingVert(display);\n    var atTop = rect.top < snapMargin, atBottom = rect.bottom > docBottom - snapMargin;\n    if (rect.top < screentop) {\n      result.scrollTop = atTop ? 0 : rect.top;\n    } else if (rect.bottom > screentop + screen) {\n      var newTop = Math.min(rect.top, (atBottom ? docBottom : rect.bottom) - screen);\n      if (newTop != screentop) { result.scrollTop = newTop; }\n    }\n\n    var gutterSpace = cm.options.fixedGutter ? 0 : display.gutters.offsetWidth;\n    var screenleft = cm.curOp && cm.curOp.scrollLeft != null ? cm.curOp.scrollLeft : display.scroller.scrollLeft - gutterSpace;\n    var screenw = displayWidth(cm) - display.gutters.offsetWidth;\n    var tooWide = rect.right - rect.left > screenw;\n    if (tooWide) { rect.right = rect.left + screenw; }\n    if (rect.left < 10)\n      { result.scrollLeft = 0; }\n    else if (rect.left < screenleft)\n      { result.scrollLeft = Math.max(0, rect.left + gutterSpace - (tooWide ? 0 : 10)); }\n    else if (rect.right > screenw + screenleft - 3)\n      { result.scrollLeft = rect.right + (tooWide ? 0 : 10) - screenw; }\n    return result\n  }\n\n  // Store a relative adjustment to the scroll position in the current\n  // operation (to be applied when the operation finishes).\n  function addToScrollTop(cm, top) {\n    if (top == null) { return }\n    resolveScrollToPos(cm);\n    cm.curOp.scrollTop = (cm.curOp.scrollTop == null ? cm.doc.scrollTop : cm.curOp.scrollTop) + top;\n  }\n\n  // Make sure that at the end of the operation the current cursor is\n  // shown.\n  function ensureCursorVisible(cm) {\n    resolveScrollToPos(cm);\n    var cur = cm.getCursor();\n    cm.curOp.scrollToPos = {from: cur, to: cur, margin: cm.options.cursorScrollMargin};\n  }\n\n  function scrollToCoords(cm, x, y) {\n    if (x != null || y != null) { resolveScrollToPos(cm); }\n    if (x != null) { cm.curOp.scrollLeft = x; }\n    if (y != null) { cm.curOp.scrollTop = y; }\n  }\n\n  function scrollToRange(cm, range) {\n    resolveScrollToPos(cm);\n    cm.curOp.scrollToPos = range;\n  }\n\n  // When an operation has its scrollToPos property set, and another\n  // scroll action is applied before the end of the operation, this\n  // 'simulates' scrolling that position into view in a cheap way, so\n  // that the effect of intermediate scroll commands is not ignored.\n  function resolveScrollToPos(cm) {\n    var range = cm.curOp.scrollToPos;\n    if (range) {\n      cm.curOp.scrollToPos = null;\n      var from = estimateCoords(cm, range.from), to = estimateCoords(cm, range.to);\n      scrollToCoordsRange(cm, from, to, range.margin);\n    }\n  }\n\n  function scrollToCoordsRange(cm, from, to, margin) {\n    var sPos = calculateScrollPos(cm, {\n      left: Math.min(from.left, to.left),\n      top: Math.min(from.top, to.top) - margin,\n      right: Math.max(from.right, to.right),\n      bottom: Math.max(from.bottom, to.bottom) + margin\n    });\n    scrollToCoords(cm, sPos.scrollLeft, sPos.scrollTop);\n  }\n\n  // Sync the scrollable area and scrollbars, ensure the viewport\n  // covers the visible area.\n  function updateScrollTop(cm, val) {\n    if (Math.abs(cm.doc.scrollTop - val) < 2) { return }\n    if (!gecko) { updateDisplaySimple(cm, {top: val}); }\n    setScrollTop(cm, val, true);\n    if (gecko) { updateDisplaySimple(cm); }\n    startWorker(cm, 100);\n  }\n\n  function setScrollTop(cm, val, forceScroll) {\n    val = Math.max(0, Math.min(cm.display.scroller.scrollHeight - cm.display.scroller.clientHeight, val));\n    if (cm.display.scroller.scrollTop == val && !forceScroll) { return }\n    cm.doc.scrollTop = val;\n    cm.display.scrollbars.setScrollTop(val);\n    if (cm.display.scroller.scrollTop != val) { cm.display.scroller.scrollTop = val; }\n  }\n\n  // Sync scroller and scrollbar, ensure the gutter elements are\n  // aligned.\n  function setScrollLeft(cm, val, isScroller, forceScroll) {\n    val = Math.max(0, Math.min(val, cm.display.scroller.scrollWidth - cm.display.scroller.clientWidth));\n    if ((isScroller ? val == cm.doc.scrollLeft : Math.abs(cm.doc.scrollLeft - val) < 2) && !forceScroll) { return }\n    cm.doc.scrollLeft = val;\n    alignHorizontally(cm);\n    if (cm.display.scroller.scrollLeft != val) { cm.display.scroller.scrollLeft = val; }\n    cm.display.scrollbars.setScrollLeft(val);\n  }\n\n  // SCROLLBARS\n\n  // Prepare DOM reads needed to update the scrollbars. Done in one\n  // shot to minimize update/measure roundtrips.\n  function measureForScrollbars(cm) {\n    var d = cm.display, gutterW = d.gutters.offsetWidth;\n    var docH = Math.round(cm.doc.height + paddingVert(cm.display));\n    return {\n      clientHeight: d.scroller.clientHeight,\n      viewHeight: d.wrapper.clientHeight,\n      scrollWidth: d.scroller.scrollWidth, clientWidth: d.scroller.clientWidth,\n      viewWidth: d.wrapper.clientWidth,\n      barLeft: cm.options.fixedGutter ? gutterW : 0,\n      docHeight: docH,\n      scrollHeight: docH + scrollGap(cm) + d.barHeight,\n      nativeBarWidth: d.nativeBarWidth,\n      gutterWidth: gutterW\n    }\n  }\n\n  var NativeScrollbars = function(place, scroll, cm) {\n    this.cm = cm;\n    var vert = this.vert = elt(\"div\", [elt(\"div\", null, null, \"min-width: 1px\")], \"CodeMirror-vscrollbar\");\n    var horiz = this.horiz = elt(\"div\", [elt(\"div\", null, null, \"height: 100%; min-height: 1px\")], \"CodeMirror-hscrollbar\");\n    vert.tabIndex = horiz.tabIndex = -1;\n    place(vert); place(horiz);\n\n    on(vert, \"scroll\", function () {\n      if (vert.clientHeight) { scroll(vert.scrollTop, \"vertical\"); }\n    });\n    on(horiz, \"scroll\", function () {\n      if (horiz.clientWidth) { scroll(horiz.scrollLeft, \"horizontal\"); }\n    });\n\n    this.checkedZeroWidth = false;\n    // Need to set a minimum width to see the scrollbar on IE7 (but must not set it on IE8).\n    if (ie && ie_version < 8) { this.horiz.style.minHeight = this.vert.style.minWidth = \"18px\"; }\n  };\n\n  NativeScrollbars.prototype.update = function (measure) {\n    var needsH = measure.scrollWidth > measure.clientWidth + 1;\n    var needsV = measure.scrollHeight > measure.clientHeight + 1;\n    var sWidth = measure.nativeBarWidth;\n\n    if (needsV) {\n      this.vert.style.display = \"block\";\n      this.vert.style.bottom = needsH ? sWidth + \"px\" : \"0\";\n      var totalHeight = measure.viewHeight - (needsH ? sWidth : 0);\n      // A bug in IE8 can cause this value to be negative, so guard it.\n      this.vert.firstChild.style.height =\n        Math.max(0, measure.scrollHeight - measure.clientHeight + totalHeight) + \"px\";\n    } else {\n      this.vert.scrollTop = 0;\n      this.vert.style.display = \"\";\n      this.vert.firstChild.style.height = \"0\";\n    }\n\n    if (needsH) {\n      this.horiz.style.display = \"block\";\n      this.horiz.style.right = needsV ? sWidth + \"px\" : \"0\";\n      this.horiz.style.left = measure.barLeft + \"px\";\n      var totalWidth = measure.viewWidth - measure.barLeft - (needsV ? sWidth : 0);\n      this.horiz.firstChild.style.width =\n        Math.max(0, measure.scrollWidth - measure.clientWidth + totalWidth) + \"px\";\n    } else {\n      this.horiz.style.display = \"\";\n      this.horiz.firstChild.style.width = \"0\";\n    }\n\n    if (!this.checkedZeroWidth && measure.clientHeight > 0) {\n      if (sWidth == 0) { this.zeroWidthHack(); }\n      this.checkedZeroWidth = true;\n    }\n\n    return {right: needsV ? sWidth : 0, bottom: needsH ? sWidth : 0}\n  };\n\n  NativeScrollbars.prototype.setScrollLeft = function (pos) {\n    if (this.horiz.scrollLeft != pos) { this.horiz.scrollLeft = pos; }\n    if (this.disableHoriz) { this.enableZeroWidthBar(this.horiz, this.disableHoriz, \"horiz\"); }\n  };\n\n  NativeScrollbars.prototype.setScrollTop = function (pos) {\n    if (this.vert.scrollTop != pos) { this.vert.scrollTop = pos; }\n    if (this.disableVert) { this.enableZeroWidthBar(this.vert, this.disableVert, \"vert\"); }\n  };\n\n  NativeScrollbars.prototype.zeroWidthHack = function () {\n    var w = mac && !mac_geMountainLion ? \"12px\" : \"18px\";\n    this.horiz.style.height = this.vert.style.width = w;\n    this.horiz.style.visibility = this.vert.style.visibility = \"hidden\";\n    this.disableHoriz = new Delayed;\n    this.disableVert = new Delayed;\n  };\n\n  NativeScrollbars.prototype.enableZeroWidthBar = function (bar, delay, type) {\n    bar.style.visibility = \"\";\n    function maybeDisable() {\n      // To find out whether the scrollbar is still visible, we\n      // check whether the element under the pixel in the bottom\n      // right corner of the scrollbar box is the scrollbar box\n      // itself (when the bar is still visible) or its filler child\n      // (when the bar is hidden). If it is still visible, we keep\n      // it enabled, if it's hidden, we disable pointer events.\n      var box = bar.getBoundingClientRect();\n      var elt = type == \"vert\" ? document.elementFromPoint(box.right - 1, (box.top + box.bottom) / 2)\n          : document.elementFromPoint((box.right + box.left) / 2, box.bottom - 1);\n      if (elt != bar) { bar.style.visibility = \"hidden\"; }\n      else { delay.set(1000, maybeDisable); }\n    }\n    delay.set(1000, maybeDisable);\n  };\n\n  NativeScrollbars.prototype.clear = function () {\n    var parent = this.horiz.parentNode;\n    parent.removeChild(this.horiz);\n    parent.removeChild(this.vert);\n  };\n\n  var NullScrollbars = function () {};\n\n  NullScrollbars.prototype.update = function () { return {bottom: 0, right: 0} };\n  NullScrollbars.prototype.setScrollLeft = function () {};\n  NullScrollbars.prototype.setScrollTop = function () {};\n  NullScrollbars.prototype.clear = function () {};\n\n  function updateScrollbars(cm, measure) {\n    if (!measure) { measure = measureForScrollbars(cm); }\n    var startWidth = cm.display.barWidth, startHeight = cm.display.barHeight;\n    updateScrollbarsInner(cm, measure);\n    for (var i = 0; i < 4 && startWidth != cm.display.barWidth || startHeight != cm.display.barHeight; i++) {\n      if (startWidth != cm.display.barWidth && cm.options.lineWrapping)\n        { updateHeightsInViewport(cm); }\n      updateScrollbarsInner(cm, measureForScrollbars(cm));\n      startWidth = cm.display.barWidth; startHeight = cm.display.barHeight;\n    }\n  }\n\n  // Re-synchronize the fake scrollbars with the actual size of the\n  // content.\n  function updateScrollbarsInner(cm, measure) {\n    var d = cm.display;\n    var sizes = d.scrollbars.update(measure);\n\n    d.sizer.style.paddingRight = (d.barWidth = sizes.right) + \"px\";\n    d.sizer.style.paddingBottom = (d.barHeight = sizes.bottom) + \"px\";\n    d.heightForcer.style.borderBottom = sizes.bottom + \"px solid transparent\";\n\n    if (sizes.right && sizes.bottom) {\n      d.scrollbarFiller.style.display = \"block\";\n      d.scrollbarFiller.style.height = sizes.bottom + \"px\";\n      d.scrollbarFiller.style.width = sizes.right + \"px\";\n    } else { d.scrollbarFiller.style.display = \"\"; }\n    if (sizes.bottom && cm.options.coverGutterNextToScrollbar && cm.options.fixedGutter) {\n      d.gutterFiller.style.display = \"block\";\n      d.gutterFiller.style.height = sizes.bottom + \"px\";\n      d.gutterFiller.style.width = measure.gutterWidth + \"px\";\n    } else { d.gutterFiller.style.display = \"\"; }\n  }\n\n  var scrollbarModel = {\"native\": NativeScrollbars, \"null\": NullScrollbars};\n\n  function initScrollbars(cm) {\n    if (cm.display.scrollbars) {\n      cm.display.scrollbars.clear();\n      if (cm.display.scrollbars.addClass)\n        { rmClass(cm.display.wrapper, cm.display.scrollbars.addClass); }\n    }\n\n    cm.display.scrollbars = new scrollbarModel[cm.options.scrollbarStyle](function (node) {\n      cm.display.wrapper.insertBefore(node, cm.display.scrollbarFiller);\n      // Prevent clicks in the scrollbars from killing focus\n      on(node, \"mousedown\", function () {\n        if (cm.state.focused) { setTimeout(function () { return cm.display.input.focus(); }, 0); }\n      });\n      node.setAttribute(\"cm-not-content\", \"true\");\n    }, function (pos, axis) {\n      if (axis == \"horizontal\") { setScrollLeft(cm, pos); }\n      else { updateScrollTop(cm, pos); }\n    }, cm);\n    if (cm.display.scrollbars.addClass)\n      { addClass(cm.display.wrapper, cm.display.scrollbars.addClass); }\n  }\n\n  // Operations are used to wrap a series of changes to the editor\n  // state in such a way that each change won't have to update the\n  // cursor and display (which would be awkward, slow, and\n  // error-prone). Instead, display updates are batched and then all\n  // combined and executed at once.\n\n  var nextOpId = 0;\n  // Start a new operation.\n  function startOperation(cm) {\n    cm.curOp = {\n      cm: cm,\n      viewChanged: false,      // Flag that indicates that lines might need to be redrawn\n      startHeight: cm.doc.height, // Used to detect need to update scrollbar\n      forceUpdate: false,      // Used to force a redraw\n      updateInput: 0,       // Whether to reset the input textarea\n      typing: false,           // Whether this reset should be careful to leave existing text (for compositing)\n      changeObjs: null,        // Accumulated changes, for firing change events\n      cursorActivityHandlers: null, // Set of handlers to fire cursorActivity on\n      cursorActivityCalled: 0, // Tracks which cursorActivity handlers have been called already\n      selectionChanged: false, // Whether the selection needs to be redrawn\n      updateMaxLine: false,    // Set when the widest line needs to be determined anew\n      scrollLeft: null, scrollTop: null, // Intermediate scroll position, not pushed to DOM yet\n      scrollToPos: null,       // Used to scroll to a specific position\n      focus: false,\n      id: ++nextOpId,          // Unique ID\n      markArrays: null         // Used by addMarkedSpan\n    };\n    pushOperation(cm.curOp);\n  }\n\n  // Finish an operation, updating the display and signalling delayed events\n  function endOperation(cm) {\n    var op = cm.curOp;\n    if (op) { finishOperation(op, function (group) {\n      for (var i = 0; i < group.ops.length; i++)\n        { group.ops[i].cm.curOp = null; }\n      endOperations(group);\n    }); }\n  }\n\n  // The DOM updates done when an operation finishes are batched so\n  // that the minimum number of relayouts are required.\n  function endOperations(group) {\n    var ops = group.ops;\n    for (var i = 0; i < ops.length; i++) // Read DOM\n      { endOperation_R1(ops[i]); }\n    for (var i$1 = 0; i$1 < ops.length; i$1++) // Write DOM (maybe)\n      { endOperation_W1(ops[i$1]); }\n    for (var i$2 = 0; i$2 < ops.length; i$2++) // Read DOM\n      { endOperation_R2(ops[i$2]); }\n    for (var i$3 = 0; i$3 < ops.length; i$3++) // Write DOM (maybe)\n      { endOperation_W2(ops[i$3]); }\n    for (var i$4 = 0; i$4 < ops.length; i$4++) // Read DOM\n      { endOperation_finish(ops[i$4]); }\n  }\n\n  function endOperation_R1(op) {\n    var cm = op.cm, display = cm.display;\n    maybeClipScrollbars(cm);\n    if (op.updateMaxLine) { findMaxLine(cm); }\n\n    op.mustUpdate = op.viewChanged || op.forceUpdate || op.scrollTop != null ||\n      op.scrollToPos && (op.scrollToPos.from.line < display.viewFrom ||\n                         op.scrollToPos.to.line >= display.viewTo) ||\n      display.maxLineChanged && cm.options.lineWrapping;\n    op.update = op.mustUpdate &&\n      new DisplayUpdate(cm, op.mustUpdate && {top: op.scrollTop, ensure: op.scrollToPos}, op.forceUpdate);\n  }\n\n  function endOperation_W1(op) {\n    op.updatedDisplay = op.mustUpdate && updateDisplayIfNeeded(op.cm, op.update);\n  }\n\n  function endOperation_R2(op) {\n    var cm = op.cm, display = cm.display;\n    if (op.updatedDisplay) { updateHeightsInViewport(cm); }\n\n    op.barMeasure = measureForScrollbars(cm);\n\n    // If the max line changed since it was last measured, measure it,\n    // and ensure the document's width matches it.\n    // updateDisplay_W2 will use these properties to do the actual resizing\n    if (display.maxLineChanged && !cm.options.lineWrapping) {\n      op.adjustWidthTo = measureChar(cm, display.maxLine, display.maxLine.text.length).left + 3;\n      cm.display.sizerWidth = op.adjustWidthTo;\n      op.barMeasure.scrollWidth =\n        Math.max(display.scroller.clientWidth, display.sizer.offsetLeft + op.adjustWidthTo + scrollGap(cm) + cm.display.barWidth);\n      op.maxScrollLeft = Math.max(0, display.sizer.offsetLeft + op.adjustWidthTo - displayWidth(cm));\n    }\n\n    if (op.updatedDisplay || op.selectionChanged)\n      { op.preparedSelection = display.input.prepareSelection(); }\n  }\n\n  function endOperation_W2(op) {\n    var cm = op.cm;\n\n    if (op.adjustWidthTo != null) {\n      cm.display.sizer.style.minWidth = op.adjustWidthTo + \"px\";\n      if (op.maxScrollLeft < cm.doc.scrollLeft)\n        { setScrollLeft(cm, Math.min(cm.display.scroller.scrollLeft, op.maxScrollLeft), true); }\n      cm.display.maxLineChanged = false;\n    }\n\n    var takeFocus = op.focus && op.focus == activeElt(root(cm));\n    if (op.preparedSelection)\n      { cm.display.input.showSelection(op.preparedSelection, takeFocus); }\n    if (op.updatedDisplay || op.startHeight != cm.doc.height)\n      { updateScrollbars(cm, op.barMeasure); }\n    if (op.updatedDisplay)\n      { setDocumentHeight(cm, op.barMeasure); }\n\n    if (op.selectionChanged) { restartBlink(cm); }\n\n    if (cm.state.focused && op.updateInput)\n      { cm.display.input.reset(op.typing); }\n    if (takeFocus) { ensureFocus(op.cm); }\n  }\n\n  function endOperation_finish(op) {\n    var cm = op.cm, display = cm.display, doc = cm.doc;\n\n    if (op.updatedDisplay) { postUpdateDisplay(cm, op.update); }\n\n    // Abort mouse wheel delta measurement, when scrolling explicitly\n    if (display.wheelStartX != null && (op.scrollTop != null || op.scrollLeft != null || op.scrollToPos))\n      { display.wheelStartX = display.wheelStartY = null; }\n\n    // Propagate the scroll position to the actual DOM scroller\n    if (op.scrollTop != null) { setScrollTop(cm, op.scrollTop, op.forceScroll); }\n\n    if (op.scrollLeft != null) { setScrollLeft(cm, op.scrollLeft, true, true); }\n    // If we need to scroll a specific position into view, do so.\n    if (op.scrollToPos) {\n      var rect = scrollPosIntoView(cm, clipPos(doc, op.scrollToPos.from),\n                                   clipPos(doc, op.scrollToPos.to), op.scrollToPos.margin);\n      maybeScrollWindow(cm, rect);\n    }\n\n    // Fire events for markers that are hidden/unidden by editing or\n    // undoing\n    var hidden = op.maybeHiddenMarkers, unhidden = op.maybeUnhiddenMarkers;\n    if (hidden) { for (var i = 0; i < hidden.length; ++i)\n      { if (!hidden[i].lines.length) { signal(hidden[i], \"hide\"); } } }\n    if (unhidden) { for (var i$1 = 0; i$1 < unhidden.length; ++i$1)\n      { if (unhidden[i$1].lines.length) { signal(unhidden[i$1], \"unhide\"); } } }\n\n    if (display.wrapper.offsetHeight)\n      { doc.scrollTop = cm.display.scroller.scrollTop; }\n\n    // Fire change events, and delayed event handlers\n    if (op.changeObjs)\n      { signal(cm, \"changes\", cm, op.changeObjs); }\n    if (op.update)\n      { op.update.finish(); }\n  }\n\n  // Run the given function in an operation\n  function runInOp(cm, f) {\n    if (cm.curOp) { return f() }\n    startOperation(cm);\n    try { return f() }\n    finally { endOperation(cm); }\n  }\n  // Wraps a function in an operation. Returns the wrapped function.\n  function operation(cm, f) {\n    return function() {\n      if (cm.curOp) { return f.apply(cm, arguments) }\n      startOperation(cm);\n      try { return f.apply(cm, arguments) }\n      finally { endOperation(cm); }\n    }\n  }\n  // Used to add methods to editor and doc instances, wrapping them in\n  // operations.\n  function methodOp(f) {\n    return function() {\n      if (this.curOp) { return f.apply(this, arguments) }\n      startOperation(this);\n      try { return f.apply(this, arguments) }\n      finally { endOperation(this); }\n    }\n  }\n  function docMethodOp(f) {\n    return function() {\n      var cm = this.cm;\n      if (!cm || cm.curOp) { return f.apply(this, arguments) }\n      startOperation(cm);\n      try { return f.apply(this, arguments) }\n      finally { endOperation(cm); }\n    }\n  }\n\n  // HIGHLIGHT WORKER\n\n  function startWorker(cm, time) {\n    if (cm.doc.highlightFrontier < cm.display.viewTo)\n      { cm.state.highlight.set(time, bind(highlightWorker, cm)); }\n  }\n\n  function highlightWorker(cm) {\n    var doc = cm.doc;\n    if (doc.highlightFrontier >= cm.display.viewTo) { return }\n    var end = +new Date + cm.options.workTime;\n    var context = getContextBefore(cm, doc.highlightFrontier);\n    var changedLines = [];\n\n    doc.iter(context.line, Math.min(doc.first + doc.size, cm.display.viewTo + 500), function (line) {\n      if (context.line >= cm.display.viewFrom) { // Visible\n        var oldStyles = line.styles;\n        var resetState = line.text.length > cm.options.maxHighlightLength ? copyState(doc.mode, context.state) : null;\n        var highlighted = highlightLine(cm, line, context, true);\n        if (resetState) { context.state = resetState; }\n        line.styles = highlighted.styles;\n        var oldCls = line.styleClasses, newCls = highlighted.classes;\n        if (newCls) { line.styleClasses = newCls; }\n        else if (oldCls) { line.styleClasses = null; }\n        var ischange = !oldStyles || oldStyles.length != line.styles.length ||\n          oldCls != newCls && (!oldCls || !newCls || oldCls.bgClass != newCls.bgClass || oldCls.textClass != newCls.textClass);\n        for (var i = 0; !ischange && i < oldStyles.length; ++i) { ischange = oldStyles[i] != line.styles[i]; }\n        if (ischange) { changedLines.push(context.line); }\n        line.stateAfter = context.save();\n        context.nextLine();\n      } else {\n        if (line.text.length <= cm.options.maxHighlightLength)\n          { processLine(cm, line.text, context); }\n        line.stateAfter = context.line % 5 == 0 ? context.save() : null;\n        context.nextLine();\n      }\n      if (+new Date > end) {\n        startWorker(cm, cm.options.workDelay);\n        return true\n      }\n    });\n    doc.highlightFrontier = context.line;\n    doc.modeFrontier = Math.max(doc.modeFrontier, context.line);\n    if (changedLines.length) { runInOp(cm, function () {\n      for (var i = 0; i < changedLines.length; i++)\n        { regLineChange(cm, changedLines[i], \"text\"); }\n    }); }\n  }\n\n  // DISPLAY DRAWING\n\n  var DisplayUpdate = function(cm, viewport, force) {\n    var display = cm.display;\n\n    this.viewport = viewport;\n    // Store some values that we'll need later (but don't want to force a relayout for)\n    this.visible = visibleLines(display, cm.doc, viewport);\n    this.editorIsHidden = !display.wrapper.offsetWidth;\n    this.wrapperHeight = display.wrapper.clientHeight;\n    this.wrapperWidth = display.wrapper.clientWidth;\n    this.oldDisplayWidth = displayWidth(cm);\n    this.force = force;\n    this.dims = getDimensions(cm);\n    this.events = [];\n  };\n\n  DisplayUpdate.prototype.signal = function (emitter, type) {\n    if (hasHandler(emitter, type))\n      { this.events.push(arguments); }\n  };\n  DisplayUpdate.prototype.finish = function () {\n    for (var i = 0; i < this.events.length; i++)\n      { signal.apply(null, this.events[i]); }\n  };\n\n  function maybeClipScrollbars(cm) {\n    var display = cm.display;\n    if (!display.scrollbarsClipped && display.scroller.offsetWidth) {\n      display.nativeBarWidth = display.scroller.offsetWidth - display.scroller.clientWidth;\n      display.heightForcer.style.height = scrollGap(cm) + \"px\";\n      display.sizer.style.marginBottom = -display.nativeBarWidth + \"px\";\n      display.sizer.style.borderRightWidth = scrollGap(cm) + \"px\";\n      display.scrollbarsClipped = true;\n    }\n  }\n\n  function selectionSnapshot(cm) {\n    if (cm.hasFocus()) { return null }\n    var active = activeElt(root(cm));\n    if (!active || !contains(cm.display.lineDiv, active)) { return null }\n    var result = {activeElt: active};\n    if (window.getSelection) {\n      var sel = win(cm).getSelection();\n      if (sel.anchorNode && sel.extend && contains(cm.display.lineDiv, sel.anchorNode)) {\n        result.anchorNode = sel.anchorNode;\n        result.anchorOffset = sel.anchorOffset;\n        result.focusNode = sel.focusNode;\n        result.focusOffset = sel.focusOffset;\n      }\n    }\n    return result\n  }\n\n  function restoreSelection(snapshot) {\n    if (!snapshot || !snapshot.activeElt || snapshot.activeElt == activeElt(rootNode(snapshot.activeElt))) { return }\n    snapshot.activeElt.focus();\n    if (!/^(INPUT|TEXTAREA)$/.test(snapshot.activeElt.nodeName) &&\n        snapshot.anchorNode && contains(document.body, snapshot.anchorNode) && contains(document.body, snapshot.focusNode)) {\n      var doc = snapshot.activeElt.ownerDocument;\n      var sel = doc.defaultView.getSelection(), range = doc.createRange();\n      range.setEnd(snapshot.anchorNode, snapshot.anchorOffset);\n      range.collapse(false);\n      sel.removeAllRanges();\n      sel.addRange(range);\n      sel.extend(snapshot.focusNode, snapshot.focusOffset);\n    }\n  }\n\n  // Does the actual updating of the line display. Bails out\n  // (returning false) when there is nothing to be done and forced is\n  // false.\n  function updateDisplayIfNeeded(cm, update) {\n    var display = cm.display, doc = cm.doc;\n\n    if (update.editorIsHidden) {\n      resetView(cm);\n      return false\n    }\n\n    // Bail out if the visible area is already rendered and nothing changed.\n    if (!update.force &&\n        update.visible.from >= display.viewFrom && update.visible.to <= display.viewTo &&\n        (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo) &&\n        display.renderedView == display.view && countDirtyView(cm) == 0)\n      { return false }\n\n    if (maybeUpdateLineNumberWidth(cm)) {\n      resetView(cm);\n      update.dims = getDimensions(cm);\n    }\n\n    // Compute a suitable new viewport (from & to)\n    var end = doc.first + doc.size;\n    var from = Math.max(update.visible.from - cm.options.viewportMargin, doc.first);\n    var to = Math.min(end, update.visible.to + cm.options.viewportMargin);\n    if (display.viewFrom < from && from - display.viewFrom < 20) { from = Math.max(doc.first, display.viewFrom); }\n    if (display.viewTo > to && display.viewTo - to < 20) { to = Math.min(end, display.viewTo); }\n    if (sawCollapsedSpans) {\n      from = visualLineNo(cm.doc, from);\n      to = visualLineEndNo(cm.doc, to);\n    }\n\n    var different = from != display.viewFrom || to != display.viewTo ||\n      display.lastWrapHeight != update.wrapperHeight || display.lastWrapWidth != update.wrapperWidth;\n    adjustView(cm, from, to);\n\n    display.viewOffset = heightAtLine(getLine(cm.doc, display.viewFrom));\n    // Position the mover div to align with the current scroll position\n    cm.display.mover.style.top = display.viewOffset + \"px\";\n\n    var toUpdate = countDirtyView(cm);\n    if (!different && toUpdate == 0 && !update.force && display.renderedView == display.view &&\n        (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo))\n      { return false }\n\n    // For big changes, we hide the enclosing element during the\n    // update, since that speeds up the operations on most browsers.\n    var selSnapshot = selectionSnapshot(cm);\n    if (toUpdate > 4) { display.lineDiv.style.display = \"none\"; }\n    patchDisplay(cm, display.updateLineNumbers, update.dims);\n    if (toUpdate > 4) { display.lineDiv.style.display = \"\"; }\n    display.renderedView = display.view;\n    // There might have been a widget with a focused element that got\n    // hidden or updated, if so re-focus it.\n    restoreSelection(selSnapshot);\n\n    // Prevent selection and cursors from interfering with the scroll\n    // width and height.\n    removeChildren(display.cursorDiv);\n    removeChildren(display.selectionDiv);\n    display.gutters.style.height = display.sizer.style.minHeight = 0;\n\n    if (different) {\n      display.lastWrapHeight = update.wrapperHeight;\n      display.lastWrapWidth = update.wrapperWidth;\n      startWorker(cm, 400);\n    }\n\n    display.updateLineNumbers = null;\n\n    return true\n  }\n\n  function postUpdateDisplay(cm, update) {\n    var viewport = update.viewport;\n\n    for (var first = true;; first = false) {\n      if (!first || !cm.options.lineWrapping || update.oldDisplayWidth == displayWidth(cm)) {\n        // Clip forced viewport to actual scrollable area.\n        if (viewport && viewport.top != null)\n          { viewport = {top: Math.min(cm.doc.height + paddingVert(cm.display) - displayHeight(cm), viewport.top)}; }\n        // Updated line heights might result in the drawn area not\n        // actually covering the viewport. Keep looping until it does.\n        update.visible = visibleLines(cm.display, cm.doc, viewport);\n        if (update.visible.from >= cm.display.viewFrom && update.visible.to <= cm.display.viewTo)\n          { break }\n      } else if (first) {\n        update.visible = visibleLines(cm.display, cm.doc, viewport);\n      }\n      if (!updateDisplayIfNeeded(cm, update)) { break }\n      updateHeightsInViewport(cm);\n      var barMeasure = measureForScrollbars(cm);\n      updateSelection(cm);\n      updateScrollbars(cm, barMeasure);\n      setDocumentHeight(cm, barMeasure);\n      update.force = false;\n    }\n\n    update.signal(cm, \"update\", cm);\n    if (cm.display.viewFrom != cm.display.reportedViewFrom || cm.display.viewTo != cm.display.reportedViewTo) {\n      update.signal(cm, \"viewportChange\", cm, cm.display.viewFrom, cm.display.viewTo);\n      cm.display.reportedViewFrom = cm.display.viewFrom; cm.display.reportedViewTo = cm.display.viewTo;\n    }\n  }\n\n  function updateDisplaySimple(cm, viewport) {\n    var update = new DisplayUpdate(cm, viewport);\n    if (updateDisplayIfNeeded(cm, update)) {\n      updateHeightsInViewport(cm);\n      postUpdateDisplay(cm, update);\n      var barMeasure = measureForScrollbars(cm);\n      updateSelection(cm);\n      updateScrollbars(cm, barMeasure);\n      setDocumentHeight(cm, barMeasure);\n      update.finish();\n    }\n  }\n\n  // Sync the actual display DOM structure with display.view, removing\n  // nodes for lines that are no longer in view, and creating the ones\n  // that are not there yet, and updating the ones that are out of\n  // date.\n  function patchDisplay(cm, updateNumbersFrom, dims) {\n    var display = cm.display, lineNumbers = cm.options.lineNumbers;\n    var container = display.lineDiv, cur = container.firstChild;\n\n    function rm(node) {\n      var next = node.nextSibling;\n      // Works around a throw-scroll bug in OS X Webkit\n      if (webkit && mac && cm.display.currentWheelTarget == node)\n        { node.style.display = \"none\"; }\n      else\n        { node.parentNode.removeChild(node); }\n      return next\n    }\n\n    var view = display.view, lineN = display.viewFrom;\n    // Loop over the elements in the view, syncing cur (the DOM nodes\n    // in display.lineDiv) with the view as we go.\n    for (var i = 0; i < view.length; i++) {\n      var lineView = view[i];\n      if (lineView.hidden) ; else if (!lineView.node || lineView.node.parentNode != container) { // Not drawn yet\n        var node = buildLineElement(cm, lineView, lineN, dims);\n        container.insertBefore(node, cur);\n      } else { // Already drawn\n        while (cur != lineView.node) { cur = rm(cur); }\n        var updateNumber = lineNumbers && updateNumbersFrom != null &&\n          updateNumbersFrom <= lineN && lineView.lineNumber;\n        if (lineView.changes) {\n          if (indexOf(lineView.changes, \"gutter\") > -1) { updateNumber = false; }\n          updateLineForChanges(cm, lineView, lineN, dims);\n        }\n        if (updateNumber) {\n          removeChildren(lineView.lineNumber);\n          lineView.lineNumber.appendChild(document.createTextNode(lineNumberFor(cm.options, lineN)));\n        }\n        cur = lineView.node.nextSibling;\n      }\n      lineN += lineView.size;\n    }\n    while (cur) { cur = rm(cur); }\n  }\n\n  function updateGutterSpace(display) {\n    var width = display.gutters.offsetWidth;\n    display.sizer.style.marginLeft = width + \"px\";\n    // Send an event to consumers responding to changes in gutter width.\n    signalLater(display, \"gutterChanged\", display);\n  }\n\n  function setDocumentHeight(cm, measure) {\n    cm.display.sizer.style.minHeight = measure.docHeight + \"px\";\n    cm.display.heightForcer.style.top = measure.docHeight + \"px\";\n    cm.display.gutters.style.height = (measure.docHeight + cm.display.barHeight + scrollGap(cm)) + \"px\";\n  }\n\n  // Re-align line numbers and gutter marks to compensate for\n  // horizontal scrolling.\n  function alignHorizontally(cm) {\n    var display = cm.display, view = display.view;\n    if (!display.alignWidgets && (!display.gutters.firstChild || !cm.options.fixedGutter)) { return }\n    var comp = compensateForHScroll(display) - display.scroller.scrollLeft + cm.doc.scrollLeft;\n    var gutterW = display.gutters.offsetWidth, left = comp + \"px\";\n    for (var i = 0; i < view.length; i++) { if (!view[i].hidden) {\n      if (cm.options.fixedGutter) {\n        if (view[i].gutter)\n          { view[i].gutter.style.left = left; }\n        if (view[i].gutterBackground)\n          { view[i].gutterBackground.style.left = left; }\n      }\n      var align = view[i].alignable;\n      if (align) { for (var j = 0; j < align.length; j++)\n        { align[j].style.left = left; } }\n    } }\n    if (cm.options.fixedGutter)\n      { display.gutters.style.left = (comp + gutterW) + \"px\"; }\n  }\n\n  // Used to ensure that the line number gutter is still the right\n  // size for the current document size. Returns true when an update\n  // is needed.\n  function maybeUpdateLineNumberWidth(cm) {\n    if (!cm.options.lineNumbers) { return false }\n    var doc = cm.doc, last = lineNumberFor(cm.options, doc.first + doc.size - 1), display = cm.display;\n    if (last.length != display.lineNumChars) {\n      var test = display.measure.appendChild(elt(\"div\", [elt(\"div\", last)],\n                                                 \"CodeMirror-linenumber CodeMirror-gutter-elt\"));\n      var innerW = test.firstChild.offsetWidth, padding = test.offsetWidth - innerW;\n      display.lineGutter.style.width = \"\";\n      display.lineNumInnerWidth = Math.max(innerW, display.lineGutter.offsetWidth - padding) + 1;\n      display.lineNumWidth = display.lineNumInnerWidth + padding;\n      display.lineNumChars = display.lineNumInnerWidth ? last.length : -1;\n      display.lineGutter.style.width = display.lineNumWidth + \"px\";\n      updateGutterSpace(cm.display);\n      return true\n    }\n    return false\n  }\n\n  function getGutters(gutters, lineNumbers) {\n    var result = [], sawLineNumbers = false;\n    for (var i = 0; i < gutters.length; i++) {\n      var name = gutters[i], style = null;\n      if (typeof name != \"string\") { style = name.style; name = name.className; }\n      if (name == \"CodeMirror-linenumbers\") {\n        if (!lineNumbers) { continue }\n        else { sawLineNumbers = true; }\n      }\n      result.push({className: name, style: style});\n    }\n    if (lineNumbers && !sawLineNumbers) { result.push({className: \"CodeMirror-linenumbers\", style: null}); }\n    return result\n  }\n\n  // Rebuild the gutter elements, ensure the margin to the left of the\n  // code matches their width.\n  function renderGutters(display) {\n    var gutters = display.gutters, specs = display.gutterSpecs;\n    removeChildren(gutters);\n    display.lineGutter = null;\n    for (var i = 0; i < specs.length; ++i) {\n      var ref = specs[i];\n      var className = ref.className;\n      var style = ref.style;\n      var gElt = gutters.appendChild(elt(\"div\", null, \"CodeMirror-gutter \" + className));\n      if (style) { gElt.style.cssText = style; }\n      if (className == \"CodeMirror-linenumbers\") {\n        display.lineGutter = gElt;\n        gElt.style.width = (display.lineNumWidth || 1) + \"px\";\n      }\n    }\n    gutters.style.display = specs.length ? \"\" : \"none\";\n    updateGutterSpace(display);\n  }\n\n  function updateGutters(cm) {\n    renderGutters(cm.display);\n    regChange(cm);\n    alignHorizontally(cm);\n  }\n\n  // The display handles the DOM integration, both for input reading\n  // and content drawing. It holds references to DOM nodes and\n  // display-related state.\n\n  function Display(place, doc, input, options) {\n    var d = this;\n    this.input = input;\n\n    // Covers bottom-right square when both scrollbars are present.\n    d.scrollbarFiller = elt(\"div\", null, \"CodeMirror-scrollbar-filler\");\n    d.scrollbarFiller.setAttribute(\"cm-not-content\", \"true\");\n    // Covers bottom of gutter when coverGutterNextToScrollbar is on\n    // and h scrollbar is present.\n    d.gutterFiller = elt(\"div\", null, \"CodeMirror-gutter-filler\");\n    d.gutterFiller.setAttribute(\"cm-not-content\", \"true\");\n    // Will contain the actual code, positioned to cover the viewport.\n    d.lineDiv = eltP(\"div\", null, \"CodeMirror-code\");\n    // Elements are added to these to represent selection and cursors.\n    d.selectionDiv = elt(\"div\", null, null, \"position: relative; z-index: 1\");\n    d.cursorDiv = elt(\"div\", null, \"CodeMirror-cursors\");\n    // A visibility: hidden element used to find the size of things.\n    d.measure = elt(\"div\", null, \"CodeMirror-measure\");\n    // When lines outside of the viewport are measured, they are drawn in this.\n    d.lineMeasure = elt(\"div\", null, \"CodeMirror-measure\");\n    // Wraps everything that needs to exist inside the vertically-padded coordinate system\n    d.lineSpace = eltP(\"div\", [d.measure, d.lineMeasure, d.selectionDiv, d.cursorDiv, d.lineDiv],\n                      null, \"position: relative; outline: none\");\n    var lines = eltP(\"div\", [d.lineSpace], \"CodeMirror-lines\");\n    // Moved around its parent to cover visible view.\n    d.mover = elt(\"div\", [lines], null, \"position: relative\");\n    // Set to the height of the document, allowing scrolling.\n    d.sizer = elt(\"div\", [d.mover], \"CodeMirror-sizer\");\n    d.sizerWidth = null;\n    // Behavior of elts with overflow: auto and padding is\n    // inconsistent across browsers. This is used to ensure the\n    // scrollable area is big enough.\n    d.heightForcer = elt(\"div\", null, null, \"position: absolute; height: \" + scrollerGap + \"px; width: 1px;\");\n    // Will contain the gutters, if any.\n    d.gutters = elt(\"div\", null, \"CodeMirror-gutters\");\n    d.lineGutter = null;\n    // Actual scrollable element.\n    d.scroller = elt(\"div\", [d.sizer, d.heightForcer, d.gutters], \"CodeMirror-scroll\");\n    d.scroller.setAttribute(\"tabIndex\", \"-1\");\n    // The element in which the editor lives.\n    d.wrapper = elt(\"div\", [d.scrollbarFiller, d.gutterFiller, d.scroller], \"CodeMirror\");\n    // See #6982. FIXME remove when this has been fixed for a while in Chrome\n    if (chrome && chrome_version === 105) { d.wrapper.style.clipPath = \"inset(0px)\"; }\n\n    // This attribute is respected by automatic translation systems such as Google Translate,\n    // and may also be respected by tools used by human translators.\n    d.wrapper.setAttribute('translate', 'no');\n\n    // Work around IE7 z-index bug (not perfect, hence IE7 not really being supported)\n    if (ie && ie_version < 8) { d.gutters.style.zIndex = -1; d.scroller.style.paddingRight = 0; }\n    if (!webkit && !(gecko && mobile)) { d.scroller.draggable = true; }\n\n    if (place) {\n      if (place.appendChild) { place.appendChild(d.wrapper); }\n      else { place(d.wrapper); }\n    }\n\n    // Current rendered range (may be bigger than the view window).\n    d.viewFrom = d.viewTo = doc.first;\n    d.reportedViewFrom = d.reportedViewTo = doc.first;\n    // Information about the rendered lines.\n    d.view = [];\n    d.renderedView = null;\n    // Holds info about a single rendered line when it was rendered\n    // for measurement, while not in view.\n    d.externalMeasured = null;\n    // Empty space (in pixels) above the view\n    d.viewOffset = 0;\n    d.lastWrapHeight = d.lastWrapWidth = 0;\n    d.updateLineNumbers = null;\n\n    d.nativeBarWidth = d.barHeight = d.barWidth = 0;\n    d.scrollbarsClipped = false;\n\n    // Used to only resize the line number gutter when necessary (when\n    // the amount of lines crosses a boundary that makes its width change)\n    d.lineNumWidth = d.lineNumInnerWidth = d.lineNumChars = null;\n    // Set to true when a non-horizontal-scrolling line widget is\n    // added. As an optimization, line widget aligning is skipped when\n    // this is false.\n    d.alignWidgets = false;\n\n    d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null;\n\n    // Tracks the maximum line length so that the horizontal scrollbar\n    // can be kept static when scrolling.\n    d.maxLine = null;\n    d.maxLineLength = 0;\n    d.maxLineChanged = false;\n\n    // Used for measuring wheel scrolling granularity\n    d.wheelDX = d.wheelDY = d.wheelStartX = d.wheelStartY = null;\n\n    // True when shift is held down.\n    d.shift = false;\n\n    // Used to track whether anything happened since the context menu\n    // was opened.\n    d.selForContextMenu = null;\n\n    d.activeTouch = null;\n\n    d.gutterSpecs = getGutters(options.gutters, options.lineNumbers);\n    renderGutters(d);\n\n    input.init(d);\n  }\n\n  // Since the delta values reported on mouse wheel events are\n  // unstandardized between browsers and even browser versions, and\n  // generally horribly unpredictable, this code starts by measuring\n  // the scroll effect that the first few mouse wheel events have,\n  // and, from that, detects the way it can convert deltas to pixel\n  // offsets afterwards.\n  //\n  // The reason we want to know the amount a wheel event will scroll\n  // is that it gives us a chance to update the display before the\n  // actual scrolling happens, reducing flickering.\n\n  var wheelSamples = 0, wheelPixelsPerUnit = null;\n  // Fill in a browser-detected starting value on browsers where we\n  // know one. These don't have to be accurate -- the result of them\n  // being wrong would just be a slight flicker on the first wheel\n  // scroll (if it is large enough).\n  if (ie) { wheelPixelsPerUnit = -.53; }\n  else if (gecko) { wheelPixelsPerUnit = 15; }\n  else if (chrome) { wheelPixelsPerUnit = -.7; }\n  else if (safari) { wheelPixelsPerUnit = -1/3; }\n\n  function wheelEventDelta(e) {\n    var dx = e.wheelDeltaX, dy = e.wheelDeltaY;\n    if (dx == null && e.detail && e.axis == e.HORIZONTAL_AXIS) { dx = e.detail; }\n    if (dy == null && e.detail && e.axis == e.VERTICAL_AXIS) { dy = e.detail; }\n    else if (dy == null) { dy = e.wheelDelta; }\n    return {x: dx, y: dy}\n  }\n  function wheelEventPixels(e) {\n    var delta = wheelEventDelta(e);\n    delta.x *= wheelPixelsPerUnit;\n    delta.y *= wheelPixelsPerUnit;\n    return delta\n  }\n\n  function onScrollWheel(cm, e) {\n    // On Chrome 102, viewport updates somehow stop wheel-based\n    // scrolling. Turning off pointer events during the scroll seems\n    // to avoid the issue.\n    if (chrome && chrome_version == 102) {\n      if (cm.display.chromeScrollHack == null) { cm.display.sizer.style.pointerEvents = \"none\"; }\n      else { clearTimeout(cm.display.chromeScrollHack); }\n      cm.display.chromeScrollHack = setTimeout(function () {\n        cm.display.chromeScrollHack = null;\n        cm.display.sizer.style.pointerEvents = \"\";\n      }, 100);\n    }\n    var delta = wheelEventDelta(e), dx = delta.x, dy = delta.y;\n    var pixelsPerUnit = wheelPixelsPerUnit;\n    if (e.deltaMode === 0) {\n      dx = e.deltaX;\n      dy = e.deltaY;\n      pixelsPerUnit = 1;\n    }\n\n    var display = cm.display, scroll = display.scroller;\n    // Quit if there's nothing to scroll here\n    var canScrollX = scroll.scrollWidth > scroll.clientWidth;\n    var canScrollY = scroll.scrollHeight > scroll.clientHeight;\n    if (!(dx && canScrollX || dy && canScrollY)) { return }\n\n    // Webkit browsers on OS X abort momentum scrolls when the target\n    // of the scroll event is removed from the scrollable element.\n    // This hack (see related code in patchDisplay) makes sure the\n    // element is kept around.\n    if (dy && mac && webkit) {\n      outer: for (var cur = e.target, view = display.view; cur != scroll; cur = cur.parentNode) {\n        for (var i = 0; i < view.length; i++) {\n          if (view[i].node == cur) {\n            cm.display.currentWheelTarget = cur;\n            break outer\n          }\n        }\n      }\n    }\n\n    // On some browsers, horizontal scrolling will cause redraws to\n    // happen before the gutter has been realigned, causing it to\n    // wriggle around in a most unseemly way. When we have an\n    // estimated pixels/delta value, we just handle horizontal\n    // scrolling entirely here. It'll be slightly off from native, but\n    // better than glitching out.\n    if (dx && !gecko && !presto && pixelsPerUnit != null) {\n      if (dy && canScrollY)\n        { updateScrollTop(cm, Math.max(0, scroll.scrollTop + dy * pixelsPerUnit)); }\n      setScrollLeft(cm, Math.max(0, scroll.scrollLeft + dx * pixelsPerUnit));\n      // Only prevent default scrolling if vertical scrolling is\n      // actually possible. Otherwise, it causes vertical scroll\n      // jitter on OSX trackpads when deltaX is small and deltaY\n      // is large (issue #3579)\n      if (!dy || (dy && canScrollY))\n        { e_preventDefault(e); }\n      display.wheelStartX = null; // Abort measurement, if in progress\n      return\n    }\n\n    // 'Project' the visible viewport to cover the area that is being\n    // scrolled into view (if we know enough to estimate it).\n    if (dy && pixelsPerUnit != null) {\n      var pixels = dy * pixelsPerUnit;\n      var top = cm.doc.scrollTop, bot = top + display.wrapper.clientHeight;\n      if (pixels < 0) { top = Math.max(0, top + pixels - 50); }\n      else { bot = Math.min(cm.doc.height, bot + pixels + 50); }\n      updateDisplaySimple(cm, {top: top, bottom: bot});\n    }\n\n    if (wheelSamples < 20 && e.deltaMode !== 0) {\n      if (display.wheelStartX == null) {\n        display.wheelStartX = scroll.scrollLeft; display.wheelStartY = scroll.scrollTop;\n        display.wheelDX = dx; display.wheelDY = dy;\n        setTimeout(function () {\n          if (display.wheelStartX == null) { return }\n          var movedX = scroll.scrollLeft - display.wheelStartX;\n          var movedY = scroll.scrollTop - display.wheelStartY;\n          var sample = (movedY && display.wheelDY && movedY / display.wheelDY) ||\n            (movedX && display.wheelDX && movedX / display.wheelDX);\n          display.wheelStartX = display.wheelStartY = null;\n          if (!sample) { return }\n          wheelPixelsPerUnit = (wheelPixelsPerUnit * wheelSamples + sample) / (wheelSamples + 1);\n          ++wheelSamples;\n        }, 200);\n      } else {\n        display.wheelDX += dx; display.wheelDY += dy;\n      }\n    }\n  }\n\n  // Selection objects are immutable. A new one is created every time\n  // the selection changes. A selection is one or more non-overlapping\n  // (and non-touching) ranges, sorted, and an integer that indicates\n  // which one is the primary selection (the one that's scrolled into\n  // view, that getCursor returns, etc).\n  var Selection = function(ranges, primIndex) {\n    this.ranges = ranges;\n    this.primIndex = primIndex;\n  };\n\n  Selection.prototype.primary = function () { return this.ranges[this.primIndex] };\n\n  Selection.prototype.equals = function (other) {\n    if (other == this) { return true }\n    if (other.primIndex != this.primIndex || other.ranges.length != this.ranges.length) { return false }\n    for (var i = 0; i < this.ranges.length; i++) {\n      var here = this.ranges[i], there = other.ranges[i];\n      if (!equalCursorPos(here.anchor, there.anchor) || !equalCursorPos(here.head, there.head)) { return false }\n    }\n    return true\n  };\n\n  Selection.prototype.deepCopy = function () {\n    var out = [];\n    for (var i = 0; i < this.ranges.length; i++)\n      { out[i] = new Range(copyPos(this.ranges[i].anchor), copyPos(this.ranges[i].head)); }\n    return new Selection(out, this.primIndex)\n  };\n\n  Selection.prototype.somethingSelected = function () {\n    for (var i = 0; i < this.ranges.length; i++)\n      { if (!this.ranges[i].empty()) { return true } }\n    return false\n  };\n\n  Selection.prototype.contains = function (pos, end) {\n    if (!end) { end = pos; }\n    for (var i = 0; i < this.ranges.length; i++) {\n      var range = this.ranges[i];\n      if (cmp(end, range.from()) >= 0 && cmp(pos, range.to()) <= 0)\n        { return i }\n    }\n    return -1\n  };\n\n  var Range = function(anchor, head) {\n    this.anchor = anchor; this.head = head;\n  };\n\n  Range.prototype.from = function () { return minPos(this.anchor, this.head) };\n  Range.prototype.to = function () { return maxPos(this.anchor, this.head) };\n  Range.prototype.empty = function () { return this.head.line == this.anchor.line && this.head.ch == this.anchor.ch };\n\n  // Take an unsorted, potentially overlapping set of ranges, and\n  // build a selection out of it. 'Consumes' ranges array (modifying\n  // it).\n  function normalizeSelection(cm, ranges, primIndex) {\n    var mayTouch = cm && cm.options.selectionsMayTouch;\n    var prim = ranges[primIndex];\n    ranges.sort(function (a, b) { return cmp(a.from(), b.from()); });\n    primIndex = indexOf(ranges, prim);\n    for (var i = 1; i < ranges.length; i++) {\n      var cur = ranges[i], prev = ranges[i - 1];\n      var diff = cmp(prev.to(), cur.from());\n      if (mayTouch && !cur.empty() ? diff > 0 : diff >= 0) {\n        var from = minPos(prev.from(), cur.from()), to = maxPos(prev.to(), cur.to());\n        var inv = prev.empty() ? cur.from() == cur.head : prev.from() == prev.head;\n        if (i <= primIndex) { --primIndex; }\n        ranges.splice(--i, 2, new Range(inv ? to : from, inv ? from : to));\n      }\n    }\n    return new Selection(ranges, primIndex)\n  }\n\n  function simpleSelection(anchor, head) {\n    return new Selection([new Range(anchor, head || anchor)], 0)\n  }\n\n  // Compute the position of the end of a change (its 'to' property\n  // refers to the pre-change end).\n  function changeEnd(change) {\n    if (!change.text) { return change.to }\n    return Pos(change.from.line + change.text.length - 1,\n               lst(change.text).length + (change.text.length == 1 ? change.from.ch : 0))\n  }\n\n  // Adjust a position to refer to the post-change position of the\n  // same text, or the end of the change if the change covers it.\n  function adjustForChange(pos, change) {\n    if (cmp(pos, change.from) < 0) { return pos }\n    if (cmp(pos, change.to) <= 0) { return changeEnd(change) }\n\n    var line = pos.line + change.text.length - (change.to.line - change.from.line) - 1, ch = pos.ch;\n    if (pos.line == change.to.line) { ch += changeEnd(change).ch - change.to.ch; }\n    return Pos(line, ch)\n  }\n\n  function computeSelAfterChange(doc, change) {\n    var out = [];\n    for (var i = 0; i < doc.sel.ranges.length; i++) {\n      var range = doc.sel.ranges[i];\n      out.push(new Range(adjustForChange(range.anchor, change),\n                         adjustForChange(range.head, change)));\n    }\n    return normalizeSelection(doc.cm, out, doc.sel.primIndex)\n  }\n\n  function offsetPos(pos, old, nw) {\n    if (pos.line == old.line)\n      { return Pos(nw.line, pos.ch - old.ch + nw.ch) }\n    else\n      { return Pos(nw.line + (pos.line - old.line), pos.ch) }\n  }\n\n  // Used by replaceSelections to allow moving the selection to the\n  // start or around the replaced test. Hint may be \"start\" or \"around\".\n  function computeReplacedSel(doc, changes, hint) {\n    var out = [];\n    var oldPrev = Pos(doc.first, 0), newPrev = oldPrev;\n    for (var i = 0; i < changes.length; i++) {\n      var change = changes[i];\n      var from = offsetPos(change.from, oldPrev, newPrev);\n      var to = offsetPos(changeEnd(change), oldPrev, newPrev);\n      oldPrev = change.to;\n      newPrev = to;\n      if (hint == \"around\") {\n        var range = doc.sel.ranges[i], inv = cmp(range.head, range.anchor) < 0;\n        out[i] = new Range(inv ? to : from, inv ? from : to);\n      } else {\n        out[i] = new Range(from, from);\n      }\n    }\n    return new Selection(out, doc.sel.primIndex)\n  }\n\n  // Used to get the editor into a consistent state again when options change.\n\n  function loadMode(cm) {\n    cm.doc.mode = getMode(cm.options, cm.doc.modeOption);\n    resetModeState(cm);\n  }\n\n  function resetModeState(cm) {\n    cm.doc.iter(function (line) {\n      if (line.stateAfter) { line.stateAfter = null; }\n      if (line.styles) { line.styles = null; }\n    });\n    cm.doc.modeFrontier = cm.doc.highlightFrontier = cm.doc.first;\n    startWorker(cm, 100);\n    cm.state.modeGen++;\n    if (cm.curOp) { regChange(cm); }\n  }\n\n  // DOCUMENT DATA STRUCTURE\n\n  // By default, updates that start and end at the beginning of a line\n  // are treated specially, in order to make the association of line\n  // widgets and marker elements with the text behave more intuitive.\n  function isWholeLineUpdate(doc, change) {\n    return change.from.ch == 0 && change.to.ch == 0 && lst(change.text) == \"\" &&\n      (!doc.cm || doc.cm.options.wholeLineUpdateBefore)\n  }\n\n  // Perform a change on the document data structure.\n  function updateDoc(doc, change, markedSpans, estimateHeight) {\n    function spansFor(n) {return markedSpans ? markedSpans[n] : null}\n    function update(line, text, spans) {\n      updateLine(line, text, spans, estimateHeight);\n      signalLater(line, \"change\", line, change);\n    }\n    function linesFor(start, end) {\n      var result = [];\n      for (var i = start; i < end; ++i)\n        { result.push(new Line(text[i], spansFor(i), estimateHeight)); }\n      return result\n    }\n\n    var from = change.from, to = change.to, text = change.text;\n    var firstLine = getLine(doc, from.line), lastLine = getLine(doc, to.line);\n    var lastText = lst(text), lastSpans = spansFor(text.length - 1), nlines = to.line - from.line;\n\n    // Adjust the line structure\n    if (change.full) {\n      doc.insert(0, linesFor(0, text.length));\n      doc.remove(text.length, doc.size - text.length);\n    } else if (isWholeLineUpdate(doc, change)) {\n      // This is a whole-line replace. Treated specially to make\n      // sure line objects move the way they are supposed to.\n      var added = linesFor(0, text.length - 1);\n      update(lastLine, lastLine.text, lastSpans);\n      if (nlines) { doc.remove(from.line, nlines); }\n      if (added.length) { doc.insert(from.line, added); }\n    } else if (firstLine == lastLine) {\n      if (text.length == 1) {\n        update(firstLine, firstLine.text.slice(0, from.ch) + lastText + firstLine.text.slice(to.ch), lastSpans);\n      } else {\n        var added$1 = linesFor(1, text.length - 1);\n        added$1.push(new Line(lastText + firstLine.text.slice(to.ch), lastSpans, estimateHeight));\n        update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0));\n        doc.insert(from.line + 1, added$1);\n      }\n    } else if (text.length == 1) {\n      update(firstLine, firstLine.text.slice(0, from.ch) + text[0] + lastLine.text.slice(to.ch), spansFor(0));\n      doc.remove(from.line + 1, nlines);\n    } else {\n      update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0));\n      update(lastLine, lastText + lastLine.text.slice(to.ch), lastSpans);\n      var added$2 = linesFor(1, text.length - 1);\n      if (nlines > 1) { doc.remove(from.line + 1, nlines - 1); }\n      doc.insert(from.line + 1, added$2);\n    }\n\n    signalLater(doc, \"change\", doc, change);\n  }\n\n  // Call f for all linked documents.\n  function linkedDocs(doc, f, sharedHistOnly) {\n    function propagate(doc, skip, sharedHist) {\n      if (doc.linked) { for (var i = 0; i < doc.linked.length; ++i) {\n        var rel = doc.linked[i];\n        if (rel.doc == skip) { continue }\n        var shared = sharedHist && rel.sharedHist;\n        if (sharedHistOnly && !shared) { continue }\n        f(rel.doc, shared);\n        propagate(rel.doc, doc, shared);\n      } }\n    }\n    propagate(doc, null, true);\n  }\n\n  // Attach a document to an editor.\n  function attachDoc(cm, doc) {\n    if (doc.cm) { throw new Error(\"This document is already in use.\") }\n    cm.doc = doc;\n    doc.cm = cm;\n    estimateLineHeights(cm);\n    loadMode(cm);\n    setDirectionClass(cm);\n    cm.options.direction = doc.direction;\n    if (!cm.options.lineWrapping) { findMaxLine(cm); }\n    cm.options.mode = doc.modeOption;\n    regChange(cm);\n  }\n\n  function setDirectionClass(cm) {\n  (cm.doc.direction == \"rtl\" ? addClass : rmClass)(cm.display.lineDiv, \"CodeMirror-rtl\");\n  }\n\n  function directionChanged(cm) {\n    runInOp(cm, function () {\n      setDirectionClass(cm);\n      regChange(cm);\n    });\n  }\n\n  function History(prev) {\n    // Arrays of change events and selections. Doing something adds an\n    // event to done and clears undo. Undoing moves events from done\n    // to undone, redoing moves them in the other direction.\n    this.done = []; this.undone = [];\n    this.undoDepth = prev ? prev.undoDepth : Infinity;\n    // Used to track when changes can be merged into a single undo\n    // event\n    this.lastModTime = this.lastSelTime = 0;\n    this.lastOp = this.lastSelOp = null;\n    this.lastOrigin = this.lastSelOrigin = null;\n    // Used by the isClean() method\n    this.generation = this.maxGeneration = prev ? prev.maxGeneration : 1;\n  }\n\n  // Create a history change event from an updateDoc-style change\n  // object.\n  function historyChangeFromChange(doc, change) {\n    var histChange = {from: copyPos(change.from), to: changeEnd(change), text: getBetween(doc, change.from, change.to)};\n    attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1);\n    linkedDocs(doc, function (doc) { return attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1); }, true);\n    return histChange\n  }\n\n  // Pop all selection events off the end of a history array. Stop at\n  // a change event.\n  function clearSelectionEvents(array) {\n    while (array.length) {\n      var last = lst(array);\n      if (last.ranges) { array.pop(); }\n      else { break }\n    }\n  }\n\n  // Find the top change event in the history. Pop off selection\n  // events that are in the way.\n  function lastChangeEvent(hist, force) {\n    if (force) {\n      clearSelectionEvents(hist.done);\n      return lst(hist.done)\n    } else if (hist.done.length && !lst(hist.done).ranges) {\n      return lst(hist.done)\n    } else if (hist.done.length > 1 && !hist.done[hist.done.length - 2].ranges) {\n      hist.done.pop();\n      return lst(hist.done)\n    }\n  }\n\n  // Register a change in the history. Merges changes that are within\n  // a single operation, or are close together with an origin that\n  // allows merging (starting with \"+\") into a single event.\n  function addChangeToHistory(doc, change, selAfter, opId) {\n    var hist = doc.history;\n    hist.undone.length = 0;\n    var time = +new Date, cur;\n    var last;\n\n    if ((hist.lastOp == opId ||\n         hist.lastOrigin == change.origin && change.origin &&\n         ((change.origin.charAt(0) == \"+\" && hist.lastModTime > time - (doc.cm ? doc.cm.options.historyEventDelay : 500)) ||\n          change.origin.charAt(0) == \"*\")) &&\n        (cur = lastChangeEvent(hist, hist.lastOp == opId))) {\n      // Merge this change into the last event\n      last = lst(cur.changes);\n      if (cmp(change.from, change.to) == 0 && cmp(change.from, last.to) == 0) {\n        // Optimized case for simple insertion -- don't want to add\n        // new changesets for every character typed\n        last.to = changeEnd(change);\n      } else {\n        // Add new sub-event\n        cur.changes.push(historyChangeFromChange(doc, change));\n      }\n    } else {\n      // Can not be merged, start a new event.\n      var before = lst(hist.done);\n      if (!before || !before.ranges)\n        { pushSelectionToHistory(doc.sel, hist.done); }\n      cur = {changes: [historyChangeFromChange(doc, change)],\n             generation: hist.generation};\n      hist.done.push(cur);\n      while (hist.done.length > hist.undoDepth) {\n        hist.done.shift();\n        if (!hist.done[0].ranges) { hist.done.shift(); }\n      }\n    }\n    hist.done.push(selAfter);\n    hist.generation = ++hist.maxGeneration;\n    hist.lastModTime = hist.lastSelTime = time;\n    hist.lastOp = hist.lastSelOp = opId;\n    hist.lastOrigin = hist.lastSelOrigin = change.origin;\n\n    if (!last) { signal(doc, \"historyAdded\"); }\n  }\n\n  function selectionEventCanBeMerged(doc, origin, prev, sel) {\n    var ch = origin.charAt(0);\n    return ch == \"*\" ||\n      ch == \"+\" &&\n      prev.ranges.length == sel.ranges.length &&\n      prev.somethingSelected() == sel.somethingSelected() &&\n      new Date - doc.history.lastSelTime <= (doc.cm ? doc.cm.options.historyEventDelay : 500)\n  }\n\n  // Called whenever the selection changes, sets the new selection as\n  // the pending selection in the history, and pushes the old pending\n  // selection into the 'done' array when it was significantly\n  // different (in number of selected ranges, emptiness, or time).\n  function addSelectionToHistory(doc, sel, opId, options) {\n    var hist = doc.history, origin = options && options.origin;\n\n    // A new event is started when the previous origin does not match\n    // the current, or the origins don't allow matching. Origins\n    // starting with * are always merged, those starting with + are\n    // merged when similar and close together in time.\n    if (opId == hist.lastSelOp ||\n        (origin && hist.lastSelOrigin == origin &&\n         (hist.lastModTime == hist.lastSelTime && hist.lastOrigin == origin ||\n          selectionEventCanBeMerged(doc, origin, lst(hist.done), sel))))\n      { hist.done[hist.done.length - 1] = sel; }\n    else\n      { pushSelectionToHistory(sel, hist.done); }\n\n    hist.lastSelTime = +new Date;\n    hist.lastSelOrigin = origin;\n    hist.lastSelOp = opId;\n    if (options && options.clearRedo !== false)\n      { clearSelectionEvents(hist.undone); }\n  }\n\n  function pushSelectionToHistory(sel, dest) {\n    var top = lst(dest);\n    if (!(top && top.ranges && top.equals(sel)))\n      { dest.push(sel); }\n  }\n\n  // Used to store marked span information in the history.\n  function attachLocalSpans(doc, change, from, to) {\n    var existing = change[\"spans_\" + doc.id], n = 0;\n    doc.iter(Math.max(doc.first, from), Math.min(doc.first + doc.size, to), function (line) {\n      if (line.markedSpans)\n        { (existing || (existing = change[\"spans_\" + doc.id] = {}))[n] = line.markedSpans; }\n      ++n;\n    });\n  }\n\n  // When un/re-doing restores text containing marked spans, those\n  // that have been explicitly cleared should not be restored.\n  function removeClearedSpans(spans) {\n    if (!spans) { return null }\n    var out;\n    for (var i = 0; i < spans.length; ++i) {\n      if (spans[i].marker.explicitlyCleared) { if (!out) { out = spans.slice(0, i); } }\n      else if (out) { out.push(spans[i]); }\n    }\n    return !out ? spans : out.length ? out : null\n  }\n\n  // Retrieve and filter the old marked spans stored in a change event.\n  function getOldSpans(doc, change) {\n    var found = change[\"spans_\" + doc.id];\n    if (!found) { return null }\n    var nw = [];\n    for (var i = 0; i < change.text.length; ++i)\n      { nw.push(removeClearedSpans(found[i])); }\n    return nw\n  }\n\n  // Used for un/re-doing changes from the history. Combines the\n  // result of computing the existing spans with the set of spans that\n  // existed in the history (so that deleting around a span and then\n  // undoing brings back the span).\n  function mergeOldSpans(doc, change) {\n    var old = getOldSpans(doc, change);\n    var stretched = stretchSpansOverChange(doc, change);\n    if (!old) { return stretched }\n    if (!stretched) { return old }\n\n    for (var i = 0; i < old.length; ++i) {\n      var oldCur = old[i], stretchCur = stretched[i];\n      if (oldCur && stretchCur) {\n        spans: for (var j = 0; j < stretchCur.length; ++j) {\n          var span = stretchCur[j];\n          for (var k = 0; k < oldCur.length; ++k)\n            { if (oldCur[k].marker == span.marker) { continue spans } }\n          oldCur.push(span);\n        }\n      } else if (stretchCur) {\n        old[i] = stretchCur;\n      }\n    }\n    return old\n  }\n\n  // Used both to provide a JSON-safe object in .getHistory, and, when\n  // detaching a document, to split the history in two\n  function copyHistoryArray(events, newGroup, instantiateSel) {\n    var copy = [];\n    for (var i = 0; i < events.length; ++i) {\n      var event = events[i];\n      if (event.ranges) {\n        copy.push(instantiateSel ? Selection.prototype.deepCopy.call(event) : event);\n        continue\n      }\n      var changes = event.changes, newChanges = [];\n      copy.push({changes: newChanges});\n      for (var j = 0; j < changes.length; ++j) {\n        var change = changes[j], m = (void 0);\n        newChanges.push({from: change.from, to: change.to, text: change.text});\n        if (newGroup) { for (var prop in change) { if (m = prop.match(/^spans_(\\d+)$/)) {\n          if (indexOf(newGroup, Number(m[1])) > -1) {\n            lst(newChanges)[prop] = change[prop];\n            delete change[prop];\n          }\n        } } }\n      }\n    }\n    return copy\n  }\n\n  // The 'scroll' parameter given to many of these indicated whether\n  // the new cursor position should be scrolled into view after\n  // modifying the selection.\n\n  // If shift is held or the extend flag is set, extends a range to\n  // include a given position (and optionally a second position).\n  // Otherwise, simply returns the range between the given positions.\n  // Used for cursor motion and such.\n  function extendRange(range, head, other, extend) {\n    if (extend) {\n      var anchor = range.anchor;\n      if (other) {\n        var posBefore = cmp(head, anchor) < 0;\n        if (posBefore != (cmp(other, anchor) < 0)) {\n          anchor = head;\n          head = other;\n        } else if (posBefore != (cmp(head, other) < 0)) {\n          head = other;\n        }\n      }\n      return new Range(anchor, head)\n    } else {\n      return new Range(other || head, head)\n    }\n  }\n\n  // Extend the primary selection range, discard the rest.\n  function extendSelection(doc, head, other, options, extend) {\n    if (extend == null) { extend = doc.cm && (doc.cm.display.shift || doc.extend); }\n    setSelection(doc, new Selection([extendRange(doc.sel.primary(), head, other, extend)], 0), options);\n  }\n\n  // Extend all selections (pos is an array of selections with length\n  // equal the number of selections)\n  function extendSelections(doc, heads, options) {\n    var out = [];\n    var extend = doc.cm && (doc.cm.display.shift || doc.extend);\n    for (var i = 0; i < doc.sel.ranges.length; i++)\n      { out[i] = extendRange(doc.sel.ranges[i], heads[i], null, extend); }\n    var newSel = normalizeSelection(doc.cm, out, doc.sel.primIndex);\n    setSelection(doc, newSel, options);\n  }\n\n  // Updates a single range in the selection.\n  function replaceOneSelection(doc, i, range, options) {\n    var ranges = doc.sel.ranges.slice(0);\n    ranges[i] = range;\n    setSelection(doc, normalizeSelection(doc.cm, ranges, doc.sel.primIndex), options);\n  }\n\n  // Reset the selection to a single range.\n  function setSimpleSelection(doc, anchor, head, options) {\n    setSelection(doc, simpleSelection(anchor, head), options);\n  }\n\n  // Give beforeSelectionChange handlers a change to influence a\n  // selection update.\n  function filterSelectionChange(doc, sel, options) {\n    var obj = {\n      ranges: sel.ranges,\n      update: function(ranges) {\n        this.ranges = [];\n        for (var i = 0; i < ranges.length; i++)\n          { this.ranges[i] = new Range(clipPos(doc, ranges[i].anchor),\n                                     clipPos(doc, ranges[i].head)); }\n      },\n      origin: options && options.origin\n    };\n    signal(doc, \"beforeSelectionChange\", doc, obj);\n    if (doc.cm) { signal(doc.cm, \"beforeSelectionChange\", doc.cm, obj); }\n    if (obj.ranges != sel.ranges) { return normalizeSelection(doc.cm, obj.ranges, obj.ranges.length - 1) }\n    else { return sel }\n  }\n\n  function setSelectionReplaceHistory(doc, sel, options) {\n    var done = doc.history.done, last = lst(done);\n    if (last && last.ranges) {\n      done[done.length - 1] = sel;\n      setSelectionNoUndo(doc, sel, options);\n    } else {\n      setSelection(doc, sel, options);\n    }\n  }\n\n  // Set a new selection.\n  function setSelection(doc, sel, options) {\n    setSelectionNoUndo(doc, sel, options);\n    addSelectionToHistory(doc, doc.sel, doc.cm ? doc.cm.curOp.id : NaN, options);\n  }\n\n  function setSelectionNoUndo(doc, sel, options) {\n    if (hasHandler(doc, \"beforeSelectionChange\") || doc.cm && hasHandler(doc.cm, \"beforeSelectionChange\"))\n      { sel = filterSelectionChange(doc, sel, options); }\n\n    var bias = options && options.bias ||\n      (cmp(sel.primary().head, doc.sel.primary().head) < 0 ? -1 : 1);\n    setSelectionInner(doc, skipAtomicInSelection(doc, sel, bias, true));\n\n    if (!(options && options.scroll === false) && doc.cm && doc.cm.getOption(\"readOnly\") != \"nocursor\")\n      { ensureCursorVisible(doc.cm); }\n  }\n\n  function setSelectionInner(doc, sel) {\n    if (sel.equals(doc.sel)) { return }\n\n    doc.sel = sel;\n\n    if (doc.cm) {\n      doc.cm.curOp.updateInput = 1;\n      doc.cm.curOp.selectionChanged = true;\n      signalCursorActivity(doc.cm);\n    }\n    signalLater(doc, \"cursorActivity\", doc);\n  }\n\n  // Verify that the selection does not partially select any atomic\n  // marked ranges.\n  function reCheckSelection(doc) {\n    setSelectionInner(doc, skipAtomicInSelection(doc, doc.sel, null, false));\n  }\n\n  // Return a selection that does not partially select any atomic\n  // ranges.\n  function skipAtomicInSelection(doc, sel, bias, mayClear) {\n    var out;\n    for (var i = 0; i < sel.ranges.length; i++) {\n      var range = sel.ranges[i];\n      var old = sel.ranges.length == doc.sel.ranges.length && doc.sel.ranges[i];\n      var newAnchor = skipAtomic(doc, range.anchor, old && old.anchor, bias, mayClear);\n      var newHead = range.head == range.anchor ? newAnchor : skipAtomic(doc, range.head, old && old.head, bias, mayClear);\n      if (out || newAnchor != range.anchor || newHead != range.head) {\n        if (!out) { out = sel.ranges.slice(0, i); }\n        out[i] = new Range(newAnchor, newHead);\n      }\n    }\n    return out ? normalizeSelection(doc.cm, out, sel.primIndex) : sel\n  }\n\n  function skipAtomicInner(doc, pos, oldPos, dir, mayClear) {\n    var line = getLine(doc, pos.line);\n    if (line.markedSpans) { for (var i = 0; i < line.markedSpans.length; ++i) {\n      var sp = line.markedSpans[i], m = sp.marker;\n\n      // Determine if we should prevent the cursor being placed to the left/right of an atomic marker\n      // Historically this was determined using the inclusiveLeft/Right option, but the new way to control it\n      // is with selectLeft/Right\n      var preventCursorLeft = (\"selectLeft\" in m) ? !m.selectLeft : m.inclusiveLeft;\n      var preventCursorRight = (\"selectRight\" in m) ? !m.selectRight : m.inclusiveRight;\n\n      if ((sp.from == null || (preventCursorLeft ? sp.from <= pos.ch : sp.from < pos.ch)) &&\n          (sp.to == null || (preventCursorRight ? sp.to >= pos.ch : sp.to > pos.ch))) {\n        if (mayClear) {\n          signal(m, \"beforeCursorEnter\");\n          if (m.explicitlyCleared) {\n            if (!line.markedSpans) { break }\n            else {--i; continue}\n          }\n        }\n        if (!m.atomic) { continue }\n\n        if (oldPos) {\n          var near = m.find(dir < 0 ? 1 : -1), diff = (void 0);\n          if (dir < 0 ? preventCursorRight : preventCursorLeft)\n            { near = movePos(doc, near, -dir, near && near.line == pos.line ? line : null); }\n          if (near && near.line == pos.line && (diff = cmp(near, oldPos)) && (dir < 0 ? diff < 0 : diff > 0))\n            { return skipAtomicInner(doc, near, pos, dir, mayClear) }\n        }\n\n        var far = m.find(dir < 0 ? -1 : 1);\n        if (dir < 0 ? preventCursorLeft : preventCursorRight)\n          { far = movePos(doc, far, dir, far.line == pos.line ? line : null); }\n        return far ? skipAtomicInner(doc, far, pos, dir, mayClear) : null\n      }\n    } }\n    return pos\n  }\n\n  // Ensure a given position is not inside an atomic range.\n  function skipAtomic(doc, pos, oldPos, bias, mayClear) {\n    var dir = bias || 1;\n    var found = skipAtomicInner(doc, pos, oldPos, dir, mayClear) ||\n        (!mayClear && skipAtomicInner(doc, pos, oldPos, dir, true)) ||\n        skipAtomicInner(doc, pos, oldPos, -dir, mayClear) ||\n        (!mayClear && skipAtomicInner(doc, pos, oldPos, -dir, true));\n    if (!found) {\n      doc.cantEdit = true;\n      return Pos(doc.first, 0)\n    }\n    return found\n  }\n\n  function movePos(doc, pos, dir, line) {\n    if (dir < 0 && pos.ch == 0) {\n      if (pos.line > doc.first) { return clipPos(doc, Pos(pos.line - 1)) }\n      else { return null }\n    } else if (dir > 0 && pos.ch == (line || getLine(doc, pos.line)).text.length) {\n      if (pos.line < doc.first + doc.size - 1) { return Pos(pos.line + 1, 0) }\n      else { return null }\n    } else {\n      return new Pos(pos.line, pos.ch + dir)\n    }\n  }\n\n  function selectAll(cm) {\n    cm.setSelection(Pos(cm.firstLine(), 0), Pos(cm.lastLine()), sel_dontScroll);\n  }\n\n  // UPDATING\n\n  // Allow \"beforeChange\" event handlers to influence a change\n  function filterChange(doc, change, update) {\n    var obj = {\n      canceled: false,\n      from: change.from,\n      to: change.to,\n      text: change.text,\n      origin: change.origin,\n      cancel: function () { return obj.canceled = true; }\n    };\n    if (update) { obj.update = function (from, to, text, origin) {\n      if (from) { obj.from = clipPos(doc, from); }\n      if (to) { obj.to = clipPos(doc, to); }\n      if (text) { obj.text = text; }\n      if (origin !== undefined) { obj.origin = origin; }\n    }; }\n    signal(doc, \"beforeChange\", doc, obj);\n    if (doc.cm) { signal(doc.cm, \"beforeChange\", doc.cm, obj); }\n\n    if (obj.canceled) {\n      if (doc.cm) { doc.cm.curOp.updateInput = 2; }\n      return null\n    }\n    return {from: obj.from, to: obj.to, text: obj.text, origin: obj.origin}\n  }\n\n  // Apply a change to a document, and add it to the document's\n  // history, and propagating it to all linked documents.\n  function makeChange(doc, change, ignoreReadOnly) {\n    if (doc.cm) {\n      if (!doc.cm.curOp) { return operation(doc.cm, makeChange)(doc, change, ignoreReadOnly) }\n      if (doc.cm.state.suppressEdits) { return }\n    }\n\n    if (hasHandler(doc, \"beforeChange\") || doc.cm && hasHandler(doc.cm, \"beforeChange\")) {\n      change = filterChange(doc, change, true);\n      if (!change) { return }\n    }\n\n    // Possibly split or suppress the update based on the presence\n    // of read-only spans in its range.\n    var split = sawReadOnlySpans && !ignoreReadOnly && removeReadOnlyRanges(doc, change.from, change.to);\n    if (split) {\n      for (var i = split.length - 1; i >= 0; --i)\n        { makeChangeInner(doc, {from: split[i].from, to: split[i].to, text: i ? [\"\"] : change.text, origin: change.origin}); }\n    } else {\n      makeChangeInner(doc, change);\n    }\n  }\n\n  function makeChangeInner(doc, change) {\n    if (change.text.length == 1 && change.text[0] == \"\" && cmp(change.from, change.to) == 0) { return }\n    var selAfter = computeSelAfterChange(doc, change);\n    addChangeToHistory(doc, change, selAfter, doc.cm ? doc.cm.curOp.id : NaN);\n\n    makeChangeSingleDoc(doc, change, selAfter, stretchSpansOverChange(doc, change));\n    var rebased = [];\n\n    linkedDocs(doc, function (doc, sharedHist) {\n      if (!sharedHist && indexOf(rebased, doc.history) == -1) {\n        rebaseHist(doc.history, change);\n        rebased.push(doc.history);\n      }\n      makeChangeSingleDoc(doc, change, null, stretchSpansOverChange(doc, change));\n    });\n  }\n\n  // Revert a change stored in a document's history.\n  function makeChangeFromHistory(doc, type, allowSelectionOnly) {\n    var suppress = doc.cm && doc.cm.state.suppressEdits;\n    if (suppress && !allowSelectionOnly) { return }\n\n    var hist = doc.history, event, selAfter = doc.sel;\n    var source = type == \"undo\" ? hist.done : hist.undone, dest = type == \"undo\" ? hist.undone : hist.done;\n\n    // Verify that there is a useable event (so that ctrl-z won't\n    // needlessly clear selection events)\n    var i = 0;\n    for (; i < source.length; i++) {\n      event = source[i];\n      if (allowSelectionOnly ? event.ranges && !event.equals(doc.sel) : !event.ranges)\n        { break }\n    }\n    if (i == source.length) { return }\n    hist.lastOrigin = hist.lastSelOrigin = null;\n\n    for (;;) {\n      event = source.pop();\n      if (event.ranges) {\n        pushSelectionToHistory(event, dest);\n        if (allowSelectionOnly && !event.equals(doc.sel)) {\n          setSelection(doc, event, {clearRedo: false});\n          return\n        }\n        selAfter = event;\n      } else if (suppress) {\n        source.push(event);\n        return\n      } else { break }\n    }\n\n    // Build up a reverse change object to add to the opposite history\n    // stack (redo when undoing, and vice versa).\n    var antiChanges = [];\n    pushSelectionToHistory(selAfter, dest);\n    dest.push({changes: antiChanges, generation: hist.generation});\n    hist.generation = event.generation || ++hist.maxGeneration;\n\n    var filter = hasHandler(doc, \"beforeChange\") || doc.cm && hasHandler(doc.cm, \"beforeChange\");\n\n    var loop = function ( i ) {\n      var change = event.changes[i];\n      change.origin = type;\n      if (filter && !filterChange(doc, change, false)) {\n        source.length = 0;\n        return {}\n      }\n\n      antiChanges.push(historyChangeFromChange(doc, change));\n\n      var after = i ? computeSelAfterChange(doc, change) : lst(source);\n      makeChangeSingleDoc(doc, change, after, mergeOldSpans(doc, change));\n      if (!i && doc.cm) { doc.cm.scrollIntoView({from: change.from, to: changeEnd(change)}); }\n      var rebased = [];\n\n      // Propagate to the linked documents\n      linkedDocs(doc, function (doc, sharedHist) {\n        if (!sharedHist && indexOf(rebased, doc.history) == -1) {\n          rebaseHist(doc.history, change);\n          rebased.push(doc.history);\n        }\n        makeChangeSingleDoc(doc, change, null, mergeOldSpans(doc, change));\n      });\n    };\n\n    for (var i$1 = event.changes.length - 1; i$1 >= 0; --i$1) {\n      var returned = loop( i$1 );\n\n      if ( returned ) return returned.v;\n    }\n  }\n\n  // Sub-views need their line numbers shifted when text is added\n  // above or below them in the parent document.\n  function shiftDoc(doc, distance) {\n    if (distance == 0) { return }\n    doc.first += distance;\n    doc.sel = new Selection(map(doc.sel.ranges, function (range) { return new Range(\n      Pos(range.anchor.line + distance, range.anchor.ch),\n      Pos(range.head.line + distance, range.head.ch)\n    ); }), doc.sel.primIndex);\n    if (doc.cm) {\n      regChange(doc.cm, doc.first, doc.first - distance, distance);\n      for (var d = doc.cm.display, l = d.viewFrom; l < d.viewTo; l++)\n        { regLineChange(doc.cm, l, \"gutter\"); }\n    }\n  }\n\n  // More lower-level change function, handling only a single document\n  // (not linked ones).\n  function makeChangeSingleDoc(doc, change, selAfter, spans) {\n    if (doc.cm && !doc.cm.curOp)\n      { return operation(doc.cm, makeChangeSingleDoc)(doc, change, selAfter, spans) }\n\n    if (change.to.line < doc.first) {\n      shiftDoc(doc, change.text.length - 1 - (change.to.line - change.from.line));\n      return\n    }\n    if (change.from.line > doc.lastLine()) { return }\n\n    // Clip the change to the size of this doc\n    if (change.from.line < doc.first) {\n      var shift = change.text.length - 1 - (doc.first - change.from.line);\n      shiftDoc(doc, shift);\n      change = {from: Pos(doc.first, 0), to: Pos(change.to.line + shift, change.to.ch),\n                text: [lst(change.text)], origin: change.origin};\n    }\n    var last = doc.lastLine();\n    if (change.to.line > last) {\n      change = {from: change.from, to: Pos(last, getLine(doc, last).text.length),\n                text: [change.text[0]], origin: change.origin};\n    }\n\n    change.removed = getBetween(doc, change.from, change.to);\n\n    if (!selAfter) { selAfter = computeSelAfterChange(doc, change); }\n    if (doc.cm) { makeChangeSingleDocInEditor(doc.cm, change, spans); }\n    else { updateDoc(doc, change, spans); }\n    setSelectionNoUndo(doc, selAfter, sel_dontScroll);\n\n    if (doc.cantEdit && skipAtomic(doc, Pos(doc.firstLine(), 0)))\n      { doc.cantEdit = false; }\n  }\n\n  // Handle the interaction of a change to a document with the editor\n  // that this document is part of.\n  function makeChangeSingleDocInEditor(cm, change, spans) {\n    var doc = cm.doc, display = cm.display, from = change.from, to = change.to;\n\n    var recomputeMaxLength = false, checkWidthStart = from.line;\n    if (!cm.options.lineWrapping) {\n      checkWidthStart = lineNo(visualLine(getLine(doc, from.line)));\n      doc.iter(checkWidthStart, to.line + 1, function (line) {\n        if (line == display.maxLine) {\n          recomputeMaxLength = true;\n          return true\n        }\n      });\n    }\n\n    if (doc.sel.contains(change.from, change.to) > -1)\n      { signalCursorActivity(cm); }\n\n    updateDoc(doc, change, spans, estimateHeight(cm));\n\n    if (!cm.options.lineWrapping) {\n      doc.iter(checkWidthStart, from.line + change.text.length, function (line) {\n        var len = lineLength(line);\n        if (len > display.maxLineLength) {\n          display.maxLine = line;\n          display.maxLineLength = len;\n          display.maxLineChanged = true;\n          recomputeMaxLength = false;\n        }\n      });\n      if (recomputeMaxLength) { cm.curOp.updateMaxLine = true; }\n    }\n\n    retreatFrontier(doc, from.line);\n    startWorker(cm, 400);\n\n    var lendiff = change.text.length - (to.line - from.line) - 1;\n    // Remember that these lines changed, for updating the display\n    if (change.full)\n      { regChange(cm); }\n    else if (from.line == to.line && change.text.length == 1 && !isWholeLineUpdate(cm.doc, change))\n      { regLineChange(cm, from.line, \"text\"); }\n    else\n      { regChange(cm, from.line, to.line + 1, lendiff); }\n\n    var changesHandler = hasHandler(cm, \"changes\"), changeHandler = hasHandler(cm, \"change\");\n    if (changeHandler || changesHandler) {\n      var obj = {\n        from: from, to: to,\n        text: change.text,\n        removed: change.removed,\n        origin: change.origin\n      };\n      if (changeHandler) { signalLater(cm, \"change\", cm, obj); }\n      if (changesHandler) { (cm.curOp.changeObjs || (cm.curOp.changeObjs = [])).push(obj); }\n    }\n    cm.display.selForContextMenu = null;\n  }\n\n  function replaceRange(doc, code, from, to, origin) {\n    var assign;\n\n    if (!to) { to = from; }\n    if (cmp(to, from) < 0) { (assign = [to, from], from = assign[0], to = assign[1]); }\n    if (typeof code == \"string\") { code = doc.splitLines(code); }\n    makeChange(doc, {from: from, to: to, text: code, origin: origin});\n  }\n\n  // Rebasing/resetting history to deal with externally-sourced changes\n\n  function rebaseHistSelSingle(pos, from, to, diff) {\n    if (to < pos.line) {\n      pos.line += diff;\n    } else if (from < pos.line) {\n      pos.line = from;\n      pos.ch = 0;\n    }\n  }\n\n  // Tries to rebase an array of history events given a change in the\n  // document. If the change touches the same lines as the event, the\n  // event, and everything 'behind' it, is discarded. If the change is\n  // before the event, the event's positions are updated. Uses a\n  // copy-on-write scheme for the positions, to avoid having to\n  // reallocate them all on every rebase, but also avoid problems with\n  // shared position objects being unsafely updated.\n  function rebaseHistArray(array, from, to, diff) {\n    for (var i = 0; i < array.length; ++i) {\n      var sub = array[i], ok = true;\n      if (sub.ranges) {\n        if (!sub.copied) { sub = array[i] = sub.deepCopy(); sub.copied = true; }\n        for (var j = 0; j < sub.ranges.length; j++) {\n          rebaseHistSelSingle(sub.ranges[j].anchor, from, to, diff);\n          rebaseHistSelSingle(sub.ranges[j].head, from, to, diff);\n        }\n        continue\n      }\n      for (var j$1 = 0; j$1 < sub.changes.length; ++j$1) {\n        var cur = sub.changes[j$1];\n        if (to < cur.from.line) {\n          cur.from = Pos(cur.from.line + diff, cur.from.ch);\n          cur.to = Pos(cur.to.line + diff, cur.to.ch);\n        } else if (from <= cur.to.line) {\n          ok = false;\n          break\n        }\n      }\n      if (!ok) {\n        array.splice(0, i + 1);\n        i = 0;\n      }\n    }\n  }\n\n  function rebaseHist(hist, change) {\n    var from = change.from.line, to = change.to.line, diff = change.text.length - (to - from) - 1;\n    rebaseHistArray(hist.done, from, to, diff);\n    rebaseHistArray(hist.undone, from, to, diff);\n  }\n\n  // Utility for applying a change to a line by handle or number,\n  // returning the number and optionally registering the line as\n  // changed.\n  function changeLine(doc, handle, changeType, op) {\n    var no = handle, line = handle;\n    if (typeof handle == \"number\") { line = getLine(doc, clipLine(doc, handle)); }\n    else { no = lineNo(handle); }\n    if (no == null) { return null }\n    if (op(line, no) && doc.cm) { regLineChange(doc.cm, no, changeType); }\n    return line\n  }\n\n  // The document is represented as a BTree consisting of leaves, with\n  // chunk of lines in them, and branches, with up to ten leaves or\n  // other branch nodes below them. The top node is always a branch\n  // node, and is the document object itself (meaning it has\n  // additional methods and properties).\n  //\n  // All nodes have parent links. The tree is used both to go from\n  // line numbers to line objects, and to go from objects to numbers.\n  // It also indexes by height, and is used to convert between height\n  // and line object, and to find the total height of the document.\n  //\n  // See also http://marijnhaverbeke.nl/blog/codemirror-line-tree.html\n\n  function LeafChunk(lines) {\n    this.lines = lines;\n    this.parent = null;\n    var height = 0;\n    for (var i = 0; i < lines.length; ++i) {\n      lines[i].parent = this;\n      height += lines[i].height;\n    }\n    this.height = height;\n  }\n\n  LeafChunk.prototype = {\n    chunkSize: function() { return this.lines.length },\n\n    // Remove the n lines at offset 'at'.\n    removeInner: function(at, n) {\n      for (var i = at, e = at + n; i < e; ++i) {\n        var line = this.lines[i];\n        this.height -= line.height;\n        cleanUpLine(line);\n        signalLater(line, \"delete\");\n      }\n      this.lines.splice(at, n);\n    },\n\n    // Helper used to collapse a small branch into a single leaf.\n    collapse: function(lines) {\n      lines.push.apply(lines, this.lines);\n    },\n\n    // Insert the given array of lines at offset 'at', count them as\n    // having the given height.\n    insertInner: function(at, lines, height) {\n      this.height += height;\n      this.lines = this.lines.slice(0, at).concat(lines).concat(this.lines.slice(at));\n      for (var i = 0; i < lines.length; ++i) { lines[i].parent = this; }\n    },\n\n    // Used to iterate over a part of the tree.\n    iterN: function(at, n, op) {\n      for (var e = at + n; at < e; ++at)\n        { if (op(this.lines[at])) { return true } }\n    }\n  };\n\n  function BranchChunk(children) {\n    this.children = children;\n    var size = 0, height = 0;\n    for (var i = 0; i < children.length; ++i) {\n      var ch = children[i];\n      size += ch.chunkSize(); height += ch.height;\n      ch.parent = this;\n    }\n    this.size = size;\n    this.height = height;\n    this.parent = null;\n  }\n\n  BranchChunk.prototype = {\n    chunkSize: function() { return this.size },\n\n    removeInner: function(at, n) {\n      this.size -= n;\n      for (var i = 0; i < this.children.length; ++i) {\n        var child = this.children[i], sz = child.chunkSize();\n        if (at < sz) {\n          var rm = Math.min(n, sz - at), oldHeight = child.height;\n          child.removeInner(at, rm);\n          this.height -= oldHeight - child.height;\n          if (sz == rm) { this.children.splice(i--, 1); child.parent = null; }\n          if ((n -= rm) == 0) { break }\n          at = 0;\n        } else { at -= sz; }\n      }\n      // If the result is smaller than 25 lines, ensure that it is a\n      // single leaf node.\n      if (this.size - n < 25 &&\n          (this.children.length > 1 || !(this.children[0] instanceof LeafChunk))) {\n        var lines = [];\n        this.collapse(lines);\n        this.children = [new LeafChunk(lines)];\n        this.children[0].parent = this;\n      }\n    },\n\n    collapse: function(lines) {\n      for (var i = 0; i < this.children.length; ++i) { this.children[i].collapse(lines); }\n    },\n\n    insertInner: function(at, lines, height) {\n      this.size += lines.length;\n      this.height += height;\n      for (var i = 0; i < this.children.length; ++i) {\n        var child = this.children[i], sz = child.chunkSize();\n        if (at <= sz) {\n          child.insertInner(at, lines, height);\n          if (child.lines && child.lines.length > 50) {\n            // To avoid memory thrashing when child.lines is huge (e.g. first view of a large file), it's never spliced.\n            // Instead, small slices are taken. They're taken in order because sequential memory accesses are fastest.\n            var remaining = child.lines.length % 25 + 25;\n            for (var pos = remaining; pos < child.lines.length;) {\n              var leaf = new LeafChunk(child.lines.slice(pos, pos += 25));\n              child.height -= leaf.height;\n              this.children.splice(++i, 0, leaf);\n              leaf.parent = this;\n            }\n            child.lines = child.lines.slice(0, remaining);\n            this.maybeSpill();\n          }\n          break\n        }\n        at -= sz;\n      }\n    },\n\n    // When a node has grown, check whether it should be split.\n    maybeSpill: function() {\n      if (this.children.length <= 10) { return }\n      var me = this;\n      do {\n        var spilled = me.children.splice(me.children.length - 5, 5);\n        var sibling = new BranchChunk(spilled);\n        if (!me.parent) { // Become the parent node\n          var copy = new BranchChunk(me.children);\n          copy.parent = me;\n          me.children = [copy, sibling];\n          me = copy;\n       } else {\n          me.size -= sibling.size;\n          me.height -= sibling.height;\n          var myIndex = indexOf(me.parent.children, me);\n          me.parent.children.splice(myIndex + 1, 0, sibling);\n        }\n        sibling.parent = me.parent;\n      } while (me.children.length > 10)\n      me.parent.maybeSpill();\n    },\n\n    iterN: function(at, n, op) {\n      for (var i = 0; i < this.children.length; ++i) {\n        var child = this.children[i], sz = child.chunkSize();\n        if (at < sz) {\n          var used = Math.min(n, sz - at);\n          if (child.iterN(at, used, op)) { return true }\n          if ((n -= used) == 0) { break }\n          at = 0;\n        } else { at -= sz; }\n      }\n    }\n  };\n\n  // Line widgets are block elements displayed above or below a line.\n\n  var LineWidget = function(doc, node, options) {\n    if (options) { for (var opt in options) { if (options.hasOwnProperty(opt))\n      { this[opt] = options[opt]; } } }\n    this.doc = doc;\n    this.node = node;\n  };\n\n  LineWidget.prototype.clear = function () {\n    var cm = this.doc.cm, ws = this.line.widgets, line = this.line, no = lineNo(line);\n    if (no == null || !ws) { return }\n    for (var i = 0; i < ws.length; ++i) { if (ws[i] == this) { ws.splice(i--, 1); } }\n    if (!ws.length) { line.widgets = null; }\n    var height = widgetHeight(this);\n    updateLineHeight(line, Math.max(0, line.height - height));\n    if (cm) {\n      runInOp(cm, function () {\n        adjustScrollWhenAboveVisible(cm, line, -height);\n        regLineChange(cm, no, \"widget\");\n      });\n      signalLater(cm, \"lineWidgetCleared\", cm, this, no);\n    }\n  };\n\n  LineWidget.prototype.changed = function () {\n      var this$1 = this;\n\n    var oldH = this.height, cm = this.doc.cm, line = this.line;\n    this.height = null;\n    var diff = widgetHeight(this) - oldH;\n    if (!diff) { return }\n    if (!lineIsHidden(this.doc, line)) { updateLineHeight(line, line.height + diff); }\n    if (cm) {\n      runInOp(cm, function () {\n        cm.curOp.forceUpdate = true;\n        adjustScrollWhenAboveVisible(cm, line, diff);\n        signalLater(cm, \"lineWidgetChanged\", cm, this$1, lineNo(line));\n      });\n    }\n  };\n  eventMixin(LineWidget);\n\n  function adjustScrollWhenAboveVisible(cm, line, diff) {\n    if (heightAtLine(line) < ((cm.curOp && cm.curOp.scrollTop) || cm.doc.scrollTop))\n      { addToScrollTop(cm, diff); }\n  }\n\n  function addLineWidget(doc, handle, node, options) {\n    var widget = new LineWidget(doc, node, options);\n    var cm = doc.cm;\n    if (cm && widget.noHScroll) { cm.display.alignWidgets = true; }\n    changeLine(doc, handle, \"widget\", function (line) {\n      var widgets = line.widgets || (line.widgets = []);\n      if (widget.insertAt == null) { widgets.push(widget); }\n      else { widgets.splice(Math.min(widgets.length, Math.max(0, widget.insertAt)), 0, widget); }\n      widget.line = line;\n      if (cm && !lineIsHidden(doc, line)) {\n        var aboveVisible = heightAtLine(line) < doc.scrollTop;\n        updateLineHeight(line, line.height + widgetHeight(widget));\n        if (aboveVisible) { addToScrollTop(cm, widget.height); }\n        cm.curOp.forceUpdate = true;\n      }\n      return true\n    });\n    if (cm) { signalLater(cm, \"lineWidgetAdded\", cm, widget, typeof handle == \"number\" ? handle : lineNo(handle)); }\n    return widget\n  }\n\n  // TEXTMARKERS\n\n  // Created with markText and setBookmark methods. A TextMarker is a\n  // handle that can be used to clear or find a marked position in the\n  // document. Line objects hold arrays (markedSpans) containing\n  // {from, to, marker} object pointing to such marker objects, and\n  // indicating that such a marker is present on that line. Multiple\n  // lines may point to the same marker when it spans across lines.\n  // The spans will have null for their from/to properties when the\n  // marker continues beyond the start/end of the line. Markers have\n  // links back to the lines they currently touch.\n\n  // Collapsed markers have unique ids, in order to be able to order\n  // them, which is needed for uniquely determining an outer marker\n  // when they overlap (they may nest, but not partially overlap).\n  var nextMarkerId = 0;\n\n  var TextMarker = function(doc, type) {\n    this.lines = [];\n    this.type = type;\n    this.doc = doc;\n    this.id = ++nextMarkerId;\n  };\n\n  // Clear the marker.\n  TextMarker.prototype.clear = function () {\n    if (this.explicitlyCleared) { return }\n    var cm = this.doc.cm, withOp = cm && !cm.curOp;\n    if (withOp) { startOperation(cm); }\n    if (hasHandler(this, \"clear\")) {\n      var found = this.find();\n      if (found) { signalLater(this, \"clear\", found.from, found.to); }\n    }\n    var min = null, max = null;\n    for (var i = 0; i < this.lines.length; ++i) {\n      var line = this.lines[i];\n      var span = getMarkedSpanFor(line.markedSpans, this);\n      if (cm && !this.collapsed) { regLineChange(cm, lineNo(line), \"text\"); }\n      else if (cm) {\n        if (span.to != null) { max = lineNo(line); }\n        if (span.from != null) { min = lineNo(line); }\n      }\n      line.markedSpans = removeMarkedSpan(line.markedSpans, span);\n      if (span.from == null && this.collapsed && !lineIsHidden(this.doc, line) && cm)\n        { updateLineHeight(line, textHeight(cm.display)); }\n    }\n    if (cm && this.collapsed && !cm.options.lineWrapping) { for (var i$1 = 0; i$1 < this.lines.length; ++i$1) {\n      var visual = visualLine(this.lines[i$1]), len = lineLength(visual);\n      if (len > cm.display.maxLineLength) {\n        cm.display.maxLine = visual;\n        cm.display.maxLineLength = len;\n        cm.display.maxLineChanged = true;\n      }\n    } }\n\n    if (min != null && cm && this.collapsed) { regChange(cm, min, max + 1); }\n    this.lines.length = 0;\n    this.explicitlyCleared = true;\n    if (this.atomic && this.doc.cantEdit) {\n      this.doc.cantEdit = false;\n      if (cm) { reCheckSelection(cm.doc); }\n    }\n    if (cm) { signalLater(cm, \"markerCleared\", cm, this, min, max); }\n    if (withOp) { endOperation(cm); }\n    if (this.parent) { this.parent.clear(); }\n  };\n\n  // Find the position of the marker in the document. Returns a {from,\n  // to} object by default. Side can be passed to get a specific side\n  // -- 0 (both), -1 (left), or 1 (right). When lineObj is true, the\n  // Pos objects returned contain a line object, rather than a line\n  // number (used to prevent looking up the same line twice).\n  TextMarker.prototype.find = function (side, lineObj) {\n    if (side == null && this.type == \"bookmark\") { side = 1; }\n    var from, to;\n    for (var i = 0; i < this.lines.length; ++i) {\n      var line = this.lines[i];\n      var span = getMarkedSpanFor(line.markedSpans, this);\n      if (span.from != null) {\n        from = Pos(lineObj ? line : lineNo(line), span.from);\n        if (side == -1) { return from }\n      }\n      if (span.to != null) {\n        to = Pos(lineObj ? line : lineNo(line), span.to);\n        if (side == 1) { return to }\n      }\n    }\n    return from && {from: from, to: to}\n  };\n\n  // Signals that the marker's widget changed, and surrounding layout\n  // should be recomputed.\n  TextMarker.prototype.changed = function () {\n      var this$1 = this;\n\n    var pos = this.find(-1, true), widget = this, cm = this.doc.cm;\n    if (!pos || !cm) { return }\n    runInOp(cm, function () {\n      var line = pos.line, lineN = lineNo(pos.line);\n      var view = findViewForLine(cm, lineN);\n      if (view) {\n        clearLineMeasurementCacheFor(view);\n        cm.curOp.selectionChanged = cm.curOp.forceUpdate = true;\n      }\n      cm.curOp.updateMaxLine = true;\n      if (!lineIsHidden(widget.doc, line) && widget.height != null) {\n        var oldHeight = widget.height;\n        widget.height = null;\n        var dHeight = widgetHeight(widget) - oldHeight;\n        if (dHeight)\n          { updateLineHeight(line, line.height + dHeight); }\n      }\n      signalLater(cm, \"markerChanged\", cm, this$1);\n    });\n  };\n\n  TextMarker.prototype.attachLine = function (line) {\n    if (!this.lines.length && this.doc.cm) {\n      var op = this.doc.cm.curOp;\n      if (!op.maybeHiddenMarkers || indexOf(op.maybeHiddenMarkers, this) == -1)\n        { (op.maybeUnhiddenMarkers || (op.maybeUnhiddenMarkers = [])).push(this); }\n    }\n    this.lines.push(line);\n  };\n\n  TextMarker.prototype.detachLine = function (line) {\n    this.lines.splice(indexOf(this.lines, line), 1);\n    if (!this.lines.length && this.doc.cm) {\n      var op = this.doc.cm.curOp\n      ;(op.maybeHiddenMarkers || (op.maybeHiddenMarkers = [])).push(this);\n    }\n  };\n  eventMixin(TextMarker);\n\n  // Create a marker, wire it up to the right lines, and\n  function markText(doc, from, to, options, type) {\n    // Shared markers (across linked documents) are handled separately\n    // (markTextShared will call out to this again, once per\n    // document).\n    if (options && options.shared) { return markTextShared(doc, from, to, options, type) }\n    // Ensure we are in an operation.\n    if (doc.cm && !doc.cm.curOp) { return operation(doc.cm, markText)(doc, from, to, options, type) }\n\n    var marker = new TextMarker(doc, type), diff = cmp(from, to);\n    if (options) { copyObj(options, marker, false); }\n    // Don't connect empty markers unless clearWhenEmpty is false\n    if (diff > 0 || diff == 0 && marker.clearWhenEmpty !== false)\n      { return marker }\n    if (marker.replacedWith) {\n      // Showing up as a widget implies collapsed (widget replaces text)\n      marker.collapsed = true;\n      marker.widgetNode = eltP(\"span\", [marker.replacedWith], \"CodeMirror-widget\");\n      if (!options.handleMouseEvents) { marker.widgetNode.setAttribute(\"cm-ignore-events\", \"true\"); }\n      if (options.insertLeft) { marker.widgetNode.insertLeft = true; }\n    }\n    if (marker.collapsed) {\n      if (conflictingCollapsedRange(doc, from.line, from, to, marker) ||\n          from.line != to.line && conflictingCollapsedRange(doc, to.line, from, to, marker))\n        { throw new Error(\"Inserting collapsed marker partially overlapping an existing one\") }\n      seeCollapsedSpans();\n    }\n\n    if (marker.addToHistory)\n      { addChangeToHistory(doc, {from: from, to: to, origin: \"markText\"}, doc.sel, NaN); }\n\n    var curLine = from.line, cm = doc.cm, updateMaxLine;\n    doc.iter(curLine, to.line + 1, function (line) {\n      if (cm && marker.collapsed && !cm.options.lineWrapping && visualLine(line) == cm.display.maxLine)\n        { updateMaxLine = true; }\n      if (marker.collapsed && curLine != from.line) { updateLineHeight(line, 0); }\n      addMarkedSpan(line, new MarkedSpan(marker,\n                                         curLine == from.line ? from.ch : null,\n                                         curLine == to.line ? to.ch : null), doc.cm && doc.cm.curOp);\n      ++curLine;\n    });\n    // lineIsHidden depends on the presence of the spans, so needs a second pass\n    if (marker.collapsed) { doc.iter(from.line, to.line + 1, function (line) {\n      if (lineIsHidden(doc, line)) { updateLineHeight(line, 0); }\n    }); }\n\n    if (marker.clearOnEnter) { on(marker, \"beforeCursorEnter\", function () { return marker.clear(); }); }\n\n    if (marker.readOnly) {\n      seeReadOnlySpans();\n      if (doc.history.done.length || doc.history.undone.length)\n        { doc.clearHistory(); }\n    }\n    if (marker.collapsed) {\n      marker.id = ++nextMarkerId;\n      marker.atomic = true;\n    }\n    if (cm) {\n      // Sync editor state\n      if (updateMaxLine) { cm.curOp.updateMaxLine = true; }\n      if (marker.collapsed)\n        { regChange(cm, from.line, to.line + 1); }\n      else if (marker.className || marker.startStyle || marker.endStyle || marker.css ||\n               marker.attributes || marker.title)\n        { for (var i = from.line; i <= to.line; i++) { regLineChange(cm, i, \"text\"); } }\n      if (marker.atomic) { reCheckSelection(cm.doc); }\n      signalLater(cm, \"markerAdded\", cm, marker);\n    }\n    return marker\n  }\n\n  // SHARED TEXTMARKERS\n\n  // A shared marker spans multiple linked documents. It is\n  // implemented as a meta-marker-object controlling multiple normal\n  // markers.\n  var SharedTextMarker = function(markers, primary) {\n    this.markers = markers;\n    this.primary = primary;\n    for (var i = 0; i < markers.length; ++i)\n      { markers[i].parent = this; }\n  };\n\n  SharedTextMarker.prototype.clear = function () {\n    if (this.explicitlyCleared) { return }\n    this.explicitlyCleared = true;\n    for (var i = 0; i < this.markers.length; ++i)\n      { this.markers[i].clear(); }\n    signalLater(this, \"clear\");\n  };\n\n  SharedTextMarker.prototype.find = function (side, lineObj) {\n    return this.primary.find(side, lineObj)\n  };\n  eventMixin(SharedTextMarker);\n\n  function markTextShared(doc, from, to, options, type) {\n    options = copyObj(options);\n    options.shared = false;\n    var markers = [markText(doc, from, to, options, type)], primary = markers[0];\n    var widget = options.widgetNode;\n    linkedDocs(doc, function (doc) {\n      if (widget) { options.widgetNode = widget.cloneNode(true); }\n      markers.push(markText(doc, clipPos(doc, from), clipPos(doc, to), options, type));\n      for (var i = 0; i < doc.linked.length; ++i)\n        { if (doc.linked[i].isParent) { return } }\n      primary = lst(markers);\n    });\n    return new SharedTextMarker(markers, primary)\n  }\n\n  function findSharedMarkers(doc) {\n    return doc.findMarks(Pos(doc.first, 0), doc.clipPos(Pos(doc.lastLine())), function (m) { return m.parent; })\n  }\n\n  function copySharedMarkers(doc, markers) {\n    for (var i = 0; i < markers.length; i++) {\n      var marker = markers[i], pos = marker.find();\n      var mFrom = doc.clipPos(pos.from), mTo = doc.clipPos(pos.to);\n      if (cmp(mFrom, mTo)) {\n        var subMark = markText(doc, mFrom, mTo, marker.primary, marker.primary.type);\n        marker.markers.push(subMark);\n        subMark.parent = marker;\n      }\n    }\n  }\n\n  function detachSharedMarkers(markers) {\n    var loop = function ( i ) {\n      var marker = markers[i], linked = [marker.primary.doc];\n      linkedDocs(marker.primary.doc, function (d) { return linked.push(d); });\n      for (var j = 0; j < marker.markers.length; j++) {\n        var subMarker = marker.markers[j];\n        if (indexOf(linked, subMarker.doc) == -1) {\n          subMarker.parent = null;\n          marker.markers.splice(j--, 1);\n        }\n      }\n    };\n\n    for (var i = 0; i < markers.length; i++) loop( i );\n  }\n\n  var nextDocId = 0;\n  var Doc = function(text, mode, firstLine, lineSep, direction) {\n    if (!(this instanceof Doc)) { return new Doc(text, mode, firstLine, lineSep, direction) }\n    if (firstLine == null) { firstLine = 0; }\n\n    BranchChunk.call(this, [new LeafChunk([new Line(\"\", null)])]);\n    this.first = firstLine;\n    this.scrollTop = this.scrollLeft = 0;\n    this.cantEdit = false;\n    this.cleanGeneration = 1;\n    this.modeFrontier = this.highlightFrontier = firstLine;\n    var start = Pos(firstLine, 0);\n    this.sel = simpleSelection(start);\n    this.history = new History(null);\n    this.id = ++nextDocId;\n    this.modeOption = mode;\n    this.lineSep = lineSep;\n    this.direction = (direction == \"rtl\") ? \"rtl\" : \"ltr\";\n    this.extend = false;\n\n    if (typeof text == \"string\") { text = this.splitLines(text); }\n    updateDoc(this, {from: start, to: start, text: text});\n    setSelection(this, simpleSelection(start), sel_dontScroll);\n  };\n\n  Doc.prototype = createObj(BranchChunk.prototype, {\n    constructor: Doc,\n    // Iterate over the document. Supports two forms -- with only one\n    // argument, it calls that for each line in the document. With\n    // three, it iterates over the range given by the first two (with\n    // the second being non-inclusive).\n    iter: function(from, to, op) {\n      if (op) { this.iterN(from - this.first, to - from, op); }\n      else { this.iterN(this.first, this.first + this.size, from); }\n    },\n\n    // Non-public interface for adding and removing lines.\n    insert: function(at, lines) {\n      var height = 0;\n      for (var i = 0; i < lines.length; ++i) { height += lines[i].height; }\n      this.insertInner(at - this.first, lines, height);\n    },\n    remove: function(at, n) { this.removeInner(at - this.first, n); },\n\n    // From here, the methods are part of the public interface. Most\n    // are also available from CodeMirror (editor) instances.\n\n    getValue: function(lineSep) {\n      var lines = getLines(this, this.first, this.first + this.size);\n      if (lineSep === false) { return lines }\n      return lines.join(lineSep || this.lineSeparator())\n    },\n    setValue: docMethodOp(function(code) {\n      var top = Pos(this.first, 0), last = this.first + this.size - 1;\n      makeChange(this, {from: top, to: Pos(last, getLine(this, last).text.length),\n                        text: this.splitLines(code), origin: \"setValue\", full: true}, true);\n      if (this.cm) { scrollToCoords(this.cm, 0, 0); }\n      setSelection(this, simpleSelection(top), sel_dontScroll);\n    }),\n    replaceRange: function(code, from, to, origin) {\n      from = clipPos(this, from);\n      to = to ? clipPos(this, to) : from;\n      replaceRange(this, code, from, to, origin);\n    },\n    getRange: function(from, to, lineSep) {\n      var lines = getBetween(this, clipPos(this, from), clipPos(this, to));\n      if (lineSep === false) { return lines }\n      if (lineSep === '') { return lines.join('') }\n      return lines.join(lineSep || this.lineSeparator())\n    },\n\n    getLine: function(line) {var l = this.getLineHandle(line); return l && l.text},\n\n    getLineHandle: function(line) {if (isLine(this, line)) { return getLine(this, line) }},\n    getLineNumber: function(line) {return lineNo(line)},\n\n    getLineHandleVisualStart: function(line) {\n      if (typeof line == \"number\") { line = getLine(this, line); }\n      return visualLine(line)\n    },\n\n    lineCount: function() {return this.size},\n    firstLine: function() {return this.first},\n    lastLine: function() {return this.first + this.size - 1},\n\n    clipPos: function(pos) {return clipPos(this, pos)},\n\n    getCursor: function(start) {\n      var range = this.sel.primary(), pos;\n      if (start == null || start == \"head\") { pos = range.head; }\n      else if (start == \"anchor\") { pos = range.anchor; }\n      else if (start == \"end\" || start == \"to\" || start === false) { pos = range.to(); }\n      else { pos = range.from(); }\n      return pos\n    },\n    listSelections: function() { return this.sel.ranges },\n    somethingSelected: function() {return this.sel.somethingSelected()},\n\n    setCursor: docMethodOp(function(line, ch, options) {\n      setSimpleSelection(this, clipPos(this, typeof line == \"number\" ? Pos(line, ch || 0) : line), null, options);\n    }),\n    setSelection: docMethodOp(function(anchor, head, options) {\n      setSimpleSelection(this, clipPos(this, anchor), clipPos(this, head || anchor), options);\n    }),\n    extendSelection: docMethodOp(function(head, other, options) {\n      extendSelection(this, clipPos(this, head), other && clipPos(this, other), options);\n    }),\n    extendSelections: docMethodOp(function(heads, options) {\n      extendSelections(this, clipPosArray(this, heads), options);\n    }),\n    extendSelectionsBy: docMethodOp(function(f, options) {\n      var heads = map(this.sel.ranges, f);\n      extendSelections(this, clipPosArray(this, heads), options);\n    }),\n    setSelections: docMethodOp(function(ranges, primary, options) {\n      if (!ranges.length) { return }\n      var out = [];\n      for (var i = 0; i < ranges.length; i++)\n        { out[i] = new Range(clipPos(this, ranges[i].anchor),\n                           clipPos(this, ranges[i].head || ranges[i].anchor)); }\n      if (primary == null) { primary = Math.min(ranges.length - 1, this.sel.primIndex); }\n      setSelection(this, normalizeSelection(this.cm, out, primary), options);\n    }),\n    addSelection: docMethodOp(function(anchor, head, options) {\n      var ranges = this.sel.ranges.slice(0);\n      ranges.push(new Range(clipPos(this, anchor), clipPos(this, head || anchor)));\n      setSelection(this, normalizeSelection(this.cm, ranges, ranges.length - 1), options);\n    }),\n\n    getSelection: function(lineSep) {\n      var ranges = this.sel.ranges, lines;\n      for (var i = 0; i < ranges.length; i++) {\n        var sel = getBetween(this, ranges[i].from(), ranges[i].to());\n        lines = lines ? lines.concat(sel) : sel;\n      }\n      if (lineSep === false) { return lines }\n      else { return lines.join(lineSep || this.lineSeparator()) }\n    },\n    getSelections: function(lineSep) {\n      var parts = [], ranges = this.sel.ranges;\n      for (var i = 0; i < ranges.length; i++) {\n        var sel = getBetween(this, ranges[i].from(), ranges[i].to());\n        if (lineSep !== false) { sel = sel.join(lineSep || this.lineSeparator()); }\n        parts[i] = sel;\n      }\n      return parts\n    },\n    replaceSelection: function(code, collapse, origin) {\n      var dup = [];\n      for (var i = 0; i < this.sel.ranges.length; i++)\n        { dup[i] = code; }\n      this.replaceSelections(dup, collapse, origin || \"+input\");\n    },\n    replaceSelections: docMethodOp(function(code, collapse, origin) {\n      var changes = [], sel = this.sel;\n      for (var i = 0; i < sel.ranges.length; i++) {\n        var range = sel.ranges[i];\n        changes[i] = {from: range.from(), to: range.to(), text: this.splitLines(code[i]), origin: origin};\n      }\n      var newSel = collapse && collapse != \"end\" && computeReplacedSel(this, changes, collapse);\n      for (var i$1 = changes.length - 1; i$1 >= 0; i$1--)\n        { makeChange(this, changes[i$1]); }\n      if (newSel) { setSelectionReplaceHistory(this, newSel); }\n      else if (this.cm) { ensureCursorVisible(this.cm); }\n    }),\n    undo: docMethodOp(function() {makeChangeFromHistory(this, \"undo\");}),\n    redo: docMethodOp(function() {makeChangeFromHistory(this, \"redo\");}),\n    undoSelection: docMethodOp(function() {makeChangeFromHistory(this, \"undo\", true);}),\n    redoSelection: docMethodOp(function() {makeChangeFromHistory(this, \"redo\", true);}),\n\n    setExtending: function(val) {this.extend = val;},\n    getExtending: function() {return this.extend},\n\n    historySize: function() {\n      var hist = this.history, done = 0, undone = 0;\n      for (var i = 0; i < hist.done.length; i++) { if (!hist.done[i].ranges) { ++done; } }\n      for (var i$1 = 0; i$1 < hist.undone.length; i$1++) { if (!hist.undone[i$1].ranges) { ++undone; } }\n      return {undo: done, redo: undone}\n    },\n    clearHistory: function() {\n      var this$1 = this;\n\n      this.history = new History(this.history);\n      linkedDocs(this, function (doc) { return doc.history = this$1.history; }, true);\n    },\n\n    markClean: function() {\n      this.cleanGeneration = this.changeGeneration(true);\n    },\n    changeGeneration: function(forceSplit) {\n      if (forceSplit)\n        { this.history.lastOp = this.history.lastSelOp = this.history.lastOrigin = null; }\n      return this.history.generation\n    },\n    isClean: function (gen) {\n      return this.history.generation == (gen || this.cleanGeneration)\n    },\n\n    getHistory: function() {\n      return {done: copyHistoryArray(this.history.done),\n              undone: copyHistoryArray(this.history.undone)}\n    },\n    setHistory: function(histData) {\n      var hist = this.history = new History(this.history);\n      hist.done = copyHistoryArray(histData.done.slice(0), null, true);\n      hist.undone = copyHistoryArray(histData.undone.slice(0), null, true);\n    },\n\n    setGutterMarker: docMethodOp(function(line, gutterID, value) {\n      return changeLine(this, line, \"gutter\", function (line) {\n        var markers = line.gutterMarkers || (line.gutterMarkers = {});\n        markers[gutterID] = value;\n        if (!value && isEmpty(markers)) { line.gutterMarkers = null; }\n        return true\n      })\n    }),\n\n    clearGutter: docMethodOp(function(gutterID) {\n      var this$1 = this;\n\n      this.iter(function (line) {\n        if (line.gutterMarkers && line.gutterMarkers[gutterID]) {\n          changeLine(this$1, line, \"gutter\", function () {\n            line.gutterMarkers[gutterID] = null;\n            if (isEmpty(line.gutterMarkers)) { line.gutterMarkers = null; }\n            return true\n          });\n        }\n      });\n    }),\n\n    lineInfo: function(line) {\n      var n;\n      if (typeof line == \"number\") {\n        if (!isLine(this, line)) { return null }\n        n = line;\n        line = getLine(this, line);\n        if (!line) { return null }\n      } else {\n        n = lineNo(line);\n        if (n == null) { return null }\n      }\n      return {line: n, handle: line, text: line.text, gutterMarkers: line.gutterMarkers,\n              textClass: line.textClass, bgClass: line.bgClass, wrapClass: line.wrapClass,\n              widgets: line.widgets}\n    },\n\n    addLineClass: docMethodOp(function(handle, where, cls) {\n      return changeLine(this, handle, where == \"gutter\" ? \"gutter\" : \"class\", function (line) {\n        var prop = where == \"text\" ? \"textClass\"\n                 : where == \"background\" ? \"bgClass\"\n                 : where == \"gutter\" ? \"gutterClass\" : \"wrapClass\";\n        if (!line[prop]) { line[prop] = cls; }\n        else if (classTest(cls).test(line[prop])) { return false }\n        else { line[prop] += \" \" + cls; }\n        return true\n      })\n    }),\n    removeLineClass: docMethodOp(function(handle, where, cls) {\n      return changeLine(this, handle, where == \"gutter\" ? \"gutter\" : \"class\", function (line) {\n        var prop = where == \"text\" ? \"textClass\"\n                 : where == \"background\" ? \"bgClass\"\n                 : where == \"gutter\" ? \"gutterClass\" : \"wrapClass\";\n        var cur = line[prop];\n        if (!cur) { return false }\n        else if (cls == null) { line[prop] = null; }\n        else {\n          var found = cur.match(classTest(cls));\n          if (!found) { return false }\n          var end = found.index + found[0].length;\n          line[prop] = cur.slice(0, found.index) + (!found.index || end == cur.length ? \"\" : \" \") + cur.slice(end) || null;\n        }\n        return true\n      })\n    }),\n\n    addLineWidget: docMethodOp(function(handle, node, options) {\n      return addLineWidget(this, handle, node, options)\n    }),\n    removeLineWidget: function(widget) { widget.clear(); },\n\n    markText: function(from, to, options) {\n      return markText(this, clipPos(this, from), clipPos(this, to), options, options && options.type || \"range\")\n    },\n    setBookmark: function(pos, options) {\n      var realOpts = {replacedWith: options && (options.nodeType == null ? options.widget : options),\n                      insertLeft: options && options.insertLeft,\n                      clearWhenEmpty: false, shared: options && options.shared,\n                      handleMouseEvents: options && options.handleMouseEvents};\n      pos = clipPos(this, pos);\n      return markText(this, pos, pos, realOpts, \"bookmark\")\n    },\n    findMarksAt: function(pos) {\n      pos = clipPos(this, pos);\n      var markers = [], spans = getLine(this, pos.line).markedSpans;\n      if (spans) { for (var i = 0; i < spans.length; ++i) {\n        var span = spans[i];\n        if ((span.from == null || span.from <= pos.ch) &&\n            (span.to == null || span.to >= pos.ch))\n          { markers.push(span.marker.parent || span.marker); }\n      } }\n      return markers\n    },\n    findMarks: function(from, to, filter) {\n      from = clipPos(this, from); to = clipPos(this, to);\n      var found = [], lineNo = from.line;\n      this.iter(from.line, to.line + 1, function (line) {\n        var spans = line.markedSpans;\n        if (spans) { for (var i = 0; i < spans.length; i++) {\n          var span = spans[i];\n          if (!(span.to != null && lineNo == from.line && from.ch >= span.to ||\n                span.from == null && lineNo != from.line ||\n                span.from != null && lineNo == to.line && span.from >= to.ch) &&\n              (!filter || filter(span.marker)))\n            { found.push(span.marker.parent || span.marker); }\n        } }\n        ++lineNo;\n      });\n      return found\n    },\n    getAllMarks: function() {\n      var markers = [];\n      this.iter(function (line) {\n        var sps = line.markedSpans;\n        if (sps) { for (var i = 0; i < sps.length; ++i)\n          { if (sps[i].from != null) { markers.push(sps[i].marker); } } }\n      });\n      return markers\n    },\n\n    posFromIndex: function(off) {\n      var ch, lineNo = this.first, sepSize = this.lineSeparator().length;\n      this.iter(function (line) {\n        var sz = line.text.length + sepSize;\n        if (sz > off) { ch = off; return true }\n        off -= sz;\n        ++lineNo;\n      });\n      return clipPos(this, Pos(lineNo, ch))\n    },\n    indexFromPos: function (coords) {\n      coords = clipPos(this, coords);\n      var index = coords.ch;\n      if (coords.line < this.first || coords.ch < 0) { return 0 }\n      var sepSize = this.lineSeparator().length;\n      this.iter(this.first, coords.line, function (line) { // iter aborts when callback returns a truthy value\n        index += line.text.length + sepSize;\n      });\n      return index\n    },\n\n    copy: function(copyHistory) {\n      var doc = new Doc(getLines(this, this.first, this.first + this.size),\n                        this.modeOption, this.first, this.lineSep, this.direction);\n      doc.scrollTop = this.scrollTop; doc.scrollLeft = this.scrollLeft;\n      doc.sel = this.sel;\n      doc.extend = false;\n      if (copyHistory) {\n        doc.history.undoDepth = this.history.undoDepth;\n        doc.setHistory(this.getHistory());\n      }\n      return doc\n    },\n\n    linkedDoc: function(options) {\n      if (!options) { options = {}; }\n      var from = this.first, to = this.first + this.size;\n      if (options.from != null && options.from > from) { from = options.from; }\n      if (options.to != null && options.to < to) { to = options.to; }\n      var copy = new Doc(getLines(this, from, to), options.mode || this.modeOption, from, this.lineSep, this.direction);\n      if (options.sharedHist) { copy.history = this.history\n      ; }(this.linked || (this.linked = [])).push({doc: copy, sharedHist: options.sharedHist});\n      copy.linked = [{doc: this, isParent: true, sharedHist: options.sharedHist}];\n      copySharedMarkers(copy, findSharedMarkers(this));\n      return copy\n    },\n    unlinkDoc: function(other) {\n      if (other instanceof CodeMirror) { other = other.doc; }\n      if (this.linked) { for (var i = 0; i < this.linked.length; ++i) {\n        var link = this.linked[i];\n        if (link.doc != other) { continue }\n        this.linked.splice(i, 1);\n        other.unlinkDoc(this);\n        detachSharedMarkers(findSharedMarkers(this));\n        break\n      } }\n      // If the histories were shared, split them again\n      if (other.history == this.history) {\n        var splitIds = [other.id];\n        linkedDocs(other, function (doc) { return splitIds.push(doc.id); }, true);\n        other.history = new History(null);\n        other.history.done = copyHistoryArray(this.history.done, splitIds);\n        other.history.undone = copyHistoryArray(this.history.undone, splitIds);\n      }\n    },\n    iterLinkedDocs: function(f) {linkedDocs(this, f);},\n\n    getMode: function() {return this.mode},\n    getEditor: function() {return this.cm},\n\n    splitLines: function(str) {\n      if (this.lineSep) { return str.split(this.lineSep) }\n      return splitLinesAuto(str)\n    },\n    lineSeparator: function() { return this.lineSep || \"\\n\" },\n\n    setDirection: docMethodOp(function (dir) {\n      if (dir != \"rtl\") { dir = \"ltr\"; }\n      if (dir == this.direction) { return }\n      this.direction = dir;\n      this.iter(function (line) { return line.order = null; });\n      if (this.cm) { directionChanged(this.cm); }\n    })\n  });\n\n  // Public alias.\n  Doc.prototype.eachLine = Doc.prototype.iter;\n\n  // Kludge to work around strange IE behavior where it'll sometimes\n  // re-fire a series of drag-related events right after the drop (#1551)\n  var lastDrop = 0;\n\n  function onDrop(e) {\n    var cm = this;\n    clearDragCursor(cm);\n    if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e))\n      { return }\n    e_preventDefault(e);\n    if (ie) { lastDrop = +new Date; }\n    var pos = posFromMouse(cm, e, true), files = e.dataTransfer.files;\n    if (!pos || cm.isReadOnly()) { return }\n    // Might be a file drop, in which case we simply extract the text\n    // and insert it.\n    if (files && files.length && window.FileReader && window.File) {\n      var n = files.length, text = Array(n), read = 0;\n      var markAsReadAndPasteIfAllFilesAreRead = function () {\n        if (++read == n) {\n          operation(cm, function () {\n            pos = clipPos(cm.doc, pos);\n            var change = {from: pos, to: pos,\n                          text: cm.doc.splitLines(\n                              text.filter(function (t) { return t != null; }).join(cm.doc.lineSeparator())),\n                          origin: \"paste\"};\n            makeChange(cm.doc, change);\n            setSelectionReplaceHistory(cm.doc, simpleSelection(clipPos(cm.doc, pos), clipPos(cm.doc, changeEnd(change))));\n          })();\n        }\n      };\n      var readTextFromFile = function (file, i) {\n        if (cm.options.allowDropFileTypes &&\n            indexOf(cm.options.allowDropFileTypes, file.type) == -1) {\n          markAsReadAndPasteIfAllFilesAreRead();\n          return\n        }\n        var reader = new FileReader;\n        reader.onerror = function () { return markAsReadAndPasteIfAllFilesAreRead(); };\n        reader.onload = function () {\n          var content = reader.result;\n          if (/[\\x00-\\x08\\x0e-\\x1f]{2}/.test(content)) {\n            markAsReadAndPasteIfAllFilesAreRead();\n            return\n          }\n          text[i] = content;\n          markAsReadAndPasteIfAllFilesAreRead();\n        };\n        reader.readAsText(file);\n      };\n      for (var i = 0; i < files.length; i++) { readTextFromFile(files[i], i); }\n    } else { // Normal drop\n      // Don't do a replace if the drop happened inside of the selected text.\n      if (cm.state.draggingText && cm.doc.sel.contains(pos) > -1) {\n        cm.state.draggingText(e);\n        // Ensure the editor is re-focused\n        setTimeout(function () { return cm.display.input.focus(); }, 20);\n        return\n      }\n      try {\n        var text$1 = e.dataTransfer.getData(\"Text\");\n        if (text$1) {\n          var selected;\n          if (cm.state.draggingText && !cm.state.draggingText.copy)\n            { selected = cm.listSelections(); }\n          setSelectionNoUndo(cm.doc, simpleSelection(pos, pos));\n          if (selected) { for (var i$1 = 0; i$1 < selected.length; ++i$1)\n            { replaceRange(cm.doc, \"\", selected[i$1].anchor, selected[i$1].head, \"drag\"); } }\n          cm.replaceSelection(text$1, \"around\", \"paste\");\n          cm.display.input.focus();\n        }\n      }\n      catch(e$1){}\n    }\n  }\n\n  function onDragStart(cm, e) {\n    if (ie && (!cm.state.draggingText || +new Date - lastDrop < 100)) { e_stop(e); return }\n    if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) { return }\n\n    e.dataTransfer.setData(\"Text\", cm.getSelection());\n    e.dataTransfer.effectAllowed = \"copyMove\";\n\n    // Use dummy image instead of default browsers image.\n    // Recent Safari (~6.0.2) have a tendency to segfault when this happens, so we don't do it there.\n    if (e.dataTransfer.setDragImage && !safari) {\n      var img = elt(\"img\", null, null, \"position: fixed; left: 0; top: 0;\");\n      img.src = \"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\";\n      if (presto) {\n        img.width = img.height = 1;\n        cm.display.wrapper.appendChild(img);\n        // Force a relayout, or Opera won't use our image for some obscure reason\n        img._top = img.offsetTop;\n      }\n      e.dataTransfer.setDragImage(img, 0, 0);\n      if (presto) { img.parentNode.removeChild(img); }\n    }\n  }\n\n  function onDragOver(cm, e) {\n    var pos = posFromMouse(cm, e);\n    if (!pos) { return }\n    var frag = document.createDocumentFragment();\n    drawSelectionCursor(cm, pos, frag);\n    if (!cm.display.dragCursor) {\n      cm.display.dragCursor = elt(\"div\", null, \"CodeMirror-cursors CodeMirror-dragcursors\");\n      cm.display.lineSpace.insertBefore(cm.display.dragCursor, cm.display.cursorDiv);\n    }\n    removeChildrenAndAdd(cm.display.dragCursor, frag);\n  }\n\n  function clearDragCursor(cm) {\n    if (cm.display.dragCursor) {\n      cm.display.lineSpace.removeChild(cm.display.dragCursor);\n      cm.display.dragCursor = null;\n    }\n  }\n\n  // These must be handled carefully, because naively registering a\n  // handler for each editor will cause the editors to never be\n  // garbage collected.\n\n  function forEachCodeMirror(f) {\n    if (!document.getElementsByClassName) { return }\n    var byClass = document.getElementsByClassName(\"CodeMirror\"), editors = [];\n    for (var i = 0; i < byClass.length; i++) {\n      var cm = byClass[i].CodeMirror;\n      if (cm) { editors.push(cm); }\n    }\n    if (editors.length) { editors[0].operation(function () {\n      for (var i = 0; i < editors.length; i++) { f(editors[i]); }\n    }); }\n  }\n\n  var globalsRegistered = false;\n  function ensureGlobalHandlers() {\n    if (globalsRegistered) { return }\n    registerGlobalHandlers();\n    globalsRegistered = true;\n  }\n  function registerGlobalHandlers() {\n    // When the window resizes, we need to refresh active editors.\n    var resizeTimer;\n    on(window, \"resize\", function () {\n      if (resizeTimer == null) { resizeTimer = setTimeout(function () {\n        resizeTimer = null;\n        forEachCodeMirror(onResize);\n      }, 100); }\n    });\n    // When the window loses focus, we want to show the editor as blurred\n    on(window, \"blur\", function () { return forEachCodeMirror(onBlur); });\n  }\n  // Called when the window resizes\n  function onResize(cm) {\n    var d = cm.display;\n    // Might be a text scaling operation, clear size caches.\n    d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null;\n    d.scrollbarsClipped = false;\n    cm.setSize();\n  }\n\n  var keyNames = {\n    3: \"Pause\", 8: \"Backspace\", 9: \"Tab\", 13: \"Enter\", 16: \"Shift\", 17: \"Ctrl\", 18: \"Alt\",\n    19: \"Pause\", 20: \"CapsLock\", 27: \"Esc\", 32: \"Space\", 33: \"PageUp\", 34: \"PageDown\", 35: \"End\",\n    36: \"Home\", 37: \"Left\", 38: \"Up\", 39: \"Right\", 40: \"Down\", 44: \"PrintScrn\", 45: \"Insert\",\n    46: \"Delete\", 59: \";\", 61: \"=\", 91: \"Mod\", 92: \"Mod\", 93: \"Mod\",\n    106: \"*\", 107: \"=\", 109: \"-\", 110: \".\", 111: \"/\", 145: \"ScrollLock\",\n    173: \"-\", 186: \";\", 187: \"=\", 188: \",\", 189: \"-\", 190: \".\", 191: \"/\", 192: \"`\", 219: \"[\", 220: \"\\\\\",\n    221: \"]\", 222: \"'\", 224: \"Mod\", 63232: \"Up\", 63233: \"Down\", 63234: \"Left\", 63235: \"Right\", 63272: \"Delete\",\n    63273: \"Home\", 63275: \"End\", 63276: \"PageUp\", 63277: \"PageDown\", 63302: \"Insert\"\n  };\n\n  // Number keys\n  for (var i = 0; i < 10; i++) { keyNames[i + 48] = keyNames[i + 96] = String(i); }\n  // Alphabetic keys\n  for (var i$1 = 65; i$1 <= 90; i$1++) { keyNames[i$1] = String.fromCharCode(i$1); }\n  // Function keys\n  for (var i$2 = 1; i$2 <= 12; i$2++) { keyNames[i$2 + 111] = keyNames[i$2 + 63235] = \"F\" + i$2; }\n\n  var keyMap = {};\n\n  keyMap.basic = {\n    \"Left\": \"goCharLeft\", \"Right\": \"goCharRight\", \"Up\": \"goLineUp\", \"Down\": \"goLineDown\",\n    \"End\": \"goLineEnd\", \"Home\": \"goLineStartSmart\", \"PageUp\": \"goPageUp\", \"PageDown\": \"goPageDown\",\n    \"Delete\": \"delCharAfter\", \"Backspace\": \"delCharBefore\", \"Shift-Backspace\": \"delCharBefore\",\n    \"Tab\": \"defaultTab\", \"Shift-Tab\": \"indentAuto\",\n    \"Enter\": \"newlineAndIndent\", \"Insert\": \"toggleOverwrite\",\n    \"Esc\": \"singleSelection\"\n  };\n  // Note that the save and find-related commands aren't defined by\n  // default. User code or addons can define them. Unknown commands\n  // are simply ignored.\n  keyMap.pcDefault = {\n    \"Ctrl-A\": \"selectAll\", \"Ctrl-D\": \"deleteLine\", \"Ctrl-Z\": \"undo\", \"Shift-Ctrl-Z\": \"redo\", \"Ctrl-Y\": \"redo\",\n    \"Ctrl-Home\": \"goDocStart\", \"Ctrl-End\": \"goDocEnd\", \"Ctrl-Up\": \"goLineUp\", \"Ctrl-Down\": \"goLineDown\",\n    \"Ctrl-Left\": \"goGroupLeft\", \"Ctrl-Right\": \"goGroupRight\", \"Alt-Left\": \"goLineStart\", \"Alt-Right\": \"goLineEnd\",\n    \"Ctrl-Backspace\": \"delGroupBefore\", \"Ctrl-Delete\": \"delGroupAfter\", \"Ctrl-S\": \"save\", \"Ctrl-F\": \"find\",\n    \"Ctrl-G\": \"findNext\", \"Shift-Ctrl-G\": \"findPrev\", \"Shift-Ctrl-F\": \"replace\", \"Shift-Ctrl-R\": \"replaceAll\",\n    \"Ctrl-[\": \"indentLess\", \"Ctrl-]\": \"indentMore\",\n    \"Ctrl-U\": \"undoSelection\", \"Shift-Ctrl-U\": \"redoSelection\", \"Alt-U\": \"redoSelection\",\n    \"fallthrough\": \"basic\"\n  };\n  // Very basic readline/emacs-style bindings, which are standard on Mac.\n  keyMap.emacsy = {\n    \"Ctrl-F\": \"goCharRight\", \"Ctrl-B\": \"goCharLeft\", \"Ctrl-P\": \"goLineUp\", \"Ctrl-N\": \"goLineDown\",\n    \"Ctrl-A\": \"goLineStart\", \"Ctrl-E\": \"goLineEnd\", \"Ctrl-V\": \"goPageDown\", \"Shift-Ctrl-V\": \"goPageUp\",\n    \"Ctrl-D\": \"delCharAfter\", \"Ctrl-H\": \"delCharBefore\", \"Alt-Backspace\": \"delWordBefore\", \"Ctrl-K\": \"killLine\",\n    \"Ctrl-T\": \"transposeChars\", \"Ctrl-O\": \"openLine\"\n  };\n  keyMap.macDefault = {\n    \"Cmd-A\": \"selectAll\", \"Cmd-D\": \"deleteLine\", \"Cmd-Z\": \"undo\", \"Shift-Cmd-Z\": \"redo\", \"Cmd-Y\": \"redo\",\n    \"Cmd-Home\": \"goDocStart\", \"Cmd-Up\": \"goDocStart\", \"Cmd-End\": \"goDocEnd\", \"Cmd-Down\": \"goDocEnd\", \"Alt-Left\": \"goGroupLeft\",\n    \"Alt-Right\": \"goGroupRight\", \"Cmd-Left\": \"goLineLeft\", \"Cmd-Right\": \"goLineRight\", \"Alt-Backspace\": \"delGroupBefore\",\n    \"Ctrl-Alt-Backspace\": \"delGroupAfter\", \"Alt-Delete\": \"delGroupAfter\", \"Cmd-S\": \"save\", \"Cmd-F\": \"find\",\n    \"Cmd-G\": \"findNext\", \"Shift-Cmd-G\": \"findPrev\", \"Cmd-Alt-F\": \"replace\", \"Shift-Cmd-Alt-F\": \"replaceAll\",\n    \"Cmd-[\": \"indentLess\", \"Cmd-]\": \"indentMore\", \"Cmd-Backspace\": \"delWrappedLineLeft\", \"Cmd-Delete\": \"delWrappedLineRight\",\n    \"Cmd-U\": \"undoSelection\", \"Shift-Cmd-U\": \"redoSelection\", \"Ctrl-Up\": \"goDocStart\", \"Ctrl-Down\": \"goDocEnd\",\n    \"fallthrough\": [\"basic\", \"emacsy\"]\n  };\n  keyMap[\"default\"] = mac ? keyMap.macDefault : keyMap.pcDefault;\n\n  // KEYMAP DISPATCH\n\n  function normalizeKeyName(name) {\n    var parts = name.split(/-(?!$)/);\n    name = parts[parts.length - 1];\n    var alt, ctrl, shift, cmd;\n    for (var i = 0; i < parts.length - 1; i++) {\n      var mod = parts[i];\n      if (/^(cmd|meta|m)$/i.test(mod)) { cmd = true; }\n      else if (/^a(lt)?$/i.test(mod)) { alt = true; }\n      else if (/^(c|ctrl|control)$/i.test(mod)) { ctrl = true; }\n      else if (/^s(hift)?$/i.test(mod)) { shift = true; }\n      else { throw new Error(\"Unrecognized modifier name: \" + mod) }\n    }\n    if (alt) { name = \"Alt-\" + name; }\n    if (ctrl) { name = \"Ctrl-\" + name; }\n    if (cmd) { name = \"Cmd-\" + name; }\n    if (shift) { name = \"Shift-\" + name; }\n    return name\n  }\n\n  // This is a kludge to keep keymaps mostly working as raw objects\n  // (backwards compatibility) while at the same time support features\n  // like normalization and multi-stroke key bindings. It compiles a\n  // new normalized keymap, and then updates the old object to reflect\n  // this.\n  function normalizeKeyMap(keymap) {\n    var copy = {};\n    for (var keyname in keymap) { if (keymap.hasOwnProperty(keyname)) {\n      var value = keymap[keyname];\n      if (/^(name|fallthrough|(de|at)tach)$/.test(keyname)) { continue }\n      if (value == \"...\") { delete keymap[keyname]; continue }\n\n      var keys = map(keyname.split(\" \"), normalizeKeyName);\n      for (var i = 0; i < keys.length; i++) {\n        var val = (void 0), name = (void 0);\n        if (i == keys.length - 1) {\n          name = keys.join(\" \");\n          val = value;\n        } else {\n          name = keys.slice(0, i + 1).join(\" \");\n          val = \"...\";\n        }\n        var prev = copy[name];\n        if (!prev) { copy[name] = val; }\n        else if (prev != val) { throw new Error(\"Inconsistent bindings for \" + name) }\n      }\n      delete keymap[keyname];\n    } }\n    for (var prop in copy) { keymap[prop] = copy[prop]; }\n    return keymap\n  }\n\n  function lookupKey(key, map, handle, context) {\n    map = getKeyMap(map);\n    var found = map.call ? map.call(key, context) : map[key];\n    if (found === false) { return \"nothing\" }\n    if (found === \"...\") { return \"multi\" }\n    if (found != null && handle(found)) { return \"handled\" }\n\n    if (map.fallthrough) {\n      if (Object.prototype.toString.call(map.fallthrough) != \"[object Array]\")\n        { return lookupKey(key, map.fallthrough, handle, context) }\n      for (var i = 0; i < map.fallthrough.length; i++) {\n        var result = lookupKey(key, map.fallthrough[i], handle, context);\n        if (result) { return result }\n      }\n    }\n  }\n\n  // Modifier key presses don't count as 'real' key presses for the\n  // purpose of keymap fallthrough.\n  function isModifierKey(value) {\n    var name = typeof value == \"string\" ? value : keyNames[value.keyCode];\n    return name == \"Ctrl\" || name == \"Alt\" || name == \"Shift\" || name == \"Mod\"\n  }\n\n  function addModifierNames(name, event, noShift) {\n    var base = name;\n    if (event.altKey && base != \"Alt\") { name = \"Alt-\" + name; }\n    if ((flipCtrlCmd ? event.metaKey : event.ctrlKey) && base != \"Ctrl\") { name = \"Ctrl-\" + name; }\n    if ((flipCtrlCmd ? event.ctrlKey : event.metaKey) && base != \"Mod\") { name = \"Cmd-\" + name; }\n    if (!noShift && event.shiftKey && base != \"Shift\") { name = \"Shift-\" + name; }\n    return name\n  }\n\n  // Look up the name of a key as indicated by an event object.\n  function keyName(event, noShift) {\n    if (presto && event.keyCode == 34 && event[\"char\"]) { return false }\n    var name = keyNames[event.keyCode];\n    if (name == null || event.altGraphKey) { return false }\n    // Ctrl-ScrollLock has keyCode 3, same as Ctrl-Pause,\n    // so we'll use event.code when available (Chrome 48+, FF 38+, Safari 10.1+)\n    if (event.keyCode == 3 && event.code) { name = event.code; }\n    return addModifierNames(name, event, noShift)\n  }\n\n  function getKeyMap(val) {\n    return typeof val == \"string\" ? keyMap[val] : val\n  }\n\n  // Helper for deleting text near the selection(s), used to implement\n  // backspace, delete, and similar functionality.\n  function deleteNearSelection(cm, compute) {\n    var ranges = cm.doc.sel.ranges, kill = [];\n    // Build up a set of ranges to kill first, merging overlapping\n    // ranges.\n    for (var i = 0; i < ranges.length; i++) {\n      var toKill = compute(ranges[i]);\n      while (kill.length && cmp(toKill.from, lst(kill).to) <= 0) {\n        var replaced = kill.pop();\n        if (cmp(replaced.from, toKill.from) < 0) {\n          toKill.from = replaced.from;\n          break\n        }\n      }\n      kill.push(toKill);\n    }\n    // Next, remove those actual ranges.\n    runInOp(cm, function () {\n      for (var i = kill.length - 1; i >= 0; i--)\n        { replaceRange(cm.doc, \"\", kill[i].from, kill[i].to, \"+delete\"); }\n      ensureCursorVisible(cm);\n    });\n  }\n\n  function moveCharLogically(line, ch, dir) {\n    var target = skipExtendingChars(line.text, ch + dir, dir);\n    return target < 0 || target > line.text.length ? null : target\n  }\n\n  function moveLogically(line, start, dir) {\n    var ch = moveCharLogically(line, start.ch, dir);\n    return ch == null ? null : new Pos(start.line, ch, dir < 0 ? \"after\" : \"before\")\n  }\n\n  function endOfLine(visually, cm, lineObj, lineNo, dir) {\n    if (visually) {\n      if (cm.doc.direction == \"rtl\") { dir = -dir; }\n      var order = getOrder(lineObj, cm.doc.direction);\n      if (order) {\n        var part = dir < 0 ? lst(order) : order[0];\n        var moveInStorageOrder = (dir < 0) == (part.level == 1);\n        var sticky = moveInStorageOrder ? \"after\" : \"before\";\n        var ch;\n        // With a wrapped rtl chunk (possibly spanning multiple bidi parts),\n        // it could be that the last bidi part is not on the last visual line,\n        // since visual lines contain content order-consecutive chunks.\n        // Thus, in rtl, we are looking for the first (content-order) character\n        // in the rtl chunk that is on the last line (that is, the same line\n        // as the last (content-order) character).\n        if (part.level > 0 || cm.doc.direction == \"rtl\") {\n          var prep = prepareMeasureForLine(cm, lineObj);\n          ch = dir < 0 ? lineObj.text.length - 1 : 0;\n          var targetTop = measureCharPrepared(cm, prep, ch).top;\n          ch = findFirst(function (ch) { return measureCharPrepared(cm, prep, ch).top == targetTop; }, (dir < 0) == (part.level == 1) ? part.from : part.to - 1, ch);\n          if (sticky == \"before\") { ch = moveCharLogically(lineObj, ch, 1); }\n        } else { ch = dir < 0 ? part.to : part.from; }\n        return new Pos(lineNo, ch, sticky)\n      }\n    }\n    return new Pos(lineNo, dir < 0 ? lineObj.text.length : 0, dir < 0 ? \"before\" : \"after\")\n  }\n\n  function moveVisually(cm, line, start, dir) {\n    var bidi = getOrder(line, cm.doc.direction);\n    if (!bidi) { return moveLogically(line, start, dir) }\n    if (start.ch >= line.text.length) {\n      start.ch = line.text.length;\n      start.sticky = \"before\";\n    } else if (start.ch <= 0) {\n      start.ch = 0;\n      start.sticky = \"after\";\n    }\n    var partPos = getBidiPartAt(bidi, start.ch, start.sticky), part = bidi[partPos];\n    if (cm.doc.direction == \"ltr\" && part.level % 2 == 0 && (dir > 0 ? part.to > start.ch : part.from < start.ch)) {\n      // Case 1: We move within an ltr part in an ltr editor. Even with wrapped lines,\n      // nothing interesting happens.\n      return moveLogically(line, start, dir)\n    }\n\n    var mv = function (pos, dir) { return moveCharLogically(line, pos instanceof Pos ? pos.ch : pos, dir); };\n    var prep;\n    var getWrappedLineExtent = function (ch) {\n      if (!cm.options.lineWrapping) { return {begin: 0, end: line.text.length} }\n      prep = prep || prepareMeasureForLine(cm, line);\n      return wrappedLineExtentChar(cm, line, prep, ch)\n    };\n    var wrappedLineExtent = getWrappedLineExtent(start.sticky == \"before\" ? mv(start, -1) : start.ch);\n\n    if (cm.doc.direction == \"rtl\" || part.level == 1) {\n      var moveInStorageOrder = (part.level == 1) == (dir < 0);\n      var ch = mv(start, moveInStorageOrder ? 1 : -1);\n      if (ch != null && (!moveInStorageOrder ? ch >= part.from && ch >= wrappedLineExtent.begin : ch <= part.to && ch <= wrappedLineExtent.end)) {\n        // Case 2: We move within an rtl part or in an rtl editor on the same visual line\n        var sticky = moveInStorageOrder ? \"before\" : \"after\";\n        return new Pos(start.line, ch, sticky)\n      }\n    }\n\n    // Case 3: Could not move within this bidi part in this visual line, so leave\n    // the current bidi part\n\n    var searchInVisualLine = function (partPos, dir, wrappedLineExtent) {\n      var getRes = function (ch, moveInStorageOrder) { return moveInStorageOrder\n        ? new Pos(start.line, mv(ch, 1), \"before\")\n        : new Pos(start.line, ch, \"after\"); };\n\n      for (; partPos >= 0 && partPos < bidi.length; partPos += dir) {\n        var part = bidi[partPos];\n        var moveInStorageOrder = (dir > 0) == (part.level != 1);\n        var ch = moveInStorageOrder ? wrappedLineExtent.begin : mv(wrappedLineExtent.end, -1);\n        if (part.from <= ch && ch < part.to) { return getRes(ch, moveInStorageOrder) }\n        ch = moveInStorageOrder ? part.from : mv(part.to, -1);\n        if (wrappedLineExtent.begin <= ch && ch < wrappedLineExtent.end) { return getRes(ch, moveInStorageOrder) }\n      }\n    };\n\n    // Case 3a: Look for other bidi parts on the same visual line\n    var res = searchInVisualLine(partPos + dir, dir, wrappedLineExtent);\n    if (res) { return res }\n\n    // Case 3b: Look for other bidi parts on the next visual line\n    var nextCh = dir > 0 ? wrappedLineExtent.end : mv(wrappedLineExtent.begin, -1);\n    if (nextCh != null && !(dir > 0 && nextCh == line.text.length)) {\n      res = searchInVisualLine(dir > 0 ? 0 : bidi.length - 1, dir, getWrappedLineExtent(nextCh));\n      if (res) { return res }\n    }\n\n    // Case 4: Nowhere to move\n    return null\n  }\n\n  // Commands are parameter-less actions that can be performed on an\n  // editor, mostly used for keybindings.\n  var commands = {\n    selectAll: selectAll,\n    singleSelection: function (cm) { return cm.setSelection(cm.getCursor(\"anchor\"), cm.getCursor(\"head\"), sel_dontScroll); },\n    killLine: function (cm) { return deleteNearSelection(cm, function (range) {\n      if (range.empty()) {\n        var len = getLine(cm.doc, range.head.line).text.length;\n        if (range.head.ch == len && range.head.line < cm.lastLine())\n          { return {from: range.head, to: Pos(range.head.line + 1, 0)} }\n        else\n          { return {from: range.head, to: Pos(range.head.line, len)} }\n      } else {\n        return {from: range.from(), to: range.to()}\n      }\n    }); },\n    deleteLine: function (cm) { return deleteNearSelection(cm, function (range) { return ({\n      from: Pos(range.from().line, 0),\n      to: clipPos(cm.doc, Pos(range.to().line + 1, 0))\n    }); }); },\n    delLineLeft: function (cm) { return deleteNearSelection(cm, function (range) { return ({\n      from: Pos(range.from().line, 0), to: range.from()\n    }); }); },\n    delWrappedLineLeft: function (cm) { return deleteNearSelection(cm, function (range) {\n      var top = cm.charCoords(range.head, \"div\").top + 5;\n      var leftPos = cm.coordsChar({left: 0, top: top}, \"div\");\n      return {from: leftPos, to: range.from()}\n    }); },\n    delWrappedLineRight: function (cm) { return deleteNearSelection(cm, function (range) {\n      var top = cm.charCoords(range.head, \"div\").top + 5;\n      var rightPos = cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, \"div\");\n      return {from: range.from(), to: rightPos }\n    }); },\n    undo: function (cm) { return cm.undo(); },\n    redo: function (cm) { return cm.redo(); },\n    undoSelection: function (cm) { return cm.undoSelection(); },\n    redoSelection: function (cm) { return cm.redoSelection(); },\n    goDocStart: function (cm) { return cm.extendSelection(Pos(cm.firstLine(), 0)); },\n    goDocEnd: function (cm) { return cm.extendSelection(Pos(cm.lastLine())); },\n    goLineStart: function (cm) { return cm.extendSelectionsBy(function (range) { return lineStart(cm, range.head.line); },\n      {origin: \"+move\", bias: 1}\n    ); },\n    goLineStartSmart: function (cm) { return cm.extendSelectionsBy(function (range) { return lineStartSmart(cm, range.head); },\n      {origin: \"+move\", bias: 1}\n    ); },\n    goLineEnd: function (cm) { return cm.extendSelectionsBy(function (range) { return lineEnd(cm, range.head.line); },\n      {origin: \"+move\", bias: -1}\n    ); },\n    goLineRight: function (cm) { return cm.extendSelectionsBy(function (range) {\n      var top = cm.cursorCoords(range.head, \"div\").top + 5;\n      return cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, \"div\")\n    }, sel_move); },\n    goLineLeft: function (cm) { return cm.extendSelectionsBy(function (range) {\n      var top = cm.cursorCoords(range.head, \"div\").top + 5;\n      return cm.coordsChar({left: 0, top: top}, \"div\")\n    }, sel_move); },\n    goLineLeftSmart: function (cm) { return cm.extendSelectionsBy(function (range) {\n      var top = cm.cursorCoords(range.head, \"div\").top + 5;\n      var pos = cm.coordsChar({left: 0, top: top}, \"div\");\n      if (pos.ch < cm.getLine(pos.line).search(/\\S/)) { return lineStartSmart(cm, range.head) }\n      return pos\n    }, sel_move); },\n    goLineUp: function (cm) { return cm.moveV(-1, \"line\"); },\n    goLineDown: function (cm) { return cm.moveV(1, \"line\"); },\n    goPageUp: function (cm) { return cm.moveV(-1, \"page\"); },\n    goPageDown: function (cm) { return cm.moveV(1, \"page\"); },\n    goCharLeft: function (cm) { return cm.moveH(-1, \"char\"); },\n    goCharRight: function (cm) { return cm.moveH(1, \"char\"); },\n    goColumnLeft: function (cm) { return cm.moveH(-1, \"column\"); },\n    goColumnRight: function (cm) { return cm.moveH(1, \"column\"); },\n    goWordLeft: function (cm) { return cm.moveH(-1, \"word\"); },\n    goGroupRight: function (cm) { return cm.moveH(1, \"group\"); },\n    goGroupLeft: function (cm) { return cm.moveH(-1, \"group\"); },\n    goWordRight: function (cm) { return cm.moveH(1, \"word\"); },\n    delCharBefore: function (cm) { return cm.deleteH(-1, \"codepoint\"); },\n    delCharAfter: function (cm) { return cm.deleteH(1, \"char\"); },\n    delWordBefore: function (cm) { return cm.deleteH(-1, \"word\"); },\n    delWordAfter: function (cm) { return cm.deleteH(1, \"word\"); },\n    delGroupBefore: function (cm) { return cm.deleteH(-1, \"group\"); },\n    delGroupAfter: function (cm) { return cm.deleteH(1, \"group\"); },\n    indentAuto: function (cm) { return cm.indentSelection(\"smart\"); },\n    indentMore: function (cm) { return cm.indentSelection(\"add\"); },\n    indentLess: function (cm) { return cm.indentSelection(\"subtract\"); },\n    insertTab: function (cm) { return cm.replaceSelection(\"\\t\"); },\n    insertSoftTab: function (cm) {\n      var spaces = [], ranges = cm.listSelections(), tabSize = cm.options.tabSize;\n      for (var i = 0; i < ranges.length; i++) {\n        var pos = ranges[i].from();\n        var col = countColumn(cm.getLine(pos.line), pos.ch, tabSize);\n        spaces.push(spaceStr(tabSize - col % tabSize));\n      }\n      cm.replaceSelections(spaces);\n    },\n    defaultTab: function (cm) {\n      if (cm.somethingSelected()) { cm.indentSelection(\"add\"); }\n      else { cm.execCommand(\"insertTab\"); }\n    },\n    // Swap the two chars left and right of each selection's head.\n    // Move cursor behind the two swapped characters afterwards.\n    //\n    // Doesn't consider line feeds a character.\n    // Doesn't scan more than one line above to find a character.\n    // Doesn't do anything on an empty line.\n    // Doesn't do anything with non-empty selections.\n    transposeChars: function (cm) { return runInOp(cm, function () {\n      var ranges = cm.listSelections(), newSel = [];\n      for (var i = 0; i < ranges.length; i++) {\n        if (!ranges[i].empty()) { continue }\n        var cur = ranges[i].head, line = getLine(cm.doc, cur.line).text;\n        if (line) {\n          if (cur.ch == line.length) { cur = new Pos(cur.line, cur.ch - 1); }\n          if (cur.ch > 0) {\n            cur = new Pos(cur.line, cur.ch + 1);\n            cm.replaceRange(line.charAt(cur.ch - 1) + line.charAt(cur.ch - 2),\n                            Pos(cur.line, cur.ch - 2), cur, \"+transpose\");\n          } else if (cur.line > cm.doc.first) {\n            var prev = getLine(cm.doc, cur.line - 1).text;\n            if (prev) {\n              cur = new Pos(cur.line, 1);\n              cm.replaceRange(line.charAt(0) + cm.doc.lineSeparator() +\n                              prev.charAt(prev.length - 1),\n                              Pos(cur.line - 1, prev.length - 1), cur, \"+transpose\");\n            }\n          }\n        }\n        newSel.push(new Range(cur, cur));\n      }\n      cm.setSelections(newSel);\n    }); },\n    newlineAndIndent: function (cm) { return runInOp(cm, function () {\n      var sels = cm.listSelections();\n      for (var i = sels.length - 1; i >= 0; i--)\n        { cm.replaceRange(cm.doc.lineSeparator(), sels[i].anchor, sels[i].head, \"+input\"); }\n      sels = cm.listSelections();\n      for (var i$1 = 0; i$1 < sels.length; i$1++)\n        { cm.indentLine(sels[i$1].from().line, null, true); }\n      ensureCursorVisible(cm);\n    }); },\n    openLine: function (cm) { return cm.replaceSelection(\"\\n\", \"start\"); },\n    toggleOverwrite: function (cm) { return cm.toggleOverwrite(); }\n  };\n\n\n  function lineStart(cm, lineN) {\n    var line = getLine(cm.doc, lineN);\n    var visual = visualLine(line);\n    if (visual != line) { lineN = lineNo(visual); }\n    return endOfLine(true, cm, visual, lineN, 1)\n  }\n  function lineEnd(cm, lineN) {\n    var line = getLine(cm.doc, lineN);\n    var visual = visualLineEnd(line);\n    if (visual != line) { lineN = lineNo(visual); }\n    return endOfLine(true, cm, line, lineN, -1)\n  }\n  function lineStartSmart(cm, pos) {\n    var start = lineStart(cm, pos.line);\n    var line = getLine(cm.doc, start.line);\n    var order = getOrder(line, cm.doc.direction);\n    if (!order || order[0].level == 0) {\n      var firstNonWS = Math.max(start.ch, line.text.search(/\\S/));\n      var inWS = pos.line == start.line && pos.ch <= firstNonWS && pos.ch;\n      return Pos(start.line, inWS ? 0 : firstNonWS, start.sticky)\n    }\n    return start\n  }\n\n  // Run a handler that was bound to a key.\n  function doHandleBinding(cm, bound, dropShift) {\n    if (typeof bound == \"string\") {\n      bound = commands[bound];\n      if (!bound) { return false }\n    }\n    // Ensure previous input has been read, so that the handler sees a\n    // consistent view of the document\n    cm.display.input.ensurePolled();\n    var prevShift = cm.display.shift, done = false;\n    try {\n      if (cm.isReadOnly()) { cm.state.suppressEdits = true; }\n      if (dropShift) { cm.display.shift = false; }\n      done = bound(cm) != Pass;\n    } finally {\n      cm.display.shift = prevShift;\n      cm.state.suppressEdits = false;\n    }\n    return done\n  }\n\n  function lookupKeyForEditor(cm, name, handle) {\n    for (var i = 0; i < cm.state.keyMaps.length; i++) {\n      var result = lookupKey(name, cm.state.keyMaps[i], handle, cm);\n      if (result) { return result }\n    }\n    return (cm.options.extraKeys && lookupKey(name, cm.options.extraKeys, handle, cm))\n      || lookupKey(name, cm.options.keyMap, handle, cm)\n  }\n\n  // Note that, despite the name, this function is also used to check\n  // for bound mouse clicks.\n\n  var stopSeq = new Delayed;\n\n  function dispatchKey(cm, name, e, handle) {\n    var seq = cm.state.keySeq;\n    if (seq) {\n      if (isModifierKey(name)) { return \"handled\" }\n      if (/\\'$/.test(name))\n        { cm.state.keySeq = null; }\n      else\n        { stopSeq.set(50, function () {\n          if (cm.state.keySeq == seq) {\n            cm.state.keySeq = null;\n            cm.display.input.reset();\n          }\n        }); }\n      if (dispatchKeyInner(cm, seq + \" \" + name, e, handle)) { return true }\n    }\n    return dispatchKeyInner(cm, name, e, handle)\n  }\n\n  function dispatchKeyInner(cm, name, e, handle) {\n    var result = lookupKeyForEditor(cm, name, handle);\n\n    if (result == \"multi\")\n      { cm.state.keySeq = name; }\n    if (result == \"handled\")\n      { signalLater(cm, \"keyHandled\", cm, name, e); }\n\n    if (result == \"handled\" || result == \"multi\") {\n      e_preventDefault(e);\n      restartBlink(cm);\n    }\n\n    return !!result\n  }\n\n  // Handle a key from the keydown event.\n  function handleKeyBinding(cm, e) {\n    var name = keyName(e, true);\n    if (!name) { return false }\n\n    if (e.shiftKey && !cm.state.keySeq) {\n      // First try to resolve full name (including 'Shift-'). Failing\n      // that, see if there is a cursor-motion command (starting with\n      // 'go') bound to the keyname without 'Shift-'.\n      return dispatchKey(cm, \"Shift-\" + name, e, function (b) { return doHandleBinding(cm, b, true); })\n          || dispatchKey(cm, name, e, function (b) {\n               if (typeof b == \"string\" ? /^go[A-Z]/.test(b) : b.motion)\n                 { return doHandleBinding(cm, b) }\n             })\n    } else {\n      return dispatchKey(cm, name, e, function (b) { return doHandleBinding(cm, b); })\n    }\n  }\n\n  // Handle a key from the keypress event\n  function handleCharBinding(cm, e, ch) {\n    return dispatchKey(cm, \"'\" + ch + \"'\", e, function (b) { return doHandleBinding(cm, b, true); })\n  }\n\n  var lastStoppedKey = null;\n  function onKeyDown(e) {\n    var cm = this;\n    if (e.target && e.target != cm.display.input.getField()) { return }\n    cm.curOp.focus = activeElt(root(cm));\n    if (signalDOMEvent(cm, e)) { return }\n    // IE does strange things with escape.\n    if (ie && ie_version < 11 && e.keyCode == 27) { e.returnValue = false; }\n    var code = e.keyCode;\n    cm.display.shift = code == 16 || e.shiftKey;\n    var handled = handleKeyBinding(cm, e);\n    if (presto) {\n      lastStoppedKey = handled ? code : null;\n      // Opera has no cut event... we try to at least catch the key combo\n      if (!handled && code == 88 && !hasCopyEvent && (mac ? e.metaKey : e.ctrlKey))\n        { cm.replaceSelection(\"\", null, \"cut\"); }\n    }\n    if (gecko && !mac && !handled && code == 46 && e.shiftKey && !e.ctrlKey && document.execCommand)\n      { document.execCommand(\"cut\"); }\n\n    // Turn mouse into crosshair when Alt is held on Mac.\n    if (code == 18 && !/\\bCodeMirror-crosshair\\b/.test(cm.display.lineDiv.className))\n      { showCrossHair(cm); }\n  }\n\n  function showCrossHair(cm) {\n    var lineDiv = cm.display.lineDiv;\n    addClass(lineDiv, \"CodeMirror-crosshair\");\n\n    function up(e) {\n      if (e.keyCode == 18 || !e.altKey) {\n        rmClass(lineDiv, \"CodeMirror-crosshair\");\n        off(document, \"keyup\", up);\n        off(document, \"mouseover\", up);\n      }\n    }\n    on(document, \"keyup\", up);\n    on(document, \"mouseover\", up);\n  }\n\n  function onKeyUp(e) {\n    if (e.keyCode == 16) { this.doc.sel.shift = false; }\n    signalDOMEvent(this, e);\n  }\n\n  function onKeyPress(e) {\n    var cm = this;\n    if (e.target && e.target != cm.display.input.getField()) { return }\n    if (eventInWidget(cm.display, e) || signalDOMEvent(cm, e) || e.ctrlKey && !e.altKey || mac && e.metaKey) { return }\n    var keyCode = e.keyCode, charCode = e.charCode;\n    if (presto && keyCode == lastStoppedKey) {lastStoppedKey = null; e_preventDefault(e); return}\n    if ((presto && (!e.which || e.which < 10)) && handleKeyBinding(cm, e)) { return }\n    var ch = String.fromCharCode(charCode == null ? keyCode : charCode);\n    // Some browsers fire keypress events for backspace\n    if (ch == \"\\x08\") { return }\n    if (handleCharBinding(cm, e, ch)) { return }\n    cm.display.input.onKeyPress(e);\n  }\n\n  var DOUBLECLICK_DELAY = 400;\n\n  var PastClick = function(time, pos, button) {\n    this.time = time;\n    this.pos = pos;\n    this.button = button;\n  };\n\n  PastClick.prototype.compare = function (time, pos, button) {\n    return this.time + DOUBLECLICK_DELAY > time &&\n      cmp(pos, this.pos) == 0 && button == this.button\n  };\n\n  var lastClick, lastDoubleClick;\n  function clickRepeat(pos, button) {\n    var now = +new Date;\n    if (lastDoubleClick && lastDoubleClick.compare(now, pos, button)) {\n      lastClick = lastDoubleClick = null;\n      return \"triple\"\n    } else if (lastClick && lastClick.compare(now, pos, button)) {\n      lastDoubleClick = new PastClick(now, pos, button);\n      lastClick = null;\n      return \"double\"\n    } else {\n      lastClick = new PastClick(now, pos, button);\n      lastDoubleClick = null;\n      return \"single\"\n    }\n  }\n\n  // A mouse down can be a single click, double click, triple click,\n  // start of selection drag, start of text drag, new cursor\n  // (ctrl-click), rectangle drag (alt-drag), or xwin\n  // middle-click-paste. Or it might be a click on something we should\n  // not interfere with, such as a scrollbar or widget.\n  function onMouseDown(e) {\n    var cm = this, display = cm.display;\n    if (signalDOMEvent(cm, e) || display.activeTouch && display.input.supportsTouch()) { return }\n    display.input.ensurePolled();\n    display.shift = e.shiftKey;\n\n    if (eventInWidget(display, e)) {\n      if (!webkit) {\n        // Briefly turn off draggability, to allow widgets to do\n        // normal dragging things.\n        display.scroller.draggable = false;\n        setTimeout(function () { return display.scroller.draggable = true; }, 100);\n      }\n      return\n    }\n    if (clickInGutter(cm, e)) { return }\n    var pos = posFromMouse(cm, e), button = e_button(e), repeat = pos ? clickRepeat(pos, button) : \"single\";\n    win(cm).focus();\n\n    // #3261: make sure, that we're not starting a second selection\n    if (button == 1 && cm.state.selectingText)\n      { cm.state.selectingText(e); }\n\n    if (pos && handleMappedButton(cm, button, pos, repeat, e)) { return }\n\n    if (button == 1) {\n      if (pos) { leftButtonDown(cm, pos, repeat, e); }\n      else if (e_target(e) == display.scroller) { e_preventDefault(e); }\n    } else if (button == 2) {\n      if (pos) { extendSelection(cm.doc, pos); }\n      setTimeout(function () { return display.input.focus(); }, 20);\n    } else if (button == 3) {\n      if (captureRightClick) { cm.display.input.onContextMenu(e); }\n      else { delayBlurEvent(cm); }\n    }\n  }\n\n  function handleMappedButton(cm, button, pos, repeat, event) {\n    var name = \"Click\";\n    if (repeat == \"double\") { name = \"Double\" + name; }\n    else if (repeat == \"triple\") { name = \"Triple\" + name; }\n    name = (button == 1 ? \"Left\" : button == 2 ? \"Middle\" : \"Right\") + name;\n\n    return dispatchKey(cm,  addModifierNames(name, event), event, function (bound) {\n      if (typeof bound == \"string\") { bound = commands[bound]; }\n      if (!bound) { return false }\n      var done = false;\n      try {\n        if (cm.isReadOnly()) { cm.state.suppressEdits = true; }\n        done = bound(cm, pos) != Pass;\n      } finally {\n        cm.state.suppressEdits = false;\n      }\n      return done\n    })\n  }\n\n  function configureMouse(cm, repeat, event) {\n    var option = cm.getOption(\"configureMouse\");\n    var value = option ? option(cm, repeat, event) : {};\n    if (value.unit == null) {\n      var rect = chromeOS ? event.shiftKey && event.metaKey : event.altKey;\n      value.unit = rect ? \"rectangle\" : repeat == \"single\" ? \"char\" : repeat == \"double\" ? \"word\" : \"line\";\n    }\n    if (value.extend == null || cm.doc.extend) { value.extend = cm.doc.extend || event.shiftKey; }\n    if (value.addNew == null) { value.addNew = mac ? event.metaKey : event.ctrlKey; }\n    if (value.moveOnDrag == null) { value.moveOnDrag = !(mac ? event.altKey : event.ctrlKey); }\n    return value\n  }\n\n  function leftButtonDown(cm, pos, repeat, event) {\n    if (ie) { setTimeout(bind(ensureFocus, cm), 0); }\n    else { cm.curOp.focus = activeElt(root(cm)); }\n\n    var behavior = configureMouse(cm, repeat, event);\n\n    var sel = cm.doc.sel, contained;\n    if (cm.options.dragDrop && dragAndDrop && !cm.isReadOnly() &&\n        repeat == \"single\" && (contained = sel.contains(pos)) > -1 &&\n        (cmp((contained = sel.ranges[contained]).from(), pos) < 0 || pos.xRel > 0) &&\n        (cmp(contained.to(), pos) > 0 || pos.xRel < 0))\n      { leftButtonStartDrag(cm, event, pos, behavior); }\n    else\n      { leftButtonSelect(cm, event, pos, behavior); }\n  }\n\n  // Start a text drag. When it ends, see if any dragging actually\n  // happen, and treat as a click if it didn't.\n  function leftButtonStartDrag(cm, event, pos, behavior) {\n    var display = cm.display, moved = false;\n    var dragEnd = operation(cm, function (e) {\n      if (webkit) { display.scroller.draggable = false; }\n      cm.state.draggingText = false;\n      if (cm.state.delayingBlurEvent) {\n        if (cm.hasFocus()) { cm.state.delayingBlurEvent = false; }\n        else { delayBlurEvent(cm); }\n      }\n      off(display.wrapper.ownerDocument, \"mouseup\", dragEnd);\n      off(display.wrapper.ownerDocument, \"mousemove\", mouseMove);\n      off(display.scroller, \"dragstart\", dragStart);\n      off(display.scroller, \"drop\", dragEnd);\n      if (!moved) {\n        e_preventDefault(e);\n        if (!behavior.addNew)\n          { extendSelection(cm.doc, pos, null, null, behavior.extend); }\n        // Work around unexplainable focus problem in IE9 (#2127) and Chrome (#3081)\n        if ((webkit && !safari) || ie && ie_version == 9)\n          { setTimeout(function () {display.wrapper.ownerDocument.body.focus({preventScroll: true}); display.input.focus();}, 20); }\n        else\n          { display.input.focus(); }\n      }\n    });\n    var mouseMove = function(e2) {\n      moved = moved || Math.abs(event.clientX - e2.clientX) + Math.abs(event.clientY - e2.clientY) >= 10;\n    };\n    var dragStart = function () { return moved = true; };\n    // Let the drag handler handle this.\n    if (webkit) { display.scroller.draggable = true; }\n    cm.state.draggingText = dragEnd;\n    dragEnd.copy = !behavior.moveOnDrag;\n    on(display.wrapper.ownerDocument, \"mouseup\", dragEnd);\n    on(display.wrapper.ownerDocument, \"mousemove\", mouseMove);\n    on(display.scroller, \"dragstart\", dragStart);\n    on(display.scroller, \"drop\", dragEnd);\n\n    cm.state.delayingBlurEvent = true;\n    setTimeout(function () { return display.input.focus(); }, 20);\n    // IE's approach to draggable\n    if (display.scroller.dragDrop) { display.scroller.dragDrop(); }\n  }\n\n  function rangeForUnit(cm, pos, unit) {\n    if (unit == \"char\") { return new Range(pos, pos) }\n    if (unit == \"word\") { return cm.findWordAt(pos) }\n    if (unit == \"line\") { return new Range(Pos(pos.line, 0), clipPos(cm.doc, Pos(pos.line + 1, 0))) }\n    var result = unit(cm, pos);\n    return new Range(result.from, result.to)\n  }\n\n  // Normal selection, as opposed to text dragging.\n  function leftButtonSelect(cm, event, start, behavior) {\n    if (ie) { delayBlurEvent(cm); }\n    var display = cm.display, doc = cm.doc;\n    e_preventDefault(event);\n\n    var ourRange, ourIndex, startSel = doc.sel, ranges = startSel.ranges;\n    if (behavior.addNew && !behavior.extend) {\n      ourIndex = doc.sel.contains(start);\n      if (ourIndex > -1)\n        { ourRange = ranges[ourIndex]; }\n      else\n        { ourRange = new Range(start, start); }\n    } else {\n      ourRange = doc.sel.primary();\n      ourIndex = doc.sel.primIndex;\n    }\n\n    if (behavior.unit == \"rectangle\") {\n      if (!behavior.addNew) { ourRange = new Range(start, start); }\n      start = posFromMouse(cm, event, true, true);\n      ourIndex = -1;\n    } else {\n      var range = rangeForUnit(cm, start, behavior.unit);\n      if (behavior.extend)\n        { ourRange = extendRange(ourRange, range.anchor, range.head, behavior.extend); }\n      else\n        { ourRange = range; }\n    }\n\n    if (!behavior.addNew) {\n      ourIndex = 0;\n      setSelection(doc, new Selection([ourRange], 0), sel_mouse);\n      startSel = doc.sel;\n    } else if (ourIndex == -1) {\n      ourIndex = ranges.length;\n      setSelection(doc, normalizeSelection(cm, ranges.concat([ourRange]), ourIndex),\n                   {scroll: false, origin: \"*mouse\"});\n    } else if (ranges.length > 1 && ranges[ourIndex].empty() && behavior.unit == \"char\" && !behavior.extend) {\n      setSelection(doc, normalizeSelection(cm, ranges.slice(0, ourIndex).concat(ranges.slice(ourIndex + 1)), 0),\n                   {scroll: false, origin: \"*mouse\"});\n      startSel = doc.sel;\n    } else {\n      replaceOneSelection(doc, ourIndex, ourRange, sel_mouse);\n    }\n\n    var lastPos = start;\n    function extendTo(pos) {\n      if (cmp(lastPos, pos) == 0) { return }\n      lastPos = pos;\n\n      if (behavior.unit == \"rectangle\") {\n        var ranges = [], tabSize = cm.options.tabSize;\n        var startCol = countColumn(getLine(doc, start.line).text, start.ch, tabSize);\n        var posCol = countColumn(getLine(doc, pos.line).text, pos.ch, tabSize);\n        var left = Math.min(startCol, posCol), right = Math.max(startCol, posCol);\n        for (var line = Math.min(start.line, pos.line), end = Math.min(cm.lastLine(), Math.max(start.line, pos.line));\n             line <= end; line++) {\n          var text = getLine(doc, line).text, leftPos = findColumn(text, left, tabSize);\n          if (left == right)\n            { ranges.push(new Range(Pos(line, leftPos), Pos(line, leftPos))); }\n          else if (text.length > leftPos)\n            { ranges.push(new Range(Pos(line, leftPos), Pos(line, findColumn(text, right, tabSize)))); }\n        }\n        if (!ranges.length) { ranges.push(new Range(start, start)); }\n        setSelection(doc, normalizeSelection(cm, startSel.ranges.slice(0, ourIndex).concat(ranges), ourIndex),\n                     {origin: \"*mouse\", scroll: false});\n        cm.scrollIntoView(pos);\n      } else {\n        var oldRange = ourRange;\n        var range = rangeForUnit(cm, pos, behavior.unit);\n        var anchor = oldRange.anchor, head;\n        if (cmp(range.anchor, anchor) > 0) {\n          head = range.head;\n          anchor = minPos(oldRange.from(), range.anchor);\n        } else {\n          head = range.anchor;\n          anchor = maxPos(oldRange.to(), range.head);\n        }\n        var ranges$1 = startSel.ranges.slice(0);\n        ranges$1[ourIndex] = bidiSimplify(cm, new Range(clipPos(doc, anchor), head));\n        setSelection(doc, normalizeSelection(cm, ranges$1, ourIndex), sel_mouse);\n      }\n    }\n\n    var editorSize = display.wrapper.getBoundingClientRect();\n    // Used to ensure timeout re-tries don't fire when another extend\n    // happened in the meantime (clearTimeout isn't reliable -- at\n    // least on Chrome, the timeouts still happen even when cleared,\n    // if the clear happens after their scheduled firing time).\n    var counter = 0;\n\n    function extend(e) {\n      var curCount = ++counter;\n      var cur = posFromMouse(cm, e, true, behavior.unit == \"rectangle\");\n      if (!cur) { return }\n      if (cmp(cur, lastPos) != 0) {\n        cm.curOp.focus = activeElt(root(cm));\n        extendTo(cur);\n        var visible = visibleLines(display, doc);\n        if (cur.line >= visible.to || cur.line < visible.from)\n          { setTimeout(operation(cm, function () {if (counter == curCount) { extend(e); }}), 150); }\n      } else {\n        var outside = e.clientY < editorSize.top ? -20 : e.clientY > editorSize.bottom ? 20 : 0;\n        if (outside) { setTimeout(operation(cm, function () {\n          if (counter != curCount) { return }\n          display.scroller.scrollTop += outside;\n          extend(e);\n        }), 50); }\n      }\n    }\n\n    function done(e) {\n      cm.state.selectingText = false;\n      counter = Infinity;\n      // If e is null or undefined we interpret this as someone trying\n      // to explicitly cancel the selection rather than the user\n      // letting go of the mouse button.\n      if (e) {\n        e_preventDefault(e);\n        display.input.focus();\n      }\n      off(display.wrapper.ownerDocument, \"mousemove\", move);\n      off(display.wrapper.ownerDocument, \"mouseup\", up);\n      doc.history.lastSelOrigin = null;\n    }\n\n    var move = operation(cm, function (e) {\n      if (e.buttons === 0 || !e_button(e)) { done(e); }\n      else { extend(e); }\n    });\n    var up = operation(cm, done);\n    cm.state.selectingText = up;\n    on(display.wrapper.ownerDocument, \"mousemove\", move);\n    on(display.wrapper.ownerDocument, \"mouseup\", up);\n  }\n\n  // Used when mouse-selecting to adjust the anchor to the proper side\n  // of a bidi jump depending on the visual position of the head.\n  function bidiSimplify(cm, range) {\n    var anchor = range.anchor;\n    var head = range.head;\n    var anchorLine = getLine(cm.doc, anchor.line);\n    if (cmp(anchor, head) == 0 && anchor.sticky == head.sticky) { return range }\n    var order = getOrder(anchorLine);\n    if (!order) { return range }\n    var index = getBidiPartAt(order, anchor.ch, anchor.sticky), part = order[index];\n    if (part.from != anchor.ch && part.to != anchor.ch) { return range }\n    var boundary = index + ((part.from == anchor.ch) == (part.level != 1) ? 0 : 1);\n    if (boundary == 0 || boundary == order.length) { return range }\n\n    // Compute the relative visual position of the head compared to the\n    // anchor (<0 is to the left, >0 to the right)\n    var leftSide;\n    if (head.line != anchor.line) {\n      leftSide = (head.line - anchor.line) * (cm.doc.direction == \"ltr\" ? 1 : -1) > 0;\n    } else {\n      var headIndex = getBidiPartAt(order, head.ch, head.sticky);\n      var dir = headIndex - index || (head.ch - anchor.ch) * (part.level == 1 ? -1 : 1);\n      if (headIndex == boundary - 1 || headIndex == boundary)\n        { leftSide = dir < 0; }\n      else\n        { leftSide = dir > 0; }\n    }\n\n    var usePart = order[boundary + (leftSide ? -1 : 0)];\n    var from = leftSide == (usePart.level == 1);\n    var ch = from ? usePart.from : usePart.to, sticky = from ? \"after\" : \"before\";\n    return anchor.ch == ch && anchor.sticky == sticky ? range : new Range(new Pos(anchor.line, ch, sticky), head)\n  }\n\n\n  // Determines whether an event happened in the gutter, and fires the\n  // handlers for the corresponding event.\n  function gutterEvent(cm, e, type, prevent) {\n    var mX, mY;\n    if (e.touches) {\n      mX = e.touches[0].clientX;\n      mY = e.touches[0].clientY;\n    } else {\n      try { mX = e.clientX; mY = e.clientY; }\n      catch(e$1) { return false }\n    }\n    if (mX >= Math.floor(cm.display.gutters.getBoundingClientRect().right)) { return false }\n    if (prevent) { e_preventDefault(e); }\n\n    var display = cm.display;\n    var lineBox = display.lineDiv.getBoundingClientRect();\n\n    if (mY > lineBox.bottom || !hasHandler(cm, type)) { return e_defaultPrevented(e) }\n    mY -= lineBox.top - display.viewOffset;\n\n    for (var i = 0; i < cm.display.gutterSpecs.length; ++i) {\n      var g = display.gutters.childNodes[i];\n      if (g && g.getBoundingClientRect().right >= mX) {\n        var line = lineAtHeight(cm.doc, mY);\n        var gutter = cm.display.gutterSpecs[i];\n        signal(cm, type, cm, line, gutter.className, e);\n        return e_defaultPrevented(e)\n      }\n    }\n  }\n\n  function clickInGutter(cm, e) {\n    return gutterEvent(cm, e, \"gutterClick\", true)\n  }\n\n  // CONTEXT MENU HANDLING\n\n  // To make the context menu work, we need to briefly unhide the\n  // textarea (making it as unobtrusive as possible) to let the\n  // right-click take effect on it.\n  function onContextMenu(cm, e) {\n    if (eventInWidget(cm.display, e) || contextMenuInGutter(cm, e)) { return }\n    if (signalDOMEvent(cm, e, \"contextmenu\")) { return }\n    if (!captureRightClick) { cm.display.input.onContextMenu(e); }\n  }\n\n  function contextMenuInGutter(cm, e) {\n    if (!hasHandler(cm, \"gutterContextMenu\")) { return false }\n    return gutterEvent(cm, e, \"gutterContextMenu\", false)\n  }\n\n  function themeChanged(cm) {\n    cm.display.wrapper.className = cm.display.wrapper.className.replace(/\\s*cm-s-\\S+/g, \"\") +\n      cm.options.theme.replace(/(^|\\s)\\s*/g, \" cm-s-\");\n    clearCaches(cm);\n  }\n\n  var Init = {toString: function(){return \"CodeMirror.Init\"}};\n\n  var defaults = {};\n  var optionHandlers = {};\n\n  function defineOptions(CodeMirror) {\n    var optionHandlers = CodeMirror.optionHandlers;\n\n    function option(name, deflt, handle, notOnInit) {\n      CodeMirror.defaults[name] = deflt;\n      if (handle) { optionHandlers[name] =\n        notOnInit ? function (cm, val, old) {if (old != Init) { handle(cm, val, old); }} : handle; }\n    }\n\n    CodeMirror.defineOption = option;\n\n    // Passed to option handlers when there is no old value.\n    CodeMirror.Init = Init;\n\n    // These two are, on init, called from the constructor because they\n    // have to be initialized before the editor can start at all.\n    option(\"value\", \"\", function (cm, val) { return cm.setValue(val); }, true);\n    option(\"mode\", null, function (cm, val) {\n      cm.doc.modeOption = val;\n      loadMode(cm);\n    }, true);\n\n    option(\"indentUnit\", 2, loadMode, true);\n    option(\"indentWithTabs\", false);\n    option(\"smartIndent\", true);\n    option(\"tabSize\", 4, function (cm) {\n      resetModeState(cm);\n      clearCaches(cm);\n      regChange(cm);\n    }, true);\n\n    option(\"lineSeparator\", null, function (cm, val) {\n      cm.doc.lineSep = val;\n      if (!val) { return }\n      var newBreaks = [], lineNo = cm.doc.first;\n      cm.doc.iter(function (line) {\n        for (var pos = 0;;) {\n          var found = line.text.indexOf(val, pos);\n          if (found == -1) { break }\n          pos = found + val.length;\n          newBreaks.push(Pos(lineNo, found));\n        }\n        lineNo++;\n      });\n      for (var i = newBreaks.length - 1; i >= 0; i--)\n        { replaceRange(cm.doc, val, newBreaks[i], Pos(newBreaks[i].line, newBreaks[i].ch + val.length)); }\n    });\n    option(\"specialChars\", /[\\u0000-\\u001f\\u007f-\\u009f\\u00ad\\u061c\\u200b\\u200e\\u200f\\u2028\\u2029\\u202d\\u202e\\u2066\\u2067\\u2069\\ufeff\\ufff9-\\ufffc]/g, function (cm, val, old) {\n      cm.state.specialChars = new RegExp(val.source + (val.test(\"\\t\") ? \"\" : \"|\\t\"), \"g\");\n      if (old != Init) { cm.refresh(); }\n    });\n    option(\"specialCharPlaceholder\", defaultSpecialCharPlaceholder, function (cm) { return cm.refresh(); }, true);\n    option(\"electricChars\", true);\n    option(\"inputStyle\", mobile ? \"contenteditable\" : \"textarea\", function () {\n      throw new Error(\"inputStyle can not (yet) be changed in a running editor\") // FIXME\n    }, true);\n    option(\"spellcheck\", false, function (cm, val) { return cm.getInputField().spellcheck = val; }, true);\n    option(\"autocorrect\", false, function (cm, val) { return cm.getInputField().autocorrect = val; }, true);\n    option(\"autocapitalize\", false, function (cm, val) { return cm.getInputField().autocapitalize = val; }, true);\n    option(\"rtlMoveVisually\", !windows);\n    option(\"wholeLineUpdateBefore\", true);\n\n    option(\"theme\", \"default\", function (cm) {\n      themeChanged(cm);\n      updateGutters(cm);\n    }, true);\n    option(\"keyMap\", \"default\", function (cm, val, old) {\n      var next = getKeyMap(val);\n      var prev = old != Init && getKeyMap(old);\n      if (prev && prev.detach) { prev.detach(cm, next); }\n      if (next.attach) { next.attach(cm, prev || null); }\n    });\n    option(\"extraKeys\", null);\n    option(\"configureMouse\", null);\n\n    option(\"lineWrapping\", false, wrappingChanged, true);\n    option(\"gutters\", [], function (cm, val) {\n      cm.display.gutterSpecs = getGutters(val, cm.options.lineNumbers);\n      updateGutters(cm);\n    }, true);\n    option(\"fixedGutter\", true, function (cm, val) {\n      cm.display.gutters.style.left = val ? compensateForHScroll(cm.display) + \"px\" : \"0\";\n      cm.refresh();\n    }, true);\n    option(\"coverGutterNextToScrollbar\", false, function (cm) { return updateScrollbars(cm); }, true);\n    option(\"scrollbarStyle\", \"native\", function (cm) {\n      initScrollbars(cm);\n      updateScrollbars(cm);\n      cm.display.scrollbars.setScrollTop(cm.doc.scrollTop);\n      cm.display.scrollbars.setScrollLeft(cm.doc.scrollLeft);\n    }, true);\n    option(\"lineNumbers\", false, function (cm, val) {\n      cm.display.gutterSpecs = getGutters(cm.options.gutters, val);\n      updateGutters(cm);\n    }, true);\n    option(\"firstLineNumber\", 1, updateGutters, true);\n    option(\"lineNumberFormatter\", function (integer) { return integer; }, updateGutters, true);\n    option(\"showCursorWhenSelecting\", false, updateSelection, true);\n\n    option(\"resetSelectionOnContextMenu\", true);\n    option(\"lineWiseCopyCut\", true);\n    option(\"pasteLinesPerSelection\", true);\n    option(\"selectionsMayTouch\", false);\n\n    option(\"readOnly\", false, function (cm, val) {\n      if (val == \"nocursor\") {\n        onBlur(cm);\n        cm.display.input.blur();\n      }\n      cm.display.input.readOnlyChanged(val);\n    });\n\n    option(\"screenReaderLabel\", null, function (cm, val) {\n      val = (val === '') ? null : val;\n      cm.display.input.screenReaderLabelChanged(val);\n    });\n\n    option(\"disableInput\", false, function (cm, val) {if (!val) { cm.display.input.reset(); }}, true);\n    option(\"dragDrop\", true, dragDropChanged);\n    option(\"allowDropFileTypes\", null);\n\n    option(\"cursorBlinkRate\", 530);\n    option(\"cursorScrollMargin\", 0);\n    option(\"cursorHeight\", 1, updateSelection, true);\n    option(\"singleCursorHeightPerLine\", true, updateSelection, true);\n    option(\"workTime\", 100);\n    option(\"workDelay\", 100);\n    option(\"flattenSpans\", true, resetModeState, true);\n    option(\"addModeClass\", false, resetModeState, true);\n    option(\"pollInterval\", 100);\n    option(\"undoDepth\", 200, function (cm, val) { return cm.doc.history.undoDepth = val; });\n    option(\"historyEventDelay\", 1250);\n    option(\"viewportMargin\", 10, function (cm) { return cm.refresh(); }, true);\n    option(\"maxHighlightLength\", 10000, resetModeState, true);\n    option(\"moveInputWithCursor\", true, function (cm, val) {\n      if (!val) { cm.display.input.resetPosition(); }\n    });\n\n    option(\"tabindex\", null, function (cm, val) { return cm.display.input.getField().tabIndex = val || \"\"; });\n    option(\"autofocus\", null);\n    option(\"direction\", \"ltr\", function (cm, val) { return cm.doc.setDirection(val); }, true);\n    option(\"phrases\", null);\n  }\n\n  function dragDropChanged(cm, value, old) {\n    var wasOn = old && old != Init;\n    if (!value != !wasOn) {\n      var funcs = cm.display.dragFunctions;\n      var toggle = value ? on : off;\n      toggle(cm.display.scroller, \"dragstart\", funcs.start);\n      toggle(cm.display.scroller, \"dragenter\", funcs.enter);\n      toggle(cm.display.scroller, \"dragover\", funcs.over);\n      toggle(cm.display.scroller, \"dragleave\", funcs.leave);\n      toggle(cm.display.scroller, \"drop\", funcs.drop);\n    }\n  }\n\n  function wrappingChanged(cm) {\n    if (cm.options.lineWrapping) {\n      addClass(cm.display.wrapper, \"CodeMirror-wrap\");\n      cm.display.sizer.style.minWidth = \"\";\n      cm.display.sizerWidth = null;\n    } else {\n      rmClass(cm.display.wrapper, \"CodeMirror-wrap\");\n      findMaxLine(cm);\n    }\n    estimateLineHeights(cm);\n    regChange(cm);\n    clearCaches(cm);\n    setTimeout(function () { return updateScrollbars(cm); }, 100);\n  }\n\n  // A CodeMirror instance represents an editor. This is the object\n  // that user code is usually dealing with.\n\n  function CodeMirror(place, options) {\n    var this$1 = this;\n\n    if (!(this instanceof CodeMirror)) { return new CodeMirror(place, options) }\n\n    this.options = options = options ? copyObj(options) : {};\n    // Determine effective options based on given values and defaults.\n    copyObj(defaults, options, false);\n\n    var doc = options.value;\n    if (typeof doc == \"string\") { doc = new Doc(doc, options.mode, null, options.lineSeparator, options.direction); }\n    else if (options.mode) { doc.modeOption = options.mode; }\n    this.doc = doc;\n\n    var input = new CodeMirror.inputStyles[options.inputStyle](this);\n    var display = this.display = new Display(place, doc, input, options);\n    display.wrapper.CodeMirror = this;\n    themeChanged(this);\n    if (options.lineWrapping)\n      { this.display.wrapper.className += \" CodeMirror-wrap\"; }\n    initScrollbars(this);\n\n    this.state = {\n      keyMaps: [],  // stores maps added by addKeyMap\n      overlays: [], // highlighting overlays, as added by addOverlay\n      modeGen: 0,   // bumped when mode/overlay changes, used to invalidate highlighting info\n      overwrite: false,\n      delayingBlurEvent: false,\n      focused: false,\n      suppressEdits: false, // used to disable editing during key handlers when in readOnly mode\n      pasteIncoming: -1, cutIncoming: -1, // help recognize paste/cut edits in input.poll\n      selectingText: false,\n      draggingText: false,\n      highlight: new Delayed(), // stores highlight worker timeout\n      keySeq: null,  // Unfinished key sequence\n      specialChars: null\n    };\n\n    if (options.autofocus && !mobile) { display.input.focus(); }\n\n    // Override magic textarea content restore that IE sometimes does\n    // on our hidden textarea on reload\n    if (ie && ie_version < 11) { setTimeout(function () { return this$1.display.input.reset(true); }, 20); }\n\n    registerEventHandlers(this);\n    ensureGlobalHandlers();\n\n    startOperation(this);\n    this.curOp.forceUpdate = true;\n    attachDoc(this, doc);\n\n    if ((options.autofocus && !mobile) || this.hasFocus())\n      { setTimeout(function () {\n        if (this$1.hasFocus() && !this$1.state.focused) { onFocus(this$1); }\n      }, 20); }\n    else\n      { onBlur(this); }\n\n    for (var opt in optionHandlers) { if (optionHandlers.hasOwnProperty(opt))\n      { optionHandlers[opt](this, options[opt], Init); } }\n    maybeUpdateLineNumberWidth(this);\n    if (options.finishInit) { options.finishInit(this); }\n    for (var i = 0; i < initHooks.length; ++i) { initHooks[i](this); }\n    endOperation(this);\n    // Suppress optimizelegibility in Webkit, since it breaks text\n    // measuring on line wrapping boundaries.\n    if (webkit && options.lineWrapping &&\n        getComputedStyle(display.lineDiv).textRendering == \"optimizelegibility\")\n      { display.lineDiv.style.textRendering = \"auto\"; }\n  }\n\n  // The default configuration options.\n  CodeMirror.defaults = defaults;\n  // Functions to run when options are changed.\n  CodeMirror.optionHandlers = optionHandlers;\n\n  // Attach the necessary event handlers when initializing the editor\n  function registerEventHandlers(cm) {\n    var d = cm.display;\n    on(d.scroller, \"mousedown\", operation(cm, onMouseDown));\n    // Older IE's will not fire a second mousedown for a double click\n    if (ie && ie_version < 11)\n      { on(d.scroller, \"dblclick\", operation(cm, function (e) {\n        if (signalDOMEvent(cm, e)) { return }\n        var pos = posFromMouse(cm, e);\n        if (!pos || clickInGutter(cm, e) || eventInWidget(cm.display, e)) { return }\n        e_preventDefault(e);\n        var word = cm.findWordAt(pos);\n        extendSelection(cm.doc, word.anchor, word.head);\n      })); }\n    else\n      { on(d.scroller, \"dblclick\", function (e) { return signalDOMEvent(cm, e) || e_preventDefault(e); }); }\n    // Some browsers fire contextmenu *after* opening the menu, at\n    // which point we can't mess with it anymore. Context menu is\n    // handled in onMouseDown for these browsers.\n    on(d.scroller, \"contextmenu\", function (e) { return onContextMenu(cm, e); });\n    on(d.input.getField(), \"contextmenu\", function (e) {\n      if (!d.scroller.contains(e.target)) { onContextMenu(cm, e); }\n    });\n\n    // Used to suppress mouse event handling when a touch happens\n    var touchFinished, prevTouch = {end: 0};\n    function finishTouch() {\n      if (d.activeTouch) {\n        touchFinished = setTimeout(function () { return d.activeTouch = null; }, 1000);\n        prevTouch = d.activeTouch;\n        prevTouch.end = +new Date;\n      }\n    }\n    function isMouseLikeTouchEvent(e) {\n      if (e.touches.length != 1) { return false }\n      var touch = e.touches[0];\n      return touch.radiusX <= 1 && touch.radiusY <= 1\n    }\n    function farAway(touch, other) {\n      if (other.left == null) { return true }\n      var dx = other.left - touch.left, dy = other.top - touch.top;\n      return dx * dx + dy * dy > 20 * 20\n    }\n    on(d.scroller, \"touchstart\", function (e) {\n      if (!signalDOMEvent(cm, e) && !isMouseLikeTouchEvent(e) && !clickInGutter(cm, e)) {\n        d.input.ensurePolled();\n        clearTimeout(touchFinished);\n        var now = +new Date;\n        d.activeTouch = {start: now, moved: false,\n                         prev: now - prevTouch.end <= 300 ? prevTouch : null};\n        if (e.touches.length == 1) {\n          d.activeTouch.left = e.touches[0].pageX;\n          d.activeTouch.top = e.touches[0].pageY;\n        }\n      }\n    });\n    on(d.scroller, \"touchmove\", function () {\n      if (d.activeTouch) { d.activeTouch.moved = true; }\n    });\n    on(d.scroller, \"touchend\", function (e) {\n      var touch = d.activeTouch;\n      if (touch && !eventInWidget(d, e) && touch.left != null &&\n          !touch.moved && new Date - touch.start < 300) {\n        var pos = cm.coordsChar(d.activeTouch, \"page\"), range;\n        if (!touch.prev || farAway(touch, touch.prev)) // Single tap\n          { range = new Range(pos, pos); }\n        else if (!touch.prev.prev || farAway(touch, touch.prev.prev)) // Double tap\n          { range = cm.findWordAt(pos); }\n        else // Triple tap\n          { range = new Range(Pos(pos.line, 0), clipPos(cm.doc, Pos(pos.line + 1, 0))); }\n        cm.setSelection(range.anchor, range.head);\n        cm.focus();\n        e_preventDefault(e);\n      }\n      finishTouch();\n    });\n    on(d.scroller, \"touchcancel\", finishTouch);\n\n    // Sync scrolling between fake scrollbars and real scrollable\n    // area, ensure viewport is updated when scrolling.\n    on(d.scroller, \"scroll\", function () {\n      if (d.scroller.clientHeight) {\n        updateScrollTop(cm, d.scroller.scrollTop);\n        setScrollLeft(cm, d.scroller.scrollLeft, true);\n        signal(cm, \"scroll\", cm);\n      }\n    });\n\n    // Listen to wheel events in order to try and update the viewport on time.\n    on(d.scroller, \"mousewheel\", function (e) { return onScrollWheel(cm, e); });\n    on(d.scroller, \"DOMMouseScroll\", function (e) { return onScrollWheel(cm, e); });\n\n    // Prevent wrapper from ever scrolling\n    on(d.wrapper, \"scroll\", function () { return d.wrapper.scrollTop = d.wrapper.scrollLeft = 0; });\n\n    d.dragFunctions = {\n      enter: function (e) {if (!signalDOMEvent(cm, e)) { e_stop(e); }},\n      over: function (e) {if (!signalDOMEvent(cm, e)) { onDragOver(cm, e); e_stop(e); }},\n      start: function (e) { return onDragStart(cm, e); },\n      drop: operation(cm, onDrop),\n      leave: function (e) {if (!signalDOMEvent(cm, e)) { clearDragCursor(cm); }}\n    };\n\n    var inp = d.input.getField();\n    on(inp, \"keyup\", function (e) { return onKeyUp.call(cm, e); });\n    on(inp, \"keydown\", operation(cm, onKeyDown));\n    on(inp, \"keypress\", operation(cm, onKeyPress));\n    on(inp, \"focus\", function (e) { return onFocus(cm, e); });\n    on(inp, \"blur\", function (e) { return onBlur(cm, e); });\n  }\n\n  var initHooks = [];\n  CodeMirror.defineInitHook = function (f) { return initHooks.push(f); };\n\n  // Indent the given line. The how parameter can be \"smart\",\n  // \"add\"/null, \"subtract\", or \"prev\". When aggressive is false\n  // (typically set to true for forced single-line indents), empty\n  // lines are not indented, and places where the mode returns Pass\n  // are left alone.\n  function indentLine(cm, n, how, aggressive) {\n    var doc = cm.doc, state;\n    if (how == null) { how = \"add\"; }\n    if (how == \"smart\") {\n      // Fall back to \"prev\" when the mode doesn't have an indentation\n      // method.\n      if (!doc.mode.indent) { how = \"prev\"; }\n      else { state = getContextBefore(cm, n).state; }\n    }\n\n    var tabSize = cm.options.tabSize;\n    var line = getLine(doc, n), curSpace = countColumn(line.text, null, tabSize);\n    if (line.stateAfter) { line.stateAfter = null; }\n    var curSpaceString = line.text.match(/^\\s*/)[0], indentation;\n    if (!aggressive && !/\\S/.test(line.text)) {\n      indentation = 0;\n      how = \"not\";\n    } else if (how == \"smart\") {\n      indentation = doc.mode.indent(state, line.text.slice(curSpaceString.length), line.text);\n      if (indentation == Pass || indentation > 150) {\n        if (!aggressive) { return }\n        how = \"prev\";\n      }\n    }\n    if (how == \"prev\") {\n      if (n > doc.first) { indentation = countColumn(getLine(doc, n-1).text, null, tabSize); }\n      else { indentation = 0; }\n    } else if (how == \"add\") {\n      indentation = curSpace + cm.options.indentUnit;\n    } else if (how == \"subtract\") {\n      indentation = curSpace - cm.options.indentUnit;\n    } else if (typeof how == \"number\") {\n      indentation = curSpace + how;\n    }\n    indentation = Math.max(0, indentation);\n\n    var indentString = \"\", pos = 0;\n    if (cm.options.indentWithTabs)\n      { for (var i = Math.floor(indentation / tabSize); i; --i) {pos += tabSize; indentString += \"\\t\";} }\n    if (pos < indentation) { indentString += spaceStr(indentation - pos); }\n\n    if (indentString != curSpaceString) {\n      replaceRange(doc, indentString, Pos(n, 0), Pos(n, curSpaceString.length), \"+input\");\n      line.stateAfter = null;\n      return true\n    } else {\n      // Ensure that, if the cursor was in the whitespace at the start\n      // of the line, it is moved to the end of that space.\n      for (var i$1 = 0; i$1 < doc.sel.ranges.length; i$1++) {\n        var range = doc.sel.ranges[i$1];\n        if (range.head.line == n && range.head.ch < curSpaceString.length) {\n          var pos$1 = Pos(n, curSpaceString.length);\n          replaceOneSelection(doc, i$1, new Range(pos$1, pos$1));\n          break\n        }\n      }\n    }\n  }\n\n  // This will be set to a {lineWise: bool, text: [string]} object, so\n  // that, when pasting, we know what kind of selections the copied\n  // text was made out of.\n  var lastCopied = null;\n\n  function setLastCopied(newLastCopied) {\n    lastCopied = newLastCopied;\n  }\n\n  function applyTextInput(cm, inserted, deleted, sel, origin) {\n    var doc = cm.doc;\n    cm.display.shift = false;\n    if (!sel) { sel = doc.sel; }\n\n    var recent = +new Date - 200;\n    var paste = origin == \"paste\" || cm.state.pasteIncoming > recent;\n    var textLines = splitLinesAuto(inserted), multiPaste = null;\n    // When pasting N lines into N selections, insert one line per selection\n    if (paste && sel.ranges.length > 1) {\n      if (lastCopied && lastCopied.text.join(\"\\n\") == inserted) {\n        if (sel.ranges.length % lastCopied.text.length == 0) {\n          multiPaste = [];\n          for (var i = 0; i < lastCopied.text.length; i++)\n            { multiPaste.push(doc.splitLines(lastCopied.text[i])); }\n        }\n      } else if (textLines.length == sel.ranges.length && cm.options.pasteLinesPerSelection) {\n        multiPaste = map(textLines, function (l) { return [l]; });\n      }\n    }\n\n    var updateInput = cm.curOp.updateInput;\n    // Normal behavior is to insert the new text into every selection\n    for (var i$1 = sel.ranges.length - 1; i$1 >= 0; i$1--) {\n      var range = sel.ranges[i$1];\n      var from = range.from(), to = range.to();\n      if (range.empty()) {\n        if (deleted && deleted > 0) // Handle deletion\n          { from = Pos(from.line, from.ch - deleted); }\n        else if (cm.state.overwrite && !paste) // Handle overwrite\n          { to = Pos(to.line, Math.min(getLine(doc, to.line).text.length, to.ch + lst(textLines).length)); }\n        else if (paste && lastCopied && lastCopied.lineWise && lastCopied.text.join(\"\\n\") == textLines.join(\"\\n\"))\n          { from = to = Pos(from.line, 0); }\n      }\n      var changeEvent = {from: from, to: to, text: multiPaste ? multiPaste[i$1 % multiPaste.length] : textLines,\n                         origin: origin || (paste ? \"paste\" : cm.state.cutIncoming > recent ? \"cut\" : \"+input\")};\n      makeChange(cm.doc, changeEvent);\n      signalLater(cm, \"inputRead\", cm, changeEvent);\n    }\n    if (inserted && !paste)\n      { triggerElectric(cm, inserted); }\n\n    ensureCursorVisible(cm);\n    if (cm.curOp.updateInput < 2) { cm.curOp.updateInput = updateInput; }\n    cm.curOp.typing = true;\n    cm.state.pasteIncoming = cm.state.cutIncoming = -1;\n  }\n\n  function handlePaste(e, cm) {\n    var pasted = e.clipboardData && e.clipboardData.getData(\"Text\");\n    if (pasted) {\n      e.preventDefault();\n      if (!cm.isReadOnly() && !cm.options.disableInput && cm.hasFocus())\n        { runInOp(cm, function () { return applyTextInput(cm, pasted, 0, null, \"paste\"); }); }\n      return true\n    }\n  }\n\n  function triggerElectric(cm, inserted) {\n    // When an 'electric' character is inserted, immediately trigger a reindent\n    if (!cm.options.electricChars || !cm.options.smartIndent) { return }\n    var sel = cm.doc.sel;\n\n    for (var i = sel.ranges.length - 1; i >= 0; i--) {\n      var range = sel.ranges[i];\n      if (range.head.ch > 100 || (i && sel.ranges[i - 1].head.line == range.head.line)) { continue }\n      var mode = cm.getModeAt(range.head);\n      var indented = false;\n      if (mode.electricChars) {\n        for (var j = 0; j < mode.electricChars.length; j++)\n          { if (inserted.indexOf(mode.electricChars.charAt(j)) > -1) {\n            indented = indentLine(cm, range.head.line, \"smart\");\n            break\n          } }\n      } else if (mode.electricInput) {\n        if (mode.electricInput.test(getLine(cm.doc, range.head.line).text.slice(0, range.head.ch)))\n          { indented = indentLine(cm, range.head.line, \"smart\"); }\n      }\n      if (indented) { signalLater(cm, \"electricInput\", cm, range.head.line); }\n    }\n  }\n\n  function copyableRanges(cm) {\n    var text = [], ranges = [];\n    for (var i = 0; i < cm.doc.sel.ranges.length; i++) {\n      var line = cm.doc.sel.ranges[i].head.line;\n      var lineRange = {anchor: Pos(line, 0), head: Pos(line + 1, 0)};\n      ranges.push(lineRange);\n      text.push(cm.getRange(lineRange.anchor, lineRange.head));\n    }\n    return {text: text, ranges: ranges}\n  }\n\n  function disableBrowserMagic(field, spellcheck, autocorrect, autocapitalize) {\n    field.setAttribute(\"autocorrect\", autocorrect ? \"on\" : \"off\");\n    field.setAttribute(\"autocapitalize\", autocapitalize ? \"on\" : \"off\");\n    field.setAttribute(\"spellcheck\", !!spellcheck);\n  }\n\n  function hiddenTextarea() {\n    var te = elt(\"textarea\", null, null, \"position: absolute; bottom: -1em; padding: 0; width: 1px; height: 1em; min-height: 1em; outline: none\");\n    var div = elt(\"div\", [te], null, \"overflow: hidden; position: relative; width: 3px; height: 0px;\");\n    // The textarea is kept positioned near the cursor to prevent the\n    // fact that it'll be scrolled into view on input from scrolling\n    // our fake cursor out of view. On webkit, when wrap=off, paste is\n    // very slow. So make the area wide instead.\n    if (webkit) { te.style.width = \"1000px\"; }\n    else { te.setAttribute(\"wrap\", \"off\"); }\n    // If border: 0; -- iOS fails to open keyboard (issue #1287)\n    if (ios) { te.style.border = \"1px solid black\"; }\n    return div\n  }\n\n  // The publicly visible API. Note that methodOp(f) means\n  // 'wrap f in an operation, performed on its `this` parameter'.\n\n  // This is not the complete set of editor methods. Most of the\n  // methods defined on the Doc type are also injected into\n  // CodeMirror.prototype, for backwards compatibility and\n  // convenience.\n\n  function addEditorMethods(CodeMirror) {\n    var optionHandlers = CodeMirror.optionHandlers;\n\n    var helpers = CodeMirror.helpers = {};\n\n    CodeMirror.prototype = {\n      constructor: CodeMirror,\n      focus: function(){win(this).focus(); this.display.input.focus();},\n\n      setOption: function(option, value) {\n        var options = this.options, old = options[option];\n        if (options[option] == value && option != \"mode\") { return }\n        options[option] = value;\n        if (optionHandlers.hasOwnProperty(option))\n          { operation(this, optionHandlers[option])(this, value, old); }\n        signal(this, \"optionChange\", this, option);\n      },\n\n      getOption: function(option) {return this.options[option]},\n      getDoc: function() {return this.doc},\n\n      addKeyMap: function(map, bottom) {\n        this.state.keyMaps[bottom ? \"push\" : \"unshift\"](getKeyMap(map));\n      },\n      removeKeyMap: function(map) {\n        var maps = this.state.keyMaps;\n        for (var i = 0; i < maps.length; ++i)\n          { if (maps[i] == map || maps[i].name == map) {\n            maps.splice(i, 1);\n            return true\n          } }\n      },\n\n      addOverlay: methodOp(function(spec, options) {\n        var mode = spec.token ? spec : CodeMirror.getMode(this.options, spec);\n        if (mode.startState) { throw new Error(\"Overlays may not be stateful.\") }\n        insertSorted(this.state.overlays,\n                     {mode: mode, modeSpec: spec, opaque: options && options.opaque,\n                      priority: (options && options.priority) || 0},\n                     function (overlay) { return overlay.priority; });\n        this.state.modeGen++;\n        regChange(this);\n      }),\n      removeOverlay: methodOp(function(spec) {\n        var overlays = this.state.overlays;\n        for (var i = 0; i < overlays.length; ++i) {\n          var cur = overlays[i].modeSpec;\n          if (cur == spec || typeof spec == \"string\" && cur.name == spec) {\n            overlays.splice(i, 1);\n            this.state.modeGen++;\n            regChange(this);\n            return\n          }\n        }\n      }),\n\n      indentLine: methodOp(function(n, dir, aggressive) {\n        if (typeof dir != \"string\" && typeof dir != \"number\") {\n          if (dir == null) { dir = this.options.smartIndent ? \"smart\" : \"prev\"; }\n          else { dir = dir ? \"add\" : \"subtract\"; }\n        }\n        if (isLine(this.doc, n)) { indentLine(this, n, dir, aggressive); }\n      }),\n      indentSelection: methodOp(function(how) {\n        var ranges = this.doc.sel.ranges, end = -1;\n        for (var i = 0; i < ranges.length; i++) {\n          var range = ranges[i];\n          if (!range.empty()) {\n            var from = range.from(), to = range.to();\n            var start = Math.max(end, from.line);\n            end = Math.min(this.lastLine(), to.line - (to.ch ? 0 : 1)) + 1;\n            for (var j = start; j < end; ++j)\n              { indentLine(this, j, how); }\n            var newRanges = this.doc.sel.ranges;\n            if (from.ch == 0 && ranges.length == newRanges.length && newRanges[i].from().ch > 0)\n              { replaceOneSelection(this.doc, i, new Range(from, newRanges[i].to()), sel_dontScroll); }\n          } else if (range.head.line > end) {\n            indentLine(this, range.head.line, how, true);\n            end = range.head.line;\n            if (i == this.doc.sel.primIndex) { ensureCursorVisible(this); }\n          }\n        }\n      }),\n\n      // Fetch the parser token for a given character. Useful for hacks\n      // that want to inspect the mode state (say, for completion).\n      getTokenAt: function(pos, precise) {\n        return takeToken(this, pos, precise)\n      },\n\n      getLineTokens: function(line, precise) {\n        return takeToken(this, Pos(line), precise, true)\n      },\n\n      getTokenTypeAt: function(pos) {\n        pos = clipPos(this.doc, pos);\n        var styles = getLineStyles(this, getLine(this.doc, pos.line));\n        var before = 0, after = (styles.length - 1) / 2, ch = pos.ch;\n        var type;\n        if (ch == 0) { type = styles[2]; }\n        else { for (;;) {\n          var mid = (before + after) >> 1;\n          if ((mid ? styles[mid * 2 - 1] : 0) >= ch) { after = mid; }\n          else if (styles[mid * 2 + 1] < ch) { before = mid + 1; }\n          else { type = styles[mid * 2 + 2]; break }\n        } }\n        var cut = type ? type.indexOf(\"overlay \") : -1;\n        return cut < 0 ? type : cut == 0 ? null : type.slice(0, cut - 1)\n      },\n\n      getModeAt: function(pos) {\n        var mode = this.doc.mode;\n        if (!mode.innerMode) { return mode }\n        return CodeMirror.innerMode(mode, this.getTokenAt(pos).state).mode\n      },\n\n      getHelper: function(pos, type) {\n        return this.getHelpers(pos, type)[0]\n      },\n\n      getHelpers: function(pos, type) {\n        var found = [];\n        if (!helpers.hasOwnProperty(type)) { return found }\n        var help = helpers[type], mode = this.getModeAt(pos);\n        if (typeof mode[type] == \"string\") {\n          if (help[mode[type]]) { found.push(help[mode[type]]); }\n        } else if (mode[type]) {\n          for (var i = 0; i < mode[type].length; i++) {\n            var val = help[mode[type][i]];\n            if (val) { found.push(val); }\n          }\n        } else if (mode.helperType && help[mode.helperType]) {\n          found.push(help[mode.helperType]);\n        } else if (help[mode.name]) {\n          found.push(help[mode.name]);\n        }\n        for (var i$1 = 0; i$1 < help._global.length; i$1++) {\n          var cur = help._global[i$1];\n          if (cur.pred(mode, this) && indexOf(found, cur.val) == -1)\n            { found.push(cur.val); }\n        }\n        return found\n      },\n\n      getStateAfter: function(line, precise) {\n        var doc = this.doc;\n        line = clipLine(doc, line == null ? doc.first + doc.size - 1: line);\n        return getContextBefore(this, line + 1, precise).state\n      },\n\n      cursorCoords: function(start, mode) {\n        var pos, range = this.doc.sel.primary();\n        if (start == null) { pos = range.head; }\n        else if (typeof start == \"object\") { pos = clipPos(this.doc, start); }\n        else { pos = start ? range.from() : range.to(); }\n        return cursorCoords(this, pos, mode || \"page\")\n      },\n\n      charCoords: function(pos, mode) {\n        return charCoords(this, clipPos(this.doc, pos), mode || \"page\")\n      },\n\n      coordsChar: function(coords, mode) {\n        coords = fromCoordSystem(this, coords, mode || \"page\");\n        return coordsChar(this, coords.left, coords.top)\n      },\n\n      lineAtHeight: function(height, mode) {\n        height = fromCoordSystem(this, {top: height, left: 0}, mode || \"page\").top;\n        return lineAtHeight(this.doc, height + this.display.viewOffset)\n      },\n      heightAtLine: function(line, mode, includeWidgets) {\n        var end = false, lineObj;\n        if (typeof line == \"number\") {\n          var last = this.doc.first + this.doc.size - 1;\n          if (line < this.doc.first) { line = this.doc.first; }\n          else if (line > last) { line = last; end = true; }\n          lineObj = getLine(this.doc, line);\n        } else {\n          lineObj = line;\n        }\n        return intoCoordSystem(this, lineObj, {top: 0, left: 0}, mode || \"page\", includeWidgets || end).top +\n          (end ? this.doc.height - heightAtLine(lineObj) : 0)\n      },\n\n      defaultTextHeight: function() { return textHeight(this.display) },\n      defaultCharWidth: function() { return charWidth(this.display) },\n\n      getViewport: function() { return {from: this.display.viewFrom, to: this.display.viewTo}},\n\n      addWidget: function(pos, node, scroll, vert, horiz) {\n        var display = this.display;\n        pos = cursorCoords(this, clipPos(this.doc, pos));\n        var top = pos.bottom, left = pos.left;\n        node.style.position = \"absolute\";\n        node.setAttribute(\"cm-ignore-events\", \"true\");\n        this.display.input.setUneditable(node);\n        display.sizer.appendChild(node);\n        if (vert == \"over\") {\n          top = pos.top;\n        } else if (vert == \"above\" || vert == \"near\") {\n          var vspace = Math.max(display.wrapper.clientHeight, this.doc.height),\n          hspace = Math.max(display.sizer.clientWidth, display.lineSpace.clientWidth);\n          // Default to positioning above (if specified and possible); otherwise default to positioning below\n          if ((vert == 'above' || pos.bottom + node.offsetHeight > vspace) && pos.top > node.offsetHeight)\n            { top = pos.top - node.offsetHeight; }\n          else if (pos.bottom + node.offsetHeight <= vspace)\n            { top = pos.bottom; }\n          if (left + node.offsetWidth > hspace)\n            { left = hspace - node.offsetWidth; }\n        }\n        node.style.top = top + \"px\";\n        node.style.left = node.style.right = \"\";\n        if (horiz == \"right\") {\n          left = display.sizer.clientWidth - node.offsetWidth;\n          node.style.right = \"0px\";\n        } else {\n          if (horiz == \"left\") { left = 0; }\n          else if (horiz == \"middle\") { left = (display.sizer.clientWidth - node.offsetWidth) / 2; }\n          node.style.left = left + \"px\";\n        }\n        if (scroll)\n          { scrollIntoView(this, {left: left, top: top, right: left + node.offsetWidth, bottom: top + node.offsetHeight}); }\n      },\n\n      triggerOnKeyDown: methodOp(onKeyDown),\n      triggerOnKeyPress: methodOp(onKeyPress),\n      triggerOnKeyUp: onKeyUp,\n      triggerOnMouseDown: methodOp(onMouseDown),\n\n      execCommand: function(cmd) {\n        if (commands.hasOwnProperty(cmd))\n          { return commands[cmd].call(null, this) }\n      },\n\n      triggerElectric: methodOp(function(text) { triggerElectric(this, text); }),\n\n      findPosH: function(from, amount, unit, visually) {\n        var dir = 1;\n        if (amount < 0) { dir = -1; amount = -amount; }\n        var cur = clipPos(this.doc, from);\n        for (var i = 0; i < amount; ++i) {\n          cur = findPosH(this.doc, cur, dir, unit, visually);\n          if (cur.hitSide) { break }\n        }\n        return cur\n      },\n\n      moveH: methodOp(function(dir, unit) {\n        var this$1 = this;\n\n        this.extendSelectionsBy(function (range) {\n          if (this$1.display.shift || this$1.doc.extend || range.empty())\n            { return findPosH(this$1.doc, range.head, dir, unit, this$1.options.rtlMoveVisually) }\n          else\n            { return dir < 0 ? range.from() : range.to() }\n        }, sel_move);\n      }),\n\n      deleteH: methodOp(function(dir, unit) {\n        var sel = this.doc.sel, doc = this.doc;\n        if (sel.somethingSelected())\n          { doc.replaceSelection(\"\", null, \"+delete\"); }\n        else\n          { deleteNearSelection(this, function (range) {\n            var other = findPosH(doc, range.head, dir, unit, false);\n            return dir < 0 ? {from: other, to: range.head} : {from: range.head, to: other}\n          }); }\n      }),\n\n      findPosV: function(from, amount, unit, goalColumn) {\n        var dir = 1, x = goalColumn;\n        if (amount < 0) { dir = -1; amount = -amount; }\n        var cur = clipPos(this.doc, from);\n        for (var i = 0; i < amount; ++i) {\n          var coords = cursorCoords(this, cur, \"div\");\n          if (x == null) { x = coords.left; }\n          else { coords.left = x; }\n          cur = findPosV(this, coords, dir, unit);\n          if (cur.hitSide) { break }\n        }\n        return cur\n      },\n\n      moveV: methodOp(function(dir, unit) {\n        var this$1 = this;\n\n        var doc = this.doc, goals = [];\n        var collapse = !this.display.shift && !doc.extend && doc.sel.somethingSelected();\n        doc.extendSelectionsBy(function (range) {\n          if (collapse)\n            { return dir < 0 ? range.from() : range.to() }\n          var headPos = cursorCoords(this$1, range.head, \"div\");\n          if (range.goalColumn != null) { headPos.left = range.goalColumn; }\n          goals.push(headPos.left);\n          var pos = findPosV(this$1, headPos, dir, unit);\n          if (unit == \"page\" && range == doc.sel.primary())\n            { addToScrollTop(this$1, charCoords(this$1, pos, \"div\").top - headPos.top); }\n          return pos\n        }, sel_move);\n        if (goals.length) { for (var i = 0; i < doc.sel.ranges.length; i++)\n          { doc.sel.ranges[i].goalColumn = goals[i]; } }\n      }),\n\n      // Find the word at the given position (as returned by coordsChar).\n      findWordAt: function(pos) {\n        var doc = this.doc, line = getLine(doc, pos.line).text;\n        var start = pos.ch, end = pos.ch;\n        if (line) {\n          var helper = this.getHelper(pos, \"wordChars\");\n          if ((pos.sticky == \"before\" || end == line.length) && start) { --start; } else { ++end; }\n          var startChar = line.charAt(start);\n          var check = isWordChar(startChar, helper)\n            ? function (ch) { return isWordChar(ch, helper); }\n            : /\\s/.test(startChar) ? function (ch) { return /\\s/.test(ch); }\n            : function (ch) { return (!/\\s/.test(ch) && !isWordChar(ch)); };\n          while (start > 0 && check(line.charAt(start - 1))) { --start; }\n          while (end < line.length && check(line.charAt(end))) { ++end; }\n        }\n        return new Range(Pos(pos.line, start), Pos(pos.line, end))\n      },\n\n      toggleOverwrite: function(value) {\n        if (value != null && value == this.state.overwrite) { return }\n        if (this.state.overwrite = !this.state.overwrite)\n          { addClass(this.display.cursorDiv, \"CodeMirror-overwrite\"); }\n        else\n          { rmClass(this.display.cursorDiv, \"CodeMirror-overwrite\"); }\n\n        signal(this, \"overwriteToggle\", this, this.state.overwrite);\n      },\n      hasFocus: function() { return this.display.input.getField() == activeElt(root(this)) },\n      isReadOnly: function() { return !!(this.options.readOnly || this.doc.cantEdit) },\n\n      scrollTo: methodOp(function (x, y) { scrollToCoords(this, x, y); }),\n      getScrollInfo: function() {\n        var scroller = this.display.scroller;\n        return {left: scroller.scrollLeft, top: scroller.scrollTop,\n                height: scroller.scrollHeight - scrollGap(this) - this.display.barHeight,\n                width: scroller.scrollWidth - scrollGap(this) - this.display.barWidth,\n                clientHeight: displayHeight(this), clientWidth: displayWidth(this)}\n      },\n\n      scrollIntoView: methodOp(function(range, margin) {\n        if (range == null) {\n          range = {from: this.doc.sel.primary().head, to: null};\n          if (margin == null) { margin = this.options.cursorScrollMargin; }\n        } else if (typeof range == \"number\") {\n          range = {from: Pos(range, 0), to: null};\n        } else if (range.from == null) {\n          range = {from: range, to: null};\n        }\n        if (!range.to) { range.to = range.from; }\n        range.margin = margin || 0;\n\n        if (range.from.line != null) {\n          scrollToRange(this, range);\n        } else {\n          scrollToCoordsRange(this, range.from, range.to, range.margin);\n        }\n      }),\n\n      setSize: methodOp(function(width, height) {\n        var this$1 = this;\n\n        var interpret = function (val) { return typeof val == \"number\" || /^\\d+$/.test(String(val)) ? val + \"px\" : val; };\n        if (width != null) { this.display.wrapper.style.width = interpret(width); }\n        if (height != null) { this.display.wrapper.style.height = interpret(height); }\n        if (this.options.lineWrapping) { clearLineMeasurementCache(this); }\n        var lineNo = this.display.viewFrom;\n        this.doc.iter(lineNo, this.display.viewTo, function (line) {\n          if (line.widgets) { for (var i = 0; i < line.widgets.length; i++)\n            { if (line.widgets[i].noHScroll) { regLineChange(this$1, lineNo, \"widget\"); break } } }\n          ++lineNo;\n        });\n        this.curOp.forceUpdate = true;\n        signal(this, \"refresh\", this);\n      }),\n\n      operation: function(f){return runInOp(this, f)},\n      startOperation: function(){return startOperation(this)},\n      endOperation: function(){return endOperation(this)},\n\n      refresh: methodOp(function() {\n        var oldHeight = this.display.cachedTextHeight;\n        regChange(this);\n        this.curOp.forceUpdate = true;\n        clearCaches(this);\n        scrollToCoords(this, this.doc.scrollLeft, this.doc.scrollTop);\n        updateGutterSpace(this.display);\n        if (oldHeight == null || Math.abs(oldHeight - textHeight(this.display)) > .5 || this.options.lineWrapping)\n          { estimateLineHeights(this); }\n        signal(this, \"refresh\", this);\n      }),\n\n      swapDoc: methodOp(function(doc) {\n        var old = this.doc;\n        old.cm = null;\n        // Cancel the current text selection if any (#5821)\n        if (this.state.selectingText) { this.state.selectingText(); }\n        attachDoc(this, doc);\n        clearCaches(this);\n        this.display.input.reset();\n        scrollToCoords(this, doc.scrollLeft, doc.scrollTop);\n        this.curOp.forceScroll = true;\n        signalLater(this, \"swapDoc\", this, old);\n        return old\n      }),\n\n      phrase: function(phraseText) {\n        var phrases = this.options.phrases;\n        return phrases && Object.prototype.hasOwnProperty.call(phrases, phraseText) ? phrases[phraseText] : phraseText\n      },\n\n      getInputField: function(){return this.display.input.getField()},\n      getWrapperElement: function(){return this.display.wrapper},\n      getScrollerElement: function(){return this.display.scroller},\n      getGutterElement: function(){return this.display.gutters}\n    };\n    eventMixin(CodeMirror);\n\n    CodeMirror.registerHelper = function(type, name, value) {\n      if (!helpers.hasOwnProperty(type)) { helpers[type] = CodeMirror[type] = {_global: []}; }\n      helpers[type][name] = value;\n    };\n    CodeMirror.registerGlobalHelper = function(type, name, predicate, value) {\n      CodeMirror.registerHelper(type, name, value);\n      helpers[type]._global.push({pred: predicate, val: value});\n    };\n  }\n\n  // Used for horizontal relative motion. Dir is -1 or 1 (left or\n  // right), unit can be \"codepoint\", \"char\", \"column\" (like char, but\n  // doesn't cross line boundaries), \"word\" (across next word), or\n  // \"group\" (to the start of next group of word or\n  // non-word-non-whitespace chars). The visually param controls\n  // whether, in right-to-left text, direction 1 means to move towards\n  // the next index in the string, or towards the character to the right\n  // of the current position. The resulting position will have a\n  // hitSide=true property if it reached the end of the document.\n  function findPosH(doc, pos, dir, unit, visually) {\n    var oldPos = pos;\n    var origDir = dir;\n    var lineObj = getLine(doc, pos.line);\n    var lineDir = visually && doc.direction == \"rtl\" ? -dir : dir;\n    function findNextLine() {\n      var l = pos.line + lineDir;\n      if (l < doc.first || l >= doc.first + doc.size) { return false }\n      pos = new Pos(l, pos.ch, pos.sticky);\n      return lineObj = getLine(doc, l)\n    }\n    function moveOnce(boundToLine) {\n      var next;\n      if (unit == \"codepoint\") {\n        var ch = lineObj.text.charCodeAt(pos.ch + (dir > 0 ? 0 : -1));\n        if (isNaN(ch)) {\n          next = null;\n        } else {\n          var astral = dir > 0 ? ch >= 0xD800 && ch < 0xDC00 : ch >= 0xDC00 && ch < 0xDFFF;\n          next = new Pos(pos.line, Math.max(0, Math.min(lineObj.text.length, pos.ch + dir * (astral ? 2 : 1))), -dir);\n        }\n      } else if (visually) {\n        next = moveVisually(doc.cm, lineObj, pos, dir);\n      } else {\n        next = moveLogically(lineObj, pos, dir);\n      }\n      if (next == null) {\n        if (!boundToLine && findNextLine())\n          { pos = endOfLine(visually, doc.cm, lineObj, pos.line, lineDir); }\n        else\n          { return false }\n      } else {\n        pos = next;\n      }\n      return true\n    }\n\n    if (unit == \"char\" || unit == \"codepoint\") {\n      moveOnce();\n    } else if (unit == \"column\") {\n      moveOnce(true);\n    } else if (unit == \"word\" || unit == \"group\") {\n      var sawType = null, group = unit == \"group\";\n      var helper = doc.cm && doc.cm.getHelper(pos, \"wordChars\");\n      for (var first = true;; first = false) {\n        if (dir < 0 && !moveOnce(!first)) { break }\n        var cur = lineObj.text.charAt(pos.ch) || \"\\n\";\n        var type = isWordChar(cur, helper) ? \"w\"\n          : group && cur == \"\\n\" ? \"n\"\n          : !group || /\\s/.test(cur) ? null\n          : \"p\";\n        if (group && !first && !type) { type = \"s\"; }\n        if (sawType && sawType != type) {\n          if (dir < 0) {dir = 1; moveOnce(); pos.sticky = \"after\";}\n          break\n        }\n\n        if (type) { sawType = type; }\n        if (dir > 0 && !moveOnce(!first)) { break }\n      }\n    }\n    var result = skipAtomic(doc, pos, oldPos, origDir, true);\n    if (equalCursorPos(oldPos, result)) { result.hitSide = true; }\n    return result\n  }\n\n  // For relative vertical movement. Dir may be -1 or 1. Unit can be\n  // \"page\" or \"line\". The resulting position will have a hitSide=true\n  // property if it reached the end of the document.\n  function findPosV(cm, pos, dir, unit) {\n    var doc = cm.doc, x = pos.left, y;\n    if (unit == \"page\") {\n      var pageSize = Math.min(cm.display.wrapper.clientHeight, win(cm).innerHeight || doc(cm).documentElement.clientHeight);\n      var moveAmount = Math.max(pageSize - .5 * textHeight(cm.display), 3);\n      y = (dir > 0 ? pos.bottom : pos.top) + dir * moveAmount;\n\n    } else if (unit == \"line\") {\n      y = dir > 0 ? pos.bottom + 3 : pos.top - 3;\n    }\n    var target;\n    for (;;) {\n      target = coordsChar(cm, x, y);\n      if (!target.outside) { break }\n      if (dir < 0 ? y <= 0 : y >= doc.height) { target.hitSide = true; break }\n      y += dir * 5;\n    }\n    return target\n  }\n\n  // CONTENTEDITABLE INPUT STYLE\n\n  var ContentEditableInput = function(cm) {\n    this.cm = cm;\n    this.lastAnchorNode = this.lastAnchorOffset = this.lastFocusNode = this.lastFocusOffset = null;\n    this.polling = new Delayed();\n    this.composing = null;\n    this.gracePeriod = false;\n    this.readDOMTimeout = null;\n  };\n\n  ContentEditableInput.prototype.init = function (display) {\n      var this$1 = this;\n\n    var input = this, cm = input.cm;\n    var div = input.div = display.lineDiv;\n    div.contentEditable = true;\n    disableBrowserMagic(div, cm.options.spellcheck, cm.options.autocorrect, cm.options.autocapitalize);\n\n    function belongsToInput(e) {\n      for (var t = e.target; t; t = t.parentNode) {\n        if (t == div) { return true }\n        if (/\\bCodeMirror-(?:line)?widget\\b/.test(t.className)) { break }\n      }\n      return false\n    }\n\n    on(div, \"paste\", function (e) {\n      if (!belongsToInput(e) || signalDOMEvent(cm, e) || handlePaste(e, cm)) { return }\n      // IE doesn't fire input events, so we schedule a read for the pasted content in this way\n      if (ie_version <= 11) { setTimeout(operation(cm, function () { return this$1.updateFromDOM(); }), 20); }\n    });\n\n    on(div, \"compositionstart\", function (e) {\n      this$1.composing = {data: e.data, done: false};\n    });\n    on(div, \"compositionupdate\", function (e) {\n      if (!this$1.composing) { this$1.composing = {data: e.data, done: false}; }\n    });\n    on(div, \"compositionend\", function (e) {\n      if (this$1.composing) {\n        if (e.data != this$1.composing.data) { this$1.readFromDOMSoon(); }\n        this$1.composing.done = true;\n      }\n    });\n\n    on(div, \"touchstart\", function () { return input.forceCompositionEnd(); });\n\n    on(div, \"input\", function () {\n      if (!this$1.composing) { this$1.readFromDOMSoon(); }\n    });\n\n    function onCopyCut(e) {\n      if (!belongsToInput(e) || signalDOMEvent(cm, e)) { return }\n      if (cm.somethingSelected()) {\n        setLastCopied({lineWise: false, text: cm.getSelections()});\n        if (e.type == \"cut\") { cm.replaceSelection(\"\", null, \"cut\"); }\n      } else if (!cm.options.lineWiseCopyCut) {\n        return\n      } else {\n        var ranges = copyableRanges(cm);\n        setLastCopied({lineWise: true, text: ranges.text});\n        if (e.type == \"cut\") {\n          cm.operation(function () {\n            cm.setSelections(ranges.ranges, 0, sel_dontScroll);\n            cm.replaceSelection(\"\", null, \"cut\");\n          });\n        }\n      }\n      if (e.clipboardData) {\n        e.clipboardData.clearData();\n        var content = lastCopied.text.join(\"\\n\");\n        // iOS exposes the clipboard API, but seems to discard content inserted into it\n        e.clipboardData.setData(\"Text\", content);\n        if (e.clipboardData.getData(\"Text\") == content) {\n          e.preventDefault();\n          return\n        }\n      }\n      // Old-fashioned briefly-focus-a-textarea hack\n      var kludge = hiddenTextarea(), te = kludge.firstChild;\n      disableBrowserMagic(te);\n      cm.display.lineSpace.insertBefore(kludge, cm.display.lineSpace.firstChild);\n      te.value = lastCopied.text.join(\"\\n\");\n      var hadFocus = activeElt(rootNode(div));\n      selectInput(te);\n      setTimeout(function () {\n        cm.display.lineSpace.removeChild(kludge);\n        hadFocus.focus();\n        if (hadFocus == div) { input.showPrimarySelection(); }\n      }, 50);\n    }\n    on(div, \"copy\", onCopyCut);\n    on(div, \"cut\", onCopyCut);\n  };\n\n  ContentEditableInput.prototype.screenReaderLabelChanged = function (label) {\n    // Label for screenreaders, accessibility\n    if(label) {\n      this.div.setAttribute('aria-label', label);\n    } else {\n      this.div.removeAttribute('aria-label');\n    }\n  };\n\n  ContentEditableInput.prototype.prepareSelection = function () {\n    var result = prepareSelection(this.cm, false);\n    result.focus = activeElt(rootNode(this.div)) == this.div;\n    return result\n  };\n\n  ContentEditableInput.prototype.showSelection = function (info, takeFocus) {\n    if (!info || !this.cm.display.view.length) { return }\n    if (info.focus || takeFocus) { this.showPrimarySelection(); }\n    this.showMultipleSelections(info);\n  };\n\n  ContentEditableInput.prototype.getSelection = function () {\n    return this.cm.display.wrapper.ownerDocument.getSelection()\n  };\n\n  ContentEditableInput.prototype.showPrimarySelection = function () {\n    var sel = this.getSelection(), cm = this.cm, prim = cm.doc.sel.primary();\n    var from = prim.from(), to = prim.to();\n\n    if (cm.display.viewTo == cm.display.viewFrom || from.line >= cm.display.viewTo || to.line < cm.display.viewFrom) {\n      sel.removeAllRanges();\n      return\n    }\n\n    var curAnchor = domToPos(cm, sel.anchorNode, sel.anchorOffset);\n    var curFocus = domToPos(cm, sel.focusNode, sel.focusOffset);\n    if (curAnchor && !curAnchor.bad && curFocus && !curFocus.bad &&\n        cmp(minPos(curAnchor, curFocus), from) == 0 &&\n        cmp(maxPos(curAnchor, curFocus), to) == 0)\n      { return }\n\n    var view = cm.display.view;\n    var start = (from.line >= cm.display.viewFrom && posToDOM(cm, from)) ||\n        {node: view[0].measure.map[2], offset: 0};\n    var end = to.line < cm.display.viewTo && posToDOM(cm, to);\n    if (!end) {\n      var measure = view[view.length - 1].measure;\n      var map = measure.maps ? measure.maps[measure.maps.length - 1] : measure.map;\n      end = {node: map[map.length - 1], offset: map[map.length - 2] - map[map.length - 3]};\n    }\n\n    if (!start || !end) {\n      sel.removeAllRanges();\n      return\n    }\n\n    var old = sel.rangeCount && sel.getRangeAt(0), rng;\n    try { rng = range(start.node, start.offset, end.offset, end.node); }\n    catch(e) {} // Our model of the DOM might be outdated, in which case the range we try to set can be impossible\n    if (rng) {\n      if (!gecko && cm.state.focused) {\n        sel.collapse(start.node, start.offset);\n        if (!rng.collapsed) {\n          sel.removeAllRanges();\n          sel.addRange(rng);\n        }\n      } else {\n        sel.removeAllRanges();\n        sel.addRange(rng);\n      }\n      if (old && sel.anchorNode == null) { sel.addRange(old); }\n      else if (gecko) { this.startGracePeriod(); }\n    }\n    this.rememberSelection();\n  };\n\n  ContentEditableInput.prototype.startGracePeriod = function () {\n      var this$1 = this;\n\n    clearTimeout(this.gracePeriod);\n    this.gracePeriod = setTimeout(function () {\n      this$1.gracePeriod = false;\n      if (this$1.selectionChanged())\n        { this$1.cm.operation(function () { return this$1.cm.curOp.selectionChanged = true; }); }\n    }, 20);\n  };\n\n  ContentEditableInput.prototype.showMultipleSelections = function (info) {\n    removeChildrenAndAdd(this.cm.display.cursorDiv, info.cursors);\n    removeChildrenAndAdd(this.cm.display.selectionDiv, info.selection);\n  };\n\n  ContentEditableInput.prototype.rememberSelection = function () {\n    var sel = this.getSelection();\n    this.lastAnchorNode = sel.anchorNode; this.lastAnchorOffset = sel.anchorOffset;\n    this.lastFocusNode = sel.focusNode; this.lastFocusOffset = sel.focusOffset;\n  };\n\n  ContentEditableInput.prototype.selectionInEditor = function () {\n    var sel = this.getSelection();\n    if (!sel.rangeCount) { return false }\n    var node = sel.getRangeAt(0).commonAncestorContainer;\n    return contains(this.div, node)\n  };\n\n  ContentEditableInput.prototype.focus = function () {\n    if (this.cm.options.readOnly != \"nocursor\") {\n      if (!this.selectionInEditor() || activeElt(rootNode(this.div)) != this.div)\n        { this.showSelection(this.prepareSelection(), true); }\n      this.div.focus();\n    }\n  };\n  ContentEditableInput.prototype.blur = function () { this.div.blur(); };\n  ContentEditableInput.prototype.getField = function () { return this.div };\n\n  ContentEditableInput.prototype.supportsTouch = function () { return true };\n\n  ContentEditableInput.prototype.receivedFocus = function () {\n      var this$1 = this;\n\n    var input = this;\n    if (this.selectionInEditor())\n      { setTimeout(function () { return this$1.pollSelection(); }, 20); }\n    else\n      { runInOp(this.cm, function () { return input.cm.curOp.selectionChanged = true; }); }\n\n    function poll() {\n      if (input.cm.state.focused) {\n        input.pollSelection();\n        input.polling.set(input.cm.options.pollInterval, poll);\n      }\n    }\n    this.polling.set(this.cm.options.pollInterval, poll);\n  };\n\n  ContentEditableInput.prototype.selectionChanged = function () {\n    var sel = this.getSelection();\n    return sel.anchorNode != this.lastAnchorNode || sel.anchorOffset != this.lastAnchorOffset ||\n      sel.focusNode != this.lastFocusNode || sel.focusOffset != this.lastFocusOffset\n  };\n\n  ContentEditableInput.prototype.pollSelection = function () {\n    if (this.readDOMTimeout != null || this.gracePeriod || !this.selectionChanged()) { return }\n    var sel = this.getSelection(), cm = this.cm;\n    // On Android Chrome (version 56, at least), backspacing into an\n    // uneditable block element will put the cursor in that element,\n    // and then, because it's not editable, hide the virtual keyboard.\n    // Because Android doesn't allow us to actually detect backspace\n    // presses in a sane way, this code checks for when that happens\n    // and simulates a backspace press in this case.\n    if (android && chrome && this.cm.display.gutterSpecs.length && isInGutter(sel.anchorNode)) {\n      this.cm.triggerOnKeyDown({type: \"keydown\", keyCode: 8, preventDefault: Math.abs});\n      this.blur();\n      this.focus();\n      return\n    }\n    if (this.composing) { return }\n    this.rememberSelection();\n    var anchor = domToPos(cm, sel.anchorNode, sel.anchorOffset);\n    var head = domToPos(cm, sel.focusNode, sel.focusOffset);\n    if (anchor && head) { runInOp(cm, function () {\n      setSelection(cm.doc, simpleSelection(anchor, head), sel_dontScroll);\n      if (anchor.bad || head.bad) { cm.curOp.selectionChanged = true; }\n    }); }\n  };\n\n  ContentEditableInput.prototype.pollContent = function () {\n    if (this.readDOMTimeout != null) {\n      clearTimeout(this.readDOMTimeout);\n      this.readDOMTimeout = null;\n    }\n\n    var cm = this.cm, display = cm.display, sel = cm.doc.sel.primary();\n    var from = sel.from(), to = sel.to();\n    if (from.ch == 0 && from.line > cm.firstLine())\n      { from = Pos(from.line - 1, getLine(cm.doc, from.line - 1).length); }\n    if (to.ch == getLine(cm.doc, to.line).text.length && to.line < cm.lastLine())\n      { to = Pos(to.line + 1, 0); }\n    if (from.line < display.viewFrom || to.line > display.viewTo - 1) { return false }\n\n    var fromIndex, fromLine, fromNode;\n    if (from.line == display.viewFrom || (fromIndex = findViewIndex(cm, from.line)) == 0) {\n      fromLine = lineNo(display.view[0].line);\n      fromNode = display.view[0].node;\n    } else {\n      fromLine = lineNo(display.view[fromIndex].line);\n      fromNode = display.view[fromIndex - 1].node.nextSibling;\n    }\n    var toIndex = findViewIndex(cm, to.line);\n    var toLine, toNode;\n    if (toIndex == display.view.length - 1) {\n      toLine = display.viewTo - 1;\n      toNode = display.lineDiv.lastChild;\n    } else {\n      toLine = lineNo(display.view[toIndex + 1].line) - 1;\n      toNode = display.view[toIndex + 1].node.previousSibling;\n    }\n\n    if (!fromNode) { return false }\n    var newText = cm.doc.splitLines(domTextBetween(cm, fromNode, toNode, fromLine, toLine));\n    var oldText = getBetween(cm.doc, Pos(fromLine, 0), Pos(toLine, getLine(cm.doc, toLine).text.length));\n    while (newText.length > 1 && oldText.length > 1) {\n      if (lst(newText) == lst(oldText)) { newText.pop(); oldText.pop(); toLine--; }\n      else if (newText[0] == oldText[0]) { newText.shift(); oldText.shift(); fromLine++; }\n      else { break }\n    }\n\n    var cutFront = 0, cutEnd = 0;\n    var newTop = newText[0], oldTop = oldText[0], maxCutFront = Math.min(newTop.length, oldTop.length);\n    while (cutFront < maxCutFront && newTop.charCodeAt(cutFront) == oldTop.charCodeAt(cutFront))\n      { ++cutFront; }\n    var newBot = lst(newText), oldBot = lst(oldText);\n    var maxCutEnd = Math.min(newBot.length - (newText.length == 1 ? cutFront : 0),\n                             oldBot.length - (oldText.length == 1 ? cutFront : 0));\n    while (cutEnd < maxCutEnd &&\n           newBot.charCodeAt(newBot.length - cutEnd - 1) == oldBot.charCodeAt(oldBot.length - cutEnd - 1))\n      { ++cutEnd; }\n    // Try to move start of change to start of selection if ambiguous\n    if (newText.length == 1 && oldText.length == 1 && fromLine == from.line) {\n      while (cutFront && cutFront > from.ch &&\n             newBot.charCodeAt(newBot.length - cutEnd - 1) == oldBot.charCodeAt(oldBot.length - cutEnd - 1)) {\n        cutFront--;\n        cutEnd++;\n      }\n    }\n\n    newText[newText.length - 1] = newBot.slice(0, newBot.length - cutEnd).replace(/^\\u200b+/, \"\");\n    newText[0] = newText[0].slice(cutFront).replace(/\\u200b+$/, \"\");\n\n    var chFrom = Pos(fromLine, cutFront);\n    var chTo = Pos(toLine, oldText.length ? lst(oldText).length - cutEnd : 0);\n    if (newText.length > 1 || newText[0] || cmp(chFrom, chTo)) {\n      replaceRange(cm.doc, newText, chFrom, chTo, \"+input\");\n      return true\n    }\n  };\n\n  ContentEditableInput.prototype.ensurePolled = function () {\n    this.forceCompositionEnd();\n  };\n  ContentEditableInput.prototype.reset = function () {\n    this.forceCompositionEnd();\n  };\n  ContentEditableInput.prototype.forceCompositionEnd = function () {\n    if (!this.composing) { return }\n    clearTimeout(this.readDOMTimeout);\n    this.composing = null;\n    this.updateFromDOM();\n    this.div.blur();\n    this.div.focus();\n  };\n  ContentEditableInput.prototype.readFromDOMSoon = function () {\n      var this$1 = this;\n\n    if (this.readDOMTimeout != null) { return }\n    this.readDOMTimeout = setTimeout(function () {\n      this$1.readDOMTimeout = null;\n      if (this$1.composing) {\n        if (this$1.composing.done) { this$1.composing = null; }\n        else { return }\n      }\n      this$1.updateFromDOM();\n    }, 80);\n  };\n\n  ContentEditableInput.prototype.updateFromDOM = function () {\n      var this$1 = this;\n\n    if (this.cm.isReadOnly() || !this.pollContent())\n      { runInOp(this.cm, function () { return regChange(this$1.cm); }); }\n  };\n\n  ContentEditableInput.prototype.setUneditable = function (node) {\n    node.contentEditable = \"false\";\n  };\n\n  ContentEditableInput.prototype.onKeyPress = function (e) {\n    if (e.charCode == 0 || this.composing) { return }\n    e.preventDefault();\n    if (!this.cm.isReadOnly())\n      { operation(this.cm, applyTextInput)(this.cm, String.fromCharCode(e.charCode == null ? e.keyCode : e.charCode), 0); }\n  };\n\n  ContentEditableInput.prototype.readOnlyChanged = function (val) {\n    this.div.contentEditable = String(val != \"nocursor\");\n  };\n\n  ContentEditableInput.prototype.onContextMenu = function () {};\n  ContentEditableInput.prototype.resetPosition = function () {};\n\n  ContentEditableInput.prototype.needsContentAttribute = true;\n\n  function posToDOM(cm, pos) {\n    var view = findViewForLine(cm, pos.line);\n    if (!view || view.hidden) { return null }\n    var line = getLine(cm.doc, pos.line);\n    var info = mapFromLineView(view, line, pos.line);\n\n    var order = getOrder(line, cm.doc.direction), side = \"left\";\n    if (order) {\n      var partPos = getBidiPartAt(order, pos.ch);\n      side = partPos % 2 ? \"right\" : \"left\";\n    }\n    var result = nodeAndOffsetInLineMap(info.map, pos.ch, side);\n    result.offset = result.collapse == \"right\" ? result.end : result.start;\n    return result\n  }\n\n  function isInGutter(node) {\n    for (var scan = node; scan; scan = scan.parentNode)\n      { if (/CodeMirror-gutter-wrapper/.test(scan.className)) { return true } }\n    return false\n  }\n\n  function badPos(pos, bad) { if (bad) { pos.bad = true; } return pos }\n\n  function domTextBetween(cm, from, to, fromLine, toLine) {\n    var text = \"\", closing = false, lineSep = cm.doc.lineSeparator(), extraLinebreak = false;\n    function recognizeMarker(id) { return function (marker) { return marker.id == id; } }\n    function close() {\n      if (closing) {\n        text += lineSep;\n        if (extraLinebreak) { text += lineSep; }\n        closing = extraLinebreak = false;\n      }\n    }\n    function addText(str) {\n      if (str) {\n        close();\n        text += str;\n      }\n    }\n    function walk(node) {\n      if (node.nodeType == 1) {\n        var cmText = node.getAttribute(\"cm-text\");\n        if (cmText) {\n          addText(cmText);\n          return\n        }\n        var markerID = node.getAttribute(\"cm-marker\"), range;\n        if (markerID) {\n          var found = cm.findMarks(Pos(fromLine, 0), Pos(toLine + 1, 0), recognizeMarker(+markerID));\n          if (found.length && (range = found[0].find(0)))\n            { addText(getBetween(cm.doc, range.from, range.to).join(lineSep)); }\n          return\n        }\n        if (node.getAttribute(\"contenteditable\") == \"false\") { return }\n        var isBlock = /^(pre|div|p|li|table|br)$/i.test(node.nodeName);\n        if (!/^br$/i.test(node.nodeName) && node.textContent.length == 0) { return }\n\n        if (isBlock) { close(); }\n        for (var i = 0; i < node.childNodes.length; i++)\n          { walk(node.childNodes[i]); }\n\n        if (/^(pre|p)$/i.test(node.nodeName)) { extraLinebreak = true; }\n        if (isBlock) { closing = true; }\n      } else if (node.nodeType == 3) {\n        addText(node.nodeValue.replace(/\\u200b/g, \"\").replace(/\\u00a0/g, \" \"));\n      }\n    }\n    for (;;) {\n      walk(from);\n      if (from == to) { break }\n      from = from.nextSibling;\n      extraLinebreak = false;\n    }\n    return text\n  }\n\n  function domToPos(cm, node, offset) {\n    var lineNode;\n    if (node == cm.display.lineDiv) {\n      lineNode = cm.display.lineDiv.childNodes[offset];\n      if (!lineNode) { return badPos(cm.clipPos(Pos(cm.display.viewTo - 1)), true) }\n      node = null; offset = 0;\n    } else {\n      for (lineNode = node;; lineNode = lineNode.parentNode) {\n        if (!lineNode || lineNode == cm.display.lineDiv) { return null }\n        if (lineNode.parentNode && lineNode.parentNode == cm.display.lineDiv) { break }\n      }\n    }\n    for (var i = 0; i < cm.display.view.length; i++) {\n      var lineView = cm.display.view[i];\n      if (lineView.node == lineNode)\n        { return locateNodeInLineView(lineView, node, offset) }\n    }\n  }\n\n  function locateNodeInLineView(lineView, node, offset) {\n    var wrapper = lineView.text.firstChild, bad = false;\n    if (!node || !contains(wrapper, node)) { return badPos(Pos(lineNo(lineView.line), 0), true) }\n    if (node == wrapper) {\n      bad = true;\n      node = wrapper.childNodes[offset];\n      offset = 0;\n      if (!node) {\n        var line = lineView.rest ? lst(lineView.rest) : lineView.line;\n        return badPos(Pos(lineNo(line), line.text.length), bad)\n      }\n    }\n\n    var textNode = node.nodeType == 3 ? node : null, topNode = node;\n    if (!textNode && node.childNodes.length == 1 && node.firstChild.nodeType == 3) {\n      textNode = node.firstChild;\n      if (offset) { offset = textNode.nodeValue.length; }\n    }\n    while (topNode.parentNode != wrapper) { topNode = topNode.parentNode; }\n    var measure = lineView.measure, maps = measure.maps;\n\n    function find(textNode, topNode, offset) {\n      for (var i = -1; i < (maps ? maps.length : 0); i++) {\n        var map = i < 0 ? measure.map : maps[i];\n        for (var j = 0; j < map.length; j += 3) {\n          var curNode = map[j + 2];\n          if (curNode == textNode || curNode == topNode) {\n            var line = lineNo(i < 0 ? lineView.line : lineView.rest[i]);\n            var ch = map[j] + offset;\n            if (offset < 0 || curNode != textNode) { ch = map[j + (offset ? 1 : 0)]; }\n            return Pos(line, ch)\n          }\n        }\n      }\n    }\n    var found = find(textNode, topNode, offset);\n    if (found) { return badPos(found, bad) }\n\n    // FIXME this is all really shaky. might handle the few cases it needs to handle, but likely to cause problems\n    for (var after = topNode.nextSibling, dist = textNode ? textNode.nodeValue.length - offset : 0; after; after = after.nextSibling) {\n      found = find(after, after.firstChild, 0);\n      if (found)\n        { return badPos(Pos(found.line, found.ch - dist), bad) }\n      else\n        { dist += after.textContent.length; }\n    }\n    for (var before = topNode.previousSibling, dist$1 = offset; before; before = before.previousSibling) {\n      found = find(before, before.firstChild, -1);\n      if (found)\n        { return badPos(Pos(found.line, found.ch + dist$1), bad) }\n      else\n        { dist$1 += before.textContent.length; }\n    }\n  }\n\n  // TEXTAREA INPUT STYLE\n\n  var TextareaInput = function(cm) {\n    this.cm = cm;\n    // See input.poll and input.reset\n    this.prevInput = \"\";\n\n    // Flag that indicates whether we expect input to appear real soon\n    // now (after some event like 'keypress' or 'input') and are\n    // polling intensively.\n    this.pollingFast = false;\n    // Self-resetting timeout for the poller\n    this.polling = new Delayed();\n    // Used to work around IE issue with selection being forgotten when focus moves away from textarea\n    this.hasSelection = false;\n    this.composing = null;\n    this.resetting = false;\n  };\n\n  TextareaInput.prototype.init = function (display) {\n      var this$1 = this;\n\n    var input = this, cm = this.cm;\n    this.createField(display);\n    var te = this.textarea;\n\n    display.wrapper.insertBefore(this.wrapper, display.wrapper.firstChild);\n\n    // Needed to hide big blue blinking cursor on Mobile Safari (doesn't seem to work in iOS 8 anymore)\n    if (ios) { te.style.width = \"0px\"; }\n\n    on(te, \"input\", function () {\n      if (ie && ie_version >= 9 && this$1.hasSelection) { this$1.hasSelection = null; }\n      input.poll();\n    });\n\n    on(te, \"paste\", function (e) {\n      if (signalDOMEvent(cm, e) || handlePaste(e, cm)) { return }\n\n      cm.state.pasteIncoming = +new Date;\n      input.fastPoll();\n    });\n\n    function prepareCopyCut(e) {\n      if (signalDOMEvent(cm, e)) { return }\n      if (cm.somethingSelected()) {\n        setLastCopied({lineWise: false, text: cm.getSelections()});\n      } else if (!cm.options.lineWiseCopyCut) {\n        return\n      } else {\n        var ranges = copyableRanges(cm);\n        setLastCopied({lineWise: true, text: ranges.text});\n        if (e.type == \"cut\") {\n          cm.setSelections(ranges.ranges, null, sel_dontScroll);\n        } else {\n          input.prevInput = \"\";\n          te.value = ranges.text.join(\"\\n\");\n          selectInput(te);\n        }\n      }\n      if (e.type == \"cut\") { cm.state.cutIncoming = +new Date; }\n    }\n    on(te, \"cut\", prepareCopyCut);\n    on(te, \"copy\", prepareCopyCut);\n\n    on(display.scroller, \"paste\", function (e) {\n      if (eventInWidget(display, e) || signalDOMEvent(cm, e)) { return }\n      if (!te.dispatchEvent) {\n        cm.state.pasteIncoming = +new Date;\n        input.focus();\n        return\n      }\n\n      // Pass the `paste` event to the textarea so it's handled by its event listener.\n      var event = new Event(\"paste\");\n      event.clipboardData = e.clipboardData;\n      te.dispatchEvent(event);\n    });\n\n    // Prevent normal selection in the editor (we handle our own)\n    on(display.lineSpace, \"selectstart\", function (e) {\n      if (!eventInWidget(display, e)) { e_preventDefault(e); }\n    });\n\n    on(te, \"compositionstart\", function () {\n      var start = cm.getCursor(\"from\");\n      if (input.composing) { input.composing.range.clear(); }\n      input.composing = {\n        start: start,\n        range: cm.markText(start, cm.getCursor(\"to\"), {className: \"CodeMirror-composing\"})\n      };\n    });\n    on(te, \"compositionend\", function () {\n      if (input.composing) {\n        input.poll();\n        input.composing.range.clear();\n        input.composing = null;\n      }\n    });\n  };\n\n  TextareaInput.prototype.createField = function (_display) {\n    // Wraps and hides input textarea\n    this.wrapper = hiddenTextarea();\n    // The semihidden textarea that is focused when the editor is\n    // focused, and receives input.\n    this.textarea = this.wrapper.firstChild;\n    var opts = this.cm.options;\n    disableBrowserMagic(this.textarea, opts.spellcheck, opts.autocorrect, opts.autocapitalize);\n  };\n\n  TextareaInput.prototype.screenReaderLabelChanged = function (label) {\n    // Label for screenreaders, accessibility\n    if(label) {\n      this.textarea.setAttribute('aria-label', label);\n    } else {\n      this.textarea.removeAttribute('aria-label');\n    }\n  };\n\n  TextareaInput.prototype.prepareSelection = function () {\n    // Redraw the selection and/or cursor\n    var cm = this.cm, display = cm.display, doc = cm.doc;\n    var result = prepareSelection(cm);\n\n    // Move the hidden textarea near the cursor to prevent scrolling artifacts\n    if (cm.options.moveInputWithCursor) {\n      var headPos = cursorCoords(cm, doc.sel.primary().head, \"div\");\n      var wrapOff = display.wrapper.getBoundingClientRect(), lineOff = display.lineDiv.getBoundingClientRect();\n      result.teTop = Math.max(0, Math.min(display.wrapper.clientHeight - 10,\n                                          headPos.top + lineOff.top - wrapOff.top));\n      result.teLeft = Math.max(0, Math.min(display.wrapper.clientWidth - 10,\n                                           headPos.left + lineOff.left - wrapOff.left));\n    }\n\n    return result\n  };\n\n  TextareaInput.prototype.showSelection = function (drawn) {\n    var cm = this.cm, display = cm.display;\n    removeChildrenAndAdd(display.cursorDiv, drawn.cursors);\n    removeChildrenAndAdd(display.selectionDiv, drawn.selection);\n    if (drawn.teTop != null) {\n      this.wrapper.style.top = drawn.teTop + \"px\";\n      this.wrapper.style.left = drawn.teLeft + \"px\";\n    }\n  };\n\n  // Reset the input to correspond to the selection (or to be empty,\n  // when not typing and nothing is selected)\n  TextareaInput.prototype.reset = function (typing) {\n    if (this.contextMenuPending || this.composing && typing) { return }\n    var cm = this.cm;\n    this.resetting = true;\n    if (cm.somethingSelected()) {\n      this.prevInput = \"\";\n      var content = cm.getSelection();\n      this.textarea.value = content;\n      if (cm.state.focused) { selectInput(this.textarea); }\n      if (ie && ie_version >= 9) { this.hasSelection = content; }\n    } else if (!typing) {\n      this.prevInput = this.textarea.value = \"\";\n      if (ie && ie_version >= 9) { this.hasSelection = null; }\n    }\n    this.resetting = false;\n  };\n\n  TextareaInput.prototype.getField = function () { return this.textarea };\n\n  TextareaInput.prototype.supportsTouch = function () { return false };\n\n  TextareaInput.prototype.focus = function () {\n    if (this.cm.options.readOnly != \"nocursor\" && (!mobile || activeElt(rootNode(this.textarea)) != this.textarea)) {\n      try { this.textarea.focus(); }\n      catch (e) {} // IE8 will throw if the textarea is display: none or not in DOM\n    }\n  };\n\n  TextareaInput.prototype.blur = function () { this.textarea.blur(); };\n\n  TextareaInput.prototype.resetPosition = function () {\n    this.wrapper.style.top = this.wrapper.style.left = 0;\n  };\n\n  TextareaInput.prototype.receivedFocus = function () { this.slowPoll(); };\n\n  // Poll for input changes, using the normal rate of polling. This\n  // runs as long as the editor is focused.\n  TextareaInput.prototype.slowPoll = function () {\n      var this$1 = this;\n\n    if (this.pollingFast) { return }\n    this.polling.set(this.cm.options.pollInterval, function () {\n      this$1.poll();\n      if (this$1.cm.state.focused) { this$1.slowPoll(); }\n    });\n  };\n\n  // When an event has just come in that is likely to add or change\n  // something in the input textarea, we poll faster, to ensure that\n  // the change appears on the screen quickly.\n  TextareaInput.prototype.fastPoll = function () {\n    var missed = false, input = this;\n    input.pollingFast = true;\n    function p() {\n      var changed = input.poll();\n      if (!changed && !missed) {missed = true; input.polling.set(60, p);}\n      else {input.pollingFast = false; input.slowPoll();}\n    }\n    input.polling.set(20, p);\n  };\n\n  // Read input from the textarea, and update the document to match.\n  // When something is selected, it is present in the textarea, and\n  // selected (unless it is huge, in which case a placeholder is\n  // used). When nothing is selected, the cursor sits after previously\n  // seen text (can be empty), which is stored in prevInput (we must\n  // not reset the textarea when typing, because that breaks IME).\n  TextareaInput.prototype.poll = function () {\n      var this$1 = this;\n\n    var cm = this.cm, input = this.textarea, prevInput = this.prevInput;\n    // Since this is called a *lot*, try to bail out as cheaply as\n    // possible when it is clear that nothing happened. hasSelection\n    // will be the case when there is a lot of text in the textarea,\n    // in which case reading its value would be expensive.\n    if (this.contextMenuPending || this.resetting || !cm.state.focused ||\n        (hasSelection(input) && !prevInput && !this.composing) ||\n        cm.isReadOnly() || cm.options.disableInput || cm.state.keySeq)\n      { return false }\n\n    var text = input.value;\n    // If nothing changed, bail.\n    if (text == prevInput && !cm.somethingSelected()) { return false }\n    // Work around nonsensical selection resetting in IE9/10, and\n    // inexplicable appearance of private area unicode characters on\n    // some key combos in Mac (#2689).\n    if (ie && ie_version >= 9 && this.hasSelection === text ||\n        mac && /[\\uf700-\\uf7ff]/.test(text)) {\n      cm.display.input.reset();\n      return false\n    }\n\n    if (cm.doc.sel == cm.display.selForContextMenu) {\n      var first = text.charCodeAt(0);\n      if (first == 0x200b && !prevInput) { prevInput = \"\\u200b\"; }\n      if (first == 0x21da) { this.reset(); return this.cm.execCommand(\"undo\") }\n    }\n    // Find the part of the input that is actually new\n    var same = 0, l = Math.min(prevInput.length, text.length);\n    while (same < l && prevInput.charCodeAt(same) == text.charCodeAt(same)) { ++same; }\n\n    runInOp(cm, function () {\n      applyTextInput(cm, text.slice(same), prevInput.length - same,\n                     null, this$1.composing ? \"*compose\" : null);\n\n      // Don't leave long text in the textarea, since it makes further polling slow\n      if (text.length > 1000 || text.indexOf(\"\\n\") > -1) { input.value = this$1.prevInput = \"\"; }\n      else { this$1.prevInput = text; }\n\n      if (this$1.composing) {\n        this$1.composing.range.clear();\n        this$1.composing.range = cm.markText(this$1.composing.start, cm.getCursor(\"to\"),\n                                           {className: \"CodeMirror-composing\"});\n      }\n    });\n    return true\n  };\n\n  TextareaInput.prototype.ensurePolled = function () {\n    if (this.pollingFast && this.poll()) { this.pollingFast = false; }\n  };\n\n  TextareaInput.prototype.onKeyPress = function () {\n    if (ie && ie_version >= 9) { this.hasSelection = null; }\n    this.fastPoll();\n  };\n\n  TextareaInput.prototype.onContextMenu = function (e) {\n    var input = this, cm = input.cm, display = cm.display, te = input.textarea;\n    if (input.contextMenuPending) { input.contextMenuPending(); }\n    var pos = posFromMouse(cm, e), scrollPos = display.scroller.scrollTop;\n    if (!pos || presto) { return } // Opera is difficult.\n\n    // Reset the current text selection only if the click is done outside of the selection\n    // and 'resetSelectionOnContextMenu' option is true.\n    var reset = cm.options.resetSelectionOnContextMenu;\n    if (reset && cm.doc.sel.contains(pos) == -1)\n      { operation(cm, setSelection)(cm.doc, simpleSelection(pos), sel_dontScroll); }\n\n    var oldCSS = te.style.cssText, oldWrapperCSS = input.wrapper.style.cssText;\n    var wrapperBox = input.wrapper.offsetParent.getBoundingClientRect();\n    input.wrapper.style.cssText = \"position: static\";\n    te.style.cssText = \"position: absolute; width: 30px; height: 30px;\\n      top: \" + (e.clientY - wrapperBox.top - 5) + \"px; left: \" + (e.clientX - wrapperBox.left - 5) + \"px;\\n      z-index: 1000; background: \" + (ie ? \"rgba(255, 255, 255, .05)\" : \"transparent\") + \";\\n      outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);\";\n    var oldScrollY;\n    if (webkit) { oldScrollY = te.ownerDocument.defaultView.scrollY; } // Work around Chrome issue (#2712)\n    display.input.focus();\n    if (webkit) { te.ownerDocument.defaultView.scrollTo(null, oldScrollY); }\n    display.input.reset();\n    // Adds \"Select all\" to context menu in FF\n    if (!cm.somethingSelected()) { te.value = input.prevInput = \" \"; }\n    input.contextMenuPending = rehide;\n    display.selForContextMenu = cm.doc.sel;\n    clearTimeout(display.detectingSelectAll);\n\n    // Select-all will be greyed out if there's nothing to select, so\n    // this adds a zero-width space so that we can later check whether\n    // it got selected.\n    function prepareSelectAllHack() {\n      if (te.selectionStart != null) {\n        var selected = cm.somethingSelected();\n        var extval = \"\\u200b\" + (selected ? te.value : \"\");\n        te.value = \"\\u21da\"; // Used to catch context-menu undo\n        te.value = extval;\n        input.prevInput = selected ? \"\" : \"\\u200b\";\n        te.selectionStart = 1; te.selectionEnd = extval.length;\n        // Re-set this, in case some other handler touched the\n        // selection in the meantime.\n        display.selForContextMenu = cm.doc.sel;\n      }\n    }\n    function rehide() {\n      if (input.contextMenuPending != rehide) { return }\n      input.contextMenuPending = false;\n      input.wrapper.style.cssText = oldWrapperCSS;\n      te.style.cssText = oldCSS;\n      if (ie && ie_version < 9) { display.scrollbars.setScrollTop(display.scroller.scrollTop = scrollPos); }\n\n      // Try to detect the user choosing select-all\n      if (te.selectionStart != null) {\n        if (!ie || (ie && ie_version < 9)) { prepareSelectAllHack(); }\n        var i = 0, poll = function () {\n          if (display.selForContextMenu == cm.doc.sel && te.selectionStart == 0 &&\n              te.selectionEnd > 0 && input.prevInput == \"\\u200b\") {\n            operation(cm, selectAll)(cm);\n          } else if (i++ < 10) {\n            display.detectingSelectAll = setTimeout(poll, 500);\n          } else {\n            display.selForContextMenu = null;\n            display.input.reset();\n          }\n        };\n        display.detectingSelectAll = setTimeout(poll, 200);\n      }\n    }\n\n    if (ie && ie_version >= 9) { prepareSelectAllHack(); }\n    if (captureRightClick) {\n      e_stop(e);\n      var mouseup = function () {\n        off(window, \"mouseup\", mouseup);\n        setTimeout(rehide, 20);\n      };\n      on(window, \"mouseup\", mouseup);\n    } else {\n      setTimeout(rehide, 50);\n    }\n  };\n\n  TextareaInput.prototype.readOnlyChanged = function (val) {\n    if (!val) { this.reset(); }\n    this.textarea.disabled = val == \"nocursor\";\n    this.textarea.readOnly = !!val;\n  };\n\n  TextareaInput.prototype.setUneditable = function () {};\n\n  TextareaInput.prototype.needsContentAttribute = false;\n\n  function fromTextArea(textarea, options) {\n    options = options ? copyObj(options) : {};\n    options.value = textarea.value;\n    if (!options.tabindex && textarea.tabIndex)\n      { options.tabindex = textarea.tabIndex; }\n    if (!options.placeholder && textarea.placeholder)\n      { options.placeholder = textarea.placeholder; }\n    // Set autofocus to true if this textarea is focused, or if it has\n    // autofocus and no other element is focused.\n    if (options.autofocus == null) {\n      var hasFocus = activeElt(rootNode(textarea));\n      options.autofocus = hasFocus == textarea ||\n        textarea.getAttribute(\"autofocus\") != null && hasFocus == document.body;\n    }\n\n    function save() {textarea.value = cm.getValue();}\n\n    var realSubmit;\n    if (textarea.form) {\n      on(textarea.form, \"submit\", save);\n      // Deplorable hack to make the submit method do the right thing.\n      if (!options.leaveSubmitMethodAlone) {\n        var form = textarea.form;\n        realSubmit = form.submit;\n        try {\n          var wrappedSubmit = form.submit = function () {\n            save();\n            form.submit = realSubmit;\n            form.submit();\n            form.submit = wrappedSubmit;\n          };\n        } catch(e) {}\n      }\n    }\n\n    options.finishInit = function (cm) {\n      cm.save = save;\n      cm.getTextArea = function () { return textarea; };\n      cm.toTextArea = function () {\n        cm.toTextArea = isNaN; // Prevent this from being ran twice\n        save();\n        textarea.parentNode.removeChild(cm.getWrapperElement());\n        textarea.style.display = \"\";\n        if (textarea.form) {\n          off(textarea.form, \"submit\", save);\n          if (!options.leaveSubmitMethodAlone && typeof textarea.form.submit == \"function\")\n            { textarea.form.submit = realSubmit; }\n        }\n      };\n    };\n\n    textarea.style.display = \"none\";\n    var cm = CodeMirror(function (node) { return textarea.parentNode.insertBefore(node, textarea.nextSibling); },\n      options);\n    return cm\n  }\n\n  function addLegacyProps(CodeMirror) {\n    CodeMirror.off = off;\n    CodeMirror.on = on;\n    CodeMirror.wheelEventPixels = wheelEventPixels;\n    CodeMirror.Doc = Doc;\n    CodeMirror.splitLines = splitLinesAuto;\n    CodeMirror.countColumn = countColumn;\n    CodeMirror.findColumn = findColumn;\n    CodeMirror.isWordChar = isWordCharBasic;\n    CodeMirror.Pass = Pass;\n    CodeMirror.signal = signal;\n    CodeMirror.Line = Line;\n    CodeMirror.changeEnd = changeEnd;\n    CodeMirror.scrollbarModel = scrollbarModel;\n    CodeMirror.Pos = Pos;\n    CodeMirror.cmpPos = cmp;\n    CodeMirror.modes = modes;\n    CodeMirror.mimeModes = mimeModes;\n    CodeMirror.resolveMode = resolveMode;\n    CodeMirror.getMode = getMode;\n    CodeMirror.modeExtensions = modeExtensions;\n    CodeMirror.extendMode = extendMode;\n    CodeMirror.copyState = copyState;\n    CodeMirror.startState = startState;\n    CodeMirror.innerMode = innerMode;\n    CodeMirror.commands = commands;\n    CodeMirror.keyMap = keyMap;\n    CodeMirror.keyName = keyName;\n    CodeMirror.isModifierKey = isModifierKey;\n    CodeMirror.lookupKey = lookupKey;\n    CodeMirror.normalizeKeyMap = normalizeKeyMap;\n    CodeMirror.StringStream = StringStream;\n    CodeMirror.SharedTextMarker = SharedTextMarker;\n    CodeMirror.TextMarker = TextMarker;\n    CodeMirror.LineWidget = LineWidget;\n    CodeMirror.e_preventDefault = e_preventDefault;\n    CodeMirror.e_stopPropagation = e_stopPropagation;\n    CodeMirror.e_stop = e_stop;\n    CodeMirror.addClass = addClass;\n    CodeMirror.contains = contains;\n    CodeMirror.rmClass = rmClass;\n    CodeMirror.keyNames = keyNames;\n  }\n\n  // EDITOR CONSTRUCTOR\n\n  defineOptions(CodeMirror);\n\n  addEditorMethods(CodeMirror);\n\n  // Set up methods on CodeMirror's prototype to redirect to the editor's document.\n  var dontDelegate = \"iter insert remove copy getEditor constructor\".split(\" \");\n  for (var prop in Doc.prototype) { if (Doc.prototype.hasOwnProperty(prop) && indexOf(dontDelegate, prop) < 0)\n    { CodeMirror.prototype[prop] = (function(method) {\n      return function() {return method.apply(this.doc, arguments)}\n    })(Doc.prototype[prop]); } }\n\n  eventMixin(Doc);\n  CodeMirror.inputStyles = {\"textarea\": TextareaInput, \"contenteditable\": ContentEditableInput};\n\n  // Extra arguments are stored as the mode's dependencies, which is\n  // used by (legacy) mechanisms like loadmode.js to automatically\n  // load a mode. (Preferred mechanism is the require/define calls.)\n  CodeMirror.defineMode = function(name/*, mode, …*/) {\n    if (!CodeMirror.defaults.mode && name != \"null\") { CodeMirror.defaults.mode = name; }\n    defineMode.apply(this, arguments);\n  };\n\n  CodeMirror.defineMIME = defineMIME;\n\n  // Minimal default mode.\n  CodeMirror.defineMode(\"null\", function () { return ({token: function (stream) { return stream.skipToEnd(); }}); });\n  CodeMirror.defineMIME(\"text/plain\", \"null\");\n\n  // EXTENSIONS\n\n  CodeMirror.defineExtension = function (name, func) {\n    CodeMirror.prototype[name] = func;\n  };\n  CodeMirror.defineDocExtension = function (name, func) {\n    Doc.prototype[name] = func;\n  };\n\n  CodeMirror.fromTextArea = fromTextArea;\n\n  addLegacyProps(CodeMirror);\n\n  CodeMirror.version = \"5.65.21\";\n\n  return CodeMirror;\n\n})));\n","// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/5/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"../markdown/markdown\"), require(\"../../addon/mode/overlay\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"../markdown/markdown\", \"../../addon/mode/overlay\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nvar urlRE = /^((?:(?:aaas?|about|acap|adiumxtra|af[ps]|aim|apt|attachment|aw|beshare|bitcoin|bolo|callto|cap|chrome(?:-extension)?|cid|coap|com-eventbrite-attendee|content|crid|cvs|data|dav|dict|dlna-(?:playcontainer|playsingle)|dns|doi|dtn|dvb|ed2k|facetime|feed|file|finger|fish|ftp|geo|gg|git|gizmoproject|go|gopher|gtalk|h323|hcp|https?|iax|icap|icon|im|imap|info|ipn|ipp|irc[6s]?|iris(?:\\.beep|\\.lwz|\\.xpc|\\.xpcs)?|itms|jar|javascript|jms|keyparc|lastfm|ldaps?|magnet|mailto|maps|market|message|mid|mms|ms-help|msnim|msrps?|mtqp|mumble|mupdate|mvn|news|nfs|nih?|nntp|notes|oid|opaquelocktoken|palm|paparazzi|platform|pop|pres|proxy|psyc|query|res(?:ource)?|rmi|rsync|rtmp|rtsp|secondlife|service|session|sftp|sgn|shttp|sieve|sips?|skype|sm[bs]|snmp|soap\\.beeps?|soldat|spotify|ssh|steam|svn|tag|teamspeak|tel(?:net)?|tftp|things|thismessage|tip|tn3270|tv|udp|unreal|urn|ut2004|vemmi|ventrilo|view-source|webcal|wss?|wtai|wyciwyg|xcon(?:-userid)?|xfire|xmlrpc\\.beeps?|xmpp|xri|ymsgr|z39\\.50[rs]?):(?:\\/{1,3}|[a-z0-9%])|www\\d{0,3}[.]|[a-z0-9.\\-]+[.][a-z]{2,4}\\/)(?:[^\\s()<>]|\\([^\\s()<>]*\\))+(?:\\([^\\s()<>]*\\)|[^\\s`*!()\\[\\]{};:'\".,<>?«»“”‘’]))/i\n\nCodeMirror.defineMode(\"gfm\", function(config, modeConfig) {\n  var codeDepth = 0;\n  function blankLine(state) {\n    state.code = false;\n    return null;\n  }\n  var gfmOverlay = {\n    startState: function() {\n      return {\n        code: false,\n        codeBlock: false,\n        ateSpace: false\n      };\n    },\n    copyState: function(s) {\n      return {\n        code: s.code,\n        codeBlock: s.codeBlock,\n        ateSpace: s.ateSpace\n      };\n    },\n    token: function(stream, state) {\n      state.combineTokens = null;\n\n      // Hack to prevent formatting override inside code blocks (block and inline)\n      if (state.codeBlock) {\n        if (stream.match(/^```+/)) {\n          state.codeBlock = false;\n          return null;\n        }\n        stream.skipToEnd();\n        return null;\n      }\n      if (stream.sol()) {\n        state.code = false;\n      }\n      if (stream.sol() && stream.match(/^```+/)) {\n        stream.skipToEnd();\n        state.codeBlock = true;\n        return null;\n      }\n      // If this block is changed, it may need to be updated in Markdown mode\n      if (stream.peek() === '`') {\n        stream.next();\n        var before = stream.pos;\n        stream.eatWhile('`');\n        var difference = 1 + stream.pos - before;\n        if (!state.code) {\n          codeDepth = difference;\n          state.code = true;\n        } else {\n          if (difference === codeDepth) { // Must be exact\n            state.code = false;\n          }\n        }\n        return null;\n      } else if (state.code) {\n        stream.next();\n        return null;\n      }\n      // Check if space. If so, links can be formatted later on\n      if (stream.eatSpace()) {\n        state.ateSpace = true;\n        return null;\n      }\n      if (stream.sol() || state.ateSpace) {\n        state.ateSpace = false;\n        if (modeConfig.gitHubSpice !== false) {\n          if(stream.match(/^(?:[a-zA-Z0-9\\-_]+\\/)?(?:[a-zA-Z0-9\\-_]+@)?(?=.{0,6}\\d)(?:[a-f0-9]{7,40}\\b)/)) {\n            // User/Project@SHA\n            // User@SHA\n            // SHA\n            state.combineTokens = true;\n            return \"link\";\n          } else if (stream.match(/^(?:[a-zA-Z0-9\\-_]+\\/)?(?:[a-zA-Z0-9\\-_]+)?#[0-9]+\\b/)) {\n            // User/Project#Num\n            // User#Num\n            // #Num\n            state.combineTokens = true;\n            return \"link\";\n          }\n        }\n      }\n      if (stream.match(urlRE) &&\n          stream.string.slice(stream.start - 2, stream.start) != \"](\" &&\n          (stream.start == 0 || /\\W/.test(stream.string.charAt(stream.start - 1)))) {\n        // URLs\n        // Taken from http://daringfireball.net/2010/07/improved_regex_for_matching_urls\n        // And then (issue #1160) simplified to make it not crash the Chrome Regexp engine\n        // And then limited url schemes to the CommonMark list, so foo:bar isn't matched as a URL\n        state.combineTokens = true;\n        return \"link\";\n      }\n      stream.next();\n      return null;\n    },\n    blankLine: blankLine\n  };\n\n  var markdownConfig = {\n    taskLists: true,\n    strikethrough: true,\n    emoji: true\n  };\n  for (var attr in modeConfig) {\n    markdownConfig[attr] = modeConfig[attr];\n  }\n  markdownConfig.name = \"markdown\";\n  return CodeMirror.overlayMode(CodeMirror.getMode(config, markdownConfig), gfmOverlay);\n\n}, \"markdown\");\n\n  CodeMirror.defineMIME(\"text/x-gfm\", \"gfm\");\n});\n","// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/5/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"../xml/xml\"), require(\"../meta\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"../xml/xml\", \"../meta\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"markdown\", function(cmCfg, modeCfg) {\n\n  var htmlMode = CodeMirror.getMode(cmCfg, \"text/html\");\n  var htmlModeMissing = htmlMode.name == \"null\"\n\n  function getMode(name) {\n    if (CodeMirror.findModeByName) {\n      var found = CodeMirror.findModeByName(name);\n      if (found) name = found.mime || found.mimes[0];\n    }\n    var mode = CodeMirror.getMode(cmCfg, name);\n    return mode.name == \"null\" ? null : mode;\n  }\n\n  // Should characters that affect highlighting be highlighted separate?\n  // Does not include characters that will be output (such as `1.` and `-` for lists)\n  if (modeCfg.highlightFormatting === undefined)\n    modeCfg.highlightFormatting = false;\n\n  // Maximum number of nested blockquotes. Set to 0 for infinite nesting.\n  // Excess `>` will emit `error` token.\n  if (modeCfg.maxBlockquoteDepth === undefined)\n    modeCfg.maxBlockquoteDepth = 0;\n\n  // Turn on task lists? (\"- [ ] \" and \"- [x] \")\n  if (modeCfg.taskLists === undefined) modeCfg.taskLists = false;\n\n  // Turn on strikethrough syntax\n  if (modeCfg.strikethrough === undefined)\n    modeCfg.strikethrough = false;\n\n  if (modeCfg.emoji === undefined)\n    modeCfg.emoji = false;\n\n  if (modeCfg.fencedCodeBlockHighlighting === undefined)\n    modeCfg.fencedCodeBlockHighlighting = true;\n\n  if (modeCfg.fencedCodeBlockDefaultMode === undefined)\n    modeCfg.fencedCodeBlockDefaultMode = 'text/plain';\n\n  if (modeCfg.xml === undefined)\n    modeCfg.xml = true;\n\n  // Allow token types to be overridden by user-provided token types.\n  if (modeCfg.tokenTypeOverrides === undefined)\n    modeCfg.tokenTypeOverrides = {};\n\n  var tokenTypes = {\n    header: \"header\",\n    code: \"comment\",\n    quote: \"quote\",\n    list1: \"variable-2\",\n    list2: \"variable-3\",\n    list3: \"keyword\",\n    hr: \"hr\",\n    image: \"image\",\n    imageAltText: \"image-alt-text\",\n    imageMarker: \"image-marker\",\n    formatting: \"formatting\",\n    linkInline: \"link\",\n    linkEmail: \"link\",\n    linkText: \"link\",\n    linkHref: \"string\",\n    em: \"em\",\n    strong: \"strong\",\n    strikethrough: \"strikethrough\",\n    emoji: \"builtin\"\n  };\n\n  for (var tokenType in tokenTypes) {\n    if (tokenTypes.hasOwnProperty(tokenType) && modeCfg.tokenTypeOverrides[tokenType]) {\n      tokenTypes[tokenType] = modeCfg.tokenTypeOverrides[tokenType];\n    }\n  }\n\n  var hrRE = /^([*\\-_])(?:\\s*\\1){2,}\\s*$/\n  ,   listRE = /^(?:[*\\-+]|^[0-9]+([.)]))\\s+/\n  ,   taskListRE = /^\\[(x| )\\](?=\\s)/i // Must follow listRE\n  ,   atxHeaderRE = modeCfg.allowAtxHeaderWithoutSpace ? /^(#+)/ : /^(#+)(?: |$)/\n  ,   setextHeaderRE = /^ {0,3}(?:\\={1,}|-{2,})\\s*$/\n  ,   textRE = /^[^#!\\[\\]*_\\\\<>` \"'(~:]+/\n  ,   fencedCodeRE = /^(~~~+|```+)[ \\t]*([\\w\\/+#-]*)[^\\n`]*$/\n  ,   linkDefRE = /^\\s*\\[[^\\]]+?\\]:.*$/ // naive link-definition\n  ,   punctuation = /[!\"#$%&'()*+,\\-.\\/:;<=>?@\\[\\\\\\]^_`{|}~\\xA1\\xA7\\xAB\\xB6\\xB7\\xBB\\xBF\\u037E\\u0387\\u055A-\\u055F\\u0589\\u058A\\u05BE\\u05C0\\u05C3\\u05C6\\u05F3\\u05F4\\u0609\\u060A\\u060C\\u060D\\u061B\\u061E\\u061F\\u066A-\\u066D\\u06D4\\u0700-\\u070D\\u07F7-\\u07F9\\u0830-\\u083E\\u085E\\u0964\\u0965\\u0970\\u0AF0\\u0DF4\\u0E4F\\u0E5A\\u0E5B\\u0F04-\\u0F12\\u0F14\\u0F3A-\\u0F3D\\u0F85\\u0FD0-\\u0FD4\\u0FD9\\u0FDA\\u104A-\\u104F\\u10FB\\u1360-\\u1368\\u1400\\u166D\\u166E\\u169B\\u169C\\u16EB-\\u16ED\\u1735\\u1736\\u17D4-\\u17D6\\u17D8-\\u17DA\\u1800-\\u180A\\u1944\\u1945\\u1A1E\\u1A1F\\u1AA0-\\u1AA6\\u1AA8-\\u1AAD\\u1B5A-\\u1B60\\u1BFC-\\u1BFF\\u1C3B-\\u1C3F\\u1C7E\\u1C7F\\u1CC0-\\u1CC7\\u1CD3\\u2010-\\u2027\\u2030-\\u2043\\u2045-\\u2051\\u2053-\\u205E\\u207D\\u207E\\u208D\\u208E\\u2308-\\u230B\\u2329\\u232A\\u2768-\\u2775\\u27C5\\u27C6\\u27E6-\\u27EF\\u2983-\\u2998\\u29D8-\\u29DB\\u29FC\\u29FD\\u2CF9-\\u2CFC\\u2CFE\\u2CFF\\u2D70\\u2E00-\\u2E2E\\u2E30-\\u2E42\\u3001-\\u3003\\u3008-\\u3011\\u3014-\\u301F\\u3030\\u303D\\u30A0\\u30FB\\uA4FE\\uA4FF\\uA60D-\\uA60F\\uA673\\uA67E\\uA6F2-\\uA6F7\\uA874-\\uA877\\uA8CE\\uA8CF\\uA8F8-\\uA8FA\\uA8FC\\uA92E\\uA92F\\uA95F\\uA9C1-\\uA9CD\\uA9DE\\uA9DF\\uAA5C-\\uAA5F\\uAADE\\uAADF\\uAAF0\\uAAF1\\uABEB\\uFD3E\\uFD3F\\uFE10-\\uFE19\\uFE30-\\uFE52\\uFE54-\\uFE61\\uFE63\\uFE68\\uFE6A\\uFE6B\\uFF01-\\uFF03\\uFF05-\\uFF0A\\uFF0C-\\uFF0F\\uFF1A\\uFF1B\\uFF1F\\uFF20\\uFF3B-\\uFF3D\\uFF3F\\uFF5B\\uFF5D\\uFF5F-\\uFF65]|\\uD800[\\uDD00-\\uDD02\\uDF9F\\uDFD0]|\\uD801\\uDD6F|\\uD802[\\uDC57\\uDD1F\\uDD3F\\uDE50-\\uDE58\\uDE7F\\uDEF0-\\uDEF6\\uDF39-\\uDF3F\\uDF99-\\uDF9C]|\\uD804[\\uDC47-\\uDC4D\\uDCBB\\uDCBC\\uDCBE-\\uDCC1\\uDD40-\\uDD43\\uDD74\\uDD75\\uDDC5-\\uDDC9\\uDDCD\\uDDDB\\uDDDD-\\uDDDF\\uDE38-\\uDE3D\\uDEA9]|\\uD805[\\uDCC6\\uDDC1-\\uDDD7\\uDE41-\\uDE43\\uDF3C-\\uDF3E]|\\uD809[\\uDC70-\\uDC74]|\\uD81A[\\uDE6E\\uDE6F\\uDEF5\\uDF37-\\uDF3B\\uDF44]|\\uD82F\\uDC9F|\\uD836[\\uDE87-\\uDE8B]/\n  ,   expandedTab = \"    \" // CommonMark specifies tab as 4 spaces\n\n  function switchInline(stream, state, f) {\n    state.f = state.inline = f;\n    return f(stream, state);\n  }\n\n  function switchBlock(stream, state, f) {\n    state.f = state.block = f;\n    return f(stream, state);\n  }\n\n  function lineIsEmpty(line) {\n    return !line || !/\\S/.test(line.string)\n  }\n\n  // Blocks\n\n  function blankLine(state) {\n    // Reset linkTitle state\n    state.linkTitle = false;\n    state.linkHref = false;\n    state.linkText = false;\n    // Reset EM state\n    state.em = false;\n    // Reset STRONG state\n    state.strong = false;\n    // Reset strikethrough state\n    state.strikethrough = false;\n    // Reset state.quote\n    state.quote = 0;\n    // Reset state.indentedCode\n    state.indentedCode = false;\n    if (state.f == htmlBlock) {\n      var exit = htmlModeMissing\n      if (!exit) {\n        var inner = CodeMirror.innerMode(htmlMode, state.htmlState)\n        exit = inner.mode.name == \"xml\" && inner.state.tagStart === null &&\n          (!inner.state.context && inner.state.tokenize.isInText)\n      }\n      if (exit) {\n        state.f = inlineNormal;\n        state.block = blockNormal;\n        state.htmlState = null;\n      }\n    }\n    // Reset state.trailingSpace\n    state.trailingSpace = 0;\n    state.trailingSpaceNewLine = false;\n    // Mark this line as blank\n    state.prevLine = state.thisLine\n    state.thisLine = {stream: null}\n    return null;\n  }\n\n  function blockNormal(stream, state) {\n    var firstTokenOnLine = stream.column() === state.indentation;\n    var prevLineLineIsEmpty = lineIsEmpty(state.prevLine.stream);\n    var prevLineIsIndentedCode = state.indentedCode;\n    var prevLineIsHr = state.prevLine.hr;\n    var prevLineIsList = state.list !== false;\n    var maxNonCodeIndentation = (state.listStack[state.listStack.length - 1] || 0) + 3;\n\n    state.indentedCode = false;\n\n    var lineIndentation = state.indentation;\n    // compute once per line (on first token)\n    if (state.indentationDiff === null) {\n      state.indentationDiff = state.indentation;\n      if (prevLineIsList) {\n        state.list = null;\n        // While this list item's marker's indentation is less than the deepest\n        //  list item's content's indentation,pop the deepest list item\n        //  indentation off the stack, and update block indentation state\n        while (lineIndentation < state.listStack[state.listStack.length - 1]) {\n          state.listStack.pop();\n          if (state.listStack.length) {\n            state.indentation = state.listStack[state.listStack.length - 1];\n          // less than the first list's indent -> the line is no longer a list\n          } else {\n            state.list = false;\n          }\n        }\n        if (state.list !== false) {\n          state.indentationDiff = lineIndentation - state.listStack[state.listStack.length - 1]\n        }\n      }\n    }\n\n    // not comprehensive (currently only for setext detection purposes)\n    var allowsInlineContinuation = (\n        !prevLineLineIsEmpty && !prevLineIsHr && !state.prevLine.header &&\n        (!prevLineIsList || !prevLineIsIndentedCode) &&\n        !state.prevLine.fencedCodeEnd\n    );\n\n    var isHr = (state.list === false || prevLineIsHr || prevLineLineIsEmpty) &&\n      state.indentation <= maxNonCodeIndentation && stream.match(hrRE);\n\n    var match = null;\n    if (state.indentationDiff >= 4 && (prevLineIsIndentedCode || state.prevLine.fencedCodeEnd ||\n         state.prevLine.header || prevLineLineIsEmpty)) {\n      stream.skipToEnd();\n      state.indentedCode = true;\n      return tokenTypes.code;\n    } else if (stream.eatSpace()) {\n      return null;\n    } else if (firstTokenOnLine && state.indentation <= maxNonCodeIndentation && (match = stream.match(atxHeaderRE)) && match[1].length <= 6) {\n      state.quote = 0;\n      state.header = match[1].length;\n      state.thisLine.header = true;\n      if (modeCfg.highlightFormatting) state.formatting = \"header\";\n      state.f = state.inline;\n      return getType(state);\n    } else if (state.indentation <= maxNonCodeIndentation && stream.eat('>')) {\n      state.quote = firstTokenOnLine ? 1 : state.quote + 1;\n      if (modeCfg.highlightFormatting) state.formatting = \"quote\";\n      stream.eatSpace();\n      return getType(state);\n    } else if (!isHr && !state.setext && firstTokenOnLine && state.indentation <= maxNonCodeIndentation && (match = stream.match(listRE))) {\n      var listType = match[1] ? \"ol\" : \"ul\";\n\n      state.indentation = lineIndentation + stream.current().length;\n      state.list = true;\n      state.quote = 0;\n\n      // Add this list item's content's indentation to the stack\n      state.listStack.push(state.indentation);\n      // Reset inline styles which shouldn't propagate across list items\n      state.em = false;\n      state.strong = false;\n      state.code = false;\n      state.strikethrough = false;\n\n      if (modeCfg.taskLists && stream.match(taskListRE, false)) {\n        state.taskList = true;\n      }\n      state.f = state.inline;\n      if (modeCfg.highlightFormatting) state.formatting = [\"list\", \"list-\" + listType];\n      return getType(state);\n    } else if (firstTokenOnLine && state.indentation <= maxNonCodeIndentation && (match = stream.match(fencedCodeRE, true))) {\n      state.quote = 0;\n      state.fencedEndRE = new RegExp(match[1] + \"+ *$\");\n      // try switching mode\n      state.localMode = modeCfg.fencedCodeBlockHighlighting && getMode(match[2] || modeCfg.fencedCodeBlockDefaultMode );\n      if (state.localMode) state.localState = CodeMirror.startState(state.localMode);\n      state.f = state.block = local;\n      if (modeCfg.highlightFormatting) state.formatting = \"code-block\";\n      state.code = -1\n      return getType(state);\n    // SETEXT has lowest block-scope precedence after HR, so check it after\n    //  the others (code, blockquote, list...)\n    } else if (\n      // if setext set, indicates line after ---/===\n      state.setext || (\n        // line before ---/===\n        (!allowsInlineContinuation || !prevLineIsList) && !state.quote && state.list === false &&\n        !state.code && !isHr && !linkDefRE.test(stream.string) &&\n        (match = stream.lookAhead(1)) && (match = match.match(setextHeaderRE))\n      )\n    ) {\n      if ( !state.setext ) {\n        state.header = match[0].charAt(0) == '=' ? 1 : 2;\n        state.setext = state.header;\n      } else {\n        state.header = state.setext;\n        // has no effect on type so we can reset it now\n        state.setext = 0;\n        stream.skipToEnd();\n        if (modeCfg.highlightFormatting) state.formatting = \"header\";\n      }\n      state.thisLine.header = true;\n      state.f = state.inline;\n      return getType(state);\n    } else if (isHr) {\n      stream.skipToEnd();\n      state.hr = true;\n      state.thisLine.hr = true;\n      return tokenTypes.hr;\n    } else if (stream.peek() === '[') {\n      return switchInline(stream, state, footnoteLink);\n    }\n\n    return switchInline(stream, state, state.inline);\n  }\n\n  function htmlBlock(stream, state) {\n    var style = htmlMode.token(stream, state.htmlState);\n    if (!htmlModeMissing) {\n      var inner = CodeMirror.innerMode(htmlMode, state.htmlState)\n      if ((inner.mode.name == \"xml\" && inner.state.tagStart === null &&\n           (!inner.state.context && inner.state.tokenize.isInText)) ||\n          (state.md_inside && stream.current().indexOf(\">\") > -1)) {\n        state.f = inlineNormal;\n        state.block = blockNormal;\n        state.htmlState = null;\n      }\n    }\n    return style;\n  }\n\n  function local(stream, state) {\n    var currListInd = state.listStack[state.listStack.length - 1] || 0;\n    var hasExitedList = state.indentation < currListInd;\n    var maxFencedEndInd = currListInd + 3;\n    if (state.fencedEndRE && state.indentation <= maxFencedEndInd && (hasExitedList || stream.match(state.fencedEndRE))) {\n      if (modeCfg.highlightFormatting) state.formatting = \"code-block\";\n      var returnType;\n      if (!hasExitedList) returnType = getType(state)\n      state.localMode = state.localState = null;\n      state.block = blockNormal;\n      state.f = inlineNormal;\n      state.fencedEndRE = null;\n      state.code = 0\n      state.thisLine.fencedCodeEnd = true;\n      if (hasExitedList) return switchBlock(stream, state, state.block);\n      return returnType;\n    } else if (state.localMode) {\n      return state.localMode.token(stream, state.localState);\n    } else {\n      stream.skipToEnd();\n      return tokenTypes.code;\n    }\n  }\n\n  // Inline\n  function getType(state) {\n    var styles = [];\n\n    if (state.formatting) {\n      styles.push(tokenTypes.formatting);\n\n      if (typeof state.formatting === \"string\") state.formatting = [state.formatting];\n\n      for (var i = 0; i < state.formatting.length; i++) {\n        styles.push(tokenTypes.formatting + \"-\" + state.formatting[i]);\n\n        if (state.formatting[i] === \"header\") {\n          styles.push(tokenTypes.formatting + \"-\" + state.formatting[i] + \"-\" + state.header);\n        }\n\n        // Add `formatting-quote` and `formatting-quote-#` for blockquotes\n        // Add `error` instead if the maximum blockquote nesting depth is passed\n        if (state.formatting[i] === \"quote\") {\n          if (!modeCfg.maxBlockquoteDepth || modeCfg.maxBlockquoteDepth >= state.quote) {\n            styles.push(tokenTypes.formatting + \"-\" + state.formatting[i] + \"-\" + state.quote);\n          } else {\n            styles.push(\"error\");\n          }\n        }\n      }\n    }\n\n    if (state.taskOpen) {\n      styles.push(\"meta\");\n      return styles.length ? styles.join(' ') : null;\n    }\n    if (state.taskClosed) {\n      styles.push(\"property\");\n      return styles.length ? styles.join(' ') : null;\n    }\n\n    if (state.linkHref) {\n      styles.push(tokenTypes.linkHref, \"url\");\n    } else { // Only apply inline styles to non-url text\n      if (state.strong) { styles.push(tokenTypes.strong); }\n      if (state.em) { styles.push(tokenTypes.em); }\n      if (state.strikethrough) { styles.push(tokenTypes.strikethrough); }\n      if (state.emoji) { styles.push(tokenTypes.emoji); }\n      if (state.linkText) { styles.push(tokenTypes.linkText); }\n      if (state.code) { styles.push(tokenTypes.code); }\n      if (state.image) { styles.push(tokenTypes.image); }\n      if (state.imageAltText) { styles.push(tokenTypes.imageAltText, \"link\"); }\n      if (state.imageMarker) { styles.push(tokenTypes.imageMarker); }\n    }\n\n    if (state.header) { styles.push(tokenTypes.header, tokenTypes.header + \"-\" + state.header); }\n\n    if (state.quote) {\n      styles.push(tokenTypes.quote);\n\n      // Add `quote-#` where the maximum for `#` is modeCfg.maxBlockquoteDepth\n      if (!modeCfg.maxBlockquoteDepth || modeCfg.maxBlockquoteDepth >= state.quote) {\n        styles.push(tokenTypes.quote + \"-\" + state.quote);\n      } else {\n        styles.push(tokenTypes.quote + \"-\" + modeCfg.maxBlockquoteDepth);\n      }\n    }\n\n    if (state.list !== false) {\n      var listMod = (state.listStack.length - 1) % 3;\n      if (!listMod) {\n        styles.push(tokenTypes.list1);\n      } else if (listMod === 1) {\n        styles.push(tokenTypes.list2);\n      } else {\n        styles.push(tokenTypes.list3);\n      }\n    }\n\n    if (state.trailingSpaceNewLine) {\n      styles.push(\"trailing-space-new-line\");\n    } else if (state.trailingSpace) {\n      styles.push(\"trailing-space-\" + (state.trailingSpace % 2 ? \"a\" : \"b\"));\n    }\n\n    return styles.length ? styles.join(' ') : null;\n  }\n\n  function handleText(stream, state) {\n    if (stream.match(textRE, true)) {\n      return getType(state);\n    }\n    return undefined;\n  }\n\n  function inlineNormal(stream, state) {\n    var style = state.text(stream, state);\n    if (typeof style !== 'undefined')\n      return style;\n\n    if (state.list) { // List marker (*, +, -, 1., etc)\n      state.list = null;\n      return getType(state);\n    }\n\n    if (state.taskList) {\n      var taskOpen = stream.match(taskListRE, true)[1] === \" \";\n      if (taskOpen) state.taskOpen = true;\n      else state.taskClosed = true;\n      if (modeCfg.highlightFormatting) state.formatting = \"task\";\n      state.taskList = false;\n      return getType(state);\n    }\n\n    state.taskOpen = false;\n    state.taskClosed = false;\n\n    if (state.header && stream.match(/^#+$/, true)) {\n      if (modeCfg.highlightFormatting) state.formatting = \"header\";\n      return getType(state);\n    }\n\n    var ch = stream.next();\n\n    // Matches link titles present on next line\n    if (state.linkTitle) {\n      state.linkTitle = false;\n      var matchCh = ch;\n      if (ch === '(') {\n        matchCh = ')';\n      }\n      matchCh = (matchCh+'').replace(/([.?*+^\\[\\]\\\\(){}|-])/g, \"\\\\$1\");\n      var regex = '^\\\\s*(?:[^' + matchCh + '\\\\\\\\]+|\\\\\\\\\\\\\\\\|\\\\\\\\.)' + matchCh;\n      if (stream.match(new RegExp(regex), true)) {\n        return tokenTypes.linkHref;\n      }\n    }\n\n    // If this block is changed, it may need to be updated in GFM mode\n    if (ch === '`') {\n      var previousFormatting = state.formatting;\n      if (modeCfg.highlightFormatting) state.formatting = \"code\";\n      stream.eatWhile('`');\n      var count = stream.current().length\n      if (state.code == 0 && (!state.quote || count == 1)) {\n        state.code = count\n        return getType(state)\n      } else if (count == state.code) { // Must be exact\n        var t = getType(state)\n        state.code = 0\n        return t\n      } else {\n        state.formatting = previousFormatting\n        return getType(state)\n      }\n    } else if (state.code) {\n      return getType(state);\n    }\n\n    if (ch === '\\\\') {\n      stream.next();\n      if (modeCfg.highlightFormatting) {\n        var type = getType(state);\n        var formattingEscape = tokenTypes.formatting + \"-escape\";\n        return type ? type + \" \" + formattingEscape : formattingEscape;\n      }\n    }\n\n    if (ch === '!' && stream.match(/\\[[^\\]]*\\] ?(?:\\(|\\[)/, false)) {\n      state.imageMarker = true;\n      state.image = true;\n      if (modeCfg.highlightFormatting) state.formatting = \"image\";\n      return getType(state);\n    }\n\n    if (ch === '[' && state.imageMarker && stream.match(/[^\\]]*\\](\\(.*?\\)| ?\\[.*?\\])/, false)) {\n      state.imageMarker = false;\n      state.imageAltText = true\n      if (modeCfg.highlightFormatting) state.formatting = \"image\";\n      return getType(state);\n    }\n\n    if (ch === ']' && state.imageAltText) {\n      if (modeCfg.highlightFormatting) state.formatting = \"image\";\n      var type = getType(state);\n      state.imageAltText = false;\n      state.image = false;\n      state.inline = state.f = linkHref;\n      return type;\n    }\n\n    if (ch === '[' && !state.image) {\n      if (state.linkText && stream.match(/^.*?\\]/)) return getType(state)\n      state.linkText = true;\n      if (modeCfg.highlightFormatting) state.formatting = \"link\";\n      return getType(state);\n    }\n\n    if (ch === ']' && state.linkText) {\n      if (modeCfg.highlightFormatting) state.formatting = \"link\";\n      var type = getType(state);\n      state.linkText = false;\n      state.inline = state.f = stream.match(/\\(.*?\\)| ?\\[.*?\\]/, false) ? linkHref : inlineNormal\n      return type;\n    }\n\n    if (ch === '<' && stream.match(/^(https?|ftps?):\\/\\/(?:[^\\\\>]|\\\\.)+>/, false)) {\n      state.f = state.inline = linkInline;\n      if (modeCfg.highlightFormatting) state.formatting = \"link\";\n      var type = getType(state);\n      if (type){\n        type += \" \";\n      } else {\n        type = \"\";\n      }\n      return type + tokenTypes.linkInline;\n    }\n\n    if (ch === '<' && stream.match(/^[^> \\\\]+@(?:[^\\\\>]|\\\\.)+>/, false)) {\n      state.f = state.inline = linkInline;\n      if (modeCfg.highlightFormatting) state.formatting = \"link\";\n      var type = getType(state);\n      if (type){\n        type += \" \";\n      } else {\n        type = \"\";\n      }\n      return type + tokenTypes.linkEmail;\n    }\n\n    if (modeCfg.xml && ch === '<' && stream.match(/^(!--|\\?|!\\[CDATA\\[|[a-z][a-z0-9-]*(?:\\s+[a-z_:.\\-]+(?:\\s*=\\s*[^>]+)?)*\\s*(?:>|$))/i, false)) {\n      var end = stream.string.indexOf(\">\", stream.pos);\n      if (end != -1) {\n        var atts = stream.string.substring(stream.start, end);\n        if (/markdown\\s*=\\s*('|\"){0,1}1('|\"){0,1}/.test(atts)) state.md_inside = true;\n      }\n      stream.backUp(1);\n      state.htmlState = CodeMirror.startState(htmlMode);\n      return switchBlock(stream, state, htmlBlock);\n    }\n\n    if (modeCfg.xml && ch === '<' && stream.match(/^\\/\\w*?>/)) {\n      state.md_inside = false;\n      return \"tag\";\n    } else if (ch === \"*\" || ch === \"_\") {\n      var len = 1, before = stream.pos == 1 ? \" \" : stream.string.charAt(stream.pos - 2)\n      while (len < 3 && stream.eat(ch)) len++\n      var after = stream.peek() || \" \"\n      // See http://spec.commonmark.org/0.27/#emphasis-and-strong-emphasis\n      var leftFlanking = !/\\s/.test(after) && (!punctuation.test(after) || /\\s/.test(before) || punctuation.test(before))\n      var rightFlanking = !/\\s/.test(before) && (!punctuation.test(before) || /\\s/.test(after) || punctuation.test(after))\n      var setEm = null, setStrong = null\n      if (len % 2) { // Em\n        if (!state.em && leftFlanking && (ch === \"*\" || !rightFlanking || punctuation.test(before)))\n          setEm = true\n        else if (state.em == ch && rightFlanking && (ch === \"*\" || !leftFlanking || punctuation.test(after)))\n          setEm = false\n      }\n      if (len > 1) { // Strong\n        if (!state.strong && leftFlanking && (ch === \"*\" || !rightFlanking || punctuation.test(before)))\n          setStrong = true\n        else if (state.strong == ch && rightFlanking && (ch === \"*\" || !leftFlanking || punctuation.test(after)))\n          setStrong = false\n      }\n      if (setStrong != null || setEm != null) {\n        if (modeCfg.highlightFormatting) state.formatting = setEm == null ? \"strong\" : setStrong == null ? \"em\" : \"strong em\"\n        if (setEm === true) state.em = ch\n        if (setStrong === true) state.strong = ch\n        var t = getType(state)\n        if (setEm === false) state.em = false\n        if (setStrong === false) state.strong = false\n        return t\n      }\n    } else if (ch === ' ') {\n      if (stream.eat('*') || stream.eat('_')) { // Probably surrounded by spaces\n        if (stream.peek() === ' ') { // Surrounded by spaces, ignore\n          return getType(state);\n        } else { // Not surrounded by spaces, back up pointer\n          stream.backUp(1);\n        }\n      }\n    }\n\n    if (modeCfg.strikethrough) {\n      if (ch === '~' && stream.eatWhile(ch)) {\n        if (state.strikethrough) {// Remove strikethrough\n          if (modeCfg.highlightFormatting) state.formatting = \"strikethrough\";\n          var t = getType(state);\n          state.strikethrough = false;\n          return t;\n        } else if (stream.match(/^[^\\s]/, false)) {// Add strikethrough\n          state.strikethrough = true;\n          if (modeCfg.highlightFormatting) state.formatting = \"strikethrough\";\n          return getType(state);\n        }\n      } else if (ch === ' ') {\n        if (stream.match('~~', true)) { // Probably surrounded by space\n          if (stream.peek() === ' ') { // Surrounded by spaces, ignore\n            return getType(state);\n          } else { // Not surrounded by spaces, back up pointer\n            stream.backUp(2);\n          }\n        }\n      }\n    }\n\n    if (modeCfg.emoji && ch === \":\" && stream.match(/^(?:[a-z_\\d+][a-z_\\d+-]*|\\-[a-z_\\d+][a-z_\\d+-]*):/)) {\n      state.emoji = true;\n      if (modeCfg.highlightFormatting) state.formatting = \"emoji\";\n      var retType = getType(state);\n      state.emoji = false;\n      return retType;\n    }\n\n    if (ch === ' ') {\n      if (stream.match(/^ +$/, false)) {\n        state.trailingSpace++;\n      } else if (state.trailingSpace) {\n        state.trailingSpaceNewLine = true;\n      }\n    }\n\n    return getType(state);\n  }\n\n  function linkInline(stream, state) {\n    var ch = stream.next();\n\n    if (ch === \">\") {\n      state.f = state.inline = inlineNormal;\n      if (modeCfg.highlightFormatting) state.formatting = \"link\";\n      var type = getType(state);\n      if (type){\n        type += \" \";\n      } else {\n        type = \"\";\n      }\n      return type + tokenTypes.linkInline;\n    }\n\n    stream.match(/^[^>]+/, true);\n\n    return tokenTypes.linkInline;\n  }\n\n  function linkHref(stream, state) {\n    // Check if space, and return NULL if so (to avoid marking the space)\n    if(stream.eatSpace()){\n      return null;\n    }\n    var ch = stream.next();\n    if (ch === '(' || ch === '[') {\n      state.f = state.inline = getLinkHrefInside(ch === \"(\" ? \")\" : \"]\");\n      if (modeCfg.highlightFormatting) state.formatting = \"link-string\";\n      state.linkHref = true;\n      return getType(state);\n    }\n    return 'error';\n  }\n\n  var linkRE = {\n    \")\": /^(?:[^\\\\\\(\\)]|\\\\.|\\((?:[^\\\\\\(\\)]|\\\\.)*\\))*?(?=\\))/,\n    \"]\": /^(?:[^\\\\\\[\\]]|\\\\.|\\[(?:[^\\\\\\[\\]]|\\\\.)*\\])*?(?=\\])/\n  }\n\n  function getLinkHrefInside(endChar) {\n    return function(stream, state) {\n      var ch = stream.next();\n\n      if (ch === endChar) {\n        state.f = state.inline = inlineNormal;\n        if (modeCfg.highlightFormatting) state.formatting = \"link-string\";\n        var returnState = getType(state);\n        state.linkHref = false;\n        return returnState;\n      }\n\n      stream.match(linkRE[endChar])\n      state.linkHref = true;\n      return getType(state);\n    };\n  }\n\n  function footnoteLink(stream, state) {\n    if (stream.match(/^([^\\]\\\\]|\\\\.)*\\]:/, false)) {\n      state.f = footnoteLinkInside;\n      stream.next(); // Consume [\n      if (modeCfg.highlightFormatting) state.formatting = \"link\";\n      state.linkText = true;\n      return getType(state);\n    }\n    return switchInline(stream, state, inlineNormal);\n  }\n\n  function footnoteLinkInside(stream, state) {\n    if (stream.match(']:', true)) {\n      state.f = state.inline = footnoteUrl;\n      if (modeCfg.highlightFormatting) state.formatting = \"link\";\n      var returnType = getType(state);\n      state.linkText = false;\n      return returnType;\n    }\n\n    stream.match(/^([^\\]\\\\]|\\\\.)+/, true);\n\n    return tokenTypes.linkText;\n  }\n\n  function footnoteUrl(stream, state) {\n    // Check if space, and return NULL if so (to avoid marking the space)\n    if(stream.eatSpace()){\n      return null;\n    }\n    // Match URL\n    stream.match(/^[^\\s]+/, true);\n    // Check for link title\n    if (stream.peek() === undefined) { // End of line, set flag to check next line\n      state.linkTitle = true;\n    } else { // More content on line, check if link title\n      stream.match(/^(?:\\s+(?:\"(?:[^\"\\\\]|\\\\.)+\"|'(?:[^'\\\\]|\\\\.)+'|\\((?:[^)\\\\]|\\\\.)+\\)))?/, true);\n    }\n    state.f = state.inline = inlineNormal;\n    return tokenTypes.linkHref + \" url\";\n  }\n\n  var mode = {\n    startState: function() {\n      return {\n        f: blockNormal,\n\n        prevLine: {stream: null},\n        thisLine: {stream: null},\n\n        block: blockNormal,\n        htmlState: null,\n        indentation: 0,\n\n        inline: inlineNormal,\n        text: handleText,\n\n        formatting: false,\n        linkText: false,\n        linkHref: false,\n        linkTitle: false,\n        code: 0,\n        em: false,\n        strong: false,\n        header: 0,\n        setext: 0,\n        hr: false,\n        taskList: false,\n        list: false,\n        listStack: [],\n        quote: 0,\n        trailingSpace: 0,\n        trailingSpaceNewLine: false,\n        strikethrough: false,\n        emoji: false,\n        fencedEndRE: null\n      };\n    },\n\n    copyState: function(s) {\n      return {\n        f: s.f,\n\n        prevLine: s.prevLine,\n        thisLine: s.thisLine,\n\n        block: s.block,\n        htmlState: s.htmlState && CodeMirror.copyState(htmlMode, s.htmlState),\n        indentation: s.indentation,\n\n        localMode: s.localMode,\n        localState: s.localMode ? CodeMirror.copyState(s.localMode, s.localState) : null,\n\n        inline: s.inline,\n        text: s.text,\n        formatting: false,\n        linkText: s.linkText,\n        linkTitle: s.linkTitle,\n        linkHref: s.linkHref,\n        code: s.code,\n        em: s.em,\n        strong: s.strong,\n        strikethrough: s.strikethrough,\n        emoji: s.emoji,\n        header: s.header,\n        setext: s.setext,\n        hr: s.hr,\n        taskList: s.taskList,\n        list: s.list,\n        listStack: s.listStack.slice(0),\n        quote: s.quote,\n        indentedCode: s.indentedCode,\n        trailingSpace: s.trailingSpace,\n        trailingSpaceNewLine: s.trailingSpaceNewLine,\n        md_inside: s.md_inside,\n        fencedEndRE: s.fencedEndRE\n      };\n    },\n\n    token: function(stream, state) {\n\n      // Reset state.formatting\n      state.formatting = false;\n\n      if (stream != state.thisLine.stream) {\n        state.header = 0;\n        state.hr = false;\n\n        if (stream.match(/^\\s*$/, true)) {\n          blankLine(state);\n          return null;\n        }\n\n        state.prevLine = state.thisLine\n        state.thisLine = {stream: stream}\n\n        // Reset state.taskList\n        state.taskList = false;\n\n        // Reset state.trailingSpace\n        state.trailingSpace = 0;\n        state.trailingSpaceNewLine = false;\n\n        if (!state.localState) {\n          state.f = state.block;\n          if (state.f != htmlBlock) {\n            var indentation = stream.match(/^\\s*/, true)[0].replace(/\\t/g, expandedTab).length;\n            state.indentation = indentation;\n            state.indentationDiff = null;\n            if (indentation > 0) return null;\n          }\n        }\n      }\n      return state.f(stream, state);\n    },\n\n    innerMode: function(state) {\n      if (state.block == htmlBlock) return {state: state.htmlState, mode: htmlMode};\n      if (state.localState) return {state: state.localState, mode: state.localMode};\n      return {state: state, mode: mode};\n    },\n\n    indent: function(state, textAfter, line) {\n      if (state.block == htmlBlock && htmlMode.indent) return htmlMode.indent(state.htmlState, textAfter, line)\n      if (state.localState && state.localMode.indent) return state.localMode.indent(state.localState, textAfter, line)\n      return CodeMirror.Pass\n    },\n\n    blankLine: blankLine,\n\n    getType: getType,\n\n    blockCommentStart: \"<!--\",\n    blockCommentEnd: \"-->\",\n    closeBrackets: \"()[]{}''\\\"\\\"``\",\n    fold: \"markdown\"\n  };\n  return mode;\n}, \"xml\");\n\nCodeMirror.defineMIME(\"text/markdown\", \"markdown\");\n\nCodeMirror.defineMIME(\"text/x-markdown\", \"markdown\");\n\n});\n","// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/5/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.modeInfo = [\n    {name: \"APL\", mime: \"text/apl\", mode: \"apl\", ext: [\"dyalog\", \"apl\"]},\n    {name: \"PGP\", mimes: [\"application/pgp\", \"application/pgp-encrypted\", \"application/pgp-keys\", \"application/pgp-signature\"], mode: \"asciiarmor\", ext: [\"asc\", \"pgp\", \"sig\"]},\n    {name: \"ASN.1\", mime: \"text/x-ttcn-asn\", mode: \"asn.1\", ext: [\"asn\", \"asn1\"]},\n    {name: \"Asterisk\", mime: \"text/x-asterisk\", mode: \"asterisk\", file: /^extensions\\.conf$/i},\n    {name: \"Brainfuck\", mime: \"text/x-brainfuck\", mode: \"brainfuck\", ext: [\"b\", \"bf\"]},\n    {name: \"C\", mime: \"text/x-csrc\", mode: \"clike\", ext: [\"c\", \"h\", \"ino\"]},\n    {name: \"C++\", mime: \"text/x-c++src\", mode: \"clike\", ext: [\"cpp\", \"c++\", \"cc\", \"cxx\", \"hpp\", \"h++\", \"hh\", \"hxx\"], alias: [\"cpp\"]},\n    {name: \"Cobol\", mime: \"text/x-cobol\", mode: \"cobol\", ext: [\"cob\", \"cpy\", \"cbl\"]},\n    {name: \"C#\", mime: \"text/x-csharp\", mode: \"clike\", ext: [\"cs\"], alias: [\"csharp\", \"cs\"]},\n    {name: \"Clojure\", mime: \"text/x-clojure\", mode: \"clojure\", ext: [\"clj\", \"cljc\", \"cljx\"]},\n    {name: \"ClojureScript\", mime: \"text/x-clojurescript\", mode: \"clojure\", ext: [\"cljs\"]},\n    {name: \"Closure Stylesheets (GSS)\", mime: \"text/x-gss\", mode: \"css\", ext: [\"gss\"]},\n    {name: \"CMake\", mime: \"text/x-cmake\", mode: \"cmake\", ext: [\"cmake\", \"cmake.in\"], file: /^CMakeLists\\.txt$/},\n    {name: \"CoffeeScript\", mimes: [\"application/vnd.coffeescript\", \"text/coffeescript\", \"text/x-coffeescript\"], mode: \"coffeescript\", ext: [\"coffee\"], alias: [\"coffee\", \"coffee-script\"]},\n    {name: \"Common Lisp\", mime: \"text/x-common-lisp\", mode: \"commonlisp\", ext: [\"cl\", \"lisp\", \"el\"], alias: [\"lisp\"]},\n    {name: \"Cypher\", mime: \"application/x-cypher-query\", mode: \"cypher\", ext: [\"cyp\", \"cypher\"]},\n    {name: \"Cython\", mime: \"text/x-cython\", mode: \"python\", ext: [\"pyx\", \"pxd\", \"pxi\"]},\n    {name: \"Crystal\", mime: \"text/x-crystal\", mode: \"crystal\", ext: [\"cr\"]},\n    {name: \"CSS\", mime: \"text/css\", mode: \"css\", ext: [\"css\"]},\n    {name: \"CQL\", mime: \"text/x-cassandra\", mode: \"sql\", ext: [\"cql\"]},\n    {name: \"D\", mime: \"text/x-d\", mode: \"d\", ext: [\"d\"]},\n    {name: \"Dart\", mimes: [\"application/dart\", \"text/x-dart\"], mode: \"dart\", ext: [\"dart\"]},\n    {name: \"diff\", mime: \"text/x-diff\", mode: \"diff\", ext: [\"diff\", \"patch\"]},\n    {name: \"Django\", mime: \"text/x-django\", mode: \"django\"},\n    {name: \"Dockerfile\", mime: \"text/x-dockerfile\", mode: \"dockerfile\", file: /^Dockerfile$/},\n    {name: \"DTD\", mime: \"application/xml-dtd\", mode: \"dtd\", ext: [\"dtd\"]},\n    {name: \"Dylan\", mime: \"text/x-dylan\", mode: \"dylan\", ext: [\"dylan\", \"dyl\", \"intr\"]},\n    {name: \"EBNF\", mime: \"text/x-ebnf\", mode: \"ebnf\"},\n    {name: \"ECL\", mime: \"text/x-ecl\", mode: \"ecl\", ext: [\"ecl\"]},\n    {name: \"edn\", mime: \"application/edn\", mode: \"clojure\", ext: [\"edn\"]},\n    {name: \"Eiffel\", mime: \"text/x-eiffel\", mode: \"eiffel\", ext: [\"e\"]},\n    {name: \"Elm\", mime: \"text/x-elm\", mode: \"elm\", ext: [\"elm\"]},\n    {name: \"Embedded JavaScript\", mime: \"application/x-ejs\", mode: \"htmlembedded\", ext: [\"ejs\"]},\n    {name: \"Embedded Ruby\", mime: \"application/x-erb\", mode: \"htmlembedded\", ext: [\"erb\"]},\n    {name: \"Erlang\", mime: \"text/x-erlang\", mode: \"erlang\", ext: [\"erl\"]},\n    {name: \"Esper\", mime: \"text/x-esper\", mode: \"sql\"},\n    {name: \"Factor\", mime: \"text/x-factor\", mode: \"factor\", ext: [\"factor\"]},\n    {name: \"FCL\", mime: \"text/x-fcl\", mode: \"fcl\"},\n    {name: \"Forth\", mime: \"text/x-forth\", mode: \"forth\", ext: [\"forth\", \"fth\", \"4th\"]},\n    {name: \"Fortran\", mime: \"text/x-fortran\", mode: \"fortran\", ext: [\"f\", \"for\", \"f77\", \"f90\", \"f95\"]},\n    {name: \"F#\", mime: \"text/x-fsharp\", mode: \"mllike\", ext: [\"fs\"], alias: [\"fsharp\"]},\n    {name: \"Gas\", mime: \"text/x-gas\", mode: \"gas\", ext: [\"s\"]},\n    {name: \"Gherkin\", mime: \"text/x-feature\", mode: \"gherkin\", ext: [\"feature\"]},\n    {name: \"GitHub Flavored Markdown\", mime: \"text/x-gfm\", mode: \"gfm\", file: /^(readme|contributing|history)\\.md$/i},\n    {name: \"Go\", mime: \"text/x-go\", mode: \"go\", ext: [\"go\"]},\n    {name: \"Groovy\", mime: \"text/x-groovy\", mode: \"groovy\", ext: [\"groovy\", \"gradle\"], file: /^Jenkinsfile$/},\n    {name: \"HAML\", mime: \"text/x-haml\", mode: \"haml\", ext: [\"haml\"]},\n    {name: \"Haskell\", mime: \"text/x-haskell\", mode: \"haskell\", ext: [\"hs\"]},\n    {name: \"Haskell (Literate)\", mime: \"text/x-literate-haskell\", mode: \"haskell-literate\", ext: [\"lhs\"]},\n    {name: \"Haxe\", mime: \"text/x-haxe\", mode: \"haxe\", ext: [\"hx\"]},\n    {name: \"HXML\", mime: \"text/x-hxml\", mode: \"haxe\", ext: [\"hxml\"]},\n    {name: \"ASP.NET\", mime: \"application/x-aspx\", mode: \"htmlembedded\", ext: [\"aspx\"], alias: [\"asp\", \"aspx\"]},\n    {name: \"HTML\", mime: \"text/html\", mode: \"htmlmixed\", ext: [\"html\", \"htm\", \"handlebars\", \"hbs\"], alias: [\"xhtml\"]},\n    {name: \"HTTP\", mime: \"message/http\", mode: \"http\"},\n    {name: \"IDL\", mime: \"text/x-idl\", mode: \"idl\", ext: [\"pro\"]},\n    {name: \"Pug\", mime: \"text/x-pug\", mode: \"pug\", ext: [\"jade\", \"pug\"], alias: [\"jade\"]},\n    {name: \"Java\", mime: \"text/x-java\", mode: \"clike\", ext: [\"java\"]},\n    {name: \"Java Server Pages\", mime: \"application/x-jsp\", mode: \"htmlembedded\", ext: [\"jsp\"], alias: [\"jsp\"]},\n    {name: \"JavaScript\", mimes: [\"text/javascript\", \"text/ecmascript\", \"application/javascript\", \"application/x-javascript\", \"application/ecmascript\"],\n     mode: \"javascript\", ext: [\"js\"], alias: [\"ecmascript\", \"js\", \"node\"]},\n    {name: \"JSON\", mimes: [\"application/json\", \"application/x-json\"], mode: \"javascript\", ext: [\"json\", \"map\"], alias: [\"json5\"]},\n    {name: \"JSON-LD\", mime: \"application/ld+json\", mode: \"javascript\", ext: [\"jsonld\"], alias: [\"jsonld\"]},\n    {name: \"JSX\", mime: \"text/jsx\", mode: \"jsx\", ext: [\"jsx\"]},\n    {name: \"Jinja2\", mime: \"text/jinja2\", mode: \"jinja2\", ext: [\"j2\", \"jinja\", \"jinja2\"]},\n    {name: \"Julia\", mime: \"text/x-julia\", mode: \"julia\", ext: [\"jl\"], alias: [\"jl\"]},\n    {name: \"Kotlin\", mime: \"text/x-kotlin\", mode: \"clike\", ext: [\"kt\"]},\n    {name: \"LESS\", mime: \"text/x-less\", mode: \"css\", ext: [\"less\"]},\n    {name: \"LiveScript\", mime: \"text/x-livescript\", mode: \"livescript\", ext: [\"ls\"], alias: [\"ls\"]},\n    {name: \"Lua\", mime: \"text/x-lua\", mode: \"lua\", ext: [\"lua\"]},\n    {name: \"Markdown\", mime: \"text/x-markdown\", mode: \"markdown\", ext: [\"markdown\", \"md\", \"mkd\"]},\n    {name: \"mIRC\", mime: \"text/mirc\", mode: \"mirc\"},\n    {name: \"MariaDB SQL\", mime: \"text/x-mariadb\", mode: \"sql\"},\n    {name: \"Mathematica\", mime: \"text/x-mathematica\", mode: \"mathematica\", ext: [\"m\", \"nb\", \"wl\", \"wls\"]},\n    {name: \"Modelica\", mime: \"text/x-modelica\", mode: \"modelica\", ext: [\"mo\"]},\n    {name: \"MUMPS\", mime: \"text/x-mumps\", mode: \"mumps\", ext: [\"mps\"]},\n    {name: \"MS SQL\", mime: \"text/x-mssql\", mode: \"sql\"},\n    {name: \"mbox\", mime: \"application/mbox\", mode: \"mbox\", ext: [\"mbox\"]},\n    {name: \"MySQL\", mime: \"text/x-mysql\", mode: \"sql\"},\n    {name: \"Nginx\", mime: \"text/x-nginx-conf\", mode: \"nginx\", file: /nginx.*\\.conf$/i},\n    {name: \"NSIS\", mime: \"text/x-nsis\", mode: \"nsis\", ext: [\"nsh\", \"nsi\"]},\n    {name: \"NTriples\", mimes: [\"application/n-triples\", \"application/n-quads\", \"text/n-triples\"],\n     mode: \"ntriples\", ext: [\"nt\", \"nq\"]},\n    {name: \"Objective-C\", mime: \"text/x-objectivec\", mode: \"clike\", ext: [\"m\"], alias: [\"objective-c\", \"objc\"]},\n    {name: \"Objective-C++\", mime: \"text/x-objectivec++\", mode: \"clike\", ext: [\"mm\"], alias: [\"objective-c++\", \"objc++\"]},\n    {name: \"OCaml\", mime: \"text/x-ocaml\", mode: \"mllike\", ext: [\"ml\", \"mli\", \"mll\", \"mly\"]},\n    {name: \"Octave\", mime: \"text/x-octave\", mode: \"octave\", ext: [\"m\"]},\n    {name: \"Oz\", mime: \"text/x-oz\", mode: \"oz\", ext: [\"oz\"]},\n    {name: \"Pascal\", mime: \"text/x-pascal\", mode: \"pascal\", ext: [\"p\", \"pas\"]},\n    {name: \"PEG.js\", mime: \"null\", mode: \"pegjs\", ext: [\"jsonld\"]},\n    {name: \"Perl\", mime: \"text/x-perl\", mode: \"perl\", ext: [\"pl\", \"pm\"]},\n    {name: \"PHP\", mimes: [\"text/x-php\", \"application/x-httpd-php\", \"application/x-httpd-php-open\"], mode: \"php\", ext: [\"php\", \"php3\", \"php4\", \"php5\", \"php7\", \"phtml\"]},\n    {name: \"Pig\", mime: \"text/x-pig\", mode: \"pig\", ext: [\"pig\"]},\n    {name: \"Plain Text\", mime: \"text/plain\", mode: \"null\", ext: [\"txt\", \"text\", \"conf\", \"def\", \"list\", \"log\"]},\n    {name: \"PLSQL\", mime: \"text/x-plsql\", mode: \"sql\", ext: [\"pls\"]},\n    {name: \"PostgreSQL\", mime: \"text/x-pgsql\", mode: \"sql\"},\n    {name: \"PowerShell\", mime: \"application/x-powershell\", mode: \"powershell\", ext: [\"ps1\", \"psd1\", \"psm1\"]},\n    {name: \"Properties files\", mime: \"text/x-properties\", mode: \"properties\", ext: [\"properties\", \"ini\", \"in\"], alias: [\"ini\", \"properties\"]},\n    {name: \"ProtoBuf\", mime: \"text/x-protobuf\", mode: \"protobuf\", ext: [\"proto\"]},\n    {name: \"Python\", mime: \"text/x-python\", mode: \"python\", ext: [\"BUILD\", \"bzl\", \"py\", \"pyw\"], file: /^(BUCK|BUILD)$/},\n    {name: \"Puppet\", mime: \"text/x-puppet\", mode: \"puppet\", ext: [\"pp\"]},\n    {name: \"Q\", mime: \"text/x-q\", mode: \"q\", ext: [\"q\"]},\n    {name: \"R\", mime: \"text/x-rsrc\", mode: \"r\", ext: [\"r\", \"R\"], alias: [\"rscript\"]},\n    {name: \"reStructuredText\", mime: \"text/x-rst\", mode: \"rst\", ext: [\"rst\"], alias: [\"rst\"]},\n    {name: \"RPM Changes\", mime: \"text/x-rpm-changes\", mode: \"rpm\"},\n    {name: \"RPM Spec\", mime: \"text/x-rpm-spec\", mode: \"rpm\", ext: [\"spec\"]},\n    {name: \"Ruby\", mime: \"text/x-ruby\", mode: \"ruby\", ext: [\"rb\"], alias: [\"jruby\", \"macruby\", \"rake\", \"rb\", \"rbx\"]},\n    {name: \"Rust\", mime: \"text/x-rustsrc\", mode: \"rust\", ext: [\"rs\"]},\n    {name: \"SAS\", mime: \"text/x-sas\", mode: \"sas\", ext: [\"sas\"]},\n    {name: \"Sass\", mime: \"text/x-sass\", mode: \"sass\", ext: [\"sass\"]},\n    {name: \"Scala\", mime: \"text/x-scala\", mode: \"clike\", ext: [\"scala\"]},\n    {name: \"Scheme\", mime: \"text/x-scheme\", mode: \"scheme\", ext: [\"scm\", \"ss\"]},\n    {name: \"SCSS\", mime: \"text/x-scss\", mode: \"css\", ext: [\"scss\"]},\n    {name: \"Shell\", mimes: [\"text/x-sh\", \"application/x-sh\"], mode: \"shell\", ext: [\"sh\", \"ksh\", \"bash\"], alias: [\"bash\", \"sh\", \"zsh\"], file: /^PKGBUILD$/},\n    {name: \"Sieve\", mime: \"application/sieve\", mode: \"sieve\", ext: [\"siv\", \"sieve\"]},\n    {name: \"Slim\", mimes: [\"text/x-slim\", \"application/x-slim\"], mode: \"slim\", ext: [\"slim\"]},\n    {name: \"Smalltalk\", mime: \"text/x-stsrc\", mode: \"smalltalk\", ext: [\"st\"]},\n    {name: \"Smarty\", mime: \"text/x-smarty\", mode: \"smarty\", ext: [\"tpl\"]},\n    {name: \"Solr\", mime: \"text/x-solr\", mode: \"solr\"},\n    {name: \"SML\", mime: \"text/x-sml\", mode: \"mllike\", ext: [\"sml\", \"sig\", \"fun\", \"smackspec\"]},\n    {name: \"Soy\", mime: \"text/x-soy\", mode: \"soy\", ext: [\"soy\"], alias: [\"closure template\"]},\n    {name: \"SPARQL\", mime: \"application/sparql-query\", mode: \"sparql\", ext: [\"rq\", \"sparql\"], alias: [\"sparul\"]},\n    {name: \"Spreadsheet\", mime: \"text/x-spreadsheet\", mode: \"spreadsheet\", alias: [\"excel\", \"formula\"]},\n    {name: \"SQL\", mime: \"text/x-sql\", mode: \"sql\", ext: [\"sql\"]},\n    {name: \"SQLite\", mime: \"text/x-sqlite\", mode: \"sql\"},\n    {name: \"Squirrel\", mime: \"text/x-squirrel\", mode: \"clike\", ext: [\"nut\"]},\n    {name: \"Stylus\", mime: \"text/x-styl\", mode: \"stylus\", ext: [\"styl\"]},\n    {name: \"Swift\", mime: \"text/x-swift\", mode: \"swift\", ext: [\"swift\"]},\n    {name: \"sTeX\", mime: \"text/x-stex\", mode: \"stex\"},\n    {name: \"LaTeX\", mime: \"text/x-latex\", mode: \"stex\", ext: [\"text\", \"ltx\", \"tex\"], alias: [\"tex\"]},\n    {name: \"SystemVerilog\", mime: \"text/x-systemverilog\", mode: \"verilog\", ext: [\"v\", \"sv\", \"svh\"]},\n    {name: \"Tcl\", mime: \"text/x-tcl\", mode: \"tcl\", ext: [\"tcl\"]},\n    {name: \"Textile\", mime: \"text/x-textile\", mode: \"textile\", ext: [\"textile\"]},\n    {name: \"TiddlyWiki\", mime: \"text/x-tiddlywiki\", mode: \"tiddlywiki\"},\n    {name: \"Tiki wiki\", mime: \"text/tiki\", mode: \"tiki\"},\n    {name: \"TOML\", mime: \"text/x-toml\", mode: \"toml\", ext: [\"toml\"]},\n    {name: \"Tornado\", mime: \"text/x-tornado\", mode: \"tornado\"},\n    {name: \"troff\", mime: \"text/troff\", mode: \"troff\", ext: [\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\"]},\n    {name: \"TTCN\", mime: \"text/x-ttcn\", mode: \"ttcn\", ext: [\"ttcn\", \"ttcn3\", \"ttcnpp\"]},\n    {name: \"TTCN_CFG\", mime: \"text/x-ttcn-cfg\", mode: \"ttcn-cfg\", ext: [\"cfg\"]},\n    {name: \"Turtle\", mime: \"text/turtle\", mode: \"turtle\", ext: [\"ttl\"]},\n    {name: \"TypeScript\", mime: \"application/typescript\", mode: \"javascript\", ext: [\"ts\"], alias: [\"ts\"]},\n    {name: \"TypeScript-JSX\", mime: \"text/typescript-jsx\", mode: \"jsx\", ext: [\"tsx\"], alias: [\"tsx\"]},\n    {name: \"Twig\", mime: \"text/x-twig\", mode: \"twig\"},\n    {name: \"Web IDL\", mime: \"text/x-webidl\", mode: \"webidl\", ext: [\"webidl\"]},\n    {name: \"VB.NET\", mime: \"text/x-vb\", mode: \"vb\", ext: [\"vb\"]},\n    {name: \"VBScript\", mime: \"text/vbscript\", mode: \"vbscript\", ext: [\"vbs\"]},\n    {name: \"Velocity\", mime: \"text/velocity\", mode: \"velocity\", ext: [\"vtl\"]},\n    {name: \"Verilog\", mime: \"text/x-verilog\", mode: \"verilog\", ext: [\"v\"]},\n    {name: \"VHDL\", mime: \"text/x-vhdl\", mode: \"vhdl\", ext: [\"vhd\", \"vhdl\"]},\n    {name: \"Vue.js Component\", mimes: [\"script/x-vue\", \"text/x-vue\"], mode: \"vue\", ext: [\"vue\"]},\n    {name: \"XML\", mimes: [\"application/xml\", \"text/xml\"], mode: \"xml\", ext: [\"xml\", \"xsl\", \"xsd\", \"svg\"], alias: [\"rss\", \"wsdl\", \"xsd\"]},\n    {name: \"XQuery\", mime: \"application/xquery\", mode: \"xquery\", ext: [\"xy\", \"xquery\"]},\n    {name: \"Yacas\", mime: \"text/x-yacas\", mode: \"yacas\", ext: [\"ys\"]},\n    {name: \"YAML\", mimes: [\"text/x-yaml\", \"text/yaml\"], mode: \"yaml\", ext: [\"yaml\", \"yml\"], alias: [\"yml\"]},\n    {name: \"Z80\", mime: \"text/x-z80\", mode: \"z80\", ext: [\"z80\"]},\n    {name: \"mscgen\", mime: \"text/x-mscgen\", mode: \"mscgen\", ext: [\"mscgen\", \"mscin\", \"msc\"]},\n    {name: \"xu\", mime: \"text/x-xu\", mode: \"mscgen\", ext: [\"xu\"]},\n    {name: \"msgenny\", mime: \"text/x-msgenny\", mode: \"mscgen\", ext: [\"msgenny\"]},\n    {name: \"WebAssembly\", mime: \"text/webassembly\", mode: \"wast\", ext: [\"wat\", \"wast\"]},\n  ];\n  // Ensure all modes have a mime property for backwards compatibility\n  for (var i = 0; i < CodeMirror.modeInfo.length; i++) {\n    var info = CodeMirror.modeInfo[i];\n    if (info.mimes) info.mime = info.mimes[0];\n  }\n\n  CodeMirror.findModeByMIME = function(mime) {\n    mime = mime.toLowerCase();\n    for (var i = 0; i < CodeMirror.modeInfo.length; i++) {\n      var info = CodeMirror.modeInfo[i];\n      if (info.mime == mime) return info;\n      if (info.mimes) for (var j = 0; j < info.mimes.length; j++)\n        if (info.mimes[j] == mime) return info;\n    }\n    if (/\\+xml$/.test(mime)) return CodeMirror.findModeByMIME(\"application/xml\")\n    if (/\\+json$/.test(mime)) return CodeMirror.findModeByMIME(\"application/json\")\n  };\n\n  CodeMirror.findModeByExtension = function(ext) {\n    ext = ext.toLowerCase();\n    for (var i = 0; i < CodeMirror.modeInfo.length; i++) {\n      var info = CodeMirror.modeInfo[i];\n      if (info.ext) for (var j = 0; j < info.ext.length; j++)\n        if (info.ext[j] == ext) return info;\n    }\n  };\n\n  CodeMirror.findModeByFileName = function(filename) {\n    for (var i = 0; i < CodeMirror.modeInfo.length; i++) {\n      var info = CodeMirror.modeInfo[i];\n      if (info.file && info.file.test(filename)) return info;\n    }\n    var dot = filename.lastIndexOf(\".\");\n    var ext = dot > -1 && filename.substring(dot + 1, filename.length);\n    if (ext) return CodeMirror.findModeByExtension(ext);\n  };\n\n  CodeMirror.findModeByName = function(name) {\n    name = name.toLowerCase();\n    for (var i = 0; i < CodeMirror.modeInfo.length; i++) {\n      var info = CodeMirror.modeInfo[i];\n      if (info.name.toLowerCase() == name) return info;\n      if (info.alias) for (var j = 0; j < info.alias.length; j++)\n        if (info.alias[j].toLowerCase() == name) return info;\n    }\n  };\n});\n","// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/5/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nvar htmlConfig = {\n  autoSelfClosers: {'area': true, 'base': true, 'br': true, 'col': true, 'command': true,\n                    'embed': true, 'frame': true, 'hr': true, 'img': true, 'input': true,\n                    'keygen': true, 'link': true, 'meta': true, 'param': true, 'source': true,\n                    'track': true, 'wbr': true, 'menuitem': true},\n  implicitlyClosed: {'dd': true, 'li': true, 'optgroup': true, 'option': true, 'p': true,\n                     'rp': true, 'rt': true, 'tbody': true, 'td': true, 'tfoot': true,\n                     'th': true, 'tr': true},\n  contextGrabbers: {\n    'dd': {'dd': true, 'dt': true},\n    'dt': {'dd': true, 'dt': true},\n    'li': {'li': true},\n    'option': {'option': true, 'optgroup': true},\n    'optgroup': {'optgroup': true},\n    'p': {'address': true, 'article': true, 'aside': true, 'blockquote': true, 'dir': true,\n          'div': true, 'dl': true, 'fieldset': true, 'footer': true, 'form': true,\n          'h1': true, 'h2': true, 'h3': true, 'h4': true, 'h5': true, 'h6': true,\n          'header': true, 'hgroup': true, 'hr': true, 'menu': true, 'nav': true, 'ol': true,\n          'p': true, 'pre': true, 'section': true, 'table': true, 'ul': true},\n    'rp': {'rp': true, 'rt': true},\n    'rt': {'rp': true, 'rt': true},\n    'tbody': {'tbody': true, 'tfoot': true},\n    'td': {'td': true, 'th': true},\n    'tfoot': {'tbody': true},\n    'th': {'td': true, 'th': true},\n    'thead': {'tbody': true, 'tfoot': true},\n    'tr': {'tr': true}\n  },\n  doNotIndent: {\"pre\": true},\n  allowUnquoted: true,\n  allowMissing: true,\n  caseFold: true\n}\n\nvar xmlConfig = {\n  autoSelfClosers: {},\n  implicitlyClosed: {},\n  contextGrabbers: {},\n  doNotIndent: {},\n  allowUnquoted: false,\n  allowMissing: false,\n  allowMissingTagName: false,\n  caseFold: false\n}\n\nCodeMirror.defineMode(\"xml\", function(editorConf, config_) {\n  var indentUnit = editorConf.indentUnit\n  var config = {}\n  var defaults = config_.htmlMode ? htmlConfig : xmlConfig\n  for (var prop in defaults) config[prop] = defaults[prop]\n  for (var prop in config_) config[prop] = config_[prop]\n\n  // Return variables for tokenizers\n  var type, setStyle;\n\n  function inText(stream, state) {\n    function chain(parser) {\n      state.tokenize = parser;\n      return parser(stream, state);\n    }\n\n    var ch = stream.next();\n    if (ch == \"<\") {\n      if (stream.eat(\"!\")) {\n        if (stream.eat(\"[\")) {\n          if (stream.match(\"CDATA[\")) return chain(inBlock(\"atom\", \"]]>\"));\n          else return null;\n        } else if (stream.match(\"--\")) {\n          return chain(inBlock(\"comment\", \"-->\"));\n        } else if (stream.match(\"DOCTYPE\", true, true)) {\n          stream.eatWhile(/[\\w\\._\\-]/);\n          return chain(doctype(1));\n        } else {\n          return null;\n        }\n      } else if (stream.eat(\"?\")) {\n        stream.eatWhile(/[\\w\\._\\-]/);\n        state.tokenize = inBlock(\"meta\", \"?>\");\n        return \"meta\";\n      } else {\n        type = stream.eat(\"/\") ? \"closeTag\" : \"openTag\";\n        state.tokenize = inTag;\n        return \"tag bracket\";\n      }\n    } else if (ch == \"&\") {\n      var ok;\n      if (stream.eat(\"#\")) {\n        if (stream.eat(\"x\")) {\n          ok = stream.eatWhile(/[a-fA-F\\d]/) && stream.eat(\";\");\n        } else {\n          ok = stream.eatWhile(/[\\d]/) && stream.eat(\";\");\n        }\n      } else {\n        ok = stream.eatWhile(/[\\w\\.\\-:]/) && stream.eat(\";\");\n      }\n      return ok ? \"atom\" : \"error\";\n    } else {\n      stream.eatWhile(/[^&<]/);\n      return null;\n    }\n  }\n  inText.isInText = true;\n\n  function inTag(stream, state) {\n    var ch = stream.next();\n    if (ch == \">\" || (ch == \"/\" && stream.eat(\">\"))) {\n      state.tokenize = inText;\n      type = ch == \">\" ? \"endTag\" : \"selfcloseTag\";\n      return \"tag bracket\";\n    } else if (ch == \"=\") {\n      type = \"equals\";\n      return null;\n    } else if (ch == \"<\") {\n      state.tokenize = inText;\n      state.state = baseState;\n      state.tagName = state.tagStart = null;\n      var next = state.tokenize(stream, state);\n      return next ? next + \" tag error\" : \"tag error\";\n    } else if (/[\\'\\\"]/.test(ch)) {\n      state.tokenize = inAttribute(ch);\n      state.stringStartCol = stream.column();\n      return state.tokenize(stream, state);\n    } else {\n      stream.match(/^[^\\s\\u00a0=<>\\\"\\']*[^\\s\\u00a0=<>\\\"\\'\\/]/);\n      return \"word\";\n    }\n  }\n\n  function inAttribute(quote) {\n    var closure = function(stream, state) {\n      while (!stream.eol()) {\n        if (stream.next() == quote) {\n          state.tokenize = inTag;\n          break;\n        }\n      }\n      return \"string\";\n    };\n    closure.isInAttribute = true;\n    return closure;\n  }\n\n  function inBlock(style, terminator) {\n    return function(stream, state) {\n      while (!stream.eol()) {\n        if (stream.match(terminator)) {\n          state.tokenize = inText;\n          break;\n        }\n        stream.next();\n      }\n      return style;\n    }\n  }\n\n  function doctype(depth) {\n    return function(stream, state) {\n      var ch;\n      while ((ch = stream.next()) != null) {\n        if (ch == \"<\") {\n          state.tokenize = doctype(depth + 1);\n          return state.tokenize(stream, state);\n        } else if (ch == \">\") {\n          if (depth == 1) {\n            state.tokenize = inText;\n            break;\n          } else {\n            state.tokenize = doctype(depth - 1);\n            return state.tokenize(stream, state);\n          }\n        }\n      }\n      return \"meta\";\n    };\n  }\n\n  function lower(tagName) {\n    return tagName && tagName.toLowerCase();\n  }\n\n  function Context(state, tagName, startOfLine) {\n    this.prev = state.context;\n    this.tagName = tagName || \"\";\n    this.indent = state.indented;\n    this.startOfLine = startOfLine;\n    if (config.doNotIndent.hasOwnProperty(tagName) || (state.context && state.context.noIndent))\n      this.noIndent = true;\n  }\n  function popContext(state) {\n    if (state.context) state.context = state.context.prev;\n  }\n  function maybePopContext(state, nextTagName) {\n    var parentTagName;\n    while (true) {\n      if (!state.context) {\n        return;\n      }\n      parentTagName = state.context.tagName;\n      if (!config.contextGrabbers.hasOwnProperty(lower(parentTagName)) ||\n          !config.contextGrabbers[lower(parentTagName)].hasOwnProperty(lower(nextTagName))) {\n        return;\n      }\n      popContext(state);\n    }\n  }\n\n  function baseState(type, stream, state) {\n    if (type == \"openTag\") {\n      state.tagStart = stream.column();\n      return tagNameState;\n    } else if (type == \"closeTag\") {\n      return closeTagNameState;\n    } else {\n      return baseState;\n    }\n  }\n  function tagNameState(type, stream, state) {\n    if (type == \"word\") {\n      state.tagName = stream.current();\n      setStyle = \"tag\";\n      return attrState;\n    } else if (config.allowMissingTagName && type == \"endTag\") {\n      setStyle = \"tag bracket\";\n      return attrState(type, stream, state);\n    } else {\n      setStyle = \"error\";\n      return tagNameState;\n    }\n  }\n  function closeTagNameState(type, stream, state) {\n    if (type == \"word\") {\n      var tagName = stream.current();\n      if (state.context && state.context.tagName != tagName &&\n          config.implicitlyClosed.hasOwnProperty(lower(state.context.tagName)))\n        popContext(state);\n      if ((state.context && state.context.tagName == tagName) || config.matchClosing === false) {\n        setStyle = \"tag\";\n        return closeState;\n      } else {\n        setStyle = \"tag error\";\n        return closeStateErr;\n      }\n    } else if (config.allowMissingTagName && type == \"endTag\") {\n      setStyle = \"tag bracket\";\n      return closeState(type, stream, state);\n    } else {\n      setStyle = \"error\";\n      return closeStateErr;\n    }\n  }\n\n  function closeState(type, _stream, state) {\n    if (type != \"endTag\") {\n      setStyle = \"error\";\n      return closeState;\n    }\n    popContext(state);\n    return baseState;\n  }\n  function closeStateErr(type, stream, state) {\n    setStyle = \"error\";\n    return closeState(type, stream, state);\n  }\n\n  function attrState(type, _stream, state) {\n    if (type == \"word\") {\n      setStyle = \"attribute\";\n      return attrEqState;\n    } else if (type == \"endTag\" || type == \"selfcloseTag\") {\n      var tagName = state.tagName, tagStart = state.tagStart;\n      state.tagName = state.tagStart = null;\n      if (type == \"selfcloseTag\" ||\n          config.autoSelfClosers.hasOwnProperty(lower(tagName))) {\n        maybePopContext(state, tagName);\n      } else {\n        maybePopContext(state, tagName);\n        state.context = new Context(state, tagName, tagStart == state.indented);\n      }\n      return baseState;\n    }\n    setStyle = \"error\";\n    return attrState;\n  }\n  function attrEqState(type, stream, state) {\n    if (type == \"equals\") return attrValueState;\n    if (!config.allowMissing) setStyle = \"error\";\n    return attrState(type, stream, state);\n  }\n  function attrValueState(type, stream, state) {\n    if (type == \"string\") return attrContinuedState;\n    if (type == \"word\" && config.allowUnquoted) {setStyle = \"string\"; return attrState;}\n    setStyle = \"error\";\n    return attrState(type, stream, state);\n  }\n  function attrContinuedState(type, stream, state) {\n    if (type == \"string\") return attrContinuedState;\n    return attrState(type, stream, state);\n  }\n\n  return {\n    startState: function(baseIndent) {\n      var state = {tokenize: inText,\n                   state: baseState,\n                   indented: baseIndent || 0,\n                   tagName: null, tagStart: null,\n                   context: null}\n      if (baseIndent != null) state.baseIndent = baseIndent\n      return state\n    },\n\n    token: function(stream, state) {\n      if (!state.tagName && stream.sol())\n        state.indented = stream.indentation();\n\n      if (stream.eatSpace()) return null;\n      type = null;\n      var style = state.tokenize(stream, state);\n      if ((style || type) && style != \"comment\") {\n        setStyle = null;\n        state.state = state.state(type || style, stream, state);\n        if (setStyle)\n          style = setStyle == \"error\" ? style + \" error\" : setStyle;\n      }\n      return style;\n    },\n\n    indent: function(state, textAfter, fullLine) {\n      var context = state.context;\n      // Indent multi-line strings (e.g. css).\n      if (state.tokenize.isInAttribute) {\n        if (state.tagStart == state.indented)\n          return state.stringStartCol + 1;\n        else\n          return state.indented + indentUnit;\n      }\n      if (context && context.noIndent) return CodeMirror.Pass;\n      if (state.tokenize != inTag && state.tokenize != inText)\n        return fullLine ? fullLine.match(/^(\\s*)/)[0].length : 0;\n      // Indent the starts of attribute names.\n      if (state.tagName) {\n        if (config.multilineTagIndentPastTag !== false)\n          return state.tagStart + state.tagName.length + 2;\n        else\n          return state.tagStart + indentUnit * (config.multilineTagIndentFactor || 1);\n      }\n      if (config.alignCDATA && /<!\\[CDATA\\[/.test(textAfter)) return 0;\n      var tagAfter = textAfter && /^<(\\/)?([\\w_:\\.-]*)/.exec(textAfter);\n      if (tagAfter && tagAfter[1]) { // Closing tag spotted\n        while (context) {\n          if (context.tagName == tagAfter[2]) {\n            context = context.prev;\n            break;\n          } else if (config.implicitlyClosed.hasOwnProperty(lower(context.tagName))) {\n            context = context.prev;\n          } else {\n            break;\n          }\n        }\n      } else if (tagAfter) { // Opening tag spotted\n        while (context) {\n          var grabbers = config.contextGrabbers[lower(context.tagName)];\n          if (grabbers && grabbers.hasOwnProperty(lower(tagAfter[2])))\n            context = context.prev;\n          else\n            break;\n        }\n      }\n      while (context && context.prev && !context.startOfLine)\n        context = context.prev;\n      if (context) return context.indent + indentUnit;\n      else return state.baseIndent || 0;\n    },\n\n    electricInput: /<\\/[\\s\\w:]+>$/,\n    blockCommentStart: \"<!--\",\n    blockCommentEnd: \"-->\",\n\n    configuration: config.htmlMode ? \"html\" : \"xml\",\n    helperType: config.htmlMode ? \"html\" : \"xml\",\n\n    skipAttribute: function(state) {\n      if (state.state == attrValueState)\n        state.state = attrState\n    },\n\n    xmlCurrentTag: function(state) {\n      return state.tagName ? {name: state.tagName, close: state.type == \"closeTag\"} : null\n    },\n\n    xmlCurrentContext: function(state) {\n      var context = []\n      for (var cx = state.context; cx; cx = cx.prev)\n        context.push(cx.tagName)\n      return context.reverse()\n    }\n  };\n});\n\nCodeMirror.defineMIME(\"text/xml\", \"xml\");\nCodeMirror.defineMIME(\"application/xml\", \"xml\");\nif (!CodeMirror.mimeModes.hasOwnProperty(\"text/html\"))\n  CodeMirror.defineMIME(\"text/html\", {name: \"xml\", htmlMode: true});\n\n});\n","// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: http://codemirror.net/LICENSE\n\nvar CodeMirror = require('codemirror');\n\nCodeMirror.commands.tabAndIndentMarkdownList = function (cm) {\n    var ranges = cm.listSelections();\n    var pos = ranges[0].head;\n    var eolState = cm.getStateAfter(pos.line);\n    var inList = eolState.list !== false;\n\n    if (inList) {\n        cm.execCommand('indentMore');\n        return;\n    }\n\n    if (cm.options.indentWithTabs) {\n        cm.execCommand('insertTab');\n    } else {\n        var spaces = Array(cm.options.tabSize + 1).join(' ');\n        cm.replaceSelection(spaces);\n    }\n};\n\nCodeMirror.commands.shiftTabAndUnindentMarkdownList = function (cm) {\n    var ranges = cm.listSelections();\n    var pos = ranges[0].head;\n    var eolState = cm.getStateAfter(pos.line);\n    var inList = eolState.list !== false;\n\n    if (inList) {\n        cm.execCommand('indentLess');\n        return;\n    }\n\n    if (cm.options.indentWithTabs) {\n        cm.execCommand('insertTab');\n    } else {\n        var spaces = Array(cm.options.tabSize + 1).join(' ');\n        cm.replaceSelection(spaces);\n    }\n};\n","'use strict';\nvar CodeMirror = require('codemirror');\nrequire('codemirror/addon/edit/continuelist.js');\nrequire('./codemirror/tablist');\nrequire('codemirror/addon/display/fullscreen.js');\nrequire('codemirror/mode/markdown/markdown.js');\nrequire('codemirror/addon/mode/overlay.js');\nrequire('codemirror/addon/display/placeholder.js');\nrequire('codemirror/addon/display/autorefresh.js');\nrequire('codemirror/addon/selection/mark-selection.js');\nrequire('codemirror/addon/search/searchcursor.js');\nrequire('codemirror/mode/gfm/gfm.js');\nrequire('codemirror/mode/xml/xml.js');\nvar CodeMirrorSpellChecker = require('codemirror-spell-checker');\nvar marked = require('marked').marked;\n\n\n// Some variables\nvar isMac = /Mac/.test(navigator.platform);\nvar anchorToExternalRegex = new RegExp(/(<a.*?https?:\\/\\/.*?[^a]>)+?/g);\n\n// Mapping of actions that can be bound to keyboard shortcuts or toolbar buttons\nvar bindings = {\n    'toggleBold': toggleBold,\n    'toggleItalic': toggleItalic,\n    'drawLink': drawLink,\n    'toggleHeadingSmaller': toggleHeadingSmaller,\n    'toggleHeadingBigger': toggleHeadingBigger,\n    'drawImage': drawImage,\n    'toggleBlockquote': toggleBlockquote,\n    'toggleOrderedList': toggleOrderedList,\n    'toggleUnorderedList': toggleUnorderedList,\n    'toggleCheckList': toggleCheckList,\n    'toggleCodeBlock': toggleCodeBlock,\n    'togglePreview': togglePreview,\n    'toggleStrikethrough': toggleStrikethrough,\n    'toggleHeading1': toggleHeading1,\n    'toggleHeading2': toggleHeading2,\n    'toggleHeading3': toggleHeading3,\n    'toggleHeading4': toggleHeading4,\n    'toggleHeading5': toggleHeading5,\n    'toggleHeading6': toggleHeading6,\n    'cleanBlock': cleanBlock,\n    'drawTable': drawTable,\n    'drawHorizontalRule': drawHorizontalRule,\n    'undo': undo,\n    'redo': redo,\n    'toggleSideBySide': toggleSideBySide,\n    'toggleFullScreen': toggleFullScreen,\n};\n\nvar shortcuts = {\n    'toggleBold': 'Cmd-B',\n    'toggleItalic': 'Cmd-I',\n    'drawLink': 'Cmd-K',\n    'toggleHeadingSmaller': 'Cmd-H',\n    'toggleHeadingBigger': 'Shift-Cmd-H',\n    'toggleHeading1': 'Ctrl+Alt+1',\n    'toggleHeading2': 'Ctrl+Alt+2',\n    'toggleHeading3': 'Ctrl+Alt+3',\n    'toggleHeading4': 'Ctrl+Alt+4',\n    'toggleHeading5': 'Ctrl+Alt+5',\n    'toggleHeading6': 'Ctrl+Alt+6',\n    'cleanBlock': 'Cmd-E',\n    'drawImage': 'Cmd-Alt-I',\n    'toggleBlockquote': 'Cmd-\\'',\n    'toggleOrderedList': 'Cmd-Alt-L',\n    'toggleUnorderedList': 'Cmd-L',\n    'toggleCheckList': 'Shift-Cmd-L',\n    'toggleCodeBlock': 'Cmd-Alt-C',\n    'togglePreview': 'Cmd-P',\n    'toggleSideBySide': 'F9',\n    'toggleFullScreen': 'F11',\n};\n\nvar getBindingName = function (f) {\n    for (var key in bindings) {\n        if (bindings[key] === f) {\n            return key;\n        }\n    }\n    return null;\n};\n\nvar isMobile = function () {\n    var check = false;\n    (function (a) {\n        if (/(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw-(n|u)|c55\\/|capi|ccwa|cdm-|cell|chtm|cldc|cmd-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc-s|devi|dica|dmob|do(c|p)o|ds(12|-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(-|_)|g1 u|g560|gene|gf-5|g-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd-(m|p|t)|hei-|hi(pt|ta)|hp( i|ip)|hs-c|ht(c(-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i-(20|go|ma)|i230|iac( |-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|-[a-w])|libw|lynx|m1-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|-([1-8]|c))|phil|pire|pl(ay|uc)|pn-2|po(ck|rt|se)|prox|psio|pt-g|qa-a|qc(07|12|21|32|60|-[2-7]|i-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h-|oo|p-)|sdk\\/|se(c(-|0|1)|47|mc|nd|ri)|sgh-|shar|sie(-|m)|sk-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h-|v-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl-|tdg-|tel(i|m)|tim-|t-mo|to(pl|sh)|ts(70|m-|m3|m5)|tx-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas-|your|zeto|zte-/i.test(a.substr(0, 4))) check = true;\n    })(navigator.userAgent || navigator.vendor || window.opera);\n    return check;\n};\n\n/**\n * Modify HTML to add 'target=\"_blank\"' to links so they open in new tabs by default.\n * @param {string} htmlText - HTML to be modified.\n * @return {string} The modified HTML text.\n */\nfunction addAnchorTargetBlank(htmlText) {\n    var match;\n    while ((match = anchorToExternalRegex.exec(htmlText)) !== null) {\n        // With only one capture group in the RegExp, we can safely take the first index from the match.\n        var linkString = match[0];\n\n        if (linkString.indexOf('target=') === -1) {\n            var fixedLinkString = linkString.replace(/>$/, ' target=\"_blank\">');\n            htmlText = htmlText.replace(linkString, fixedLinkString);\n        }\n    }\n    return htmlText;\n}\n\n/**\n * Modify HTML to remove the list-style when rendering checkboxes.\n * @param {string} htmlText - HTML to be modified.\n * @return {string} The modified HTML text.\n */\nfunction removeListStyleWhenCheckbox(htmlText) {\n\n    var parser = new DOMParser();\n    var htmlDoc = parser.parseFromString(htmlText, 'text/html');\n    var listItems = htmlDoc.getElementsByTagName('li');\n\n    for (var i = 0; i < listItems.length; i++) {\n        var listItem = listItems[i];\n\n        for (var j = 0; j < listItem.children.length; j++) {\n            var listItemChild = listItem.children[j];\n\n            if (listItemChild instanceof HTMLInputElement && listItemChild.type === 'checkbox') {\n                // From Github: margin: 0 .2em .25em -1.6em;\n                listItem.style.marginLeft = '-1.5em';\n                listItem.style.listStyleType = 'none';\n            }\n        }\n    }\n\n    return htmlDoc.documentElement.innerHTML;\n}\n\n/**\n * Fix shortcut. Mac use Command, others use Ctrl.\n */\nfunction fixShortcut(name) {\n    if (isMac) {\n        name = name.replace('Ctrl', 'Cmd');\n    } else {\n        name = name.replace('Cmd', 'Ctrl');\n    }\n    return name;\n}\n\n/**\n * Create dropdown block\n */\nfunction createToolbarDropdown(options, enableTooltips, shortcuts, parent) {\n    var el = createToolbarButton(options, false, enableTooltips, shortcuts, 'button', parent);\n    el.classList.add('easymde-dropdown');\n\n    el.onclick = function () {\n        el.focus();\n    };\n\n    var content = document.createElement('div');\n    content.className = 'easymde-dropdown-content';\n    for (var childrenIndex = 0; childrenIndex < options.children.length; childrenIndex++) {\n\n        var child = options.children[childrenIndex];\n        var childElement;\n\n        if (typeof child === 'string' && child in toolbarBuiltInButtons) {\n            childElement = createToolbarButton(toolbarBuiltInButtons[child], true, enableTooltips, shortcuts, 'button', parent);\n        } else {\n            childElement = createToolbarButton(child, true, enableTooltips, shortcuts, 'button', parent);\n        }\n\n        childElement.addEventListener('click', function (e) { e.stopPropagation(); }, false);\n        content.appendChild(childElement);\n    }\n    el.appendChild(content);\n    return el;\n}\n\n/**\n * Create button element for toolbar.\n */\nfunction createToolbarButton(options, enableActions, enableTooltips, shortcuts, markup, parent) {\n    options = options || {};\n    var el = document.createElement(markup);\n\n    // Add 'custom' attributes as early as possible, so that 'official' attributes will never be overwritten.\n    if (options.attributes) {\n        for (var attribute in options.attributes) {\n            if (Object.prototype.hasOwnProperty.call(options.attributes, attribute)) {\n                el.setAttribute(attribute, options.attributes[attribute]);\n            }\n        }\n    }\n\n    var classNamePrefix = parent.options.toolbarButtonClassPrefix ? parent.options.toolbarButtonClassPrefix + '-' : '';\n    el.className = classNamePrefix + options.name;\n    el.setAttribute('type', markup);\n    enableTooltips = (enableTooltips == undefined) ? true : enableTooltips;\n\n    if (options.text) {\n        el.innerText = options.text;\n    }\n\n    // Properly handle custom shortcuts\n    if (options.name && options.name in shortcuts) {\n        bindings[options.name] = options.action;\n    }\n\n    if (options.title && enableTooltips) {\n        el.title = createTooltip(options.title, options.action, shortcuts);\n\n        if (isMac) {\n            el.title = el.title.replace('Ctrl', '⌘');\n            el.title = el.title.replace('Alt', '⌥');\n        }\n    }\n\n    if (options.title) {\n        el.setAttribute('aria-label', options.title);\n    }\n\n    if (options.noDisable) {\n        el.classList.add('no-disable');\n    }\n\n    if (options.noMobile) {\n        el.classList.add('no-mobile');\n    }\n\n    // Prevent errors if there is no class name in custom options\n    var classNameParts = [];\n    if (typeof options.className !== 'undefined') {\n        classNameParts = options.className.split(' ');\n    }\n\n    // Provide backwards compatibility with simple-markdown-editor by adding custom classes to the button.\n    var iconClasses = [];\n    for (var classNameIndex = 0; classNameIndex < classNameParts.length; classNameIndex++) {\n        var classNamePart = classNameParts[classNameIndex];\n        // Split icon classes from the button.\n        // Regex will detect \"fa\", \"fas\", \"fa-something\" and \"fa-some-icon-1\", but not \"fanfare\".\n        if (classNamePart.match(/^fa([srlb]|(-[\\w-]*)|$)/)) {\n            iconClasses.push(classNamePart);\n        } else {\n            el.classList.add(classNamePart);\n        }\n    }\n\n    el.tabIndex = -1;\n\n    if (iconClasses.length > 0) {\n        // Create icon element and append as a child to the button\n        var icon = document.createElement('i');\n        for (var iconClassIndex = 0; iconClassIndex < iconClasses.length; iconClassIndex++) {\n            var iconClass = iconClasses[iconClassIndex];\n            icon.classList.add(iconClass);\n        }\n        el.appendChild(icon);\n    }\n\n    // If there is a custom icon markup set, use that\n    if (typeof options.icon !== 'undefined') {\n        el.innerHTML = options.icon;\n    }\n\n    if (options.action && enableActions) {\n        if (typeof options.action === 'function') {\n            el.onclick = function (e) {\n                e.preventDefault();\n                options.action(parent);\n            };\n        } else if (typeof options.action === 'string') {\n            el.onclick = function (e) {\n                e.preventDefault();\n                window.open(options.action, '_blank');\n            };\n        }\n    }\n\n    return el;\n}\n\nfunction createSep() {\n    var el = document.createElement('i');\n    el.className = 'separator';\n    el.innerHTML = '|';\n    return el;\n}\n\nfunction createTooltip(title, action, shortcuts) {\n    var actionName;\n    var tooltip = title;\n\n    if (action) {\n        actionName = getBindingName(action);\n        if (shortcuts[actionName]) {\n            tooltip += ' (' + fixShortcut(shortcuts[actionName]) + ')';\n        }\n    }\n\n    return tooltip;\n}\n\n/**\n * The state of CodeMirror at the given position.\n */\nfunction getState(cm, pos) {\n    pos = pos || cm.getCursor('start');\n    var stat = cm.getTokenAt(pos);\n    if (!stat.type) return {};\n\n    var types = stat.type.split(' ');\n\n    var ret = {},\n        data, text;\n    for (var i = 0; i < types.length; i++) {\n        data = types[i];\n        if (data === 'strong') {\n            ret.bold = true;\n        } else if (data === 'variable-2') {\n            text = cm.getLine(pos.line);\n            if (/^\\s*\\d+\\.\\s/.test(text)) {\n                ret['ordered-list'] = true;\n            } else if (/^\\s*- \\[[ xX]]\\s/.test(text)) {\n                ret['check-list'] = true;\n            } else {\n                ret['unordered-list'] = true;\n            }\n        } else if (data === 'atom') {\n            ret.quote = true;\n        } else if (data === 'em') {\n            ret.italic = true;\n        } else if (data === 'quote') {\n            ret.quote = true;\n        } else if (data === 'strikethrough') {\n            ret.strikethrough = true;\n        } else if (data === 'comment') {\n            ret.code = true;\n        } else if (data === 'link' && !ret.image) {\n            ret.link = true;\n        } else if (data === 'image') {\n            ret.image = true;\n        } else if (data.match(/^header(-[1-6])?$/)) {\n            ret[data.replace('header', 'heading')] = true;\n        }\n    }\n    return ret;\n}\n\n\n// Saved overflow setting\nvar saved_overflow = '';\n\n/**\n * Toggle full screen of the editor.\n * @param {EasyMDE} editor\n */\nfunction toggleFullScreen(editor) {\n    // Set fullscreen\n    var cm = editor.codemirror;\n    cm.setOption('fullScreen', !cm.getOption('fullScreen'));\n\n\n    // Prevent scrolling on body during fullscreen active\n    if (cm.getOption('fullScreen')) {\n        saved_overflow = document.body.style.overflow;\n        document.body.style.overflow = 'hidden';\n    } else {\n        document.body.style.overflow = saved_overflow;\n    }\n\n    var wrapper = cm.getWrapperElement();\n    var sidebyside = wrapper.nextSibling;\n\n    if (sidebyside.classList.contains('editor-preview-active-side')) {\n        if (editor.options.sideBySideFullscreen === false) {\n            // if side-by-side not-fullscreen ok, apply classes as needed\n            var easyMDEContainer = wrapper.parentNode;\n            if (cm.getOption('fullScreen')) {\n                easyMDEContainer.classList.remove('sided--no-fullscreen');\n            } else {\n                easyMDEContainer.classList.add('sided--no-fullscreen');\n            }\n        } else {\n            toggleSideBySide(editor);\n        }\n    }\n\n    if (editor.options.onToggleFullScreen) {\n        editor.options.onToggleFullScreen(cm.getOption('fullScreen') || false);\n    }\n\n    // Remove or set maxHeight\n    if (typeof editor.options.maxHeight !== 'undefined') {\n        if (cm.getOption('fullScreen')) {\n            cm.getScrollerElement().style.removeProperty('height');\n            sidebyside.style.removeProperty('height');\n        } else {\n            cm.getScrollerElement().style.height = editor.options.maxHeight;\n            editor.setPreviewMaxHeight();\n        }\n    }\n\n    // Update toolbar class\n    editor.toolbar_div.classList.toggle('fullscreen');\n\n    // Update toolbar button\n    if (editor.toolbarElements && editor.toolbarElements.fullscreen) {\n        var toolbarButton = editor.toolbarElements.fullscreen;\n        toolbarButton.classList.toggle('active');\n    }\n}\n\n\n/**\n * Action for toggling bold.\n * @param {EasyMDE} editor\n */\nfunction toggleBold(editor) {\n    _toggleBlock(editor, 'bold', editor.options.blockStyles.bold);\n}\n\n\n/**\n * Action for toggling italic.\n * @param {EasyMDE} editor\n */\nfunction toggleItalic(editor) {\n    _toggleBlock(editor, 'italic', editor.options.blockStyles.italic);\n}\n\n\n/**\n * Action for toggling strikethrough.\n * @param {EasyMDE} editor\n */\nfunction toggleStrikethrough(editor) {\n    _toggleBlock(editor, 'strikethrough', '~~');\n}\n\n/**\n * Action for toggling code block.\n * @param {EasyMDE} editor\n */\nfunction toggleCodeBlock(editor) {\n    var fenceCharsToInsert = editor.options.blockStyles.code;\n\n    function fencing_line(line) {\n        /* return true, if this is a ``` or ~~~ line */\n        if (typeof line !== 'object') {\n            throw 'fencing_line() takes a \\'line\\' object (not a line number, or line text).  Got: ' + typeof line + ': ' + line;\n        }\n        return line.styles && line.styles[2] && line.styles[2].indexOf('formatting-code-block') !== -1;\n    }\n\n    function token_state(token) {\n        // base goes an extra level deep when mode backdrops are used, e.g. spellchecker on\n        return token.state.base.base || token.state.base;\n    }\n\n    function code_type(cm, line_num, line, firstTok, lastTok) {\n        /*\n         * Return \"single\", \"indented\", \"fenced\" or false\n         *\n         * cm and line_num are required.  Others are optional for efficiency\n         *   To check in the middle of a line, pass in firstTok yourself.\n         */\n        line = line || cm.getLineHandle(line_num);\n        firstTok = firstTok || cm.getTokenAt({\n            line: line_num,\n            ch: 1,\n        });\n        lastTok = lastTok || (!!line.text && cm.getTokenAt({\n            line: line_num,\n            ch: line.text.length - 1,\n        }));\n        var types = firstTok.type ? firstTok.type.split(' ') : [];\n        if (lastTok && token_state(lastTok).indentedCode) {\n            // have to check last char, since first chars of first line aren\"t marked as indented\n            return 'indented';\n        } else if (types.indexOf('comment') === -1) {\n            // has to be after \"indented\" check, since first chars of first indented line aren\"t marked as such\n            return false;\n        } else if (token_state(firstTok).fencedChars || token_state(lastTok).fencedChars || fencing_line(line)) {\n            return 'fenced';\n        } else {\n            return 'single';\n        }\n    }\n\n    function insertFencingAtSelection(cm, cur_start, cur_end, fenceCharsToInsert) {\n        var start_line_sel = cur_start.line + 1,\n            end_line_sel = cur_end.line + 1,\n            sel_multi = cur_start.line !== cur_end.line,\n            repl_start = fenceCharsToInsert + '\\n',\n            repl_end = '\\n' + fenceCharsToInsert;\n        if (sel_multi) {\n            end_line_sel++;\n        }\n        // handle last char including \\n or not\n        if (sel_multi && cur_end.ch === 0) {\n            repl_end = fenceCharsToInsert + '\\n';\n            end_line_sel--;\n        }\n        _replaceSelection(cm, false, [repl_start, repl_end]);\n        cm.setSelection({\n            line: start_line_sel,\n            ch: 0,\n        }, {\n            line: end_line_sel,\n            ch: 0,\n        });\n    }\n\n    var cm = editor.codemirror,\n        cur_start = cm.getCursor('start'),\n        cur_end = cm.getCursor('end'),\n        tok = cm.getTokenAt({\n            line: cur_start.line,\n            ch: cur_start.ch || 1,\n        }), // avoid ch 0 which is a cursor pos but not token\n        line = cm.getLineHandle(cur_start.line),\n        is_code = code_type(cm, cur_start.line, line, tok);\n    var block_start, block_end, lineCount;\n\n    if (is_code === 'single') {\n        // similar to some EasyMDE _toggleBlock logic\n        var start = line.text.slice(0, cur_start.ch).replace('`', ''),\n            end = line.text.slice(cur_start.ch).replace('`', '');\n        cm.replaceRange(start + end, {\n            line: cur_start.line,\n            ch: 0,\n        }, {\n            line: cur_start.line,\n            ch: 99999999999999,\n        });\n        cur_start.ch--;\n        if (cur_start !== cur_end) {\n            cur_end.ch--;\n        }\n        cm.setSelection(cur_start, cur_end);\n        cm.focus();\n    } else if (is_code === 'fenced') {\n        if (cur_start.line !== cur_end.line || cur_start.ch !== cur_end.ch) {\n            // use selection\n\n            // find the fenced line so we know what type it is (tilde, backticks, number of them)\n            for (block_start = cur_start.line; block_start >= 0; block_start--) {\n                line = cm.getLineHandle(block_start);\n                if (fencing_line(line)) {\n                    break;\n                }\n            }\n            var fencedTok = cm.getTokenAt({\n                line: block_start,\n                ch: 1,\n            });\n            var fence_chars = token_state(fencedTok).fencedChars;\n            var start_text, start_line;\n            var end_text, end_line;\n            // check for selection going up against fenced lines, in which case we don't want to add more fencing\n            if (fencing_line(cm.getLineHandle(cur_start.line))) {\n                start_text = '';\n                start_line = cur_start.line;\n            } else if (fencing_line(cm.getLineHandle(cur_start.line - 1))) {\n                start_text = '';\n                start_line = cur_start.line - 1;\n            } else {\n                start_text = fence_chars + '\\n';\n                start_line = cur_start.line;\n            }\n            if (fencing_line(cm.getLineHandle(cur_end.line))) {\n                end_text = '';\n                end_line = cur_end.line;\n                if (cur_end.ch === 0) {\n                    end_line += 1;\n                }\n            } else if (cur_end.ch !== 0 && fencing_line(cm.getLineHandle(cur_end.line + 1))) {\n                end_text = '';\n                end_line = cur_end.line + 1;\n            } else {\n                end_text = fence_chars + '\\n';\n                end_line = cur_end.line + 1;\n            }\n            if (cur_end.ch === 0) {\n                // full last line selected, putting cursor at beginning of next\n                end_line -= 1;\n            }\n            cm.operation(function () {\n                // end line first, so that line numbers don't change\n                cm.replaceRange(end_text, {\n                    line: end_line,\n                    ch: 0,\n                }, {\n                    line: end_line + (end_text ? 0 : 1),\n                    ch: 0,\n                });\n                cm.replaceRange(start_text, {\n                    line: start_line,\n                    ch: 0,\n                }, {\n                    line: start_line + (start_text ? 0 : 1),\n                    ch: 0,\n                });\n            });\n            cm.setSelection({\n                line: start_line + (start_text ? 1 : 0),\n                ch: 0,\n            }, {\n                line: end_line + (start_text ? 1 : -1),\n                ch: 0,\n            });\n            cm.focus();\n        } else {\n            // no selection, search for ends of this fenced block\n            var search_from = cur_start.line;\n            if (fencing_line(cm.getLineHandle(cur_start.line))) { // gets a little tricky if cursor is right on a fenced line\n                if (code_type(cm, cur_start.line + 1) === 'fenced') {\n                    block_start = cur_start.line;\n                    search_from = cur_start.line + 1; // for searching for \"end\"\n                } else {\n                    block_end = cur_start.line;\n                    search_from = cur_start.line - 1; // for searching for \"start\"\n                }\n            }\n            if (block_start === undefined) {\n                for (block_start = search_from; block_start >= 0; block_start--) {\n                    line = cm.getLineHandle(block_start);\n                    if (fencing_line(line)) {\n                        break;\n                    }\n                }\n            }\n            if (block_end === undefined) {\n                lineCount = cm.lineCount();\n                for (block_end = search_from; block_end < lineCount; block_end++) {\n                    line = cm.getLineHandle(block_end);\n                    if (fencing_line(line)) {\n                        break;\n                    }\n                }\n            }\n            cm.operation(function () {\n                cm.replaceRange('', {\n                    line: block_start,\n                    ch: 0,\n                }, {\n                    line: block_start + 1,\n                    ch: 0,\n                });\n                cm.replaceRange('', {\n                    line: block_end - 1,\n                    ch: 0,\n                }, {\n                    line: block_end,\n                    ch: 0,\n                });\n            });\n            cm.focus();\n        }\n    } else if (is_code === 'indented') {\n        if (cur_start.line !== cur_end.line || cur_start.ch !== cur_end.ch) {\n            // use selection\n            block_start = cur_start.line;\n            block_end = cur_end.line;\n            if (cur_end.ch === 0) {\n                block_end--;\n            }\n        } else {\n            // no selection, search for ends of this indented block\n            for (block_start = cur_start.line; block_start >= 0; block_start--) {\n                line = cm.getLineHandle(block_start);\n                if (line.text.match(/^\\s*$/)) {\n                    // empty or all whitespace - keep going\n                    continue;\n                } else {\n                    if (code_type(cm, block_start, line) !== 'indented') {\n                        block_start += 1;\n                        break;\n                    }\n                }\n            }\n            lineCount = cm.lineCount();\n            for (block_end = cur_start.line; block_end < lineCount; block_end++) {\n                line = cm.getLineHandle(block_end);\n                if (line.text.match(/^\\s*$/)) {\n                    // empty or all whitespace - keep going\n                    continue;\n                } else {\n                    if (code_type(cm, block_end, line) !== 'indented') {\n                        block_end -= 1;\n                        break;\n                    }\n                }\n            }\n        }\n        // if we are going to un-indent based on a selected set of lines, and the next line is indented too, we need to\n        // insert a blank line so that the next line(s) continue to be indented code\n        var next_line = cm.getLineHandle(block_end + 1),\n            next_line_last_tok = next_line && cm.getTokenAt({\n                line: block_end + 1,\n                ch: next_line.text.length - 1,\n            }),\n            next_line_indented = next_line_last_tok && token_state(next_line_last_tok).indentedCode;\n        if (next_line_indented) {\n            cm.replaceRange('\\n', {\n                line: block_end + 1,\n                ch: 0,\n            });\n        }\n\n        for (var i = block_start; i <= block_end; i++) {\n            cm.indentLine(i, 'subtract'); // TODO: this doesn't get tracked in the history, so can't be undone :(\n        }\n        cm.focus();\n    } else {\n        // insert code formatting\n        var no_sel_and_starting_of_line = (cur_start.line === cur_end.line && cur_start.ch === cur_end.ch && cur_start.ch === 0);\n        var sel_multi = cur_start.line !== cur_end.line;\n        if (no_sel_and_starting_of_line || sel_multi) {\n            insertFencingAtSelection(cm, cur_start, cur_end, fenceCharsToInsert);\n        } else {\n            _replaceSelection(cm, false, ['`', '`']);\n        }\n    }\n}\n\n/**\n * Action for toggling blockquote.\n */\nfunction toggleBlockquote(editor) {\n    _toggleLine(editor.codemirror, 'quote');\n}\n\n/**\n * Action for toggling heading size: normal -> h1 -> h2 -> h3 -> h4 -> h5 -> h6 -> normal\n */\nfunction toggleHeadingSmaller(editor) {\n    _toggleHeading(editor.codemirror, 'smaller');\n}\n\n/**\n * Action for toggling heading size: normal -> h6 -> h5 -> h4 -> h3 -> h2 -> h1 -> normal\n */\nfunction toggleHeadingBigger(editor) {\n    _toggleHeading(editor.codemirror, 'bigger');\n}\n\n/**\n * Action for toggling heading size 1\n */\nfunction toggleHeading1(editor) {\n    _toggleHeading(editor.codemirror, undefined, 1);\n}\n\n/**\n * Action for toggling heading size 2\n */\nfunction toggleHeading2(editor) {\n    _toggleHeading(editor.codemirror, undefined, 2);\n}\n\n/**\n * Action for toggling heading size 3\n */\nfunction toggleHeading3(editor) {\n    _toggleHeading(editor.codemirror, undefined, 3);\n}\n\n/**\n * Action for toggling heading size 4\n */\nfunction toggleHeading4(editor) {\n    _toggleHeading(editor.codemirror, undefined, 4);\n}\n\n/**\n * Action for toggling heading size 5\n */\nfunction toggleHeading5(editor) {\n    _toggleHeading(editor.codemirror, undefined, 5);\n}\n\n/**\n * Action for toggling heading size 6\n */\nfunction toggleHeading6(editor) {\n    _toggleHeading(editor.codemirror, undefined, 6);\n}\n\n\n/**\n * Action for toggling ul.\n */\nfunction toggleUnorderedList(editor) {\n    var cm = editor.codemirror;\n\n    var listStyle = '*'; // Default\n    if (['-', '+', '*'].includes(editor.options.unorderedListStyle)) {\n        listStyle = editor.options.unorderedListStyle;\n    }\n\n    _toggleLine(cm, 'unordered-list', listStyle);\n}\n\n\n/**\n * Action for toggling ol.\n */\nfunction toggleOrderedList(editor) {\n    _toggleLine(editor.codemirror, 'ordered-list');\n}\n\nfunction toggleCheckList(editor) {\n    _toggleLine(editor.codemirror, 'check-list');\n}\n\n/**\n * Action for clean block (remove headline, list, blockquote code, markers)\n */\nfunction cleanBlock(editor) {\n    _cleanBlock(editor.codemirror);\n}\n\n/**\n * Action for drawing a link.\n * @param {EasyMDE} editor\n */\nfunction drawLink(editor) {\n    var options = editor.options;\n    var url = 'https://';\n    if (options.promptURLs) {\n        var result = prompt(options.promptTexts.link, url);\n        if (!result) {\n            return false;\n        }\n        url = escapePromptURL(result);\n    }\n    _toggleLink(editor, 'link', options.insertTexts.link, url);\n}\n\n/**\n * Action for drawing an img.\n * @param {EasyMDE} editor\n */\nfunction drawImage(editor) {\n    var options = editor.options;\n    var url = 'https://';\n    if (options.promptURLs) {\n        var result = prompt(options.promptTexts.image, url);\n        if (!result) {\n            return false;\n        }\n        url = escapePromptURL(result);\n    }\n    _toggleLink(editor, 'image', options.insertTexts.image, url);\n}\n\n/**\n * Encode and escape URLs to prevent breaking up rendered Markdown links.\n * @param {string} url The url of the link or image\n */\nfunction escapePromptURL(url) {\n    return encodeURI(url).replace(/([\\\\()])/g, '\\\\$1');\n}\n\n/**\n * Action for opening the browse-file window to upload an image to a server.\n * @param {EasyMDE} editor The EasyMDE object\n */\nfunction drawUploadedImage(editor) {\n    // TODO: Draw the image template with a fake url? ie: '![](importing foo.png...)'\n    editor.openBrowseFileWindow();\n}\n\n/**\n * Action executed after an image have been successfully imported on the server.\n * @param {EasyMDE} editor The EasyMDE object\n * @param {string} url The url of the uploaded image\n */\nfunction afterImageUploaded(editor, url) {\n    var cm = editor.codemirror;\n    var stat = getState(cm);\n    var options = editor.options;\n    var imageName = url.substr(url.lastIndexOf('/') + 1);\n    var ext = imageName.substring(imageName.lastIndexOf('.') + 1).replace(/\\?.*$/, '').toLowerCase();\n\n    // Check if media is an image\n    if (['png', 'jpg', 'jpeg', 'gif', 'svg', 'apng', 'avif', 'webp'].includes(ext)) {\n        _replaceSelection(cm, stat.image, options.insertTexts.uploadedImage, url);\n    } else {\n        var text_link = options.insertTexts.link;\n        text_link[0] = '[' + imageName;\n        _replaceSelection(cm, stat.link, text_link, url);\n    }\n\n    // show uploaded image filename for 1000ms\n    editor.updateStatusBar('upload-image', editor.options.imageTexts.sbOnUploaded.replace('#image_name#', imageName));\n    setTimeout(function () {\n        editor.updateStatusBar('upload-image', editor.options.imageTexts.sbInit);\n    }, 1000);\n}\n\n/**\n * Action for drawing a table.\n * @param {EasyMDE} editor\n */\nfunction drawTable(editor) {\n    var cm = editor.codemirror;\n    var stat = getState(cm);\n    var options = editor.options;\n    _replaceSelection(cm, stat.table, options.insertTexts.table);\n}\n\n/**\n * Action for drawing a horizontal rule.\n * @param {EasyMDE} editor\n */\nfunction drawHorizontalRule(editor) {\n    var cm = editor.codemirror;\n    var stat = getState(cm);\n    var options = editor.options;\n    _replaceSelection(cm, stat.image, options.insertTexts.horizontalRule);\n}\n\n\n/**\n * Undo action.\n * @param {EasyMDE} editor\n */\nfunction undo(editor) {\n    var cm = editor.codemirror;\n    cm.undo();\n    cm.focus();\n}\n\n\n/**\n * Redo action.\n * @param {EasyMDE} editor\n */\nfunction redo(editor) {\n    var cm = editor.codemirror;\n    cm.redo();\n    cm.focus();\n}\n\n\n/**\n * Toggle side by side preview\n * @param {EasyMDE} editor\n */\nfunction toggleSideBySide(editor) {\n    var cm = editor.codemirror;\n    var wrapper = cm.getWrapperElement();\n    var preview = wrapper.nextSibling;\n    var toolbarButton = editor.toolbarElements && editor.toolbarElements['side-by-side'];\n    var useSideBySideListener = false;\n\n    var easyMDEContainer = wrapper.parentNode;\n\n    if (preview.classList.contains('editor-preview-active-side')) {\n        if (editor.options.sideBySideFullscreen === false) {\n            // if side-by-side not-fullscreen ok, remove classes when hiding side\n            easyMDEContainer.classList.remove('sided--no-fullscreen');\n        }\n        preview.classList.remove('editor-preview-active-side');\n        if (toolbarButton) toolbarButton.classList.remove('active');\n        wrapper.classList.remove('CodeMirror-sided');\n    } else {\n        // When the preview button is clicked for the first time,\n        // give some time for the transition from editor.css to fire and the view to slide from right to left,\n        // instead of just appearing.\n        setTimeout(function () {\n            if (!cm.getOption('fullScreen')) {\n                if (editor.options.sideBySideFullscreen === false) {\n                    // if side-by-side not-fullscreen ok, add classes when not fullscreen and showing side\n                    easyMDEContainer.classList.add('sided--no-fullscreen');\n                } else {\n                    toggleFullScreen(editor);\n                }\n            }\n            preview.classList.add('editor-preview-active-side');\n        }, 1);\n        if (toolbarButton) toolbarButton.classList.add('active');\n        wrapper.classList.add('CodeMirror-sided');\n        useSideBySideListener = true;\n    }\n\n    // Hide normal preview if active\n    var previewNormal = wrapper.lastChild;\n    if (previewNormal.classList.contains('editor-preview-active')) {\n        previewNormal.classList.remove('editor-preview-active');\n        var toolbar = editor.toolbarElements.preview;\n        var toolbar_div = editor.toolbar_div;\n        toolbar.classList.remove('active');\n        toolbar_div.classList.remove('disabled-for-preview');\n    }\n\n    var sideBySideRenderingFunction = function () {\n        var newValue = editor.options.previewRender(editor.value(), preview);\n        if (newValue != null) {\n            preview.innerHTML = newValue;\n        }\n    };\n\n    if (!cm.sideBySideRenderingFunction) {\n        cm.sideBySideRenderingFunction = sideBySideRenderingFunction;\n    }\n\n    if (useSideBySideListener) {\n        var newValue = editor.options.previewRender(editor.value(), preview);\n        if (newValue != null) {\n            preview.innerHTML = newValue;\n        }\n        cm.on('update', cm.sideBySideRenderingFunction);\n    } else {\n        cm.off('update', cm.sideBySideRenderingFunction);\n    }\n\n    // Refresh to fix selection being off (#309)\n    cm.refresh();\n}\n\n\n/**\n * Preview action.\n * @param {EasyMDE} editor\n */\nfunction togglePreview(editor) {\n    var cm = editor.codemirror;\n    var wrapper = cm.getWrapperElement();\n    var toolbar_div = editor.toolbar_div;\n    var toolbar = editor.options.toolbar ? editor.toolbarElements.preview : false;\n    var preview = wrapper.lastChild;\n\n    // Turn off side by side if needed\n    var sidebyside = cm.getWrapperElement().nextSibling;\n    if (sidebyside.classList.contains('editor-preview-active-side'))\n        toggleSideBySide(editor);\n\n    if (!preview || !preview.classList.contains('editor-preview-full')) {\n\n        preview = document.createElement('div');\n        preview.className = 'editor-preview-full';\n\n        if (editor.options.previewClass) {\n\n            if (Array.isArray(editor.options.previewClass)) {\n                for (var i = 0; i < editor.options.previewClass.length; i++) {\n                    preview.classList.add(editor.options.previewClass[i]);\n                }\n\n            } else if (typeof editor.options.previewClass === 'string') {\n                preview.classList.add(editor.options.previewClass);\n            }\n        }\n\n        wrapper.appendChild(preview);\n    }\n\n    if (preview.classList.contains('editor-preview-active')) {\n        preview.classList.remove('editor-preview-active');\n        if (toolbar) {\n            toolbar.classList.remove('active');\n            toolbar_div.classList.remove('disabled-for-preview');\n        }\n    } else {\n        // When the preview button is clicked for the first time,\n        // give some time for the transition from editor.css to fire and the view to slide from right to left,\n        // instead of just appearing.\n        setTimeout(function () {\n            preview.classList.add('editor-preview-active');\n        }, 1);\n        if (toolbar) {\n            toolbar.classList.add('active');\n            toolbar_div.classList.add('disabled-for-preview');\n        }\n    }\n\n    var preview_result = editor.options.previewRender(editor.value(), preview);\n    if (preview_result !== null) {\n        preview.innerHTML = preview_result;\n    }\n\n}\n\nfunction _replaceSelection(cm, active, startEnd, url) {\n    if (cm.getWrapperElement().lastChild.classList.contains('editor-preview-active'))\n        return;\n\n    var text;\n    var start = startEnd[0];\n    var end = startEnd[1];\n    var startPoint = {},\n        endPoint = {};\n    Object.assign(startPoint, cm.getCursor('start'));\n    Object.assign(endPoint, cm.getCursor('end'));\n    if (url) {\n        start = start.replace('#url#', url);  // url is in start for upload-image\n        end = end.replace('#url#', url);\n    }\n    if (active) {\n        text = cm.getLine(startPoint.line);\n        start = text.slice(0, startPoint.ch);\n        end = text.slice(startPoint.ch);\n        cm.replaceRange(start + end, {\n            line: startPoint.line,\n            ch: 0,\n        });\n    } else {\n        text = cm.getSelection();\n        cm.replaceSelection(start + text + end);\n\n        startPoint.ch += start.length;\n        if (startPoint !== endPoint) {\n            endPoint.ch += start.length;\n        }\n    }\n    cm.setSelection(startPoint, endPoint);\n    cm.focus();\n}\n\n\nfunction _toggleHeading(cm, direction, size) {\n    if (cm.getWrapperElement().lastChild.classList.contains('editor-preview-active'))\n        return;\n\n    var startPoint = cm.getCursor('start');\n    var endPoint = cm.getCursor('end');\n    for (var i = startPoint.line; i <= endPoint.line; i++) {\n        (function (i) {\n            var text = cm.getLine(i);\n            var currHeadingLevel = text.search(/[^#]/);\n\n            if (direction !== undefined) {\n                if (currHeadingLevel <= 0) {\n                    if (direction == 'bigger') {\n                        text = '###### ' + text;\n                    } else {\n                        text = '# ' + text;\n                    }\n                } else if (currHeadingLevel == 6 && direction == 'smaller') {\n                    text = text.substr(7);\n                } else if (currHeadingLevel == 1 && direction == 'bigger') {\n                    text = text.substr(2);\n                } else {\n                    if (direction == 'bigger') {\n                        text = text.substr(1);\n                    } else {\n                        text = '#' + text;\n                    }\n                }\n            } else {\n                if (currHeadingLevel <= 0) {\n                    text = '#'.repeat(size) + ' ' + text;\n                } else if (currHeadingLevel == size) {\n                    text = text.substr(currHeadingLevel + 1);\n                } else {\n                    text = '#'.repeat(size) + ' ' + text.substr(currHeadingLevel + 1);\n                }\n            }\n\n            cm.replaceRange(text, {\n                line: i,\n                ch: 0,\n            }, {\n                line: i,\n                ch: 99999999999999,\n            });\n        })(i);\n    }\n    cm.focus();\n}\n\n\nfunction _toggleLine(cm, name, liststyle) {\n    if (cm.getWrapperElement().lastChild.classList.contains('editor-preview-active'))\n        return;\n\n    var listRegexp = /^(\\s*)(\\*|-|\\+|\\d*\\.)(\\s+)/;\n    var whitespacesRegexp = /^\\s*/;\n\n    var stat = getState(cm);\n    var startPoint = cm.getCursor('start');\n    var endPoint = cm.getCursor('end');\n    var repl = {\n        'quote': /^(\\s*)>\\s+/,\n        'unordered-list': listRegexp,\n        'ordered-list': listRegexp,\n        'check-list': /^(\\s*)(- \\[[ xX]])(\\s+)/,\n    };\n\n    var _getChar = function (name, i) {\n        var map = {\n            'quote': '>',\n            'unordered-list': liststyle,\n            'ordered-list': '%%i.',\n            'check-list': '- [ ]',\n        };\n\n        return map[name].replace('%%i', i);\n    };\n\n    var _checkChar = function (name, char) {\n        var map = {\n            'quote': '>',\n            'unordered-list': '\\\\' + liststyle,\n            'ordered-list': '\\\\d+.',\n            'check-list': '- \\\\[[ xX]]',\n        };\n        var rt = new RegExp(map[name]);\n\n        return char && rt.test(char);\n    };\n\n    var _toggle = function (name, text, untoggleOnly) {\n        var arr = listRegexp.exec(text);\n        var char = _getChar(name, line);\n        if (arr !== null) {\n            if (_checkChar(name, arr[2])) {\n                char = '';\n            }\n            text = arr[1] + char + arr[3] + text.replace(whitespacesRegexp, '').replace(repl[name], '$1');\n        } else if (untoggleOnly == false) {\n            text = char + ' ' + text;\n        }\n        return text;\n    };\n\n    var line = 1;\n    var listTypes = ['unordered-list', 'ordered-list', 'check-list'];\n    var currentType = Object.keys(stat)[0];\n    // After selectAll the cursor's start sits at column 0, where getTokenAt\n    // yields no type — stat comes back empty and currentType is undefined,\n    // making the swap branch below unreachable. Fall back to detecting the\n    // type from the first selected line's text.\n    if (!listTypes.includes(currentType)) {\n        var firstLineText = cm.getLine(startPoint.line);\n        if (/^\\s*- \\[[ xX]]\\s/.test(firstLineText)) currentType = 'check-list';\n        else if (/^\\s*\\d+\\.\\s/.test(firstLineText)) currentType = 'ordered-list';\n        else if (/^\\s*[*\\-+]\\s/.test(firstLineText)) currentType = 'unordered-list';\n    }\n    for (var i = startPoint.line; i <= endPoint.line; i++) {\n        (function (i) {\n            var text = cm.getLine(i);\n            if (stat[name]) {\n                text = text.replace(repl[name], '$1');\n            } else if ( listTypes.includes(currentType) && listTypes.includes(name) ) {\n                text = text.replace(repl[currentType], '$1');\n                text = _toggle(name, text, false);\n                line += 1;\n            } else {\n                text = _toggle(name, text, false);\n                line += 1;\n            }\n            cm.replaceRange(text, {\n                line: i,\n                ch: 0,\n            }, {\n                line: i,\n                ch: 99999999999999,\n            });\n        })(i);\n    }\n    cm.focus();\n}\n\n/**\n * @param {EasyMDE} editor\n * @param {'link' | 'image'} type\n * @param {string} startEnd\n * @param {string} url\n */\nfunction _toggleLink(editor, type, startEnd, url) {\n    if (!editor.codemirror || editor.isPreviewActive()) {\n        return;\n    }\n\n    var cm = editor.codemirror;\n    var stat = getState(cm);\n    var active = stat[type];\n    if (!active) {\n        _replaceSelection(cm, active, startEnd, url);\n        return;\n    }\n\n    var startPoint = cm.getCursor('start');\n    var endPoint = cm.getCursor('end');\n    var text = cm.getLine(startPoint.line);\n    var start = text.slice(0, startPoint.ch);\n    var end = text.slice(startPoint.ch);\n\n    if (type == 'link') {\n        start = start.replace(/(.*)[^!]\\[/, '$1');\n    } else if (type == 'image') {\n        start = start.replace(/(.*)!\\[$/, '$1');\n    }\n    end = end.replace(/]\\(.*?\\)/, '');\n\n    cm.replaceRange(start + end, {\n        line: startPoint.line,\n        ch: 0,\n    }, {\n        line: startPoint.line,\n        ch: 99999999999999,\n    });\n\n    startPoint.ch -= startEnd[0].length;\n    if (startPoint !== endPoint) {\n        endPoint.ch -= startEnd[0].length;\n    }\n    cm.setSelection(startPoint, endPoint);\n    cm.focus();\n}\n\n/**\n * @param {EasyMDE} editor\n */\nfunction _toggleBlock(editor, type, start_chars, end_chars) {\n    if (!editor.codemirror || editor.isPreviewActive()) {\n        return;\n    }\n\n    end_chars = (typeof end_chars === 'undefined') ? start_chars : end_chars;\n    var cm = editor.codemirror;\n    var stat = getState(cm);\n\n    var text;\n    var start = start_chars;\n    var end = end_chars;\n\n    var startPoint = cm.getCursor('start');\n    var endPoint = cm.getCursor('end');\n\n    if (stat[type]) {\n        text = cm.getLine(startPoint.line);\n        start = text.slice(0, startPoint.ch);\n        end = text.slice(startPoint.ch);\n        if (type == 'bold') {\n            start = start.replace(/(\\*\\*|__)(?![\\s\\S]*(\\*\\*|__))/, '');\n            end = end.replace(/(\\*\\*|__)/, '');\n        } else if (type == 'italic') {\n            start = start.replace(/(\\*|_)(?![\\s\\S]*(\\*|_))/, '');\n            end = end.replace(/(\\*|_)/, '');\n        } else if (type == 'strikethrough') {\n            start = start.replace(/(\\*\\*|~~)(?![\\s\\S]*(\\*\\*|~~))/, '');\n            end = end.replace(/(\\*\\*|~~)/, '');\n        }\n        cm.replaceRange(start + end, {\n            line: startPoint.line,\n            ch: 0,\n        }, {\n            line: startPoint.line,\n            ch: 99999999999999,\n        });\n\n        if (type == 'bold' || type == 'strikethrough') {\n            startPoint.ch -= 2;\n            if (startPoint !== endPoint) {\n                endPoint.ch -= 2;\n            }\n        } else if (type == 'italic') {\n            startPoint.ch -= 1;\n            if (startPoint !== endPoint) {\n                endPoint.ch -= 1;\n            }\n        }\n    } else {\n        text = cm.getSelection();\n        if (type == 'bold') {\n            text = text.split('**').join('');\n            text = text.split('__').join('');\n        } else if (type == 'italic') {\n            text = text.split('*').join('');\n            text = text.split('_').join('');\n        } else if (type == 'strikethrough') {\n            text = text.split('~~').join('');\n        }\n        cm.replaceSelection(start + text + end);\n\n        startPoint.ch += start_chars.length;\n        endPoint.ch = startPoint.ch + text.length;\n    }\n\n    cm.setSelection(startPoint, endPoint);\n    cm.focus();\n}\n\nfunction _cleanBlock(cm) {\n    if (cm.getWrapperElement().lastChild.classList.contains('editor-preview-active'))\n        return;\n\n    var startPoint = cm.getCursor('start');\n    var endPoint = cm.getCursor('end');\n    var text;\n\n    for (var line = startPoint.line; line <= endPoint.line; line++) {\n        text = cm.getLine(line);\n        text = text.replace(/^[ ]*([# ]+|\\*|-|[> ]+|[0-9]+(.|\\)))[ ]*/, '');\n\n        cm.replaceRange(text, {\n            line: line,\n            ch: 0,\n        }, {\n            line: line,\n            ch: 99999999999999,\n        });\n    }\n}\n\n/**\n * Convert a number of bytes to a human-readable file size. If you desire\n * to add a space between the value and the unit, you need to add this space\n * to the given units.\n * @param bytes {number} A number of bytes, as integer. Ex: 421137\n * @param units {number[]} An array of human-readable units, ie. [' B', ' K', ' MB']\n * @returns string A human-readable file size. Ex: '412 KB'\n */\nfunction humanFileSize(bytes, units) {\n    if (Math.abs(bytes) < 1024) {\n        return '' + bytes + units[0];\n    }\n    var u = 0;\n    do {\n        bytes /= 1024;\n        ++u;\n    } while (Math.abs(bytes) >= 1024 && u < units.length);\n    return '' + bytes.toFixed(1) + units[u];\n}\n\n// Merge the properties of one object into another.\nfunction _mergeProperties(target, source) {\n    for (var property in source) {\n        if (Object.prototype.hasOwnProperty.call(source, property)) {\n            if (source[property] instanceof Array) {\n                target[property] = source[property].concat(target[property] instanceof Array ? target[property] : []);\n            } else if (\n                source[property] !== null &&\n                typeof source[property] === 'object' &&\n                source[property].constructor === Object\n            ) {\n                target[property] = _mergeProperties(target[property] || {}, source[property]);\n            } else {\n                target[property] = source[property];\n            }\n        }\n    }\n\n    return target;\n}\n\n// Merge an arbitrary number of objects into one.\nfunction extend(target) {\n    for (var i = 1; i < arguments.length; i++) {\n        target = _mergeProperties(target, arguments[i]);\n    }\n\n    return target;\n}\n\n/* The right word count in respect for CJK. */\nfunction wordCount(data) {\n    var pattern = /[a-zA-Z0-9_\\u00A0-\\u02AF\\u0392-\\u03c9\\u0410-\\u04F9]+|[\\u4E00-\\u9FFF\\u3400-\\u4dbf\\uf900-\\ufaff\\u3040-\\u309f\\uac00-\\ud7af]+/g;\n    var m = data.match(pattern);\n    var count = 0;\n    if (m === null) return count;\n    for (var i = 0; i < m.length; i++) {\n        if (m[i].charCodeAt(0) >= 0x4E00) {\n            count += m[i].length;\n        } else {\n            count += 1;\n        }\n    }\n    return count;\n}\n\nvar iconClassMap = {\n    'bold': 'fa fa-bold',\n    'italic': 'fa fa-italic',\n    'strikethrough': 'fa fa-strikethrough',\n    'heading': 'fa fa-header fa-heading',\n    'heading-smaller': 'fa fa-header fa-heading header-smaller',\n    'heading-bigger': 'fa fa-header fa-heading header-bigger',\n    'heading-1': 'fa fa-header fa-heading header-1',\n    'heading-2': 'fa fa-header fa-heading header-2',\n    'heading-3': 'fa fa-header fa-heading header-3',\n    'code': 'fa fa-code',\n    'quote': 'fa fa-quote-left',\n    'ordered-list': 'fa fa-list-ol',\n    'unordered-list': 'fa fa-list-ul',\n    'check-list': 'fa fa-check-square-o',\n    'clean-block': 'fa fa-eraser',\n    'link': 'fa fa-link',\n    'image': 'fa fa-image',\n    'upload-image': 'fa fa-image',\n    'table': 'fa fa-table',\n    'horizontal-rule': 'fa fa-minus',\n    'preview': 'fa fa-eye',\n    'side-by-side': 'fa fa-columns',\n    'fullscreen': 'fa fa-arrows-alt',\n    'guide': 'fa fa-question-circle',\n    'undo': 'fa fa-undo',\n    'redo': 'fa fa-repeat fa-redo',\n};\n\nvar toolbarBuiltInButtons = {\n    'bold': {\n        name: 'bold',\n        action: toggleBold,\n        className: iconClassMap['bold'],\n        title: 'Bold',\n        default: true,\n    },\n    'italic': {\n        name: 'italic',\n        action: toggleItalic,\n        className: iconClassMap['italic'],\n        title: 'Italic',\n        default: true,\n    },\n    'strikethrough': {\n        name: 'strikethrough',\n        action: toggleStrikethrough,\n        className: iconClassMap['strikethrough'],\n        title: 'Strikethrough',\n    },\n    'heading': {\n        name: 'heading',\n        action: toggleHeadingSmaller,\n        className: iconClassMap['heading'],\n        title: 'Heading',\n        default: true,\n    },\n    'heading-smaller': {\n        name: 'heading-smaller',\n        action: toggleHeadingSmaller,\n        className: iconClassMap['heading-smaller'],\n        title: 'Smaller Heading',\n    },\n    'heading-bigger': {\n        name: 'heading-bigger',\n        action: toggleHeadingBigger,\n        className: iconClassMap['heading-bigger'],\n        title: 'Bigger Heading',\n    },\n    'heading-1': {\n        name: 'heading-1',\n        action: toggleHeading1,\n        className: iconClassMap['heading-1'],\n        title: 'Big Heading',\n    },\n    'heading-2': {\n        name: 'heading-2',\n        action: toggleHeading2,\n        className: iconClassMap['heading-2'],\n        title: 'Medium Heading',\n    },\n    'heading-3': {\n        name: 'heading-3',\n        action: toggleHeading3,\n        className: iconClassMap['heading-3'],\n        title: 'Small Heading',\n    },\n    'separator-1': {\n        name: 'separator-1',\n    },\n    'code': {\n        name: 'code',\n        action: toggleCodeBlock,\n        className: iconClassMap['code'],\n        title: 'Code',\n    },\n    'quote': {\n        name: 'quote',\n        action: toggleBlockquote,\n        className: iconClassMap['quote'],\n        title: 'Quote',\n        default: true,\n    },\n    'unordered-list': {\n        name: 'unordered-list',\n        action: toggleUnorderedList,\n        className: iconClassMap['unordered-list'],\n        title: 'Generic List',\n        default: true,\n    },\n    'ordered-list': {\n        name: 'ordered-list',\n        action: toggleOrderedList,\n        className: iconClassMap['ordered-list'],\n        title: 'Numbered List',\n        default: true,\n    },\n    'check-list': {\n        name: 'check-list',\n        action: toggleCheckList,\n        className: iconClassMap['check-list'],\n        title: 'Check List',\n        default: true,\n    },\n    'clean-block': {\n        name: 'clean-block',\n        action: cleanBlock,\n        className: iconClassMap['clean-block'],\n        title: 'Clean block',\n    },\n    'separator-2': {\n        name: 'separator-2',\n    },\n    'link': {\n        name: 'link',\n        action: drawLink,\n        className: iconClassMap['link'],\n        title: 'Create Link',\n        default: true,\n    },\n    'image': {\n        name: 'image',\n        action: drawImage,\n        className: iconClassMap['image'],\n        title: 'Insert Image',\n        default: true,\n    },\n    'upload-image': {\n        name: 'upload-image',\n        action: drawUploadedImage,\n        className: iconClassMap['upload-image'],\n        title: 'Import an image',\n    },\n    'table': {\n        name: 'table',\n        action: drawTable,\n        className: iconClassMap['table'],\n        title: 'Insert Table',\n    },\n    'horizontal-rule': {\n        name: 'horizontal-rule',\n        action: drawHorizontalRule,\n        className: iconClassMap['horizontal-rule'],\n        title: 'Insert Horizontal Line',\n    },\n    'separator-3': {\n        name: 'separator-3',\n    },\n    'preview': {\n        name: 'preview',\n        action: togglePreview,\n        className: iconClassMap['preview'],\n        noDisable: true,\n        title: 'Toggle Preview',\n        default: true,\n    },\n    'side-by-side': {\n        name: 'side-by-side',\n        action: toggleSideBySide,\n        className: iconClassMap['side-by-side'],\n        noDisable: true,\n        noMobile: true,\n        title: 'Toggle Side by Side',\n        default: true,\n    },\n    'fullscreen': {\n        name: 'fullscreen',\n        action: toggleFullScreen,\n        className: iconClassMap['fullscreen'],\n        noDisable: true,\n        noMobile: true,\n        title: 'Toggle Fullscreen',\n        default: true,\n    },\n    'separator-4': {\n        name: 'separator-4',\n    },\n    'guide': {\n        name: 'guide',\n        action: 'https://www.markdownguide.org/basic-syntax/',\n        className: iconClassMap['guide'],\n        noDisable: true,\n        title: 'Markdown Guide',\n        default: true,\n    },\n    'separator-5': {\n        name: 'separator-5',\n    },\n    'undo': {\n        name: 'undo',\n        action: undo,\n        className: iconClassMap['undo'],\n        noDisable: true,\n        title: 'Undo',\n    },\n    'redo': {\n        name: 'redo',\n        action: redo,\n        className: iconClassMap['redo'],\n        noDisable: true,\n        title: 'Redo',\n    },\n};\n\nvar insertTexts = {\n    link: ['[', '](#url#)'],\n    image: ['![', '](#url#)'],\n    uploadedImage: ['![](#url#)', ''],\n    // uploadedImage: ['![](#url#)\\n', ''], // TODO: New line insertion doesn't work here.\n    table: ['', '\\n\\n| Column 1 | Column 2 | Column 3 |\\n| -------- | -------- | -------- |\\n| Text     | Text     | Text     |\\n\\n'],\n    horizontalRule: ['', '\\n\\n-----\\n\\n'],\n};\n\nvar promptTexts = {\n    link: 'URL for the link:',\n    image: 'URL of the image:',\n};\n\nvar timeFormat = {\n    locale: 'en-US',\n    format: {\n        hour: '2-digit',\n        minute: '2-digit',\n    },\n};\n\nvar blockStyles = {\n    'bold': '**',\n    'code': '```',\n    'italic': '*',\n};\n\n/**\n * Texts displayed to the user (mainly on the status bar) for the import image\n * feature. Can be used for customization or internationalization.\n */\nvar imageTexts = {\n    sbInit: 'Attach files by drag and dropping or pasting from clipboard.',\n    sbOnDragEnter: 'Drop image to upload it.',\n    sbOnDrop: 'Uploading image #images_names#...',\n    sbProgress: 'Uploading #file_name#: #progress#%',\n    sbOnUploaded: 'Uploaded #image_name#',\n    sizeUnits: ' B, KB, MB',\n};\n\n/**\n * Errors displayed to the user, using the `errorCallback` option. Can be used for\n * customization or internationalization.\n */\nvar errorMessages = {\n    noFileGiven: 'You must select a file.',\n    typeNotAllowed: 'This image type is not allowed.',\n    fileTooLarge: 'Image #image_name# is too big (#image_size#).\\n' +\n        'Maximum file size is #image_max_size#.',\n    importError: 'Something went wrong when uploading the image #image_name#.',\n};\n\n/**\n * Interface of EasyMDE.\n */\nfunction EasyMDE(options) {\n    // Handle options parameter\n    options = options || {};\n\n    // Used later to refer to it\"s parent\n    options.parent = this;\n\n    // Check if Font Awesome needs to be auto downloaded\n    var autoDownloadFA = true;\n\n    if (options.autoDownloadFontAwesome === false) {\n        autoDownloadFA = false;\n    }\n\n    if (options.autoDownloadFontAwesome !== true) {\n        var styleSheets = document.styleSheets;\n        for (var i = 0; i < styleSheets.length; i++) {\n            if (!styleSheets[i].href)\n                continue;\n\n            if (styleSheets[i].href.indexOf('//maxcdn.bootstrapcdn.com/font-awesome/') > -1) {\n                autoDownloadFA = false;\n            }\n        }\n    }\n\n    if (autoDownloadFA) {\n        var link = document.createElement('link');\n        link.rel = 'stylesheet';\n        link.href = 'https://maxcdn.bootstrapcdn.com/font-awesome/latest/css/font-awesome.min.css';\n        document.getElementsByTagName('head')[0].appendChild(link);\n    }\n\n\n    // Find the textarea to use\n    if (options.element) {\n        this.element = options.element;\n    } else if (options.element === null) {\n        // This means that the element option was specified, but no element was found\n        console.log('EasyMDE: Error. No element was found.');\n        return;\n    }\n\n\n    // Handle toolbar\n    if (options.toolbar === undefined) {\n        // Initialize\n        options.toolbar = [];\n\n\n        // Loop over the built in buttons, to get the preferred order\n        for (var key in toolbarBuiltInButtons) {\n            if (Object.prototype.hasOwnProperty.call(toolbarBuiltInButtons, key)) {\n                if (key.indexOf('separator-') != -1) {\n                    options.toolbar.push('|');\n                }\n\n                if (toolbarBuiltInButtons[key].default === true || (options.showIcons && options.showIcons.constructor === Array && options.showIcons.indexOf(key) != -1)) {\n                    options.toolbar.push(key);\n                }\n            }\n        }\n    }\n\n    // Editor preview styling class.\n    if (!Object.prototype.hasOwnProperty.call(options, 'previewClass')) {\n        options.previewClass = 'editor-preview';\n    }\n\n    // Handle status bar\n    if (!Object.prototype.hasOwnProperty.call(options, 'status')) {\n        options.status = ['autosave', 'lines', 'words', 'cursor'];\n\n        if (options.uploadImage) {\n            options.status.unshift('upload-image');\n        }\n    }\n\n\n    // Add default preview rendering function\n    if (!options.previewRender) {\n        options.previewRender = function (plainText) {\n            // Note: \"this\" refers to the options object\n            return this.parent.markdown(plainText);\n        };\n    }\n\n\n    // Set default options for parsing config\n    options.parsingConfig = extend({\n        highlightFormatting: true, // needed for toggleCodeBlock to detect types of code\n    }, options.parsingConfig || {});\n\n\n    // Merging the insertTexts, with the given options\n    options.insertTexts = extend({}, insertTexts, options.insertTexts || {});\n\n\n    // Merging the promptTexts, with the given options\n    options.promptTexts = extend({}, promptTexts, options.promptTexts || {});\n\n\n    // Merging the blockStyles, with the given options\n    options.blockStyles = extend({}, blockStyles, options.blockStyles || {});\n\n\n    if (options.autosave != undefined) {\n        // Merging the Autosave timeFormat, with the given options\n        options.autosave.timeFormat = extend({}, timeFormat, options.autosave.timeFormat || {});\n    }\n\n    options.iconClassMap = extend({}, iconClassMap, options.iconClassMap || {});\n\n    // Merging the shortcuts, with the given options\n    options.shortcuts = extend({}, shortcuts, options.shortcuts || {});\n\n    options.maxHeight = options.maxHeight || undefined;\n\n    options.direction = options.direction || 'ltr';\n\n    if (typeof options.maxHeight !== 'undefined') {\n        // Min and max height are equal if maxHeight is set\n        options.minHeight = options.maxHeight;\n    } else {\n        options.minHeight = options.minHeight || '300px';\n    }\n\n    options.errorCallback = options.errorCallback || function (errorMessage) {\n        alert(errorMessage);\n    };\n\n    // Import-image default configuration\n    options.uploadImage = options.uploadImage || false;\n    options.imageMaxSize = options.imageMaxSize || 2097152; // 1024 * 1024 * 2\n    options.imageAccept = options.imageAccept || 'image/png, image/jpeg, image/gif, image/avif';\n    options.imageTexts = extend({}, imageTexts, options.imageTexts || {});\n    options.errorMessages = extend({}, errorMessages, options.errorMessages || {});\n    options.imagePathAbsolute = options.imagePathAbsolute || false;\n    options.imageCSRFName = options.imageCSRFName || 'csrfmiddlewaretoken';\n    options.imageCSRFHeader = options.imageCSRFHeader || false;\n    options.imageInputName = options.imageInputName || 'image';\n\n\n    // Change unique_id to uniqueId for backwards compatibility\n    if (options.autosave != undefined && options.autosave.unique_id != undefined && options.autosave.unique_id != '')\n        options.autosave.uniqueId = options.autosave.unique_id;\n\n    // If overlay mode is specified and combine is not provided, default it to true\n    if (options.overlayMode && options.overlayMode.combine === undefined) {\n        options.overlayMode.combine = true;\n    }\n\n    // Update this options\n    this.options = options;\n\n\n    // Auto render\n    this.render();\n\n\n    // The codemirror component is only available after rendering\n    // so, the setter for the initialValue can only run after\n    // the element has been rendered\n    if (options.initialValue && (!this.options.autosave || this.options.autosave.foundSavedValue !== true)) {\n        this.value(options.initialValue);\n    }\n\n    if (options.uploadImage) {\n        var self = this;\n\n        this.codemirror.on('dragenter', function (cm, event) {\n            self.updateStatusBar('upload-image', self.options.imageTexts.sbOnDragEnter);\n            event.stopPropagation();\n            event.preventDefault();\n        });\n        this.codemirror.on('dragend', function (cm, event) {\n            self.updateStatusBar('upload-image', self.options.imageTexts.sbInit);\n            event.stopPropagation();\n            event.preventDefault();\n        });\n        this.codemirror.on('dragleave', function (cm, event) {\n            self.updateStatusBar('upload-image', self.options.imageTexts.sbInit);\n            event.stopPropagation();\n            event.preventDefault();\n        });\n\n        this.codemirror.on('dragover', function (cm, event) {\n            self.updateStatusBar('upload-image', self.options.imageTexts.sbOnDragEnter);\n            event.stopPropagation();\n            event.preventDefault();\n        });\n\n        this.codemirror.on('drop', function (cm, event) {\n            event.stopPropagation();\n            event.preventDefault();\n            if (options.imageUploadFunction) {\n                self.uploadImagesUsingCustomFunction(options.imageUploadFunction, event.dataTransfer.files);\n            } else {\n                self.uploadImages(event.dataTransfer.files);\n            }\n        });\n\n        this.codemirror.on('paste', function (cm, event) {\n            if (options.imageUploadFunction) {\n                self.uploadImagesUsingCustomFunction(options.imageUploadFunction, event.clipboardData.files);\n            } else {\n                self.uploadImages(event.clipboardData.files);\n            }\n        });\n    }\n}\n\n/**\n * Upload asynchronously a list of images to a server.\n *\n * Can be triggered by:\n * - drag&drop;\n * - copy-paste;\n * - the browse-file window (opened when the user clicks on the *upload-image* icon).\n * @param {FileList} files The files to upload the the server.\n * @param [onSuccess] {function} see EasyMDE.prototype.uploadImage\n * @param [onError] {function} see EasyMDE.prototype.uploadImage\n */\nEasyMDE.prototype.uploadImages = function (files, onSuccess, onError) {\n    if (files.length === 0) {\n        return;\n    }\n    var names = [];\n    for (var i = 0; i < files.length; i++) {\n        names.push(files[i].name);\n        this.uploadImage(files[i], onSuccess, onError);\n    }\n    this.updateStatusBar('upload-image', this.options.imageTexts.sbOnDrop.replace('#images_names#', names.join(', ')));\n};\n\n/**\n * Upload asynchronously a list of images to a server.\n *\n * Can be triggered by:\n * - drag&drop;\n * - copy-paste;\n * - the browse-file window (opened when the user clicks on the *upload-image* icon).\n * @param imageUploadFunction {Function} The custom function to upload the image passed in options.\n * @param {FileList} files The files to upload the the server.\n */\nEasyMDE.prototype.uploadImagesUsingCustomFunction = function (imageUploadFunction, files) {\n    if (files.length === 0) {\n        return;\n    }\n    var names = [];\n    for (var i = 0; i < files.length; i++) {\n        names.push(files[i].name);\n        this.uploadImageUsingCustomFunction(imageUploadFunction, files[i]);\n    }\n    this.updateStatusBar('upload-image', this.options.imageTexts.sbOnDrop.replace('#images_names#', names.join(', ')));\n};\n\n/**\n * Update an item in the status bar.\n * @param itemName {string} The name of the item to update (ie. 'upload-image', 'autosave', etc.).\n * @param content {string} the new content of the item to write in the status bar.\n */\nEasyMDE.prototype.updateStatusBar = function (itemName, content) {\n    if (!this.gui.statusbar) {\n        return;\n    }\n\n    var matchingClasses = this.gui.statusbar.getElementsByClassName(itemName);\n    if (matchingClasses.length === 1) {\n        this.gui.statusbar.getElementsByClassName(itemName)[0].textContent = content;\n    } else if (matchingClasses.length === 0) {\n        console.log('EasyMDE: status bar item ' + itemName + ' was not found.');\n    } else {\n        console.log('EasyMDE: Several status bar items named ' + itemName + ' was found.');\n    }\n};\n\n/**\n * Default markdown render.\n */\nEasyMDE.prototype.markdown = function (text) {\n    if (marked) {\n        // Initialize\n        var markedOptions;\n        if (this.options && this.options.renderingConfig && this.options.renderingConfig.markedOptions) {\n            markedOptions = this.options.renderingConfig.markedOptions;\n        } else {\n            markedOptions = {};\n        }\n\n        // Update options\n        if (this.options && this.options.renderingConfig && this.options.renderingConfig.singleLineBreaks === false) {\n            markedOptions.breaks = false;\n        } else {\n            markedOptions.breaks = true;\n        }\n\n        if (this.options && this.options.renderingConfig && this.options.renderingConfig.codeSyntaxHighlighting === true) {\n\n            /* Get HLJS from config or window */\n            var hljs = this.options.renderingConfig.hljs || window.hljs;\n\n            /* Check if HLJS loaded */\n            if (hljs) {\n                markedOptions.highlight = function (code, language) {\n                    if (language && hljs.getLanguage(language)) {\n                        return hljs.highlight(language, code).value;\n                    } else {\n                        return hljs.highlightAuto(code).value;\n                    }\n                };\n            }\n        }\n\n        // Set options\n        marked.use(markedOptions);\n\n        // Convert the markdown to HTML\n        var htmlText = marked.parse(text);\n\n        // Sanitize HTML\n        if (this.options.renderingConfig && typeof this.options.renderingConfig.sanitizerFunction === 'function') {\n            htmlText = this.options.renderingConfig.sanitizerFunction.call(this, htmlText);\n        }\n\n        // Edit the HTML anchors to add 'target=\"_blank\"' by default.\n        htmlText = addAnchorTargetBlank(htmlText);\n\n        // Remove list-style when rendering checkboxes\n        htmlText = removeListStyleWhenCheckbox(htmlText);\n\n        return htmlText;\n    }\n};\n\n/**\n * Render editor to the given element.\n */\nEasyMDE.prototype.render = function (el) {\n    if (!el) {\n        el = this.element || document.getElementsByTagName('textarea')[0];\n    }\n\n    if (this._rendered && this._rendered === el) {\n        // Already rendered.\n        return;\n    }\n\n    this.element = el;\n    var options = this.options;\n\n    var self = this;\n    var keyMaps = {};\n\n    for (var key in options.shortcuts) {\n        // null stands for \"do not bind this command\"\n        if (options.shortcuts[key] !== null && bindings[key] !== null) {\n            (function (key) {\n                keyMaps[fixShortcut(options.shortcuts[key])] = function () {\n                    var action = bindings[key];\n                    if (typeof action === 'function') {\n                        action(self);\n                    } else if (typeof action === 'string') {\n                        window.open(action, '_blank');\n                    }\n                };\n            })(key);\n        }\n    }\n\n    keyMaps['Enter'] = 'newlineAndIndentContinueMarkdownList';\n    keyMaps['Tab'] = 'tabAndIndentMarkdownList';\n    keyMaps['Shift-Tab'] = 'shiftTabAndUnindentMarkdownList';\n    keyMaps['Esc'] = function (cm) {\n        if (cm.getOption('fullScreen')) toggleFullScreen(self);\n    };\n\n    this.documentOnKeyDown = function (e) {\n        e = e || window.event;\n\n        if (e.keyCode == 27) {\n            if (self.codemirror.getOption('fullScreen')) toggleFullScreen(self);\n        }\n    };\n    document.addEventListener('keydown', this.documentOnKeyDown, false);\n\n    var mode, backdrop;\n\n    // CodeMirror overlay mode\n    if (options.overlayMode) {\n        CodeMirror.defineMode('overlay-mode', function (config) {\n            return CodeMirror.overlayMode(CodeMirror.getMode(config, options.spellChecker !== false ? 'spell-checker' : 'gfm'), options.overlayMode.mode, options.overlayMode.combine);\n        });\n\n        mode = 'overlay-mode';\n        backdrop = options.parsingConfig;\n        backdrop.gitHubSpice = false;\n    } else {\n        mode = options.parsingConfig;\n        mode.name = 'gfm';\n        mode.gitHubSpice = false;\n    }\n    if (options.spellChecker !== false) {\n        mode = 'spell-checker';\n        backdrop = options.parsingConfig;\n        backdrop.name = 'gfm';\n        backdrop.gitHubSpice = false;\n\n        if (typeof options.spellChecker === 'function') {\n            options.spellChecker({\n                codeMirrorInstance: CodeMirror,\n            });\n        } else {\n            CodeMirrorSpellChecker({\n                codeMirrorInstance: CodeMirror,\n            });\n        }\n    }\n\n    // eslint-disable-next-line no-unused-vars\n    function configureMouse(cm, repeat, event) {\n        return {\n            addNew: false,\n        };\n    }\n\n    this.codemirror = CodeMirror.fromTextArea(el, {\n        mode: mode,\n        backdrop: backdrop,\n        theme: (options.theme != undefined) ? options.theme : 'easymde',\n        tabSize: (options.tabSize != undefined) ? options.tabSize : 2,\n        indentUnit: (options.tabSize != undefined) ? options.tabSize : 2,\n        indentWithTabs: (options.indentWithTabs === false) ? false : true,\n        lineNumbers: (options.lineNumbers === true) ? true : false,\n        autofocus: (options.autofocus === true) ? true : false,\n        extraKeys: keyMaps,\n        direction: options.direction,\n        lineWrapping: (options.lineWrapping === false) ? false : true,\n        allowDropFileTypes: ['text/plain'],\n        placeholder: options.placeholder || el.getAttribute('placeholder') || '',\n        styleSelectedText: (options.styleSelectedText != undefined) ? options.styleSelectedText : !isMobile(),\n        scrollbarStyle: (options.scrollbarStyle != undefined) ? options.scrollbarStyle : 'native',\n        configureMouse: configureMouse,\n        inputStyle: (options.inputStyle != undefined) ? options.inputStyle : isMobile() ? 'contenteditable' : 'textarea',\n        spellcheck: (options.nativeSpellcheck != undefined) ? options.nativeSpellcheck : true,\n        autoRefresh: (options.autoRefresh != undefined) ? options.autoRefresh : false,\n    });\n\n    this.codemirror.getScrollerElement().style.minHeight = options.minHeight;\n\n    if (typeof options.maxHeight !== 'undefined') {\n        this.codemirror.getScrollerElement().style.height = options.maxHeight;\n    }\n\n    if (options.forceSync === true) {\n        var cm = this.codemirror;\n        cm.on('change', function () {\n            cm.save();\n        });\n    }\n\n    this.gui = {};\n\n    // Wrap Codemirror with container before create toolbar, etc,\n    // to use with sideBySideFullscreen option.\n    var easyMDEContainer = document.createElement('div');\n    easyMDEContainer.classList.add('EasyMDEContainer');\n    easyMDEContainer.setAttribute('role', 'application');\n    var cmWrapper = this.codemirror.getWrapperElement();\n    cmWrapper.parentNode.insertBefore(easyMDEContainer, cmWrapper);\n    easyMDEContainer.appendChild(cmWrapper);\n\n    if (options.toolbar !== false) {\n        this.gui.toolbar = this.createToolbar();\n    }\n    if (options.status !== false) {\n        this.gui.statusbar = this.createStatusbar();\n    }\n    if (options.autosave != undefined && options.autosave.enabled === true) {\n        this.autosave(); // use to load localstorage content\n        this.codemirror.on('change', function () {\n            clearTimeout(self._autosave_timeout);\n            self._autosave_timeout = setTimeout(function () {\n                self.autosave();\n            }, self.options.autosave.submit_delay || self.options.autosave.delay || 1000);\n        });\n    }\n\n    function calcHeight(naturalWidth, naturalHeight) {\n        var height;\n        var viewportWidth = window.getComputedStyle(document.querySelector('.CodeMirror-sizer')).width.replace('px', '');\n        if (naturalWidth < viewportWidth) {\n            height = naturalHeight + 'px';\n        } else {\n            height = (naturalHeight / naturalWidth * 100) + '%';\n        }\n        return height;\n    }\n\n    var _vm = this;\n\n\n    function assignImageBlockAttributes(parentEl, img) {\n        var url = (new URL(img.url, document.baseURI)).href;\n        parentEl.setAttribute('data-img-src', url);\n        parentEl.setAttribute('style', '--bg-image:url(' + url + ');--width:' + img.naturalWidth + 'px;--height:' + calcHeight(img.naturalWidth, img.naturalHeight));\n        _vm.codemirror.setSize();\n    }\n\n    function handleImages() {\n        if (!options.previewImagesInEditor) {\n            return;\n        }\n\n        easyMDEContainer.querySelectorAll('.cm-image-marker').forEach(function (e) {\n            var parentEl = e.parentElement;\n            if (!parentEl.innerText.match(/^!\\[.*?\\]\\(.*\\)/g)) {\n                // if img pasted on the same line with other text, don't preview, preview only images on separate line\n                return;\n            }\n            if (!parentEl.hasAttribute('data-img-src')) {\n                var srcAttr = parentEl.innerText.match(/!\\[.*?\\]\\((.*?)\\)/); // might require better parsing according to markdown spec\n                if (!window.EMDEimagesCache) {\n                    window.EMDEimagesCache = {};\n                }\n\n                if (srcAttr && srcAttr.length >= 2) {\n                    var keySrc = srcAttr[1];\n\n                    if (options.imagesPreviewHandler) {\n                        var newSrc = options.imagesPreviewHandler(srcAttr[1]);\n                        // defensive check making sure the handler provided by the user returns a string\n                        if (typeof newSrc === 'string') {\n                            keySrc = newSrc;\n                        }\n                    }\n\n                    if (!window.EMDEimagesCache[keySrc]) {\n                        window.EMDEimagesCache[keySrc] = {};\n                        var img = document.createElement('img');\n                        img.onload = function () {\n                            window.EMDEimagesCache[keySrc] = {\n                                naturalWidth: img.naturalWidth,\n                                naturalHeight: img.naturalHeight,\n                                url: keySrc,\n                            };\n                            assignImageBlockAttributes(parentEl, window.EMDEimagesCache[keySrc]);\n                        };\n                        img.src = keySrc;\n                    } else {\n                        assignImageBlockAttributes(parentEl, window.EMDEimagesCache[keySrc]);\n                    }\n                }\n            }\n        });\n    }\n\n    this.codemirror.on('update', function () {\n        handleImages();\n    });\n\n    this.gui.sideBySide = this.createSideBySide();\n    this._rendered = this.element;\n\n    if (options.autofocus === true || el.autofocus) {\n        this.codemirror.focus();\n    }\n\n    // Fixes CodeMirror bug (#344)\n    var temp_cm = this.codemirror;\n    setTimeout(function () {\n        temp_cm.refresh();\n    }.bind(temp_cm), 0);\n};\n\nEasyMDE.prototype.cleanup = function () {\n    document.removeEventListener('keydown', this.documentOnKeyDown);\n};\n\n// Safari, in Private Browsing Mode, looks like it supports localStorage but all calls to setItem throw QuotaExceededError. We're going to detect this and set a variable accordingly.\nfunction isLocalStorageAvailable() {\n    if (typeof localStorage === 'object') {\n        try {\n            localStorage.setItem('smde_localStorage', 1);\n            localStorage.removeItem('smde_localStorage');\n        } catch (e) {\n            return false;\n        }\n    } else {\n        return false;\n    }\n\n    return true;\n}\n\nEasyMDE.prototype.autosave = function () {\n    if (isLocalStorageAvailable()) {\n        var easyMDE = this;\n\n        if (this.options.autosave.uniqueId == undefined || this.options.autosave.uniqueId == '') {\n            console.log('EasyMDE: You must set a uniqueId to use the autosave feature');\n            return;\n        }\n\n        if (this.options.autosave.binded !== true) {\n            if (easyMDE.element.form != null && easyMDE.element.form != undefined) {\n                easyMDE.element.form.addEventListener('submit', function () {\n                    clearTimeout(easyMDE.autosaveTimeoutId);\n                    easyMDE.autosaveTimeoutId = undefined;\n\n                    localStorage.removeItem('smde_' + easyMDE.options.autosave.uniqueId);\n                });\n            }\n\n            this.options.autosave.binded = true;\n        }\n\n        if (this.options.autosave.loaded !== true) {\n            if (typeof localStorage.getItem('smde_' + this.options.autosave.uniqueId) == 'string' && localStorage.getItem('smde_' + this.options.autosave.uniqueId) != '') {\n                this.codemirror.setValue(localStorage.getItem('smde_' + this.options.autosave.uniqueId));\n                this.options.autosave.foundSavedValue = true;\n            }\n\n            this.options.autosave.loaded = true;\n        }\n\n        var value = easyMDE.value();\n        if (value !== '') {\n            localStorage.setItem('smde_' + this.options.autosave.uniqueId, value);\n        } else {\n            localStorage.removeItem('smde_' + this.options.autosave.uniqueId);\n        }\n\n        var el = document.getElementById('autosaved');\n        if (el != null && el != undefined && el != '') {\n            var d = new Date();\n            var dd = new Intl.DateTimeFormat([this.options.autosave.timeFormat.locale, 'en-US'], this.options.autosave.timeFormat.format).format(d);\n            var save = this.options.autosave.text == undefined ? 'Autosaved: ' : this.options.autosave.text;\n\n            el.innerHTML = save + dd;\n        }\n    } else {\n        console.log('EasyMDE: localStorage not available, cannot autosave');\n    }\n};\n\nEasyMDE.prototype.clearAutosavedValue = function () {\n    if (isLocalStorageAvailable()) {\n        if (this.options.autosave == undefined || this.options.autosave.uniqueId == undefined || this.options.autosave.uniqueId == '') {\n            console.log('EasyMDE: You must set a uniqueId to clear the autosave value');\n            return;\n        }\n\n        localStorage.removeItem('smde_' + this.options.autosave.uniqueId);\n    } else {\n        console.log('EasyMDE: localStorage not available, cannot autosave');\n    }\n};\n\n/**\n * Open the browse-file window to upload an image to a server.\n * @param [onSuccess] {function} see EasyMDE.prototype.uploadImage\n * @param [onError] {function} see EasyMDE.prototype.uploadImage\n */\nEasyMDE.prototype.openBrowseFileWindow = function (onSuccess, onError) {\n    var self = this;\n    var imageInput = this.gui.toolbar.getElementsByClassName('imageInput')[0];\n    imageInput.click(); //dispatchEvent(new MouseEvent('click'));  // replaced with click() for IE11 compatibility.\n    function onChange(event) {\n        if (self.options.imageUploadFunction) {\n            self.uploadImagesUsingCustomFunction(self.options.imageUploadFunction, event.target.files);\n        } else {\n            self.uploadImages(event.target.files, onSuccess, onError);\n        }\n        imageInput.removeEventListener('change', onChange);\n    }\n\n    imageInput.addEventListener('change', onChange);\n};\n\n/**\n * Upload an image to the server.\n *\n * @param file {File} The image to upload, as a HTML5 File object (https://developer.mozilla.org/en-US/docs/Web/API/File)\n * @param [onSuccess] {function} A callback function to execute after the image has been successfully uploaded, with one parameter:\n * - url (string): The URL of the uploaded image.\n * @param [onError] {function} A callback function to execute when the image upload fails, with one parameter:\n * - error (string): the detailed error to display to the user (based on messages from options.errorMessages).\n */\nEasyMDE.prototype.uploadImage = function (file, onSuccess, onError) {\n    var self = this;\n    onSuccess = onSuccess || function onSuccess(imageUrl) {\n        afterImageUploaded(self, imageUrl);\n    };\n\n    function onErrorSup(errorMessage) {\n        // show error on status bar and reset after 10000ms\n        self.updateStatusBar('upload-image', errorMessage);\n\n        setTimeout(function () {\n            self.updateStatusBar('upload-image', self.options.imageTexts.sbInit);\n        }, 10000);\n\n        // run custom error handler\n        if (onError && typeof onError === 'function') {\n            onError(errorMessage);\n        }\n        // run error handler from options, this alerts the message.\n        self.options.errorCallback(errorMessage);\n    }\n\n    function fillErrorMessage(errorMessage) {\n        var units = self.options.imageTexts.sizeUnits.split(',');\n        return errorMessage\n            .replace('#image_name#', file.name)\n            .replace('#image_size#', humanFileSize(file.size, units))\n            .replace('#image_max_size#', humanFileSize(self.options.imageMaxSize, units));\n    }\n\n    if (file.size > this.options.imageMaxSize) {\n        onErrorSup(fillErrorMessage(this.options.errorMessages.fileTooLarge));\n        return;\n    }\n\n    var formData = new FormData();\n    formData.append('image', file);\n\n    // insert CSRF body token if provided in config.\n    if (self.options.imageCSRFToken && !self.options.imageCSRFHeader) {\n        formData.append(self.options.imageCSRFName, self.options.imageCSRFToken);\n    }\n\n    var request = new XMLHttpRequest();\n    request.upload.onprogress = function (event) {\n        if (event.lengthComputable) {\n            var progress = '' + Math.round((event.loaded * 100) / event.total);\n            self.updateStatusBar('upload-image', self.options.imageTexts.sbProgress.replace('#file_name#', file.name).replace('#progress#', progress));\n        }\n    };\n    request.open('POST', this.options.imageUploadEndpoint);\n\n    // insert CSRF header token if provided in config.\n    if (self.options.imageCSRFToken && self.options.imageCSRFHeader) {\n        request.setRequestHeader(self.options.imageCSRFName, self.options.imageCSRFToken);\n    }\n\n    request.onload = function () {\n        try {\n            var response = JSON.parse(this.responseText);\n        } catch (error) {\n            console.error('EasyMDE: The server did not return a valid json.');\n            onErrorSup(fillErrorMessage(self.options.errorMessages.importError));\n            return;\n        }\n        if (this.status === 200 && response && !response.error && response.data && response.data.filePath) {\n            onSuccess((self.options.imagePathAbsolute ? '' : (window.location.origin + '/')) + response.data.filePath);\n        } else {\n            if (response.error && response.error in self.options.errorMessages) {  // preformatted error message\n                onErrorSup(fillErrorMessage(self.options.errorMessages[response.error]));\n            } else if (response.error) {  // server side generated error message\n                onErrorSup(fillErrorMessage(response.error));\n            } else {  //unknown error\n                console.error('EasyMDE: Received an unexpected response after uploading the image.'\n                    + this.status + ' (' + this.statusText + ')');\n                onErrorSup(fillErrorMessage(self.options.errorMessages.importError));\n            }\n        }\n    };\n\n    request.onerror = function (event) {\n        console.error('EasyMDE: An unexpected error occurred when trying to upload the image.'\n            + event.target.status + ' (' + event.target.statusText + ')');\n        onErrorSup(self.options.errorMessages.importError);\n    };\n\n    request.send(formData);\n\n};\n\n/**\n * Upload an image to the server using a custom upload function.\n *\n * @param imageUploadFunction {Function} The custom function to upload the image passed in options\n * @param file {File} The image to upload, as a HTML5 File object (https://developer.mozilla.org/en-US/docs/Web/API/File).\n */\nEasyMDE.prototype.uploadImageUsingCustomFunction = function (imageUploadFunction, file) {\n    var self = this;\n\n    function onSuccess(imageUrl) {\n        afterImageUploaded(self, imageUrl);\n    }\n\n    function onError(errorMessage) {\n        var filledErrorMessage = fillErrorMessage(errorMessage);\n        // show error on status bar and reset after 10000ms\n        self.updateStatusBar('upload-image', filledErrorMessage);\n\n        setTimeout(function () {\n            self.updateStatusBar('upload-image', self.options.imageTexts.sbInit);\n        }, 10000);\n\n        // run error handler from options, this alerts the message.\n        self.options.errorCallback(filledErrorMessage);\n    }\n\n    function fillErrorMessage(errorMessage) {\n        var units = self.options.imageTexts.sizeUnits.split(',');\n        return errorMessage\n            .replace('#image_name#', file.name)\n            .replace('#image_size#', humanFileSize(file.size, units))\n            .replace('#image_max_size#', humanFileSize(self.options.imageMaxSize, units));\n    }\n\n    imageUploadFunction.apply(this, [file, onSuccess, onError]);\n};\n\nEasyMDE.prototype.setPreviewMaxHeight = function () {\n    var cm = this.codemirror;\n    var wrapper = cm.getWrapperElement();\n    var preview = wrapper.nextSibling;\n\n    // Calc preview max height\n    var paddingTop = parseInt(window.getComputedStyle(wrapper).paddingTop);\n    var borderTopWidth = parseInt(window.getComputedStyle(wrapper).borderTopWidth);\n    var optionsMaxHeight = parseInt(this.options.maxHeight);\n    var wrapperMaxHeight = optionsMaxHeight + paddingTop * 2 + borderTopWidth * 2;\n    var previewMaxHeight = wrapperMaxHeight.toString() + 'px';\n\n    preview.style.height = previewMaxHeight;\n};\n\nEasyMDE.prototype.createSideBySide = function () {\n    var cm = this.codemirror;\n    var wrapper = cm.getWrapperElement();\n    var preview = wrapper.nextSibling;\n\n    if (!preview || !preview.classList.contains('editor-preview-side')) {\n        preview = document.createElement('div');\n        preview.className = 'editor-preview-side';\n\n        if (this.options.previewClass) {\n\n            if (Array.isArray(this.options.previewClass)) {\n                for (var i = 0; i < this.options.previewClass.length; i++) {\n                    preview.classList.add(this.options.previewClass[i]);\n                }\n\n            } else if (typeof this.options.previewClass === 'string') {\n                preview.classList.add(this.options.previewClass);\n            }\n        }\n\n        wrapper.parentNode.insertBefore(preview, wrapper.nextSibling);\n    }\n\n    if (typeof this.options.maxHeight !== 'undefined') {\n        this.setPreviewMaxHeight();\n    }\n\n    if (this.options.syncSideBySidePreviewScroll === false) return preview;\n    // Syncs scroll  editor -> preview\n    var cScroll = false;\n    var pScroll = false;\n    cm.on('scroll', function (v) {\n        if (cScroll) {\n            cScroll = false;\n            return;\n        }\n        pScroll = true;\n        var height = v.getScrollInfo().height - v.getScrollInfo().clientHeight;\n        var ratio = parseFloat(v.getScrollInfo().top) / height;\n        var move = (preview.scrollHeight - preview.clientHeight) * ratio;\n        preview.scrollTop = move;\n    });\n\n    // Syncs scroll  preview -> editor\n    preview.onscroll = function () {\n        if (pScroll) {\n            pScroll = false;\n            return;\n        }\n        cScroll = true;\n        var height = preview.scrollHeight - preview.clientHeight;\n        var ratio = parseFloat(preview.scrollTop) / height;\n        var move = (cm.getScrollInfo().height - cm.getScrollInfo().clientHeight) * ratio;\n        cm.scrollTo(0, move);\n    };\n    return preview;\n};\n\nEasyMDE.prototype.createToolbar = function (items) {\n    items = items || this.options.toolbar;\n\n    if (!items || items.length === 0) {\n        return;\n    }\n    var i;\n    for (i = 0; i < items.length; i++) {\n        if (toolbarBuiltInButtons[items[i]] != undefined) {\n            items[i] = toolbarBuiltInButtons[items[i]];\n        }\n    }\n\n    var bar = document.createElement('div');\n    bar.className = 'editor-toolbar';\n    bar.setAttribute('role', 'toolbar');\n\n    var self = this;\n\n    var toolbarData = {};\n    self.toolbar = items;\n\n    for (i = 0; i < items.length; i++) {\n        if (items[i].name == 'guide' && self.options.toolbarGuideIcon === false)\n            continue;\n\n        if (self.options.hideIcons && self.options.hideIcons.indexOf(items[i].name) != -1)\n            continue;\n\n        // Fullscreen does not work well on mobile devices (even tablets)\n        // In the future, hopefully this can be resolved\n        if ((items[i].name == 'fullscreen' || items[i].name == 'side-by-side') && isMobile())\n            continue;\n\n\n        // Don't include trailing separators\n        if (items[i] === '|') {\n            var nonSeparatorIconsFollow = false;\n\n            for (var x = (i + 1); x < items.length; x++) {\n                if (items[x] !== '|' && (!self.options.hideIcons || self.options.hideIcons.indexOf(items[x].name) == -1)) {\n                    nonSeparatorIconsFollow = true;\n                }\n            }\n\n            if (!nonSeparatorIconsFollow)\n                continue;\n        }\n\n\n        // Create the icon and append to the toolbar\n        (function (item) {\n            var el;\n            if (item === '|') {\n                el = createSep();\n            } else if (item.children) {\n                el = createToolbarDropdown(item, self.options.toolbarTips, self.options.shortcuts, self);\n            } else {\n                el = createToolbarButton(item, true, self.options.toolbarTips, self.options.shortcuts, 'button', self);\n            }\n\n\n            toolbarData[item.name || item] = el;\n            bar.appendChild(el);\n\n            // Create the input element (ie. <input type='file'>), used among\n            // with the 'import-image' icon to open the browse-file window.\n            if (item.name === 'upload-image') {\n                var imageInput = document.createElement('input');\n                imageInput.className = 'imageInput';\n                imageInput.type = 'file';\n                imageInput.multiple = true;\n                imageInput.name = self.options.imageInputName;\n                imageInput.accept = self.options.imageAccept;\n                imageInput.style.display = 'none';\n                imageInput.style.opacity = 0;\n                bar.appendChild(imageInput);\n            }\n        })(items[i]);\n    }\n\n    self.toolbar_div = bar;\n    self.toolbarElements = toolbarData;\n\n    var cm = this.codemirror;\n    cm.on('cursorActivity', function () {\n        var stat = getState(cm);\n\n        for (var key in toolbarData) {\n            (function (key) {\n                var el = toolbarData[key];\n                if (stat[key]) {\n                    el.classList.add('active');\n                } else if (key != 'fullscreen' && key != 'side-by-side') {\n                    el.classList.remove('active');\n                }\n            })(key);\n        }\n    });\n\n    var cmWrapper = cm.getWrapperElement();\n    cmWrapper.parentNode.insertBefore(bar, cmWrapper);\n    return bar;\n};\n\nEasyMDE.prototype.createStatusbar = function (status) {\n    // Initialize\n    status = status || this.options.status;\n    var options = this.options;\n    var cm = this.codemirror;\n\n    // Make sure the status variable is valid\n    if (!status || status.length === 0) {\n        return;\n    }\n\n    // Set up the built-in items\n    var items = [];\n    var i, onUpdate, onActivity, defaultValue;\n\n    for (i = 0; i < status.length; i++) {\n        // Reset some values\n        onUpdate = undefined;\n        onActivity = undefined;\n        defaultValue = undefined;\n\n\n        // Handle if custom or not\n        if (typeof status[i] === 'object') {\n            items.push({\n                className: status[i].className,\n                defaultValue: status[i].defaultValue,\n                onUpdate: status[i].onUpdate,\n                onActivity: status[i].onActivity,\n            });\n        } else {\n            var name = status[i];\n\n            if (name === 'words') {\n                defaultValue = function (el) {\n                    el.innerHTML = wordCount(cm.getValue());\n                };\n                onUpdate = function (el) {\n                    el.innerHTML = wordCount(cm.getValue());\n                };\n            } else if (name === 'lines') {\n                defaultValue = function (el) {\n                    el.innerHTML = cm.lineCount();\n                };\n                onUpdate = function (el) {\n                    el.innerHTML = cm.lineCount();\n                };\n            } else if (name === 'cursor') {\n                defaultValue = function (el) {\n                    el.innerHTML = '1:1';\n                };\n                onActivity = function (el) {\n                    var pos = cm.getCursor();\n                    var posLine = pos.line + 1;\n                    var posColumn = pos.ch + 1;\n                    el.innerHTML = posLine + ':' + posColumn;\n                };\n            } else if (name === 'autosave') {\n                defaultValue = function (el) {\n                    if (options.autosave != undefined && options.autosave.enabled === true) {\n                        el.setAttribute('id', 'autosaved');\n                    }\n                };\n            } else if (name === 'upload-image') {\n                defaultValue = function (el) {\n                    el.innerHTML = options.imageTexts.sbInit;\n                };\n            }\n\n            items.push({\n                className: name,\n                defaultValue: defaultValue,\n                onUpdate: onUpdate,\n                onActivity: onActivity,\n            });\n        }\n    }\n\n\n    // Create element for the status bar\n    var bar = document.createElement('div');\n    bar.className = 'editor-statusbar';\n\n\n    // Create a new span for each item\n    for (i = 0; i < items.length; i++) {\n        // Store in temporary variable\n        var item = items[i];\n\n\n        // Create span element\n        var el = document.createElement('span');\n        el.className = item.className;\n\n\n        // Ensure the defaultValue is a function\n        if (typeof item.defaultValue === 'function') {\n            item.defaultValue(el);\n        }\n\n\n        // Ensure the onUpdate is a function\n        if (typeof item.onUpdate === 'function') {\n            // Create a closure around the span of the current action, then execute the onUpdate handler\n            this.codemirror.on('update', (function (el, item) {\n                return function () {\n                    item.onUpdate(el);\n                };\n            }(el, item)));\n        }\n        if (typeof item.onActivity === 'function') {\n            // Create a closure around the span of the current action, then execute the onActivity handler\n            this.codemirror.on('cursorActivity', (function (el, item) {\n                return function () {\n                    item.onActivity(el);\n                };\n            }(el, item)));\n        }\n\n\n        // Append the item to the status bar\n        bar.appendChild(el);\n    }\n\n\n    // Insert the status bar into the DOM\n    var cmWrapper = this.codemirror.getWrapperElement();\n    cmWrapper.parentNode.insertBefore(bar, cmWrapper.nextSibling);\n    return bar;\n};\n\n/**\n * Get or set the text content.\n */\nEasyMDE.prototype.value = function (val) {\n    var cm = this.codemirror;\n    if (val === undefined) {\n        return cm.getValue();\n    } else {\n        cm.getDoc().setValue(val);\n        if (this.isPreviewActive()) {\n            var wrapper = cm.getWrapperElement();\n            var preview = wrapper.lastChild;\n            var preview_result = this.options.previewRender(val, preview);\n            if (preview_result !== null) {\n                preview.innerHTML = preview_result;\n            }\n\n        }\n        return this;\n    }\n};\n\n\n/**\n * Bind static methods for exports.\n */\nEasyMDE.toggleBold = toggleBold;\nEasyMDE.toggleItalic = toggleItalic;\nEasyMDE.toggleStrikethrough = toggleStrikethrough;\nEasyMDE.toggleBlockquote = toggleBlockquote;\nEasyMDE.toggleHeadingSmaller = toggleHeadingSmaller;\nEasyMDE.toggleHeadingBigger = toggleHeadingBigger;\nEasyMDE.toggleHeading1 = toggleHeading1;\nEasyMDE.toggleHeading2 = toggleHeading2;\nEasyMDE.toggleHeading3 = toggleHeading3;\nEasyMDE.toggleHeading4 = toggleHeading4;\nEasyMDE.toggleHeading5 = toggleHeading5;\nEasyMDE.toggleHeading6 = toggleHeading6;\nEasyMDE.toggleCodeBlock = toggleCodeBlock;\nEasyMDE.toggleUnorderedList = toggleUnorderedList;\nEasyMDE.toggleOrderedList = toggleOrderedList;\nEasyMDE.toggleCheckList = toggleCheckList;\nEasyMDE.cleanBlock = cleanBlock;\nEasyMDE.drawLink = drawLink;\nEasyMDE.drawImage = drawImage;\nEasyMDE.drawUploadedImage = drawUploadedImage;\nEasyMDE.drawTable = drawTable;\nEasyMDE.drawHorizontalRule = drawHorizontalRule;\nEasyMDE.undo = undo;\nEasyMDE.redo = redo;\nEasyMDE.togglePreview = togglePreview;\nEasyMDE.toggleSideBySide = toggleSideBySide;\nEasyMDE.toggleFullScreen = toggleFullScreen;\n\n/**\n * Bind instance methods for exports.\n */\nEasyMDE.prototype.toggleBold = function () {\n    toggleBold(this);\n};\nEasyMDE.prototype.toggleItalic = function () {\n    toggleItalic(this);\n};\nEasyMDE.prototype.toggleStrikethrough = function () {\n    toggleStrikethrough(this);\n};\nEasyMDE.prototype.toggleBlockquote = function () {\n    toggleBlockquote(this);\n};\nEasyMDE.prototype.toggleHeadingSmaller = function () {\n    toggleHeadingSmaller(this);\n};\nEasyMDE.prototype.toggleHeadingBigger = function () {\n    toggleHeadingBigger(this);\n};\nEasyMDE.prototype.toggleHeading1 = function () {\n    toggleHeading1(this);\n};\nEasyMDE.prototype.toggleHeading2 = function () {\n    toggleHeading2(this);\n};\nEasyMDE.prototype.toggleHeading3 = function () {\n    toggleHeading3(this);\n};\nEasyMDE.prototype.toggleHeading4 = function () {\n    toggleHeading4(this);\n};\nEasyMDE.prototype.toggleHeading5 = function () {\n    toggleHeading5(this);\n};\nEasyMDE.prototype.toggleHeading6 = function () {\n    toggleHeading6(this);\n};\nEasyMDE.prototype.toggleCodeBlock = function () {\n    toggleCodeBlock(this);\n};\nEasyMDE.prototype.toggleUnorderedList = function () {\n    toggleUnorderedList(this);\n};\nEasyMDE.prototype.toggleOrderedList = function () {\n    toggleOrderedList(this);\n};\nEasyMDE.prototype.toggleCheckList = function () {\n    toggleCheckList(this);\n};\nEasyMDE.prototype.cleanBlock = function () {\n    cleanBlock(this);\n};\nEasyMDE.prototype.drawLink = function () {\n    drawLink(this);\n};\nEasyMDE.prototype.drawImage = function () {\n    drawImage(this);\n};\nEasyMDE.prototype.drawUploadedImage = function () {\n    drawUploadedImage(this);\n};\nEasyMDE.prototype.drawTable = function () {\n    drawTable(this);\n};\nEasyMDE.prototype.drawHorizontalRule = function () {\n    drawHorizontalRule(this);\n};\nEasyMDE.prototype.undo = function () {\n    undo(this);\n};\nEasyMDE.prototype.redo = function () {\n    redo(this);\n};\nEasyMDE.prototype.togglePreview = function () {\n    togglePreview(this);\n};\nEasyMDE.prototype.toggleSideBySide = function () {\n    toggleSideBySide(this);\n};\nEasyMDE.prototype.toggleFullScreen = function () {\n    toggleFullScreen(this);\n};\n\nEasyMDE.prototype.isPreviewActive = function () {\n    var cm = this.codemirror;\n    var wrapper = cm.getWrapperElement();\n    var preview = wrapper.lastChild;\n\n    return preview.classList.contains('editor-preview-active');\n};\n\nEasyMDE.prototype.isSideBySideActive = function () {\n    var cm = this.codemirror;\n    var wrapper = cm.getWrapperElement();\n    var preview = wrapper.nextSibling;\n\n    return preview.classList.contains('editor-preview-active-side');\n};\n\nEasyMDE.prototype.isFullscreenActive = function () {\n    var cm = this.codemirror;\n\n    return cm.getOption('fullScreen');\n};\n\nEasyMDE.prototype.getState = function () {\n    var cm = this.codemirror;\n\n    return getState(cm);\n};\n\nEasyMDE.prototype.toTextArea = function () {\n    var cm = this.codemirror;\n    var wrapper = cm.getWrapperElement();\n    var easyMDEContainer = wrapper.parentNode;\n\n    if (easyMDEContainer) {\n        if (this.gui.toolbar) {\n            easyMDEContainer.removeChild(this.gui.toolbar);\n        }\n        if (this.gui.statusbar) {\n            easyMDEContainer.removeChild(this.gui.statusbar);\n        }\n        if (this.gui.sideBySide) {\n            easyMDEContainer.removeChild(this.gui.sideBySide);\n        }\n    }\n\n    // Unwrap easyMDEcontainer before codemirror toTextArea() call\n    easyMDEContainer.parentNode.insertBefore(wrapper, easyMDEContainer);\n    easyMDEContainer.remove();\n\n    cm.toTextArea();\n\n    if (this.autosaveTimeoutId) {\n        clearTimeout(this.autosaveTimeoutId);\n        this.autosaveTimeoutId = undefined;\n        this.clearAutosavedValue();\n    }\n};\n\nmodule.exports = EasyMDE;\n","/**\n * EvEmitter v2.1.1\n * Lil' event emitter\n * MIT License\n */\n\n( function( global, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS - Browserify, Webpack\n    module.exports = factory();\n  } else {\n    // Browser globals\n    global.EvEmitter = factory();\n  }\n\n}( typeof window != 'undefined' ? window : this, function() {\n\nfunction EvEmitter() {}\n\nlet proto = EvEmitter.prototype;\n\nproto.on = function( eventName, listener ) {\n  if ( !eventName || !listener ) return this;\n\n  // set events hash\n  let events = this._events = this._events || {};\n  // set listeners array\n  let listeners = events[ eventName ] = events[ eventName ] || [];\n  // only add once\n  if ( !listeners.includes( listener ) ) {\n    listeners.push( listener );\n  }\n\n  return this;\n};\n\nproto.once = function( eventName, listener ) {\n  if ( !eventName || !listener ) return this;\n\n  // add event\n  this.on( eventName, listener );\n  // set once flag\n  // set onceEvents hash\n  let onceEvents = this._onceEvents = this._onceEvents || {};\n  // set onceListeners object\n  let onceListeners = onceEvents[ eventName ] = onceEvents[ eventName ] || {};\n  // set flag\n  onceListeners[ listener ] = true;\n\n  return this;\n};\n\nproto.off = function( eventName, listener ) {\n  let listeners = this._events && this._events[ eventName ];\n  if ( !listeners || !listeners.length ) return this;\n\n  let index = listeners.indexOf( listener );\n  if ( index != -1 ) {\n    listeners.splice( index, 1 );\n  }\n\n  return this;\n};\n\nproto.emitEvent = function( eventName, args ) {\n  let listeners = this._events && this._events[ eventName ];\n  if ( !listeners || !listeners.length ) return this;\n\n  // copy over to avoid interference if .off() in listener\n  listeners = listeners.slice( 0 );\n  args = args || [];\n  // once stuff\n  let onceListeners = this._onceEvents && this._onceEvents[ eventName ];\n\n  for ( let listener of listeners ) {\n    let isOnce = onceListeners && onceListeners[ listener ];\n    if ( isOnce ) {\n      // remove listener\n      // remove before trigger to prevent recursion\n      this.off( eventName, listener );\n      // unset once flag\n      delete onceListeners[ listener ];\n    }\n    // trigger listener\n    listener.apply( this, args );\n  }\n\n  return this;\n};\n\nproto.allOff = function() {\n  delete this._events;\n  delete this._onceEvents;\n  return this;\n};\n\nreturn EvEmitter;\n\n} ) );\n","/**\n * Fizzy UI utils v3.0.0\n * MIT license\n */\n\n( function( global, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory( global );\n  } else {\n    // browser global\n    global.fizzyUIUtils = factory( global );\n  }\n\n}( this, function factory( global ) {\n\nlet utils = {};\n\n// ----- extend ----- //\n\n// extends objects\nutils.extend = function( a, b ) {\n  return Object.assign( a, b );\n};\n\n// ----- modulo ----- //\n\nutils.modulo = function( num, div ) {\n  return ( ( num % div ) + div ) % div;\n};\n\n// ----- makeArray ----- //\n\n// turn element or nodeList into an array\nutils.makeArray = function( obj ) {\n  // use object if already an array\n  if ( Array.isArray( obj ) ) return obj;\n\n  // return empty array if undefined or null. #6\n  if ( obj === null || obj === undefined ) return [];\n\n  let isArrayLike = typeof obj == 'object' && typeof obj.length == 'number';\n  // convert nodeList to array\n  if ( isArrayLike ) return [ ...obj ];\n\n  // array of single index\n  return [ obj ];\n};\n\n// ----- removeFrom ----- //\n\nutils.removeFrom = function( ary, obj ) {\n  let index = ary.indexOf( obj );\n  if ( index != -1 ) {\n    ary.splice( index, 1 );\n  }\n};\n\n// ----- getParent ----- //\n\nutils.getParent = function( elem, selector ) {\n  while ( elem.parentNode && elem != document.body ) {\n    elem = elem.parentNode;\n    if ( elem.matches( selector ) ) return elem;\n  }\n};\n\n// ----- getQueryElement ----- //\n\n// use element as selector string\nutils.getQueryElement = function( elem ) {\n  if ( typeof elem == 'string' ) {\n    return document.querySelector( elem );\n  }\n  return elem;\n};\n\n// ----- handleEvent ----- //\n\n// enable .ontype to trigger from .addEventListener( elem, 'type' )\nutils.handleEvent = function( event ) {\n  let method = 'on' + event.type;\n  if ( this[ method ] ) {\n    this[ method ]( event );\n  }\n};\n\n// ----- filterFindElements ----- //\n\nutils.filterFindElements = function( elems, selector ) {\n  // make array of elems\n  elems = utils.makeArray( elems );\n\n  return elems\n    // check that elem is an actual element\n    .filter( ( elem ) => elem instanceof HTMLElement )\n    .reduce( ( ffElems, elem ) => {\n      // add elem if no selector\n      if ( !selector ) {\n        ffElems.push( elem );\n        return ffElems;\n      }\n      // filter & find items if we have a selector\n      // filter\n      if ( elem.matches( selector ) ) {\n        ffElems.push( elem );\n      }\n      // find children\n      let childElems = elem.querySelectorAll( selector );\n      // concat childElems to filterFound array\n      ffElems = ffElems.concat( ...childElems );\n      return ffElems;\n    }, [] );\n};\n\n// ----- debounceMethod ----- //\n\nutils.debounceMethod = function( _class, methodName, threshold ) {\n  threshold = threshold || 100;\n  // original method\n  let method = _class.prototype[ methodName ];\n  let timeoutName = methodName + 'Timeout';\n\n  _class.prototype[ methodName ] = function() {\n    clearTimeout( this[ timeoutName ] );\n\n    let args = arguments;\n    this[ timeoutName ] = setTimeout( () => {\n      method.apply( this, args );\n      delete this[ timeoutName ];\n    }, threshold );\n  };\n};\n\n// ----- docReady ----- //\n\nutils.docReady = function( onDocReady ) {\n  let readyState = document.readyState;\n  if ( readyState == 'complete' || readyState == 'interactive' ) {\n    // do async to allow for other scripts to run. metafizzy/flickity#441\n    setTimeout( onDocReady );\n  } else {\n    document.addEventListener( 'DOMContentLoaded', onDocReady );\n  }\n};\n\n// ----- htmlInit ----- //\n\n// http://bit.ly/3oYLusc\nutils.toDashed = function( str ) {\n  return str.replace( /(.)([A-Z])/g, function( match, $1, $2 ) {\n    return $1 + '-' + $2;\n  } ).toLowerCase();\n};\n\nlet console = global.console;\n\n// allow user to initialize classes via [data-namespace] or .js-namespace class\n// htmlInit( Widget, 'widgetName' )\n// options are parsed from data-namespace-options\nutils.htmlInit = function( WidgetClass, namespace ) {\n  utils.docReady( function() {\n    let dashedNamespace = utils.toDashed( namespace );\n    let dataAttr = 'data-' + dashedNamespace;\n    let dataAttrElems = document.querySelectorAll( `[${dataAttr}]` );\n    let jQuery = global.jQuery;\n\n    [ ...dataAttrElems ].forEach( ( elem ) => {\n      let attr = elem.getAttribute( dataAttr );\n      let options;\n      try {\n        options = attr && JSON.parse( attr );\n      } catch ( error ) {\n        // log error, do not initialize\n        if ( console ) {\n          console.error( `Error parsing ${dataAttr} on ${elem.className}: ${error}` );\n        }\n        return;\n      }\n      // initialize\n      let instance = new WidgetClass( elem, options );\n      // make available via $().data('namespace')\n      if ( jQuery ) {\n        jQuery.data( elem, namespace, instance );\n      }\n    } );\n\n  } );\n};\n\n// -----  ----- //\n\nreturn utils;\n\n} ) );\n","// add, remove cell\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n        require('./core'),\n        require('fizzy-ui-utils'),\n    );\n  } else {\n    // browser global\n    factory(\n        window.Flickity,\n        window.fizzyUIUtils,\n    );\n  }\n\n}( typeof window != 'undefined' ? window : this, function factory( Flickity, utils ) {\n\n// append cells to a document fragment\nfunction getCellsFragment( cells ) {\n  let fragment = document.createDocumentFragment();\n  cells.forEach( ( cell ) => fragment.appendChild( cell.element ) );\n  return fragment;\n}\n\n// -------------------------- add/remove cell prototype -------------------------- //\n\nlet proto = Flickity.prototype;\n\n/**\n * Insert, prepend, or append cells\n * @param {[Element, Array, NodeList]} elems - Elements to insert\n * @param {Integer} index - Zero-based number to insert\n */\nproto.insert = function( elems, index ) {\n  let cells = this._makeCells( elems );\n  if ( !cells || !cells.length ) return;\n\n  let len = this.cells.length;\n  // default to append\n  index = index === undefined ? len : index;\n  // add cells with document fragment\n  let fragment = getCellsFragment( cells );\n  // append to slider\n  let isAppend = index === len;\n  if ( isAppend ) {\n    this.slider.appendChild( fragment );\n  } else {\n    let insertCellElement = this.cells[ index ].element;\n    this.slider.insertBefore( fragment, insertCellElement );\n  }\n  // add to this.cells\n  if ( index === 0 ) {\n    // prepend, add to start\n    this.cells = cells.concat( this.cells );\n  } else if ( isAppend ) {\n    // append, add to end\n    this.cells = this.cells.concat( cells );\n  } else {\n    // insert in this.cells\n    let endCells = this.cells.splice( index, len - index );\n    this.cells = this.cells.concat( cells ).concat( endCells );\n  }\n\n  this._sizeCells( cells );\n  this.cellChange( index );\n  this.positionSliderAtSelected();\n};\n\nproto.append = function( elems ) {\n  this.insert( elems, this.cells.length );\n};\n\nproto.prepend = function( elems ) {\n  this.insert( elems, 0 );\n};\n\n/**\n * Remove cells\n * @param {[Element, Array, NodeList]} elems - ELements to remove\n */\nproto.remove = function( elems ) {\n  let cells = this.getCells( elems );\n  if ( !cells || !cells.length ) return;\n\n  let minCellIndex = this.cells.length - 1;\n  // remove cells from collection & DOM\n  cells.forEach( ( cell ) => {\n    cell.remove();\n    let index = this.cells.indexOf( cell );\n    minCellIndex = Math.min( index, minCellIndex );\n    utils.removeFrom( this.cells, cell );\n  } );\n\n  this.cellChange( minCellIndex );\n  this.positionSliderAtSelected();\n};\n\n/**\n * logic to be run after a cell's size changes\n * @param {Element} elem - cell's element\n */\nproto.cellSizeChange = function( elem ) {\n  let cell = this.getCell( elem );\n  if ( !cell ) return;\n\n  cell.getSize();\n\n  let index = this.cells.indexOf( cell );\n  this.cellChange( index );\n  // do not position slider after lazy load\n};\n\n/**\n * logic any time a cell is changed: added, removed, or size changed\n * @param {Integer} changedCellIndex - index of the changed cell, optional\n */\nproto.cellChange = function( changedCellIndex ) {\n  let prevSelectedElem = this.selectedElement;\n  this._positionCells( changedCellIndex );\n  this._updateWrapShiftCells();\n  this.setGallerySize();\n  // update selectedIndex, try to maintain position & select previous selected element\n  let cell = this.getCell( prevSelectedElem );\n  if ( cell ) this.selectedIndex = this.getCellSlideIndex( cell );\n  this.selectedIndex = Math.min( this.slides.length - 1, this.selectedIndex );\n\n  this.emitEvent( 'cellChange', [ changedCellIndex ] );\n  // position slider\n  this.select( this.selectedIndex );\n};\n\n// -----  ----- //\n\nreturn Flickity;\n\n} ) );\n","// animate\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory( require('fizzy-ui-utils') );\n  } else {\n    // browser global\n    window.Flickity = window.Flickity || {};\n    window.Flickity.animatePrototype = factory( window.fizzyUIUtils );\n  }\n\n}( typeof window != 'undefined' ? window : this, function factory( utils ) {\n\n// -------------------------- animate -------------------------- //\n\nlet proto = {};\n\nproto.startAnimation = function() {\n  if ( this.isAnimating ) return;\n\n  this.isAnimating = true;\n  this.restingFrames = 0;\n  this.animate();\n};\n\nproto.animate = function() {\n  this.applyDragForce();\n  this.applySelectedAttraction();\n\n  let previousX = this.x;\n\n  this.integratePhysics();\n  this.positionSlider();\n  this.settle( previousX );\n  // animate next frame\n  if ( this.isAnimating ) requestAnimationFrame( () => this.animate() );\n};\n\nproto.positionSlider = function() {\n  let x = this.x;\n  // wrap position around\n  if ( this.isWrapping ) {\n    x = utils.modulo( x, this.slideableWidth ) - this.slideableWidth;\n    this.shiftWrapCells( x );\n  }\n\n  this.setTranslateX( x, this.isAnimating );\n  this.dispatchScrollEvent();\n};\n\nproto.setTranslateX = function( x, is3d ) {\n  x += this.cursorPosition;\n  // reverse if right-to-left and using transform\n  if ( this.options.rightToLeft ) x = -x;\n  let translateX = this.getPositionValue( x );\n  // use 3D transforms for hardware acceleration on iOS\n  // but use 2D when settled, for better font-rendering\n  this.slider.style.transform = is3d ?\n    `translate3d(${translateX},0,0)` : `translateX(${translateX})`;\n};\n\nproto.dispatchScrollEvent = function() {\n  let firstSlide = this.slides[0];\n  if ( !firstSlide ) return;\n\n  let positionX = -this.x - firstSlide.target;\n  let progress = positionX / this.slidesWidth;\n  this.dispatchEvent( 'scroll', null, [ progress, positionX ] );\n};\n\nproto.positionSliderAtSelected = function() {\n  if ( !this.cells.length ) return;\n\n  this.x = -this.selectedSlide.target;\n  this.velocity = 0; // stop wobble\n  this.positionSlider();\n};\n\nproto.getPositionValue = function( position ) {\n  if ( this.options.percentPosition ) {\n    // percent position, round to 2 digits, like 12.34%\n    return ( Math.round( ( position / this.size.innerWidth ) * 10000 ) * 0.01 ) + '%';\n  } else {\n    // pixel positioning\n    return Math.round( position ) + 'px';\n  }\n};\n\nproto.settle = function( previousX ) {\n  // keep track of frames where x hasn't moved\n  let isResting = !this.isPointerDown &&\n      Math.round( this.x * 100 ) === Math.round( previousX * 100 );\n  if ( isResting ) this.restingFrames++;\n  // stop animating if resting for 3 or more frames\n  if ( this.restingFrames > 2 ) {\n    this.isAnimating = false;\n    delete this.isFreeScrolling;\n    // render position with translateX when settled\n    this.positionSlider();\n    this.dispatchEvent( 'settle', null, [ this.selectedIndex ] );\n  }\n};\n\nproto.shiftWrapCells = function( x ) {\n  // shift before cells\n  let beforeGap = this.cursorPosition + x;\n  this._shiftCells( this.beforeShiftCells, beforeGap, -1 );\n  // shift after cells\n  let afterGap = this.size.innerWidth - ( x + this.slideableWidth + this.cursorPosition );\n  this._shiftCells( this.afterShiftCells, afterGap, 1 );\n};\n\nproto._shiftCells = function( cells, gap, shift ) {\n  cells.forEach( ( cell ) => {\n    let cellShift = gap > 0 ? shift : 0;\n    this._wrapShiftCell( cell, cellShift );\n    gap -= cell.size.outerWidth;\n  } );\n};\n\nproto._unshiftCells = function( cells ) {\n  if ( !cells || !cells.length ) return;\n\n  cells.forEach( ( cell ) => this._wrapShiftCell( cell, 0 ) );\n};\n\n// @param {Integer} shift - 0, 1, or -1\nproto._wrapShiftCell = function( cell, shift ) {\n  this._renderCellPosition( cell, cell.x + this.slideableWidth * shift );\n};\n\n// -------------------------- physics -------------------------- //\n\nproto.integratePhysics = function() {\n  this.x += this.velocity;\n  this.velocity *= this.getFrictionFactor();\n};\n\nproto.applyForce = function( force ) {\n  this.velocity += force;\n};\n\nproto.getFrictionFactor = function() {\n  return 1 - this.options[ this.isFreeScrolling ? 'freeScrollFriction' : 'friction' ];\n};\n\nproto.getRestingPosition = function() {\n  // my thanks to Steven Wittens, who simplified this math greatly\n  return this.x + this.velocity / ( 1 - this.getFrictionFactor() );\n};\n\nproto.applyDragForce = function() {\n  if ( !this.isDraggable || !this.isPointerDown ) return;\n\n  // change the position to drag position by applying force\n  let dragVelocity = this.dragX - this.x;\n  let dragForce = dragVelocity - this.velocity;\n  this.applyForce( dragForce );\n};\n\nproto.applySelectedAttraction = function() {\n  // do not attract if pointer down or no slides\n  let dragDown = this.isDraggable && this.isPointerDown;\n  if ( dragDown || this.isFreeScrolling || !this.slides.length ) return;\n\n  let distance = this.selectedSlide.target * -1 - this.x;\n  let force = distance * this.options.selectedAttraction;\n  this.applyForce( force );\n};\n\nreturn proto;\n\n} ) );\n","// Flickity.Cell\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory( require('get-size') );\n  } else {\n    // browser global\n    window.Flickity = window.Flickity || {};\n    window.Flickity.Cell = factory( window.getSize );\n  }\n\n}( typeof window != 'undefined' ? window : this, function factory( getSize ) {\n\nconst cellClassName = 'flickity-cell';\n\nfunction Cell( elem ) {\n  this.element = elem;\n  this.element.classList.add( cellClassName );\n\n  this.x = 0;\n  this.unselect();\n}\n\nlet proto = Cell.prototype;\n\nproto.destroy = function() {\n  // reset style\n  this.unselect();\n  this.element.classList.remove( cellClassName );\n  this.element.style.transform = '';\n  this.element.removeAttribute('aria-hidden');\n};\n\nproto.getSize = function() {\n  this.size = getSize( this.element );\n};\n\nproto.select = function() {\n  this.element.classList.add('is-selected');\n  this.element.removeAttribute('aria-hidden');\n};\n\nproto.unselect = function() {\n  this.element.classList.remove('is-selected');\n  this.element.setAttribute( 'aria-hidden', 'true' );\n};\n\nproto.remove = function() {\n  this.element.remove();\n};\n\nreturn Cell;\n\n} ) );\n","// Flickity main\n/* eslint-disable max-params */\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n        window,\n        require('ev-emitter'),\n        require('get-size'),\n        require('fizzy-ui-utils'),\n        require('./cell'),\n        require('./slide'),\n        require('./animate'),\n    );\n  } else {\n    // browser global\n    let _Flickity = window.Flickity;\n\n    window.Flickity = factory(\n        window,\n        window.EvEmitter,\n        window.getSize,\n        window.fizzyUIUtils,\n        _Flickity.Cell,\n        _Flickity.Slide,\n        _Flickity.animatePrototype,\n    );\n  }\n\n}( typeof window != 'undefined' ? window : this,\n    function factory( window, EvEmitter, getSize, utils, Cell, Slide, animatePrototype ) {\n/* eslint-enable max-params */\n\n// vars\nconst { getComputedStyle, console } = window;\nlet { jQuery } = window;\n\n// -------------------------- Flickity -------------------------- //\n\n// globally unique identifiers\nlet GUID = 0;\n// internal store of all Flickity intances\nlet instances = {};\n\nfunction Flickity( element, options ) {\n  let queryElement = utils.getQueryElement( element );\n  if ( !queryElement ) {\n    if ( console ) console.error(`Bad element for Flickity: ${queryElement || element}`);\n    return;\n  }\n  this.element = queryElement;\n  // do not initialize twice on same element\n  if ( this.element.flickityGUID ) {\n    let instance = instances[ this.element.flickityGUID ];\n    if ( instance ) instance.option( options );\n    return instance;\n  }\n\n  // add jQuery\n  if ( jQuery ) {\n    this.$element = jQuery( this.element );\n  }\n  // options\n  this.options = { ...this.constructor.defaults };\n  this.option( options );\n\n  // kick things off\n  this._create();\n}\n\nFlickity.defaults = {\n  accessibility: true,\n  // adaptiveHeight: false,\n  cellAlign: 'center',\n  // cellSelector: undefined,\n  // contain: false,\n  freeScrollFriction: 0.075, // friction when free-scrolling\n  friction: 0.28, // friction when selecting\n  namespaceJQueryEvents: true,\n  // initialIndex: 0,\n  percentPosition: true,\n  resize: true,\n  selectedAttraction: 0.025,\n  setGallerySize: true,\n  // watchCSS: false,\n  // wrapAround: false\n};\n\n// hash of methods triggered on _create()\nFlickity.create = {};\n\nlet proto = Flickity.prototype;\n// inherit EventEmitter\nObject.assign( proto, EvEmitter.prototype );\n\nproto._create = function() {\n  let { resize, watchCSS, rightToLeft } = this.options;\n  // add id for Flickity.data\n  let id = this.guid = ++GUID;\n  this.element.flickityGUID = id; // expando\n  instances[ id ] = this; // associate via id\n  // initial properties\n  this.selectedIndex = 0;\n  // how many frames slider has been in same position\n  this.restingFrames = 0;\n  // initial physics properties\n  this.x = 0;\n  this.velocity = 0;\n  this.beginMargin = rightToLeft ? 'marginRight' : 'marginLeft';\n  this.endMargin = rightToLeft ? 'marginLeft' : 'marginRight';\n  // create viewport & slider\n  this.viewport = document.createElement('div');\n  this.viewport.className = 'flickity-viewport';\n  this._createSlider();\n  // used for keyboard navigation\n  this.focusableElems = [ this.element ];\n\n  if ( resize || watchCSS ) {\n    window.addEventListener( 'resize', this );\n  }\n\n  // add listeners from on option\n  for ( let eventName in this.options.on ) {\n    let listener = this.options.on[ eventName ];\n    this.on( eventName, listener );\n  }\n\n  for ( let method in Flickity.create ) {\n    Flickity.create[ method ].call( this );\n  }\n\n  if ( watchCSS ) {\n    this.watchCSS();\n  } else {\n    this.activate();\n  }\n};\n\n/**\n * set options\n * @param {Object} opts - options to extend\n */\nproto.option = function( opts ) {\n  Object.assign( this.options, opts );\n};\n\nproto.activate = function() {\n  if ( this.isActive ) return;\n\n  this.isActive = true;\n  this.element.classList.add('flickity-enabled');\n  if ( this.options.rightToLeft ) {\n    this.element.classList.add('flickity-rtl');\n  }\n\n  this.getSize();\n  // move initial cell elements so they can be loaded as cells\n  let cellElems = this._filterFindCellElements( this.element.children );\n  this.slider.append( ...cellElems );\n  this.viewport.append( this.slider );\n  this.element.append( this.viewport );\n  // get cells from children\n  this.reloadCells();\n\n  if ( this.options.accessibility ) {\n    // allow element to focusable\n    this.element.tabIndex = 0;\n    // listen for key presses\n    this.element.addEventListener( 'keydown', this );\n  }\n\n  this.emitEvent('activate');\n  this.selectInitialIndex();\n  // flag for initial activation, for using initialIndex\n  this.isInitActivated = true;\n  // ready event. #493\n  this.dispatchEvent('ready');\n};\n\n// slider positions the cells\nproto._createSlider = function() {\n  // slider element does all the positioning\n  let slider = document.createElement('div');\n  slider.className = 'flickity-slider';\n  this.slider = slider;\n};\n\nproto._filterFindCellElements = function( elems ) {\n  return utils.filterFindElements( elems, this.options.cellSelector );\n};\n\n// goes through all children\nproto.reloadCells = function() {\n  // collection of item elements\n  this.cells = this._makeCells( this.slider.children );\n  this.positionCells();\n  this._updateWrapShiftCells();\n  this.setGallerySize();\n};\n\n/**\n * turn elements into Flickity.Cells\n * @param {[Array, NodeList, HTMLElement]} elems - elements to make into cells\n * @returns {Array} items - collection of new Flickity Cells\n */\nproto._makeCells = function( elems ) {\n  let cellElems = this._filterFindCellElements( elems );\n\n  // create new Cells for collection\n  return cellElems.map( ( cellElem ) => new Cell( cellElem ) );\n};\n\nproto.getLastCell = function() {\n  return this.cells[ this.cells.length - 1 ];\n};\n\nproto.getLastSlide = function() {\n  return this.slides[ this.slides.length - 1 ];\n};\n\n// positions all cells\nproto.positionCells = function() {\n  // size all cells\n  this._sizeCells( this.cells );\n  // position all cells\n  this._positionCells( 0 );\n};\n\n/**\n * position certain cells\n * @param {Integer} index - which cell to start with\n */\nproto._positionCells = function( index ) {\n  index = index || 0;\n  // also measure maxCellHeight\n  // start 0 if positioning all cells\n  this.maxCellHeight = index ? this.maxCellHeight || 0 : 0;\n  let cellX = 0;\n  // get cellX\n  if ( index > 0 ) {\n    let startCell = this.cells[ index - 1 ];\n    cellX = startCell.x + startCell.size.outerWidth;\n  }\n\n  this.cells.slice( index ).forEach( ( cell ) => {\n    cell.x = cellX;\n    this._renderCellPosition( cell, cellX );\n    cellX += cell.size.outerWidth;\n    this.maxCellHeight = Math.max( cell.size.outerHeight, this.maxCellHeight );\n  } );\n  // keep track of cellX for wrap-around\n  this.slideableWidth = cellX;\n  // slides\n  this.updateSlides();\n  // contain slides target\n  this._containSlides();\n  // update slidesWidth\n  this.slidesWidth = this.cells.length ?\n    this.getLastSlide().target - this.slides[0].target : 0;\n};\n\nproto._renderCellPosition = function( cell, x ) {\n  // render position of cell with in slider\n  let sideOffset = this.options.rightToLeft ? -1 : 1;\n  let renderX = x * sideOffset;\n  if ( this.options.percentPosition ) renderX *= this.size.innerWidth / cell.size.width;\n  let positionValue = this.getPositionValue( renderX );\n  cell.element.style.transform = `translateX( ${positionValue} )`;\n};\n\n/**\n * cell.getSize() on multiple cells\n * @param {Array} cells - cells to size\n */\nproto._sizeCells = function( cells ) {\n  cells.forEach( ( cell ) => cell.getSize() );\n};\n\n// --------------------------  -------------------------- //\n\nproto.updateSlides = function() {\n  this.slides = [];\n  if ( !this.cells.length ) return;\n\n  let { beginMargin, endMargin } = this;\n  let slide = new Slide( beginMargin, endMargin, this.cellAlign );\n  this.slides.push( slide );\n\n  let canCellFit = this._getCanCellFit();\n\n  this.cells.forEach( ( cell, i ) => {\n    // just add cell if first cell in slide\n    if ( !slide.cells.length ) {\n      slide.addCell( cell );\n      return;\n    }\n\n    let slideWidth = ( slide.outerWidth - slide.firstMargin ) +\n      ( cell.size.outerWidth - cell.size[ endMargin ] );\n\n    if ( canCellFit( i, slideWidth ) ) {\n      slide.addCell( cell );\n    } else {\n      // doesn't fit, new slide\n      slide.updateTarget();\n\n      slide = new Slide( beginMargin, endMargin, this.cellAlign );\n      this.slides.push( slide );\n      slide.addCell( cell );\n    }\n  } );\n  // last slide\n  slide.updateTarget();\n  // update .selectedSlide\n  this.updateSelectedSlide();\n};\n\nproto._getCanCellFit = function() {\n  let { groupCells } = this.options;\n  if ( !groupCells ) return () => false;\n\n  if ( typeof groupCells == 'number' ) {\n    // group by number. 3 -> [0,1,2], [3,4,5], ...\n    let number = parseInt( groupCells, 10 );\n    return ( i ) => ( i % number ) !== 0;\n  }\n  // default, group by width of slide\n  let percent = 1;\n  // parse '75%\n  let percentMatch = typeof groupCells == 'string' && groupCells.match( /^(\\d+)%$/ );\n  if ( percentMatch ) percent = parseInt( percentMatch[1], 10 ) / 100;\n  let groupWidth = ( this.size.innerWidth + 1 ) * percent;\n  return ( i, slideWidth ) => slideWidth <= groupWidth;\n};\n\n// alias _init for jQuery plugin .flickity()\nproto._init =\nproto.reposition = function() {\n  this.positionCells();\n  this.positionSliderAtSelected();\n};\n\nproto.getSize = function() {\n  this.size = getSize( this.element );\n  this.setCellAlign();\n  this.cursorPosition = this.size.innerWidth * this.cellAlign;\n};\n\nlet cellAlignShorthands = {\n  left: 0,\n  center: 0.5,\n  right: 1,\n};\n\nproto.setCellAlign = function() {\n  let { cellAlign, rightToLeft } = this.options;\n  let shorthand = cellAlignShorthands[ cellAlign ];\n  this.cellAlign = shorthand !== undefined ? shorthand : cellAlign;\n  if ( rightToLeft ) this.cellAlign = 1 - this.cellAlign;\n};\n\nproto.setGallerySize = function() {\n  if ( !this.options.setGallerySize ) return;\n\n  let height = this.options.adaptiveHeight && this.selectedSlide ?\n    this.selectedSlide.height : this.maxCellHeight;\n  this.viewport.style.height = `${height}px`;\n};\n\nproto._updateWrapShiftCells = function() {\n  // update isWrapping\n  this.isWrapping = this.getIsWrapping();\n  // only for wrap-around\n  if ( !this.isWrapping ) return;\n\n  // unshift previous cells\n  this._unshiftCells( this.beforeShiftCells );\n  this._unshiftCells( this.afterShiftCells );\n  // get before cells\n  // initial gap\n  let beforeGapX = this.cursorPosition;\n  let lastIndex = this.cells.length - 1;\n  this.beforeShiftCells = this._getGapCells( beforeGapX, lastIndex, -1 );\n  // get after cells\n  // ending gap between last cell and end of gallery viewport\n  let afterGapX = this.size.innerWidth - this.cursorPosition;\n  // start cloning at first cell, working forwards\n  this.afterShiftCells = this._getGapCells( afterGapX, 0, 1 );\n};\n\nproto.getIsWrapping = function() {\n  let { wrapAround } = this.options;\n  if ( !wrapAround || this.slides.length < 2 ) return false;\n\n  if ( wrapAround !== 'fill' ) return true;\n  // check that slides can fit\n\n  let gapWidth = this.slideableWidth - this.size.innerWidth;\n  if ( gapWidth > this.size.innerWidth ) return true; // gap * 2x big, all good\n  // check that content width - shifting cell is bigger than viewport width\n  for ( let cell of this.cells ) {\n    if ( cell.size.outerWidth > gapWidth ) return false;\n  }\n  return true;\n};\n\nproto._getGapCells = function( gapX, cellIndex, increment ) {\n  // keep adding cells until the cover the initial gap\n  let cells = [];\n  while ( gapX > 0 ) {\n    let cell = this.cells[ cellIndex ];\n    if ( !cell ) break;\n\n    cells.push( cell );\n    cellIndex += increment;\n    gapX -= cell.size.outerWidth;\n  }\n  return cells;\n};\n\n// ----- contain & wrap ----- //\n\n// contain cell targets so no excess sliding\nproto._containSlides = function() {\n  let isContaining = this.options.contain && !this.isWrapping &&\n      this.cells.length;\n  if ( !isContaining ) return;\n\n  let contentWidth = this.slideableWidth - this.getLastCell().size[ this.endMargin ];\n  // content is less than gallery size\n  let isContentSmaller = contentWidth < this.size.innerWidth;\n  if ( isContentSmaller ) {\n    // all cells fit inside gallery\n    this.slides.forEach( ( slide ) => {\n      slide.target = contentWidth * this.cellAlign;\n    } );\n  } else {\n    // contain to bounds\n    let beginBound = this.cursorPosition + this.cells[0].size[ this.beginMargin ];\n    let endBound = contentWidth - this.size.innerWidth * ( 1 - this.cellAlign );\n    this.slides.forEach( ( slide ) => {\n      slide.target = Math.max( slide.target, beginBound );\n      slide.target = Math.min( slide.target, endBound );\n    } );\n  }\n};\n\n// ----- events ----- //\n\n/**\n * emits events via eventEmitter and jQuery events\n * @param {String} type - name of event\n * @param {Event} event - original event\n * @param {Array} args - extra arguments\n */\nproto.dispatchEvent = function( type, event, args ) {\n  let emitArgs = event ? [ event ].concat( args ) : args;\n  this.emitEvent( type, emitArgs );\n\n  if ( jQuery && this.$element ) {\n    // default trigger with type if no event\n    type += this.options.namespaceJQueryEvents ? '.flickity' : '';\n    let $event = type;\n    if ( event ) {\n      // create jQuery event\n      let jQEvent = new jQuery.Event( event );\n      jQEvent.type = type;\n      $event = jQEvent;\n    }\n    this.$element.trigger( $event, args );\n  }\n};\n\nconst unidraggerEvents = [\n  'dragStart',\n  'dragMove',\n  'dragEnd',\n  'pointerDown',\n  'pointerMove',\n  'pointerEnd',\n  'staticClick',\n];\n\nlet _emitEvent = proto.emitEvent;\nproto.emitEvent = function( eventName, args ) {\n  if ( eventName === 'staticClick' ) {\n    // add cellElem and cellIndex args to staticClick\n    let clickedCell = this.getParentCell( args[0].target );\n    let cellElem = clickedCell && clickedCell.element;\n    let cellIndex = clickedCell && this.cells.indexOf( clickedCell );\n    args = args.concat( cellElem, cellIndex );\n  }\n  // do regular thing\n  _emitEvent.call( this, eventName, args );\n  // duck-punch in jQuery events for Unidragger events\n  let isUnidraggerEvent = unidraggerEvents.includes( eventName );\n  if ( !isUnidraggerEvent || !jQuery || !this.$element ) return;\n\n  eventName += this.options.namespaceJQueryEvents ? '.flickity' : '';\n  let event = args.shift( 0 );\n  let jQEvent = new jQuery.Event( event );\n  jQEvent.type = eventName;\n  this.$element.trigger( jQEvent, args );\n};\n\n// -------------------------- select -------------------------- //\n\n/**\n * @param {Integer} index - index of the slide\n * @param {Boolean} isWrap - will wrap-around to last/first if at the end\n * @param {Boolean} isInstant - will immediately set position at selected cell\n */\nproto.select = function( index, isWrap, isInstant ) {\n  if ( !this.isActive ) return;\n\n  index = parseInt( index, 10 );\n  this._wrapSelect( index );\n\n  if ( this.isWrapping || isWrap ) {\n    index = utils.modulo( index, this.slides.length );\n  }\n  // bail if invalid index\n  if ( !this.slides[ index ] ) return;\n\n  let prevIndex = this.selectedIndex;\n  this.selectedIndex = index;\n  this.updateSelectedSlide();\n  if ( isInstant ) {\n    this.positionSliderAtSelected();\n  } else {\n    this.startAnimation();\n  }\n  if ( this.options.adaptiveHeight ) {\n    this.setGallerySize();\n  }\n  // events\n  this.dispatchEvent( 'select', null, [ index ] );\n  // change event if new index\n  if ( index !== prevIndex ) {\n    this.dispatchEvent( 'change', null, [ index ] );\n  }\n};\n\n// wraps position for wrapAround, to move to closest slide. #113\nproto._wrapSelect = function( index ) {\n  if ( !this.isWrapping ) return;\n\n  const { selectedIndex, slideableWidth, slides: { length } } = this;\n  // shift index for wrap, do not wrap dragSelect\n  if ( !this.isDragSelect ) {\n    let wrapIndex = utils.modulo( index, length );\n    // go to shortest\n    let delta = Math.abs( wrapIndex - selectedIndex );\n    let backWrapDelta = Math.abs( ( wrapIndex + length ) - selectedIndex );\n    let forewardWrapDelta = Math.abs( ( wrapIndex - length ) - selectedIndex );\n    if ( backWrapDelta < delta ) {\n      index += length;\n    } else if ( forewardWrapDelta < delta ) {\n      index -= length;\n    }\n  }\n\n  // wrap position so slider is within normal area\n  if ( index < 0 ) {\n    this.x -= slideableWidth;\n  } else if ( index >= length ) {\n    this.x += slideableWidth;\n  }\n};\n\nproto.previous = function( isWrap, isInstant ) {\n  this.select( this.selectedIndex - 1, isWrap, isInstant );\n};\n\nproto.next = function( isWrap, isInstant ) {\n  this.select( this.selectedIndex + 1, isWrap, isInstant );\n};\n\nproto.updateSelectedSlide = function() {\n  let slide = this.slides[ this.selectedIndex ];\n  // selectedIndex could be outside of slides, if triggered before resize()\n  if ( !slide ) return;\n\n  // unselect previous selected slide\n  this.unselectSelectedSlide();\n  // update new selected slide\n  this.selectedSlide = slide;\n  slide.select();\n  this.selectedCells = slide.cells;\n  this.selectedElements = slide.getCellElements();\n  // HACK: selectedCell & selectedElement is first cell in slide, backwards compatibility\n  this.selectedCell = slide.cells[0];\n  this.selectedElement = this.selectedElements[0];\n};\n\nproto.unselectSelectedSlide = function() {\n  if ( this.selectedSlide ) this.selectedSlide.unselect();\n};\n\nproto.selectInitialIndex = function() {\n  let initialIndex = this.options.initialIndex;\n  // already activated, select previous selectedIndex\n  if ( this.isInitActivated ) {\n    this.select( this.selectedIndex, false, true );\n    return;\n  }\n  // select with selector string\n  if ( initialIndex && typeof initialIndex == 'string' ) {\n    let cell = this.queryCell( initialIndex );\n    if ( cell ) {\n      this.selectCell( initialIndex, false, true );\n      return;\n    }\n  }\n\n  let index = 0;\n  // select with number\n  if ( initialIndex && this.slides[ initialIndex ] ) {\n    index = initialIndex;\n  }\n  // select instantly\n  this.select( index, false, true );\n};\n\n/**\n * select slide from number or cell element\n * @param {[Element, Number]} value - zero-based index or element to select\n * @param {Boolean} isWrap - enables wrapping around for extra index\n * @param {Boolean} isInstant - disables slide animation\n */\nproto.selectCell = function( value, isWrap, isInstant ) {\n  // get cell\n  let cell = this.queryCell( value );\n  if ( !cell ) return;\n\n  let index = this.getCellSlideIndex( cell );\n  this.select( index, isWrap, isInstant );\n};\n\nproto.getCellSlideIndex = function( cell ) {\n  // get index of slide that has cell\n  let cellSlide = this.slides.find( ( slide ) => slide.cells.includes( cell ) );\n  return this.slides.indexOf( cellSlide );\n};\n\n// -------------------------- get cells -------------------------- //\n\n/**\n * get Flickity.Cell, given an Element\n * @param {Element} elem - matching cell element\n * @returns {Flickity.Cell} cell - matching cell\n */\nproto.getCell = function( elem ) {\n  // loop through cells to get the one that matches\n  for ( let cell of this.cells ) {\n    if ( cell.element === elem ) return cell;\n  }\n};\n\n/**\n * get collection of Flickity.Cells, given Elements\n * @param {[Element, Array, NodeList]} elems - multiple elements\n * @returns {Array} cells - Flickity.Cells\n */\nproto.getCells = function( elems ) {\n  elems = utils.makeArray( elems );\n  return elems.map( ( elem ) => this.getCell( elem ) ).filter( Boolean );\n};\n\n/**\n * get cell elements\n * @returns {Array} cellElems\n */\nproto.getCellElements = function() {\n  return this.cells.map( ( cell ) => cell.element );\n};\n\n/**\n * get parent cell from an element\n * @param {Element} elem - child element\n * @returns {Flickit.Cell} cell - parent cell\n */\nproto.getParentCell = function( elem ) {\n  // first check if elem is cell\n  let cell = this.getCell( elem );\n  if ( cell ) return cell;\n\n  // try to get parent cell elem\n  let closest = elem.closest('.flickity-slider > *');\n  return this.getCell( closest );\n};\n\n/**\n * get cells adjacent to a slide\n * @param {Integer} adjCount - number of adjacent slides\n * @param {Integer} index - index of slide to start\n * @returns {Array} cells - array of Flickity.Cells\n */\nproto.getAdjacentCellElements = function( adjCount, index ) {\n  if ( !adjCount ) return this.selectedSlide.getCellElements();\n\n  index = index === undefined ? this.selectedIndex : index;\n\n  let len = this.slides.length;\n  if ( 1 + ( adjCount * 2 ) >= len ) {\n    return this.getCellElements(); // get all\n  }\n\n  let cellElems = [];\n  for ( let i = index - adjCount; i <= index + adjCount; i++ ) {\n    let slideIndex = this.isWrapping ? utils.modulo( i, len ) : i;\n    let slide = this.slides[ slideIndex ];\n    if ( slide ) {\n      cellElems = cellElems.concat( slide.getCellElements() );\n    }\n  }\n  return cellElems;\n};\n\n/**\n * select slide from number or cell element\n * @param {[Element, String, Number]} selector - element, selector string, or index\n * @returns {Flickity.Cell} - matching cell\n */\nproto.queryCell = function( selector ) {\n  if ( typeof selector == 'number' ) {\n    // use number as index\n    return this.cells[ selector ];\n  }\n  // do not select invalid selectors from hash: #123, #/. #791\n  let isSelectorString = typeof selector == 'string' && !selector.match( /^[#.]?[\\d/]/ );\n  if ( isSelectorString ) {\n    // use string as selector, get element\n    selector = this.element.querySelector( selector );\n  }\n  // get cell from element\n  return this.getCell( selector );\n};\n\n// -------------------------- events -------------------------- //\n\nproto.uiChange = function() {\n  this.emitEvent('uiChange');\n};\n\n// ----- resize ----- //\n\nproto.onresize = function() {\n  this.watchCSS();\n  this.resize();\n};\n\nutils.debounceMethod( Flickity, 'onresize', 150 );\n\nproto.resize = function() {\n  // #1177 disable resize behavior when animating or dragging for iOS 15\n  if ( !this.isActive || this.isAnimating || this.isDragging ) return;\n  this.getSize();\n  // wrap values\n  if ( this.isWrapping ) {\n    this.x = utils.modulo( this.x, this.slideableWidth );\n  }\n  this.positionCells();\n  this._updateWrapShiftCells();\n  this.setGallerySize();\n  this.emitEvent('resize');\n  // update selected index for group slides, instant\n  // TODO: position can be lost between groups of various numbers\n  let selectedElement = this.selectedElements && this.selectedElements[0];\n  this.selectCell( selectedElement, false, true );\n};\n\n// watches the :after property, activates/deactivates\nproto.watchCSS = function() {\n  if ( !this.options.watchCSS ) return;\n\n  let afterContent = getComputedStyle( this.element, ':after' ).content;\n  // activate if :after { content: 'flickity' }\n  if ( afterContent.includes('flickity') ) {\n    this.activate();\n  } else {\n    this.deactivate();\n  }\n};\n\n// ----- keydown ----- //\n\n// go previous/next if left/right keys pressed\nproto.onkeydown = function( event ) {\n  let { activeElement } = document;\n  let handler = Flickity.keyboardHandlers[ event.key ];\n  // only work if element is in focus\n  if ( !this.options.accessibility || !activeElement || !handler ) return;\n\n  let isFocused = this.focusableElems.some( ( elem ) => activeElement === elem );\n  if ( isFocused ) handler.call( this );\n};\n\nFlickity.keyboardHandlers = {\n  ArrowLeft: function() {\n    this.uiChange();\n    let leftMethod = this.options.rightToLeft ? 'next' : 'previous';\n    this[ leftMethod ]();\n  },\n  ArrowRight: function() {\n    this.uiChange();\n    let rightMethod = this.options.rightToLeft ? 'previous' : 'next';\n    this[ rightMethod ]();\n  },\n};\n\n// ----- focus ----- //\n\nproto.focus = function() {\n  this.element.focus({ preventScroll: true });\n};\n\n// -------------------------- destroy -------------------------- //\n\n// deactivate all Flickity functionality, but keep stuff available\nproto.deactivate = function() {\n  if ( !this.isActive ) return;\n\n  this.element.classList.remove('flickity-enabled');\n  this.element.classList.remove('flickity-rtl');\n  this.unselectSelectedSlide();\n  // destroy cells\n  this.cells.forEach( ( cell ) => cell.destroy() );\n  this.viewport.remove();\n  // move child elements back into element\n  this.element.append( ...this.slider.children );\n  if ( this.options.accessibility ) {\n    this.element.removeAttribute('tabIndex');\n    this.element.removeEventListener( 'keydown', this );\n  }\n  // set flags\n  this.isActive = false;\n  this.emitEvent('deactivate');\n};\n\nproto.destroy = function() {\n  this.deactivate();\n  window.removeEventListener( 'resize', this );\n  this.allOff();\n  this.emitEvent('destroy');\n  if ( jQuery && this.$element ) {\n    jQuery.removeData( this.element, 'flickity' );\n  }\n  delete this.element.flickityGUID;\n  delete instances[ this.guid ];\n};\n\n// -------------------------- prototype -------------------------- //\n\nObject.assign( proto, animatePrototype );\n\n// -------------------------- extras -------------------------- //\n\n/**\n * get Flickity instance from element\n * @param {[Element, String]} elem - element or selector string\n * @returns {Flickity} - Flickity instance\n */\nFlickity.data = function( elem ) {\n  elem = utils.getQueryElement( elem );\n  if ( elem ) return instances[ elem.flickityGUID ];\n};\n\nutils.htmlInit( Flickity, 'flickity' );\n\nlet { jQueryBridget } = window;\nif ( jQuery && jQueryBridget ) {\n  jQueryBridget( 'flickity', Flickity, jQuery );\n}\n\n// set internal jQuery, for Webpack + jQuery v3, #478\nFlickity.setJQuery = function( jq ) {\n  jQuery = jq;\n};\n\nFlickity.Cell = Cell;\nFlickity.Slide = Slide;\n\nreturn Flickity;\n\n} ) );\n","// drag\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n        window,\n        require('./core'),\n        require('unidragger'),\n        require('fizzy-ui-utils'),\n    );\n  } else {\n    // browser global\n    window.Flickity = factory(\n        window,\n        window.Flickity,\n        window.Unidragger,\n        window.fizzyUIUtils,\n    );\n  }\n\n}( typeof window != 'undefined' ? window : this,\n    function factory( window, Flickity, Unidragger, utils ) {\n\n// ----- defaults ----- //\n\nObject.assign( Flickity.defaults, {\n  draggable: '>1',\n  dragThreshold: 3,\n} );\n\n// -------------------------- drag prototype -------------------------- //\n\nlet proto = Flickity.prototype;\nObject.assign( proto, Unidragger.prototype ); // inherit Unidragger\nproto.touchActionValue = '';\n\n// --------------------------  -------------------------- //\n\nFlickity.create.drag = function() {\n  this.on( 'activate', this.onActivateDrag );\n  this.on( 'uiChange', this._uiChangeDrag );\n  this.on( 'deactivate', this.onDeactivateDrag );\n  this.on( 'cellChange', this.updateDraggable );\n  this.on( 'pointerDown', this.handlePointerDown );\n  this.on( 'pointerUp', this.handlePointerUp );\n  this.on( 'pointerDown', this.handlePointerDone );\n  this.on( 'dragStart', this.handleDragStart );\n  this.on( 'dragMove', this.handleDragMove );\n  this.on( 'dragEnd', this.handleDragEnd );\n  this.on( 'staticClick', this.handleStaticClick );\n  // TODO updateDraggable on resize? if groupCells & slides change\n};\n\nproto.onActivateDrag = function() {\n  this.handles = [ this.viewport ];\n  this.bindHandles();\n  this.updateDraggable();\n};\n\nproto.onDeactivateDrag = function() {\n  this.unbindHandles();\n  this.element.classList.remove('is-draggable');\n};\n\nproto.updateDraggable = function() {\n  // disable dragging if less than 2 slides. #278\n  if ( this.options.draggable === '>1' ) {\n    this.isDraggable = this.slides.length > 1;\n  } else {\n    this.isDraggable = this.options.draggable;\n  }\n  this.element.classList.toggle( 'is-draggable', this.isDraggable );\n};\n\nproto._uiChangeDrag = function() {\n  delete this.isFreeScrolling;\n};\n\n// -------------------------- pointer events -------------------------- //\n\nproto.handlePointerDown = function( event ) {\n  if ( !this.isDraggable ) {\n    // proceed for staticClick\n    this.bindActivePointerEvents( event );\n    return;\n  }\n\n  let isTouchStart = event.type === 'touchstart';\n  let isTouchPointer = event.pointerType === 'touch';\n  let isFocusNode = event.target.matches('input, textarea, select');\n  if ( !isTouchStart && !isTouchPointer && !isFocusNode ) event.preventDefault();\n  if ( !isFocusNode ) this.focus();\n  // blur\n  if ( document.activeElement !== this.element ) document.activeElement.blur();\n  // stop if it was moving\n  this.dragX = this.x;\n  this.viewport.classList.add('is-pointer-down');\n  // track scrolling\n  this.pointerDownScroll = getScrollPosition();\n  window.addEventListener( 'scroll', this );\n  this.bindActivePointerEvents( event );\n};\n\n// ----- move ----- //\n\nproto.hasDragStarted = function( moveVector ) {\n  return Math.abs( moveVector.x ) > this.options.dragThreshold;\n};\n\n// ----- up ----- //\n\nproto.handlePointerUp = function() {\n  delete this.isTouchScrolling;\n  this.viewport.classList.remove('is-pointer-down');\n};\n\nproto.handlePointerDone = function() {\n  window.removeEventListener( 'scroll', this );\n  delete this.pointerDownScroll;\n};\n\n// -------------------------- dragging -------------------------- //\n\nproto.handleDragStart = function() {\n  if ( !this.isDraggable ) return;\n\n  this.dragStartPosition = this.x;\n  this.startAnimation();\n  window.removeEventListener( 'scroll', this );\n};\n\nproto.handleDragMove = function( event, pointer, moveVector ) {\n  if ( !this.isDraggable ) return;\n\n  event.preventDefault();\n\n  this.previousDragX = this.dragX;\n  // reverse if right-to-left\n  let direction = this.options.rightToLeft ? -1 : 1;\n  // wrap around move. #589\n  if ( this.isWrapping ) moveVector.x %= this.slideableWidth;\n  let dragX = this.dragStartPosition + moveVector.x * direction;\n\n  if ( !this.isWrapping ) {\n    // slow drag\n    let originBound = Math.max( -this.slides[0].target, this.dragStartPosition );\n    dragX = dragX > originBound ? ( dragX + originBound ) * 0.5 : dragX;\n    let endBound = Math.min( -this.getLastSlide().target, this.dragStartPosition );\n    dragX = dragX < endBound ? ( dragX + endBound ) * 0.5 : dragX;\n  }\n\n  this.dragX = dragX;\n  this.dragMoveTime = new Date();\n};\n\nproto.handleDragEnd = function() {\n  if ( !this.isDraggable ) return;\n\n  let { freeScroll } = this.options;\n  if ( freeScroll ) this.isFreeScrolling = true;\n  // set selectedIndex based on where flick will end up\n  let index = this.dragEndRestingSelect();\n\n  if ( freeScroll && !this.isWrapping ) {\n    // if free-scroll & not wrap around\n    // do not free-scroll if going outside of bounding slides\n    // so bounding slides can attract slider, and keep it in bounds\n    let restingX = this.getRestingPosition();\n    this.isFreeScrolling = -restingX > this.slides[0].target &&\n      -restingX < this.getLastSlide().target;\n  } else if ( !freeScroll && index === this.selectedIndex ) {\n    // boost selection if selected index has not changed\n    index += this.dragEndBoostSelect();\n  }\n  delete this.previousDragX;\n  // apply selection\n  // HACK, set flag so dragging stays in correct direction\n  this.isDragSelect = this.isWrapping;\n  this.select( index );\n  delete this.isDragSelect;\n};\n\nproto.dragEndRestingSelect = function() {\n  let restingX = this.getRestingPosition();\n  // how far away from selected slide\n  let distance = Math.abs( this.getSlideDistance( -restingX, this.selectedIndex ) );\n  // get closet resting going up and going down\n  let positiveResting = this._getClosestResting( restingX, distance, 1 );\n  let negativeResting = this._getClosestResting( restingX, distance, -1 );\n  // use closer resting for wrap-around\n  return positiveResting.distance < negativeResting.distance ?\n    positiveResting.index : negativeResting.index;\n};\n\n/**\n * given resting X and distance to selected cell\n * get the distance and index of the closest cell\n * @param {Number} restingX - estimated post-flick resting position\n * @param {Number} distance - distance to selected cell\n * @param {Integer} increment - +1 or -1, going up or down\n * @returns {Object} - { distance: {Number}, index: {Integer} }\n */\nproto._getClosestResting = function( restingX, distance, increment ) {\n  let index = this.selectedIndex;\n  let minDistance = Infinity;\n  let condition = this.options.contain && !this.isWrapping ?\n    // if containing, keep going if distance is equal to minDistance\n    ( dist, minDist ) => dist <= minDist :\n    ( dist, minDist ) => dist < minDist;\n\n  while ( condition( distance, minDistance ) ) {\n    // measure distance to next cell\n    index += increment;\n    minDistance = distance;\n    distance = this.getSlideDistance( -restingX, index );\n    if ( distance === null ) break;\n\n    distance = Math.abs( distance );\n  }\n  return {\n    distance: minDistance,\n    // selected was previous index\n    index: index - increment,\n  };\n};\n\n/**\n * measure distance between x and a slide target\n * @param {Number} x - horizontal position\n * @param {Integer} index - slide index\n * @returns {Number} - slide distance\n */\nproto.getSlideDistance = function( x, index ) {\n  let len = this.slides.length;\n  // wrap around if at least 2 slides\n  let isWrapAround = this.options.wrapAround && len > 1;\n  let slideIndex = isWrapAround ? utils.modulo( index, len ) : index;\n  let slide = this.slides[ slideIndex ];\n  if ( !slide ) return null;\n\n  // add distance for wrap-around slides\n  let wrap = isWrapAround ? this.slideableWidth * Math.floor( index/len ) : 0;\n  return x - ( slide.target + wrap );\n};\n\nproto.dragEndBoostSelect = function() {\n  // do not boost if no previousDragX or dragMoveTime\n  if ( this.previousDragX === undefined || !this.dragMoveTime ||\n    // or if drag was held for 100 ms\n    new Date() - this.dragMoveTime > 100 ) {\n    return 0;\n  }\n\n  let distance = this.getSlideDistance( -this.dragX, this.selectedIndex );\n  let delta = this.previousDragX - this.dragX;\n  if ( distance > 0 && delta > 0 ) {\n    // boost to next if moving towards the right, and positive velocity\n    return 1;\n  } else if ( distance < 0 && delta < 0 ) {\n    // boost to previous if moving towards the left, and negative velocity\n    return -1;\n  }\n  return 0;\n};\n\n// ----- scroll ----- //\n\nproto.onscroll = function() {\n  let scroll = getScrollPosition();\n  let scrollMoveX = this.pointerDownScroll.x - scroll.x;\n  let scrollMoveY = this.pointerDownScroll.y - scroll.y;\n  // cancel click/tap if scroll is too much\n  if ( Math.abs( scrollMoveX ) > 3 || Math.abs( scrollMoveY ) > 3 ) {\n    this.pointerDone();\n  }\n};\n\n// ----- utils ----- //\n\nfunction getScrollPosition() {\n  return {\n    x: window.pageXOffset,\n    y: window.pageYOffset,\n  };\n}\n\n// -----  ----- //\n\nreturn Flickity;\n\n} ) );\n","// imagesloaded\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n        require('./core'),\n        require('imagesloaded'),\n    );\n  } else {\n    // browser global\n    factory(\n        window.Flickity,\n        window.imagesLoaded,\n    );\n  }\n\n}( typeof window != 'undefined' ? window : this,\n    function factory( Flickity, imagesLoaded ) {\n\nFlickity.create.imagesLoaded = function() {\n  this.on( 'activate', this.imagesLoaded );\n};\n\nFlickity.prototype.imagesLoaded = function() {\n  if ( !this.options.imagesLoaded ) return;\n\n  let onImagesLoadedProgress = ( instance, image ) => {\n    let cell = this.getParentCell( image.img );\n    this.cellSizeChange( cell && cell.element );\n    if ( !this.options.freeScroll ) this.positionSliderAtSelected();\n  };\n  imagesLoaded( this.slider ).on( 'progress', onImagesLoadedProgress );\n};\n\nreturn Flickity;\n\n} ) );\n","/*!\n * Flickity v3.0.0\n * Touch, responsive, flickable carousels\n *\n * Licensed GPLv3 for open source use\n * or Flickity Commercial License for commercial use\n *\n * https://flickity.metafizzy.co\n * Copyright 2015-2022 Metafizzy\n */\n\nif ( typeof module == 'object' && module.exports ) {\n  const Flickity = require('./core');\n  require('./drag');\n  require('./prev-next-button');\n  require('./page-dots');\n  require('./player');\n  require('./add-remove-cell');\n  require('./lazyload');\n  require('./imagesloaded');\n\n  module.exports = Flickity;\n}\n","// lazyload\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n        require('./core'),\n        require('fizzy-ui-utils'),\n    );\n  } else {\n    // browser global\n    factory(\n        window.Flickity,\n        window.fizzyUIUtils,\n    );\n  }\n\n}( typeof window != 'undefined' ? window : this, function factory( Flickity, utils ) {\n\nconst lazyAttr = 'data-flickity-lazyload';\nconst lazySrcAttr = `${lazyAttr}-src`;\nconst lazySrcsetAttr = `${lazyAttr}-srcset`;\nconst imgSelector = `img[${lazyAttr}], img[${lazySrcAttr}], ` +\n  `img[${lazySrcsetAttr}], source[${lazySrcsetAttr}]`;\n\nFlickity.create.lazyLoad = function() {\n  this.on( 'select', this.lazyLoad );\n\n  this.handleLazyLoadComplete = this.onLazyLoadComplete.bind( this );\n};\n\nlet proto = Flickity.prototype;\n\nproto.lazyLoad = function() {\n  let { lazyLoad } = this.options;\n  if ( !lazyLoad ) return;\n\n  // get adjacent cells, use lazyLoad option for adjacent count\n  let adjCount = typeof lazyLoad == 'number' ? lazyLoad : 0;\n  // lazy load images\n  this.getAdjacentCellElements( adjCount )\n    .map( getCellLazyImages )\n    .flat()\n    .forEach( ( img ) => new LazyLoader( img, this.handleLazyLoadComplete ) );\n};\n\nfunction getCellLazyImages( cellElem ) {\n  // check if cell element is lazy image\n  if ( cellElem.matches('img') ) {\n    let cellAttr = cellElem.getAttribute( lazyAttr );\n    let cellSrcAttr = cellElem.getAttribute( lazySrcAttr );\n    let cellSrcsetAttr = cellElem.getAttribute( lazySrcsetAttr );\n    if ( cellAttr || cellSrcAttr || cellSrcsetAttr ) {\n      return cellElem;\n    }\n  }\n  // select lazy images in cell\n  return [ ...cellElem.querySelectorAll( imgSelector ) ];\n}\n\nproto.onLazyLoadComplete = function( img, event ) {\n  let cell = this.getParentCell( img );\n  let cellElem = cell && cell.element;\n  this.cellSizeChange( cellElem );\n\n  this.dispatchEvent( 'lazyLoad', event, cellElem );\n};\n\n// -------------------------- LazyLoader -------------------------- //\n\n/**\n * class to handle loading images\n * @param {Image} img - Image element\n * @param {Function} onComplete - callback function\n */\nfunction LazyLoader( img, onComplete ) {\n  this.img = img;\n  this.onComplete = onComplete;\n  this.load();\n}\n\nLazyLoader.prototype.handleEvent = utils.handleEvent;\n\nLazyLoader.prototype.load = function() {\n  this.img.addEventListener( 'load', this );\n  this.img.addEventListener( 'error', this );\n  // get src & srcset\n  let src = this.img.getAttribute( lazyAttr ) ||\n    this.img.getAttribute( lazySrcAttr );\n  let srcset = this.img.getAttribute( lazySrcsetAttr );\n  // set src & serset\n  this.img.src = src;\n  if ( srcset ) this.img.setAttribute( 'srcset', srcset );\n  // remove attr\n  this.img.removeAttribute( lazyAttr );\n  this.img.removeAttribute( lazySrcAttr );\n  this.img.removeAttribute( lazySrcsetAttr );\n};\n\nLazyLoader.prototype.onload = function( event ) {\n  this.complete( event, 'flickity-lazyloaded' );\n};\n\nLazyLoader.prototype.onerror = function( event ) {\n  this.complete( event, 'flickity-lazyerror' );\n};\n\nLazyLoader.prototype.complete = function( event, className ) {\n  // unbind events\n  this.img.removeEventListener( 'load', this );\n  this.img.removeEventListener( 'error', this );\n  let mediaElem = this.img.parentNode.matches('picture') ? this.img.parentNode : this.img;\n  mediaElem.classList.add( className );\n\n  this.onComplete( this.img, event );\n};\n\n// -----  ----- //\n\nFlickity.LazyLoader = LazyLoader;\n\nreturn Flickity;\n\n} ) );\n","// page dots\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n        require('./core'),\n        require('fizzy-ui-utils'),\n    );\n  } else {\n    // browser global\n    factory(\n        window.Flickity,\n        window.fizzyUIUtils,\n    );\n  }\n\n}( typeof window != 'undefined' ? window : this, function factory( Flickity, utils ) {\n\n// -------------------------- PageDots -------------------------- //\n\nfunction PageDots() {\n  // create holder element\n  this.holder = document.createElement('div');\n  this.holder.className = 'flickity-page-dots';\n  // create dots, array of elements\n  this.dots = [];\n}\n\nPageDots.prototype.setDots = function( slidesLength ) {\n  // get difference between number of slides and number of dots\n  let delta = slidesLength - this.dots.length;\n  if ( delta > 0 ) {\n    this.addDots( delta );\n  } else if ( delta < 0 ) {\n    this.removeDots( -delta );\n  }\n};\n\nPageDots.prototype.addDots = function( count ) {\n  let newDots = new Array( count ).fill()\n    .map( ( item, i ) => {\n      let dot = document.createElement('button');\n      dot.setAttribute( 'type', 'button' );\n      let num = i + 1 + this.dots.length;\n      dot.className = 'flickity-page-dot';\n      dot.textContent = `View slide ${num}`;\n      return dot;\n    } );\n\n  this.holder.append( ...newDots );\n  this.dots = this.dots.concat( newDots );\n};\n\nPageDots.prototype.removeDots = function( count ) {\n  // remove from this.dots collection\n  let removeDots = this.dots.splice( this.dots.length - count, count );\n  // remove from DOM\n  removeDots.forEach( ( dot ) => dot.remove() );\n};\n\nPageDots.prototype.updateSelected = function( index ) {\n  // remove selected class on previous\n  if ( this.selectedDot ) {\n    this.selectedDot.classList.remove('is-selected');\n    this.selectedDot.removeAttribute('aria-current');\n  }\n  // don't proceed if no dots\n  if ( !this.dots.length ) return;\n\n  this.selectedDot = this.dots[ index ];\n  this.selectedDot.classList.add('is-selected');\n  this.selectedDot.setAttribute( 'aria-current', 'step' );\n};\n\nFlickity.PageDots = PageDots;\n\n// -------------------------- Flickity -------------------------- //\n\nObject.assign( Flickity.defaults, {\n  pageDots: true,\n} );\n\nFlickity.create.pageDots = function() {\n  if ( !this.options.pageDots ) return;\n\n  this.pageDots = new PageDots();\n  this.handlePageDotsClick = this.onPageDotsClick.bind( this );\n  // events\n  this.on( 'activate', this.activatePageDots );\n  this.on( 'select', this.updateSelectedPageDots );\n  this.on( 'cellChange', this.updatePageDots );\n  this.on( 'resize', this.updatePageDots );\n  this.on( 'deactivate', this.deactivatePageDots );\n};\n\nlet proto = Flickity.prototype;\n\nproto.activatePageDots = function() {\n  this.pageDots.setDots( this.slides.length );\n  this.focusableElems.push( ...this.pageDots.dots );\n  this.pageDots.holder.addEventListener( 'click', this.handlePageDotsClick );\n  this.element.append( this.pageDots.holder );\n};\n\nproto.onPageDotsClick = function( event ) {\n  let index = this.pageDots.dots.indexOf( event.target );\n  if ( index === -1 ) return; // only dot clicks\n\n  this.uiChange();\n  this.select( index );\n};\n\nproto.updateSelectedPageDots = function() {\n  this.pageDots.updateSelected( this.selectedIndex );\n};\n\nproto.updatePageDots = function() {\n  this.pageDots.dots.forEach( ( dot ) => {\n    utils.removeFrom( this.focusableElems, dot );\n  } );\n  this.pageDots.setDots( this.slides.length );\n  this.focusableElems.push( ...this.pageDots.dots );\n};\n\nproto.deactivatePageDots = function() {\n  this.pageDots.holder.remove();\n  this.pageDots.holder.removeEventListener( 'click', this.handlePageDotsClick );\n};\n\n// -----  ----- //\n\nFlickity.PageDots = PageDots;\n\nreturn Flickity;\n\n} ) );\n","// player & autoPlay\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory( require('./core') );\n  } else {\n    // browser global\n    factory( window.Flickity );\n  }\n\n}( typeof window != 'undefined' ? window : this, function factory( Flickity ) {\n\n// -------------------------- Player -------------------------- //\n\nfunction Player( autoPlay, onTick ) {\n  this.autoPlay = autoPlay;\n  this.onTick = onTick;\n  this.state = 'stopped';\n  // visibility change event handler\n  this.onVisibilityChange = this.visibilityChange.bind( this );\n  this.onVisibilityPlay = this.visibilityPlay.bind( this );\n}\n\n// start play\nPlayer.prototype.play = function() {\n  if ( this.state === 'playing' ) return;\n\n  // do not play if page is hidden, start playing when page is visible\n  let isPageHidden = document.hidden;\n  if ( isPageHidden ) {\n    document.addEventListener( 'visibilitychange', this.onVisibilityPlay );\n    return;\n  }\n\n  this.state = 'playing';\n  // listen to visibility change\n  document.addEventListener( 'visibilitychange', this.onVisibilityChange );\n  // start ticking\n  this.tick();\n};\n\nPlayer.prototype.tick = function() {\n  // do not tick if not playing\n  if ( this.state !== 'playing' ) return;\n\n  // default to 3 seconds\n  let time = typeof this.autoPlay == 'number' ? this.autoPlay : 3000;\n  // HACK: reset ticks if stopped and started within interval\n  this.clear();\n  this.timeout = setTimeout( () => {\n    this.onTick();\n    this.tick();\n  }, time );\n};\n\nPlayer.prototype.stop = function() {\n  this.state = 'stopped';\n  this.clear();\n  // remove visibility change event\n  document.removeEventListener( 'visibilitychange', this.onVisibilityChange );\n};\n\nPlayer.prototype.clear = function() {\n  clearTimeout( this.timeout );\n};\n\nPlayer.prototype.pause = function() {\n  if ( this.state === 'playing' ) {\n    this.state = 'paused';\n    this.clear();\n  }\n};\n\nPlayer.prototype.unpause = function() {\n  // re-start play if paused\n  if ( this.state === 'paused' ) this.play();\n};\n\n// pause if page visibility is hidden, unpause if visible\nPlayer.prototype.visibilityChange = function() {\n  let isPageHidden = document.hidden;\n  this[ isPageHidden ? 'pause' : 'unpause' ]();\n};\n\nPlayer.prototype.visibilityPlay = function() {\n  this.play();\n  document.removeEventListener( 'visibilitychange', this.onVisibilityPlay );\n};\n\n// -------------------------- Flickity -------------------------- //\n\nObject.assign( Flickity.defaults, {\n  pauseAutoPlayOnHover: true,\n} );\n\nFlickity.create.player = function() {\n  this.player = new Player( this.options.autoPlay, () => {\n    this.next( true );\n  } );\n\n  this.on( 'activate', this.activatePlayer );\n  this.on( 'uiChange', this.stopPlayer );\n  this.on( 'pointerDown', this.stopPlayer );\n  this.on( 'deactivate', this.deactivatePlayer );\n};\n\nlet proto = Flickity.prototype;\n\nproto.activatePlayer = function() {\n  if ( !this.options.autoPlay ) return;\n\n  this.player.play();\n  this.element.addEventListener( 'mouseenter', this );\n};\n\n// Player API, don't hate the ... thanks I know where the door is\n\nproto.playPlayer = function() {\n  this.player.play();\n};\n\nproto.stopPlayer = function() {\n  this.player.stop();\n};\n\nproto.pausePlayer = function() {\n  this.player.pause();\n};\n\nproto.unpausePlayer = function() {\n  this.player.unpause();\n};\n\nproto.deactivatePlayer = function() {\n  this.player.stop();\n  this.element.removeEventListener( 'mouseenter', this );\n};\n\n// ----- mouseenter/leave ----- //\n\n// pause auto-play on hover\nproto.onmouseenter = function() {\n  if ( !this.options.pauseAutoPlayOnHover ) return;\n\n  this.player.pause();\n  this.element.addEventListener( 'mouseleave', this );\n};\n\n// resume auto-play on hover off\nproto.onmouseleave = function() {\n  this.player.unpause();\n  this.element.removeEventListener( 'mouseleave', this );\n};\n\n// -----  ----- //\n\nFlickity.Player = Player;\n\nreturn Flickity;\n\n} ) );\n","// prev/next buttons\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory( require('./core') );\n  } else {\n    // browser global\n    factory( window.Flickity );\n  }\n\n}( typeof window != 'undefined' ? window : this, function factory( Flickity ) {\n\nconst svgURI = 'http://www.w3.org/2000/svg';\n\n// -------------------------- PrevNextButton -------------------------- //\n\nfunction PrevNextButton( increment, direction, arrowShape ) {\n  this.increment = increment;\n  this.direction = direction;\n  this.isPrevious = increment === 'previous';\n  this.isLeft = direction === 'left';\n  this._create( arrowShape );\n}\n\nPrevNextButton.prototype._create = function( arrowShape ) {\n  // properties\n  let element = this.element = document.createElement('button');\n  element.className = `flickity-button flickity-prev-next-button ${this.increment}`;\n  let label = this.isPrevious ? 'Previous' : 'Next';\n  // prevent button from submitting form https://stackoverflow.com/a/10836076/182183\n  element.setAttribute( 'type', 'button' );\n  element.setAttribute( 'aria-label', label );\n  // init as disabled\n  this.disable();\n  // create arrow\n  let svg = this.createSVG( label, arrowShape );\n  element.append( svg );\n};\n\nPrevNextButton.prototype.createSVG = function( label, arrowShape ) {\n  let svg = document.createElementNS( svgURI, 'svg' );\n  svg.setAttribute( 'class', 'flickity-button-icon' );\n  svg.setAttribute( 'viewBox', '0 0 100 100' );\n  // add title #1189\n  let title = document.createElementNS( svgURI, 'title' );\n  title.append( label );\n  // add path\n  let path = document.createElementNS( svgURI, 'path' );\n  let pathMovements = getArrowMovements( arrowShape );\n  path.setAttribute( 'd', pathMovements );\n  path.setAttribute( 'class', 'arrow' );\n  // rotate arrow\n  if ( !this.isLeft ) {\n    path.setAttribute( 'transform', 'translate(100, 100) rotate(180)' );\n  }\n  svg.append( title, path );\n  return svg;\n};\n\n// get SVG path movmement\nfunction getArrowMovements( shape ) {\n  // use shape as movement if string\n  if ( typeof shape == 'string' ) return shape;\n\n  let { x0, x1, x2, x3, y1, y2 } = shape;\n\n  // create movement string\n  return `M ${x0}, 50\n    L ${x1}, ${y1 + 50}\n    L ${x2}, ${y2 + 50}\n    L ${x3}, 50\n    L ${x2}, ${50 - y2}\n    L ${x1}, ${50 - y1}\n    Z`;\n}\n\n// -----  ----- //\n\nPrevNextButton.prototype.enable = function() {\n  this.element.removeAttribute('disabled');\n};\n\nPrevNextButton.prototype.disable = function() {\n  this.element.setAttribute( 'disabled', true );\n};\n\n// -------------------------- Flickity prototype -------------------------- //\n\nObject.assign( Flickity.defaults, {\n  prevNextButtons: true,\n  arrowShape: {\n    x0: 10,\n    x1: 60, y1: 50,\n    x2: 70, y2: 40,\n    x3: 30,\n  },\n} );\n\nFlickity.create.prevNextButtons = function() {\n  if ( !this.options.prevNextButtons ) return;\n\n  let { rightToLeft, arrowShape } = this.options;\n  let prevDirection = rightToLeft ? 'right' : 'left';\n  let nextDirection = rightToLeft ? 'left' : 'right';\n  this.prevButton = new PrevNextButton( 'previous', prevDirection, arrowShape );\n  this.nextButton = new PrevNextButton( 'next', nextDirection, arrowShape );\n  this.focusableElems.push( this.prevButton.element );\n  this.focusableElems.push( this.nextButton.element );\n\n  this.handlePrevButtonClick = () => {\n    this.uiChange();\n    this.previous();\n  };\n\n  this.handleNextButtonClick = () => {\n    this.uiChange();\n    this.next();\n  };\n\n  this.on( 'activate', this.activatePrevNextButtons );\n  this.on( 'select', this.updatePrevNextButtons );\n};\n\nlet proto = Flickity.prototype;\n\nproto.updatePrevNextButtons = function() {\n  let lastIndex = this.slides.length ? this.slides.length - 1 : 0;\n  this.updatePrevNextButton( this.prevButton, 0 );\n  this.updatePrevNextButton( this.nextButton, lastIndex );\n};\n\nproto.updatePrevNextButton = function( button, disabledIndex ) {\n  // enable is wrapAround and at least 2 slides\n  if ( this.isWrapping && this.slides.length > 1 ) {\n    button.enable();\n    return;\n  }\n\n  let isEnabled = this.selectedIndex !== disabledIndex;\n  button[ isEnabled ? 'enable' : 'disable' ]();\n  // if disabling button that is focused,\n  // shift focus to element to maintain keyboard accessibility\n  let isDisabledFocused = !isEnabled && document.activeElement === button.element;\n  if ( isDisabledFocused ) this.focus();\n};\n\nproto.activatePrevNextButtons = function() {\n  this.prevButton.element.addEventListener( 'click', this.handlePrevButtonClick );\n  this.nextButton.element.addEventListener( 'click', this.handleNextButtonClick );\n  this.element.append( this.prevButton.element, this.nextButton.element );\n  this.on( 'deactivate', this.deactivatePrevNextButtons );\n};\n\nproto.deactivatePrevNextButtons = function() {\n  this.prevButton.element.remove();\n  this.nextButton.element.remove();\n  this.prevButton.element.removeEventListener( 'click', this.handlePrevButtonClick );\n  this.nextButton.element.removeEventListener( 'click', this.handleNextButtonClick );\n  this.off( 'deactivate', this.deactivatePrevNextButtons );\n};\n\n// --------------------------  -------------------------- //\n\nFlickity.PrevNextButton = PrevNextButton;\n\nreturn Flickity;\n\n} ) );\n","// slide\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory();\n  } else {\n    // browser global\n    window.Flickity = window.Flickity || {};\n    window.Flickity.Slide = factory();\n  }\n\n}( typeof window != 'undefined' ? window : this, function factory() {\n\nfunction Slide( beginMargin, endMargin, cellAlign ) {\n  this.beginMargin = beginMargin;\n  this.endMargin = endMargin;\n  this.cellAlign = cellAlign;\n  this.cells = [];\n  this.outerWidth = 0;\n  this.height = 0;\n}\n\nlet proto = Slide.prototype;\n\nproto.addCell = function( cell ) {\n  this.cells.push( cell );\n  this.outerWidth += cell.size.outerWidth;\n  this.height = Math.max( cell.size.outerHeight, this.height );\n  // first cell stuff\n  if ( this.cells.length === 1 ) {\n    this.x = cell.x; // x comes from first cell\n    this.firstMargin = cell.size[ this.beginMargin ];\n  }\n};\n\nproto.updateTarget = function() {\n  let lastCell = this.getLastCell();\n  let lastMargin = lastCell ? lastCell.size[ this.endMargin ] : 0;\n  let slideWidth = this.outerWidth - ( this.firstMargin + lastMargin );\n  this.target = this.x + this.firstMargin + slideWidth * this.cellAlign;\n};\n\nproto.getLastCell = function() {\n  return this.cells[ this.cells.length - 1 ];\n};\n\nproto.select = function() {\n  this.cells.forEach( ( cell ) => cell.select() );\n};\n\nproto.unselect = function() {\n  this.cells.forEach( ( cell ) => cell.unselect() );\n};\n\nproto.getCellElements = function() {\n  return this.cells.map( ( cell ) => cell.element );\n};\n\nreturn Slide;\n\n} ) );\n","/*!\n * Infinite Scroll v2.0.4\n * measure size of elements\n * MIT license\n */\n\n( function( window, factory ) {\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory();\n  } else {\n    // browser global\n    window.getSize = factory();\n  }\n\n} )( window, function factory() {\n\n// -------------------------- helpers -------------------------- //\n\n// get a number from a string, not a percentage\nfunction getStyleSize( value ) {\n  let num = parseFloat( value );\n  // not a percent like '100%', and a number\n  let isValid = value.indexOf('%') == -1 && !isNaN( num );\n  return isValid && num;\n}\n\n// -------------------------- measurements -------------------------- //\n\nlet measurements = [\n  'paddingLeft',\n  'paddingRight',\n  'paddingTop',\n  'paddingBottom',\n  'marginLeft',\n  'marginRight',\n  'marginTop',\n  'marginBottom',\n  'borderLeftWidth',\n  'borderRightWidth',\n  'borderTopWidth',\n  'borderBottomWidth',\n];\n\nlet measurementsLength = measurements.length;\n\nfunction getZeroSize() {\n  let size = {\n    width: 0,\n    height: 0,\n    innerWidth: 0,\n    innerHeight: 0,\n    outerWidth: 0,\n    outerHeight: 0,\n  };\n  measurements.forEach( ( measurement ) => {\n    size[ measurement ] = 0;\n  } );\n  return size;\n}\n\n// -------------------------- getSize -------------------------- //\n\nfunction getSize( elem ) {\n  // use querySeletor if elem is string\n  if ( typeof elem == 'string' ) elem = document.querySelector( elem );\n\n  // do not proceed on non-objects\n  let isElement = elem && typeof elem == 'object' && elem.nodeType;\n  if ( !isElement ) return;\n\n  let style = getComputedStyle( elem );\n\n  // if hidden, everything is 0\n  if ( style.display == 'none' ) return getZeroSize();\n\n  let size = {};\n  size.width = elem.offsetWidth;\n  size.height = elem.offsetHeight;\n\n  let isBorderBox = size.isBorderBox = style.boxSizing == 'border-box';\n\n  // get all measurements\n  measurements.forEach( ( measurement ) => {\n    let value = style[ measurement ];\n    let num = parseFloat( value );\n    // any 'auto', 'medium' value will be 0\n    size[ measurement ] = !isNaN( num ) ? num : 0;\n  } );\n\n  let paddingWidth = size.paddingLeft + size.paddingRight;\n  let paddingHeight = size.paddingTop + size.paddingBottom;\n  let marginWidth = size.marginLeft + size.marginRight;\n  let marginHeight = size.marginTop + size.marginBottom;\n  let borderWidth = size.borderLeftWidth + size.borderRightWidth;\n  let borderHeight = size.borderTopWidth + size.borderBottomWidth;\n\n  // overwrite width and height if we can get it from style\n  let styleWidth = getStyleSize( style.width );\n  if ( styleWidth !== false ) {\n    size.width = styleWidth +\n      // add padding and border unless it's already including it\n      ( isBorderBox ? 0 : paddingWidth + borderWidth );\n  }\n\n  let styleHeight = getStyleSize( style.height );\n  if ( styleHeight !== false ) {\n    size.height = styleHeight +\n      // add padding and border unless it's already including it\n      ( isBorderBox ? 0 : paddingHeight + borderHeight );\n  }\n\n  size.innerWidth = size.width - ( paddingWidth + borderWidth );\n  size.innerHeight = size.height - ( paddingHeight + borderHeight );\n\n  size.outerWidth = size.width + marginWidth;\n  size.outerHeight = size.height + marginHeight;\n\n  return size;\n}\n\nreturn getSize;\n\n} );\n","/*!\n * imagesLoaded v5.0.0\n * JavaScript is all like \"You images are done yet or what?\"\n * MIT License\n */\n\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory( window, require('ev-emitter') );\n  } else {\n    // browser global\n    window.imagesLoaded = factory( window, window.EvEmitter );\n  }\n\n} )( typeof window !== 'undefined' ? window : this,\n    function factory( window, EvEmitter ) {\n\nlet $ = window.jQuery;\nlet console = window.console;\n\n// -------------------------- helpers -------------------------- //\n\n// turn element or nodeList into an array\nfunction makeArray( obj ) {\n  // use object if already an array\n  if ( Array.isArray( obj ) ) return obj;\n\n  let isArrayLike = typeof obj == 'object' && typeof obj.length == 'number';\n  // convert nodeList to array\n  if ( isArrayLike ) return [ ...obj ];\n\n  // array of single index\n  return [ obj ];\n}\n\n// -------------------------- imagesLoaded -------------------------- //\n\n/**\n * @param {[Array, Element, NodeList, String]} elem\n * @param {[Object, Function]} options - if function, use as callback\n * @param {Function} onAlways - callback function\n * @returns {ImagesLoaded}\n */\nfunction ImagesLoaded( elem, options, onAlways ) {\n  // coerce ImagesLoaded() without new, to be new ImagesLoaded()\n  if ( !( this instanceof ImagesLoaded ) ) {\n    return new ImagesLoaded( elem, options, onAlways );\n  }\n  // use elem as selector string\n  let queryElem = elem;\n  if ( typeof elem == 'string' ) {\n    queryElem = document.querySelectorAll( elem );\n  }\n  // bail if bad element\n  if ( !queryElem ) {\n    console.error(`Bad element for imagesLoaded ${queryElem || elem}`);\n    return;\n  }\n\n  this.elements = makeArray( queryElem );\n  this.options = {};\n  // shift arguments if no options set\n  if ( typeof options == 'function' ) {\n    onAlways = options;\n  } else {\n    Object.assign( this.options, options );\n  }\n\n  if ( onAlways ) this.on( 'always', onAlways );\n\n  this.getImages();\n  // add jQuery Deferred object\n  if ( $ ) this.jqDeferred = new $.Deferred();\n\n  // HACK check async to allow time to bind listeners\n  setTimeout( this.check.bind( this ) );\n}\n\nImagesLoaded.prototype = Object.create( EvEmitter.prototype );\n\nImagesLoaded.prototype.getImages = function() {\n  this.images = [];\n\n  // filter & find items if we have an item selector\n  this.elements.forEach( this.addElementImages, this );\n};\n\nconst elementNodeTypes = [ 1, 9, 11 ];\n\n/**\n * @param {Node} elem\n */\nImagesLoaded.prototype.addElementImages = function( elem ) {\n  // filter siblings\n  if ( elem.nodeName === 'IMG' ) {\n    this.addImage( elem );\n  }\n  // get background image on element\n  if ( this.options.background === true ) {\n    this.addElementBackgroundImages( elem );\n  }\n\n  // find children\n  // no non-element nodes, #143\n  let { nodeType } = elem;\n  if ( !nodeType || !elementNodeTypes.includes( nodeType ) ) return;\n\n  let childImgs = elem.querySelectorAll('img');\n  // concat childElems to filterFound array\n  for ( let img of childImgs ) {\n    this.addImage( img );\n  }\n\n  // get child background images\n  if ( typeof this.options.background == 'string' ) {\n    let children = elem.querySelectorAll( this.options.background );\n    for ( let child of children ) {\n      this.addElementBackgroundImages( child );\n    }\n  }\n};\n\nconst reURL = /url\\((['\"])?(.*?)\\1\\)/gi;\n\nImagesLoaded.prototype.addElementBackgroundImages = function( elem ) {\n  let style = getComputedStyle( elem );\n  // Firefox returns null if in a hidden iframe https://bugzil.la/548397\n  if ( !style ) return;\n\n  // get url inside url(\"...\")\n  let matches = reURL.exec( style.backgroundImage );\n  while ( matches !== null ) {\n    let url = matches && matches[2];\n    if ( url ) {\n      this.addBackground( url, elem );\n    }\n    matches = reURL.exec( style.backgroundImage );\n  }\n};\n\n/**\n * @param {Image} img\n */\nImagesLoaded.prototype.addImage = function( img ) {\n  let loadingImage = new LoadingImage( img );\n  this.images.push( loadingImage );\n};\n\nImagesLoaded.prototype.addBackground = function( url, elem ) {\n  let background = new Background( url, elem );\n  this.images.push( background );\n};\n\nImagesLoaded.prototype.check = function() {\n  this.progressedCount = 0;\n  this.hasAnyBroken = false;\n  // complete if no images\n  if ( !this.images.length ) {\n    this.complete();\n    return;\n  }\n\n  /* eslint-disable-next-line func-style */\n  let onProgress = ( image, elem, message ) => {\n    // HACK - Chrome triggers event before object properties have changed. #83\n    setTimeout( () => {\n      this.progress( image, elem, message );\n    } );\n  };\n\n  this.images.forEach( function( loadingImage ) {\n    loadingImage.once( 'progress', onProgress );\n    loadingImage.check();\n  } );\n};\n\nImagesLoaded.prototype.progress = function( image, elem, message ) {\n  this.progressedCount++;\n  this.hasAnyBroken = this.hasAnyBroken || !image.isLoaded;\n  // progress event\n  this.emitEvent( 'progress', [ this, image, elem ] );\n  if ( this.jqDeferred && this.jqDeferred.notify ) {\n    this.jqDeferred.notify( this, image );\n  }\n  // check if completed\n  if ( this.progressedCount === this.images.length ) {\n    this.complete();\n  }\n\n  if ( this.options.debug && console ) {\n    console.log( `progress: ${message}`, image, elem );\n  }\n};\n\nImagesLoaded.prototype.complete = function() {\n  let eventName = this.hasAnyBroken ? 'fail' : 'done';\n  this.isComplete = true;\n  this.emitEvent( eventName, [ this ] );\n  this.emitEvent( 'always', [ this ] );\n  if ( this.jqDeferred ) {\n    let jqMethod = this.hasAnyBroken ? 'reject' : 'resolve';\n    this.jqDeferred[ jqMethod ]( this );\n  }\n};\n\n// --------------------------  -------------------------- //\n\nfunction LoadingImage( img ) {\n  this.img = img;\n}\n\nLoadingImage.prototype = Object.create( EvEmitter.prototype );\n\nLoadingImage.prototype.check = function() {\n  // If complete is true and browser supports natural sizes,\n  // try to check for image status manually.\n  let isComplete = this.getIsImageComplete();\n  if ( isComplete ) {\n    // report based on naturalWidth\n    this.confirm( this.img.naturalWidth !== 0, 'naturalWidth' );\n    return;\n  }\n\n  // If none of the checks above matched, simulate loading on detached element.\n  this.proxyImage = new Image();\n  // add crossOrigin attribute. #204\n  if ( this.img.crossOrigin ) {\n    this.proxyImage.crossOrigin = this.img.crossOrigin;\n  }\n  this.proxyImage.addEventListener( 'load', this );\n  this.proxyImage.addEventListener( 'error', this );\n  // bind to image as well for Firefox. #191\n  this.img.addEventListener( 'load', this );\n  this.img.addEventListener( 'error', this );\n  this.proxyImage.src = this.img.currentSrc || this.img.src;\n};\n\nLoadingImage.prototype.getIsImageComplete = function() {\n  // check for non-zero, non-undefined naturalWidth\n  // fixes Safari+InfiniteScroll+Masonry bug infinite-scroll#671\n  return this.img.complete && this.img.naturalWidth;\n};\n\nLoadingImage.prototype.confirm = function( isLoaded, message ) {\n  this.isLoaded = isLoaded;\n  let { parentNode } = this.img;\n  // emit progress with parent <picture> or self <img>\n  let elem = parentNode.nodeName === 'PICTURE' ? parentNode : this.img;\n  this.emitEvent( 'progress', [ this, elem, message ] );\n};\n\n// ----- events ----- //\n\n// trigger specified handler for event type\nLoadingImage.prototype.handleEvent = function( event ) {\n  let method = 'on' + event.type;\n  if ( this[ method ] ) {\n    this[ method ]( event );\n  }\n};\n\nLoadingImage.prototype.onload = function() {\n  this.confirm( true, 'onload' );\n  this.unbindEvents();\n};\n\nLoadingImage.prototype.onerror = function() {\n  this.confirm( false, 'onerror' );\n  this.unbindEvents();\n};\n\nLoadingImage.prototype.unbindEvents = function() {\n  this.proxyImage.removeEventListener( 'load', this );\n  this.proxyImage.removeEventListener( 'error', this );\n  this.img.removeEventListener( 'load', this );\n  this.img.removeEventListener( 'error', this );\n};\n\n// -------------------------- Background -------------------------- //\n\nfunction Background( url, element ) {\n  this.url = url;\n  this.element = element;\n  this.img = new Image();\n}\n\n// inherit LoadingImage prototype\nBackground.prototype = Object.create( LoadingImage.prototype );\n\nBackground.prototype.check = function() {\n  this.img.addEventListener( 'load', this );\n  this.img.addEventListener( 'error', this );\n  this.img.src = this.url;\n  // check if image is already complete\n  let isComplete = this.getIsImageComplete();\n  if ( isComplete ) {\n    this.confirm( this.img.naturalWidth !== 0, 'naturalWidth' );\n    this.unbindEvents();\n  }\n};\n\nBackground.prototype.unbindEvents = function() {\n  this.img.removeEventListener( 'load', this );\n  this.img.removeEventListener( 'error', this );\n};\n\nBackground.prototype.confirm = function( isLoaded, message ) {\n  this.isLoaded = isLoaded;\n  this.emitEvent( 'progress', [ this, this.element, message ] );\n};\n\n// -------------------------- jQuery -------------------------- //\n\nImagesLoaded.makeJQueryPlugin = function( jQuery ) {\n  jQuery = jQuery || window.jQuery;\n  if ( !jQuery ) return;\n\n  // set local variable\n  $ = jQuery;\n  // $().imagesLoaded()\n  $.fn.imagesLoaded = function( options, onAlways ) {\n    let instance = new ImagesLoaded( this, options, onAlways );\n    return instance.jqDeferred.promise( $( this ) );\n  };\n};\n// try making plugin\nImagesLoaded.makeJQueryPlugin();\n\n// --------------------------  -------------------------- //\n\nreturn ImagesLoaded;\n\n} );\n","// 'path' module extracted from Node.js v8.11.1 (only the posix part)\n// transplited with Babel\n\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nfunction assertPath(path) {\n  if (typeof path !== 'string') {\n    throw new TypeError('Path must be a string. Received ' + JSON.stringify(path));\n  }\n}\n\n// Resolves . and .. elements in a path with directory names\nfunction normalizeStringPosix(path, allowAboveRoot) {\n  var res = '';\n  var lastSegmentLength = 0;\n  var lastSlash = -1;\n  var dots = 0;\n  var code;\n  for (var i = 0; i <= path.length; ++i) {\n    if (i < path.length)\n      code = path.charCodeAt(i);\n    else if (code === 47 /*/*/)\n      break;\n    else\n      code = 47 /*/*/;\n    if (code === 47 /*/*/) {\n      if (lastSlash === i - 1 || dots === 1) {\n        // NOOP\n      } else if (lastSlash !== i - 1 && dots === 2) {\n        if (res.length < 2 || lastSegmentLength !== 2 || res.charCodeAt(res.length - 1) !== 46 /*.*/ || res.charCodeAt(res.length - 2) !== 46 /*.*/) {\n          if (res.length > 2) {\n            var lastSlashIndex = res.lastIndexOf('/');\n            if (lastSlashIndex !== res.length - 1) {\n              if (lastSlashIndex === -1) {\n                res = '';\n                lastSegmentLength = 0;\n              } else {\n                res = res.slice(0, lastSlashIndex);\n                lastSegmentLength = res.length - 1 - res.lastIndexOf('/');\n              }\n              lastSlash = i;\n              dots = 0;\n              continue;\n            }\n          } else if (res.length === 2 || res.length === 1) {\n            res = '';\n            lastSegmentLength = 0;\n            lastSlash = i;\n            dots = 0;\n            continue;\n          }\n        }\n        if (allowAboveRoot) {\n          if (res.length > 0)\n            res += '/..';\n          else\n            res = '..';\n          lastSegmentLength = 2;\n        }\n      } else {\n        if (res.length > 0)\n          res += '/' + path.slice(lastSlash + 1, i);\n        else\n          res = path.slice(lastSlash + 1, i);\n        lastSegmentLength = i - lastSlash - 1;\n      }\n      lastSlash = i;\n      dots = 0;\n    } else if (code === 46 /*.*/ && dots !== -1) {\n      ++dots;\n    } else {\n      dots = -1;\n    }\n  }\n  return res;\n}\n\nfunction _format(sep, pathObject) {\n  var dir = pathObject.dir || pathObject.root;\n  var base = pathObject.base || (pathObject.name || '') + (pathObject.ext || '');\n  if (!dir) {\n    return base;\n  }\n  if (dir === pathObject.root) {\n    return dir + base;\n  }\n  return dir + sep + base;\n}\n\nvar posix = {\n  // path.resolve([from ...], to)\n  resolve: function resolve() {\n    var resolvedPath = '';\n    var resolvedAbsolute = false;\n    var cwd;\n\n    for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {\n      var path;\n      if (i >= 0)\n        path = arguments[i];\n      else {\n        if (cwd === undefined)\n          cwd = process.cwd();\n        path = cwd;\n      }\n\n      assertPath(path);\n\n      // Skip empty entries\n      if (path.length === 0) {\n        continue;\n      }\n\n      resolvedPath = path + '/' + resolvedPath;\n      resolvedAbsolute = path.charCodeAt(0) === 47 /*/*/;\n    }\n\n    // At this point the path should be resolved to a full absolute path, but\n    // handle relative paths to be safe (might happen when process.cwd() fails)\n\n    // Normalize the path\n    resolvedPath = normalizeStringPosix(resolvedPath, !resolvedAbsolute);\n\n    if (resolvedAbsolute) {\n      if (resolvedPath.length > 0)\n        return '/' + resolvedPath;\n      else\n        return '/';\n    } else if (resolvedPath.length > 0) {\n      return resolvedPath;\n    } else {\n      return '.';\n    }\n  },\n\n  normalize: function normalize(path) {\n    assertPath(path);\n\n    if (path.length === 0) return '.';\n\n    var isAbsolute = path.charCodeAt(0) === 47 /*/*/;\n    var trailingSeparator = path.charCodeAt(path.length - 1) === 47 /*/*/;\n\n    // Normalize the path\n    path = normalizeStringPosix(path, !isAbsolute);\n\n    if (path.length === 0 && !isAbsolute) path = '.';\n    if (path.length > 0 && trailingSeparator) path += '/';\n\n    if (isAbsolute) return '/' + path;\n    return path;\n  },\n\n  isAbsolute: function isAbsolute(path) {\n    assertPath(path);\n    return path.length > 0 && path.charCodeAt(0) === 47 /*/*/;\n  },\n\n  join: function join() {\n    if (arguments.length === 0)\n      return '.';\n    var joined;\n    for (var i = 0; i < arguments.length; ++i) {\n      var arg = arguments[i];\n      assertPath(arg);\n      if (arg.length > 0) {\n        if (joined === undefined)\n          joined = arg;\n        else\n          joined += '/' + arg;\n      }\n    }\n    if (joined === undefined)\n      return '.';\n    return posix.normalize(joined);\n  },\n\n  relative: function relative(from, to) {\n    assertPath(from);\n    assertPath(to);\n\n    if (from === to) return '';\n\n    from = posix.resolve(from);\n    to = posix.resolve(to);\n\n    if (from === to) return '';\n\n    // Trim any leading backslashes\n    var fromStart = 1;\n    for (; fromStart < from.length; ++fromStart) {\n      if (from.charCodeAt(fromStart) !== 47 /*/*/)\n        break;\n    }\n    var fromEnd = from.length;\n    var fromLen = fromEnd - fromStart;\n\n    // Trim any leading backslashes\n    var toStart = 1;\n    for (; toStart < to.length; ++toStart) {\n      if (to.charCodeAt(toStart) !== 47 /*/*/)\n        break;\n    }\n    var toEnd = to.length;\n    var toLen = toEnd - toStart;\n\n    // Compare paths to find the longest common path from root\n    var length = fromLen < toLen ? fromLen : toLen;\n    var lastCommonSep = -1;\n    var i = 0;\n    for (; i <= length; ++i) {\n      if (i === length) {\n        if (toLen > length) {\n          if (to.charCodeAt(toStart + i) === 47 /*/*/) {\n            // We get here if `from` is the exact base path for `to`.\n            // For example: from='/foo/bar'; to='/foo/bar/baz'\n            return to.slice(toStart + i + 1);\n          } else if (i === 0) {\n            // We get here if `from` is the root\n            // For example: from='/'; to='/foo'\n            return to.slice(toStart + i);\n          }\n        } else if (fromLen > length) {\n          if (from.charCodeAt(fromStart + i) === 47 /*/*/) {\n            // We get here if `to` is the exact base path for `from`.\n            // For example: from='/foo/bar/baz'; to='/foo/bar'\n            lastCommonSep = i;\n          } else if (i === 0) {\n            // We get here if `to` is the root.\n            // For example: from='/foo'; to='/'\n            lastCommonSep = 0;\n          }\n        }\n        break;\n      }\n      var fromCode = from.charCodeAt(fromStart + i);\n      var toCode = to.charCodeAt(toStart + i);\n      if (fromCode !== toCode)\n        break;\n      else if (fromCode === 47 /*/*/)\n        lastCommonSep = i;\n    }\n\n    var out = '';\n    // Generate the relative path based on the path difference between `to`\n    // and `from`\n    for (i = fromStart + lastCommonSep + 1; i <= fromEnd; ++i) {\n      if (i === fromEnd || from.charCodeAt(i) === 47 /*/*/) {\n        if (out.length === 0)\n          out += '..';\n        else\n          out += '/..';\n      }\n    }\n\n    // Lastly, append the rest of the destination (`to`) path that comes after\n    // the common path parts\n    if (out.length > 0)\n      return out + to.slice(toStart + lastCommonSep);\n    else {\n      toStart += lastCommonSep;\n      if (to.charCodeAt(toStart) === 47 /*/*/)\n        ++toStart;\n      return to.slice(toStart);\n    }\n  },\n\n  _makeLong: function _makeLong(path) {\n    return path;\n  },\n\n  dirname: function dirname(path) {\n    assertPath(path);\n    if (path.length === 0) return '.';\n    var code = path.charCodeAt(0);\n    var hasRoot = code === 47 /*/*/;\n    var end = -1;\n    var matchedSlash = true;\n    for (var i = path.length - 1; i >= 1; --i) {\n      code = path.charCodeAt(i);\n      if (code === 47 /*/*/) {\n          if (!matchedSlash) {\n            end = i;\n            break;\n          }\n        } else {\n        // We saw the first non-path separator\n        matchedSlash = false;\n      }\n    }\n\n    if (end === -1) return hasRoot ? '/' : '.';\n    if (hasRoot && end === 1) return '//';\n    return path.slice(0, end);\n  },\n\n  basename: function basename(path, ext) {\n    if (ext !== undefined && typeof ext !== 'string') throw new TypeError('\"ext\" argument must be a string');\n    assertPath(path);\n\n    var start = 0;\n    var end = -1;\n    var matchedSlash = true;\n    var i;\n\n    if (ext !== undefined && ext.length > 0 && ext.length <= path.length) {\n      if (ext.length === path.length && ext === path) return '';\n      var extIdx = ext.length - 1;\n      var firstNonSlashEnd = -1;\n      for (i = path.length - 1; i >= 0; --i) {\n        var code = path.charCodeAt(i);\n        if (code === 47 /*/*/) {\n            // If we reached a path separator that was not part of a set of path\n            // separators at the end of the string, stop now\n            if (!matchedSlash) {\n              start = i + 1;\n              break;\n            }\n          } else {\n          if (firstNonSlashEnd === -1) {\n            // We saw the first non-path separator, remember this index in case\n            // we need it if the extension ends up not matching\n            matchedSlash = false;\n            firstNonSlashEnd = i + 1;\n          }\n          if (extIdx >= 0) {\n            // Try to match the explicit extension\n            if (code === ext.charCodeAt(extIdx)) {\n              if (--extIdx === -1) {\n                // We matched the extension, so mark this as the end of our path\n                // component\n                end = i;\n              }\n            } else {\n              // Extension does not match, so our result is the entire path\n              // component\n              extIdx = -1;\n              end = firstNonSlashEnd;\n            }\n          }\n        }\n      }\n\n      if (start === end) end = firstNonSlashEnd;else if (end === -1) end = path.length;\n      return path.slice(start, end);\n    } else {\n      for (i = path.length - 1; i >= 0; --i) {\n        if (path.charCodeAt(i) === 47 /*/*/) {\n            // If we reached a path separator that was not part of a set of path\n            // separators at the end of the string, stop now\n            if (!matchedSlash) {\n              start = i + 1;\n              break;\n            }\n          } else if (end === -1) {\n          // We saw the first non-path separator, mark this as the end of our\n          // path component\n          matchedSlash = false;\n          end = i + 1;\n        }\n      }\n\n      if (end === -1) return '';\n      return path.slice(start, end);\n    }\n  },\n\n  extname: function extname(path) {\n    assertPath(path);\n    var startDot = -1;\n    var startPart = 0;\n    var end = -1;\n    var matchedSlash = true;\n    // Track the state of characters (if any) we see before our first dot and\n    // after any path separator we find\n    var preDotState = 0;\n    for (var i = path.length - 1; i >= 0; --i) {\n      var code = path.charCodeAt(i);\n      if (code === 47 /*/*/) {\n          // If we reached a path separator that was not part of a set of path\n          // separators at the end of the string, stop now\n          if (!matchedSlash) {\n            startPart = i + 1;\n            break;\n          }\n          continue;\n        }\n      if (end === -1) {\n        // We saw the first non-path separator, mark this as the end of our\n        // extension\n        matchedSlash = false;\n        end = i + 1;\n      }\n      if (code === 46 /*.*/) {\n          // If this is our first dot, mark it as the start of our extension\n          if (startDot === -1)\n            startDot = i;\n          else if (preDotState !== 1)\n            preDotState = 1;\n      } else if (startDot !== -1) {\n        // We saw a non-dot and non-path separator before our dot, so we should\n        // have a good chance at having a non-empty extension\n        preDotState = -1;\n      }\n    }\n\n    if (startDot === -1 || end === -1 ||\n        // We saw a non-dot character immediately before the dot\n        preDotState === 0 ||\n        // The (right-most) trimmed path component is exactly '..'\n        preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {\n      return '';\n    }\n    return path.slice(startDot, end);\n  },\n\n  format: function format(pathObject) {\n    if (pathObject === null || typeof pathObject !== 'object') {\n      throw new TypeError('The \"pathObject\" argument must be of type Object. Received type ' + typeof pathObject);\n    }\n    return _format('/', pathObject);\n  },\n\n  parse: function parse(path) {\n    assertPath(path);\n\n    var ret = { root: '', dir: '', base: '', ext: '', name: '' };\n    if (path.length === 0) return ret;\n    var code = path.charCodeAt(0);\n    var isAbsolute = code === 47 /*/*/;\n    var start;\n    if (isAbsolute) {\n      ret.root = '/';\n      start = 1;\n    } else {\n      start = 0;\n    }\n    var startDot = -1;\n    var startPart = 0;\n    var end = -1;\n    var matchedSlash = true;\n    var i = path.length - 1;\n\n    // Track the state of characters (if any) we see before our first dot and\n    // after any path separator we find\n    var preDotState = 0;\n\n    // Get non-dir info\n    for (; i >= start; --i) {\n      code = path.charCodeAt(i);\n      if (code === 47 /*/*/) {\n          // If we reached a path separator that was not part of a set of path\n          // separators at the end of the string, stop now\n          if (!matchedSlash) {\n            startPart = i + 1;\n            break;\n          }\n          continue;\n        }\n      if (end === -1) {\n        // We saw the first non-path separator, mark this as the end of our\n        // extension\n        matchedSlash = false;\n        end = i + 1;\n      }\n      if (code === 46 /*.*/) {\n          // If this is our first dot, mark it as the start of our extension\n          if (startDot === -1) startDot = i;else if (preDotState !== 1) preDotState = 1;\n        } else if (startDot !== -1) {\n        // We saw a non-dot and non-path separator before our dot, so we should\n        // have a good chance at having a non-empty extension\n        preDotState = -1;\n      }\n    }\n\n    if (startDot === -1 || end === -1 ||\n    // We saw a non-dot character immediately before the dot\n    preDotState === 0 ||\n    // The (right-most) trimmed path component is exactly '..'\n    preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {\n      if (end !== -1) {\n        if (startPart === 0 && isAbsolute) ret.base = ret.name = path.slice(1, end);else ret.base = ret.name = path.slice(startPart, end);\n      }\n    } else {\n      if (startPart === 0 && isAbsolute) {\n        ret.name = path.slice(1, startDot);\n        ret.base = path.slice(1, end);\n      } else {\n        ret.name = path.slice(startPart, startDot);\n        ret.base = path.slice(startPart, end);\n      }\n      ret.ext = path.slice(startDot, end);\n    }\n\n    if (startPart > 0) ret.dir = path.slice(0, startPart - 1);else if (isAbsolute) ret.dir = '/';\n\n    return ret;\n  },\n\n  sep: '/',\n  delimiter: ':',\n  win32: null,\n  posix: null\n};\n\nposix.posix = posix;\n\nmodule.exports = posix;\n","export default function ({} = {}) {\n    if (!!window.LiveChatWidget) {\n        window.LiveChatWidget.call('destroy');\n    }\n    window.__lc = window.__lc || {};\n    window.__lc.license = 3513921;\n    window.__lc.asyncInit = true;\n    (function (n, t, c) {\n        function i(n) {\n            return e._h ? e._h.apply(null, n) : e._q.push(n);\n        }\n        const e = {\n            _q: [],\n            h: null,\n            _v: '2.0',\n            on: function () {\n                i(['on', c.call(arguments)]);\n            },\n            once: function () {\n                i(['once', c.call(arguments)]);\n            },\n            off: function () {\n                i(['off', c.call(arguments)]);\n            },\n            get: function () {\n                if (!e._h)\n                    throw new Error('[LiveChatWidget] You can\\'t use getters before load.');\n                return i(['get', c.call(arguments)]);\n            },\n            call: function () {\n                i(['call', c.call(arguments)]);\n            },\n            init: function () {\n                const n = t.createElement('script');\n                n.async = !0, n.type = 'text/javascript', n.src = 'https://cdn.livechatinc.com/tracking.js', t.head.appendChild(n);\n            }\n        };\n        !n.__lc.asyncInit && e.init(), n.LiveChatWidget = n.LiveChatWidget || e;\n    })(window, document, [].slice);\n    window.LiveChatWidget.call('set_customer_name', window.appConfig.user.name);\n    window.LiveChatWidget.call('set_customer_email', window.appConfig.user.email);\n    // Initialize LC_API if it doesn't exist\n    window.LC_API = window.LC_API || {\n        set_custom_variables: function () {\n            return;\n        }\n    };\n    // Original LCVariablePush function preserved with TypeScript typing\n    function LCVariablePush(response) {\n        var custom_variables = [];\n        // Push default parameters from app config if they exist\n        if (window.appConfig.LC_default_params && window.appConfig.LC_default_params.length >= 2) {\n            custom_variables.push(window.appConfig.LC_default_params[0]);\n            custom_variables.push(window.appConfig.LC_default_params[1]);\n        }\n        // Check if cart has items\n        if (!!response.results && response.results.length > 0) {\n            // OPTION TO IMPLEMENT ONCE BREAK WORKS\n            // var cart_items = '';\n            // for (var i = response.lc_cart.length - 1; i >= 0; i--) {\n            // \tcart_items += response.lc_cart[i].item + ' - ' + response.lc_cart[i].qty + '\\n';\n            // }\n            // custom_variables.push({name: 'Cart', value: cart_items})\n            // OPTION TO SET EACH LINE AS A NEW VARIABLE\n            custom_variables.push({ name: 'CART', value: ':' });\n            for (var i = response.results.length - 1; i >= 0; i--) {\n                custom_variables.push({\n                    name: response.results[i].country_variant,\n                    value: response.results[i].quantity\n                });\n            }\n        }\n        else {\n            custom_variables.push({ name: 'CART', value: 'EMPTY' });\n        }\n        // Send to LiveChat\n        if (window.LC_API && typeof window.LC_API.set_custom_variables === 'function') {\n            window.LC_API.set_custom_variables(custom_variables);\n        }\n    }\n    // Function to get cart and push to LiveChat\n    function LCPushCart(response) {\n        if (response) {\n            LCVariablePush(response);\n        }\n        else {\n            window.wwwApi.cart.getCart().then(LCVariablePush);\n        }\n    }\n    // Add the after_load event handler to synchronize cart\n    window.LC_API.on_after_load = function () {\n        LCPushCart();\n    };\n    window.LiveChatWidget.init();\n    // window.LiveChatWidget.call('hide')\n}\n","function preloadImage(url) {\n    let img = new Image();\n    img.src = url;\n}\nexport default function (initialImageUrl, initialImageTitle) {\n    return {\n        fullScreen: false,\n        hideGallery: false,\n        activeImage: {\n            url: initialImageUrl || '',\n            title: initialImageTitle || '',\n        },\n        imageLoading: false,\n        setActiveImage(url, title) {\n            if (url !== this.activeImage.url) {\n                this.imageLoading = true;\n                this.activeImage.url = url;\n                this.activeImage.title = title || url;\n                // imageLoading will be set to false when the image loads via @load event\n            }\n        },\n        imageLoaded() {\n            this.imageLoading = false;\n        },\n        thumbnailClick(event) {\n            event.preventDefault();\n            if (event.target && event.target instanceof HTMLElement) {\n                const sourceDataEl = event.target.closest('li');\n                if (sourceDataEl && sourceDataEl instanceof HTMLElement) {\n                    const sourceDataset = sourceDataEl.dataset;\n                    this.setActiveImage(sourceDataset.url || '', sourceDataset.title || '');\n                }\n            }\n        },\n        shiftActiveImage(offset) {\n            let index = this.images.findIndex((item) => item.url === this.activeImage.url);\n            if (index !== -1) {\n                index = index + offset;\n                if (index < 0) {\n                    index += this.images.length;\n                }\n                else if (index >= this.images.length) {\n                    index = 0;\n                }\n                const image = this.images[index];\n                this.setActiveImage(image.url, image.title);\n            }\n        },\n        nextImage() {\n            this.shiftActiveImage(1);\n        },\n        previousImage() {\n            this.shiftActiveImage(-1);\n        },\n        get images() {\n            const urls = [];\n            this.$root.querySelectorAll('[data-purpose=\"thumbnail\"][data-visible=\"true\"]').forEach((el) => {\n                if (el instanceof HTMLElement && el.dataset.url) {\n                    urls.push({\n                        url: el.dataset.url,\n                        thumbnail: el.dataset.thumbnail || el.dataset.url,\n                        title: el.dataset.title || el.dataset.url,\n                    });\n                }\n            });\n            return urls;\n        },\n        init() {\n            // Preload all thumbnails (keep existing code)\n            this.$root.querySelectorAll('[data-purpose=\"thumbnail\"]').forEach((el) => {\n                if (el instanceof HTMLElement && (el.dataset.thumbnail || el.dataset.url)) {\n                    preloadImage((el.dataset.thumbnail || el.dataset.url));\n                }\n            });\n            // Add event listener for variant changes with proper type casting\n            window.addEventListener('variant-image-change', ((event) => {\n                // Cast the event to our custom event type\n                const customEvent = event;\n                if (customEvent.detail && customEvent.detail.url) {\n                    this.setActiveImage(customEvent.detail.url, customEvent.detail.title || '');\n                }\n            }));\n        }\n    };\n}\n","export default function (initialActiveVariantSku) {\n    const variantSelectorDataEl = document.querySelector('#variant-selector-data');\n    const variantDataEl = document.querySelector('#variant-data');\n    if (variantDataEl && variantDataEl.textContent) {\n        let source = JSON.parse(variantDataEl.textContent);\n        window.variants = {};\n        for (const [sku, variant] of Object.entries(source)) {\n            variant.pricing.dealer_price_ex_tax = Number(variant.pricing.dealer_price_ex_tax);\n            variant.pricing.rrp_ex_tax = Number(variant.pricing.rrp_ex_tax);\n            variant.pricing.rrp_inc_tax = Number(variant.pricing.rrp_inc_tax);\n            variant.pricing.go_price_ex_tax = Number(variant.pricing.go_price_ex_tax);\n            variant.pricing.go_price_inc_tax = Number(variant.pricing.go_price_inc_tax);\n            variant.pricing.margin = Number(variant.pricing.margin);\n            variant.pricing.markup = Number(variant.pricing.markup);\n            if (variant.pricing.clearance_corner_offer) {\n                variant.pricing.clearance_corner_offer.value = Number(variant.pricing.clearance_corner_offer.value);\n            }\n            variant.thumbnail = '';\n            const thumbnailEl = document.querySelector(`[data-purpose=\"thumbnail\"][data-sku=\"${sku}\"] img`);\n            if (thumbnailEl) {\n                variant.thumbnail = thumbnailEl.getAttribute('src') || '';\n            }\n            window.variants[sku] = variant;\n        }\n    }\n    if (variantSelectorDataEl && variantSelectorDataEl.textContent) {\n        window.variantSelectors = JSON.parse(variantSelectorDataEl.textContent);\n        Object.entries(window.variantSelectors.selectors).forEach(([index, item]) => {\n            item.optionsByHash = {};\n            item.options.forEach(option => {\n                item.optionsByHash[option.hash] = option;\n            });\n        });\n    }\n    const queryString = {};\n    for (const [key, val] of (new URL(window.document.location.toString())).searchParams) {\n        if (key !== 'variant') {\n            queryString[key] = val;\n        }\n    }\n    initialActiveVariantSku = String(initialActiveVariantSku) || '';\n    // Function to build comprehensive compatibility matrix for all levels\n    function buildCompatibilityMatrix() {\n        // Create a compatibility lookup for quick reference\n        window.compatibilityMatrix = {\n            levels: {} // Maps level -> option hash -> compatible option hashes for other levels\n        };\n        // Initialize the structure for each level\n        const selectorCount = window.variantSelectors.selectors.length;\n        for (let level = 0; level < selectorCount; level++) {\n            window.compatibilityMatrix.levels[level] = {};\n            // For each option in this level\n            window.variantSelectors.selectors[level].options.forEach(option => {\n                window.compatibilityMatrix.levels[level][option.hash] = {};\n                // Create empty arrays for all other levels\n                for (let otherLevel = 0; otherLevel < selectorCount; otherLevel++) {\n                    if (otherLevel !== level) {\n                        window.compatibilityMatrix.levels[level][option.hash][otherLevel] = []; // Initialize as empty array\n                    }\n                }\n            });\n        }\n        // Fill in compatibility data based on available variants\n        for (const [sku, variant] of Object.entries(window.variants)) {\n            // For each level\n            for (let level = 0; level < selectorCount; level++) {\n                const thisLevelHash = variant.selectors[level + 1];\n                if (!thisLevelHash)\n                    continue;\n                // For each other level\n                for (let otherLevel = 0; otherLevel < selectorCount; otherLevel++) {\n                    if (otherLevel === level)\n                        continue;\n                    const otherLevelHash = variant.selectors[otherLevel + 1];\n                    if (!otherLevelHash)\n                        continue;\n                    // Add the other level's hash to this level's compatibility list if not already there\n                    const compatList = window.compatibilityMatrix.levels[level][thisLevelHash][otherLevel];\n                    if (compatList && !compatList.includes(otherLevelHash)) {\n                        compatList.push(otherLevelHash);\n                    }\n                }\n            }\n        }\n        // Debug output\n        console.log('Comprehensive Compatibility Matrix:', window.compatibilityMatrix);\n    }\n    // Build the compatibility matrix after loading variants\n    buildCompatibilityMatrix();\n    // Initialize these variables before calling enhanceOptionsWithVariantData\n    let initialSelectedOption1Hash = '', initialSelectedOption2Hash = '', initialSelectedOption3Hash = '';\n    if (window.variants[initialActiveVariantSku]) {\n        initialSelectedOption1Hash = window.variants[initialActiveVariantSku].selectors[1] || '';\n        initialSelectedOption2Hash = window.variants[initialActiveVariantSku].selectors[2] || '';\n        initialSelectedOption3Hash = window.variants[initialActiveVariantSku].selectors[3] || '';\n    }\n    let initialSelectedOption1 = { value: '', hash: '', index: 99999 }, initialSelectedOption2 = { value: '', hash: '', index: 99999 }, initialSelectedOption3 = { value: '', hash: '', index: 99999 };\n    window.variantSelectors.selectors.forEach((level, levelIndex) => {\n        level.options.forEach((option, optionIndex) => {\n            option.index = optionIndex;\n            if (levelIndex === 0) {\n                if (initialSelectedOption1Hash) {\n                    if (option.hash === initialSelectedOption1Hash) {\n                        initialSelectedOption1 = option;\n                    }\n                }\n                else if (optionIndex === 0) {\n                    // Default to first option if none selected\n                    initialSelectedOption1 = option;\n                }\n            }\n            else if (levelIndex === 1) {\n                if (initialSelectedOption2Hash) {\n                    if (option.hash === initialSelectedOption2Hash) {\n                        initialSelectedOption2 = option;\n                    }\n                }\n                else if (optionIndex === 0) {\n                    // Default to first option if none selected\n                    initialSelectedOption2 = option;\n                }\n            }\n            else if (levelIndex === 2) {\n                if (initialSelectedOption3Hash) {\n                    if (option.hash === initialSelectedOption3Hash) {\n                        initialSelectedOption3 = option;\n                    }\n                }\n                else if (optionIndex === 0) {\n                    // Default to first option if none selected\n                    initialSelectedOption3 = option;\n                }\n            }\n        });\n    });\n    // Improved determine if option is available function\n    function determineIfOptionIsAvailable(level, option) {\n        const selectedOptions = [initialSelectedOption1, initialSelectedOption2, initialSelectedOption3];\n        // Check if we have the compatibility data for this option\n        if (!window.compatibilityMatrix.levels[level] ||\n            !window.compatibilityMatrix.levels[level][option.hash]) {\n            console.warn(`No compatibility data for level ${level}, option ${option.value}`);\n            return false;\n        }\n        // For each other level, check if current selection is compatible\n        for (let otherLevel = 0; otherLevel < selectedOptions.length; otherLevel++) {\n            if (otherLevel === level)\n                continue; // Skip the current level\n            const otherOption = selectedOptions[otherLevel];\n            if (!otherOption || !otherOption.hash)\n                continue; // Skip if no selection at this level\n            // Get compatible options for the other level\n            const compatibleOptions = window.compatibilityMatrix.levels[level][option.hash][otherLevel] || [];\n            // If the other level's selected option is not compatible with this option, return false\n            if (!compatibleOptions.includes(otherOption.hash)) {\n                return false;\n            }\n        }\n        // If we get here, the option is compatible with all current selections\n        return true;\n    }\n    // Find a good representative variant for an option to display its image/price\n    function findRepresentativeVariant(level, option) {\n        // Gather all variants that use this option\n        const matchingVariants = [];\n        for (const [sku, variant] of Object.entries(window.variants)) {\n            const optionLevel = level + 1; // Convert to 1-based index for selectors\n            if (variant.selectors[optionLevel] === option.hash) {\n                matchingVariants.push(variant);\n            }\n        }\n        if (matchingVariants.length === 0) {\n            return null;\n        }\n        // If there's only one matching variant, use that\n        if (matchingVariants.length === 1) {\n            return matchingVariants[0];\n        }\n        // If there are multiple options, try to find the one that's most representative\n        const selectedOptions = [initialSelectedOption1, initialSelectedOption2, initialSelectedOption3];\n        // Try to find a variant that matches current selections at other levels\n        for (let otherLevel = 0; otherLevel < selectedOptions.length; otherLevel++) {\n            if (otherLevel === level || !selectedOptions[otherLevel] || !selectedOptions[otherLevel].hash)\n                continue;\n            const matchWithSelectedOption = matchingVariants.find(variant => variant.selectors[(otherLevel + 1)] === selectedOptions[otherLevel].hash);\n            if (matchWithSelectedOption) {\n                return matchWithSelectedOption;\n            }\n        }\n        // Otherwise just return the first matching variant\n        return matchingVariants[0];\n    }\n    // Enhanced function to update option variants and availability\n    function enhanceOptionsWithVariantData() {\n        // First, add representativeVariant to each option\n        window.variantSelectors.selectors.forEach((selector, level) => {\n            selector.options.forEach(option => {\n                option.representativeVariant = findRepresentativeVariant(level, option);\n            });\n        });\n        // Then determine availability based on current selections\n        window.variantSelectors.selectors.forEach((selector, level) => {\n            selector.options.forEach(option => {\n                option.isAvailable = determineIfOptionIsAvailable(level, option);\n            });\n        });\n        // Log availability status for debugging\n        const selectedOptions = [initialSelectedOption1, initialSelectedOption2, initialSelectedOption3];\n        console.log('Current Selections:', selectedOptions.map(opt => (opt === null || opt === void 0 ? void 0 : opt.value) || 'none'));\n        window.variantSelectors.selectors.forEach((selector, level) => {\n            console.log(`Level ${level} (${selector.name}) Availability:`);\n            selector.options.forEach(option => {\n                console.log(`  ${option.value}: ${option.isAvailable ? 'Available' : 'Unavailable'}`);\n            });\n        });\n    }\n    // Call enhanceOptionsWithVariantData after all variables are initialized\n    enhanceOptionsWithVariantData();\n    return {\n        variants: window.variants,\n        variantSelectors: window.variantSelectors,\n        showDealerPrice: false,\n        activeVariantSku: initialActiveVariantSku,\n        supersededBy: '',\n        isBuyBoxSticky: false,\n        compactView: false,\n        quantity: 1,\n        get activeVariant() {\n            if (this.activeVariantSku) {\n                return this.variants[this.activeVariantSku];\n            }\n        },\n        setActiveVariant(sku) {\n            this.activeVariantSku = sku;\n            if (sku) {\n                // Find the first thumbnail for this variant\n                const firstThumbnail = document.querySelector(`[data-purpose=\"thumbnail\"][data-sku=\"${sku}\"]`);\n                if (firstThumbnail instanceof HTMLElement) {\n                    // Get the image URL and title\n                    const imageUrl = firstThumbnail.dataset.url;\n                    const imageTitle = firstThumbnail.dataset.title;\n                    // Dispatch a custom event that both galleries can listen for\n                    if (imageUrl) {\n                        // Create a properly typed custom event\n                        const variantChangeEvent = new CustomEvent('variant-image-change', {\n                            detail: {\n                                url: imageUrl,\n                                title: imageTitle || ''\n                            }\n                        });\n                        // Dispatch the event\n                        window.dispatchEvent(variantChangeEvent);\n                    }\n                }\n                // Rest of the method remains the same\n                const path = window.location.href.split('?')[0];\n                queryString['sku'] = sku.toLowerCase();\n                const params = Object.entries(queryString).map(([k, v]) => `${k}=${encodeURIComponent(v)}`).join('&');\n                window.history.replaceState({ htmx: true }, '', `${path}?${params}`);\n            }\n        },\n        selectedOptions: {\n            0: initialSelectedOption1,\n            1: initialSelectedOption2,\n            2: initialSelectedOption3,\n        },\n        getSkuForOption(level, option) {\n            let sku = '';\n            // Safety check - don't proceed if option is not available\n            if (!option.isAvailable) {\n                console.warn(`Attempted to select unavailable option: ${option.value} at level ${level}`);\n                return '';\n            }\n            try {\n                const selectedOptions = JSON.parse(JSON.stringify(this.selectedOptions));\n                selectedOptions[level] = option;\n                if (this.variantSelectors.selectors.length === 3) {\n                    let result = this.variantSelectors.variants[selectedOptions[0].hash];\n                    if (!result)\n                        return '';\n                    result = result[selectedOptions[1].hash];\n                    if (!result)\n                        return '';\n                    sku = result[selectedOptions[2].hash];\n                }\n                else if (this.variantSelectors.selectors.length === 2) {\n                    let result = this.variantSelectors.variants[selectedOptions[0].hash];\n                    if (!result)\n                        return '';\n                    sku = result[selectedOptions[1].hash];\n                }\n                else if (this.variantSelectors.selectors.length === 1) {\n                    sku = this.variantSelectors.variants[selectedOptions[0].hash];\n                }\n            }\n            catch (error) {\n                console.error('Error getting SKU for option:', error);\n                return '';\n            }\n            return sku || '';\n        },\n        getVariantForOption(level, option) {\n            const sku = this.getSkuForOption(level, option);\n            if (sku) {\n                return window.variants[sku];\n            }\n            else {\n                return null;\n            }\n        },\n        getOptionVariant(option) {\n            // Return the pre-computed representative variant\n            return option.representativeVariant || null;\n        },\n        isOptionAvailable(option) {\n            // Return the pre-computed availability\n            return option.isAvailable === true;\n        },\n        selectOption(level, option) {\n            // Don't do anything if option is not available and not already selected\n            if (!option.isAvailable && this.selectedOptions[level] !== option) {\n                console.log(`Attempted to select unavailable option: ${option.value}`);\n                // Find a compatible option at other levels to make this option available\n                const otherLevels = [];\n                for (let i = 0; i < window.variantSelectors.selectors.length; i++) {\n                    if (i !== level)\n                        otherLevels.push(i);\n                }\n                // For each other level, find a compatible option\n                let foundCompatibleSelection = false;\n                for (const otherLevel of otherLevels) {\n                    // Get options for the other level that are compatible with this option\n                    const compatibleOptions = window.compatibilityMatrix.levels[level][option.hash][otherLevel] || [];\n                    if (compatibleOptions.length > 0) {\n                        // Select the first compatible option at the other level\n                        const compatibleOption = window.variantSelectors.selectors[otherLevel].options.find(opt => compatibleOptions.includes(opt.hash));\n                        if (compatibleOption) {\n                            console.log(`Selecting compatible option at level ${otherLevel}: ${compatibleOption.value}`);\n                            this.selectedOptions[otherLevel] = compatibleOption;\n                            foundCompatibleSelection = true;\n                            break;\n                        }\n                    }\n                }\n                if (!foundCompatibleSelection) {\n                    console.error(`Could not find compatible selections for option: ${option.value}`);\n                    return; // Don't proceed with the selection\n                }\n            }\n            if (this.selectedOptions[level] !== option) {\n                this.selectedOptions[level] = option;\n                const sku = this.getSkuForOption(level, option);\n                if (sku) {\n                    this.setActiveVariant(sku);\n                }\n                else {\n                    // Try to find a valid variant with this option\n                    let validVariant = null;\n                    for (const [variantSku, variant] of Object.entries(this.variants)) {\n                        if (variant.selectors[level + 1] === option.hash) {\n                            validVariant = variant;\n                            break;\n                        }\n                    }\n                    if (validVariant) {\n                        // Update other selections to match this variant\n                        for (let i = 0; i < window.variantSelectors.selectors.length; i++) {\n                            if (i !== level) {\n                                const hash = validVariant.selectors[(i + 1)];\n                                if (hash && window.variantSelectors.selectors[i].optionsByHash[hash]) {\n                                    this.selectedOptions[i] = window.variantSelectors.selectors[i].optionsByHash[hash];\n                                }\n                            }\n                        }\n                        this.setActiveVariant(validVariant.sku);\n                    }\n                    else {\n                        console.warn(`Could not find a valid variant with option: ${option.value}`);\n                    }\n                }\n                // Update initialSelectedOption references to match current selection\n                initialSelectedOption1 = this.selectedOptions[0];\n                initialSelectedOption2 = this.selectedOptions[1];\n                initialSelectedOption3 = this.selectedOptions[2];\n                // Re-enhance options whenever selection changes\n                enhanceOptionsWithVariantData();\n                this.quantity = 1; // Reset quantity to 1 on selection change\n            }\n        },\n        selectNextOption(level) {\n            const currentIndex = this.selectedOptions[level].index;\n            if (currentIndex !== undefined) {\n                // Find the next available option\n                let nextIndex = currentIndex + 1;\n                const options = this.variantSelectors.selectors[level].options;\n                // Wrap around to start if needed\n                if (nextIndex >= options.length) {\n                    nextIndex = 0;\n                }\n                // Select the next option\n                this.selectOption(level, options[nextIndex]);\n            }\n        },\n        selectPreviousOption(level) {\n            const currentIndex = this.selectedOptions[level].index;\n            if (currentIndex !== undefined) {\n                // Find the previous available option\n                let prevIndex = currentIndex - 1;\n                const options = this.variantSelectors.selectors[level].options;\n                // Wrap around to end if needed\n                if (prevIndex < 0) {\n                    prevIndex = options.length - 1;\n                }\n                // Select the previous option\n                this.selectOption(level, options[prevIndex]);\n            }\n        },\n        activeTab: 'overview',\n        upsellDrawerOpen: false,\n        addToCartSuccess: false,\n        //@ts-ignore\n        displayTradePrice: this.$persist(false).using(sessionStorage).as('displayProductTradePricing'),\n        formatMoney(amount) {\n            return amount.toLocaleString('en-AU', { minimumFractionDigits: 2, maximumFractionDigits: 2 });\n        },\n        incrementQuantity() {\n            this.quantity = Math.min(99, this.quantity + 1);\n        },\n        decrementQuantity() {\n            this.quantity = Math.max(1, this.quantity - 1);\n        },\n        init() {\n            this.setActiveVariant(this.activeVariantSku);\n            this.$el.addEventListener('item-added-to-cart', (event) => {\n                // this.upsellDrawerOpen = true\n            });\n        },\n    };\n}\n","export default (function (el, { modifiers, expression }, { evaluate, cleanup }) {\n    const angleThreshold = 20;\n    if (!expression) {\n        return;\n    }\n    const intendedDirection = modifiers[0] || null;\n    if (!['left', 'right', 'up', 'down', null].includes(intendedDirection)) {\n        return;\n    }\n    const pageWidth = window.innerWidth || document.body.clientWidth;\n    const minDistance = Math.max(1, Math.floor(0.01 * (pageWidth)));\n    const state = {\n        coordinates: {\n            startX: 0,\n            startY: 0,\n            endX: 0,\n            endY: 0,\n        },\n        changes: {\n            x: 0,\n            y: 0,\n        },\n    };\n    const handler = (ev) => {\n        if (ev.type === 'touchstart') {\n            ({ screenX: state.coordinates.startX, screenY: state.coordinates.startY } = ev.changedTouches[0]);\n        }\n        else if (ev.type === 'touchend') {\n            ({ screenX: state.coordinates.endX, screenY: state.coordinates.endY } = ev.changedTouches[0]);\n            state.changes.x = state.coordinates.endX - state.coordinates.startX;\n            state.changes.y = state.coordinates.endY - state.coordinates.startY;\n            const angle = Math.atan(Math.abs(state.changes.x / state.changes.y)) / Math.PI * 180;\n            // ensure the finger moved more than 1% of the screen\n            if (Math.abs(state.changes.x) > minDistance || Math.abs(state.changes.y) > minDistance) {\n                if (!intendedDirection) {\n                    evaluate(expression);\n                }\n                else {\n                    let direction;\n                    if (angle <= angleThreshold) {\n                        if (state.changes.y < 0) {\n                            direction = 'up';\n                        }\n                        else {\n                            direction = 'down';\n                        }\n                    }\n                    else if (angle >= (90 - angleThreshold)) {\n                        if (state.changes.x < 0) {\n                            direction = 'left';\n                        }\n                        else {\n                            direction = 'right';\n                        }\n                    }\n                    if (direction === intendedDirection) {\n                        evaluate(expression);\n                    }\n                }\n            }\n        }\n    };\n    el.addEventListener('touchstart', handler);\n    el.addEventListener('touchend', handler);\n    cleanup(() => {\n        el.removeEventListener('touchstart', handler);\n        el.removeEventListener('touchend', handler);\n    });\n});\n","/* globals chrome: false */\n/* globals __dirname: false */\n/* globals require: false */\n/* globals Buffer: false */\n/* globals module: false */\n/**\n * Typo is a JavaScript implementation of a spellchecker using hunspell-style\n * dictionaries.\n */\nvar Typo;\n(function () {\n    \"use strict\";\n    /**\n     * Typo constructor.\n     *\n     * @param {string} [dictionary] The locale code of the dictionary being used. e.g.,\n     *                              \"en_US\". This is only used to auto-load dictionaries.\n     * @param {string} [affData]    The data from the dictionary's .aff file. If omitted\n     *                              and Typo.js is being used in a Chrome extension, the .aff\n     *                              file will be loaded automatically from\n     *                              lib/typo/dictionaries/[dictionary]/[dictionary].aff\n     *                              In other environments, it will be loaded from\n     *                              [settings.dictionaryPath]/dictionaries/[dictionary]/[dictionary].aff\n     * @param {string} [wordsData]  The data from the dictionary's .dic file. If omitted\n     *                              and Typo.js is being used in a Chrome extension, the .dic\n     *                              file will be loaded automatically from\n     *                              lib/typo/dictionaries/[dictionary]/[dictionary].dic\n     *                              In other environments, it will be loaded from\n     *                              [settings.dictionaryPath]/dictionaries/[dictionary]/[dictionary].dic\n     * @param {Object} [settings]   Constructor settings. Available properties are:\n     *                              {string} [dictionaryPath]: path to load dictionary from in non-chrome\n     *                              environment.\n     *                              {Object} [flags]: flag information.\n     *                              {boolean} [asyncLoad]: If true, affData and wordsData will be loaded\n     *                              asynchronously.\n     *                              {Function} [loadedCallback]: Called when both affData and wordsData\n     *                              have been loaded. Only used if asyncLoad is set to true. The parameter\n     *                              is the instantiated Typo object.\n     *\n     * @returns {Typo} A Typo object.\n     */\n    Typo = function (dictionary, affData, wordsData, settings) {\n        settings = settings || {};\n        this.dictionary = null;\n        this.rules = {};\n        this.dictionaryTable = {};\n        this.compoundRules = [];\n        this.compoundRuleCodes = {};\n        this.replacementTable = [];\n        this.flags = settings.flags || {};\n        this.memoized = {};\n        this.loaded = false;\n        var self = this;\n        var path;\n        // Loop-control variables.\n        var i, j, _len, _jlen;\n        if (dictionary) {\n            self.dictionary = dictionary;\n            // If the data is preloaded, just setup the Typo object.\n            if (affData && wordsData) {\n                setup();\n            }\n            // Loading data for browser extentions.\n            else if (typeof window !== 'undefined' && ((window.chrome && window.chrome.runtime) || (window.browser && window.browser.runtime))) {\n                var runtime = window.chrome && window.chrome.runtime ? window.chrome.runtime : window.browser.runtime;\n                if (settings.dictionaryPath) {\n                    path = settings.dictionaryPath;\n                }\n                else {\n                    path = \"typo/dictionaries\";\n                }\n                if (!affData)\n                    readDataFile(runtime.getURL(path + \"/\" + dictionary + \"/\" + dictionary + \".aff\"), setAffData);\n                if (!wordsData)\n                    readDataFile(runtime.getURL(path + \"/\" + dictionary + \"/\" + dictionary + \".dic\"), setWordsData);\n            }\n            // Loading data for Node.js or other environments.\n            else {\n                if (settings.dictionaryPath) {\n                    path = settings.dictionaryPath;\n                }\n                else if (typeof __dirname !== 'undefined') {\n                    path = __dirname + '/dictionaries';\n                }\n                else {\n                    path = './dictionaries';\n                }\n                if (!affData)\n                    readDataFile(path + \"/\" + dictionary + \"/\" + dictionary + \".aff\", setAffData);\n                if (!wordsData)\n                    readDataFile(path + \"/\" + dictionary + \"/\" + dictionary + \".dic\", setWordsData);\n            }\n        }\n        function readDataFile(url, setFunc) {\n            var response = self._readFile(url, null, settings === null || settings === void 0 ? void 0 : settings.asyncLoad);\n            if (settings === null || settings === void 0 ? void 0 : settings.asyncLoad) {\n                response.then(function (data) {\n                    setFunc(data);\n                });\n            }\n            else {\n                setFunc(response);\n            }\n        }\n        function setAffData(data) {\n            affData = data;\n            if (wordsData) {\n                setup();\n            }\n        }\n        function setWordsData(data) {\n            wordsData = data;\n            if (affData) {\n                setup();\n            }\n        }\n        function setup() {\n            self.rules = self._parseAFF(affData);\n            // Save the rule codes that are used in compound rules.\n            self.compoundRuleCodes = {};\n            for (i = 0, _len = self.compoundRules.length; i < _len; i++) {\n                var rule = self.compoundRules[i];\n                for (j = 0, _jlen = rule.length; j < _jlen; j++) {\n                    self.compoundRuleCodes[rule[j]] = [];\n                }\n            }\n            // If we add this ONLYINCOMPOUND flag to self.compoundRuleCodes, then _parseDIC\n            // will do the work of saving the list of words that are compound-only.\n            if (\"ONLYINCOMPOUND\" in self.flags) {\n                self.compoundRuleCodes[self.flags.ONLYINCOMPOUND] = [];\n            }\n            self.dictionaryTable = self._parseDIC(wordsData);\n            // Get rid of any codes from the compound rule codes that are never used\n            // (or that were special regex characters).  Not especially necessary...\n            for (i in self.compoundRuleCodes) {\n                if (self.compoundRuleCodes[i].length === 0) {\n                    delete self.compoundRuleCodes[i];\n                }\n            }\n            // Build the full regular expressions for each compound rule.\n            // I have a feeling (but no confirmation yet) that this method of\n            // testing for compound words is probably slow.\n            for (i = 0, _len = self.compoundRules.length; i < _len; i++) {\n                var ruleText = self.compoundRules[i];\n                var expressionText = \"\";\n                for (j = 0, _jlen = ruleText.length; j < _jlen; j++) {\n                    var character = ruleText[j];\n                    if (character in self.compoundRuleCodes) {\n                        expressionText += \"(\" + self.compoundRuleCodes[character].join(\"|\") + \")\";\n                    }\n                    else {\n                        expressionText += character;\n                    }\n                }\n                self.compoundRules[i] = new RegExp('^' + expressionText + '$', \"i\");\n            }\n            self.loaded = true;\n            if ((settings === null || settings === void 0 ? void 0 : settings.asyncLoad) && (settings === null || settings === void 0 ? void 0 : settings.loadedCallback)) {\n                settings.loadedCallback(self);\n            }\n        }\n        return this;\n    };\n    Typo.prototype = {\n        /**\n         * Loads a Typo instance from a hash of all of the Typo properties.\n         *\n         * @param {object} obj A hash of Typo properties, probably gotten from a JSON.parse(JSON.stringify(typo_instance)).\n         */\n        load: function (obj) {\n            for (var i in obj) {\n                if (obj.hasOwnProperty(i)) {\n                    this[i] = obj[i];\n                }\n            }\n            return this;\n        },\n        /**\n         * Read the contents of a file.\n         *\n         * @param {string} path The path (relative) to the file.\n         * @param {string} [charset=\"ISO8859-1\"] The expected charset of the file\n         * @param {boolean} async If true, the file will be read asynchronously. For node.js this does nothing, all\n         *        files are read synchronously.\n         * @returns {string} The file data if async is false, otherwise a promise object. If running node.js, the data is\n         *          always returned.\n         */\n        _readFile: function (path, charset, async) {\n            var _a;\n            charset = charset || \"utf8\";\n            if (typeof XMLHttpRequest !== 'undefined') {\n                var req_1 = new XMLHttpRequest();\n                req_1.open(\"GET\", path, !!async);\n                (_a = req_1.overrideMimeType) === null || _a === void 0 ? void 0 : _a.call(req_1, \"text/plain; charset=\" + charset);\n                if (!!async) {\n                    var promise = new Promise(function (resolve, reject) {\n                        req_1.onload = function () {\n                            if (req_1.status === 200) {\n                                resolve(req_1.responseText);\n                            }\n                            else {\n                                reject(req_1.statusText);\n                            }\n                        };\n                        req_1.onerror = function () {\n                            reject(req_1.statusText);\n                        };\n                    });\n                    req_1.send(null);\n                    return promise;\n                }\n                else {\n                    req_1.send(null);\n                    return req_1.responseText;\n                }\n            }\n            else if (typeof require !== 'undefined') {\n                // Node.js\n                var fs = require(\"fs\");\n                try {\n                    if (fs.existsSync(path)) {\n                        return fs.readFileSync(path, charset);\n                    }\n                    else {\n                        console.log(\"Path \" + path + \" does not exist.\");\n                    }\n                }\n                catch (e) {\n                    console.log(e);\n                }\n                return '';\n            }\n            return '';\n        },\n        /**\n         * Parse the rules out from a .aff file.\n         *\n         * @param {string} data The contents of the affix file.\n         * @returns object The rules from the file.\n         */\n        _parseAFF: function (data) {\n            var rules = {};\n            var line, subline, numEntries, lineParts;\n            var i, j, _len, _jlen;\n            var lines = data.split(/\\r?\\n/);\n            for (i = 0, _len = lines.length; i < _len; i++) {\n                // Remove comment lines\n                line = this._removeAffixComments(lines[i]);\n                line = line.trim();\n                if (!line) {\n                    continue;\n                }\n                var definitionParts = line.split(/\\s+/);\n                var ruleType = definitionParts[0];\n                if (ruleType === \"PFX\" || ruleType === \"SFX\") {\n                    var ruleCode = definitionParts[1];\n                    var combineable = definitionParts[2];\n                    numEntries = parseInt(definitionParts[3], 10);\n                    var entries = [];\n                    for (j = i + 1, _jlen = i + 1 + numEntries; j < _jlen; j++) {\n                        subline = lines[j];\n                        lineParts = subline.split(/\\s+/);\n                        var charactersToRemove = lineParts[2];\n                        var additionParts = lineParts[3].split(\"/\");\n                        var charactersToAdd = additionParts[0];\n                        if (charactersToAdd === \"0\")\n                            charactersToAdd = \"\";\n                        var continuationClasses = this.parseRuleCodes(additionParts[1]);\n                        var regexToMatch = lineParts[4];\n                        var entry = {\n                            add: charactersToAdd\n                        };\n                        if (continuationClasses.length > 0)\n                            entry.continuationClasses = continuationClasses;\n                        if (regexToMatch !== \".\") {\n                            if (ruleType === \"SFX\") {\n                                entry.match = new RegExp(regexToMatch + \"$\");\n                            }\n                            else {\n                                entry.match = new RegExp(\"^\" + regexToMatch);\n                            }\n                        }\n                        if (charactersToRemove != \"0\") {\n                            if (ruleType === \"SFX\") {\n                                entry.remove = new RegExp(charactersToRemove + \"$\");\n                            }\n                            else {\n                                entry.remove = charactersToRemove;\n                            }\n                        }\n                        entries.push(entry);\n                    }\n                    rules[ruleCode] = { \"type\": ruleType, \"combineable\": (combineable === \"Y\"), \"entries\": entries };\n                    i += numEntries;\n                }\n                else if (ruleType === \"COMPOUNDRULE\") {\n                    numEntries = parseInt(definitionParts[1], 10);\n                    for (j = i + 1, _jlen = i + 1 + numEntries; j < _jlen; j++) {\n                        line = lines[j];\n                        lineParts = line.split(/\\s+/);\n                        this.compoundRules.push(lineParts[1]);\n                    }\n                    i += numEntries;\n                }\n                else if (ruleType === \"REP\") {\n                    lineParts = line.split(/\\s+/);\n                    if (lineParts.length === 3) {\n                        this.replacementTable.push([lineParts[1], lineParts[2]]);\n                    }\n                }\n                else {\n                    // ONLYINCOMPOUND\n                    // COMPOUNDMIN\n                    // FLAG\n                    // KEEPCASE\n                    // NEEDAFFIX\n                    this.flags[ruleType] = definitionParts[1];\n                }\n            }\n            return rules;\n        },\n        /**\n         * Removes comments.\n         *\n         * @param {string} data A line from an affix file.\n         * @return {string} The cleaned-up line.\n         */\n        _removeAffixComments: function (line) {\n            // This used to remove any string starting with '#' up to the end of the line,\n            // but some COMPOUNDRULE definitions include '#' as part of the rule.\n            // So, only remove lines that begin with a comment, optionally preceded by whitespace.\n            if (line.match(/^\\s*#/)) {\n                return '';\n            }\n            return line;\n        },\n        /**\n         * Parses the words out from the .dic file.\n         *\n         * @param {string} data The data from the dictionary file.\n         * @returns HashMap The lookup table containing all of the words and\n         *                 word forms from the dictionary.\n         */\n        _parseDIC: function (data) {\n            data = this._removeDicComments(data);\n            var lines = data.split(/\\r?\\n/);\n            var dictionaryTable = {};\n            function addWord(word, rules) {\n                // Some dictionaries will list the same word multiple times with different rule sets.\n                if (!dictionaryTable.hasOwnProperty(word)) {\n                    dictionaryTable[word] = null;\n                }\n                if (rules.length > 0) {\n                    if (dictionaryTable[word] === null) {\n                        dictionaryTable[word] = [];\n                    }\n                    dictionaryTable[word].push(rules);\n                }\n            }\n            // The first line is the number of words in the dictionary.\n            for (var i = 1, _len = lines.length; i < _len; i++) {\n                var line = lines[i];\n                if (!line) {\n                    // Ignore empty lines.\n                    continue;\n                }\n                // The line format is one of:\n                //     word\n                //     word/flags\n                //     word/flags xx:abc yy:def\n                //     word xx:abc yy:def\n                // We don't use the morphological flags (xx:abc, yy:def) and we don't want them included\n                // in the extracted flags.\n                var just_word_and_flags = line.replace(/\\s.*$/, '');\n                // just_word_and_flags is definitely one of:\n                //     word\n                //     word/flags\n                var parts = just_word_and_flags.split('/', 2);\n                var word = parts[0];\n                // Now for each affix rule, generate that form of the word.\n                if (parts.length > 1) {\n                    var ruleCodesArray = this.parseRuleCodes(parts[1]);\n                    // Save the ruleCodes for compound word situations.\n                    if (!(\"NEEDAFFIX\" in this.flags) || ruleCodesArray.indexOf(this.flags.NEEDAFFIX) === -1) {\n                        addWord(word, ruleCodesArray);\n                    }\n                    for (var j = 0, _jlen = ruleCodesArray.length; j < _jlen; j++) {\n                        var code = ruleCodesArray[j];\n                        var rule = this.rules[code];\n                        if (rule) {\n                            var newWords = this._applyRule(word, rule);\n                            for (var ii = 0, _iilen = newWords.length; ii < _iilen; ii++) {\n                                var newWord = newWords[ii];\n                                addWord(newWord, []);\n                                if (rule.combineable) {\n                                    for (var k = j + 1; k < _jlen; k++) {\n                                        var combineCode = ruleCodesArray[k];\n                                        var combineRule = this.rules[combineCode];\n                                        if (combineRule) {\n                                            if (combineRule.combineable && (rule.type != combineRule.type)) {\n                                                var otherNewWords = this._applyRule(newWord, combineRule);\n                                                for (var iii = 0, _iiilen = otherNewWords.length; iii < _iiilen; iii++) {\n                                                    var otherNewWord = otherNewWords[iii];\n                                                    addWord(otherNewWord, []);\n                                                }\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                        if (code in this.compoundRuleCodes) {\n                            this.compoundRuleCodes[code].push(word);\n                        }\n                    }\n                }\n                else {\n                    addWord(word.trim(), []);\n                }\n            }\n            return dictionaryTable;\n        },\n        /**\n         * Removes comment lines and then cleans up blank lines and trailing whitespace.\n         *\n         * @param {string} data The data from a .dic file.\n         * @return {string} The cleaned-up data.\n         */\n        _removeDicComments: function (data) {\n            // I can't find any official documentation on it, but at least the de_DE\n            // dictionary uses tab-indented lines as comments.\n            // Remove comments\n            data = data.replace(/^\\t.*$/mg, \"\");\n            return data;\n        },\n        parseRuleCodes: function (textCodes) {\n            if (!textCodes) {\n                return [];\n            }\n            else if (!(\"FLAG\" in this.flags)) {\n                // The flag symbols are single characters\n                return textCodes.split(\"\");\n            }\n            else if (this.flags.FLAG === \"long\") {\n                // The flag symbols are two characters long.\n                var flags = [];\n                for (var i = 0, _len = textCodes.length; i < _len; i += 2) {\n                    flags.push(textCodes.substr(i, 2));\n                }\n                return flags;\n            }\n            else if (this.flags.FLAG === \"num\") {\n                // The flag symbols are a CSV list of numbers.\n                return textCodes.split(\",\");\n            }\n            else if (this.flags.FLAG === \"UTF-8\") {\n                // The flags are single UTF-8 characters.\n                // @see https://github.com/cfinke/Typo.js/issues/57\n                return Array.from(textCodes);\n            }\n            else {\n                // It's possible that this fallback case will not work for all FLAG values,\n                // but I think it's more likely to work than not returning anything at all.\n                return textCodes.split(\"\");\n            }\n        },\n        /**\n         * Applies an affix rule to a word.\n         *\n         * @param {string} word The base word.\n         * @param {Object} rule The affix rule.\n         * @returns {string[]} The new words generated by the rule.\n         */\n        _applyRule: function (word, rule) {\n            var entries = rule.entries;\n            var newWords = [];\n            for (var i = 0, _len = entries.length; i < _len; i++) {\n                var entry = entries[i];\n                if (!entry.match || word.match(entry.match)) {\n                    var newWord = word;\n                    if (entry.remove) {\n                        newWord = newWord.replace(entry.remove, \"\");\n                    }\n                    if (rule.type === \"SFX\") {\n                        newWord = newWord + entry.add;\n                    }\n                    else {\n                        newWord = entry.add + newWord;\n                    }\n                    newWords.push(newWord);\n                    if (\"continuationClasses\" in entry) {\n                        for (var j = 0, _jlen = entry.continuationClasses.length; j < _jlen; j++) {\n                            var continuationRule = this.rules[entry.continuationClasses[j]];\n                            if (continuationRule) {\n                                newWords = newWords.concat(this._applyRule(newWord, continuationRule));\n                            }\n                            /*\n                            else {\n                                // This shouldn't happen, but it does, at least in the de_DE dictionary.\n                                // I think the author mistakenly supplied lower-case rule codes instead\n                                // of upper-case.\n                            }\n                            */\n                        }\n                    }\n                }\n            }\n            return newWords;\n        },\n        /**\n         * Checks whether a word or a capitalization variant exists in the current dictionary.\n         * The word is trimmed and several variations of capitalizations are checked.\n         * If you want to check a word without any changes made to it, call checkExact()\n         *\n         * @see http://blog.stevenlevithan.com/archives/faster-trim-javascript re:trimming function\n         *\n         * @param {string} aWord The word to check.\n         * @returns {boolean}\n         */\n        check: function (aWord) {\n            if (!this.loaded) {\n                throw \"Dictionary not loaded.\";\n            }\n            if (!aWord) {\n                return false;\n            }\n            // Remove leading and trailing whitespace\n            var trimmedWord = aWord.replace(/^\\s\\s*/, '').replace(/\\s\\s*$/, '');\n            if (this.checkExact(trimmedWord)) {\n                return true;\n            }\n            // The exact word is not in the dictionary.\n            if (trimmedWord.toUpperCase() === trimmedWord) {\n                // The word was supplied in all uppercase.\n                // Check for a capitalized form of the word.\n                var capitalizedWord = trimmedWord[0] + trimmedWord.substring(1).toLowerCase();\n                if (this.hasFlag(capitalizedWord, \"KEEPCASE\")) {\n                    // Capitalization variants are not allowed for this word.\n                    return false;\n                }\n                if (this.checkExact(capitalizedWord)) {\n                    // The all-caps word is a capitalized word spelled correctly.\n                    return true;\n                }\n                if (this.checkExact(trimmedWord.toLowerCase())) {\n                    // The all-caps is a lowercase word spelled correctly.\n                    return true;\n                }\n            }\n            var uncapitalizedWord = trimmedWord[0].toLowerCase() + trimmedWord.substring(1);\n            if (uncapitalizedWord !== trimmedWord) {\n                if (this.hasFlag(uncapitalizedWord, \"KEEPCASE\")) {\n                    // Capitalization variants are not allowed for this word.\n                    return false;\n                }\n                // Check for an uncapitalized form\n                if (this.checkExact(uncapitalizedWord)) {\n                    // The word is spelled correctly but with the first letter capitalized.\n                    return true;\n                }\n            }\n            return false;\n        },\n        /**\n         * Checks whether a word exists in the current dictionary.\n         *\n         * @param {string} word The word to check.\n         * @returns {boolean}\n         */\n        checkExact: function (word) {\n            if (!this.loaded) {\n                throw \"Dictionary not loaded.\";\n            }\n            var ruleCodes = this.dictionaryTable[word];\n            var i, _len;\n            if (typeof ruleCodes === 'undefined') {\n                // Check if this might be a compound word.\n                if (\"COMPOUNDMIN\" in this.flags && word.length >= this.flags.COMPOUNDMIN) {\n                    for (i = 0, _len = this.compoundRules.length; i < _len; i++) {\n                        if (word.match(this.compoundRules[i])) {\n                            return true;\n                        }\n                    }\n                }\n            }\n            else if (ruleCodes === null) {\n                // a null (but not undefined) value for an entry in the dictionary table\n                // means that the word is in the dictionary but has no flags.\n                return true;\n            }\n            else if (typeof ruleCodes === 'object') { // this.dictionary['hasOwnProperty'] will be a function.\n                for (i = 0, _len = ruleCodes.length; i < _len; i++) {\n                    if (!this.hasFlag(word, \"ONLYINCOMPOUND\", ruleCodes[i])) {\n                        return true;\n                    }\n                }\n            }\n            return false;\n        },\n        /**\n         * Looks up whether a given word is flagged with a given flag.\n         *\n         * @param {string} word The word in question.\n         * @param {string} flag The flag in question.\n         * @return {boolean}\n         */\n        hasFlag: function (word, flag, wordFlags) {\n            if (!this.loaded) {\n                throw \"Dictionary not loaded.\";\n            }\n            if (flag in this.flags) {\n                if (typeof wordFlags === 'undefined') {\n                    wordFlags = Array.prototype.concat.apply([], this.dictionaryTable[word]);\n                }\n                if (wordFlags && wordFlags.indexOf(this.flags[flag]) !== -1) {\n                    return true;\n                }\n            }\n            return false;\n        },\n        /**\n         * Returns a list of suggestions for a misspelled word.\n         *\n         * @see http://www.norvig.com/spell-correct.html for the basis of this suggestor.\n         * This suggestor is primitive, but it works.\n         *\n         * @param {string} word The misspelling.\n         * @param {number} [limit=5] The maximum number of suggestions to return.\n         * @returns {string[]} The array of suggestions.\n         */\n        alphabet: \"\",\n        suggest: function (word, limit) {\n            if (!this.loaded) {\n                throw \"Dictionary not loaded.\";\n            }\n            limit = limit || 5;\n            if (this.memoized.hasOwnProperty(word)) {\n                var memoizedLimit = this.memoized[word]['limit'];\n                // Only return the cached list if it's big enough or if there weren't enough suggestions\n                // to fill a smaller limit.\n                if (limit <= memoizedLimit || this.memoized[word]['suggestions'].length < memoizedLimit) {\n                    return this.memoized[word]['suggestions'].slice(0, limit);\n                }\n            }\n            if (this.check(word))\n                return [];\n            // Check the replacement table.\n            for (var i = 0, _len = this.replacementTable.length; i < _len; i++) {\n                var replacementEntry = this.replacementTable[i];\n                if (word.indexOf(replacementEntry[0]) !== -1) {\n                    var correctedWord = word.replace(replacementEntry[0], replacementEntry[1]);\n                    if (this.check(correctedWord)) {\n                        return [correctedWord];\n                    }\n                }\n            }\n            if (!this.alphabet) {\n                // Use the English alphabet as the default. Problematic, but backwards-compatible.\n                this.alphabet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';\n                // Any characters defined in the affix file as substitutions can go in the alphabet too.\n                // Note that dictionaries do not include the entire alphabet in the TRY flag when it's there.\n                // For example, Q is not in the default English TRY list; that's why having the default\n                // alphabet above is useful.\n                if ('TRY' in this.flags) {\n                    this.alphabet += this.flags['TRY'];\n                }\n                // Plus any additional characters specifically defined as being allowed in words.\n                if ('WORDCHARS' in this.flags) {\n                    this.alphabet += this.flags['WORDCHARS'];\n                }\n                // Remove any duplicates.\n                var alphaArray = this.alphabet.split(\"\");\n                alphaArray.sort();\n                var alphaHash = {};\n                for (var i = 0; i < alphaArray.length; i++) {\n                    alphaHash[alphaArray[i]] = true;\n                }\n                this.alphabet = '';\n                for (var i in alphaHash) {\n                    this.alphabet += i;\n                }\n            }\n            var self = this;\n            /**\n             * Returns a hash keyed by all of the strings that can be made by making a single edit to the word (or words in) `words`\n             * The value of each entry is the number of unique ways that the resulting word can be made.\n             *\n             * @arg HashMap words A hash keyed by words (all with the value `true` to make lookups very quick).\n             * @arg boolean known_only Whether this function should ignore strings that are not in the dictionary.\n             */\n            function edits1(words, known_only) {\n                var rv = {};\n                var i, j, _iilen, _len, _jlen, _edit;\n                var alphabetLength = self.alphabet.length;\n                for (var word_1 in words) {\n                    for (i = 0, _len = word_1.length + 1; i < _len; i++) {\n                        var s = [word_1.substring(0, i), word_1.substring(i)];\n                        // Remove a letter.\n                        if (s[1]) {\n                            _edit = s[0] + s[1].substring(1);\n                            if (!known_only || self.check(_edit)) {\n                                if (!(_edit in rv)) {\n                                    rv[_edit] = 1;\n                                }\n                                else {\n                                    rv[_edit] += 1;\n                                }\n                            }\n                        }\n                        // Transpose letters\n                        // Eliminate transpositions of identical letters\n                        if (s[1].length > 1 && s[1][1] !== s[1][0]) {\n                            _edit = s[0] + s[1][1] + s[1][0] + s[1].substring(2);\n                            if (!known_only || self.check(_edit)) {\n                                if (!(_edit in rv)) {\n                                    rv[_edit] = 1;\n                                }\n                                else {\n                                    rv[_edit] += 1;\n                                }\n                            }\n                        }\n                        if (s[1]) {\n                            // Replace a letter with another letter.\n                            var lettercase = (s[1].substring(0, 1).toUpperCase() === s[1].substring(0, 1)) ? 'uppercase' : 'lowercase';\n                            for (j = 0; j < alphabetLength; j++) {\n                                var replacementLetter = self.alphabet[j];\n                                // Set the case of the replacement letter to the same as the letter being replaced.\n                                if ('uppercase' === lettercase) {\n                                    replacementLetter = replacementLetter.toUpperCase();\n                                }\n                                // Eliminate replacement of a letter by itself\n                                if (replacementLetter != s[1].substring(0, 1)) {\n                                    _edit = s[0] + replacementLetter + s[1].substring(1);\n                                    if (!known_only || self.check(_edit)) {\n                                        if (!(_edit in rv)) {\n                                            rv[_edit] = 1;\n                                        }\n                                        else {\n                                            rv[_edit] += 1;\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                        if (s[1]) {\n                            // Add a letter between each letter.\n                            for (j = 0; j < alphabetLength; j++) {\n                                // If the letters on each side are capitalized, capitalize the replacement.\n                                var lettercase = (s[0].substring(-1).toUpperCase() === s[0].substring(-1) && s[1].substring(0, 1).toUpperCase() === s[1].substring(0, 1)) ? 'uppercase' : 'lowercase';\n                                var replacementLetter = self.alphabet[j];\n                                if ('uppercase' === lettercase) {\n                                    replacementLetter = replacementLetter.toUpperCase();\n                                }\n                                _edit = s[0] + replacementLetter + s[1];\n                                if (!known_only || self.check(_edit)) {\n                                    if (!(_edit in rv)) {\n                                        rv[_edit] = 1;\n                                    }\n                                    else {\n                                        rv[_edit] += 1;\n                                    }\n                                }\n                            }\n                        }\n                    }\n                }\n                return rv;\n            }\n            function correct(word) {\n                var _a;\n                // Get the edit-distance-1 and edit-distance-2 forms of this word.\n                var ed1 = edits1((_a = {}, _a[word] = true, _a));\n                var ed2 = edits1(ed1, true);\n                // Sort the edits based on how many different ways they were created.\n                var weighted_corrections = ed2;\n                for (var ed1word in ed1) {\n                    if (!self.check(ed1word)) {\n                        continue;\n                    }\n                    if (ed1word in weighted_corrections) {\n                        weighted_corrections[ed1word] += ed1[ed1word];\n                    }\n                    else {\n                        weighted_corrections[ed1word] = ed1[ed1word];\n                    }\n                }\n                var i, _len;\n                var sorted_corrections = [];\n                for (i in weighted_corrections) {\n                    if (weighted_corrections.hasOwnProperty(i)) {\n                        if (self.hasFlag(i, \"PRIORITYSUGGEST\")) {\n                            // We've defined a new affix rule called PRIORITYSUGGEST, indicating that\n                            // if this word is in the suggestions list for a misspelled word, it should\n                            // be given priority over other suggestions.\n                            //\n                            // Add a large number to its weight to push it to the top of the list.\n                            // If multiple priority suggestions are in the list, they'll still be ranked\n                            // against each other, but they'll all be above non-priority suggestions.\n                            weighted_corrections[i] += 1000;\n                        }\n                        sorted_corrections.push([i, weighted_corrections[i]]);\n                    }\n                }\n                function sorter(a, b) {\n                    var a_val = a[1];\n                    var b_val = b[1];\n                    if (a_val < b_val) {\n                        return -1;\n                    }\n                    else if (a_val > b_val) {\n                        return 1;\n                    }\n                    // @todo If a and b are equally weighted, add our own weight based on something like the key locations on this language's default keyboard.\n                    return b[0].localeCompare(a[0]);\n                }\n                sorted_corrections.sort(sorter).reverse();\n                var rv = [];\n                var capitalization_scheme = \"lowercase\";\n                if (word.toUpperCase() === word) {\n                    capitalization_scheme = \"uppercase\";\n                }\n                else if (word.substr(0, 1).toUpperCase() + word.substr(1).toLowerCase() === word) {\n                    capitalization_scheme = \"capitalized\";\n                }\n                var working_limit = limit;\n                for (i = 0; i < Math.min(working_limit, sorted_corrections.length); i++) {\n                    if (\"uppercase\" === capitalization_scheme) {\n                        sorted_corrections[i][0] = sorted_corrections[i][0].toUpperCase();\n                    }\n                    else if (\"capitalized\" === capitalization_scheme) {\n                        sorted_corrections[i][0] = sorted_corrections[i][0].substr(0, 1).toUpperCase() + sorted_corrections[i][0].substr(1);\n                    }\n                    if (!self.hasFlag(sorted_corrections[i][0], \"NOSUGGEST\") && rv.indexOf(sorted_corrections[i][0]) === -1) {\n                        rv.push(sorted_corrections[i][0]);\n                    }\n                    else {\n                        // If one of the corrections is not eligible as a suggestion , make sure we still return the right number of suggestions.\n                        working_limit++;\n                    }\n                }\n                return rv;\n            }\n            this.memoized[word] = {\n                'suggestions': correct(word),\n                'limit': limit\n            };\n            return this.memoized[word]['suggestions'];\n        }\n    };\n})();\n// Support for use as a node.js module.\nif (typeof module !== 'undefined') {\n    module.exports = Typo;\n}\n","/*!\n * Unidragger v3.0.1\n * Draggable base class\n * MIT license\n */\n\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n        window,\n        require('ev-emitter'),\n    );\n  } else {\n    // browser global\n    window.Unidragger = factory(\n        window,\n        window.EvEmitter,\n    );\n  }\n\n}( typeof window != 'undefined' ? window : this, function factory( window, EvEmitter ) {\n\nfunction Unidragger() {}\n\n// inherit EvEmitter\nlet proto = Unidragger.prototype = Object.create( EvEmitter.prototype );\n\n// ----- bind start ----- //\n\n// trigger handler methods for events\nproto.handleEvent = function( event ) {\n  let method = 'on' + event.type;\n  if ( this[ method ] ) {\n    this[ method ]( event );\n  }\n};\n\nlet startEvent, activeEvents;\nif ( 'ontouchstart' in window ) {\n  // HACK prefer Touch Events as you can preventDefault on touchstart to\n  // disable scroll in iOS & mobile Chrome metafizzy/flickity#1177\n  startEvent = 'touchstart';\n  activeEvents = [ 'touchmove', 'touchend', 'touchcancel' ];\n} else if ( window.PointerEvent ) {\n  // Pointer Events\n  startEvent = 'pointerdown';\n  activeEvents = [ 'pointermove', 'pointerup', 'pointercancel' ];\n} else {\n  // mouse events\n  startEvent = 'mousedown';\n  activeEvents = [ 'mousemove', 'mouseup' ];\n}\n\n// prototype so it can be overwriteable by Flickity\nproto.touchActionValue = 'none';\n\nproto.bindHandles = function() {\n  this._bindHandles( 'addEventListener', this.touchActionValue );\n};\n\nproto.unbindHandles = function() {\n  this._bindHandles( 'removeEventListener', '' );\n};\n\n/**\n * Add or remove start event\n * @param {String} bindMethod - addEventListener or removeEventListener\n * @param {String} touchAction - value for touch-action CSS property\n */\nproto._bindHandles = function( bindMethod, touchAction ) {\n  this.handles.forEach( ( handle ) => {\n    handle[ bindMethod ]( startEvent, this );\n    handle[ bindMethod ]( 'click', this );\n    // touch-action: none to override browser touch gestures. metafizzy/flickity#540\n    if ( window.PointerEvent ) handle.style.touchAction = touchAction;\n  } );\n};\n\nproto.bindActivePointerEvents = function() {\n  activeEvents.forEach( ( eventName ) => {\n    window.addEventListener( eventName, this );\n  } );\n};\n\nproto.unbindActivePointerEvents = function() {\n  activeEvents.forEach( ( eventName ) => {\n    window.removeEventListener( eventName, this );\n  } );\n};\n\n// ----- event handler helpers ----- //\n\n// trigger method with matching pointer\nproto.withPointer = function( methodName, event ) {\n  if ( event.pointerId === this.pointerIdentifier ) {\n    this[ methodName ]( event, event );\n  }\n};\n\n// trigger method with matching touch\nproto.withTouch = function( methodName, event ) {\n  let touch;\n  for ( let changedTouch of event.changedTouches ) {\n    if ( changedTouch.identifier === this.pointerIdentifier ) {\n      touch = changedTouch;\n    }\n  }\n  if ( touch ) this[ methodName ]( event, touch );\n};\n\n// ----- start event ----- //\n\nproto.onmousedown = function( event ) {\n  this.pointerDown( event, event );\n};\n\nproto.ontouchstart = function( event ) {\n  this.pointerDown( event, event.changedTouches[0] );\n};\n\nproto.onpointerdown = function( event ) {\n  this.pointerDown( event, event );\n};\n\n// nodes that have text fields\nconst cursorNodes = [ 'TEXTAREA', 'INPUT', 'SELECT', 'OPTION' ];\n// input types that do not have text fields\nconst clickTypes = [ 'radio', 'checkbox', 'button', 'submit', 'image', 'file' ];\n\n/**\n * any time you set `event, pointer` it refers to:\n * @param {Event} event\n * @param {Event | Touch} pointer\n */\nproto.pointerDown = function( event, pointer ) {\n  // dismiss multi-touch taps, right clicks, and clicks on text fields\n  let isCursorNode = cursorNodes.includes( event.target.nodeName );\n  let isClickType = clickTypes.includes( event.target.type );\n  let isOkayElement = !isCursorNode || isClickType;\n  let isOkay = !this.isPointerDown && !event.button && isOkayElement;\n  if ( !isOkay ) return;\n\n  this.isPointerDown = true;\n  // save pointer identifier to match up touch events\n  this.pointerIdentifier = pointer.pointerId !== undefined ?\n    // pointerId for pointer events, touch.indentifier for touch events\n    pointer.pointerId : pointer.identifier;\n  // track position for move\n  this.pointerDownPointer = {\n    pageX: pointer.pageX,\n    pageY: pointer.pageY,\n  };\n\n  this.bindActivePointerEvents();\n  this.emitEvent( 'pointerDown', [ event, pointer ] );\n};\n\n// ----- move ----- //\n\nproto.onmousemove = function( event ) {\n  this.pointerMove( event, event );\n};\n\nproto.onpointermove = function( event ) {\n  this.withPointer( 'pointerMove', event );\n};\n\nproto.ontouchmove = function( event ) {\n  this.withTouch( 'pointerMove', event );\n};\n\nproto.pointerMove = function( event, pointer ) {\n  let moveVector = {\n    x: pointer.pageX - this.pointerDownPointer.pageX,\n    y: pointer.pageY - this.pointerDownPointer.pageY,\n  };\n  this.emitEvent( 'pointerMove', [ event, pointer, moveVector ] );\n  // start drag if pointer has moved far enough to start drag\n  let isDragStarting = !this.isDragging && this.hasDragStarted( moveVector );\n  if ( isDragStarting ) this.dragStart( event, pointer );\n  if ( this.isDragging ) this.dragMove( event, pointer, moveVector );\n};\n\n// condition if pointer has moved far enough to start drag\nproto.hasDragStarted = function( moveVector ) {\n  return Math.abs( moveVector.x ) > 3 || Math.abs( moveVector.y ) > 3;\n};\n\n// ----- drag ----- //\n\nproto.dragStart = function( event, pointer ) {\n  this.isDragging = true;\n  this.isPreventingClicks = true; // set flag to prevent clicks\n  this.emitEvent( 'dragStart', [ event, pointer ] );\n};\n\nproto.dragMove = function( event, pointer, moveVector ) {\n  this.emitEvent( 'dragMove', [ event, pointer, moveVector ] );\n};\n\n// ----- end ----- //\n\nproto.onmouseup = function( event ) {\n  this.pointerUp( event, event );\n};\n\nproto.onpointerup = function( event ) {\n  this.withPointer( 'pointerUp', event );\n};\n\nproto.ontouchend = function( event ) {\n  this.withTouch( 'pointerUp', event );\n};\n\nproto.pointerUp = function( event, pointer ) {\n  this.pointerDone();\n  this.emitEvent( 'pointerUp', [ event, pointer ] );\n\n  if ( this.isDragging ) {\n    this.dragEnd( event, pointer );\n  } else {\n    // pointer didn't move enough for drag to start\n    this.staticClick( event, pointer );\n  }\n};\n\nproto.dragEnd = function( event, pointer ) {\n  this.isDragging = false; // reset flag\n  // re-enable clicking async\n  setTimeout( () => delete this.isPreventingClicks );\n\n  this.emitEvent( 'dragEnd', [ event, pointer ] );\n};\n\n// triggered on pointer up & pointer cancel\nproto.pointerDone = function() {\n  this.isPointerDown = false;\n  delete this.pointerIdentifier;\n  this.unbindActivePointerEvents();\n  this.emitEvent('pointerDone');\n};\n\n// ----- cancel ----- //\n\nproto.onpointercancel = function( event ) {\n  this.withPointer( 'pointerCancel', event );\n};\n\nproto.ontouchcancel = function( event ) {\n  this.withTouch( 'pointerCancel', event );\n};\n\nproto.pointerCancel = function( event, pointer ) {\n  this.pointerDone();\n  this.emitEvent( 'pointerCancel', [ event, pointer ] );\n};\n\n// ----- click ----- //\n\n// handle all clicks and prevent clicks when dragging\nproto.onclick = function( event ) {\n  if ( this.isPreventingClicks ) event.preventDefault();\n};\n\n// triggered after pointer down & up with no/tiny movement\nproto.staticClick = function( event, pointer ) {\n  // ignore emulated mouse up clicks\n  let isMouseup = event.type === 'mouseup';\n  if ( isMouseup && this.isIgnoringMouseUp ) return;\n\n  this.emitEvent( 'staticClick', [ event, pointer ] );\n\n  // set flag for emulated clicks 300ms after touchend\n  if ( isMouseup ) {\n    this.isIgnoringMouseUp = true;\n    // reset flag after 400ms\n    setTimeout( () => {\n      delete this.isIgnoringMouseUp;\n    }, 400 );\n  }\n};\n\n// -----  ----- //\n\nreturn Unidragger;\n\n} ) );\n","const path = require('path-browserify');\n\n/**\n * A base component that defines wrapper methods for creating requests.\n */\nclass APIComponent {\n    constructor(client) {\n        this.config = client.config;\n        this.csrfToken = client.csrfToken;\n    }\n\n    /**\n     * Generates a dictionary of headers to send with API requests.\n     * Automatically adds the CSRF token associated with the client.\n     * @param {string} contentType The desired content type.\n     */\n    createHeaders(contentType = 'application/json') {\n        var headers = {\n            \"X-CSRFToken\": this.csrfToken,\n        };\n\n        if (contentType) {\n            headers[\"Content-Type\"] = contentType\n        }\n\n        return headers;\n    }\n\n    /**\n     * Sends a request to the desired URL.\n     * @param {string|URL} url The URL to send the request to.\n     * @param {Object} data The body of the request.\n     * @param {string} method The type of method to use for the request, such as GET, POST, PUT, etc.\n     */\n    async sendRequest(url = ``, data, method = 'GET') {\n        var options = {\n            method: method,\n        };\n\n        if (data) {\n            options.headers = this.createHeaders();\n            options.body = JSON.stringify(data);\n        } else {\n            options.headers = this.createHeaders(null);\n        }\n\n        const response = await fetch(url, options);\n        return response;\n    }\n\n    /**\n     * Wraps the URL interface, allowing for a limit to be added for list endpoints.\n     * @param {string | string[]} url_string URL as a string, or URL parts as an array of strings.\n     * @param {string} origin Origin of the URL.\n     * @param {string} limit Optional limit used for list endpoints.\n     * @param {object} params Optional query parameters.\n     */\n    genURL(url_string, origin, limit = 0, params = {}) {\n        if (Array.isArray(url_string)) {\n            url_string = path.join(...url_string);\n        }\n\n        const url = new URL(url_string, origin);\n        if (limit > 0) {\n            url.searchParams.append(\"limit\", limit);\n        }\n\n        for (const [key, value] of Object.entries(params)) {\n            url.searchParams.append(key, value);\n        }\n\n        return url;\n    }\n}\n\nmodule.exports = APIComponent;\n","const APIComponent = require('./api_component');\n\n/**\n * A wrapper for the BrandGroups API endpoint of DealerNet.\n * @extends {APIComponent}\n */\nclass BrandGroupComponent extends APIComponent {\n    /**\n     * Get brand groups.\n     * @param {string} limit Optional limit for returned objects.\n     */\n    async get(limit = 0) {\n        const url = this.genURL(this.config.urls.api.v1.brandgroups, location.origin, limit);\n\n        let response = await this.sendRequest(url);\n        return response.json();\n    }\n}\n\nmodule.exports = BrandGroupComponent;\n","const APIComponent = require('./api_component');\n\n/**\n * A wrapper for the Brands API endpoint of DealerNet.\n * @extends {APIComponent}\n */\nclass BrandsComponent extends APIComponent {\n    /**\n     * Get brands.\n     * @param {string} limit Optional limit for returned objects.\n     */\n    async get(limit = 0) {\n        const url = this.genURL(this.config.urls.api.v1.brands, location.origin, limit);\n\n        let response = await this.sendRequest(url);\n        return response.json();\n    }\n    async search(query) {\n        const url = this.genURL(this.config.urls.api.v1.brands, location.origin, 0, {'name': query});\n        let response = await this.sendRequest(url);\n        return response.json();\n    }\n}\n\nmodule.exports = BrandsComponent;\n","const APIComponent = require('./api_component');\n\n/**\n * A wrapper for the Cart API endpoint of DealerNet.\n * @extends {APIComponent}\n */\nclass CartComponent extends APIComponent {\n    async getCart(limit = 0) {\n        const url = this.genURL(this.config.urls.api.v1.cart, location.origin, limit);\n\n        const response = await this.sendRequest(url);\n        return response.json();\n    }\n\n    async updateCart(pk = 0, quantity = 0) {\n        const body = {\n            quantity: quantity\n        };\n\n        const response = await this.sendRequest(this.config.urls.api.v1.cart + pk + \"/\", body, 'PUT');\n        return response;\n    }\n\n    async deleteCart(pk = 0) {\n        const response = await this.sendRequest(this.config.urls.api.v1.cart + pk + \"/\", null, 'DELETE');\n        return response;\n    }\n\n    async selectDiscount(offer = 0, choice = '') {\n        const response = await this.sendRequest(this.config.urls.api.v1.icds, {offer: offer, choice: choice});\n        return response.json();\n    }\n}\n\nmodule.exports = CartComponent;\n","const APIComponent = require('./api_component');\n\n/**\n * A wrapper for the Catalogues API endpoint of DealerNet.\n * @extends {APIComponent}\n */\nclass CatalogueComponent extends APIComponent {\n    /**\n     * Get catalogue (categories, subcategories and products).\n     * @param {string} categorySlug Optional category to use as root\n     * @param {string} brand Optional brand filter\n     * @param {number} limit Optional limit for returned objects.\n     */\n    async get(categorySlug = '', brand = null, limit = 0) {\n        const params = { brand: brand };\n        const url = this.genURL([this.config.urls.api.v1.catalogue, categorySlug], location.origin, limit, params);\n\n        const response = await this.sendRequest(url);\n        return response.json();\n    }\n\n    /**\n     * Gets the slug of a category from a catalogue page url\n     * @param {string} url \n     */\n    getSlugFromUrl(url) {\n        const u = new URL(url);\n        const path = u.pathname;\n        const cataloguePath = this.config.urls.catalogue;\n        const match = path.match(cataloguePath + '(.*)');\n        if (match) {\n            let slug = match[1];\n            if (slug.slice(-1) === '/') {\n                slug = slug.slice(0, -1);\n            }\n            return slug;\n        }\n    }\n}\n\nmodule.exports = CatalogueComponent;\n","const CartComponent = require('./cart');\nconst RecentSalesComponent = require('./recent_sales');\nconst BrandGroupsComponent = require('./brandgroups');\nconst BrandsComponent = require('./brands');\nconst CatalogueComponent = require('./catalogue');\nconst CollectionsComponent = require('./collections');\nconst DiscountsComponent = require('./discounts');\nconst FreightComponent = require('./freight');\nconst ProductsComponent = require('./products');\nconst OrdersComponent = require('./orders');\nconst ItemsComponent = require('./reboxed_items');\n\n/**\n * A wrapper for the DealerNet API.\n */\nclass Client {\n    constructor(config, csrfToken) {\n        this.config = config;\n        this.csrfToken = this.config.csrfToken;\n\n        this.cart = new CartComponent(this);\n        this.brandgroups = new BrandGroupsComponent(this);\n        this.brands = new BrandsComponent(this);\n        this.recentSales = new RecentSalesComponent(this);\n        this.catalogue = new CatalogueComponent(this);\n        this.collections = new CollectionsComponent(this);\n        this.discounts = new DiscountsComponent(this);\n        this.freight = new FreightComponent(this);\n        this.products = new ProductsComponent(this);\n        this.orders = new OrdersComponent(this);\n        this.reboxedItems = new ItemsComponent(this);\n    }\n}\n\nmodule.exports = Client;\n","const APIComponent = require('./api_component');\n\n/**\n * A wrapper for the Collections API endpoint of DealerNet.\n * @extends {APIComponent}\n */\nclass CollectionsComponent extends APIComponent {\n    /**\n     * Get collections.\n     * @param {string} limit Optional limit for returned objects.\n     */\n    async get(limit = 0) {\n        const url = this.genURL(this.config.urls.api.v1.collections, location.origin, limit);\n\n        let response = await this.sendRequest(url);\n        return response.json();\n    }\n\n    /**\n     * Get a collection and its products.\n     * @param {string} slug The slug for the collection.\n     * @param {int} page The page number for product iteration.\n     */\n    async getDetail(slug = \"\", page = 1) {\n        const url = this.genURL(this.config.urls.api.v1.collections + slug,\n                                location.origin,\n                                0,\n                        {'page': page});\n\n        let response = await this.sendRequest(url);\n        return response.json();\n    }\n}\n\nmodule.exports = CollectionsComponent;\n","const APIComponent = require('./api_component');\n\n/**\n * A wrapper for the Discounts API endpoint of DealerNet.\n * @extends {APIComponent}\n */\nclass DiscountsComponent extends APIComponent {\n    /**\n     * Get discounts (and their products).\n     * @param {string} limit Optional limit for returned objects.\n     */\n    async get(limit = 0) {\n        const url = this.genURL(this.config.urls.api.v1.discounts, location.origin, limit);\n\n        let response = await this.sendRequest(url);\n        return response.json();\n    }\n\n    /**\n     * Get a discount and its details.\n     * @param {string} slug The slug for the discount.\n     */\n    async getDetail(slug = \"\") {\n        const url = this.genURL(this.config.urls.api.v1.discounts + slug, location.origin);\n\n        let response = await this.sendRequest(url);\n        return response.json();\n    }\n}\n\nmodule.exports = DiscountsComponent;\n","const APIComponent = require('./api_component');\n\n/**\n * A wrapper for the Freight API endpoint of DealerNet.\n * @extends {APIComponent}\n */\nclass FreightComponent extends APIComponent {\n  /**\n   * Get a freight estimate\n   * @param {string} suburbUUID The uuid of the suburb\n   * @param {boolean} dropship Whether to use dropship rates\n   */\n  async estimate(suburbUUID = '', dropship = true, weight=null) {\n    const url = this.genURL(this.config.urls.api.v1['freight/estimate'], location.origin, 0, { suburb: suburbUUID, dropship, weight });\n\n    const response = await this.sendRequest(url);\n    return response.json();\n  }\n\n  async suburbs(query = '', country = undefined) {\n    if (!country) {\n      country = this.config.localStore.countryCode.toUpperCase();\n    }\n    const url = this.genURL(this.config.urls.api.v1['freight/suburbs'], location.origin, 0, { query, country });\n\n    const response = await this.sendRequest(url);\n    return response.json();\n  }\n}\n\nmodule.exports = FreightComponent;\n","module.exports = {\n    Client: require('./client')\n};\n","const APIComponent = require('./api_component');\n\n/**\n * A wrapper for the Products API endpoint of DealerNet.\n * @extends {APIComponent}\n */\nclass OrdersComponent extends APIComponent {\n    /**\n     * Get all products.\n     * @param {string} limit Optional limit for returned objects.\n     */\n    async get(limit = 0) {\n        const url = this.genURL(this.config.urls.api.v1.orders, location.origin, limit);\n\n        let response = await this.sendRequest(url);\n        return response.json();\n    }\n\n    /**\n     * Get a product and its details.\n     * @param {string} slug The slug for the product.\n     * @param {boolean} offers Enables returning offers for the product.\n     */\n    async getDetail(uuid = \"\", offers = false) {\n        const url = this.genURL(this.config.urls.api.v1.orders + uuid, location.origin, 0);\n\n        let response = await this.sendRequest(url);\n        return response.json();\n    }\n\n    /**\n     * Get current order\n     * @returns {Promise<Order>}\n     */\n    async getCurrent() {\n        const url = this.genURL([this.config.urls.api.v1.orders, 'current'], location.origin, 0);\n\n        let response = await this.sendRequest(url);\n        return response.json();\n    }\n\n    async overrideOffers(uuid = \"\", lineItems = []) {\n        const url = this.genURL(this.config.urls.api.v1.orders + uuid + '/override_offers/', location.origin, 0);\n\n        let response = await this.sendRequest(url, lineItems, 'POST');\n        return response.json();\n    }\n\n    async setFreightCharge(uuid = \"\", amount) {\n        amount = Number(amount).toFixed(2);\n        const url = this.genURL(this.config.urls.api.v1.orders + uuid + '/', location.origin, 0);\n\n        let response = await this.sendRequest(url, {\"freight_charge\": amount}, 'PATCH');\n        return response.json();\n    }\n\n    async splitLine(uuid = \"\", lineId, newLineQuantity) {\n        const url = this.genURL(this.config.urls.api.v1.orders + uuid + '/split_line/', location.origin, 0);\n\n        let response = await this.sendRequest(\n            url,\n            {\n                line_id: lineId,\n                new_line_quantity: newLineQuantity,\n            },\n            'POST');\n        return response.json();\n    }\n\n    async resetFreightCharge(uuid = \"\") {\n        const url = this.genURL(this.config.urls.api.v1.orders + uuid + '/reset_freight_charge/', location.origin, 0);\n\n        let response = await this.sendRequest(\n            url,\n            {},\n            'POST');\n        return response.json();\n    }\n}\n\nmodule.exports = OrdersComponent;\n","const APIComponent = require('./api_component');\n\n/**\n * A wrapper for the Products API endpoint of DealerNet.\n * @extends {APIComponent}\n */\nclass ProductsComponent extends APIComponent {\n    /**\n     * Get all products.\n     * @param {string} limit Optional limit for returned objects.\n     */\n    async get(limit = 0, categorySlug = null) {\n        const params = { category: categorySlug };\n        const url = this.genURL(this.config.urls.api.v1.discounts, location.origin, limit, params);\n\n        let response = await this.sendRequest(url);\n        return response.json();\n    }\n\n    /**\n     * Get a product and its details.\n     * @param {string} slug The slug for the product.\n     * @param {boolean} offers Enables returning offers for the product.\n     */\n    async getDetail(slug = \"\", offers = false) {\n        const url = this.genURL(this.config.urls.api.v1.products + slug, location.origin, 0, {'offers': offers});\n\n        let response = await this.sendRequest(url);\n        return response.json();\n    }\n    async getOrdersForProduct(slug = \"\",) {\n        const url = this.genURL(this.config.urls.api.v1.products + slug + '/orders/', location.origin, 0);\n\n        let response = await this.sendRequest(url);\n        return response.json();\n    }\n    async search(query) {\n        const url = this.genURL(this.config.urls.api.v1.products, location.origin, 0, {'search': query});\n        let response = await this.sendRequest(url);\n        return response.json();\n    }\n}\n\nmodule.exports = ProductsComponent;\n","const APIComponent = require('./api_component');\n\n/**\n * A wrapper for the Products API endpoint of DealerNet.\n * @extends {APIComponent}\n */\nclass ItemsComponent extends APIComponent {\n    /**\n     * Get all products.\n     * @param {string} limit Optional limit for returned objects.\n     */\n    async get(limit = 0) {\n        const url = this.genURL(this.config.urls.api.v1['reboxed/items'], location.origin, limit);\n\n        let response = await this.sendRequest(url);\n        return response.json();\n    }\n\n    async getForProduct(slug=\"\", limit = 0) {\n        const url = this.genURL(this.config.urls.api.v1['reboxed/items'] + '?product=' + slug, location.origin, limit);\n\n        let response = await this.sendRequest(url);\n        return response.json();\n    }\n\n    /**\n     * Get a reboxed item and its details.\n     * @param {string} uuid The UUID for the item.\n     */\n    async getDetail(uuid = \"\") {\n        const url = this.genURL(this.config.urls.api.v1['reboxed/items'] + uuid, location.origin, 0);\n\n        let response = await this.sendRequest(url);\n        return response.json();\n    }\n\n}\n\nmodule.exports = ItemsComponent;\n","const APIComponent = require('./api_component');\n\n/**\n * A wrapper for the Recent Sales API endpoint of DealerNet.\n * @extends {APIComponent}\n */\nclass RecentSalesComponent extends APIComponent {\n    async getRecentSales() {\n        const response = await this.sendRequest(this.config.urls.recent_sales);\n        if (response.status === 200) {\n            return response.json();\n        } else {\n            return {\n                recent_sales: []\n            }\n        }\n    }\n}\n\nmodule.exports = RecentSalesComponent;\n","import { httpJson, httpURLEncoded, httpForm, reorder } from './productFormUtils.js';\n\nconst productFormFilesManager = (initialData = {}) => ({\n\n    \n    // File upload properties\n    uploadQueue: [],\n    selectedFiles: [],\n    bulkCategory: '',\n    bulkAssignment: '',\n    showAIModalFlag: false,\n    aiSelectedFile: null,\n    aiAction: '',\n    isDragOver: false,\n    isProcessing: false,\n    aiProcessing: false,\n    aiSelectedSchema: '',\n    aiContext: '',\n    aiProductName: '',\n\n    urlInput: '',\n    urlType: 'content', // 'content' or 'asset'\n    isProcessingUrl: false,\n    urlProcessingStatus: null,\n\n    \n    // Product page assets properties\n    draggedFile: null,\n    dragOverZone: null,\n    draggedProductAssetIndex: null,\n    draggedContentLibraryIndex: null,\n    galleryDragOverIndex: null,\n    resourceDragOverIndex: null,\n    draggedAssetZone: null,\n\n    get files() {\n        return this.$store.product.getUploadedFiles;\n    },\n    \n    // Computed properties for product page files\n    get galleryFiles() {\n        return this.$store.product.getUploadedFiles\n        .filter(f => f.on_product_page && f.product_page_type === 'gallery')\n        .sort((a, b) => (a.product_page_rank || 0) - (b.product_page_rank || 0));\n    },\n\n    get resourceFiles() {\n        return this.$store.product.getUploadedFiles\n        .filter(f => f.on_product_page && f.product_page_type === 'resource')\n        .sort((a, b) => (a.product_page_rank || 0) - (b.product_page_rank || 0));\n    },\n\n    fileUpdateUrl(id) {\n        const pat = this.$store.product.getRoutes.fileUpdatePattern;\n        return pat ? pat.replace('/0/', `/${id}/`) \n                    : `${this.$store.product.getRoutes.files}${id}/update/`;      // fallback\n    },\n    fileDeleteUrl(id) {\n        const pat = this.$store.product.getRoutes.fileDeletePattern;\n        return pat ? pat.replace('/0/', `/${id}/`)\n                : `${this.$store.product.getRoutes.files}${id}/delete/`;      // fallback\n    },\n    fileAIUrl(id) {\n        const pat = this.$store.product.getRoutes.fileAIProcessPattern;\n        return pat ? pat.replace('/0/', `/${id}/`)\n                : `${this.$store.product.getRoutes.files}${id}/ai-process/`;  // fallback\n    },\n    schemaStructureUrl(slug) {\n        const pat = this.$store.product.getRoutes.specsSchemaStructurePattern;\n        return pat ? pat.replace('__SLUG__', slug)\n                : `${this.$store.product.getRoutes.specsSchema}${slug}/structure/`; // fallback\n    },\n\n    // Initialize component\n    init() {\n\n        // Load existing files on init\n        httpJson(this.$store.product.getRoutes.fileList)\n        .then(data => {\n            this.$store.product.setUploadedFiles = data?.files || [];\n        })\n        .catch(err => {\n            console.error('Failed to load files:', err);\n            this.$store.product.toastError(`Failed to load files: ${err.message || 'Unknown error'}`);\n        });\n\n        // Register crop modal store so the modal div can be anywhere in the DOM\n        const self = this;\n        Alpine.store('cropModal', {\n            file: null,\n            close() { self.closeCropModal(); },\n            save() { self.saveCrop(); },\n            clear(file) { self.clearCrop(file); },\n        });\n    },\n\n    // Content Library file reordering\n    startContentLibraryDrag(index, event) {\n        this.draggedContentLibraryIndex = index;\n        event.dataTransfer.effectAllowed = 'move';\n    },\n\n    allowContentLibraryDrop(event, targetIndex) {\n        if (this.draggedContentLibraryIndex !== null && this.draggedContentLibraryIndex !== targetIndex) {\n            event.preventDefault();\n        }\n    },\n\n    dropContentLibraryFile(event, targetIndex) {\n        event.preventDefault();\n\n        if (\n            this.draggedContentLibraryIndex === null ||\n            this.draggedContentLibraryIndex === targetIndex\n        ) {\n            this.draggedContentLibraryIndex = null;\n            return;\n        }\n\n        const next = reorder(this.$store.product.getUploadedFiles, this.draggedContentLibraryIndex, targetIndex);\n        this.$store.product.setUploadedFiles = next;\n\n        this.draggedContentLibraryIndex = null;\n\n        // Note: We don't auto-save here, user needs to click 'Save Order'\n    },\n\n\n    async reorderContentLibraryFiles() {\n        try {\n            const files = this.$store.product.getUploadedFiles;\n\n            const payload = {\n            files: files.map((file, index) => ({\n                file_id: file.id,\n                rank: index + 1,\n            })),\n            context: { product_id: this.$store.product.getProductPk },\n            };\n\n            await httpJson(this.$store.product.getRoutes.fileReorder, {\n            method: 'POST',\n            body: payload,\n            });\n\n            files.forEach((file, index) => {\n            this.$store.product.patchFile(file.id, { content_library_rank: index + 1 });\n            });\n\n            this.$store.product.toastSuccess('Content library order saved successfully!');\n        } catch (err) {\n            console.error('Failed to save order:', err);\n            this.$store.product.toastError(`Failed to save order: ${err?.message || 'Unknown error'}`);\n        }\n    },\n\n    // File upload methods\n    handleDrop(e) {\n        this.isDragOver = false;\n        const files = Array.from(e.dataTransfer.files);\n        this.processFiles(files);\n    },\n    \n    handleFileSelect(e) {\n        const files = Array.from(e.target.files);\n        this.processFiles(files);\n        e.target.value = ''; // Clear input for reselection\n    },\n    \n    processFiles(files) {\n        files.forEach(file => {\n            const fileId = Date.now() + Math.random();\n            const fileObj = {\n                id: fileId,\n                name: file.name,\n                size: file.size,\n                type: file.type,\n                status: 'queued',\n                category: '',\n                assignment: '',\n                preview: null,\n                file: file,\n                error: null\n            };\n            \n            // Create preview for images immediately\n            if (file.type.startsWith('image/')) {\n                const reader = new FileReader();\n                reader.onload = (e) => {\n                    fileObj.preview = e.target.result;\n                };\n                reader.readAsDataURL(file);\n            }\n            \n            // Add to upload queue\n            this.uploadQueue.push(fileObj);\n        });\n        \n        // Start processing queue if not already processing\n        if (!this.isProcessing) {\n            this.processUploadQueue();\n        }\n    },\n\n    async processUploadQueue() {\n        if (this.uploadQueue.length === 0) {\n            this.isProcessing = false;\n            return;\n        }\n        \n        this.isProcessing = true;\n        const fileObj = this.uploadQueue[0]; // Get first file\n        fileObj.status = 'uploading';\n        \n        await this.uploadSingleFile(fileObj);\n        \n        // Remove from queue\n        this.uploadQueue.shift();\n        \n        // Process next file with small delay\n        setTimeout(() => this.processUploadQueue(), 500);\n    },\n\n    async uploadSingleFile(fileObj) {\n        const formData = new FormData();\n        formData.append('file', fileObj.file);\n\n        try {\n            const url = this.$store.product.getRoutes.fileUploadProduct;\n\n            // throws on non-2xx with a useful err.message\n            const data = await httpForm(url, formData);\n\n            if (data?.error) {\n                fileObj.status = 'error';\n                fileObj.error = data.error;\n                this.$store.product.toastError(data.error);\n                return;\n            }\n\n            // Mark queue item as done\n            fileObj.status = 'completed';\n            if (data.id != null) fileObj.id = data.id;\n            if (data.url != null) fileObj.url = data.url;\n            if (data.type != null) fileObj.type = data.type;\n\n            // Map server payload to our canonical file record, with safe fallbacks\n            const fileRecord = {\n                id: data.id ?? fileObj.id,\n                name: data.name ?? fileObj.name ?? fileObj.file?.name ?? '',\n                url: data.url ?? fileObj.url ?? '',\n                type: data.type ?? fileObj.type ?? '',\n                category: data.category ?? '',\n                assignment: data.assignment ?? '',\n                content_library_rank: data.content_library_rank ?? 0,\n                on_product_page: false,\n                product_page_type: null,\n                product_page_rank: null,\n                product_page_file_id: null,\n            };\n\n            // Add/update in the single source of truth\n            this.$store.product.addOrUpdateFile(fileRecord);\n\n            this.$store.product.toastSuccess('File uploaded');\n        } catch (err) {\n            fileObj.status = 'error';\n            fileObj.error = err?.message || 'Upload failed';\n            this.$store.product.toastError(`Upload failed: ${fileObj.error}`);\n        }\n    },\n    \n    retryUpload(file) {\n        file.status = 'queued';\n        file.error = null;\n        if (!this.isProcessing) {\n            this.processUploadQueue();\n        }\n    },\n\n    async uploadFromURL() {\n        const url = (this.urlInput || '').trim();\n        if (!url) {\n            this.$store.product.toastError('Please enter a URL');\n            return;\n        }\n        \n        if (!this.isValidURL(url)) {\n            this.$store.product.toastError('Please enter a valid URL');\n            return;\n        }\n        \n        this.isProcessingUrl = true;\n        this.urlProcessingStatus = {\n            type: 'info',\n            message: `${this.urlType === 'content' ? 'Exporting HTML and downloading' : 'Downloading file'}...`\n        };\n        \n        try {\n            const formData = new FormData();\n            formData.append('url', url);\n            formData.append('url_type', this.urlType);\n            \n            // Use your existing upload endpoint\n            const data = await httpForm(this.$store.product.getRoutes.fileUploadProduct, formData);\n            \n            if (data?.error) {\n                throw new Error(data.error);\n            }\n            \n            // Create file record same as regular upload\n            const fileRecord = {\n                id: data.id ?? Date.now(),\n                name: data.name ?? this.getFilenameFromURL(url),\n                url: data.url ?? '',\n                type: data.type ?? '',\n                category: data.category ?? '',\n                assignment: data.assignment ?? '',\n                content_library_rank: data.content_library_rank ?? 0,\n                on_product_page: false,\n                product_page_type: null,\n                product_page_rank: null,\n                product_page_file_id: null,\n                is_content_url: data.is_content_url || false,\n            };\n            \n            // Add to store\n            this.$store.product.addOrUpdateFile(fileRecord);\n            \n            // Success feedback\n            this.urlProcessingStatus = {\n                type: 'success',\n                message: `Successfully ${this.urlType === 'content' ? 'converted webpage' : 'downloaded file'}: ${fileRecord.name}`\n            };\n            \n            // Clear input\n            this.urlInput = '';\n            \n            // Hide status after delay\n            setTimeout(() => {\n                this.urlProcessingStatus = null;\n            }, 3000);\n            \n            this.$store.product.toastSuccess(\n                `URL ${this.urlType === 'content' ? 'converted to PDF' : 'downloaded'} successfully`\n            );\n            \n        } catch (err) {\n            console.error('URL processing failed:', err);\n            this.urlProcessingStatus = {\n                type: 'error',\n                message: `Failed: ${err?.message || 'Unknown error'}`\n            };\n            \n            this.$store.product.toastError(`URL processing failed: ${err?.message || 'Unknown error'}`);\n        } finally {\n            this.isProcessingUrl = false;\n        }\n    },\n\n    isValidURL(string) {\n        try {\n            new URL(string);\n            return true;\n        } catch (_) {\n            return false;\n        }\n    },\n\n    getFilenameFromURL(url) {\n        try {\n            const parsed = new URL(url);\n            const pathname = parsed.pathname;\n            const filename = pathname.split('/').pop();\n            \n            if (filename && filename.includes('.')) {\n                return filename;\n            }\n            \n            // Generate filename from domain for content URLs\n            const domain = parsed.hostname.replace('www.', '');\n            return `${domain}_page.pdf`;\n        } catch {\n            return 'url_content.pdf';\n        }\n    },\n\n    // File management methods\n    async updateFileCategory(file) {\n        try {\n            const data = await httpURLEncoded(this.fileUpdateUrl(file.id), {\n                category: file.category\n            });\n\n            if (data?.error) {\n                console.error('Failed to update category:', data.error);\n                this.$store.product.toastError(data.error);\n                return;\n            }\n\n            // reflect in store (don’t mutate the arg in-place)\n            this.$store.product.patchFile(file.id, { category: file.category });\n        } catch (err) {\n            console.error('Error updating category:', err);\n            this.$store.product.toastError(`Error updating category: ${err?.message || 'Unknown error'}`);\n        }\n    },\n\n    async updateFileAssignment(file) {\n        try {\n            const data = await httpURLEncoded(this.fileUpdateUrl(file.id), {\n                assignment: file.assignment\n            });\n\n            if (data?.error) {\n                console.error('Failed to update assignment:', data.error);\n                this.$store.product.toastError(data.error);\n                return;\n            }\n\n            this.$store.product.patchFile(file.id, { assignment: file.assignment });\n        } catch (err) {\n            console.error('Error updating assignment:', err);\n            this.$store.product.toastError(`Error updating assignment: ${err?.message || 'Unknown error'}`);\n        }\n    },\n\n    async updateFileName(file, newName) {\n        try {\n            const data = await httpURLEncoded(this.fileUpdateUrl(file.id), {\n                name: newName\n            });\n\n            if (data?.status === 'success') {\n                this.$store.product.patchFile(file.id, { name: newName });\n            } else {\n                const msg = data?.error || 'Failed to update name';\n                console.error('Failed to update name:', msg);\n                this.$store.product.toastError(msg);\n            }\n        } catch (err) {\n            console.error('Error updating name:', err);\n            this.$store.product.toastError(`Error updating name: ${err?.message || 'Unknown error'}`);\n        }\n    },\n\n    async deleteFile(file) {\n        if (!confirm(`Delete ${file.name}?`)) return;\n\n        try {\n            const data = await httpJson(this.fileDeleteUrl(file.id), { method: 'DELETE' });\n\n            if (data?.error) {\n                console.error('Failed to delete file:', data.error);\n                this.$store.product.toastError(data.error);\n                return;\n            }\n\n            this.$store.product.removeFileById(file.id);\n            this.$store.product.toastSuccess('File deleted successfully');\n        } catch (err) {\n            console.error('Error deleting file:', err);\n            this.$store.product.toastError(`Error deleting file: ${err?.message || 'Unknown error'}`);\n        }\n    },\n\n    // Product page drag and drop methods\n    startProductPageDrag(file, event) {\n        // Only allow drag if file has category and assignment\n        if (!file.category || !file.assignment) {\n            event.preventDefault();\n            return false;\n        }\n        \n        this.draggedFile = file;\n        event.dataTransfer.effectAllowed = 'copy';\n    },\n\n    async addToProductPage(file) {\n        if (!file.category || !file.assignment) {\n            this.$store.product.toastError('Please set category and assignment first');\n            return;\n        }\n\n        // Decide zone by type\n        const zone = file.type === 'image' ? 'gallery' : 'resource';\n\n        if (file.on_product_page) {\n            this.$store.product.toastError('File is already assigned to product page');\n            return;\n        }\n\n        try {\n            const data = await httpJson(this.$store.product.getRoutes.assetsAdd, {\n                method: 'POST',\n                body: { file_id: file.id, zone }\n            });\n\n            // Prefer canonical server response if available\n            if (data?.file) {\n                this.$store.product.addOrUpdateFile(data.file);\n            } else if (data?.asset) {\n            this.$store.product.patchFile(file.id, {\n                on_product_page: true,\n                product_page_type: zone,\n                product_page_rank: data.asset.rank,\n                product_page_file_id: data.asset.product_page_file_id,\n            });\n            } else {\n            // Fallback if server returns no structured payload\n            this.$store.product.patchFile(file.id, {\n                on_product_page: true,\n                product_page_type: zone,\n            });\n            }\n\n            this.$store.product.toastSuccess(`File added to ${zone}`);\n        } catch (err) {\n            console.error('Failed to add asset:', err);\n            this.$store.product.toastError(`Failed to add asset: ${err?.message || 'Unknown error'}`);\n        }\n    },\n\n    async removeFromProductPage(file) {\n        if (!confirm(`Remove ${file.name} from product page?`)) return;\n\n        try {\n            // POST and let the helper throw with a meaningful message on non-2xx\n            await httpURLEncoded(this.$store.product.getRoutes.assetsRemove, { file_id: file.id });\n\n            // Reflect state via the store (don’t mutate the passed object directly)\n            this.$store.product.patchFile(file.id, {\n            on_product_page: false,\n            product_page_type: null,\n            product_page_rank: null,\n            product_page_file_id: null,\n            });\n\n            this.$store.product.toastSuccess('File removed from product page');\n        } catch (err) {\n            console.error('Failed to remove file:', err);\n            this.$store.product.toastError(`Failed to remove file: ${err?.message || 'Unknown error'}`);\n        }\n    },\n\n    // Product page asset reordering\n    startProductAssetDrag(asset, index, event, zone) {\n        this.draggedProductAssetIndex = index;\n        this.draggedAssetZone = zone;\n        event.dataTransfer.effectAllowed = 'move';\n    },\n\n    allowProductAssetDrop(event, targetIndex, zone) {\n        if (this.draggedProductAssetIndex !== null && \n            this.draggedAssetZone === zone && \n            this.draggedProductAssetIndex !== targetIndex) {\n            event.preventDefault();\n            \n            // Set the hover index\n            if (zone === 'gallery') {\n                this.galleryDragOverIndex = targetIndex;\n            } else {\n                this.resourceDragOverIndex = targetIndex;\n            }\n        }\n    },\n\n    clearDragOverIndex(zone) {\n        if (zone === 'gallery') {\n            this.galleryDragOverIndex = null;\n        } else {\n            this.resourceDragOverIndex = null;\n        }\n    },\n\n    async dropProductAsset(event, targetIndex, zone) {\n        event.preventDefault();\n\n        // Clear drag-over indicators\n        this.clearDragOverIndex(zone);\n\n        // Guard: must be dragging within same zone and to a different index\n        if (\n            this.draggedProductAssetIndex === null ||\n            this.draggedAssetZone !== zone ||\n            this.draggedProductAssetIndex === targetIndex\n        ) {\n            this.draggedProductAssetIndex = null;\n            this.draggedAssetZone = null;\n            return;\n        }\n\n        // Source list (read-only view)\n        const sourceList = zone === 'gallery' ? this.galleryFiles : this.resourceFiles;\n\n        // Reorder locally using util (bounds handled inside `reorder`)\n        const next = reorder(sourceList, this.draggedProductAssetIndex, targetIndex);\n\n        // Build rank updates for server\n        const updates = next.map((asset, index) => ({\n            file_id: asset.id,          // ContentLibraryFile ID\n            rank: index + 1,\n            // If your API needs zone explicitly, uncomment:\n            // zone,\n        }));\n\n        try {\n            await httpJson(this.$store.product.getRoutes.assetsReorder, {\n            method: 'POST',\n            body: { assets: updates },\n            });\n\n            // Reflect ranks in the store (canonical)\n            next.forEach((asset, index) => {\n            this.$store.product.patchFile(asset.id, { product_page_rank: index + 1 });\n            });\n\n            this.$store.product.toastSuccess('Product page order updated');\n        } catch (err) {\n            console.error('Failed to reorder assets:', err);\n            this.$store.product.toastError(`Failed to reorder assets: ${err?.message || 'Unknown error'}`);\n            // Revert on error (your existing behavior)\n            location.reload();\n        } finally {\n            this.draggedProductAssetIndex = null;\n            this.draggedAssetZone = null;\n        }\n    },\n\n    allowDrop(event, zone) {\n        if (this.draggedFile && this.canDropInZone(this.draggedFile, zone)) {\n            event.preventDefault();\n            this.dragOverZone = zone;\n        }\n    },\n\n    async drop(event, zone) {\n        event.preventDefault();\n\n        if (!this.draggedFile || !this.canDropInZone(this.draggedFile, zone)) {\n            this.draggedFile = null;\n            this.dragOverZone = null;\n            return;\n        }\n\n        try {\n            const data = await httpJson(this.$store.product.getRoutes.assetsAdd, {\n                method: 'POST',\n                body: { file_id: this.draggedFile.id, zone }\n            });\n\n            // Prefer full file if your API returns it\n            if (data?.file) {\n                this.$store.product.addOrUpdateFile(data.file);\n            } else if (data?.asset) {\n                this.$store.product.patchFile(this.draggedFile.id, {\n                    on_product_page: true,\n                    product_page_type: zone,\n                    product_page_rank: data.asset.rank,\n                    product_page_file_id: data.asset.product_page_file_id,\n                });\n            } else {\n                // Minimal fallback\n                this.$store.product.patchFile(this.draggedFile.id, {\n                    on_product_page: true,\n                    product_page_type: zone,\n                });\n            }\n\n            this.$store.product.toastSuccess(`File added to ${zone}`);\n        } catch (err) {\n            console.error('Failed to add asset:', err);\n            this.$store.product.toastError(`Failed to add asset: ${err?.message || 'Unknown error'}`);\n        } finally {\n            this.draggedFile = null;\n            this.dragOverZone = null;\n        }\n    },\n\n    canDropInZone(file, zone) {\n        // Check if file type matches zone\n        const typeMatch = (zone === 'gallery' && file.type === 'image') ||\n                        (zone === 'resource' && (file.type === 'pdf' || file.type === 'other'));\n        \n        if (!typeMatch) return false;\n        \n        // Check if file is already in this zone\n        if (file.on_product_page && file.product_page_type === zone) {\n            return false; // Already in this zone\n        }\n        \n        return true;\n    },\n\n    async removeAsset(assetId, zone) {\n        // Read current files from the store\n        const files = this.$store.product.getUploadedFiles;\n        const uploadedFile = files.find(f => f.id === assetId);\n\n        if (!uploadedFile) {\n            console.error('Could not find corresponding uploaded file');\n            return;\n        }\n\n        if (!confirm(`Remove ${uploadedFile.name} from product ${zone}?`)) return;\n\n        try {\n            // POST (throws on non-2xx with a useful message)\n            const data = await httpURLEncoded(this.$store.product.getRoutes.assetsRemove, { file_id: assetId });\n\n            // If your API returns a canonical file after removal, prefer that:\n            if (data?.file) {\n                this.$store.product.addOrUpdateFile(data.file);\n            } else {\n                // SUCCESS — reflect the change in the store\n                const otherZone = zone === 'gallery' ? 'resource' : 'gallery';\n\n                // Option A: derive from zone lists (computed getters reading the store)\n                const otherZoneFiles = zone === 'gallery' ? this.resourceFiles : this.galleryFiles;\n                const stillUsedElsewhere = otherZoneFiles.some(f => f.id === assetId);\n\n                if (!stillUsedElsewhere) {\n                    this.$store.product.patchFile(assetId, {\n                    on_product_page: false,\n                    product_page_type: null,\n                    product_page_rank: null,\n                    product_page_file_id: null,\n                    });\n                } else {\n                    this.$store.product.patchFile(assetId, {\n                    product_page_type: otherZone,\n                    });\n                }\n            }\n\n            this.$store.product.toastSuccess('Asset removed from product page');\n        } catch (err) {\n            console.error('Failed to remove asset:', err);\n            this.$store.product.toastError(`Failed to remove asset: ${err?.message || 'Unknown error'}`);\n        }\n    },\n\n    // AI Processing methods\n    showAIModal(event, file) {\n        event.preventDefault();\n        this.aiSelectedFile = file;\n        this.aiAction = '';\n        this.aiSelectedSchema = this.selectedSchema || '';\n        this.aiProductName = document.getElementById('name')?.value || '';\n        this.showAIModalFlag = true;\n    },\n\n    async processWithAI() {\n\n        console.log('processWithAI')\n\n        if (!this.aiAction) {\n            this.$store.product.toastError('Please select an AI action');\n            return;\n        }\n\n        this.aiProcessing = true;\n\n        try {\n            const formData = new FormData();\n            formData.append('action', this.aiAction);\n\n            // Product name (keep DOM lookup; swap to store if you’ve added it)\n            const productName = document.getElementById('name')?.value?.trim();\n            if (productName) formData.append('product_name', productName);\n\n            // Additional context\n            if (this.aiContext?.trim()) {\n                formData.append('additional_context', this.aiContext.trim());\n            }\n\n            // Specs action: include schema info\n            if (this.aiAction === 'populate_specs' && this.aiSelectedSchema) {\n                formData.append('selected_schema_slug', this.aiSelectedSchema);\n                try {\n                    \n                    console.log('ai url')\n                    const url = this.$store.product.getRoutes.specsSchemaStructurePattern.replace('__SLUG__', this.aiSelectedSchema)\n                    console.log(url);\n\n                    const schemaStructure = await httpJson(url);\n                    formData.append('selected_schema_structure', JSON.stringify(schemaStructure));\n                } catch (err) {\n                    console.error('Failed to load schema structure:', err);\n                    this.$store.product.toastError(\n                    `Failed to load schema structure: ${err?.message || 'Unknown error'}`\n                    );\n                }\n            }\n\n            // Send to AI processor for the selected file\n            const url = this.fileAIUrl(this.aiSelectedFile.id);\n            const data = await httpForm(url, formData, { method: 'POST' });\n\n            // const data = JSON.parse('{\"status\":\"success\",\"suggestions\":{\"spec_values\":{\"1\":{\"1\":{\"value\":[\"33\",\"45\"],\"unit\":\"RPM\"},\"2\":{\"value\":\"Belt drive under the platter\",\"unit\":\"\"},\"3\":{\"value\":[\"33: +/-0.7%\",\"45: +/-0.6%\"],\"unit\":\"%\"},\"5\":{\"value\":\"Anti-resonant ABS polymer main platter\",\"unit\":\"\"},\"6\":{\"value\":\"8.6 inch aluminum tube\",\"unit\":\"\"},\"groups\":{\"group_id_2\":{\"instance_1\":{\"1\":{\"value\":\"33\",\"unit\":\"RPM\"},\"4\":{\"value\":\"+/-0.25\",\"unit\":\"%\"},\"group_name\":\"33 RPM\",\"quantity\":1},\"instance_2\":{\"1\":{\"value\":\"45\",\"unit\":\"RPM\"},\"4\":{\"value\":\"+/-0.23\",\"unit\":\"%\"},\"group_name\":\"45 RPM\",\"quantity\":1}}}}},\"custom_specs\":[{\"name\":\"Effective Tonearm Length\",\"value\":\"218.5\",\"unit\":\"mm\",\"field_type\":\"decimal\"},{\"name\":\"Tonearm Mass\",\"value\":\"7\",\"unit\":\"g\",\"field_type\":\"decimal\"},{\"name\":\"Overhang\",\"value\":\"22.0\",\"unit\":\"mm\",\"field_type\":\"decimal\"},{\"name\":\"Power Consumption\",\"value\":\"4.5\",\"unit\":\"W\",\"field_type\":\"decimal\"},{\"name\":\"Signal to Noise\",\"value\":\"65\",\"unit\":\"dB\",\"field_type\":\"decimal\"},{\"name\":\"Dimensions (WxHxD)\",\"value\":\"420 x 112 x 330\",\"unit\":\"mm\",\"field_type\":\"text\"},{\"name\":\"Weight\",\"value\":\"3.5\",\"unit\":\"kg\",\"field_type\":\"decimal\"},{\"name\":\"Input Impedance\",\"value\":\"47k/100\",\"unit\":\"ohms/pF\",\"field_type\":\"text\"},{\"name\":\"RIAA Equalization Accuracy\",\"value\":\"20-20000\",\"unit\":\"Hz\",\"field_type\":\"range\",\"context\":\"+/- 0.5dB\"}]}}')\n\n            if (data?.status === 'success' && data.suggestions) {\n                this.applySuggestions(data.suggestions);\n                this.$store.product.toastSuccess('AI processing completed successfully!');\n            } else {\n                this.$store.product.toastError(\n                    'AI processing failed: ' + (data?.error || 'Unknown error')\n                );\n            }\n        } catch (err) {\n            console.error('Error processing with AI:', err);\n            this.$store.product.toastError(`Error processing with AI: ${err?.message || 'Unknown error'}`);\n        } finally {\n            this.aiProcessing = false;\n            this.showAIModalFlag = false;\n        }\n    },\n\n    applySuggestions(suggestions) {\n        console.log('applySuggestions called');\n\n        // Handle the direct object structure from the server\n        const merged = suggestions || {};\n\n        console.log(merged);\n\n        if (this.aiAction === 'populate_content') {\n            if (merged.description) {\n                this.$store.product.setAIDescription = merged.description; \n            }\n            if (Array.isArray(merged.categories) && merged.categories.length) {\n                const validCategories = merged.categories.filter(c =>\n                    c && typeof c === 'object' && c.name && typeof c.confidence === 'number'\n                );\n                if (validCategories.length) {\n                    this.$store.product.setAICategories = validCategories;\n                }\n                this.$store.product.setShowAiSuggestions = true;\n            }\n        } else if (this.aiAction === 'populate_specs' && (merged.spec_values || merged.custom_specs)) {\n            // Store specs in the global store for the main manager to pick up\n            this.$store.product.setAISpecs = {\n                customSpecs: merged.custom_specs || [],\n                suggestedSchema: this.aiSelectedSchema,\n                specValues: merged.spec_values || {}\n            };\n\n            console.log('dispatching ai-specs-processed event');\n            \n            // Trigger a custom event that the main manager can listen for\n            window.dispatchEvent(new CustomEvent('ai-specs-processed', {\n                detail: {\n                    customSpecs: merged.custom_specs || [],\n                    suggestedSchema: this.aiSelectedSchema,\n                    specValues: merged.spec_values || {}\n                }\n            }));\n        }\n    },\n\n    async retryImageProcessing(file) {\n        const pat = this.$store.product.getRoutes.fileRetryProcessingPattern;\n        const url = pat ? pat.replace('/0/', `/${file.id}/`) : null;\n        if (!url) return;\n        try {\n            const data = await httpJson(url, { method: 'POST' });\n            if (data?.status === 'queued') {\n                this.$store.product.patchFile(file.id, { processing_status: 'processing' });\n                this.$store.product.toastSuccess('Reprocessing queued');\n            } else {\n                this.$store.product.toastError(data?.error || 'Failed to queue reprocessing');\n            }\n        } catch (err) {\n            this.$store.product.toastError(`Error: ${err?.message || 'Unknown error'}`);\n        }\n    },\n\n    // --- Crop ---\n    cropModalFile: null,\n    cropperInstance: null,\n\n    fileCropUrl(id) {\n        const pat = this.$store.product.getRoutes.fileCropPattern;\n        return pat ? pat.replace('/0/', `/${id}/`) : null;\n    },\n\n    openCropModal(file) {\n        this.cropModalFile = file;\n        Alpine.store('cropModal').file = file;\n        this.$nextTick(() => {\n            const img = document.getElementById('crop-modal-image');\n            if (!img) return;\n            if (this.cropperInstance) {\n                this.cropperInstance.destroy();\n                this.cropperInstance = null;\n            }\n            img.src = file.file_url;\n            img.onload = () => {\n                this.cropperInstance = new Cropper(img, {\n                    viewMode: 1,\n                    autoCropArea: 1,\n                    movable: true,\n                    zoomable: true,\n                    scalable: false,\n                    // Restore existing crop if set\n                    ready: () => {\n                        if (file.crop_box) {\n                            const { x1, y1, x2, y2 } = file.crop_box;\n                            const cd = this.cropperInstance.getCanvasData();\n                            this.cropperInstance.setCropBoxData({\n                                left: x1 * cd.width + cd.left,\n                                top: y1 * cd.height + cd.top,\n                                width: (x2 - x1) * cd.width,\n                                height: (y2 - y1) * cd.height,\n                            });\n                        }\n                    },\n                });\n            };\n        });\n    },\n\n    closeCropModal() {\n        if (this.cropperInstance) {\n            this.cropperInstance.destroy();\n            this.cropperInstance = null;\n        }\n        this.cropModalFile = null;\n        Alpine.store('cropModal').file = null;\n    },\n\n    async saveCrop() {\n        if (!this.cropperInstance || !this.cropModalFile) return;\n        const { left, top, width, height } = this.cropperInstance.getCropBoxData();\n        const canvasData = this.cropperInstance.getCanvasData();\n\n        // Crop box coords are relative to the cropper container.\n        // Subtract canvas offset to get position within the displayed image,\n        // then divide by displayed image size to get 0-1 fractions.\n        const x1 = Math.max(0, Math.min(1, (left - canvasData.left) / canvasData.width));\n        const y1 = Math.max(0, Math.min(1, (top - canvasData.top) / canvasData.height));\n        const x2 = Math.max(0, Math.min(1, (left - canvasData.left + width) / canvasData.width));\n        const y2 = Math.max(0, Math.min(1, (top - canvasData.top + height) / canvasData.height));\n\n        const url = this.fileCropUrl(this.cropModalFile.id);\n        if (!url) return;\n\n        try {\n            const data = await httpJson(url, {\n                method: 'POST',\n                body: { crop_box: { x1, y1, x2, y2 } },\n            });\n            if (data?.status === 'cropped') {\n                this.$store.product.patchFile(this.cropModalFile.id, {\n                    crop_box: data.crop_box,\n                    processing_status: 'processing',\n                });\n                this.$store.product.toastSuccess('Crop saved — reprocessing queued');\n                this.closeCropModal();\n            } else {\n                this.$store.product.toastError(data?.error || 'Failed to save crop');\n            }\n        } catch (err) {\n            this.$store.product.toastError(`Error saving crop: ${err?.message || 'Unknown error'}`);\n        }\n    },\n\n    async clearCrop(file) {\n        if (!confirm('Clear the manual crop and revert to auto-trim?')) return;\n        const url = this.fileCropUrl(file.id);\n        if (!url) return;\n        try {\n            const data = await httpJson(url, {\n                method: 'POST',\n                body: { crop_box: null },\n            });\n            if (data?.status === 'cleared') {\n                this.$store.product.patchFile(file.id, {\n                    crop_box: null,\n                    processing_status: 'processing',\n                });\n                this.$store.product.toastSuccess('Crop cleared — reprocessing queued');\n                this.closeCropModal();\n            } else {\n                this.$store.product.toastError(data?.error || 'Failed to clear crop');\n            }\n        } catch (err) {\n            this.$store.product.toastError(`Error clearing crop: ${err?.message || 'Unknown error'}`);\n        }\n    },\n\n    // Utility methods\n    formatFileSize(bytes) {\n        if (bytes === 0) return '0 Bytes';\n        const k = 1024;\n        const sizes = ['Bytes', 'KB', 'MB', 'GB'];\n        const i = Math.floor(Math.log(bytes) / Math.log(k));\n        return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n    }\n\n});\n\nexport default productFormFilesManager;","import { generateSlug, httpJson, httpURLEncoded, httpForm, reorder } from './productFormUtils.js';\n\nconst productFormManager = (initialData = {}) => ({\n\n\n    // Progressive save properties\n\n    initProductPk: initialData.productPk || null,\n    initProductSlug: initialData.productSlug || '',\n    initRoutes: initialData.routes || {},\n\n    basicInfoCollapsed: false, \n\n    // Snapshots for progressive saves\n    initialBaseVariantsSnapshot: {},         // base fields + images\n    initialCountryVariantsSnapshot: {},  // country publish state only\n    initialStoreVariantsSnapshot: {},    // store publish state only\n\n    variants: [],\n    countries: [],\n    loading: true,\n    draggedIndex: null,\n    newVariants: [],\n\n    storeProductExists: false,\n    creatingStoreProduct: false,\n\n    specsCollapsed: true,\n    specsLoading: false,\n    selectedSchema: initialData.selectedSchema || '',\n    availableSchemas: [],\n    schemaSections: [],\n    specValues: {},\n    customSpecs: [],\n    newCustomSpec: { name: \"\", field_type: \"text\", value: \"\", unit: \"\" },\n    availableCustomSpecs: [],\n\n    publishingCollapsed: true,\n    publishingData: null,\n    publishingLoading: false,\n\n    // Track changes for progressive save\n    storeProductPublished: false,\n    originalStoreProductPublished: false,\n    countryChanges: {},\n    originalCountryStates: {},\n\n    showVariantImageModal: false,\n    selectedVariantForModal: null,\n\n    draggedImageIndex: null,\n\n    // Utils\n    generateSlug: generateSlug,\n\n    // Initialize component\n    init() {\n        this.$store.product.setProductPk = this.initProductPk;\n        this.$store.product.setProductSlug = this.initProductSlug;\n        this.$store.product.setRoutes = this.initRoutes;\n\n        window.addEventListener('ai-specs-processed', (event) => {\n            console.log('AI specs event received:', event.detail);\n            this.applyAISpecs(event.detail);\n        });\n    },\n\n    validateUnsavedVariants() {\n        if (this.newVariants.length > 0) {\n            // Show error message\n            this.showVariantValidationError();\n            return false;\n        }\n        return true;\n    },\n\n    showVariantValidationError() {\n        this.$store.product.toastError(\n            'Please save or discard all unsaved variants before saving the product.',\n            5000\n        );\n    },\n\n    // Progressive Save Checking Methods\n\n    hashBaseVariant(v) {\n        // Only the fields you care about for base-level saves\n        return JSON.stringify({\n            id: v.id,\n            published: !!v.published,\n            title: v.title || '',\n            sku: v.sku || '',\n            gtin: v.gtin || '',\n            selector_1: v.selector_1 || '',\n            selector_2: v.selector_2 || '',\n            selector_3: v.selector_3 || '',\n            // Image identity for \"did images change?\"\n            variant_images: Array.isArray(v.variant_images)\n            ? v.variant_images.map(img => ({\n                product_page_file_id: img.product_page_file_id ?? img.id ?? null,\n                // (optional) include rank if server uses it for update\n                rank: img.rank ?? null\n                }))\n            : []\n        });\n    },\n\n    extractCountryVariantPublishMap(v) {\n        // Be defensive about shapes; only capture publish flags\n        const items = Array.isArray(v.country_variants) ? v.country_variants : [];\n        const map = {};\n        for (const cv of items) {\n            const key = cv.country_code ?? cv.id;\n            if (key != null) map[key] = !!cv.published;\n        }\n        return JSON.stringify(map);\n    },\n\n    extractStoreVariantPublishMap(v) {\n        return JSON.stringify({ published: !!v.store_variant_published });\n    },\n\n    snapshotAll() {\n        this.initialBaseVariantsSnapshot = {};\n        this.initialCountryVariantsSnapshot = {};\n        this.initialStoreVariantsSnapshot = {};\n        (this.variants || []).forEach(v => {\n            this.initialBaseVariantsSnapshot[v.id] = this.hashBaseVariant(v);\n            this.initialCountryVariantsSnapshot[v.id] = this.extractCountryVariantPublishMap(v);\n            this.initialStoreVariantsSnapshot[v.id] = this.extractStoreVariantPublishMap(v);\n        });\n    },\n\n    // async saveProductProgressive(createStoreProduct = false) {\n    //     if (!this.validateUnsavedVariants()) return;\n\n    //     this.$store.product.setShowSaveProgressModal = true;\n    //     this.$store.product.setCurrentSavingStep = 1;\n    //     this.$store.product.setSavingError = null;\n\n    //     this.creatingStoreProduct = createStoreProduct && !this.storeProductExists;\n\n    //     try {\n    //         // DIFFS\n    //         const changedBaseVariants = (this.variants || []).filter(v =>\n    //             this.initialBaseVariantsSnapshot[v.id] !== this.hashBaseVariant(v)\n    //         );\n\n    //         const changedCountryVariants = (this.variants || []).filter(v =>\n    //             this.initialCountryVariantsSnapshot[v.id] !== this.extractCountryVariantPublishMap(v)\n    //         );\n\n    //         const changedStoreVariants = (this.variants || []).filter(v =>\n    //             this.initialStoreVariantsSnapshot[v.id] !== this.extractStoreVariantPublishMap(v)\n    //         );\n\n    //         // Step 1: Update variants\n    //         if (changedBaseVariants.length) {\n    //             await httpURLEncoded(\n    //                 this.$store.product.getRoutes.updateVariants,\n    //                 { variants: JSON.stringify(this.variants) }\n    //             );\n    //         }\n\n    //         this.$store.product.setCurrentSavingStep = 2;\n\n    //         // Step 2: Update country variants\n    //         if (changedCountryVariants.length) {\n    //             await httpURLEncoded(\n    //                 this.$store.product.getRoutes.updateCountryVariants,\n    //                 { variants: JSON.stringify(this.variants) }\n    //             );\n    //         }\n\n    //         this.$store.product.setCurrentSavingStep = 3;\n\n    //         // Step 3: Save specifications (only if present)\n    //         if (this.selectedSchema || this.customSpecs.length > 0) {\n    //             const specsPayload = {\n    //                 schema_slug: this.selectedSchema,\n    //                 spec_values: this.specValues,\n    //                 custom_specs: this.customSpecs,\n    //             };\n    //             await httpJson(\n    //                 this.$store.product.getRoutes.specsSave,\n    //                 { method: 'POST', body: specsPayload }\n    //             );\n    //         }\n\n    //         this.$store.product.setCurrentSavingStep = 4;\n\n    //         // Step 4: Update publishing status (NEW STEP)\n    //         if (this.hasPublishingChanges()) {\n    //             const publishingResult = await this.savePublishingChanges();\n    //             if (!publishingResult.success) {\n    //                 throw new Error(publishingResult.message || 'Failed to save publishing changes');\n    //             }\n    //         }\n\n    //         this.$store.product.setCurrentSavingStep = 5;\n\n    //         // Step 5: Create store product (if requested)\n    //         if (this.creatingStoreProduct) {\n    //             await httpURLEncoded(\n    //                 this.$store.product.getRoutes.createStoreProduct,\n    //                 {} // empty form body; helper sets method POST\n    //             );\n    //         }\n\n    //         this.$store.product.setCurrentSavingStep = 6;\n\n    //         // Step 6: Update store variants (if store product exists)\n    //         if (this.storeProductExists && changedStoreVariants.length) {\n    //             await httpURLEncoded(\n    //                 this.$store.product.getRoutes.updateStoreVariants,\n    //                 { variants: JSON.stringify(this.variants) }\n    //             );\n    //         }\n\n    //         this.$store.product.setCurrentSavingStep = 7;\n\n    //         // Final Step: Submit form normally\n    //         this.$refs.productForm.submit();\n    //     } catch (error) {\n    //         console.error('Save failed:', error);\n    //         this.$store.product.setSavingError = error.message || 'Unknown error';\n    //     }\n    // },\n\n    async saveProductProgressive(createStoreProduct = false) {\n        if (!this.validateUnsavedVariants()) return;\n\n        // Prepare UI\n        this.$store.product.setShowSaveProgressModal = true;\n        this.$store.product.setSavingError = null;\n        this.$store.product.setCurrentSavingStep = 1;\n\n        this.creatingStoreProduct = createStoreProduct && !this.storeProductExists;\n\n        try {\n            // ---- Build diffs ----\n            const changedBase = (this.variants || []).filter(v =>\n                this.initialBaseVariantsSnapshot[v.id] !== this.hashBaseVariant(v)\n            );\n\n            const changedCountry = (this.variants || []).filter(v =>\n                this.initialCountryVariantsSnapshot[v.id] !== this.extractCountryVariantPublishMap(v)\n            );\n\n            const changedStore = (this.variants || []).filter(v =>\n                this.initialStoreVariantsSnapshot[v.id] !== this.extractStoreVariantPublishMap(v)\n            );\n\n            const hasSpecs =\n            !!this.selectedSchema || (Array.isArray(this.customSpecs) && this.customSpecs.length > 0);\n\n            const hasPublishing =\n            typeof this.hasPublishingChanges === 'function' && this.hasPublishingChanges();\n\n            const willCreateStoreProduct = this.creatingStoreProduct === true;\n            const willUpdateStore = this.storeProductExists && changedStore.length > 0;\n\n            // ---- Build the actual steps we will run (labels + functions) ----\n            const steps = [];\n\n            if (changedBase.length) {\n                steps.push({\n                    label: 'Update variants',\n                    fn: async () => {\n                    await httpURLEncoded(\n                        this.$store.product.getRoutes.updateVariants,\n                        { variants: JSON.stringify(changedBase) }\n                    );\n                    }\n                });\n            }\n\n            if (changedCountry.length) {\n                steps.push({\n                    label: 'Update country variants',\n                    fn: async () => {\n                    await httpURLEncoded(\n                        this.$store.product.getRoutes.updateCountryVariants,\n                        { variants: JSON.stringify(changedCountry) }\n                    );\n                    }\n                });\n            }\n\n            if (hasSpecs) {\n                steps.push({\n                    label: 'Save specifications',\n                    fn: async () => {\n                    const specsPayload = {\n                        schema_slug: this.selectedSchema,\n                        spec_values: this.specValues,\n                        custom_specs: this.customSpecs,\n                    };\n                    await httpJson(this.$store.product.getRoutes.specsSave, {\n                        method: 'POST',\n                        body: specsPayload\n                    });\n                    }\n                });\n            }\n\n            if (hasPublishing) {\n                steps.push({\n                    label: 'Save publishing changes',\n                    fn: async () => {\n                    const res = await this.savePublishingChanges();\n                    if (!res?.success) throw new Error(res?.message || 'Failed to save publishing changes');\n                    }\n                });\n            }\n\n            if (willCreateStoreProduct) {\n                steps.push({\n                    label: 'Create store product',\n                    fn: async () => {\n                    await httpURLEncoded(this.$store.product.getRoutes.createStoreProduct, {});\n                    }\n                });\n            }\n\n            if (willUpdateStore) {\n                steps.push({\n                    label: 'Update store variants',\n                    fn: async () => {\n                    await httpURLEncoded(\n                        this.$store.product.getRoutes.updateStoreVariants,\n                        { variants: JSON.stringify(changedStore) }\n                    );\n                    }\n                });\n            }\n\n            // Always last\n            steps.push({\n                label: 'Submit form',\n                fn: async () => {\n                    this.$refs.productForm.submit();\n                }\n            });\n\n            // ---- Drive the modal with only the active steps ----\n            // (You can either assign the array directly or use a setter; see section 3)\n            this.$store.product.setSavingSteps(steps.map(s => s.label));\n            this.$store.product.setCurrentSavingStep = 1;\n\n            // Execute steps in order and advance the progress index\n            for (let i = 0; i < steps.length; i++) {\n            await steps[i].fn();\n            this.$store.product.setCurrentSavingStep = i + 2;\n            }\n\n            // Refresh snapshots so subsequent saves only include new changes\n            this.snapshotAll();\n        } catch (error) {\n            console.error('Save failed:', error);\n            this.$store.product.setSavingError = error.message || 'Unknown error';\n        }\n    },\n\n    dismissProgressModal() {\n        \n        // Move to manager\n        \n        this.$store.product.setShowSaveProgressModal = false;\n        this.$store.product.setCurrentSavingStep = 0;\n        this.$store.product.setSavingError = null;\n    },\n\n    applySpecsSuggestions(suggestions) {\n        console.log(\"Applying AI specs suggestions:\", suggestions);\n        \n        // If we selected a schema in the modal but it\"s not yet selected in the main form, apply it\n        if (this.aiSelectedSchema && this.aiSelectedSchema !== this.selectedSchema) {\n            this.selectedSchema = this.aiSelectedSchema;\n            // Load the schema structure\n            this.loadSchemaStructure().then(() => {\n                // After schema loads, apply the spec values\n                this.applySpecValues(suggestions);\n            });\n        } else {\n            // Schema already loaded, apply values directly\n            this.applySpecValues(suggestions);\n        }\n    },\n\n    // Helper function to apply spec values\n    applySpecValues(specValues) {\n        console.log('applySpecValues');\n        \n        if (!specValues || Object.keys(specValues).length === 0) return;\n        \n        console.log('applySpecValues 2');\n        console.log('Current specValues before applying:', this.specValues);\n        \n        // Create field name to ID mapping from current schema\n        const fieldMap = {};\n        const sectionMap = {};\n        const groupMap = {};\n        \n        if (this.schemaSections) {\n            this.schemaSections.forEach(section => {\n                sectionMap[section.name.toLowerCase()] = section.id;\n                \n                // Map direct fields\n                section.fields.forEach(field => {\n                    fieldMap[field.name.toLowerCase()] = field.id;\n                });\n                \n                // Map group fields\n                section.groups.forEach(group => {\n                    groupMap[group.name.toLowerCase()] = group.id;\n                    group.fields.forEach(field => {\n                        fieldMap[field.name.toLowerCase()] = field.id;\n                    });\n                });\n            });\n        }\n\n        console.log('fieldMap', fieldMap);\n        console.log('sectionMap', sectionMap);\n        console.log('groupMap', groupMap);\n        \n        // Process AI suggestions and map to correct structure\n        for (const [aiSectionKey, aiSectionData] of Object.entries(specValues)) {\n            const sectionId = sectionMap[aiSectionKey.toLowerCase()] || aiSectionKey;\n            \n            console.log(`Processing section: ${aiSectionKey} -> ${sectionId}`);\n            \n            if (typeof aiSectionData === \"object\" && aiSectionData !== null) {\n                if (!this.specValues[sectionId]) {\n                    this.specValues[sectionId] = {};\n                }\n                \n                for (const [aiFieldKey, aiFieldData] of Object.entries(aiSectionData)) {\n                    // Skip the 'groups' key for now, handle it separately\n                    if (aiFieldKey === 'groups') {\n                        console.log('Processing groups data:', aiFieldData);\n                        try {\n                            for (const [groupKey, groupInstances] of Object.entries(aiFieldData)) {\n                                console.log(`Processing group: ${groupKey}`);\n                                \n                                let groupId;\n                                if (groupMap[groupKey.toLowerCase()]) {\n                                    groupId = groupMap[groupKey.toLowerCase()];\n                                } else {\n                                    // Try converting underscores to spaces and ampersands\n                                    const normalizedKey = groupKey.toLowerCase()\n                                        .replace(/_/g, ' ')\n                                        .replace(/and/g, '&')\n                                        .trim();\n                                    \n                                    if (groupMap[normalizedKey]) {\n                                        groupId = groupMap[normalizedKey];\n                                    } else {\n                                        // Last resort: extract from group_id_X pattern\n                                        groupId = groupKey.replace('group_id_', '').replace('group_', '');\n                                    }\n                                }\n\n                                console.log(`Group mapping: \"${groupKey}\" -> group ID \"${groupId}\"`);\n                                console.log('Available groups in groupMap:', groupMap);\n\n\n                                \n                                for (const [instanceKey, instanceData] of Object.entries(groupInstances)) {\n                                    console.log(`Processing instance: ${instanceKey}`, instanceData);\n                                    \n                                    if (instanceKey.startsWith('instance_')) {\n                                        const instanceNumber = instanceKey.split('_')[1];\n                                        const fullInstanceKey = `group_${groupId}_instance_${instanceNumber}`;\n                                        \n                                        console.log(`Creating group instance: ${fullInstanceKey}`);\n                                        \n                                        if (!this.specValues[sectionId][fullInstanceKey]) {\n                                            this.specValues[sectionId][fullInstanceKey] = {};\n                                        }\n                                        \n                                        // Process fields within the group instance\n                                        for (const [fieldKey, fieldData] of Object.entries(instanceData)) {\n                                            if (fieldKey === 'group_name' || fieldKey === 'quantity') {\n                                                console.log(`Skipping metadata field: ${fieldKey}`);\n                                                continue;\n                                            }\n\n                                            console.log(`Processing group field: ${fieldKey}`, fieldData);\n                                            \n                                            const fieldId = fieldMap[fieldKey.toLowerCase()] || fieldKey.replace('field_id_', '');\n                                            const field = this.getFieldById(fieldId);\n                                            \n                                            console.log(`Group field mapped: ${fieldKey} -> ${fieldId}`, field ? 'Found field' : 'Field not found');\n                                            \n                                            if (field) {\n                                                const toValueObj = (val, unit, ctx) => ({\n                                                    value: val,\n                                                    unit: unit ?? field.default_unit ?? '',\n                                                    context_text: ctx ?? ''\n                                                });\n\n                                                if (field.allows_multiple_values) {\n                                                    // AI might send: ['33','45'] OR {value:['33','45'], unit:'RPM'} OR {value:'33', unit:'RPM'} OR '33'\n                                                    if (Array.isArray(fieldData)) {\n                                                        this.specValues[sectionId][fullInstanceKey][fieldId] =\n                                                        fieldData.map(v => typeof v === 'object' && v?.value !== undefined\n                                                            ? toValueObj(v.value, v.unit, v.context)\n                                                            : toValueObj(v));\n                                                    } else if (typeof fieldData === 'object' && Array.isArray(fieldData.value)) {\n                                                        this.specValues[sectionId][fullInstanceKey][fieldId] =\n                                                        fieldData.value.map(v => toValueObj(v, fieldData.unit, fieldData.context));\n                                                    } else if (typeof fieldData === 'object' && fieldData.value !== undefined) {\n                                                        this.specValues[sectionId][fullInstanceKey][fieldId] =\n                                                        [toValueObj(fieldData.value, fieldData.unit, fieldData.context)];\n                                                    } else {\n                                                        this.specValues[sectionId][fullInstanceKey][fieldId] = [toValueObj(fieldData)];\n                                                    }\n                                                } else {\n                                                    // single-value fields stay as an object\n                                                    if (typeof fieldData === 'object' && fieldData.value !== undefined) {\n                                                        this.specValues[sectionId][fullInstanceKey][fieldId] =\n                                                        toValueObj(fieldData.value, fieldData.unit, fieldData.context);\n                                                    } else {\n                                                        this.specValues[sectionId][fullInstanceKey][fieldId] =\n                                                        toValueObj(fieldData);\n                                                    }\n                                                }\n                                                console.log(`Set group field value:`, this.specValues[sectionId][fullInstanceKey][fieldId]);\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                        } catch (error) {\n                            console.error('Error processing groups:', error);\n                            // Don't let group errors break the rest of the function\n                        }\n                        continue;\n                    }\n                    \n                    const fieldId = fieldMap[aiFieldKey.toLowerCase()] || aiFieldKey;\n                    console.log(`  Setting field: ${aiFieldKey} -> ${fieldId}`, aiFieldData);\n                    \n                    // Find the field definition to understand its structure\n                    const field = this.getFieldById(fieldId);\n                    \n                    if (field) {\n                        if (field.allows_multiple_values && Array.isArray(aiFieldData)) {\n                            // Convert array to proper structure for multiple values\n                            this.specValues[sectionId][fieldId] = aiFieldData.map(item => ({\n                                value: typeof item === 'object' ? item.value : item,\n                                unit: typeof item === 'object' ? (item.unit || field.default_unit || '') : (field.default_unit || ''),\n                                context_text: typeof item === 'object' ? (item.context || '') : ''\n                            }));\n                        } else if (field.allows_multiple_values && typeof aiFieldData === 'object' && aiFieldData.value && Array.isArray(aiFieldData.value)) {\n                            // Handle case where AI returns {value: ['33', '45'], unit: 'RPM'}\n                            this.specValues[sectionId][fieldId] = aiFieldData.value.map(val => ({\n                                value: val,\n                                unit: aiFieldData.unit || field.default_unit || '',\n                                context_text: aiFieldData.context || ''\n                            }));\n                        } else if (typeof aiFieldData === 'object' && aiFieldData.value !== undefined) {\n                            // Single object with value\n                            this.specValues[sectionId][fieldId] = {\n                                value: aiFieldData.value,\n                                unit: aiFieldData.unit || field.default_unit || '',\n                                context_text: aiFieldData.context || ''\n                            };\n                        } else {\n                            // Simple value\n                            this.specValues[sectionId][fieldId] = {\n                                value: aiFieldData,\n                                unit: field.default_unit || '',\n                                context_text: ''\n                            };\n                        }\n                    } else {\n                        // Fallback - just set the data as-is\n                        this.specValues[sectionId][fieldId] = aiFieldData;\n                    }\n                }\n            }\n            \n        }\n        \n        console.log('applySpecValues complete - final specValues:', this.specValues);\n\n        // Force Alpine reactivity\n        this.specValues = JSON.parse(JSON.stringify(this.specValues));\n        this.specsCollapsed = false;\n\n        console.log('After reactivity update:', this.specValues);\n    },\n\n    getFieldById(fieldId) {\n        // Find field in schema sections\n        for (const section of this.schemaSections || []) {\n            // Check direct fields\n            const field = section.fields?.find(f => f.id == fieldId);\n            if (field) return field;\n            \n            // Check group fields\n            for (const group of section.groups || []) {\n                const groupField = group.fields?.find(f => f.id == fieldId);\n                if (groupField) return groupField;\n            }\n        }\n        return null;\n    },\n\n    // formatFileSize(bytes) {\n    //     if (bytes === 0) return \"0 Bytes\";\n    //     const k = 1024;\n    //     const sizes = [\"Bytes\", \"KB\", \"MB\", \"GB\"];\n    //     const i = Math.floor(Math.log(bytes) / Math.log(k));\n    //     return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + \" \" + sizes[i];\n    // },\n\n    // async updateFileName(file, newName) {\n    //     const name = (newName ?? '').trim();\n    //     if (!name) {\n    //         this.$store.product.toastError('Name cannot be empty');\n    //         return;\n    //     }\n    //     if (file.name === name) return; // no-op\n\n    //     try {\n    //         const data = await httpURLEncoded(\n    //         `${this.$store.product.getRoutes.files}${file.id}/update/`,\n    //         { name }\n    //         );\n\n    //         if (data?.status === 'success') {\n    //             this.$store.product.patchFile(file.id, { name });\n    //             this.$store.product.toastSuccess('File name updated');\n    //         } else {\n    //             const msg = data?.error || 'Failed to update name';\n    //             console.error('Failed to update name:', msg);\n    //             this.$store.product.toastError(msg);\n    //         }\n    //     } catch (err) {\n    //         console.error('Error updating name:', err);\n    //         this.$store.product.toastError(`Error updating name: ${err?.message || 'Unknown error'}`);\n    //     }\n    // },\n\n    async loadVariants() {\n        this.loading = true;\n        try {\n            const data = await httpJson(this.$store.product.getRoutes.variantsList);\n            if (data?.error) throw new Error(data.error);\n\n            this.variants = Array.isArray(data.variants) ? data.variants : [];\n            this.countries = Array.isArray(data.countries) ? data.countries : [];\n            this.storeProductExists = !!data.store_product_exists;\n\n            // Ensure variant_images and country_variants exist as arrays\n            this.variants.forEach(v => {\n                if (!Array.isArray(v.variant_images)) v.variant_images = [];\n                if (!Array.isArray(v.country_variants)) v.country_variants = [];\n                if (v.collapsed === undefined) v.collapsed = false;\n            });\n            \n            this.snapshotAll();\n\n        } catch (err) {\n            console.error('Error loading variants:', err);\n            this.$store.product.toastError(`Failed to load variants: ${err?.message || 'Unknown error'}`);\n        } finally {\n            this.loading = false;\n        }\n    },\n\n    addNewVariant() {\n        const tempId = \"new_\" + Date.now();\n        this.newVariants.push({\n            id: tempId,\n            title: \"\",\n            sku: \"\",\n            gtin: \"\",\n            selector_1: \"\",\n            selector_2: \"\",\n            selector_3: \"\",\n            published: true,\n            rank: this.variants.length + this.newVariants.length,\n            saving: false\n        });\n    },\n\n    async saveNewVariant(newVariant) {\n        const title = (newVariant.title || '').trim();\n        const sku   = (newVariant.sku || '').trim();\n\n        if (!title || !sku) {\n            this.$store.product.toastError('Title and SKU are required');\n            return;\n        }\n\n        newVariant.saving = true;\n\n        try {\n            const fd = new FormData();\n            fd.append('title', title);\n            fd.append('sku', sku);\n            fd.append('gtin', newVariant.gtin ?? '');\n            fd.append('selector_1', newVariant.selector_1 ?? '');\n            fd.append('selector_2', newVariant.selector_2 ?? '');\n            fd.append('selector_3', newVariant.selector_3 ?? '');\n            fd.append('published', newVariant.published ?? false);\n\n            const data = await httpForm(this.$store.product.getRoutes.variantCreate, fd, { method: 'POST' });\n\n            if (data?.error) {\n                this.$store.product.toastError(`Error creating variant: ${data.error}`);\n                return;\n            }\n\n            const serverVariant = data?.variant || {};\n            const savedVariant = {\n            ...serverVariant,\n            creatingCountryVariants: true,\n            countryVariantAttempts: 0,\n            variant_images: Array.isArray(serverVariant.variant_images) ? serverVariant.variant_images : [],\n            };\n\n            this.variants.push(savedVariant);\n            this.removeNewVariant(newVariant.id);\n\n            // Start monitoring for country variants\n            this.monitorCountryVariants(savedVariant);\n\n            this.$store.product.toastSuccess('Variant created');\n        } catch (err) {\n            console.error('Error creating variant:', err);\n            this.$store.product.toastError(`Error creating variant: ${err?.message || 'Unknown error'}`);\n        } finally {\n            newVariant.saving = false;\n        }\n    },\n\n    async monitorCountryVariants(variant) {\n        const maxAttempts = 3;\n        const checkInterval = 3000; // 3s\n\n        // Ensure flags exist\n        if (variant.countryVariantAttempts == null) variant.countryVariantAttempts = 0;\n        variant.creatingCountryVariants = true;\n        variant.countryVariantError = false;\n\n        const checkCountryVariants = async () => {\n            try {\n            // Reload all variants\n            const data = await httpJson(this.$store.product.getRoutes.variantsList);\n            if (data?.error) throw new Error(data.error);\n\n            // Find our variant in the refreshed list\n            const refreshedVariant = (data.variants || []).find(v => v.id === variant.id);\n\n            if (refreshedVariant &&\n                Array.isArray(refreshedVariant.country_variants) &&\n                refreshedVariant.country_variants.length > 0) {\n                // Success: replace local variants with fresh server data\n                this.variants = data.variants || [];\n                variant.creatingCountryVariants = false;\n                variant.countryVariantError = false;\n                return;\n            }\n\n            // Not ready yet → try again (bounded)\n            variant.countryVariantAttempts++;\n            if (variant.countryVariantAttempts < maxAttempts) {\n                setTimeout(checkCountryVariants, checkInterval);\n            } else {\n                variant.creatingCountryVariants = false;\n                variant.countryVariantError = true;\n                this.$store.product.toastError('Timed out waiting for country variants');\n            }\n            } catch (err) {\n            console.error('Error checking country variants:', err);\n            variant.countryVariantAttempts++;\n            if (variant.countryVariantAttempts < maxAttempts) {\n                setTimeout(checkCountryVariants, checkInterval);\n            } else {\n                variant.creatingCountryVariants = false;\n                variant.countryVariantError = true;\n                this.$store.product.toastError(`Failed to load country variants: ${err?.message || 'Unknown error'}`);\n            }\n            }\n        };\n\n        // Start checking after initial delay\n        setTimeout(checkCountryVariants, checkInterval);\n    },\n\n    removeNewVariant(tempId) {\n        this.newVariants = this.newVariants.filter(v => v.id !== tempId);\n    },\n\n    startDrag(index) {\n        this.draggedIndex = index;\n    },\n\n    drop(targetIndex) {\n        if (this.draggedIndex !== null && this.draggedIndex !== targetIndex) {\n            this.variants = reorder(this.variants, this.draggedIndex, targetIndex);\n            this.updateRanks();\n        }\n        this.draggedIndex = null;\n    },\n\n    updateRanks() {\n        for (let i = 0; i < this.variants.length; i++) {\n            this.variants[i].rank = i + 1;\n        }\n    },\n\n    getStoreVariantPublished(variantId) {\n        const variant = this.variants.find(v => v.id === variantId);\n        return variant ? variant.store_variant_published : false;\n    },\n\n    updateStoreVariantPublished(variantId, published) {\n        const variant = this.variants.find(v => v.id === variantId);\n        if (variant) {\n            variant.store_variant_published = published;\n        }\n    },\n\n    async retryImageProcessing(file) {\n        try {\n            const url = this.$store.product.getRoutes.fileRetryProcessingPattern.replace('/0/', `/${file.id}/`);\n            const response = await fetch(url, {\n                method: 'POST',\n                headers: {\n                    'X-CSRFToken': document.querySelector('[name=csrfmiddlewaretoken]').value\n                }\n            });\n\n            if (response.ok) {\n                const data = await response.json();\n                // Update file status to processing\n                file.processing_status = 'processing';\n                this.$store.product.toastSuccess('ImageKit variants queued');\n            } else {\n                const errorData = await response.json();\n                throw new Error(errorData.error || 'Failed to queue image processing');\n            }\n        } catch (error) {\n            console.error('Error retrying image processing:', error);\n            this.$store.product.toastError('Failed to retry image processing: ' + error.message);\n        }\n    },\n\n    showVariantImageSelectionModal(variant) {\n        this.selectedVariantForModal = variant;\n        this.showVariantImageModal = true;\n    },\n\n    // Close variant image modal\n    closeVariantImageModal() {\n        this.showVariantImageModal = false;\n        this.selectedVariantForModal = null;\n    },\n\n    // Get available images for variant assignment (used in modal)\n    getAvailableImagesForVariant(variant) {\n        if (!variant) return [];\n\n        const files = this.$store.product.getUploadedFiles;\n\n        return files.filter(file => {\n            // Only images\n            if (file.type !== 'image') return false;\n\n            // Must have category and assignment\n            if (!file.category || !file.assignment) return false;\n\n            // Exclude already assigned to this variant\n            const alreadyAssigned = (variant.variant_images || []).some(vImg => vImg.file_id === file.id);\n            return !alreadyAssigned;\n        });\n    },\n\n    // Assign image to variant\n    async assignImageToVariant(file, variant) {\n        if (!variant || !file) return false;\n\n        try {\n            const data = await httpJson(this.$store.product.getRoutes.variantImageAssign, {\n            method: 'POST',\n            body: {\n                file_id: file.id,\n                variant_id: variant.id,\n            },\n            });\n\n            // Server usually returns { variant_image: {...} }\n            const vimg = data?.variant_image || data;\n            if (!vimg) throw new Error('No variant image returned');\n\n            // Ensure array exists\n            if (!Array.isArray(variant.variant_images)) variant.variant_images = [];\n\n            // De-dupe same file if it somehow already exists\n            variant.variant_images = variant.variant_images.filter(vi => vi.file_id !== vimg.file_id);\n\n            // Add and sort by rank if present\n            variant.variant_images.push(vimg);\n            variant.variant_images.sort((a, b) => (a.rank ?? 0) - (b.rank ?? 0));\n\n            // Optional: if your API returns assigned-variant info on the file, reflect it in the store:\n            // if (Array.isArray(data?.assigned_variant_ids)) {\n            //   this.$store.product.patchFile(file.id, { assigned_variant_ids: data.assigned_variant_ids });\n            // }\n\n            this.$store.product.toastSuccess(`${file.name} added to variant successfully`);\n            return true;\n        } catch (err) {\n            console.error('Failed to assign image:', err);\n            this.$store.product.toastError(`Failed to assign image: ${err?.message || 'Unknown error'}`);\n            return false;\n        }\n    },\n\n    // Remove image from variant\n    async removeImageFromVariant(variantImage, variant) {\n        if (!confirm(`Remove ${variantImage.file_name} from this variant?`)) return false;\n\n        try {\n            await httpJson(this.$store.product.getRoutes.variantImageRemove, {\n            method: 'POST',\n            body: {\n                variant_id: variant.id,\n                product_page_file_id: variantImage.product_page_file_id,\n            },\n            });\n\n            // Ensure array exists then remove by id\n            if (!Array.isArray(variant.variant_images)) variant.variant_images = [];\n            variant.variant_images = variant.variant_images.filter(\n                img => img.product_page_file_id !== variantImage.product_page_file_id\n            );\n\n            this.$store.product.toastSuccess('Image removed from variant');\n            return true;\n        } catch (err) {\n            console.error('Failed to remove image:', err);\n            this.$store.product.toastError(`Failed to remove image: ${err?.message || 'Unknown error'}`);\n            return false;\n        }\n    },\n\n    // Reorder variant images\n    async reorderVariantImages(variant, newImageOrder) {\n        try {\n            // Build rank updates for the server\n            const updates = newImageOrder.map((img, index) => ({\n                product_page_file_id: img.product_page_file_id,\n                rank: index + 1,\n            }));\n\n            await httpJson(this.$store.product.getRoutes.variantImageReorder, {\n                method: 'POST',\n                body: {\n                    variant_id: variant.id,\n                    images: updates,\n                },\n            });\n\n            // Reflect new order locally and normalize ranks\n            variant.variant_images = newImageOrder.map((img, index) => ({\n            ...img,\n            rank: index + 1,\n            }));\n\n            this.$store.product.toastSuccess('Variant images reordered successfully');\n            return true;\n        } catch (err) {\n            console.error('Failed to reorder images:', err);\n            this.$store.product.toastError(`Failed to reorder images: ${err?.message || 'Unknown error'}`);\n            return false;\n        }\n    },\n\n   async loadSchemaStructure() {\n        if (!this.selectedSchema) {\n            this.schemaSections = [];\n            return;\n        }\n\n        this.specsLoading = true;\n        try {\n            const url = this.$store.product.getRoutes.specsSchemaStructurePattern.replace('__SLUG__', this.selectedSchema);\n            const data = await httpJson(url);\n            \n            // Handle new structure with groups\n            this.schemaSections = Array.isArray(data?.sections) ? data.sections.map(section => ({\n                ...section,\n                // Ensure groups array exists\n                groups: Array.isArray(section.groups) ? section.groups : [],\n                // Ensure fields array exists (direct section fields)\n                fields: Array.isArray(section.fields) ? section.fields : []\n            })) : [];\n\n            // Initialize spec values structure\n            this.initializeSpecValues();\n        } catch (err) {\n            console.error('Failed to load schema structure:', err);\n            this.$store.product.toastError(`Failed to load schema structure: ${err?.message || 'Unknown error'}`);\n        } finally {\n            this.specsLoading = false;\n        }\n    },\n\n    async loadExistingSpecs() {\n        // Use your getter for consistency\n        if (!this.$store.product.getProductPk) return;\n\n        try {\n            const data = await httpJson(this.$store.product.getRoutes.specsLoad);\n            this.specValues  = data?.spec_values || {};\n            this.customSpecs = Array.isArray(data?.custom_specs) ? data.custom_specs : [];\n        } catch (err) {\n            console.error('Failed to load existing specs:', err);\n            this.$store.product.toastError(`Failed to load specs: ${err?.message || 'Unknown error'}`);\n        }\n    },\n\n    async loadAvailableCustomSpecs() {\n        try {\n            const data = await httpJson(this.$store.product.getRoutes.customSpecsList);\n            this.availableCustomSpecs = Array.isArray(data?.custom_specs) ? data.custom_specs : [];\n        } catch (err) {\n            console.error('Failed to load custom specs:', err);\n            this.$store.product.toastError(`Failed to load custom specs: ${err?.message || 'Unknown error'}`);\n        }\n    },\n\n    initializeSpecValues() {\n        console.log('initializeSpecValues called - current specValues:', this.specValues);\n        \n        this.schemaSections.forEach(section => {\n            if (!this.specValues[section.id]) {\n                this.specValues[section.id] = {};\n            }\n            \n            // Initialize direct section fields - but don't overwrite existing values\n            section.fields.forEach(field => {\n                if (!this.specValues[section.id][field.id]) {\n                    console.log(`Initializing direct field ${field.id} in section ${section.id}`);\n                    this.initializeFieldValue(section.id, field, null);\n                } else {\n                    console.log(`Skipping direct field ${field.id} - already exists`);\n                }\n            });\n            \n            // Initialize group fields\n            section.groups.forEach(group => {\n                // Check if any AI instances exist for this group\n                const hasAIInstances = Object.keys(this.specValues[section.id] || {})\n                    .some(key => key.startsWith(`group_${group.id}_instance_`));\n                \n                console.log(`Group ${group.id}: hasAIInstances = ${hasAIInstances}`);\n                \n                if (!hasAIInstances) {\n                    // No AI instances - create default structure\n                    if (!this.specValues[section.id][`group_${group.id}`]) {\n                        this.specValues[section.id][`group_${group.id}`] = {};\n                    }\n                    \n                    group.fields.forEach(field => {\n                        if (!this.specValues[section.id][`group_${group.id}`][field.id]) {\n                            console.log(`Initializing group field ${field.id} in group ${group.id}`);\n                            this.initializeFieldValue(section.id, field, `group_${group.id}`);\n                        }\n                    });\n                } else {\n                    console.log(`Skipping group ${group.id} initialization - AI instances found`);\n                }\n            });\n        });\n    },\n\n    initializeFieldValue(sectionId, field, groupKey = null) {\n        const container = groupKey \n            ? this.specValues[sectionId][groupKey]\n            : this.specValues[sectionId];\n        \n        if (!container[field.id]) {\n            if (field.field_type === 'range') {\n                container[field.id] = {\n                    range_min: '',\n                    range_max: '',\n                    unit: field.default_unit || '',\n                    context_text: field.supports_context ? '' : undefined\n                };\n            } else if (field.allows_multiple_values) {\n                container[field.id] = [this.createFieldValueObject(field)];\n            } else {\n                container[field.id] = this.createFieldValueObject(field);\n            }\n        }\n    },\n\n    createFieldValueObject(field) {\n        const obj = {\n            value: field.field_type === 'boolean' ? false : '',\n            unit: field.field_type !== 'boolean' ? (field.default_unit || '') : undefined\n        };\n        \n        if (field.supports_context) {\n            obj.context_text = '';\n        }\n        \n        return obj;\n    },\n\n    addGroupInstance(sectionId, groupId) {\n        const groupKey = `group_${groupId}`;\n        const section = this.schemaSections.find(s => s.id === sectionId);\n        const group = section?.groups.find(g => g.id === groupId);\n        \n        if (!group) return;\n        \n        // Find next instance number\n        const existingInstances = Object.keys(this.specValues[sectionId])\n            .filter(key => key.startsWith(`${groupKey}_instance_`))\n            .length;\n        \n        const instanceKey = `${groupKey}_instance_${existingInstances + 1}`;\n        this.specValues[sectionId][instanceKey] = {};\n        \n        // Initialize fields for this instance\n        group.fields.forEach(field => {\n            this.initializeFieldValue(sectionId, field, instanceKey);\n        });\n    },\n\n    removeGroupInstance(sectionId, instanceKey) {\n\n        if (!this.specValues?.[sectionId]?.[instanceKey]) return;\n\n        // Optional guard: keep at least 1 instance per group\n        const groupId = instanceKey.split('_')[1]; // \"2\" from \"group_2_instance_2\"\n        const remaining = Object.keys(this.specValues[sectionId])\n            .filter(k => k.startsWith(`group_${groupId}_instance_`) && k !== instanceKey);\n\n        // If you want to block deleting the last one:\n        // if (remaining.length === 0) { /* show toast/warn */ return; }\n\n        delete this.specValues[sectionId][instanceKey];\n\n        // Optional: re-index instance numbers so they stay 1..N\n        this._reindexGroupInstances(sectionId, groupId);\n\n    },\n\n    // Keep instance keys neat after deletions (optional)\n    _reindexGroupInstances(sectionId, groupId) {\n        const prefix = `group_${groupId}_instance_`;\n        const entries = Object.entries(this.specValues[sectionId] || {})\n            .filter(([k]) => k.startsWith(prefix))\n            .sort((a, b) => {\n            const ai = parseInt(a[0].split('_').pop(), 10);\n            const bi = parseInt(b[0].split('_').pop(), 10);\n            return ai - bi;\n            });\n\n        let nextIndex = 1;\n        for (const [oldKey, val] of entries) {\n            const newKey = `${prefix}${nextIndex}`;\n            if (newKey !== oldKey) {\n            this.specValues[sectionId][newKey] = val;\n            delete this.specValues[sectionId][oldKey];\n            }\n            nextIndex++;\n        }\n    },\n\n\n    getGroupInstances(sectionId, groupId) {\n        const groupKey = `group_${groupId}`;\n        return Object.keys(this.specValues[sectionId] || {})\n            .filter(key => {\n                // Only return keys that start with the pattern AND actually exist with data\n                return key.startsWith(`${groupKey}_instance_`) && \n                    this.specValues[sectionId][key] && \n                    typeof this.specValues[sectionId][key] === 'object';\n            })\n            .sort((a, b) => {\n                const numA = parseInt(a.split('_').pop());\n                const numB = parseInt(b.split('_').pop());\n                return numA - numB;\n            });\n    },\n\n    addRepeatableInstance(sectionId) {\n        const instanceCount = Object.keys(this.specValues[sectionId]).length;\n        const newInstanceKey = `instance_${instanceCount + 1}`;\n        this.specValues[sectionId][newInstanceKey] = {};\n        \n        // Initialize fields for the new instance\n        const section = this.schemaSections.find(s => s.id === sectionId);\n        section.fields.forEach(field => {\n            if (field.allows_multiple_values) {\n                this.specValues[sectionId][newInstanceKey][field.id] = [{ value: \"\", unit: field.default_unit || \"\" }];\n            } else {\n                this.specValues[sectionId][newInstanceKey][field.id] = { value: \"\", unit: field.default_unit || \"\" };\n            }\n        });\n    },\n\n    removeRepeatableInstance(sectionId, instanceKey) {\n        delete this.specValues[sectionId][instanceKey];\n    },\n\n    addMultipleValue(sectionId, fieldId, instanceKey = null) {\n        const fieldPath = instanceKey \n            ? this.specValues[sectionId][instanceKey][fieldId]\n            : this.specValues[sectionId][fieldId];\n            \n        const field = this.getField(fieldId);\n        fieldPath.push({ value: \"\", unit: field.default_unit || \"\" });\n    },\n\n    removeMultipleValue(sectionId, fieldId, valueIndex, instanceKey = null) {\n        const fieldPath = instanceKey \n            ? this.specValues[sectionId][instanceKey][fieldId]\n            : this.specValues[sectionId][fieldId];\n            \n        if (fieldPath.length > 1) {\n            fieldPath.splice(valueIndex, 1);\n        }\n    },\n\n    getField(fieldId) {\n        for (const section of this.schemaSections) {\n            const field = section.fields.find(f => f.id === fieldId);\n            if (field) return field;\n        }\n        return null;\n    },\n\n    addCustomSpec() {\n        if (!this.newCustomSpec.name.trim()) return;\n        \n        this.customSpecs.push({\n            id: Date.now(), // Temporary ID\n            name: this.newCustomSpec.name,\n            field_type: this.newCustomSpec.field_type,\n            value: this.newCustomSpec.value,\n            unit: this.newCustomSpec.unit,\n            is_new: true\n        });\n        \n        this.newCustomSpec = { name: \"\", field_type: \"text\", value: \"\", unit: \"\" };\n    },\n\n    addExistingCustomSpec(customSpecId) {\n        const existingSpec = this.availableCustomSpecs.find(spec => spec.id === parseInt(customSpecId));\n        if (!existingSpec) return;\n        \n        // Check if already added\n        if (this.customSpecs.find(spec => spec.id === existingSpec.id)) return;\n        \n        this.customSpecs.push({\n            ...existingSpec,\n            value: \"\",\n            is_new: false\n        });\n    },\n\n    removeCustomSpec(index) {\n        this.customSpecs.splice(index, 1);\n    },\n\n    async saveSpecs() {\n        // Ensure product exists first\n        if (!this.$store.product.getProductPk) {\n            this.$store.product.toastError('Please save the product before adding specifications');\n            return;\n        }\n\n        try {\n            const payload = {\n                schema_slug: this.selectedSchema || null,\n                spec_values: this.specValues || {},\n                custom_specs: this.customSpecs || [],\n            };\n\n            const data = await httpJson(this.$store.product.getRoutes.specsSave, {\n                method: 'POST',\n                body: payload,\n            });\n\n            if (data?.error) {\n                this.$store.product.toastError(`Failed to save specifications: ${data.error}`);\n                return;\n            }\n\n            this.$store.product.toastSuccess('Specifications saved successfully!');\n        } catch (err) {\n            console.error('Error saving specs:', err);\n            this.$store.product.toastError(`Error saving specifications: ${err?.message || 'Unknown error'}`);\n        }\n    },\n\n    async loadPublishingStatus() {\n        this.publishingLoading = true;\n        try {\n            const data = await httpJson(this.$store.product.getRoutes.publishingStatus);\n\n            this.publishingData = data || {};\n\n            // Initialize local state\n            const storeProduct = this.publishingData.store_product || {};\n            this.storeProductPublished = !!storeProduct.published;\n            this.originalStoreProductPublished = !!storeProduct.published;\n\n            // Store original country states\n            this.originalCountryStates = {};\n            (this.publishingData.countries || []).forEach(country => {\n                this.originalCountryStates[country.code] = !!country.published;\n            });\n\n            this.countryChanges = {};\n        } catch (err) {\n            console.error('Failed to load publishing status:', err);\n            this.$store.product.toastError(`Failed to load publishing status: ${err?.message || 'Unknown error'}`);\n        } finally {\n            this.publishingLoading = false;\n        }\n    },\n\n    markStoreProductChanged() {\n        // No need to do anything here - we\"ll check against original in hasPublishingChanges()\n        console.log(\"Store product changed to:\", this.storeProductPublished, \"original was:\", this.originalStoreProductPublished);\n    },\n\n    updateCountryPublished(countryCode, published) {\n        // Update the display data\n        const country = this.publishingData.countries.find(c => c.code === countryCode);\n        if (country) {\n            country.published = published;\n        }\n        console.log(`Country ${countryCode} changed to:`, published, \"original was:\", this.originalCountryStates[countryCode]);\n    },\n\n    hasPublishingChanges() {\n        // Check if store product changed from original\n        const storeChanged = this.storeProductPublished !== this.originalStoreProductPublished;\n        \n        // Check if any countries changed from original\n        const countriesChanged = (this.publishingData?.countries || []).some(country => {\n            return country.published !== this.originalCountryStates[country.code];\n        });\n        \n        console.log(\"Store changed:\", storeChanged, \"Countries changed:\", countriesChanged);\n        return storeChanged || countriesChanged;\n    },\n\n    async savePublishingChanges() {\n        console.log(\"savePublishingChanges called - hasChanges:\", this.hasPublishingChanges());\n\n        if (!this.hasPublishingChanges()) {\n            return { success: true, message: \"No publishing changes to save\" };\n        }\n\n        console.log(\"Saving changes - store changed:\", this.storeProductChanged, \"store published:\", this.storeProductPublished);\n        console.log(\"Country changes:\", this.countryChanges);\n\n        try {\n            // 1) Store product published/unpublished\n            if (this.storeProductPublished !== this.originalStoreProductPublished) {\n            console.log(\"Making store product request...\");\n            const data = await httpURLEncoded(this.$store.product.getRoutes.updateStoreProduct, {\n                published: this.storeProductPublished\n            });\n            console.log(\"Store response data:\", data);\n            if (data?.error) throw new Error(data.error || \"Failed to update store product\");\n            }\n\n            // 2) Country product changes\n            for (const country of (this.publishingData?.countries || [])) {\n            if (country.published !== this.originalCountryStates[country.code]) {\n                console.log(`Making country request for ${country.code}:`, country.published);\n                const data = await httpURLEncoded(this.$store.product.getRoutes.updateCountryProduct, {\n                country_code: country.code,\n                published: country.published\n                });\n                console.log(`Country ${country.code} response data:`, data);\n                if (data?.error) {\n                throw new Error(data.error || `Failed to update ${country.code} product`);\n                }\n            }\n            }\n\n            // 3) Reset originals after success\n            this.originalStoreProductPublished = this.storeProductPublished;\n            (this.publishingData?.countries || []).forEach(c => {\n                this.originalCountryStates[c.code] = c.published;\n            });\n\n            console.log(\"All publishing changes saved successfully\");\n            return { success: true, message: \"Publishing status updated successfully\" };\n        } catch (error) {\n            console.error(\"Publishing save error:\", error);\n            return { success: false, message: error.message };\n        }\n    },\n\n    getOverallPublishingStatus() {\n        if (!this.publishingData) return \"unknown\";\n        \n        const reasons = this.getNotShowingReasons();\n        const hasSerious = reasons.some(r => !r.includes(\"needs rebuilding\"));\n        \n        if (hasSerious) return \"error\";\n        \n        // Check if everything that exists is published\n        const baseOk = this.publishingData.base_product_published;\n        const storeOk = !this.publishingData.store_product?.exists || this.publishingData.store_product?.published;\n        const countriesOk = (this.publishingData.countries || []).every(c => !c.exists || c.published);\n        \n        if (baseOk && storeOk && countriesOk) return \"success\";\n        return \"warning\";\n    },\n\n    getNotShowingReasons() {\n        if (!this.publishingData) return [];\n        \n        const reasons = [];\n        \n        // Base product\n        if (!this.publishingData.base_product_published) {\n            reasons.push(\"Base product is unpublished\");\n        }\n        \n        // Base variants\n        if (this.variants && this.variants.length > 0 && this.variants.every(v => !v.published)) {\n            reasons.push(\"All base variants are unpublished\");\n        }\n        \n        // Country products and variants\n        (this.publishingData.countries || []).forEach(country => {\n            if (country.exists && !country.published) {\n                reasons.push(`Product isn't published in ${country.code}`);\n            }\n            \n            if (country.exists && this.variants && this.variants.length > 0) {\n                const hasPublishedCountryVariant = this.variants.some(v => \n                    v.country_variants && v.country_variants.some(cv => \n                        cv.country_code === country.code && cv.published\n                    )\n                );\n                if (!hasPublishedCountryVariant) {\n                    reasons.push(`This product has no published variants in ${country.code}`);\n                }\n            }\n        });\n        \n        // Store product\n        if (!this.publishingData.store_product?.exists) {\n            reasons.push(\"This product doesn&#x27;t have a store product\");\n        } else if (!this.publishingData.store_product?.published) {\n            reasons.push(\"This product isn&#x27;t published at Store Product Level\");\n        }\n        \n        // Store variants\n        if (this.publishingData.store_product?.exists && this.variants && this.variants.length > 0) {\n            const hasPublishedStoreVariant = this.variants.some(v => v.store_variant_published);\n            if (!hasPublishedStoreVariant) {\n                reasons.push(\"This product has no published store product variants\");\n            }\n        }\n        \n        // Complex check - fully published variants per country\n        if (this.publishingData.store_product?.exists && this.variants && this.variants.length > 0) {\n            (this.publishingData.countries || []).forEach(country => {\n                if (country.exists && country.published) {\n                    const hasFullyPublished = this.variants.some(v => {\n                        if (!v.published) return false;\n                        const cv = v.country_variants?.find(cv => cv.country_code === country.code);\n                        if (!cv || !cv.published) return false;\n                        return v.store_variant_published;\n                    });\n                    \n                    if (!hasFullyPublished && !reasons.some(r => \n                        r.includes(`variants in ${country.name}`) || \n                        r.includes(\"base variants are unpublished\") ||\n                        r.includes(\"store product variants\")\n                    )) {\n                        reasons.push(`No variants are published across all three levels - base, country, store in ${country.name}`);\n                    }\n                }\n            });\n        }\n        \n        // Default message\n        if (reasons.length === 0) {\n            reasons.push(\"Local store product needs rebuilding - save product to rebuild\");\n        }\n        \n        return reasons;\n    },\n\n    startVariantImageDrag(imageIndex, event) {\n        this.draggedImageIndex = imageIndex;\n        event.dataTransfer.effectAllowed = 'move';\n    },\n    \n    allowVariantImageDrop(event, targetIndex) {\n        if (this.draggedImageIndex !== null && this.draggedImageIndex !== targetIndex) {\n            event.preventDefault();\n        }\n    },\n    \n    async dropVariantImage(event, targetIndex, variant) {\n        event.preventDefault();\n\n        const fromIndex = this.draggedImageIndex;\n        if (fromIndex === null || fromIndex === targetIndex) {\n            this.draggedImageIndex = null;\n            return;\n        }\n\n        // Defensive: ensure the array exists\n        const current = Array.isArray(variant.variant_images) ? variant.variant_images : [];\n\n        // Reorder locally with util\n        const next = reorder(current, fromIndex, targetIndex);\n\n        // Build payload with new ranks\n        const images = next.map((img, i) => ({\n            product_page_file_id: img.product_page_file_id,\n            rank: i + 1,\n        }));\n\n        try {\n            // If you're using a routes map, swap to:\n            await httpJson(this.$store.product.getRoutes.variantImageReorder, {\n            method: 'POST',\n            body: {\n                variant_id: variant.id,\n                images,\n            },\n            });\n\n            // Reflect new order + ranks locally\n            variant.variant_images = next.map((img, i) => ({ ...img, rank: i + 1 }));\n\n            this.$store.product.toastSuccess('Variant images reordered successfully');\n        } catch (err) {\n            console.error('Failed to reorder images:', err);\n            this.$store.product.toastError(`Failed to reorder images: ${err?.message || 'Unknown error'}`);\n            // Keep your existing revert behavior if desired\n            location.reload();\n        } finally {\n            this.draggedImageIndex = null;\n        }\n    },\n    \n    async removeVariantImage(variantImage, variant) {\n        if (!confirm(`Remove ${variantImage.file_name} from this variant?`)) return;\n        \n        try {\n            const response = await fetch(this.$store.product.getRoutes.variantImageRemove, {\n                method: 'POST',\n                headers: {\n                    'Content-Type': 'application/json',\n                    'X-CSRFToken': document.querySelector('[name=csrfmiddlewaretoken]').value\n                },\n                body: JSON.stringify({\n                    variant_id: variant.id,\n                    product_page_file_id: variantImage.product_page_file_id\n                })\n            });\n            \n            if (response.ok) {\n                // Remove from local array\n                const index = variant.variant_images.findIndex(img => \n                    img.product_page_file_id === variantImage.product_page_file_id\n                );\n                if (index !== -1) {\n                    variant.variant_images.splice(index, 1);\n                }\n                this.$store.product.toastSuccess('Image removed from variant');\n            } else {\n                const errorData = await response.json();\n                throw new Error(errorData.error || 'Failed to remove image');\n            }\n        } catch (error) {\n            console.error('Failed to remove image:', error);\n            this.$store.product.toastError('Failed to remove image: ' + error.message);\n        }\n    },\n\n    async setHeroImage(product_page_file_id) {\n        try {\n            const response = await fetch(this.$store.product.getRoutes.heroImageSet, {\n                method: 'POST',\n                headers: {\n                    'Content-Type': 'application/json',\n                    'X-CSRFToken': document.querySelector('[name=csrfmiddlewaretoken]').value\n                },\n                body: JSON.stringify({\n                    product_page_file_id: product_page_file_id\n                })\n            });\n            \n            if (response.ok) {\n                // Refresh HTMX\n                this.$store.product.toastSuccess('Hero Image set');\n                console.log(document.querySelector('body'))\n                htmx.trigger(document.querySelector('body'), 'hero-image-updated');\n\n            } else {\n                const errorData = await response.json();\n                throw new Error(errorData.error || 'Failed to Set Hero Image');\n            }\n        } catch (error) {\n            console.error('Failed to Set Hero Image:', error);\n            this.$store.product.toastError('Failed to Set Hero Image: ' + error.message);\n        }\n    },\n\n    applyAISpecs(aiData) {\n        console.log('Applying AI specs:', aiData);\n        \n        // Apply suggested schema if available and none selected\n        if (!this.selectedSchema && aiData.suggestedSchema) {\n            this.selectedSchema = aiData.suggestedSchema;\n            // Load schema structure first, then apply values\n            this.loadSchemaStructure().then(() => {\n                this.applySpecValues(aiData.specValues);\n            });\n        } else if (aiData.specValues) {\n            // Schema already loaded or no schema suggested, apply values directly\n            this.applySpecValues(aiData.specValues);\n        }\n        \n        // Apply custom specs\n        if (aiData.customSpecs && Array.isArray(aiData.customSpecs)) {\n            aiData.customSpecs.forEach(customSpec => {\n                if (!this.customSpecs.find(spec => spec.name === customSpec.name)) {\n                    this.customSpecs.push({\n                        ...customSpec,\n                        id: Date.now() + Math.random(),\n                        is_new: true\n                    });\n                }\n            });\n        }\n        \n        // IMPORTANT: Expand the specs section to show results\n        this.specsCollapsed = false;\n    }\n\n\n            \n});\n\nexport default productFormManager;","/**\n * Shared utility functions for the product form\n */\n\n/**\n * Generates a URL-friendly slug from a given string\n * @param {string} text - The text to convert to a slug\n * @returns {string} - URL-friendly slug\n */\nexport function generateSlug(text) {\n    if (!text || typeof text !== 'string') {\n        return '';\n    }\n    \n    return text\n        .toLowerCase()\n        .trim()\n        // Replace spaces and underscores with hyphens\n        .replace(/[\\s_]+/g, '-')\n        // Remove special characters except hyphens\n        .replace(/[^a-z0-9-]/g, '')\n        // Remove multiple consecutive hyphens\n        .replace(/-+/g, '-')\n        // Remove leading/trailing hyphens\n        .replace(/^-+|-+$/g, '');\n}\n\nexport function getCsrfToken() {\n    // Django hidden input\n    const inp = document.querySelector('[name=csrfmiddlewaretoken]');\n    if (inp) return inp.value;\n    // Meta tag fallback\n    const meta = document.querySelector('meta[name=\"csrf-token\"]');\n    if (meta) return meta.getAttribute('content');\n    // Cookie fallback\n    const m = document.cookie.match(/(?:^|;\\s*)csrftoken=([^;]*)/);\n    return m ? decodeURIComponent(m[1]) : '';\n}\n\nexport function toFormUrlEncoded(obj = {}) {\n    return Object.entries(obj)\n        .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v ?? '')}`)\n        .join('&');\n}\n\nasync function handleResponse(res) {\n    const raw = await res.text();\n    let data = null;\n    try { data = raw ? JSON.parse(raw) : null; } catch { data = raw; }\n\n    if (!res.ok) {\n        const msg =\n        (data && typeof data === 'object' && data.error) ? data.error :\n        (typeof data === 'string' && data.length < 200) ? data :\n        `Request failed (${res.status})`;\n        const err = new Error(msg);\n        err.status = res.status;\n        err.data = data;\n        throw err;\n    }\n    return data;\n}\n\nexport async function httpJson(url, { method = 'GET', body, headers = {}, csrf = true } = {}) {\n    const init = { method, headers: { ...headers } };\n    if (body !== undefined) {\n        init.body = typeof body === 'string' ? body : JSON.stringify(body);\n        init.headers['Content-Type'] = 'application/json';\n    }\n    if (csrf) init.headers['X-CSRFToken'] = getCsrfToken();\n    const res = await fetch(url, init);\n    return handleResponse(res);\n}\n\nexport async function httpURLEncoded(url, params = {}, { method = 'POST', headers = {}, csrf = true } = {}) {\n    const init = {\n        method,\n        headers: { 'Content-Type': 'application/x-www-form-urlencoded', ...headers },\n        body: toFormUrlEncoded(params),\n    };\n    if (csrf) init.headers['X-CSRFToken'] = getCsrfToken();\n    const res = await fetch(url, init);\n    return handleResponse(res);\n}\n\nexport async function httpForm(url, formData, { method = 'POST', headers = {}, csrf = true } = {}) {\n    const init = { method, headers: { ...headers }, body: formData };\n    // Do NOT set Content-Type for FormData; browser sets boundary\n    if (csrf) init.headers['X-CSRFToken'] = getCsrfToken();\n    const res = await fetch(url, init);\n    return handleResponse(res);\n}\n\nexport function reorder(list, from, to) {\n    const arr = Array.isArray(list) ? [...list] : [];\n    const start = Math.max(0, Math.min(from, arr.length - 1));\n    const end   = Math.max(0, Math.min(to,   arr.length - 1));\n    if (start === end) return arr;\n    const [moved] = arr.splice(start, 1);\n    arr.splice(end, 0, moved);\n    return arr;\n}","document.addEventListener('alpine:init', () => {\n    Alpine.store('product', {\n        \n        showSaveProgressModal: false,\n        currentSavingStep: 0,\n        savingError: null,\n        savingStepLabels: [\n        'Update variants',\n        'Update country variants',\n        'Save specifications',\n        'Update publishing status',\n        'Create store product',\n        'Update store variants',\n        'Submit form'\n        ],\n        \n        productPk: null,\n        productSlug: null,\n        uploadedFiles: [],\n\n        routes: {},\n\n        toasts: [],\n\n        showAiSuggestions: false,\n\n        aiSuggestions: {\n            description: '',\n            categories: [],\n            specs: null\n        },\n\n\n        // Getters\n        get getProductPk(){\n            return this.productPk\n        },\n\n        get getProductSlug(){\n            return this.productSlug\n        },\n\n        get getUploadedFiles(){\n            return this.uploadedFiles\n        },\n\n        get getCurrentSavingStep() {\n            return this.currentSavingStep\n        },\n\n        get shouldShowSaveProgressModal() {\n            return this.showSaveProgressModal;\n        },\n\n        get getSavingError(){\n            return this.savingError;\n        },\n        \n        get getShowAiSuggestions(){\n            return this.showAiSuggestions;\n        },\n\n        get getRoutes(){ return this.routes; },\n\n\n\n        // Setters / mutators\n         \n        set setShowSaveProgressModal(value) {\n            this.showSaveProgressModal = value;\n        },\n        set setProductPk(value){\n            this.productPk = value;\n        },\n\n        set setProductSlug(value){\n            this.productSlug = value;\n        },\n\n        set setCurrentSavingStep(value) {\n            this.currentSavingStep = value;\n        },\n\n        set setSavingError(value){\n            this.savingError = value;\n        },\n\n        set setUploadedFiles(files) {\n            this.uploadedFiles = Array.isArray(files) ? files : [];\n        },\n\n        addOrUpdateFile(file) {\n            if (!file || file.id == null) return;\n            const idx = this.uploadedFiles.findIndex(f => f.id === file.id);\n            if (idx > -1) {\n                this.uploadedFiles[idx] = { ...this.uploadedFiles[idx], ...file };\n            } else {\n                this.uploadedFiles.push(file);\n            }\n        },\n\n        patchFile(id, patch) {\n            const idx = this.uploadedFiles.findIndex(f => f.id === id);\n            if (idx > -1) {\n                this.uploadedFiles[idx] = { ...this.uploadedFiles[idx], ...patch };\n            }\n        },\n\n        removeFileById(id) {\n            this.uploadedFiles = this.uploadedFiles.filter(f => f.id !== id);\n        },\n\n        // Toasts\n        toast(type, message, timeout = 3000) {\n            const id = `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n            this.toasts.push({ id, type, message });\n            setTimeout(() => {\n            this.toasts = this.toasts.filter(t => t.id !== id);\n            }, timeout);\n        },\n        toastSuccess(msg, t) { this.toast('success', msg, t); },\n        toastError(msg, t) { this.toast('error', msg, t); },\n\n        set setRoutes(obj){ this.routes = obj || {}; },\n\n        set setShowAiSuggestions(value){\n            this.showAiSuggestions = value;\n        },\n\n        set setAIDescription(description) {\n            this.aiSuggestions.description = description;\n        },\n\n        set setAICategories(categories) {\n            this.aiSuggestions.categories = Array.isArray(categories) ? categories : [];\n        },\n\n        set setAISpecs(specs) {\n            this.aiSuggestions.specs = specs;\n        },\n\n        startSaving(steps) {\n            if (Array.isArray(steps) && steps.length) this.savingSteps = steps;\n            this.currentSavingStep = 0;\n            this.savingError = '';\n            this.showSaveProgressModal = true;\n        },\n        advanceStep() {\n            if (this.currentSavingStep < this.savingSteps.length) this.currentSavingStep += 1;\n        },\n        failSaving(msg) {\n            this.savingError = msg || 'Something went wrong.';\n        },\n        finishSaving() {\n            this.currentSavingStep = this.savingSteps.length;\n        },\n        dismissProgressModal() {\n            this.showSaveProgressModal = false;\n        },\n\n        setSavingSteps(labels) {\n            this.savingStepLabels = Array.isArray(labels) ? labels : [];\n        }\n\n        \n    });\n});","/**\n * marked v4.3.0 - a markdown parser\n * Copyright (c) 2011-2023, Christopher Jeffrey. (MIT Licensed)\n * https://github.com/markedjs/marked\n */\n\n/**\n * DO NOT EDIT THIS FILE\n * The code in this file is generated from files in ./src/\n */\n\n'use strict';\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor);\n  }\n}\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  Object.defineProperty(Constructor, \"prototype\", {\n    writable: false\n  });\n  return Constructor;\n}\nfunction _extends() {\n  _extends = Object.assign ? Object.assign.bind() : function (target) {\n    for (var i = 1; i < arguments.length; i++) {\n      var source = arguments[i];\n      for (var key in source) {\n        if (Object.prototype.hasOwnProperty.call(source, key)) {\n          target[key] = source[key];\n        }\n      }\n    }\n    return target;\n  };\n  return _extends.apply(this, arguments);\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n  if (!o) return;\n  if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n  var n = Object.prototype.toString.call(o).slice(8, -1);\n  if (n === \"Object\" && o.constructor) n = o.constructor.name;\n  if (n === \"Map\" || n === \"Set\") return Array.from(o);\n  if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n  if (len == null || len > arr.length) len = arr.length;\n  for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n  return arr2;\n}\nfunction _createForOfIteratorHelperLoose(o, allowArrayLike) {\n  var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"];\n  if (it) return (it = it.call(o)).next.bind(it);\n  if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n    if (it) o = it;\n    var i = 0;\n    return function () {\n      if (i >= o.length) return {\n        done: true\n      };\n      return {\n        done: false,\n        value: o[i++]\n      };\n    };\n  }\n  throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nfunction _toPrimitive(input, hint) {\n  if (typeof input !== \"object\" || input === null) return input;\n  var prim = input[Symbol.toPrimitive];\n  if (prim !== undefined) {\n    var res = prim.call(input, hint || \"default\");\n    if (typeof res !== \"object\") return res;\n    throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n  }\n  return (hint === \"string\" ? String : Number)(input);\n}\nfunction _toPropertyKey(arg) {\n  var key = _toPrimitive(arg, \"string\");\n  return typeof key === \"symbol\" ? key : String(key);\n}\n\nfunction getDefaults() {\n  return {\n    async: false,\n    baseUrl: null,\n    breaks: false,\n    extensions: null,\n    gfm: true,\n    headerIds: true,\n    headerPrefix: '',\n    highlight: null,\n    hooks: null,\n    langPrefix: 'language-',\n    mangle: true,\n    pedantic: false,\n    renderer: null,\n    sanitize: false,\n    sanitizer: null,\n    silent: false,\n    smartypants: false,\n    tokenizer: null,\n    walkTokens: null,\n    xhtml: false\n  };\n}\nexports.defaults = getDefaults();\nfunction changeDefaults(newDefaults) {\n  exports.defaults = newDefaults;\n}\n\n/**\n * Helpers\n */\nvar escapeTest = /[&<>\"']/;\nvar escapeReplace = new RegExp(escapeTest.source, 'g');\nvar escapeTestNoEncode = /[<>\"']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/;\nvar escapeReplaceNoEncode = new RegExp(escapeTestNoEncode.source, 'g');\nvar escapeReplacements = {\n  '&': '&amp;',\n  '<': '&lt;',\n  '>': '&gt;',\n  '\"': '&quot;',\n  \"'\": '&#39;'\n};\nvar getEscapeReplacement = function getEscapeReplacement(ch) {\n  return escapeReplacements[ch];\n};\nfunction escape(html, encode) {\n  if (encode) {\n    if (escapeTest.test(html)) {\n      return html.replace(escapeReplace, getEscapeReplacement);\n    }\n  } else {\n    if (escapeTestNoEncode.test(html)) {\n      return html.replace(escapeReplaceNoEncode, getEscapeReplacement);\n    }\n  }\n  return html;\n}\nvar unescapeTest = /&(#(?:\\d+)|(?:#x[0-9A-Fa-f]+)|(?:\\w+));?/ig;\n\n/**\n * @param {string} html\n */\nfunction unescape(html) {\n  // explicitly match decimal, hex, and named HTML entities\n  return html.replace(unescapeTest, function (_, n) {\n    n = n.toLowerCase();\n    if (n === 'colon') return ':';\n    if (n.charAt(0) === '#') {\n      return n.charAt(1) === 'x' ? String.fromCharCode(parseInt(n.substring(2), 16)) : String.fromCharCode(+n.substring(1));\n    }\n    return '';\n  });\n}\nvar caret = /(^|[^\\[])\\^/g;\n\n/**\n * @param {string | RegExp} regex\n * @param {string} opt\n */\nfunction edit(regex, opt) {\n  regex = typeof regex === 'string' ? regex : regex.source;\n  opt = opt || '';\n  var obj = {\n    replace: function replace(name, val) {\n      val = val.source || val;\n      val = val.replace(caret, '$1');\n      regex = regex.replace(name, val);\n      return obj;\n    },\n    getRegex: function getRegex() {\n      return new RegExp(regex, opt);\n    }\n  };\n  return obj;\n}\nvar nonWordAndColonTest = /[^\\w:]/g;\nvar originIndependentUrl = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;\n\n/**\n * @param {boolean} sanitize\n * @param {string} base\n * @param {string} href\n */\nfunction cleanUrl(sanitize, base, href) {\n  if (sanitize) {\n    var prot;\n    try {\n      prot = decodeURIComponent(unescape(href)).replace(nonWordAndColonTest, '').toLowerCase();\n    } catch (e) {\n      return null;\n    }\n    if (prot.indexOf('javascript:') === 0 || prot.indexOf('vbscript:') === 0 || prot.indexOf('data:') === 0) {\n      return null;\n    }\n  }\n  if (base && !originIndependentUrl.test(href)) {\n    href = resolveUrl(base, href);\n  }\n  try {\n    href = encodeURI(href).replace(/%25/g, '%');\n  } catch (e) {\n    return null;\n  }\n  return href;\n}\nvar baseUrls = {};\nvar justDomain = /^[^:]+:\\/*[^/]*$/;\nvar protocol = /^([^:]+:)[\\s\\S]*$/;\nvar domain = /^([^:]+:\\/*[^/]*)[\\s\\S]*$/;\n\n/**\n * @param {string} base\n * @param {string} href\n */\nfunction resolveUrl(base, href) {\n  if (!baseUrls[' ' + base]) {\n    // we can ignore everything in base after the last slash of its path component,\n    // but we might need to add _that_\n    // https://tools.ietf.org/html/rfc3986#section-3\n    if (justDomain.test(base)) {\n      baseUrls[' ' + base] = base + '/';\n    } else {\n      baseUrls[' ' + base] = rtrim(base, '/', true);\n    }\n  }\n  base = baseUrls[' ' + base];\n  var relativeBase = base.indexOf(':') === -1;\n  if (href.substring(0, 2) === '//') {\n    if (relativeBase) {\n      return href;\n    }\n    return base.replace(protocol, '$1') + href;\n  } else if (href.charAt(0) === '/') {\n    if (relativeBase) {\n      return href;\n    }\n    return base.replace(domain, '$1') + href;\n  } else {\n    return base + href;\n  }\n}\nvar noopTest = {\n  exec: function noopTest() {}\n};\nfunction splitCells(tableRow, count) {\n  // ensure that every cell-delimiting pipe has a space\n  // before it to distinguish it from an escaped pipe\n  var row = tableRow.replace(/\\|/g, function (match, offset, str) {\n      var escaped = false,\n        curr = offset;\n      while (--curr >= 0 && str[curr] === '\\\\') {\n        escaped = !escaped;\n      }\n      if (escaped) {\n        // odd number of slashes means | is escaped\n        // so we leave it alone\n        return '|';\n      } else {\n        // add space before unescaped |\n        return ' |';\n      }\n    }),\n    cells = row.split(/ \\|/);\n  var i = 0;\n\n  // First/last cell in a row cannot be empty if it has no leading/trailing pipe\n  if (!cells[0].trim()) {\n    cells.shift();\n  }\n  if (cells.length > 0 && !cells[cells.length - 1].trim()) {\n    cells.pop();\n  }\n  if (cells.length > count) {\n    cells.splice(count);\n  } else {\n    while (cells.length < count) {\n      cells.push('');\n    }\n  }\n  for (; i < cells.length; i++) {\n    // leading or trailing whitespace is ignored per the gfm spec\n    cells[i] = cells[i].trim().replace(/\\\\\\|/g, '|');\n  }\n  return cells;\n}\n\n/**\n * Remove trailing 'c's. Equivalent to str.replace(/c*$/, '').\n * /c*$/ is vulnerable to REDOS.\n *\n * @param {string} str\n * @param {string} c\n * @param {boolean} invert Remove suffix of non-c chars instead. Default falsey.\n */\nfunction rtrim(str, c, invert) {\n  var l = str.length;\n  if (l === 0) {\n    return '';\n  }\n\n  // Length of suffix matching the invert condition.\n  var suffLen = 0;\n\n  // Step left until we fail to match the invert condition.\n  while (suffLen < l) {\n    var currChar = str.charAt(l - suffLen - 1);\n    if (currChar === c && !invert) {\n      suffLen++;\n    } else if (currChar !== c && invert) {\n      suffLen++;\n    } else {\n      break;\n    }\n  }\n  return str.slice(0, l - suffLen);\n}\nfunction findClosingBracket(str, b) {\n  if (str.indexOf(b[1]) === -1) {\n    return -1;\n  }\n  var l = str.length;\n  var level = 0,\n    i = 0;\n  for (; i < l; i++) {\n    if (str[i] === '\\\\') {\n      i++;\n    } else if (str[i] === b[0]) {\n      level++;\n    } else if (str[i] === b[1]) {\n      level--;\n      if (level < 0) {\n        return i;\n      }\n    }\n  }\n  return -1;\n}\nfunction checkSanitizeDeprecation(opt) {\n  if (opt && opt.sanitize && !opt.silent) {\n    console.warn('marked(): sanitize and sanitizer parameters are deprecated since version 0.7.0, should not be used and will be removed in the future. Read more here: https://marked.js.org/#/USING_ADVANCED.md#options');\n  }\n}\n\n// copied from https://stackoverflow.com/a/5450113/806777\n/**\n * @param {string} pattern\n * @param {number} count\n */\nfunction repeatString(pattern, count) {\n  if (count < 1) {\n    return '';\n  }\n  var result = '';\n  while (count > 1) {\n    if (count & 1) {\n      result += pattern;\n    }\n    count >>= 1;\n    pattern += pattern;\n  }\n  return result + pattern;\n}\n\nfunction outputLink(cap, link, raw, lexer) {\n  var href = link.href;\n  var title = link.title ? escape(link.title) : null;\n  var text = cap[1].replace(/\\\\([\\[\\]])/g, '$1');\n  if (cap[0].charAt(0) !== '!') {\n    lexer.state.inLink = true;\n    var token = {\n      type: 'link',\n      raw: raw,\n      href: href,\n      title: title,\n      text: text,\n      tokens: lexer.inlineTokens(text)\n    };\n    lexer.state.inLink = false;\n    return token;\n  }\n  return {\n    type: 'image',\n    raw: raw,\n    href: href,\n    title: title,\n    text: escape(text)\n  };\n}\nfunction indentCodeCompensation(raw, text) {\n  var matchIndentToCode = raw.match(/^(\\s+)(?:```)/);\n  if (matchIndentToCode === null) {\n    return text;\n  }\n  var indentToCode = matchIndentToCode[1];\n  return text.split('\\n').map(function (node) {\n    var matchIndentInNode = node.match(/^\\s+/);\n    if (matchIndentInNode === null) {\n      return node;\n    }\n    var indentInNode = matchIndentInNode[0];\n    if (indentInNode.length >= indentToCode.length) {\n      return node.slice(indentToCode.length);\n    }\n    return node;\n  }).join('\\n');\n}\n\n/**\n * Tokenizer\n */\nvar Tokenizer = /*#__PURE__*/function () {\n  function Tokenizer(options) {\n    this.options = options || exports.defaults;\n  }\n  var _proto = Tokenizer.prototype;\n  _proto.space = function space(src) {\n    var cap = this.rules.block.newline.exec(src);\n    if (cap && cap[0].length > 0) {\n      return {\n        type: 'space',\n        raw: cap[0]\n      };\n    }\n  };\n  _proto.code = function code(src) {\n    var cap = this.rules.block.code.exec(src);\n    if (cap) {\n      var text = cap[0].replace(/^ {1,4}/gm, '');\n      return {\n        type: 'code',\n        raw: cap[0],\n        codeBlockStyle: 'indented',\n        text: !this.options.pedantic ? rtrim(text, '\\n') : text\n      };\n    }\n  };\n  _proto.fences = function fences(src) {\n    var cap = this.rules.block.fences.exec(src);\n    if (cap) {\n      var raw = cap[0];\n      var text = indentCodeCompensation(raw, cap[3] || '');\n      return {\n        type: 'code',\n        raw: raw,\n        lang: cap[2] ? cap[2].trim().replace(this.rules.inline._escapes, '$1') : cap[2],\n        text: text\n      };\n    }\n  };\n  _proto.heading = function heading(src) {\n    var cap = this.rules.block.heading.exec(src);\n    if (cap) {\n      var text = cap[2].trim();\n\n      // remove trailing #s\n      if (/#$/.test(text)) {\n        var trimmed = rtrim(text, '#');\n        if (this.options.pedantic) {\n          text = trimmed.trim();\n        } else if (!trimmed || / $/.test(trimmed)) {\n          // CommonMark requires space before trailing #s\n          text = trimmed.trim();\n        }\n      }\n      return {\n        type: 'heading',\n        raw: cap[0],\n        depth: cap[1].length,\n        text: text,\n        tokens: this.lexer.inline(text)\n      };\n    }\n  };\n  _proto.hr = function hr(src) {\n    var cap = this.rules.block.hr.exec(src);\n    if (cap) {\n      return {\n        type: 'hr',\n        raw: cap[0]\n      };\n    }\n  };\n  _proto.blockquote = function blockquote(src) {\n    var cap = this.rules.block.blockquote.exec(src);\n    if (cap) {\n      var text = cap[0].replace(/^ *>[ \\t]?/gm, '');\n      var top = this.lexer.state.top;\n      this.lexer.state.top = true;\n      var tokens = this.lexer.blockTokens(text);\n      this.lexer.state.top = top;\n      return {\n        type: 'blockquote',\n        raw: cap[0],\n        tokens: tokens,\n        text: text\n      };\n    }\n  };\n  _proto.list = function list(src) {\n    var cap = this.rules.block.list.exec(src);\n    if (cap) {\n      var raw, istask, ischecked, indent, i, blankLine, endsWithBlankLine, line, nextLine, rawLine, itemContents, endEarly;\n      var bull = cap[1].trim();\n      var isordered = bull.length > 1;\n      var list = {\n        type: 'list',\n        raw: '',\n        ordered: isordered,\n        start: isordered ? +bull.slice(0, -1) : '',\n        loose: false,\n        items: []\n      };\n      bull = isordered ? \"\\\\d{1,9}\\\\\" + bull.slice(-1) : \"\\\\\" + bull;\n      if (this.options.pedantic) {\n        bull = isordered ? bull : '[*+-]';\n      }\n\n      // Get next list item\n      var itemRegex = new RegExp(\"^( {0,3}\" + bull + \")((?:[\\t ][^\\\\n]*)?(?:\\\\n|$))\");\n\n      // Check if current bullet point can start a new List Item\n      while (src) {\n        endEarly = false;\n        if (!(cap = itemRegex.exec(src))) {\n          break;\n        }\n        if (this.rules.block.hr.test(src)) {\n          // End list if bullet was actually HR (possibly move into itemRegex?)\n          break;\n        }\n        raw = cap[0];\n        src = src.substring(raw.length);\n        line = cap[2].split('\\n', 1)[0].replace(/^\\t+/, function (t) {\n          return ' '.repeat(3 * t.length);\n        });\n        nextLine = src.split('\\n', 1)[0];\n        if (this.options.pedantic) {\n          indent = 2;\n          itemContents = line.trimLeft();\n        } else {\n          indent = cap[2].search(/[^ ]/); // Find first non-space char\n          indent = indent > 4 ? 1 : indent; // Treat indented code blocks (> 4 spaces) as having only 1 indent\n          itemContents = line.slice(indent);\n          indent += cap[1].length;\n        }\n        blankLine = false;\n        if (!line && /^ *$/.test(nextLine)) {\n          // Items begin with at most one blank line\n          raw += nextLine + '\\n';\n          src = src.substring(nextLine.length + 1);\n          endEarly = true;\n        }\n        if (!endEarly) {\n          var nextBulletRegex = new RegExp(\"^ {0,\" + Math.min(3, indent - 1) + \"}(?:[*+-]|\\\\d{1,9}[.)])((?:[ \\t][^\\\\n]*)?(?:\\\\n|$))\");\n          var hrRegex = new RegExp(\"^ {0,\" + Math.min(3, indent - 1) + \"}((?:- *){3,}|(?:_ *){3,}|(?:\\\\* *){3,})(?:\\\\n+|$)\");\n          var fencesBeginRegex = new RegExp(\"^ {0,\" + Math.min(3, indent - 1) + \"}(?:```|~~~)\");\n          var headingBeginRegex = new RegExp(\"^ {0,\" + Math.min(3, indent - 1) + \"}#\");\n\n          // Check if following lines should be included in List Item\n          while (src) {\n            rawLine = src.split('\\n', 1)[0];\n            nextLine = rawLine;\n\n            // Re-align to follow commonmark nesting rules\n            if (this.options.pedantic) {\n              nextLine = nextLine.replace(/^ {1,4}(?=( {4})*[^ ])/g, '  ');\n            }\n\n            // End list item if found code fences\n            if (fencesBeginRegex.test(nextLine)) {\n              break;\n            }\n\n            // End list item if found start of new heading\n            if (headingBeginRegex.test(nextLine)) {\n              break;\n            }\n\n            // End list item if found start of new bullet\n            if (nextBulletRegex.test(nextLine)) {\n              break;\n            }\n\n            // Horizontal rule found\n            if (hrRegex.test(src)) {\n              break;\n            }\n            if (nextLine.search(/[^ ]/) >= indent || !nextLine.trim()) {\n              // Dedent if possible\n              itemContents += '\\n' + nextLine.slice(indent);\n            } else {\n              // not enough indentation\n              if (blankLine) {\n                break;\n              }\n\n              // paragraph continuation unless last line was a different block level element\n              if (line.search(/[^ ]/) >= 4) {\n                // indented code block\n                break;\n              }\n              if (fencesBeginRegex.test(line)) {\n                break;\n              }\n              if (headingBeginRegex.test(line)) {\n                break;\n              }\n              if (hrRegex.test(line)) {\n                break;\n              }\n              itemContents += '\\n' + nextLine;\n            }\n            if (!blankLine && !nextLine.trim()) {\n              // Check if current line is blank\n              blankLine = true;\n            }\n            raw += rawLine + '\\n';\n            src = src.substring(rawLine.length + 1);\n            line = nextLine.slice(indent);\n          }\n        }\n        if (!list.loose) {\n          // If the previous item ended with a blank line, the list is loose\n          if (endsWithBlankLine) {\n            list.loose = true;\n          } else if (/\\n *\\n *$/.test(raw)) {\n            endsWithBlankLine = true;\n          }\n        }\n\n        // Check for task list items\n        if (this.options.gfm) {\n          istask = /^\\[[ xX]\\] /.exec(itemContents);\n          if (istask) {\n            ischecked = istask[0] !== '[ ] ';\n            itemContents = itemContents.replace(/^\\[[ xX]\\] +/, '');\n          }\n        }\n        list.items.push({\n          type: 'list_item',\n          raw: raw,\n          task: !!istask,\n          checked: ischecked,\n          loose: false,\n          text: itemContents\n        });\n        list.raw += raw;\n      }\n\n      // Do not consume newlines at end of final item. Alternatively, make itemRegex *start* with any newlines to simplify/speed up endsWithBlankLine logic\n      list.items[list.items.length - 1].raw = raw.trimRight();\n      list.items[list.items.length - 1].text = itemContents.trimRight();\n      list.raw = list.raw.trimRight();\n      var l = list.items.length;\n\n      // Item child tokens handled here at end because we needed to have the final item to trim it first\n      for (i = 0; i < l; i++) {\n        this.lexer.state.top = false;\n        list.items[i].tokens = this.lexer.blockTokens(list.items[i].text, []);\n        if (!list.loose) {\n          // Check if list should be loose\n          var spacers = list.items[i].tokens.filter(function (t) {\n            return t.type === 'space';\n          });\n          var hasMultipleLineBreaks = spacers.length > 0 && spacers.some(function (t) {\n            return /\\n.*\\n/.test(t.raw);\n          });\n          list.loose = hasMultipleLineBreaks;\n        }\n      }\n\n      // Set all items to loose if list is loose\n      if (list.loose) {\n        for (i = 0; i < l; i++) {\n          list.items[i].loose = true;\n        }\n      }\n      return list;\n    }\n  };\n  _proto.html = function html(src) {\n    var cap = this.rules.block.html.exec(src);\n    if (cap) {\n      var token = {\n        type: 'html',\n        raw: cap[0],\n        pre: !this.options.sanitizer && (cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style'),\n        text: cap[0]\n      };\n      if (this.options.sanitize) {\n        var text = this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape(cap[0]);\n        token.type = 'paragraph';\n        token.text = text;\n        token.tokens = this.lexer.inline(text);\n      }\n      return token;\n    }\n  };\n  _proto.def = function def(src) {\n    var cap = this.rules.block.def.exec(src);\n    if (cap) {\n      var tag = cap[1].toLowerCase().replace(/\\s+/g, ' ');\n      var href = cap[2] ? cap[2].replace(/^<(.*)>$/, '$1').replace(this.rules.inline._escapes, '$1') : '';\n      var title = cap[3] ? cap[3].substring(1, cap[3].length - 1).replace(this.rules.inline._escapes, '$1') : cap[3];\n      return {\n        type: 'def',\n        tag: tag,\n        raw: cap[0],\n        href: href,\n        title: title\n      };\n    }\n  };\n  _proto.table = function table(src) {\n    var cap = this.rules.block.table.exec(src);\n    if (cap) {\n      var item = {\n        type: 'table',\n        header: splitCells(cap[1]).map(function (c) {\n          return {\n            text: c\n          };\n        }),\n        align: cap[2].replace(/^ *|\\| *$/g, '').split(/ *\\| */),\n        rows: cap[3] && cap[3].trim() ? cap[3].replace(/\\n[ \\t]*$/, '').split('\\n') : []\n      };\n      if (item.header.length === item.align.length) {\n        item.raw = cap[0];\n        var l = item.align.length;\n        var i, j, k, row;\n        for (i = 0; i < l; i++) {\n          if (/^ *-+: *$/.test(item.align[i])) {\n            item.align[i] = 'right';\n          } else if (/^ *:-+: *$/.test(item.align[i])) {\n            item.align[i] = 'center';\n          } else if (/^ *:-+ *$/.test(item.align[i])) {\n            item.align[i] = 'left';\n          } else {\n            item.align[i] = null;\n          }\n        }\n        l = item.rows.length;\n        for (i = 0; i < l; i++) {\n          item.rows[i] = splitCells(item.rows[i], item.header.length).map(function (c) {\n            return {\n              text: c\n            };\n          });\n        }\n\n        // parse child tokens inside headers and cells\n\n        // header child tokens\n        l = item.header.length;\n        for (j = 0; j < l; j++) {\n          item.header[j].tokens = this.lexer.inline(item.header[j].text);\n        }\n\n        // cell child tokens\n        l = item.rows.length;\n        for (j = 0; j < l; j++) {\n          row = item.rows[j];\n          for (k = 0; k < row.length; k++) {\n            row[k].tokens = this.lexer.inline(row[k].text);\n          }\n        }\n        return item;\n      }\n    }\n  };\n  _proto.lheading = function lheading(src) {\n    var cap = this.rules.block.lheading.exec(src);\n    if (cap) {\n      return {\n        type: 'heading',\n        raw: cap[0],\n        depth: cap[2].charAt(0) === '=' ? 1 : 2,\n        text: cap[1],\n        tokens: this.lexer.inline(cap[1])\n      };\n    }\n  };\n  _proto.paragraph = function paragraph(src) {\n    var cap = this.rules.block.paragraph.exec(src);\n    if (cap) {\n      var text = cap[1].charAt(cap[1].length - 1) === '\\n' ? cap[1].slice(0, -1) : cap[1];\n      return {\n        type: 'paragraph',\n        raw: cap[0],\n        text: text,\n        tokens: this.lexer.inline(text)\n      };\n    }\n  };\n  _proto.text = function text(src) {\n    var cap = this.rules.block.text.exec(src);\n    if (cap) {\n      return {\n        type: 'text',\n        raw: cap[0],\n        text: cap[0],\n        tokens: this.lexer.inline(cap[0])\n      };\n    }\n  };\n  _proto.escape = function escape$1(src) {\n    var cap = this.rules.inline.escape.exec(src);\n    if (cap) {\n      return {\n        type: 'escape',\n        raw: cap[0],\n        text: escape(cap[1])\n      };\n    }\n  };\n  _proto.tag = function tag(src) {\n    var cap = this.rules.inline.tag.exec(src);\n    if (cap) {\n      if (!this.lexer.state.inLink && /^<a /i.test(cap[0])) {\n        this.lexer.state.inLink = true;\n      } else if (this.lexer.state.inLink && /^<\\/a>/i.test(cap[0])) {\n        this.lexer.state.inLink = false;\n      }\n      if (!this.lexer.state.inRawBlock && /^<(pre|code|kbd|script)(\\s|>)/i.test(cap[0])) {\n        this.lexer.state.inRawBlock = true;\n      } else if (this.lexer.state.inRawBlock && /^<\\/(pre|code|kbd|script)(\\s|>)/i.test(cap[0])) {\n        this.lexer.state.inRawBlock = false;\n      }\n      return {\n        type: this.options.sanitize ? 'text' : 'html',\n        raw: cap[0],\n        inLink: this.lexer.state.inLink,\n        inRawBlock: this.lexer.state.inRawBlock,\n        text: this.options.sanitize ? this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape(cap[0]) : cap[0]\n      };\n    }\n  };\n  _proto.link = function link(src) {\n    var cap = this.rules.inline.link.exec(src);\n    if (cap) {\n      var trimmedUrl = cap[2].trim();\n      if (!this.options.pedantic && /^</.test(trimmedUrl)) {\n        // commonmark requires matching angle brackets\n        if (!/>$/.test(trimmedUrl)) {\n          return;\n        }\n\n        // ending angle bracket cannot be escaped\n        var rtrimSlash = rtrim(trimmedUrl.slice(0, -1), '\\\\');\n        if ((trimmedUrl.length - rtrimSlash.length) % 2 === 0) {\n          return;\n        }\n      } else {\n        // find closing parenthesis\n        var lastParenIndex = findClosingBracket(cap[2], '()');\n        if (lastParenIndex > -1) {\n          var start = cap[0].indexOf('!') === 0 ? 5 : 4;\n          var linkLen = start + cap[1].length + lastParenIndex;\n          cap[2] = cap[2].substring(0, lastParenIndex);\n          cap[0] = cap[0].substring(0, linkLen).trim();\n          cap[3] = '';\n        }\n      }\n      var href = cap[2];\n      var title = '';\n      if (this.options.pedantic) {\n        // split pedantic href and title\n        var link = /^([^'\"]*[^\\s])\\s+(['\"])(.*)\\2/.exec(href);\n        if (link) {\n          href = link[1];\n          title = link[3];\n        }\n      } else {\n        title = cap[3] ? cap[3].slice(1, -1) : '';\n      }\n      href = href.trim();\n      if (/^</.test(href)) {\n        if (this.options.pedantic && !/>$/.test(trimmedUrl)) {\n          // pedantic allows starting angle bracket without ending angle bracket\n          href = href.slice(1);\n        } else {\n          href = href.slice(1, -1);\n        }\n      }\n      return outputLink(cap, {\n        href: href ? href.replace(this.rules.inline._escapes, '$1') : href,\n        title: title ? title.replace(this.rules.inline._escapes, '$1') : title\n      }, cap[0], this.lexer);\n    }\n  };\n  _proto.reflink = function reflink(src, links) {\n    var cap;\n    if ((cap = this.rules.inline.reflink.exec(src)) || (cap = this.rules.inline.nolink.exec(src))) {\n      var link = (cap[2] || cap[1]).replace(/\\s+/g, ' ');\n      link = links[link.toLowerCase()];\n      if (!link) {\n        var text = cap[0].charAt(0);\n        return {\n          type: 'text',\n          raw: text,\n          text: text\n        };\n      }\n      return outputLink(cap, link, cap[0], this.lexer);\n    }\n  };\n  _proto.emStrong = function emStrong(src, maskedSrc, prevChar) {\n    if (prevChar === void 0) {\n      prevChar = '';\n    }\n    var match = this.rules.inline.emStrong.lDelim.exec(src);\n    if (!match) return;\n\n    // _ can't be between two alphanumerics. \\p{L}\\p{N} includes non-english alphabet/numbers as well\n    if (match[3] && prevChar.match(/(?:[0-9A-Za-z\\xAA\\xB2\\xB3\\xB5\\xB9\\xBA\\xBC-\\xBE\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0560-\\u0588\\u05D0-\\u05EA\\u05EF-\\u05F2\\u0620-\\u064A\\u0660-\\u0669\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07C0-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u0860-\\u086A\\u0870-\\u0887\\u0889-\\u088E\\u08A0-\\u08C9\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0966-\\u096F\\u0971-\\u0980\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09E6-\\u09F1\\u09F4-\\u09F9\\u09FC\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A66-\\u0A6F\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0AE6-\\u0AEF\\u0AF9\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B66-\\u0B6F\\u0B71-\\u0B77\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0BE6-\\u0BF2\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D\\u0C58-\\u0C5A\\u0C5D\\u0C60\\u0C61\\u0C66-\\u0C6F\\u0C78-\\u0C7E\\u0C80\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDD\\u0CDE\\u0CE0\\u0CE1\\u0CE6-\\u0CEF\\u0CF1\\u0CF2\\u0D04-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D54-\\u0D56\\u0D58-\\u0D61\\u0D66-\\u0D78\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0DE6-\\u0DEF\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E50-\\u0E59\\u0E81\\u0E82\\u0E84\\u0E86-\\u0E8A\\u0E8C-\\u0EA3\\u0EA5\\u0EA7-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0ED0-\\u0ED9\\u0EDC-\\u0EDF\\u0F00\\u0F20-\\u0F33\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F-\\u1049\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u1090-\\u1099\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1369-\\u137C\\u1380-\\u138F\\u13A0-\\u13F5\\u13F8-\\u13FD\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16EE-\\u16F8\\u1700-\\u1711\\u171F-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u17E0-\\u17E9\\u17F0-\\u17F9\\u1810-\\u1819\\u1820-\\u1878\\u1880-\\u1884\\u1887-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1946-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u19D0-\\u19DA\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1A80-\\u1A89\\u1A90-\\u1A99\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4C\\u1B50-\\u1B59\\u1B83-\\u1BA0\\u1BAE-\\u1BE5\\u1C00-\\u1C23\\u1C40-\\u1C49\\u1C4D-\\u1C7D\\u1C80-\\u1C88\\u1C90-\\u1CBA\\u1CBD-\\u1CBF\\u1CE9-\\u1CEC\\u1CEE-\\u1CF3\\u1CF5\\u1CF6\\u1CFA\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2070\\u2071\\u2074-\\u2079\\u207F-\\u2089\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2150-\\u2189\\u2460-\\u249B\\u24EA-\\u24FF\\u2776-\\u2793\\u2C00-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2CFD\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005-\\u3007\\u3021-\\u3029\\u3031-\\u3035\\u3038-\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312F\\u3131-\\u318E\\u3192-\\u3195\\u31A0-\\u31BF\\u31F0-\\u31FF\\u3220-\\u3229\\u3248-\\u324F\\u3251-\\u325F\\u3280-\\u3289\\u32B1-\\u32BF\\u3400-\\u4DBF\\u4E00-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA62B\\uA640-\\uA66E\\uA67F-\\uA69D\\uA6A0-\\uA6EF\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA7CA\\uA7D0\\uA7D1\\uA7D3\\uA7D5-\\uA7D9\\uA7F2-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA830-\\uA835\\uA840-\\uA873\\uA882-\\uA8B3\\uA8D0-\\uA8D9\\uA8F2-\\uA8F7\\uA8FB\\uA8FD\\uA8FE\\uA900-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF-\\uA9D9\\uA9E0-\\uA9E4\\uA9E6-\\uA9FE\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA50-\\uAA59\\uAA60-\\uAA76\\uAA7A\\uAA7E-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB69\\uAB70-\\uABE2\\uABF0-\\uABF9\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF10-\\uFF19\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]|\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA\\uDD07-\\uDD33\\uDD40-\\uDD78\\uDD8A\\uDD8B\\uDE80-\\uDE9C\\uDEA0-\\uDED0\\uDEE1-\\uDEFB\\uDF00-\\uDF23\\uDF2D-\\uDF4A\\uDF50-\\uDF75\\uDF80-\\uDF9D\\uDFA0-\\uDFC3\\uDFC8-\\uDFCF\\uDFD1-\\uDFD5]|\\uD801[\\uDC00-\\uDC9D\\uDCA0-\\uDCA9\\uDCB0-\\uDCD3\\uDCD8-\\uDCFB\\uDD00-\\uDD27\\uDD30-\\uDD63\\uDD70-\\uDD7A\\uDD7C-\\uDD8A\\uDD8C-\\uDD92\\uDD94\\uDD95\\uDD97-\\uDDA1\\uDDA3-\\uDDB1\\uDDB3-\\uDDB9\\uDDBB\\uDDBC\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67\\uDF80-\\uDF85\\uDF87-\\uDFB0\\uDFB2-\\uDFBA]|\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F-\\uDC55\\uDC58-\\uDC76\\uDC79-\\uDC9E\\uDCA7-\\uDCAF\\uDCE0-\\uDCF2\\uDCF4\\uDCF5\\uDCFB-\\uDD1B\\uDD20-\\uDD39\\uDD80-\\uDDB7\\uDDBC-\\uDDCF\\uDDD2-\\uDE00\\uDE10-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE35\\uDE40-\\uDE48\\uDE60-\\uDE7E\\uDE80-\\uDE9F\\uDEC0-\\uDEC7\\uDEC9-\\uDEE4\\uDEEB-\\uDEEF\\uDF00-\\uDF35\\uDF40-\\uDF55\\uDF58-\\uDF72\\uDF78-\\uDF91\\uDFA9-\\uDFAF]|\\uD803[\\uDC00-\\uDC48\\uDC80-\\uDCB2\\uDCC0-\\uDCF2\\uDCFA-\\uDD23\\uDD30-\\uDD39\\uDE60-\\uDE7E\\uDE80-\\uDEA9\\uDEB0\\uDEB1\\uDF00-\\uDF27\\uDF30-\\uDF45\\uDF51-\\uDF54\\uDF70-\\uDF81\\uDFB0-\\uDFCB\\uDFE0-\\uDFF6]|\\uD804[\\uDC03-\\uDC37\\uDC52-\\uDC6F\\uDC71\\uDC72\\uDC75\\uDC83-\\uDCAF\\uDCD0-\\uDCE8\\uDCF0-\\uDCF9\\uDD03-\\uDD26\\uDD36-\\uDD3F\\uDD44\\uDD47\\uDD50-\\uDD72\\uDD76\\uDD83-\\uDDB2\\uDDC1-\\uDDC4\\uDDD0-\\uDDDA\\uDDDC\\uDDE1-\\uDDF4\\uDE00-\\uDE11\\uDE13-\\uDE2B\\uDE80-\\uDE86\\uDE88\\uDE8A-\\uDE8D\\uDE8F-\\uDE9D\\uDE9F-\\uDEA8\\uDEB0-\\uDEDE\\uDEF0-\\uDEF9\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3D\\uDF50\\uDF5D-\\uDF61]|\\uD805[\\uDC00-\\uDC34\\uDC47-\\uDC4A\\uDC50-\\uDC59\\uDC5F-\\uDC61\\uDC80-\\uDCAF\\uDCC4\\uDCC5\\uDCC7\\uDCD0-\\uDCD9\\uDD80-\\uDDAE\\uDDD8-\\uDDDB\\uDE00-\\uDE2F\\uDE44\\uDE50-\\uDE59\\uDE80-\\uDEAA\\uDEB8\\uDEC0-\\uDEC9\\uDF00-\\uDF1A\\uDF30-\\uDF3B\\uDF40-\\uDF46]|\\uD806[\\uDC00-\\uDC2B\\uDCA0-\\uDCF2\\uDCFF-\\uDD06\\uDD09\\uDD0C-\\uDD13\\uDD15\\uDD16\\uDD18-\\uDD2F\\uDD3F\\uDD41\\uDD50-\\uDD59\\uDDA0-\\uDDA7\\uDDAA-\\uDDD0\\uDDE1\\uDDE3\\uDE00\\uDE0B-\\uDE32\\uDE3A\\uDE50\\uDE5C-\\uDE89\\uDE9D\\uDEB0-\\uDEF8]|\\uD807[\\uDC00-\\uDC08\\uDC0A-\\uDC2E\\uDC40\\uDC50-\\uDC6C\\uDC72-\\uDC8F\\uDD00-\\uDD06\\uDD08\\uDD09\\uDD0B-\\uDD30\\uDD46\\uDD50-\\uDD59\\uDD60-\\uDD65\\uDD67\\uDD68\\uDD6A-\\uDD89\\uDD98\\uDDA0-\\uDDA9\\uDEE0-\\uDEF2\\uDFB0\\uDFC0-\\uDFD4]|\\uD808[\\uDC00-\\uDF99]|\\uD809[\\uDC00-\\uDC6E\\uDC80-\\uDD43]|\\uD80B[\\uDF90-\\uDFF0]|[\\uD80C\\uD81C-\\uD820\\uD822\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872\\uD874-\\uD879\\uD880-\\uD883][\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]|\\uD811[\\uDC00-\\uDE46]|\\uD81A[\\uDC00-\\uDE38\\uDE40-\\uDE5E\\uDE60-\\uDE69\\uDE70-\\uDEBE\\uDEC0-\\uDEC9\\uDED0-\\uDEED\\uDF00-\\uDF2F\\uDF40-\\uDF43\\uDF50-\\uDF59\\uDF5B-\\uDF61\\uDF63-\\uDF77\\uDF7D-\\uDF8F]|\\uD81B[\\uDE40-\\uDE96\\uDF00-\\uDF4A\\uDF50\\uDF93-\\uDF9F\\uDFE0\\uDFE1\\uDFE3]|\\uD821[\\uDC00-\\uDFF7]|\\uD823[\\uDC00-\\uDCD5\\uDD00-\\uDD08]|\\uD82B[\\uDFF0-\\uDFF3\\uDFF5-\\uDFFB\\uDFFD\\uDFFE]|\\uD82C[\\uDC00-\\uDD22\\uDD50-\\uDD52\\uDD64-\\uDD67\\uDD70-\\uDEFB]|\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99]|\\uD834[\\uDEE0-\\uDEF3\\uDF60-\\uDF78]|\\uD835[\\uDC00-\\uDC54\\uDC56-\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDEA5\\uDEA8-\\uDEC0\\uDEC2-\\uDEDA\\uDEDC-\\uDEFA\\uDEFC-\\uDF14\\uDF16-\\uDF34\\uDF36-\\uDF4E\\uDF50-\\uDF6E\\uDF70-\\uDF88\\uDF8A-\\uDFA8\\uDFAA-\\uDFC2\\uDFC4-\\uDFCB\\uDFCE-\\uDFFF]|\\uD837[\\uDF00-\\uDF1E]|\\uD838[\\uDD00-\\uDD2C\\uDD37-\\uDD3D\\uDD40-\\uDD49\\uDD4E\\uDE90-\\uDEAD\\uDEC0-\\uDEEB\\uDEF0-\\uDEF9]|\\uD839[\\uDFE0-\\uDFE6\\uDFE8-\\uDFEB\\uDFED\\uDFEE\\uDFF0-\\uDFFE]|\\uD83A[\\uDC00-\\uDCC4\\uDCC7-\\uDCCF\\uDD00-\\uDD43\\uDD4B\\uDD50-\\uDD59]|\\uD83B[\\uDC71-\\uDCAB\\uDCAD-\\uDCAF\\uDCB1-\\uDCB4\\uDD01-\\uDD2D\\uDD2F-\\uDD3D\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB]|\\uD83C[\\uDD00-\\uDD0C]|\\uD83E[\\uDFF0-\\uDFF9]|\\uD869[\\uDC00-\\uDEDF\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF38\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1\\uDEB0-\\uDFFF]|\\uD87A[\\uDC00-\\uDFE0]|\\uD87E[\\uDC00-\\uDE1D]|\\uD884[\\uDC00-\\uDF4A])/)) return;\n    var nextChar = match[1] || match[2] || '';\n    if (!nextChar || nextChar && (prevChar === '' || this.rules.inline.punctuation.exec(prevChar))) {\n      var lLength = match[0].length - 1;\n      var rDelim,\n        rLength,\n        delimTotal = lLength,\n        midDelimTotal = 0;\n      var endReg = match[0][0] === '*' ? this.rules.inline.emStrong.rDelimAst : this.rules.inline.emStrong.rDelimUnd;\n      endReg.lastIndex = 0;\n\n      // Clip maskedSrc to same section of string as src (move to lexer?)\n      maskedSrc = maskedSrc.slice(-1 * src.length + lLength);\n      while ((match = endReg.exec(maskedSrc)) != null) {\n        rDelim = match[1] || match[2] || match[3] || match[4] || match[5] || match[6];\n        if (!rDelim) continue; // skip single * in __abc*abc__\n\n        rLength = rDelim.length;\n        if (match[3] || match[4]) {\n          // found another Left Delim\n          delimTotal += rLength;\n          continue;\n        } else if (match[5] || match[6]) {\n          // either Left or Right Delim\n          if (lLength % 3 && !((lLength + rLength) % 3)) {\n            midDelimTotal += rLength;\n            continue; // CommonMark Emphasis Rules 9-10\n          }\n        }\n\n        delimTotal -= rLength;\n        if (delimTotal > 0) continue; // Haven't found enough closing delimiters\n\n        // Remove extra characters. *a*** -> *a*\n        rLength = Math.min(rLength, rLength + delimTotal + midDelimTotal);\n        var raw = src.slice(0, lLength + match.index + (match[0].length - rDelim.length) + rLength);\n\n        // Create `em` if smallest delimiter has odd char count. *a***\n        if (Math.min(lLength, rLength) % 2) {\n          var _text = raw.slice(1, -1);\n          return {\n            type: 'em',\n            raw: raw,\n            text: _text,\n            tokens: this.lexer.inlineTokens(_text)\n          };\n        }\n\n        // Create 'strong' if smallest delimiter has even char count. **a***\n        var text = raw.slice(2, -2);\n        return {\n          type: 'strong',\n          raw: raw,\n          text: text,\n          tokens: this.lexer.inlineTokens(text)\n        };\n      }\n    }\n  };\n  _proto.codespan = function codespan(src) {\n    var cap = this.rules.inline.code.exec(src);\n    if (cap) {\n      var text = cap[2].replace(/\\n/g, ' ');\n      var hasNonSpaceChars = /[^ ]/.test(text);\n      var hasSpaceCharsOnBothEnds = /^ /.test(text) && / $/.test(text);\n      if (hasNonSpaceChars && hasSpaceCharsOnBothEnds) {\n        text = text.substring(1, text.length - 1);\n      }\n      text = escape(text, true);\n      return {\n        type: 'codespan',\n        raw: cap[0],\n        text: text\n      };\n    }\n  };\n  _proto.br = function br(src) {\n    var cap = this.rules.inline.br.exec(src);\n    if (cap) {\n      return {\n        type: 'br',\n        raw: cap[0]\n      };\n    }\n  };\n  _proto.del = function del(src) {\n    var cap = this.rules.inline.del.exec(src);\n    if (cap) {\n      return {\n        type: 'del',\n        raw: cap[0],\n        text: cap[2],\n        tokens: this.lexer.inlineTokens(cap[2])\n      };\n    }\n  };\n  _proto.autolink = function autolink(src, mangle) {\n    var cap = this.rules.inline.autolink.exec(src);\n    if (cap) {\n      var text, href;\n      if (cap[2] === '@') {\n        text = escape(this.options.mangle ? mangle(cap[1]) : cap[1]);\n        href = 'mailto:' + text;\n      } else {\n        text = escape(cap[1]);\n        href = text;\n      }\n      return {\n        type: 'link',\n        raw: cap[0],\n        text: text,\n        href: href,\n        tokens: [{\n          type: 'text',\n          raw: text,\n          text: text\n        }]\n      };\n    }\n  };\n  _proto.url = function url(src, mangle) {\n    var cap;\n    if (cap = this.rules.inline.url.exec(src)) {\n      var text, href;\n      if (cap[2] === '@') {\n        text = escape(this.options.mangle ? mangle(cap[0]) : cap[0]);\n        href = 'mailto:' + text;\n      } else {\n        // do extended autolink path validation\n        var prevCapZero;\n        do {\n          prevCapZero = cap[0];\n          cap[0] = this.rules.inline._backpedal.exec(cap[0])[0];\n        } while (prevCapZero !== cap[0]);\n        text = escape(cap[0]);\n        if (cap[1] === 'www.') {\n          href = 'http://' + cap[0];\n        } else {\n          href = cap[0];\n        }\n      }\n      return {\n        type: 'link',\n        raw: cap[0],\n        text: text,\n        href: href,\n        tokens: [{\n          type: 'text',\n          raw: text,\n          text: text\n        }]\n      };\n    }\n  };\n  _proto.inlineText = function inlineText(src, smartypants) {\n    var cap = this.rules.inline.text.exec(src);\n    if (cap) {\n      var text;\n      if (this.lexer.state.inRawBlock) {\n        text = this.options.sanitize ? this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape(cap[0]) : cap[0];\n      } else {\n        text = escape(this.options.smartypants ? smartypants(cap[0]) : cap[0]);\n      }\n      return {\n        type: 'text',\n        raw: cap[0],\n        text: text\n      };\n    }\n  };\n  return Tokenizer;\n}();\n\n/**\n * Block-Level Grammar\n */\nvar block = {\n  newline: /^(?: *(?:\\n|$))+/,\n  code: /^( {4}[^\\n]+(?:\\n(?: *(?:\\n|$))*)?)+/,\n  fences: /^ {0,3}(`{3,}(?=[^`\\n]*(?:\\n|$))|~{3,})([^\\n]*)(?:\\n|$)(?:|([\\s\\S]*?)(?:\\n|$))(?: {0,3}\\1[~`]* *(?=\\n|$)|$)/,\n  hr: /^ {0,3}((?:-[\\t ]*){3,}|(?:_[ \\t]*){3,}|(?:\\*[ \\t]*){3,})(?:\\n+|$)/,\n  heading: /^ {0,3}(#{1,6})(?=\\s|$)(.*)(?:\\n+|$)/,\n  blockquote: /^( {0,3}> ?(paragraph|[^\\n]*)(?:\\n|$))+/,\n  list: /^( {0,3}bull)([ \\t][^\\n]+?)?(?:\\n|$)/,\n  html: '^ {0,3}(?:' // optional indentation\n  + '<(script|pre|style|textarea)[\\\\s>][\\\\s\\\\S]*?(?:</\\\\1>[^\\\\n]*\\\\n+|$)' // (1)\n  + '|comment[^\\\\n]*(\\\\n+|$)' // (2)\n  + '|<\\\\?[\\\\s\\\\S]*?(?:\\\\?>\\\\n*|$)' // (3)\n  + '|<![A-Z][\\\\s\\\\S]*?(?:>\\\\n*|$)' // (4)\n  + '|<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?(?:\\\\]\\\\]>\\\\n*|$)' // (5)\n  + '|</?(tag)(?: +|\\\\n|/?>)[\\\\s\\\\S]*?(?:(?:\\\\n *)+\\\\n|$)' // (6)\n  + '|<(?!script|pre|style|textarea)([a-z][\\\\w-]*)(?:attribute)*? */?>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n *)+\\\\n|$)' // (7) open tag\n  + '|</(?!script|pre|style|textarea)[a-z][\\\\w-]*\\\\s*>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n *)+\\\\n|$)' // (7) closing tag\n  + ')',\n  def: /^ {0,3}\\[(label)\\]: *(?:\\n *)?([^<\\s][^\\s]*|<.*?>)(?:(?: +(?:\\n *)?| *\\n *)(title))? *(?:\\n+|$)/,\n  table: noopTest,\n  lheading: /^((?:.|\\n(?!\\n))+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/,\n  // regex template, placeholders will be replaced according to different paragraph\n  // interruption rules of commonmark and the original markdown spec:\n  _paragraph: /^([^\\n]+(?:\\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\\n)[^\\n]+)*)/,\n  text: /^[^\\n]+/\n};\nblock._label = /(?!\\s*\\])(?:\\\\.|[^\\[\\]\\\\])+/;\nblock._title = /(?:\"(?:\\\\\"?|[^\"\\\\])*\"|'[^'\\n]*(?:\\n[^'\\n]+)*\\n?'|\\([^()]*\\))/;\nblock.def = edit(block.def).replace('label', block._label).replace('title', block._title).getRegex();\nblock.bullet = /(?:[*+-]|\\d{1,9}[.)])/;\nblock.listItemStart = edit(/^( *)(bull) */).replace('bull', block.bullet).getRegex();\nblock.list = edit(block.list).replace(/bull/g, block.bullet).replace('hr', '\\\\n+(?=\\\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\\\* *){3,})(?:\\\\n+|$))').replace('def', '\\\\n+(?=' + block.def.source + ')').getRegex();\nblock._tag = 'address|article|aside|base|basefont|blockquote|body|caption' + '|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption' + '|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe' + '|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option' + '|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr' + '|track|ul';\nblock._comment = /<!--(?!-?>)[\\s\\S]*?(?:-->|$)/;\nblock.html = edit(block.html, 'i').replace('comment', block._comment).replace('tag', block._tag).replace('attribute', / +[a-zA-Z:_][\\w.:-]*(?: *= *\"[^\"\\n]*\"| *= *'[^'\\n]*'| *= *[^\\s\"'=<>`]+)?/).getRegex();\nblock.paragraph = edit(block._paragraph).replace('hr', block.hr).replace('heading', ' {0,3}#{1,6} ').replace('|lheading', '') // setex headings don't interrupt commonmark paragraphs\n.replace('|table', '').replace('blockquote', ' {0,3}>').replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n').replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt\n.replace('html', '</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)').replace('tag', block._tag) // pars can be interrupted by type (6) html blocks\n.getRegex();\nblock.blockquote = edit(block.blockquote).replace('paragraph', block.paragraph).getRegex();\n\n/**\n * Normal Block Grammar\n */\n\nblock.normal = _extends({}, block);\n\n/**\n * GFM Block Grammar\n */\n\nblock.gfm = _extends({}, block.normal, {\n  table: '^ *([^\\\\n ].*\\\\|.*)\\\\n' // Header\n  + ' {0,3}(?:\\\\| *)?(:?-+:? *(?:\\\\| *:?-+:? *)*)(?:\\\\| *)?' // Align\n  + '(?:\\\\n((?:(?! *\\\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\\\n|$))*)\\\\n*|$)' // Cells\n});\n\nblock.gfm.table = edit(block.gfm.table).replace('hr', block.hr).replace('heading', ' {0,3}#{1,6} ').replace('blockquote', ' {0,3}>').replace('code', ' {4}[^\\\\n]').replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n').replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt\n.replace('html', '</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)').replace('tag', block._tag) // tables can be interrupted by type (6) html blocks\n.getRegex();\nblock.gfm.paragraph = edit(block._paragraph).replace('hr', block.hr).replace('heading', ' {0,3}#{1,6} ').replace('|lheading', '') // setex headings don't interrupt commonmark paragraphs\n.replace('table', block.gfm.table) // interrupt paragraphs with table\n.replace('blockquote', ' {0,3}>').replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n').replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt\n.replace('html', '</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)').replace('tag', block._tag) // pars can be interrupted by type (6) html blocks\n.getRegex();\n/**\n * Pedantic grammar (original John Gruber's loose markdown specification)\n */\n\nblock.pedantic = _extends({}, block.normal, {\n  html: edit('^ *(?:comment *(?:\\\\n|\\\\s*$)' + '|<(tag)[\\\\s\\\\S]+?</\\\\1> *(?:\\\\n{2,}|\\\\s*$)' // closed tag\n  + '|<tag(?:\"[^\"]*\"|\\'[^\\']*\\'|\\\\s[^\\'\"/>\\\\s]*)*?/?> *(?:\\\\n{2,}|\\\\s*$))').replace('comment', block._comment).replace(/tag/g, '(?!(?:' + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub' + '|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)' + '\\\\b)\\\\w+(?!:|[^\\\\w\\\\s@]*@)\\\\b').getRegex(),\n  def: /^ *\\[([^\\]]+)\\]: *<?([^\\s>]+)>?(?: +([\"(][^\\n]+[\")]))? *(?:\\n+|$)/,\n  heading: /^(#{1,6})(.*)(?:\\n+|$)/,\n  fences: noopTest,\n  // fences not supported\n  lheading: /^(.+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/,\n  paragraph: edit(block.normal._paragraph).replace('hr', block.hr).replace('heading', ' *#{1,6} *[^\\n]').replace('lheading', block.lheading).replace('blockquote', ' {0,3}>').replace('|fences', '').replace('|list', '').replace('|html', '').getRegex()\n});\n\n/**\n * Inline-Level Grammar\n */\nvar inline = {\n  escape: /^\\\\([!\"#$%&'()*+,\\-./:;<=>?@\\[\\]\\\\^_`{|}~])/,\n  autolink: /^<(scheme:[^\\s\\x00-\\x1f<>]*|email)>/,\n  url: noopTest,\n  tag: '^comment' + '|^</[a-zA-Z][\\\\w:-]*\\\\s*>' // self-closing tag\n  + '|^<[a-zA-Z][\\\\w-]*(?:attribute)*?\\\\s*/?>' // open tag\n  + '|^<\\\\?[\\\\s\\\\S]*?\\\\?>' // processing instruction, e.g. <?php ?>\n  + '|^<![a-zA-Z]+\\\\s[\\\\s\\\\S]*?>' // declaration, e.g. <!DOCTYPE html>\n  + '|^<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?\\\\]\\\\]>',\n  // CDATA section\n  link: /^!?\\[(label)\\]\\(\\s*(href)(?:\\s+(title))?\\s*\\)/,\n  reflink: /^!?\\[(label)\\]\\[(ref)\\]/,\n  nolink: /^!?\\[(ref)\\](?:\\[\\])?/,\n  reflinkSearch: 'reflink|nolink(?!\\\\()',\n  emStrong: {\n    lDelim: /^(?:\\*+(?:([punct_])|[^\\s*]))|^_+(?:([punct*])|([^\\s_]))/,\n    //        (1) and (2) can only be a Right Delimiter. (3) and (4) can only be Left.  (5) and (6) can be either Left or Right.\n    //          () Skip orphan inside strong                                      () Consume to delim     (1) #***                (2) a***#, a***                             (3) #***a, ***a                 (4) ***#              (5) #***#                 (6) a***a\n    rDelimAst: /^(?:[^_*\\\\]|\\\\.)*?\\_\\_(?:[^_*\\\\]|\\\\.)*?\\*(?:[^_*\\\\]|\\\\.)*?(?=\\_\\_)|(?:[^*\\\\]|\\\\.)+(?=[^*])|[punct_](\\*+)(?=[\\s]|$)|(?:[^punct*_\\s\\\\]|\\\\.)(\\*+)(?=[punct_\\s]|$)|[punct_\\s](\\*+)(?=[^punct*_\\s])|[\\s](\\*+)(?=[punct_])|[punct_](\\*+)(?=[punct_])|(?:[^punct*_\\s\\\\]|\\\\.)(\\*+)(?=[^punct*_\\s])/,\n    rDelimUnd: /^(?:[^_*\\\\]|\\\\.)*?\\*\\*(?:[^_*\\\\]|\\\\.)*?\\_(?:[^_*\\\\]|\\\\.)*?(?=\\*\\*)|(?:[^_\\\\]|\\\\.)+(?=[^_])|[punct*](\\_+)(?=[\\s]|$)|(?:[^punct*_\\s\\\\]|\\\\.)(\\_+)(?=[punct*\\s]|$)|[punct*\\s](\\_+)(?=[^punct*_\\s])|[\\s](\\_+)(?=[punct*])|[punct*](\\_+)(?=[punct*])/ // ^- Not allowed for _\n  },\n\n  code: /^(`+)([^`]|[^`][\\s\\S]*?[^`])\\1(?!`)/,\n  br: /^( {2,}|\\\\)\\n(?!\\s*$)/,\n  del: noopTest,\n  text: /^(`+|[^`])(?:(?= {2,}\\n)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*_]|\\b_|$)|[^ ](?= {2,}\\n)))/,\n  punctuation: /^([\\spunctuation])/\n};\n\n// list of punctuation marks from CommonMark spec\n// without * and _ to handle the different emphasis markers * and _\ninline._punctuation = '!\"#$%&\\'()+\\\\-.,/:;<=>?@\\\\[\\\\]`^{|}~';\ninline.punctuation = edit(inline.punctuation).replace(/punctuation/g, inline._punctuation).getRegex();\n\n// sequences em should skip over [title](link), `code`, <html>\ninline.blockSkip = /\\[[^\\]]*?\\]\\([^\\)]*?\\)|`[^`]*?`|<[^>]*?>/g;\n// lookbehind is not available on Safari as of version 16\n// inline.escapedEmSt = /(?<=(?:^|[^\\\\)(?:\\\\[^])*)\\\\[*_]/g;\ninline.escapedEmSt = /(?:^|[^\\\\])(?:\\\\\\\\)*\\\\[*_]/g;\ninline._comment = edit(block._comment).replace('(?:-->|$)', '-->').getRegex();\ninline.emStrong.lDelim = edit(inline.emStrong.lDelim).replace(/punct/g, inline._punctuation).getRegex();\ninline.emStrong.rDelimAst = edit(inline.emStrong.rDelimAst, 'g').replace(/punct/g, inline._punctuation).getRegex();\ninline.emStrong.rDelimUnd = edit(inline.emStrong.rDelimUnd, 'g').replace(/punct/g, inline._punctuation).getRegex();\ninline._escapes = /\\\\([!\"#$%&'()*+,\\-./:;<=>?@\\[\\]\\\\^_`{|}~])/g;\ninline._scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/;\ninline._email = /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/;\ninline.autolink = edit(inline.autolink).replace('scheme', inline._scheme).replace('email', inline._email).getRegex();\ninline._attribute = /\\s+[a-zA-Z:_][\\w.:-]*(?:\\s*=\\s*\"[^\"]*\"|\\s*=\\s*'[^']*'|\\s*=\\s*[^\\s\"'=<>`]+)?/;\ninline.tag = edit(inline.tag).replace('comment', inline._comment).replace('attribute', inline._attribute).getRegex();\ninline._label = /(?:\\[(?:\\\\.|[^\\[\\]\\\\])*\\]|\\\\.|`[^`]*`|[^\\[\\]\\\\`])*?/;\ninline._href = /<(?:\\\\.|[^\\n<>\\\\])+>|[^\\s\\x00-\\x1f]*/;\ninline._title = /\"(?:\\\\\"?|[^\"\\\\])*\"|'(?:\\\\'?|[^'\\\\])*'|\\((?:\\\\\\)?|[^)\\\\])*\\)/;\ninline.link = edit(inline.link).replace('label', inline._label).replace('href', inline._href).replace('title', inline._title).getRegex();\ninline.reflink = edit(inline.reflink).replace('label', inline._label).replace('ref', block._label).getRegex();\ninline.nolink = edit(inline.nolink).replace('ref', block._label).getRegex();\ninline.reflinkSearch = edit(inline.reflinkSearch, 'g').replace('reflink', inline.reflink).replace('nolink', inline.nolink).getRegex();\n\n/**\n * Normal Inline Grammar\n */\n\ninline.normal = _extends({}, inline);\n\n/**\n * Pedantic Inline Grammar\n */\n\ninline.pedantic = _extends({}, inline.normal, {\n  strong: {\n    start: /^__|\\*\\*/,\n    middle: /^__(?=\\S)([\\s\\S]*?\\S)__(?!_)|^\\*\\*(?=\\S)([\\s\\S]*?\\S)\\*\\*(?!\\*)/,\n    endAst: /\\*\\*(?!\\*)/g,\n    endUnd: /__(?!_)/g\n  },\n  em: {\n    start: /^_|\\*/,\n    middle: /^()\\*(?=\\S)([\\s\\S]*?\\S)\\*(?!\\*)|^_(?=\\S)([\\s\\S]*?\\S)_(?!_)/,\n    endAst: /\\*(?!\\*)/g,\n    endUnd: /_(?!_)/g\n  },\n  link: edit(/^!?\\[(label)\\]\\((.*?)\\)/).replace('label', inline._label).getRegex(),\n  reflink: edit(/^!?\\[(label)\\]\\s*\\[([^\\]]*)\\]/).replace('label', inline._label).getRegex()\n});\n\n/**\n * GFM Inline Grammar\n */\n\ninline.gfm = _extends({}, inline.normal, {\n  escape: edit(inline.escape).replace('])', '~|])').getRegex(),\n  _extended_email: /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,\n  url: /^((?:ftp|https?):\\/\\/|www\\.)(?:[a-zA-Z0-9\\-]+\\.?)+[^\\s<]*|^email/,\n  _backpedal: /(?:[^?!.,:;*_'\"~()&]+|\\([^)]*\\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'\"~)]+(?!$))+/,\n  del: /^(~~?)(?=[^\\s~])([\\s\\S]*?[^\\s~])\\1(?=[^~]|$)/,\n  text: /^([`~]+|[^`~])(?:(?= {2,}\\n)|(?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*~_]|\\b_|https?:\\/\\/|ftp:\\/\\/|www\\.|$)|[^ ](?= {2,}\\n)|[^a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-](?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)))/\n});\ninline.gfm.url = edit(inline.gfm.url, 'i').replace('email', inline.gfm._extended_email).getRegex();\n/**\n * GFM + Line Breaks Inline Grammar\n */\n\ninline.breaks = _extends({}, inline.gfm, {\n  br: edit(inline.br).replace('{2,}', '*').getRegex(),\n  text: edit(inline.gfm.text).replace('\\\\b_', '\\\\b_| {2,}\\\\n').replace(/\\{2,\\}/g, '*').getRegex()\n});\n\n/**\n * smartypants text replacement\n * @param {string} text\n */\nfunction smartypants(text) {\n  return text\n  // em-dashes\n  .replace(/---/g, \"\\u2014\")\n  // en-dashes\n  .replace(/--/g, \"\\u2013\")\n  // opening singles\n  .replace(/(^|[-\\u2014/(\\[{\"\\s])'/g, \"$1\\u2018\")\n  // closing singles & apostrophes\n  .replace(/'/g, \"\\u2019\")\n  // opening doubles\n  .replace(/(^|[-\\u2014/(\\[{\\u2018\\s])\"/g, \"$1\\u201C\")\n  // closing doubles\n  .replace(/\"/g, \"\\u201D\")\n  // ellipses\n  .replace(/\\.{3}/g, \"\\u2026\");\n}\n\n/**\n * mangle email addresses\n * @param {string} text\n */\nfunction mangle(text) {\n  var out = '',\n    i,\n    ch;\n  var l = text.length;\n  for (i = 0; i < l; i++) {\n    ch = text.charCodeAt(i);\n    if (Math.random() > 0.5) {\n      ch = 'x' + ch.toString(16);\n    }\n    out += '&#' + ch + ';';\n  }\n  return out;\n}\n\n/**\n * Block Lexer\n */\nvar Lexer = /*#__PURE__*/function () {\n  function Lexer(options) {\n    this.tokens = [];\n    this.tokens.links = Object.create(null);\n    this.options = options || exports.defaults;\n    this.options.tokenizer = this.options.tokenizer || new Tokenizer();\n    this.tokenizer = this.options.tokenizer;\n    this.tokenizer.options = this.options;\n    this.tokenizer.lexer = this;\n    this.inlineQueue = [];\n    this.state = {\n      inLink: false,\n      inRawBlock: false,\n      top: true\n    };\n    var rules = {\n      block: block.normal,\n      inline: inline.normal\n    };\n    if (this.options.pedantic) {\n      rules.block = block.pedantic;\n      rules.inline = inline.pedantic;\n    } else if (this.options.gfm) {\n      rules.block = block.gfm;\n      if (this.options.breaks) {\n        rules.inline = inline.breaks;\n      } else {\n        rules.inline = inline.gfm;\n      }\n    }\n    this.tokenizer.rules = rules;\n  }\n\n  /**\n   * Expose Rules\n   */\n  /**\n   * Static Lex Method\n   */\n  Lexer.lex = function lex(src, options) {\n    var lexer = new Lexer(options);\n    return lexer.lex(src);\n  }\n\n  /**\n   * Static Lex Inline Method\n   */;\n  Lexer.lexInline = function lexInline(src, options) {\n    var lexer = new Lexer(options);\n    return lexer.inlineTokens(src);\n  }\n\n  /**\n   * Preprocessing\n   */;\n  var _proto = Lexer.prototype;\n  _proto.lex = function lex(src) {\n    src = src.replace(/\\r\\n|\\r/g, '\\n');\n    this.blockTokens(src, this.tokens);\n    var next;\n    while (next = this.inlineQueue.shift()) {\n      this.inlineTokens(next.src, next.tokens);\n    }\n    return this.tokens;\n  }\n\n  /**\n   * Lexing\n   */;\n  _proto.blockTokens = function blockTokens(src, tokens) {\n    var _this = this;\n    if (tokens === void 0) {\n      tokens = [];\n    }\n    if (this.options.pedantic) {\n      src = src.replace(/\\t/g, '    ').replace(/^ +$/gm, '');\n    } else {\n      src = src.replace(/^( *)(\\t+)/gm, function (_, leading, tabs) {\n        return leading + '    '.repeat(tabs.length);\n      });\n    }\n    var token, lastToken, cutSrc, lastParagraphClipped;\n    while (src) {\n      if (this.options.extensions && this.options.extensions.block && this.options.extensions.block.some(function (extTokenizer) {\n        if (token = extTokenizer.call({\n          lexer: _this\n        }, src, tokens)) {\n          src = src.substring(token.raw.length);\n          tokens.push(token);\n          return true;\n        }\n        return false;\n      })) {\n        continue;\n      }\n\n      // newline\n      if (token = this.tokenizer.space(src)) {\n        src = src.substring(token.raw.length);\n        if (token.raw.length === 1 && tokens.length > 0) {\n          // if there's a single \\n as a spacer, it's terminating the last line,\n          // so move it there so that we don't get unecessary paragraph tags\n          tokens[tokens.length - 1].raw += '\\n';\n        } else {\n          tokens.push(token);\n        }\n        continue;\n      }\n\n      // code\n      if (token = this.tokenizer.code(src)) {\n        src = src.substring(token.raw.length);\n        lastToken = tokens[tokens.length - 1];\n        // An indented code block cannot interrupt a paragraph.\n        if (lastToken && (lastToken.type === 'paragraph' || lastToken.type === 'text')) {\n          lastToken.raw += '\\n' + token.raw;\n          lastToken.text += '\\n' + token.text;\n          this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;\n        } else {\n          tokens.push(token);\n        }\n        continue;\n      }\n\n      // fences\n      if (token = this.tokenizer.fences(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // heading\n      if (token = this.tokenizer.heading(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // hr\n      if (token = this.tokenizer.hr(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // blockquote\n      if (token = this.tokenizer.blockquote(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // list\n      if (token = this.tokenizer.list(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // html\n      if (token = this.tokenizer.html(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // def\n      if (token = this.tokenizer.def(src)) {\n        src = src.substring(token.raw.length);\n        lastToken = tokens[tokens.length - 1];\n        if (lastToken && (lastToken.type === 'paragraph' || lastToken.type === 'text')) {\n          lastToken.raw += '\\n' + token.raw;\n          lastToken.text += '\\n' + token.raw;\n          this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;\n        } else if (!this.tokens.links[token.tag]) {\n          this.tokens.links[token.tag] = {\n            href: token.href,\n            title: token.title\n          };\n        }\n        continue;\n      }\n\n      // table (gfm)\n      if (token = this.tokenizer.table(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // lheading\n      if (token = this.tokenizer.lheading(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // top-level paragraph\n      // prevent paragraph consuming extensions by clipping 'src' to extension start\n      cutSrc = src;\n      if (this.options.extensions && this.options.extensions.startBlock) {\n        (function () {\n          var startIndex = Infinity;\n          var tempSrc = src.slice(1);\n          var tempStart = void 0;\n          _this.options.extensions.startBlock.forEach(function (getStartIndex) {\n            tempStart = getStartIndex.call({\n              lexer: this\n            }, tempSrc);\n            if (typeof tempStart === 'number' && tempStart >= 0) {\n              startIndex = Math.min(startIndex, tempStart);\n            }\n          });\n          if (startIndex < Infinity && startIndex >= 0) {\n            cutSrc = src.substring(0, startIndex + 1);\n          }\n        })();\n      }\n      if (this.state.top && (token = this.tokenizer.paragraph(cutSrc))) {\n        lastToken = tokens[tokens.length - 1];\n        if (lastParagraphClipped && lastToken.type === 'paragraph') {\n          lastToken.raw += '\\n' + token.raw;\n          lastToken.text += '\\n' + token.text;\n          this.inlineQueue.pop();\n          this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;\n        } else {\n          tokens.push(token);\n        }\n        lastParagraphClipped = cutSrc.length !== src.length;\n        src = src.substring(token.raw.length);\n        continue;\n      }\n\n      // text\n      if (token = this.tokenizer.text(src)) {\n        src = src.substring(token.raw.length);\n        lastToken = tokens[tokens.length - 1];\n        if (lastToken && lastToken.type === 'text') {\n          lastToken.raw += '\\n' + token.raw;\n          lastToken.text += '\\n' + token.text;\n          this.inlineQueue.pop();\n          this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;\n        } else {\n          tokens.push(token);\n        }\n        continue;\n      }\n      if (src) {\n        var errMsg = 'Infinite loop on byte: ' + src.charCodeAt(0);\n        if (this.options.silent) {\n          console.error(errMsg);\n          break;\n        } else {\n          throw new Error(errMsg);\n        }\n      }\n    }\n    this.state.top = true;\n    return tokens;\n  };\n  _proto.inline = function inline(src, tokens) {\n    if (tokens === void 0) {\n      tokens = [];\n    }\n    this.inlineQueue.push({\n      src: src,\n      tokens: tokens\n    });\n    return tokens;\n  }\n\n  /**\n   * Lexing/Compiling\n   */;\n  _proto.inlineTokens = function inlineTokens(src, tokens) {\n    var _this2 = this;\n    if (tokens === void 0) {\n      tokens = [];\n    }\n    var token, lastToken, cutSrc;\n\n    // String with links masked to avoid interference with em and strong\n    var maskedSrc = src;\n    var match;\n    var keepPrevChar, prevChar;\n\n    // Mask out reflinks\n    if (this.tokens.links) {\n      var links = Object.keys(this.tokens.links);\n      if (links.length > 0) {\n        while ((match = this.tokenizer.rules.inline.reflinkSearch.exec(maskedSrc)) != null) {\n          if (links.includes(match[0].slice(match[0].lastIndexOf('[') + 1, -1))) {\n            maskedSrc = maskedSrc.slice(0, match.index) + '[' + repeatString('a', match[0].length - 2) + ']' + maskedSrc.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex);\n          }\n        }\n      }\n    }\n    // Mask out other blocks\n    while ((match = this.tokenizer.rules.inline.blockSkip.exec(maskedSrc)) != null) {\n      maskedSrc = maskedSrc.slice(0, match.index) + '[' + repeatString('a', match[0].length - 2) + ']' + maskedSrc.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);\n    }\n\n    // Mask out escaped em & strong delimiters\n    while ((match = this.tokenizer.rules.inline.escapedEmSt.exec(maskedSrc)) != null) {\n      maskedSrc = maskedSrc.slice(0, match.index + match[0].length - 2) + '++' + maskedSrc.slice(this.tokenizer.rules.inline.escapedEmSt.lastIndex);\n      this.tokenizer.rules.inline.escapedEmSt.lastIndex--;\n    }\n    while (src) {\n      if (!keepPrevChar) {\n        prevChar = '';\n      }\n      keepPrevChar = false;\n\n      // extensions\n      if (this.options.extensions && this.options.extensions.inline && this.options.extensions.inline.some(function (extTokenizer) {\n        if (token = extTokenizer.call({\n          lexer: _this2\n        }, src, tokens)) {\n          src = src.substring(token.raw.length);\n          tokens.push(token);\n          return true;\n        }\n        return false;\n      })) {\n        continue;\n      }\n\n      // escape\n      if (token = this.tokenizer.escape(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // tag\n      if (token = this.tokenizer.tag(src)) {\n        src = src.substring(token.raw.length);\n        lastToken = tokens[tokens.length - 1];\n        if (lastToken && token.type === 'text' && lastToken.type === 'text') {\n          lastToken.raw += token.raw;\n          lastToken.text += token.text;\n        } else {\n          tokens.push(token);\n        }\n        continue;\n      }\n\n      // link\n      if (token = this.tokenizer.link(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // reflink, nolink\n      if (token = this.tokenizer.reflink(src, this.tokens.links)) {\n        src = src.substring(token.raw.length);\n        lastToken = tokens[tokens.length - 1];\n        if (lastToken && token.type === 'text' && lastToken.type === 'text') {\n          lastToken.raw += token.raw;\n          lastToken.text += token.text;\n        } else {\n          tokens.push(token);\n        }\n        continue;\n      }\n\n      // em & strong\n      if (token = this.tokenizer.emStrong(src, maskedSrc, prevChar)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // code\n      if (token = this.tokenizer.codespan(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // br\n      if (token = this.tokenizer.br(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // del (gfm)\n      if (token = this.tokenizer.del(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // autolink\n      if (token = this.tokenizer.autolink(src, mangle)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // url (gfm)\n      if (!this.state.inLink && (token = this.tokenizer.url(src, mangle))) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n\n      // text\n      // prevent inlineText consuming extensions by clipping 'src' to extension start\n      cutSrc = src;\n      if (this.options.extensions && this.options.extensions.startInline) {\n        (function () {\n          var startIndex = Infinity;\n          var tempSrc = src.slice(1);\n          var tempStart = void 0;\n          _this2.options.extensions.startInline.forEach(function (getStartIndex) {\n            tempStart = getStartIndex.call({\n              lexer: this\n            }, tempSrc);\n            if (typeof tempStart === 'number' && tempStart >= 0) {\n              startIndex = Math.min(startIndex, tempStart);\n            }\n          });\n          if (startIndex < Infinity && startIndex >= 0) {\n            cutSrc = src.substring(0, startIndex + 1);\n          }\n        })();\n      }\n      if (token = this.tokenizer.inlineText(cutSrc, smartypants)) {\n        src = src.substring(token.raw.length);\n        if (token.raw.slice(-1) !== '_') {\n          // Track prevChar before string of ____ started\n          prevChar = token.raw.slice(-1);\n        }\n        keepPrevChar = true;\n        lastToken = tokens[tokens.length - 1];\n        if (lastToken && lastToken.type === 'text') {\n          lastToken.raw += token.raw;\n          lastToken.text += token.text;\n        } else {\n          tokens.push(token);\n        }\n        continue;\n      }\n      if (src) {\n        var errMsg = 'Infinite loop on byte: ' + src.charCodeAt(0);\n        if (this.options.silent) {\n          console.error(errMsg);\n          break;\n        } else {\n          throw new Error(errMsg);\n        }\n      }\n    }\n    return tokens;\n  };\n  _createClass(Lexer, null, [{\n    key: \"rules\",\n    get: function get() {\n      return {\n        block: block,\n        inline: inline\n      };\n    }\n  }]);\n  return Lexer;\n}();\n\n/**\n * Renderer\n */\nvar Renderer = /*#__PURE__*/function () {\n  function Renderer(options) {\n    this.options = options || exports.defaults;\n  }\n  var _proto = Renderer.prototype;\n  _proto.code = function code(_code, infostring, escaped) {\n    var lang = (infostring || '').match(/\\S*/)[0];\n    if (this.options.highlight) {\n      var out = this.options.highlight(_code, lang);\n      if (out != null && out !== _code) {\n        escaped = true;\n        _code = out;\n      }\n    }\n    _code = _code.replace(/\\n$/, '') + '\\n';\n    if (!lang) {\n      return '<pre><code>' + (escaped ? _code : escape(_code, true)) + '</code></pre>\\n';\n    }\n    return '<pre><code class=\"' + this.options.langPrefix + escape(lang) + '\">' + (escaped ? _code : escape(_code, true)) + '</code></pre>\\n';\n  }\n\n  /**\n   * @param {string} quote\n   */;\n  _proto.blockquote = function blockquote(quote) {\n    return \"<blockquote>\\n\" + quote + \"</blockquote>\\n\";\n  };\n  _proto.html = function html(_html) {\n    return _html;\n  }\n\n  /**\n   * @param {string} text\n   * @param {string} level\n   * @param {string} raw\n   * @param {any} slugger\n   */;\n  _proto.heading = function heading(text, level, raw, slugger) {\n    if (this.options.headerIds) {\n      var id = this.options.headerPrefix + slugger.slug(raw);\n      return \"<h\" + level + \" id=\\\"\" + id + \"\\\">\" + text + \"</h\" + level + \">\\n\";\n    }\n\n    // ignore IDs\n    return \"<h\" + level + \">\" + text + \"</h\" + level + \">\\n\";\n  };\n  _proto.hr = function hr() {\n    return this.options.xhtml ? '<hr/>\\n' : '<hr>\\n';\n  };\n  _proto.list = function list(body, ordered, start) {\n    var type = ordered ? 'ol' : 'ul',\n      startatt = ordered && start !== 1 ? ' start=\"' + start + '\"' : '';\n    return '<' + type + startatt + '>\\n' + body + '</' + type + '>\\n';\n  }\n\n  /**\n   * @param {string} text\n   */;\n  _proto.listitem = function listitem(text) {\n    return \"<li>\" + text + \"</li>\\n\";\n  };\n  _proto.checkbox = function checkbox(checked) {\n    return '<input ' + (checked ? 'checked=\"\" ' : '') + 'disabled=\"\" type=\"checkbox\"' + (this.options.xhtml ? ' /' : '') + '> ';\n  }\n\n  /**\n   * @param {string} text\n   */;\n  _proto.paragraph = function paragraph(text) {\n    return \"<p>\" + text + \"</p>\\n\";\n  }\n\n  /**\n   * @param {string} header\n   * @param {string} body\n   */;\n  _proto.table = function table(header, body) {\n    if (body) body = \"<tbody>\" + body + \"</tbody>\";\n    return '<table>\\n' + '<thead>\\n' + header + '</thead>\\n' + body + '</table>\\n';\n  }\n\n  /**\n   * @param {string} content\n   */;\n  _proto.tablerow = function tablerow(content) {\n    return \"<tr>\\n\" + content + \"</tr>\\n\";\n  };\n  _proto.tablecell = function tablecell(content, flags) {\n    var type = flags.header ? 'th' : 'td';\n    var tag = flags.align ? \"<\" + type + \" align=\\\"\" + flags.align + \"\\\">\" : \"<\" + type + \">\";\n    return tag + content + (\"</\" + type + \">\\n\");\n  }\n\n  /**\n   * span level renderer\n   * @param {string} text\n   */;\n  _proto.strong = function strong(text) {\n    return \"<strong>\" + text + \"</strong>\";\n  }\n\n  /**\n   * @param {string} text\n   */;\n  _proto.em = function em(text) {\n    return \"<em>\" + text + \"</em>\";\n  }\n\n  /**\n   * @param {string} text\n   */;\n  _proto.codespan = function codespan(text) {\n    return \"<code>\" + text + \"</code>\";\n  };\n  _proto.br = function br() {\n    return this.options.xhtml ? '<br/>' : '<br>';\n  }\n\n  /**\n   * @param {string} text\n   */;\n  _proto.del = function del(text) {\n    return \"<del>\" + text + \"</del>\";\n  }\n\n  /**\n   * @param {string} href\n   * @param {string} title\n   * @param {string} text\n   */;\n  _proto.link = function link(href, title, text) {\n    href = cleanUrl(this.options.sanitize, this.options.baseUrl, href);\n    if (href === null) {\n      return text;\n    }\n    var out = '<a href=\"' + href + '\"';\n    if (title) {\n      out += ' title=\"' + title + '\"';\n    }\n    out += '>' + text + '</a>';\n    return out;\n  }\n\n  /**\n   * @param {string} href\n   * @param {string} title\n   * @param {string} text\n   */;\n  _proto.image = function image(href, title, text) {\n    href = cleanUrl(this.options.sanitize, this.options.baseUrl, href);\n    if (href === null) {\n      return text;\n    }\n    var out = \"<img src=\\\"\" + href + \"\\\" alt=\\\"\" + text + \"\\\"\";\n    if (title) {\n      out += \" title=\\\"\" + title + \"\\\"\";\n    }\n    out += this.options.xhtml ? '/>' : '>';\n    return out;\n  };\n  _proto.text = function text(_text) {\n    return _text;\n  };\n  return Renderer;\n}();\n\n/**\n * TextRenderer\n * returns only the textual part of the token\n */\nvar TextRenderer = /*#__PURE__*/function () {\n  function TextRenderer() {}\n  var _proto = TextRenderer.prototype;\n  // no need for block level renderers\n  _proto.strong = function strong(text) {\n    return text;\n  };\n  _proto.em = function em(text) {\n    return text;\n  };\n  _proto.codespan = function codespan(text) {\n    return text;\n  };\n  _proto.del = function del(text) {\n    return text;\n  };\n  _proto.html = function html(text) {\n    return text;\n  };\n  _proto.text = function text(_text) {\n    return _text;\n  };\n  _proto.link = function link(href, title, text) {\n    return '' + text;\n  };\n  _proto.image = function image(href, title, text) {\n    return '' + text;\n  };\n  _proto.br = function br() {\n    return '';\n  };\n  return TextRenderer;\n}();\n\n/**\n * Slugger generates header id\n */\nvar Slugger = /*#__PURE__*/function () {\n  function Slugger() {\n    this.seen = {};\n  }\n\n  /**\n   * @param {string} value\n   */\n  var _proto = Slugger.prototype;\n  _proto.serialize = function serialize(value) {\n    return value.toLowerCase().trim()\n    // remove html tags\n    .replace(/<[!\\/a-z].*?>/ig, '')\n    // remove unwanted chars\n    .replace(/[\\u2000-\\u206F\\u2E00-\\u2E7F\\\\'!\"#$%&()*+,./:;<=>?@[\\]^`{|}~]/g, '').replace(/\\s/g, '-');\n  }\n\n  /**\n   * Finds the next safe (unique) slug to use\n   * @param {string} originalSlug\n   * @param {boolean} isDryRun\n   */;\n  _proto.getNextSafeSlug = function getNextSafeSlug(originalSlug, isDryRun) {\n    var slug = originalSlug;\n    var occurenceAccumulator = 0;\n    if (this.seen.hasOwnProperty(slug)) {\n      occurenceAccumulator = this.seen[originalSlug];\n      do {\n        occurenceAccumulator++;\n        slug = originalSlug + '-' + occurenceAccumulator;\n      } while (this.seen.hasOwnProperty(slug));\n    }\n    if (!isDryRun) {\n      this.seen[originalSlug] = occurenceAccumulator;\n      this.seen[slug] = 0;\n    }\n    return slug;\n  }\n\n  /**\n   * Convert string to unique id\n   * @param {object} [options]\n   * @param {boolean} [options.dryrun] Generates the next unique slug without\n   * updating the internal accumulator.\n   */;\n  _proto.slug = function slug(value, options) {\n    if (options === void 0) {\n      options = {};\n    }\n    var slug = this.serialize(value);\n    return this.getNextSafeSlug(slug, options.dryrun);\n  };\n  return Slugger;\n}();\n\n/**\n * Parsing & Compiling\n */\nvar Parser = /*#__PURE__*/function () {\n  function Parser(options) {\n    this.options = options || exports.defaults;\n    this.options.renderer = this.options.renderer || new Renderer();\n    this.renderer = this.options.renderer;\n    this.renderer.options = this.options;\n    this.textRenderer = new TextRenderer();\n    this.slugger = new Slugger();\n  }\n\n  /**\n   * Static Parse Method\n   */\n  Parser.parse = function parse(tokens, options) {\n    var parser = new Parser(options);\n    return parser.parse(tokens);\n  }\n\n  /**\n   * Static Parse Inline Method\n   */;\n  Parser.parseInline = function parseInline(tokens, options) {\n    var parser = new Parser(options);\n    return parser.parseInline(tokens);\n  }\n\n  /**\n   * Parse Loop\n   */;\n  var _proto = Parser.prototype;\n  _proto.parse = function parse(tokens, top) {\n    if (top === void 0) {\n      top = true;\n    }\n    var out = '',\n      i,\n      j,\n      k,\n      l2,\n      l3,\n      row,\n      cell,\n      header,\n      body,\n      token,\n      ordered,\n      start,\n      loose,\n      itemBody,\n      item,\n      checked,\n      task,\n      checkbox,\n      ret;\n    var l = tokens.length;\n    for (i = 0; i < l; i++) {\n      token = tokens[i];\n\n      // Run any renderer extensions\n      if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[token.type]) {\n        ret = this.options.extensions.renderers[token.type].call({\n          parser: this\n        }, token);\n        if (ret !== false || !['space', 'hr', 'heading', 'code', 'table', 'blockquote', 'list', 'html', 'paragraph', 'text'].includes(token.type)) {\n          out += ret || '';\n          continue;\n        }\n      }\n      switch (token.type) {\n        case 'space':\n          {\n            continue;\n          }\n        case 'hr':\n          {\n            out += this.renderer.hr();\n            continue;\n          }\n        case 'heading':\n          {\n            out += this.renderer.heading(this.parseInline(token.tokens), token.depth, unescape(this.parseInline(token.tokens, this.textRenderer)), this.slugger);\n            continue;\n          }\n        case 'code':\n          {\n            out += this.renderer.code(token.text, token.lang, token.escaped);\n            continue;\n          }\n        case 'table':\n          {\n            header = '';\n\n            // header\n            cell = '';\n            l2 = token.header.length;\n            for (j = 0; j < l2; j++) {\n              cell += this.renderer.tablecell(this.parseInline(token.header[j].tokens), {\n                header: true,\n                align: token.align[j]\n              });\n            }\n            header += this.renderer.tablerow(cell);\n            body = '';\n            l2 = token.rows.length;\n            for (j = 0; j < l2; j++) {\n              row = token.rows[j];\n              cell = '';\n              l3 = row.length;\n              for (k = 0; k < l3; k++) {\n                cell += this.renderer.tablecell(this.parseInline(row[k].tokens), {\n                  header: false,\n                  align: token.align[k]\n                });\n              }\n              body += this.renderer.tablerow(cell);\n            }\n            out += this.renderer.table(header, body);\n            continue;\n          }\n        case 'blockquote':\n          {\n            body = this.parse(token.tokens);\n            out += this.renderer.blockquote(body);\n            continue;\n          }\n        case 'list':\n          {\n            ordered = token.ordered;\n            start = token.start;\n            loose = token.loose;\n            l2 = token.items.length;\n            body = '';\n            for (j = 0; j < l2; j++) {\n              item = token.items[j];\n              checked = item.checked;\n              task = item.task;\n              itemBody = '';\n              if (item.task) {\n                checkbox = this.renderer.checkbox(checked);\n                if (loose) {\n                  if (item.tokens.length > 0 && item.tokens[0].type === 'paragraph') {\n                    item.tokens[0].text = checkbox + ' ' + item.tokens[0].text;\n                    if (item.tokens[0].tokens && item.tokens[0].tokens.length > 0 && item.tokens[0].tokens[0].type === 'text') {\n                      item.tokens[0].tokens[0].text = checkbox + ' ' + item.tokens[0].tokens[0].text;\n                    }\n                  } else {\n                    item.tokens.unshift({\n                      type: 'text',\n                      text: checkbox\n                    });\n                  }\n                } else {\n                  itemBody += checkbox;\n                }\n              }\n              itemBody += this.parse(item.tokens, loose);\n              body += this.renderer.listitem(itemBody, task, checked);\n            }\n            out += this.renderer.list(body, ordered, start);\n            continue;\n          }\n        case 'html':\n          {\n            // TODO parse inline content if parameter markdown=1\n            out += this.renderer.html(token.text);\n            continue;\n          }\n        case 'paragraph':\n          {\n            out += this.renderer.paragraph(this.parseInline(token.tokens));\n            continue;\n          }\n        case 'text':\n          {\n            body = token.tokens ? this.parseInline(token.tokens) : token.text;\n            while (i + 1 < l && tokens[i + 1].type === 'text') {\n              token = tokens[++i];\n              body += '\\n' + (token.tokens ? this.parseInline(token.tokens) : token.text);\n            }\n            out += top ? this.renderer.paragraph(body) : body;\n            continue;\n          }\n        default:\n          {\n            var errMsg = 'Token with \"' + token.type + '\" type was not found.';\n            if (this.options.silent) {\n              console.error(errMsg);\n              return;\n            } else {\n              throw new Error(errMsg);\n            }\n          }\n      }\n    }\n    return out;\n  }\n\n  /**\n   * Parse Inline Tokens\n   */;\n  _proto.parseInline = function parseInline(tokens, renderer) {\n    renderer = renderer || this.renderer;\n    var out = '',\n      i,\n      token,\n      ret;\n    var l = tokens.length;\n    for (i = 0; i < l; i++) {\n      token = tokens[i];\n\n      // Run any renderer extensions\n      if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[token.type]) {\n        ret = this.options.extensions.renderers[token.type].call({\n          parser: this\n        }, token);\n        if (ret !== false || !['escape', 'html', 'link', 'image', 'strong', 'em', 'codespan', 'br', 'del', 'text'].includes(token.type)) {\n          out += ret || '';\n          continue;\n        }\n      }\n      switch (token.type) {\n        case 'escape':\n          {\n            out += renderer.text(token.text);\n            break;\n          }\n        case 'html':\n          {\n            out += renderer.html(token.text);\n            break;\n          }\n        case 'link':\n          {\n            out += renderer.link(token.href, token.title, this.parseInline(token.tokens, renderer));\n            break;\n          }\n        case 'image':\n          {\n            out += renderer.image(token.href, token.title, token.text);\n            break;\n          }\n        case 'strong':\n          {\n            out += renderer.strong(this.parseInline(token.tokens, renderer));\n            break;\n          }\n        case 'em':\n          {\n            out += renderer.em(this.parseInline(token.tokens, renderer));\n            break;\n          }\n        case 'codespan':\n          {\n            out += renderer.codespan(token.text);\n            break;\n          }\n        case 'br':\n          {\n            out += renderer.br();\n            break;\n          }\n        case 'del':\n          {\n            out += renderer.del(this.parseInline(token.tokens, renderer));\n            break;\n          }\n        case 'text':\n          {\n            out += renderer.text(token.text);\n            break;\n          }\n        default:\n          {\n            var errMsg = 'Token with \"' + token.type + '\" type was not found.';\n            if (this.options.silent) {\n              console.error(errMsg);\n              return;\n            } else {\n              throw new Error(errMsg);\n            }\n          }\n      }\n    }\n    return out;\n  };\n  return Parser;\n}();\n\nvar Hooks = /*#__PURE__*/function () {\n  function Hooks(options) {\n    this.options = options || exports.defaults;\n  }\n  var _proto = Hooks.prototype;\n  /**\n   * Process markdown before marked\n   */\n  _proto.preprocess = function preprocess(markdown) {\n    return markdown;\n  }\n\n  /**\n   * Process HTML after marked is finished\n   */;\n  _proto.postprocess = function postprocess(html) {\n    return html;\n  };\n  return Hooks;\n}();\nHooks.passThroughHooks = new Set(['preprocess', 'postprocess']);\n\nfunction onError(silent, async, callback) {\n  return function (e) {\n    e.message += '\\nPlease report this to https://github.com/markedjs/marked.';\n    if (silent) {\n      var msg = '<p>An error occurred:</p><pre>' + escape(e.message + '', true) + '</pre>';\n      if (async) {\n        return Promise.resolve(msg);\n      }\n      if (callback) {\n        callback(null, msg);\n        return;\n      }\n      return msg;\n    }\n    if (async) {\n      return Promise.reject(e);\n    }\n    if (callback) {\n      callback(e);\n      return;\n    }\n    throw e;\n  };\n}\nfunction parseMarkdown(lexer, parser) {\n  return function (src, opt, callback) {\n    if (typeof opt === 'function') {\n      callback = opt;\n      opt = null;\n    }\n    var origOpt = _extends({}, opt);\n    opt = _extends({}, marked.defaults, origOpt);\n    var throwError = onError(opt.silent, opt.async, callback);\n\n    // throw error in case of non string input\n    if (typeof src === 'undefined' || src === null) {\n      return throwError(new Error('marked(): input parameter is undefined or null'));\n    }\n    if (typeof src !== 'string') {\n      return throwError(new Error('marked(): input parameter is of type ' + Object.prototype.toString.call(src) + ', string expected'));\n    }\n    checkSanitizeDeprecation(opt);\n    if (opt.hooks) {\n      opt.hooks.options = opt;\n    }\n    if (callback) {\n      var highlight = opt.highlight;\n      var tokens;\n      try {\n        if (opt.hooks) {\n          src = opt.hooks.preprocess(src);\n        }\n        tokens = lexer(src, opt);\n      } catch (e) {\n        return throwError(e);\n      }\n      var done = function done(err) {\n        var out;\n        if (!err) {\n          try {\n            if (opt.walkTokens) {\n              marked.walkTokens(tokens, opt.walkTokens);\n            }\n            out = parser(tokens, opt);\n            if (opt.hooks) {\n              out = opt.hooks.postprocess(out);\n            }\n          } catch (e) {\n            err = e;\n          }\n        }\n        opt.highlight = highlight;\n        return err ? throwError(err) : callback(null, out);\n      };\n      if (!highlight || highlight.length < 3) {\n        return done();\n      }\n      delete opt.highlight;\n      if (!tokens.length) return done();\n      var pending = 0;\n      marked.walkTokens(tokens, function (token) {\n        if (token.type === 'code') {\n          pending++;\n          setTimeout(function () {\n            highlight(token.text, token.lang, function (err, code) {\n              if (err) {\n                return done(err);\n              }\n              if (code != null && code !== token.text) {\n                token.text = code;\n                token.escaped = true;\n              }\n              pending--;\n              if (pending === 0) {\n                done();\n              }\n            });\n          }, 0);\n        }\n      });\n      if (pending === 0) {\n        done();\n      }\n      return;\n    }\n    if (opt.async) {\n      return Promise.resolve(opt.hooks ? opt.hooks.preprocess(src) : src).then(function (src) {\n        return lexer(src, opt);\n      }).then(function (tokens) {\n        return opt.walkTokens ? Promise.all(marked.walkTokens(tokens, opt.walkTokens)).then(function () {\n          return tokens;\n        }) : tokens;\n      }).then(function (tokens) {\n        return parser(tokens, opt);\n      }).then(function (html) {\n        return opt.hooks ? opt.hooks.postprocess(html) : html;\n      })[\"catch\"](throwError);\n    }\n    try {\n      if (opt.hooks) {\n        src = opt.hooks.preprocess(src);\n      }\n      var _tokens = lexer(src, opt);\n      if (opt.walkTokens) {\n        marked.walkTokens(_tokens, opt.walkTokens);\n      }\n      var html = parser(_tokens, opt);\n      if (opt.hooks) {\n        html = opt.hooks.postprocess(html);\n      }\n      return html;\n    } catch (e) {\n      return throwError(e);\n    }\n  };\n}\n\n/**\n * Marked\n */\nfunction marked(src, opt, callback) {\n  return parseMarkdown(Lexer.lex, Parser.parse)(src, opt, callback);\n}\n\n/**\n * Options\n */\n\nmarked.options = marked.setOptions = function (opt) {\n  marked.defaults = _extends({}, marked.defaults, opt);\n  changeDefaults(marked.defaults);\n  return marked;\n};\nmarked.getDefaults = getDefaults;\nmarked.defaults = exports.defaults;\n\n/**\n * Use Extension\n */\n\nmarked.use = function () {\n  var extensions = marked.defaults.extensions || {\n    renderers: {},\n    childTokens: {}\n  };\n  for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n    args[_key] = arguments[_key];\n  }\n  args.forEach(function (pack) {\n    // copy options to new object\n    var opts = _extends({}, pack);\n\n    // set async to true if it was set to true before\n    opts.async = marked.defaults.async || opts.async || false;\n\n    // ==-- Parse \"addon\" extensions --== //\n    if (pack.extensions) {\n      pack.extensions.forEach(function (ext) {\n        if (!ext.name) {\n          throw new Error('extension name required');\n        }\n        if (ext.renderer) {\n          // Renderer extensions\n          var prevRenderer = extensions.renderers[ext.name];\n          if (prevRenderer) {\n            // Replace extension with func to run new extension but fall back if false\n            extensions.renderers[ext.name] = function () {\n              for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n                args[_key2] = arguments[_key2];\n              }\n              var ret = ext.renderer.apply(this, args);\n              if (ret === false) {\n                ret = prevRenderer.apply(this, args);\n              }\n              return ret;\n            };\n          } else {\n            extensions.renderers[ext.name] = ext.renderer;\n          }\n        }\n        if (ext.tokenizer) {\n          // Tokenizer Extensions\n          if (!ext.level || ext.level !== 'block' && ext.level !== 'inline') {\n            throw new Error(\"extension level must be 'block' or 'inline'\");\n          }\n          if (extensions[ext.level]) {\n            extensions[ext.level].unshift(ext.tokenizer);\n          } else {\n            extensions[ext.level] = [ext.tokenizer];\n          }\n          if (ext.start) {\n            // Function to check for start of token\n            if (ext.level === 'block') {\n              if (extensions.startBlock) {\n                extensions.startBlock.push(ext.start);\n              } else {\n                extensions.startBlock = [ext.start];\n              }\n            } else if (ext.level === 'inline') {\n              if (extensions.startInline) {\n                extensions.startInline.push(ext.start);\n              } else {\n                extensions.startInline = [ext.start];\n              }\n            }\n          }\n        }\n        if (ext.childTokens) {\n          // Child tokens to be visited by walkTokens\n          extensions.childTokens[ext.name] = ext.childTokens;\n        }\n      });\n      opts.extensions = extensions;\n    }\n\n    // ==-- Parse \"overwrite\" extensions --== //\n    if (pack.renderer) {\n      (function () {\n        var renderer = marked.defaults.renderer || new Renderer();\n        var _loop = function _loop(prop) {\n          var prevRenderer = renderer[prop];\n          // Replace renderer with func to run extension, but fall back if false\n          renderer[prop] = function () {\n            for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n              args[_key3] = arguments[_key3];\n            }\n            var ret = pack.renderer[prop].apply(renderer, args);\n            if (ret === false) {\n              ret = prevRenderer.apply(renderer, args);\n            }\n            return ret;\n          };\n        };\n        for (var prop in pack.renderer) {\n          _loop(prop);\n        }\n        opts.renderer = renderer;\n      })();\n    }\n    if (pack.tokenizer) {\n      (function () {\n        var tokenizer = marked.defaults.tokenizer || new Tokenizer();\n        var _loop2 = function _loop2(prop) {\n          var prevTokenizer = tokenizer[prop];\n          // Replace tokenizer with func to run extension, but fall back if false\n          tokenizer[prop] = function () {\n            for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n              args[_key4] = arguments[_key4];\n            }\n            var ret = pack.tokenizer[prop].apply(tokenizer, args);\n            if (ret === false) {\n              ret = prevTokenizer.apply(tokenizer, args);\n            }\n            return ret;\n          };\n        };\n        for (var prop in pack.tokenizer) {\n          _loop2(prop);\n        }\n        opts.tokenizer = tokenizer;\n      })();\n    }\n\n    // ==-- Parse Hooks extensions --== //\n    if (pack.hooks) {\n      (function () {\n        var hooks = marked.defaults.hooks || new Hooks();\n        var _loop3 = function _loop3(prop) {\n          var prevHook = hooks[prop];\n          if (Hooks.passThroughHooks.has(prop)) {\n            hooks[prop] = function (arg) {\n              if (marked.defaults.async) {\n                return Promise.resolve(pack.hooks[prop].call(hooks, arg)).then(function (ret) {\n                  return prevHook.call(hooks, ret);\n                });\n              }\n              var ret = pack.hooks[prop].call(hooks, arg);\n              return prevHook.call(hooks, ret);\n            };\n          } else {\n            hooks[prop] = function () {\n              for (var _len5 = arguments.length, args = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {\n                args[_key5] = arguments[_key5];\n              }\n              var ret = pack.hooks[prop].apply(hooks, args);\n              if (ret === false) {\n                ret = prevHook.apply(hooks, args);\n              }\n              return ret;\n            };\n          }\n        };\n        for (var prop in pack.hooks) {\n          _loop3(prop);\n        }\n        opts.hooks = hooks;\n      })();\n    }\n\n    // ==-- Parse WalkTokens extensions --== //\n    if (pack.walkTokens) {\n      var _walkTokens = marked.defaults.walkTokens;\n      opts.walkTokens = function (token) {\n        var values = [];\n        values.push(pack.walkTokens.call(this, token));\n        if (_walkTokens) {\n          values = values.concat(_walkTokens.call(this, token));\n        }\n        return values;\n      };\n    }\n    marked.setOptions(opts);\n  });\n};\n\n/**\n * Run callback for every token\n */\n\nmarked.walkTokens = function (tokens, callback) {\n  var values = [];\n  var _loop4 = function _loop4() {\n    var token = _step.value;\n    values = values.concat(callback.call(marked, token));\n    switch (token.type) {\n      case 'table':\n        {\n          for (var _iterator2 = _createForOfIteratorHelperLoose(token.header), _step2; !(_step2 = _iterator2()).done;) {\n            var cell = _step2.value;\n            values = values.concat(marked.walkTokens(cell.tokens, callback));\n          }\n          for (var _iterator3 = _createForOfIteratorHelperLoose(token.rows), _step3; !(_step3 = _iterator3()).done;) {\n            var row = _step3.value;\n            for (var _iterator4 = _createForOfIteratorHelperLoose(row), _step4; !(_step4 = _iterator4()).done;) {\n              var _cell = _step4.value;\n              values = values.concat(marked.walkTokens(_cell.tokens, callback));\n            }\n          }\n          break;\n        }\n      case 'list':\n        {\n          values = values.concat(marked.walkTokens(token.items, callback));\n          break;\n        }\n      default:\n        {\n          if (marked.defaults.extensions && marked.defaults.extensions.childTokens && marked.defaults.extensions.childTokens[token.type]) {\n            // Walk any extensions\n            marked.defaults.extensions.childTokens[token.type].forEach(function (childTokens) {\n              values = values.concat(marked.walkTokens(token[childTokens], callback));\n            });\n          } else if (token.tokens) {\n            values = values.concat(marked.walkTokens(token.tokens, callback));\n          }\n        }\n    }\n  };\n  for (var _iterator = _createForOfIteratorHelperLoose(tokens), _step; !(_step = _iterator()).done;) {\n    _loop4();\n  }\n  return values;\n};\n\n/**\n * Parse Inline\n * @param {string} src\n */\nmarked.parseInline = parseMarkdown(Lexer.lexInline, Parser.parseInline);\n\n/**\n * Expose\n */\nmarked.Parser = Parser;\nmarked.parser = Parser.parse;\nmarked.Renderer = Renderer;\nmarked.TextRenderer = TextRenderer;\nmarked.Lexer = Lexer;\nmarked.lexer = Lexer.lex;\nmarked.Tokenizer = Tokenizer;\nmarked.Slugger = Slugger;\nmarked.Hooks = Hooks;\nmarked.parse = marked;\nvar options = marked.options;\nvar setOptions = marked.setOptions;\nvar use = marked.use;\nvar walkTokens = marked.walkTokens;\nvar parseInline = marked.parseInline;\nvar parse = marked;\nvar parser = Parser.parse;\nvar lexer = Lexer.lex;\n\nexports.Hooks = Hooks;\nexports.Lexer = Lexer;\nexports.Parser = Parser;\nexports.Renderer = Renderer;\nexports.Slugger = Slugger;\nexports.TextRenderer = TextRenderer;\nexports.Tokenizer = Tokenizer;\nexports.getDefaults = getDefaults;\nexports.lexer = lexer;\nexports.marked = marked;\nexports.options = options;\nexports.parse = parse;\nexports.parseInline = parseInline;\nexports.parser = parser;\nexports.setOptions = setOptions;\nexports.use = use;\nexports.walkTokens = walkTokens;\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import Flickity from 'flickity';\n// @ts-ignore\nimport wwwApi from '../../../api';\nimport 'flickity/css/flickity.css';\nimport 'flatpickr/dist/flatpickr.css';\nimport swipe from './swipe';\nimport initLiveChat from './liveChat';\nimport productPage from './products/productPage';\nimport './products/product-form/stores/productStore';\n// @ts-ignore\nimport productFormManager from './products/product-form/productFormManager';\n// @ts-ignore\nimport productFormFilesManager from './products/product-form/productFormFilesManager';\nimport gallery from './products/gallery';\nimport EasyMDE from 'easymde';\nimport 'easymde/dist/easymde.min.css';\nwindow.EasyMDE = EasyMDE;\nimport '../styles/index.css';\n// @ts-ignore\nwindow.wwwApi = new wwwApi.Client(window.appConfig);\nwindow.Alpine.data('productFormManager', productFormManager);\nwindow.Alpine.data('productFormFilesManager', productFormFilesManager);\nwindow.Alpine.data('productPage', productPage);\nwindow.Alpine.data('gallery', gallery);\nwindow.Alpine.magic('clipboard', () => (subject) => {\n    navigator.clipboard.writeText(subject);\n});\nwindow.Alpine.data('dropdown', () => {\n    return {\n        open: false,\n        close() {\n            this.open = false;\n        },\n        toggle() {\n            this.open = !this.open;\n        }\n    };\n});\nwindow.Alpine.data('interdynStaffBar', function () {\n    return {\n        //@ts-ignore\n        show: this.$persist(true).using(sessionStorage).as('displayInterdynStaffBar'),\n        closing: false,\n        close() {\n            this.closing = true;\n            window.setTimeout(() => {\n                this.show = false;\n            }, 2500);\n        },\n        //@ts-ignore\n        forceOpen: this.$persist(false).using(sessionStorage).as('forceOpenInterdynStaffBar'),\n        alwaysOpen: true,\n        toggle() {\n            this.forceOpen = !this.forceOpen;\n        },\n        handleResize() {\n            const width = (window.innerWidth > 0) ? window.innerWidth : screen.width;\n            this.alwaysOpen = width >= 640;\n        },\n        init() {\n            this.handleResize();\n        },\n        get isOpen() {\n            return (this.alwaysOpen || this.forceOpen);\n        }\n    };\n});\nwindow.Alpine.data('carousel', function (persistenceKey = '') {\n    return {\n        //@ts-ignore\n        active: this.$persist(0).using(sessionStorage).as(`carouselIndex-${persistenceKey}`),\n        ready: false,\n        flkty: null,\n        init() {\n            let autoPlay = false;\n            if (!!this.$el.dataset.autoPlay) {\n                autoPlay = parseInt(this.$el.dataset.autoPlay);\n            }\n            this.flkty = new Flickity(this.$refs.carousel, {\n                wrapAround: true,\n                autoPlay: autoPlay,\n                initialIndex: this.active,\n                prevNextButtons: !!this.$el.dataset.buttons,\n                pageDots: !!this.$el.dataset.dots,\n                groupCells: true,\n            });\n            this.flkty.on('change', (i) => this.active = i);\n            this.ready = true;\n            this.$nextTick(() => {\n                this.flkty.resize();\n            });\n            window.addEventListener('resize', () => {\n                this.flkty.resize();\n            });\n        }\n    };\n});\nwindow.Alpine.data('messageBar', function () {\n    const sessionKey = 'messageBarCurrentItem';\n    const initialIndex = window.sessionStorage.getItem(sessionKey);\n    return {\n        messages: [],\n        // @ts-ignore\n        index: this.$persist(0).using(sessionStorage).as('messageBarCurrentIndex'),\n        get message() {\n            const message = this.messages[this.index];\n            if (message) {\n                return message;\n            }\n            return null;\n        },\n        show: true,\n        init() {\n            for (const el of this.$el.querySelectorAll('template')) {\n                if (el.dataset && el.dataset instanceof DOMStringMap && el.dataset.message) {\n                    const message = JSON.parse(JSON.stringify((el.dataset)));\n                    this.messages.push(message);\n                }\n            }\n            window.setInterval(() => {\n                if (this.index >= (this.messages.length - 1)) {\n                    this.index = 0;\n                }\n                else {\n                    this.index += 1;\n                }\n            }, 9500);\n        }\n    };\n});\nwindow.Alpine.directive('swipe', swipe);\n// DARK MODE\nwindow.Alpine.data('darkMode', function () {\n    return {\n        //@ts-ignore\n        isDarkMode: this.$persist(false).using(localStorage).as('darkMode'),\n        init() {\n            if (localStorage.getItem('darkMode') === null) {\n                this.isDarkMode = window.matchMedia('(prefers-color-scheme: dark)').matches;\n            }\n            this.applyDarkMode();\n            window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', (e) => {\n                if (localStorage.getItem('darkMode') === null) {\n                    this.isDarkMode = e.matches;\n                    this.applyDarkMode();\n                }\n            });\n        },\n        toggleDarkMode() {\n            this.isDarkMode = !this.isDarkMode;\n            this.applyDarkMode();\n        },\n        applyDarkMode() {\n            if (this.isDarkMode) {\n                document.documentElement.classList.add('dark');\n            }\n            else {\n                document.documentElement.classList.remove('dark');\n            }\n        }\n    };\n});\n// end dark mod\nconst auPhoneNumberMask = (input) => {\n    return input.startsWith('04') ? '9999 999 999' : '99 9999 9999';\n};\nexport { auPhoneNumberMask, initLiveChat, };\n// @ts-ignore\nif (!window.appConfig.alpineStarted) {\n    window.Alpine.start();\n    // @ts-ignore\n    window.appConfig.alpineStarted = true;\n}\n"],"names":["Typo","CodeMirrorSpellChecker","options","codeMirrorInstance","defineMode","String","prototype","includes","indexOf","apply","this","arguments","config","aff_loading","xhr_aff","XMLHttpRequest","open","onload","readyState","status","aff_data","responseText","num_loaded","typo","dic_data","platform","send","dic_loading","xhr_dic","rx_word","overlay","token","stream","ch","peek","word","next","check","mode","getMode","backdrop","overlayMode","console","log","module","exports","CodeMirror","startListening","cm","state","display","wrapper","offsetHeight","stopListening","lastWrapHeight","clientHeight","refresh","timeout","setTimeout","delay","hurry","clearTimeout","on","window","_cm","off","defineOption","val","autoRefresh","mod","setFullscreen","wrap","getWrapperElement","fullScreenRestore","scrollTop","pageYOffset","scrollLeft","pageXOffset","width","style","height","className","document","documentElement","overflow","setNormal","replace","info","scrollTo","old","Init","clearPlaceholder","placeholder","parentNode","removeChild","setPlaceholder","elt","createElement","cssText","direction","getOption","placeHolder","createTextNode","appendChild","lineSpace","insertBefore","firstChild","onComposition","empty","lineCount","input","getInputField","nodeName","getLine","length","test","querySelector","textContent","onBlur","isEmpty","onChange","prev","placeholderCompose","hasFocus","listRE","emptyListRE","unorderedListRE","incrementRemainingMarkdownListNumbers","pos","startLine","line","lookAhead","skipCount","startItem","exec","startIndent","nextLineNumber","nextLine","nextItem","nextIndent","newNumber","parseInt","nextNumber","itemNumber","isNaN","replaceRange","commands","newlineAndIndentContinueMarkdownList","Pass","ranges","listSelections","replacements","i","head","eolState","getStateAfter","inner","innerMode","name","helperType","execCommand","inList","list","inQuote","quote","match","cursorBeforeBullet","slice","endOfQuote","endOfList","indent","after","numbered","bullet","replaceSelections","base","combine","startState","basePos","baseCur","overlayPos","overlayCur","streamSeen","copyState","Math","min","start","combineTokens","textAfter","electricChars","blankLine","baseToken","overlayToken","doFold","noFold","Pos","regexpFlags","regexp","flags","ignoreCase","global","multiline","ensureFlags","current","target","charAt","RegExp","source","maybeMultiline","searchRegexpForward","doc","last","lastLine","lastIndex","string","from","index","to","searchRegexpForwardMultiline","chunk","curLine","before","split","inside","startCh","lastMatchIn","endMargin","newMatch","end","searchRegexpBackward","first","firstLine","searchRegexpBackwardMultiline","chunkSize","adjustPos","orig","folded","foldFunc","max","mid","len","searchStringForward","query","caseFold","fold","lines","search","found","cutFrom","endString","searchStringBackward","lastIndexOf","top","topString","SearchCursor","atOccurrence","afterEmptyMatch","clipPos","matches","reverse","normalize","str","toLowerCase","findNext","find","findPrevious","cmpPos","result","newText","origin","splitLines","defineExtension","defineDocExtension","cur","getSearchCursor","getCursor","push","anchor","setSelections","onCursorActivity","markedSelection","operation","update","clear","markedSelectionStyle","reset","CHUNK_SIZE","cmp","coverRange","addAt","array","cls","endLine","atEnd","mark","markText","splice","somethingSelected","coverStart","coverEnd","shift","pop","userAgent","navigator","gecko","ie_upto10","ie_11up","edge","ie","ie_version","documentMode","webkit","qtwebkit","chrome","chrome_version","presto","safari","vendor","mac_geMountainLion","phantom","ios","maxTouchPoints","android","mobile","mac","chromeOS","windows","presto_version","Number","flipCtrlCmd","captureRightClick","classTest","range","rmClass","node","removeChildren","e","count","childNodes","removeChildrenAndAdd","parent","tag","content","eltP","setAttribute","contains","child","nodeType","host","activeElt","rootNode","activeElement","ownerDocument","body","shadowRoot","addClass","joinClasses","a","b","as","createRange","endNode","r","setEnd","setStart","createTextRange","moveToElementText","collapse","moveEnd","moveStart","selectInput","select","root","element","getRootNode","win","defaultView","bind","f","args","Array","call","copyObj","obj","overwrite","prop","Object","hasOwnProperty","countColumn","tabSize","startIndex","startValue","n","nextTab","selectionStart","selectionEnd","value","_e","Delayed","id","time","handler","onTimeout","self","Date","set","ms","scrollerGap","toString","sel_dontScroll","scroll","sel_mouse","sel_move","findColumn","goal","col","skipped","spaceStrs","spaceStr","lst","arr","map","out","insertSorted","score","priority","nothing","createObj","props","inst","create","nonASCIISingleCaseWordChar","isWordCharBasic","toUpperCase","isWordChar","helper","extendingChars","isExtendingChar","charCodeAt","skipExtendingChars","dir","findFirst","pred","midF","ceil","floor","iterateBidiSections","order","part","level","bidiOther","getBidiPartAt","sticky","bidiOrdering","lowTypes","arabicTypes","charType","code","bidiRE","isNeutral","isStrong","countsAsLeft","countsAsNum","BidiSpan","outerType","types","i$1","type","i$2","type$1","i$3","prev$1","type$2","i$4","type$3","j","i$5","cur$1","type$4","i$6","end$1","replace$1","j$1","m","i$7","at","isRTL","j$2","nstart","unshift","getOrder","text","noHandlers","emitter","addEventListener","attachEvent","_handlers","concat","getHandlers","removeEventListener","detachEvent","signal","handlers","signalDOMEvent","override","preventDefault","defaultPrevented","e_defaultPrevented","codemirrorIgnore","signalCursorActivity","cursorActivity","curOp","cursorActivityHandlers","hasHandler","eventMixin","ctor","e_preventDefault","returnValue","e_stopPropagation","stopPropagation","cancelBubble","e_stop","e_target","srcElement","e_button","which","button","ctrlKey","zwspSupported","badBidiRects","dragAndDrop","div","zeroWidthElement","measure","offsetWidth","hasBadBidiRects","txt","r0","getBoundingClientRect","r1","left","right","splitLinesAuto","l","nl","rt","hasSelection","getSelection","te","selection","parentElement","compareEndPoints","hasCopyEvent","oncopy","badZoomedRects","hasBadZoomedRects","normal","fromRange","abs","modes","mimeModes","dependencies","defineMIME","mime","spec","resolveMode","mfactory","modeObj","modeExtensions","exts","modeProps","prop$1","extendMode","properties","nstate","a1","a2","StringStream","lineOracle","lastColumnPos","lastColumnValue","lineStart","size","Error","children","sz","getBetween","iter","getLines","updateLineHeight","diff","lineNo","no","lineAtHeight","h","outer","lh","isLine","lineNumberFor","lineNumberFormatter","firstLineNumber","equalCursorPos","copyPos","x","maxPos","minPos","clipLine","clipToLen","linelen","clipPosArray","eol","sol","undefined","eat","eatWhile","eatSpace","skipToEnd","skipTo","backUp","column","indentation","pattern","consume","caseInsensitive","cased","substr","hideFirstChars","oracle","SavedContext","Context","maxLookAhead","baseTokens","baseTokenPos","highlightLine","context","forceToEnd","st","modeGen","lineClasses","runMode","loop","o","overlays","i_end","opaque","styles","classes","bgClass","textClass","getLineStyles","updateFrontier","getContextBefore","resetState","maxHighlightLength","stateAfter","save","styleClasses","highlightFrontier","modeFrontier","precise","findStartLine","saved","fromSaved","processLine","viewFrom","viewTo","startAt","callBlankLine","readToken","copy","Token","takeToken","asArray","tokens","extractLineClasses","output","lineClass","flattenSpans","curStart","curStyle","addModeClass","mName","minindent","minline","lim","indented","retreatFrontier","sawReadOnlySpans","sawCollapsedSpans","seeReadOnlySpans","seeCollapsedSpans","MarkedSpan","marker","getMarkedSpanFor","spans","span","removeMarkedSpan","addMarkedSpan","op","inThisOp","WeakSet","markedSpans","has","add","attachLine","markedSpansBefore","isInsert","nw","inclusiveLeft","insertLeft","endsAfter","inclusiveRight","markedSpansAfter","endCh","startsBefore","stretchSpansOverChange","change","full","oldFirst","oldLast","sameLine","offset","span$1","clearEmptySpans","newMarkers","gapMarkers","gap","clearWhenEmpty","removeReadOnlyRanges","markers","readOnly","parts","mk","p","newParts","dfrom","dto","detachMarkedSpans","detachLine","attachMarkedSpans","extraLeft","extraRight","compareCollapsedMarkers","lenDiff","aPos","bPos","fromCmp","toCmp","collapsedSpanAtSide","sps","sp","collapsed","collapsedSpanAtStart","collapsedSpanAtEnd","collapsedSpanAround","conflictingCollapsedRange","visualLine","merged","visualLineEnd","visualLineContinued","visualLineNo","lineN","vis","visualLineEndNo","lineIsHidden","widgetNode","lineIsHiddenInner","heightAtLine","lineObj","lineLength","found$1","findMaxLine","d","maxLine","maxLineLength","maxLineChanged","Line","estimateHeight","updateLine","estHeight","cleanUpLine","styleToClassCache","styleToClassCacheWithMode","interpretTokenStyle","cache","buildLineContent","lineView","builder","pre","trailingSpace","splitSpaces","rest","addToken","buildToken","buildTokenBadBidi","insertLineContent","externalMeasured","maps","caches","lastChild","defaultSpecialCharPlaceholder","title","startStyle","endStyle","css","attributes","displayText","special","specialChars","mustWrap","createDocumentFragment","txt$1","tabWidth","specialCharPlaceholder","fullStyle","attr","trailingBefore","spaceBefore","buildCollapsedSpan","ignoreWidget","widget","needsContentAttribute","setUneditable","allText","spanStyle","spanEndStyle","spanStartStyle","nextChange","Infinity","foundBookmarks","endStyles","upto","tokenText","LineView","hidden","buildViewArray","nextPos","view","operationGroup","pushOperation","ops","ownsGroup","delayedCallbacks","fireCallbacksForOps","group","callbacks","cursorActivityCalled","finishOperation","endCb","orphanDelayedCallbacks","signalLater","fireOrphanDelayed","delayed","updateLineForChanges","dims","changes","updateLineText","updateLineGutter","updateLineClasses","updateLineWidgets","ensureLineWrapped","replaceChild","zIndex","updateLineBackground","background","getLineContent","ext","built","wrapClass","gutter","gutterBackground","gutterClass","fixedGutter","fixedPos","gutterTotalWidth","gutterMarkers","lineNumbers","wrap$1","gutterWrap","lineNumber","gutterLeft","k","gutterSpecs","gutterWidth","alignable","isWidget","nextSibling","insertLineWidgets","buildLineElement","insertLineWidgetsFor","allowAbove","widgets","ws","handleMouseEvents","positionLineWidget","above","noHScroll","wrapperWidth","coverGutter","paddingLeft","position","marginLeft","widgetHeight","parentStyle","gutters","clientWidth","eventInWidget","getAttribute","sizer","mover","paddingTop","offsetTop","paddingVert","paddingH","cachedPaddingH","getComputedStyle","currentStyle","data","paddingRight","scrollGap","nativeBarWidth","displayWidth","scroller","barWidth","displayHeight","barHeight","ensureLineHeights","rect","wrapping","lineWrapping","curWidth","heights","rects","getClientRects","bottom","mapFromLineView","updateExternalMeasurement","lineMeasure","measureChar","bias","measureCharPrepared","prepareMeasureForLine","findViewForLine","findViewIndex","getDimensions","forceUpdate","hasHeights","prepared","varHeight","key","measureCharInner","bogus","rtop","rbottom","measureText","nullRect","nodeAndOffsetInLineMap","mStart","mEnd","getUsefulRect","place","maybeUpdateRectForZooming","rSpan","charWidth","rbot","bot","singleCursorHeightPerLine","screen","logicalXDPI","deviceXDPI","scaleX","scaleY","logicalYDPI","deviceYDPI","clearLineMeasurementCacheFor","clearLineMeasurementCache","externalMeasure","clearCaches","cachedCharWidth","cachedTextHeight","lineNumChars","pageScrollX","pageScrollY","marginTop","widgetTopHeight","intoCoordSystem","includeWidgets","yOff","viewOffset","lOff","xOff","fromCoordSystem","coords","localBox","lineSpaceBox","charCoords","cursorCoords","preparedMeasure","get","getBidi","partPos","invert","other","estimateCoords","PosWithInfo","outside","xRel","coordsChar","y","coordsCharInner","rangeEnd","wrappedLineExtent","begin","wrappedLineExtentChar","boxIsAfter","box","ltr","coordsBidiPartWrapped","coordsBidiPart","baseX","chAround","boxAround","atLeft","atStart","_lineNo","ref","closestDist","endX","dist","textHeight","clientLeft","offsetLeft","compensateForHScroll","th","perLine","widgetsHeight","estimateLineHeights","est","posFromMouse","liberal","forRect","space","clientX","clientY","e$1","colDiff","round","regChange","lendiff","updateLineNumbers","viewChanged","resetView","cut","viewCuttingPoint","cut$1","cutTop","cutBot","regLineChange","oldN","newN","adjustView","countDirtyView","dirty","updateSelection","showSelection","prepareSelection","primary","curFragment","cursors","selFragment","customCursor","$customCursor","sel","primIndex","drawSelectionCursor","showCursorWhenSelecting","drawSelectionRange","cursor","cursorHeight","charPos","defaultCharWidth","otherCursor","cmpCoords","fragment","padding","leftSide","rightSide","sizerWidth","docLTR","drawForLine","fromArg","toArg","lineLen","wrapX","side","extent","fromPos","toPos","openStart","openEnd","openRight","topLeft","topRight","botLeft","botRight","sFrom","sTo","fromLine","toLine","singleVLine","leftEnd","rightStart","restartBlink","focused","clearInterval","blinker","cursorDiv","visibility","cursorBlinkRate","setInterval","ensureFocus","focus","onFocus","delayBlurEvent","delayingBlurEvent","draggingText","selForContextMenu","receivedFocus","updateHeightsInViewport","prevBottom","lineDiv","viewTop","oldHeight","mustScroll","updateWidgetHeight","chWidth","w","visibleLines","viewport","ensure","ensureFrom","ensureTo","maybeScrollWindow","doScroll","innerHeight","scrollNode","scrollIntoView","scrollPosIntoView","margin","limit","changed","endCoords","scrollPos","calculateScrollPos","startTop","startLeft","updateScrollTop","setScrollLeft","snapMargin","screentop","docBottom","atTop","atBottom","newTop","gutterSpace","screenleft","screenw","tooWide","addToScrollTop","resolveScrollToPos","ensureCursorVisible","scrollToPos","cursorScrollMargin","scrollToCoords","scrollToRange","scrollToCoordsRange","sPos","updateDisplaySimple","setScrollTop","startWorker","forceScroll","scrollHeight","scrollbars","isScroller","scrollWidth","alignHorizontally","measureForScrollbars","gutterW","docH","viewHeight","viewWidth","barLeft","docHeight","NativeScrollbars","vert","horiz","tabIndex","checkedZeroWidth","minHeight","minWidth","needsH","needsV","sWidth","totalHeight","totalWidth","zeroWidthHack","disableHoriz","enableZeroWidthBar","disableVert","bar","maybeDisable","elementFromPoint","NullScrollbars","updateScrollbars","startWidth","startHeight","updateScrollbarsInner","sizes","paddingBottom","heightForcer","borderBottom","scrollbarFiller","coverGutterNextToScrollbar","gutterFiller","scrollbarModel","initScrollbars","scrollbarStyle","axis","nextOpId","startOperation","updateInput","typing","changeObjs","selectionChanged","updateMaxLine","markArrays","endOperation","endOperations","endOperation_R1","endOperation_W1","endOperation_R2","endOperation_W2","endOperation_finish","maybeClipScrollbars","mustUpdate","DisplayUpdate","updatedDisplay","updateDisplayIfNeeded","barMeasure","adjustWidthTo","maxScrollLeft","preparedSelection","takeFocus","setDocumentHeight","postUpdateDisplay","wheelStartX","wheelStartY","maybeHiddenMarkers","unhidden","maybeUnhiddenMarkers","finish","runInOp","methodOp","docMethodOp","highlight","highlightWorker","workTime","changedLines","oldStyles","highlighted","oldCls","newCls","ischange","workDelay","force","visible","editorIsHidden","wrapperHeight","oldDisplayWidth","events","scrollbarsClipped","marginBottom","borderRightWidth","selectionSnapshot","active","anchorNode","extend","anchorOffset","focusNode","focusOffset","restoreSelection","snapshot","removeAllRanges","addRange","renderedView","maybeUpdateLineNumberWidth","viewportMargin","different","lastWrapWidth","toUpdate","selSnapshot","patchDisplay","selectionDiv","reportedViewFrom","reportedViewTo","updateNumbersFrom","container","rm","currentWheelTarget","updateNumber","updateGutterSpace","alignWidgets","comp","align","innerW","lineGutter","lineNumInnerWidth","lineNumWidth","getGutters","sawLineNumbers","renderGutters","specs","gElt","updateGutters","Display","clipPath","draggable","wheelDX","wheelDY","activeTouch","init","wheelSamples","wheelPixelsPerUnit","wheelEventDelta","dx","wheelDeltaX","dy","wheelDeltaY","detail","HORIZONTAL_AXIS","VERTICAL_AXIS","wheelDelta","wheelEventPixels","delta","onScrollWheel","chromeScrollHack","pointerEvents","pixelsPerUnit","deltaMode","deltaX","deltaY","canScrollX","canScrollY","pixels","movedX","movedY","sample","Selection","equals","here","there","deepCopy","Range","normalizeSelection","mayTouch","selectionsMayTouch","prim","sort","inv","simpleSelection","changeEnd","adjustForChange","computeSelAfterChange","offsetPos","computeReplacedSel","hint","oldPrev","newPrev","loadMode","modeOption","resetModeState","isWholeLineUpdate","wholeLineUpdateBefore","updateDoc","spansFor","linesFor","lastText","lastSpans","nlines","insert","remove","added","added$1","added$2","linkedDocs","sharedHistOnly","propagate","skip","sharedHist","linked","rel","shared","attachDoc","setDirectionClass","directionChanged","History","done","undone","undoDepth","lastModTime","lastSelTime","lastOp","lastSelOp","lastOrigin","lastSelOrigin","generation","maxGeneration","historyChangeFromChange","histChange","attachLocalSpans","clearSelectionEvents","lastChangeEvent","hist","addChangeToHistory","selAfter","opId","history","historyEventDelay","pushSelectionToHistory","selectionEventCanBeMerged","addSelectionToHistory","clearRedo","dest","existing","removeClearedSpans","explicitlyCleared","getOldSpans","mergeOldSpans","stretched","oldCur","stretchCur","copyHistoryArray","newGroup","instantiateSel","event","newChanges","extendRange","posBefore","extendSelection","setSelection","extendSelections","heads","replaceOneSelection","setSimpleSelection","filterSelectionChange","setSelectionReplaceHistory","setSelectionNoUndo","NaN","setSelectionInner","skipAtomicInSelection","reCheckSelection","mayClear","newAnchor","skipAtomic","newHead","skipAtomicInner","oldPos","preventCursorLeft","selectLeft","preventCursorRight","selectRight","atomic","near","movePos","far","cantEdit","selectAll","filterChange","canceled","cancel","makeChange","ignoreReadOnly","suppressEdits","makeChangeInner","makeChangeSingleDoc","rebased","rebaseHist","makeChangeFromHistory","allowSelectionOnly","suppress","antiChanges","filter","returned","v","shiftDoc","distance","removed","makeChangeSingleDocInEditor","recomputeMaxLength","checkWidthStart","changesHandler","changeHandler","assign","rebaseHistSelSingle","rebaseHistArray","sub","ok","copied","changeLine","handle","changeType","LeafChunk","BranchChunk","removeInner","insertInner","iterN","remaining","leaf","maybeSpill","me","sibling","myIndex","used","LineWidget","opt","adjustScrollWhenAboveVisible","addLineWidget","insertAt","aboveVisible","this$1","oldH","nextMarkerId","TextMarker","markTextShared","replacedWith","addToHistory","clearOnEnter","clearHistory","withOp","visual","dHeight","SharedTextMarker","cloneNode","isParent","findSharedMarkers","findMarks","copySharedMarkers","mFrom","mTo","subMark","detachSharedMarkers","subMarker","nextDocId","Doc","lineSep","cleanGeneration","constructor","getValue","join","lineSeparator","setValue","getRange","getLineHandle","getLineNumber","getLineHandleVisualStart","setCursor","extendSelectionsBy","addSelection","getSelections","replaceSelection","dup","newSel","undo","redo","undoSelection","redoSelection","setExtending","getExtending","historySize","markClean","changeGeneration","forceSplit","isClean","gen","getHistory","setHistory","histData","setGutterMarker","gutterID","clearGutter","lineInfo","addLineClass","where","removeLineClass","removeLineWidget","setBookmark","realOpts","findMarksAt","getAllMarks","posFromIndex","sepSize","indexFromPos","copyHistory","linkedDoc","unlinkDoc","splitIds","iterLinkedDocs","getEditor","setDirection","eachLine","lastDrop","onDrop","clearDragCursor","files","dataTransfer","isReadOnly","FileReader","File","read","markAsReadAndPasteIfAllFilesAreRead","t","readTextFromFile","file","allowDropFileTypes","reader","onerror","readAsText","text$1","getData","selected","onDragStart","setData","effectAllowed","setDragImage","img","src","_top","onDragOver","frag","dragCursor","forEachCodeMirror","getElementsByClassName","byClass","editors","globalsRegistered","ensureGlobalHandlers","registerGlobalHandlers","resizeTimer","onResize","setSize","keyNames","fromCharCode","keyMap","normalizeKeyName","alt","ctrl","cmd","normalizeKeyMap","keymap","keyname","keys","lookupKey","getKeyMap","fallthrough","isModifierKey","keyCode","addModifierNames","noShift","altKey","metaKey","shiftKey","keyName","altGraphKey","deleteNearSelection","compute","kill","toKill","replaced","moveCharLogically","moveLogically","endOfLine","visually","prep","targetTop","moveVisually","bidi","mv","getWrappedLineExtent","moveInStorageOrder","searchInVisualLine","getRes","res","nextCh","basic","pcDefault","emacsy","macDefault","singleSelection","killLine","deleteLine","delLineLeft","delWrappedLineLeft","delWrappedLineRight","rightPos","goDocStart","goDocEnd","goLineStart","goLineStartSmart","lineStartSmart","goLineEnd","lineEnd","goLineRight","goLineLeft","goLineLeftSmart","goLineUp","moveV","goLineDown","goPageUp","goPageDown","goCharLeft","moveH","goCharRight","goColumnLeft","goColumnRight","goWordLeft","goGroupRight","goGroupLeft","goWordRight","delCharBefore","deleteH","delCharAfter","delWordBefore","delWordAfter","delGroupBefore","delGroupAfter","indentAuto","indentSelection","indentMore","indentLess","insertTab","insertSoftTab","spaces","defaultTab","transposeChars","newlineAndIndent","sels","indentLine","openLine","toggleOverwrite","firstNonWS","inWS","doHandleBinding","bound","dropShift","ensurePolled","prevShift","lookupKeyForEditor","keyMaps","extraKeys","stopSeq","dispatchKey","seq","keySeq","dispatchKeyInner","handleKeyBinding","motion","handleCharBinding","lastStoppedKey","onKeyDown","getField","handled","showCrossHair","up","onKeyUp","onKeyPress","charCode","lastClick","lastDoubleClick","DOUBLECLICK_DELAY","PastClick","clickRepeat","now","compare","onMouseDown","supportsTouch","clickInGutter","repeat","selectingText","handleMappedButton","leftButtonDown","onContextMenu","configureMouse","option","unit","addNew","moveOnDrag","contained","behavior","dragDrop","leftButtonStartDrag","leftButtonSelect","moved","dragEnd","mouseMove","dragStart","preventScroll","e2","rangeForUnit","findWordAt","ourRange","ourIndex","startSel","lastPos","extendTo","startCol","posCol","leftPos","oldRange","ranges$1","bidiSimplify","editorSize","counter","curCount","move","buttons","anchorLine","boundary","headIndex","usePart","gutterEvent","prevent","mX","mY","touches","lineBox","g","contextMenuInGutter","themeChanged","theme","defaults","optionHandlers","defineOptions","deflt","notOnInit","newBreaks","spellcheck","autocorrect","autocapitalize","detach","attach","wrappingChanged","integer","blur","readOnlyChanged","screenReaderLabelChanged","dragDropChanged","resetPosition","funcs","dragFunctions","toggle","enter","over","leave","drop","inputStyles","inputStyle","pasteIncoming","cutIncoming","autofocus","registerEventHandlers","finishInit","initHooks","textRendering","touchFinished","prevTouch","finishTouch","isMouseLikeTouchEvent","touch","radiusX","radiusY","farAway","pageX","pageY","inp","how","aggressive","curSpace","curSpaceString","indentUnit","indentString","indentWithTabs","pos$1","defineInitHook","lastCopied","setLastCopied","newLastCopied","applyTextInput","inserted","deleted","recent","paste","textLines","multiPaste","pasteLinesPerSelection","lineWise","changeEvent","triggerElectric","handlePaste","pasted","clipboardData","disableInput","smartIndent","getModeAt","electricInput","copyableRanges","lineRange","disableBrowserMagic","field","hiddenTextarea","border","addEditorMethods","helpers","setOption","getDoc","addKeyMap","removeKeyMap","addOverlay","modeSpec","removeOverlay","newRanges","getTokenAt","getLineTokens","getTokenTypeAt","getHelper","getHelpers","help","_global","defaultTextHeight","getViewport","addWidget","vspace","hspace","triggerOnKeyDown","triggerOnKeyPress","triggerOnKeyUp","triggerOnMouseDown","findPosH","amount","hitSide","rtlMoveVisually","findPosV","goalColumn","goals","headPos","startChar","getScrollInfo","interpret","swapDoc","phrase","phraseText","phrases","getScrollerElement","getGutterElement","registerHelper","registerGlobalHelper","predicate","origDir","lineDir","findNextLine","moveOnce","boundToLine","astral","sawType","pageSize","moveAmount","ContentEditableInput","lastAnchorNode","lastAnchorOffset","lastFocusNode","lastFocusOffset","polling","composing","gracePeriod","readDOMTimeout","posToDOM","isInGutter","scan","badPos","bad","domTextBetween","closing","extraLinebreak","recognizeMarker","close","addText","walk","cmText","markerID","isBlock","nodeValue","domToPos","lineNode","locateNodeInLineView","textNode","topNode","curNode","previousSibling","dist$1","belongsToInput","onCopyCut","lineWiseCopyCut","clearData","kludge","hadFocus","showPrimarySelection","contentEditable","updateFromDOM","readFromDOMSoon","forceCompositionEnd","label","removeAttribute","showMultipleSelections","curAnchor","curFocus","rng","rangeCount","getRangeAt","startGracePeriod","rememberSelection","selectionInEditor","commonAncestorContainer","poll","pollSelection","pollInterval","pollContent","fromIndex","fromNode","toNode","toIndex","oldText","cutFront","cutEnd","oldTop","maxCutFront","newBot","oldBot","maxCutEnd","chFrom","chTo","TextareaInput","prevInput","pollingFast","resetting","fromTextArea","textarea","tabindex","realSubmit","form","leaveSubmitMethodAlone","submit","wrappedSubmit","getTextArea","toTextArea","addLegacyProps","createField","prepareCopyCut","fastPoll","dispatchEvent","Event","_display","opts","moveInputWithCursor","wrapOff","lineOff","teTop","teLeft","drawn","contextMenuPending","slowPoll","missed","same","resetSelectionOnContextMenu","oldScrollY","oldCSS","oldWrapperCSS","wrapperBox","offsetParent","scrollY","rehide","detectingSelectAll","prepareSelectAllHack","mouseup","extval","disabled","dontDelegate","method","func","version","factory","urlRE","modeConfig","codeDepth","gfmOverlay","codeBlock","ateSpace","s","difference","gitHubSpice","markdownConfig","taskLists","strikethrough","emoji","cmCfg","modeCfg","htmlMode","htmlModeMissing","findModeByName","mimes","highlightFormatting","maxBlockquoteDepth","fencedCodeBlockHighlighting","fencedCodeBlockDefaultMode","xml","tokenTypeOverrides","tokenTypes","header","list1","list2","list3","hr","image","imageAltText","imageMarker","formatting","linkInline","linkEmail","linkText","linkHref","em","strong","tokenType","hrRE","taskListRE","atxHeaderRE","allowAtxHeaderWithoutSpace","setextHeaderRE","textRE","fencedCodeRE","linkDefRE","punctuation","expandedTab","switchInline","inline","switchBlock","block","lineIsEmpty","linkTitle","indentedCode","htmlBlock","exit","htmlState","tagStart","tokenize","isInText","inlineNormal","blockNormal","trailingSpaceNewLine","prevLine","thisLine","firstTokenOnLine","prevLineLineIsEmpty","prevLineIsIndentedCode","prevLineIsHr","prevLineIsList","maxNonCodeIndentation","listStack","lineIndentation","indentationDiff","allowsInlineContinuation","fencedCodeEnd","isHr","getType","setext","listType","taskList","fencedEndRE","localMode","localState","local","footnoteLink","md_inside","returnType","currListInd","hasExitedList","maxFencedEndInd","taskOpen","taskClosed","listMod","handleText","matchCh","regex","previousFormatting","formattingEscape","atts","substring","leftFlanking","rightFlanking","setEm","setStrong","retType","getLinkHrefInside","linkRE","endChar","returnState","footnoteLinkInside","footnoteUrl","blockCommentStart","blockCommentEnd","closeBrackets","modeInfo","alias","findModeByMIME","findModeByExtension","findModeByFileName","filename","dot","htmlConfig","autoSelfClosers","implicitlyClosed","contextGrabbers","doNotIndent","allowUnquoted","allowMissing","xmlConfig","allowMissingTagName","editorConf","config_","setStyle","inText","chain","parser","inBlock","doctype","inTag","baseState","tagName","inAttribute","stringStartCol","closure","isInAttribute","terminator","depth","lower","startOfLine","noIndent","popContext","maybePopContext","nextTagName","parentTagName","tagNameState","closeTagNameState","attrState","matchClosing","closeState","closeStateErr","_stream","attrEqState","attrValueState","attrContinuedState","baseIndent","fullLine","multilineTagIndentPastTag","multilineTagIndentFactor","alignCDATA","tagAfter","grabbers","configuration","skipAttribute","xmlCurrentTag","xmlCurrentContext","cx","tabAndIndentMarkdownList","shiftTabAndUnindentMarkdownList","marked","isMac","anchorToExternalRegex","bindings","toggleBold","toggleItalic","drawLink","toggleHeadingSmaller","toggleHeadingBigger","drawImage","toggleBlockquote","toggleOrderedList","toggleUnorderedList","toggleCheckList","toggleCodeBlock","togglePreview","toggleStrikethrough","toggleHeading1","toggleHeading2","toggleHeading3","toggleHeading4","toggleHeading5","toggleHeading6","cleanBlock","drawTable","drawHorizontalRule","toggleSideBySide","toggleFullScreen","shortcuts","isMobile","opera","fixShortcut","createToolbarDropdown","enableTooltips","el","createToolbarButton","classList","onclick","childrenIndex","childElement","toolbarBuiltInButtons","enableActions","markup","attribute","classNamePrefix","toolbarButtonClassPrefix","innerText","action","actionName","tooltip","getBindingName","createTooltip","noDisable","noMobile","classNameParts","iconClasses","classNameIndex","classNamePart","icon","iconClassIndex","iconClass","innerHTML","createSep","getState","stat","ret","bold","italic","link","saved_overflow","editor","codemirror","sidebyside","sideBySideFullscreen","easyMDEContainer","onToggleFullScreen","maxHeight","removeProperty","setPreviewMaxHeight","toolbar_div","toolbarElements","fullscreen","_toggleBlock","blockStyles","fenceCharsToInsert","fencing_line","token_state","code_type","line_num","firstTok","lastTok","fencedChars","block_start","block_end","cur_start","cur_end","tok","is_code","start_text","start_line","end_text","end_line","fence_chars","search_from","next_line","next_line_last_tok","no_sel_and_starting_of_line","sel_multi","start_line_sel","end_line_sel","repl_start","repl_end","_replaceSelection","insertFencingAtSelection","_toggleLine","_toggleHeading","listStyle","unorderedListStyle","startPoint","endPoint","_cleanBlock","url","promptURLs","prompt","promptTexts","escapePromptURL","_toggleLink","insertTexts","encodeURI","drawUploadedImage","openBrowseFileWindow","afterImageUploaded","imageName","uploadedImage","text_link","updateStatusBar","imageTexts","sbOnUploaded","sbInit","table","horizontalRule","preview","toolbarButton","useSideBySideListener","previewNormal","toolbar","sideBySideRenderingFunction","newValue","previewRender","previewClass","isArray","preview_result","startEnd","currHeadingLevel","liststyle","listRegexp","whitespacesRegexp","repl","_toggle","untoggleOnly","char","_getChar","_checkChar","listTypes","currentType","firstLineText","isPreviewActive","start_chars","end_chars","humanFileSize","bytes","units","u","toFixed","_mergeProperties","property","wordCount","iconClassMap","default","timeFormat","locale","format","hour","minute","sbOnDragEnter","sbOnDrop","sbProgress","sizeUnits","errorMessages","noFileGiven","typeNotAllowed","fileTooLarge","importError","EasyMDE","autoDownloadFA","autoDownloadFontAwesome","styleSheets","href","getElementsByTagName","showIcons","uploadImage","plainText","markdown","parsingConfig","autosave","errorCallback","errorMessage","alert","imageMaxSize","imageAccept","imagePathAbsolute","imageCSRFName","imageCSRFHeader","imageInputName","unique_id","uniqueId","render","initialValue","foundSavedValue","imageUploadFunction","uploadImagesUsingCustomFunction","uploadImages","isLocalStorageAvailable","localStorage","setItem","removeItem","onSuccess","onError","names","uploadImageUsingCustomFunction","itemName","gui","statusbar","matchingClasses","markedOptions","renderingConfig","singleLineBreaks","breaks","codeSyntaxHighlighting","hljs","language","getLanguage","highlightAuto","use","htmlText","parse","sanitizerFunction","htmlDoc","DOMParser","parseFromString","listItems","listItem","listItemChild","HTMLInputElement","listStyleType","removeListStyleWhenCheckbox","linkString","fixedLinkString","addAnchorTargetBlank","_rendered","documentOnKeyDown","spellChecker","styleSelectedText","nativeSpellcheck","forceSync","cmWrapper","createToolbar","createStatusbar","enabled","_autosave_timeout","submit_delay","_vm","previewImagesInEditor","querySelectorAll","forEach","parentEl","hasAttribute","srcAttr","EMDEimagesCache","keySrc","imagesPreviewHandler","newSrc","assignImageBlockAttributes","naturalWidth","naturalHeight","sideBySide","createSideBySide","temp_cm","URL","baseURI","cleanup","easyMDE","binded","autosaveTimeoutId","loaded","getItem","getElementById","dd","Intl","DateTimeFormat","clearAutosavedValue","imageInput","click","onErrorSup","fillErrorMessage","imageUrl","formData","FormData","append","imageCSRFToken","request","upload","onprogress","lengthComputable","progress","total","imageUploadEndpoint","setRequestHeader","response","JSON","error","filePath","location","statusText","filledErrorMessage","borderTopWidth","previewMaxHeight","syncSideBySidePreviewScroll","cScroll","pScroll","ratio","parseFloat","onscroll","items","toolbarData","toolbarGuideIcon","hideIcons","nonSeparatorIconsFollow","item","toolbarTips","multiple","accept","opacity","onUpdate","onActivity","defaultValue","posLine","posColumn","isSideBySideActive","isFullscreenActive","EvEmitter","proto","eventName","listener","_events","listeners","once","onceEvents","_onceEvents","emitEvent","onceListeners","allOff","utils","num","ary","elem","selector","elems","makeArray","HTMLElement","reduce","ffElems","childElems","_class","methodName","threshold","timeoutName","onDocReady","$1","$2","htmlInit","WidgetClass","namespace","docReady","dataAttr","toDashed","dataAttrElems","jQuery","instance","fizzyUIUtils","Flickity","cells","_makeCells","cell","getCellsFragment","isAppend","slider","insertCellElement","endCells","_sizeCells","cellChange","positionSliderAtSelected","prepend","getCells","minCellIndex","removeFrom","cellSizeChange","getCell","getSize","changedCellIndex","prevSelectedElem","selectedElement","_positionCells","_updateWrapShiftCells","setGallerySize","selectedIndex","getCellSlideIndex","slides","animatePrototype","isAnimating","restingFrames","animate","applyDragForce","applySelectedAttraction","previousX","integratePhysics","positionSlider","settle","requestAnimationFrame","isWrapping","modulo","slideableWidth","shiftWrapCells","setTranslateX","dispatchScrollEvent","is3d","cursorPosition","rightToLeft","translateX","getPositionValue","transform","firstSlide","positionX","slidesWidth","selectedSlide","velocity","percentPosition","innerWidth","isPointerDown","isFreeScrolling","beforeGap","_shiftCells","beforeShiftCells","afterGap","afterShiftCells","cellShift","_wrapShiftCell","outerWidth","_renderCellPosition","getFrictionFactor","isDraggable","dragForce","dragX","applyForce","selectedAttraction","Cell","cellClassName","unselect","destroy","_Flickity","Slide","GUID","instances","queryElement","getQueryElement","flickityGUID","$element","_create","accessibility","cellAlign","freeScrollFriction","friction","namespaceJQueryEvents","resize","watchCSS","guid","beginMargin","_createSlider","focusableElems","activate","isActive","cellElems","_filterFindCellElements","reloadCells","selectInitialIndex","isInitActivated","filterFindElements","cellSelector","positionCells","cellElem","getLastCell","getLastSlide","maxCellHeight","cellX","startCell","outerHeight","updateSlides","_containSlides","renderX","positionValue","slide","canCellFit","_getCanCellFit","addCell","slideWidth","firstMargin","updateTarget","updateSelectedSlide","groupCells","number","percent","percentMatch","groupWidth","_init","reposition","setCellAlign","cellAlignShorthands","center","shorthand","adaptiveHeight","getIsWrapping","_unshiftCells","beforeGapX","_getGapCells","afterGapX","wrapAround","gapWidth","gapX","cellIndex","increment","contain","contentWidth","beginBound","endBound","emitArgs","$event","jQEvent","trigger","unidraggerEvents","_emitEvent","clickedCell","getParentCell","isWrap","isInstant","_wrapSelect","prevIndex","startAnimation","isDragSelect","wrapIndex","backWrapDelta","forewardWrapDelta","previous","unselectSelectedSlide","selectedCells","selectedElements","getCellElements","selectedCell","initialIndex","queryCell","selectCell","cellSlide","Boolean","closest","getAdjacentCellElements","adjCount","slideIndex","uiChange","onresize","debounceMethod","isDragging","deactivate","onkeydown","keyboardHandlers","some","ArrowLeft","ArrowRight","removeData","jQueryBridget","setJQuery","jq","Unidragger","dragThreshold","getScrollPosition","touchActionValue","drag","onActivateDrag","_uiChangeDrag","onDeactivateDrag","updateDraggable","handlePointerDown","handlePointerUp","handlePointerDone","handleDragStart","handleDragMove","handleDragEnd","handleStaticClick","handles","bindHandles","unbindHandles","bindActivePointerEvents","isTouchStart","isTouchPointer","pointerType","isFocusNode","pointerDownScroll","hasDragStarted","moveVector","isTouchScrolling","dragStartPosition","pointer","previousDragX","originBound","dragMoveTime","freeScroll","dragEndRestingSelect","restingX","getRestingPosition","dragEndBoostSelect","getSlideDistance","positiveResting","_getClosestResting","negativeResting","minDistance","condition","minDist","isWrapAround","scrollMoveX","scrollMoveY","pointerDone","imagesLoaded","lazyAttr","lazySrcAttr","lazySrcsetAttr","imgSelector","lazyLoad","handleLazyLoadComplete","onLazyLoadComplete","getCellLazyImages","cellAttr","cellSrcAttr","cellSrcsetAttr","LazyLoader","onComplete","load","flat","handleEvent","srcset","complete","PageDots","holder","dots","setDots","slidesLength","addDots","removeDots","newDots","fill","updateSelected","selectedDot","pageDots","handlePageDotsClick","onPageDotsClick","activatePageDots","updateSelectedPageDots","updatePageDots","deactivatePageDots","Player","autoPlay","onTick","onVisibilityChange","visibilityChange","onVisibilityPlay","visibilityPlay","play","tick","stop","pause","unpause","pauseAutoPlayOnHover","player","activatePlayer","stopPlayer","deactivatePlayer","playPlayer","pausePlayer","unpausePlayer","onmouseenter","onmouseleave","svgURI","PrevNextButton","arrowShape","isPrevious","isLeft","disable","svg","createSVG","createElementNS","path","pathMovements","shape","x0","x1","x2","x3","y1","y2","getArrowMovements","enable","prevNextButtons","prevDirection","nextDirection","prevButton","nextButton","handlePrevButtonClick","handleNextButtonClick","activatePrevNextButtons","updatePrevNextButtons","updatePrevNextButton","disabledIndex","isEnabled","deactivatePrevNextButtons","lastCell","lastMargin","getStyleSize","measurements","measurement","getZeroSize","isBorderBox","boxSizing","paddingWidth","paddingHeight","marginWidth","marginRight","marginHeight","borderWidth","borderLeftWidth","borderHeight","borderBottomWidth","styleWidth","styleHeight","$","ImagesLoaded","onAlways","queryElem","elements","getImages","jqDeferred","Deferred","images","addElementImages","elementNodeTypes","addImage","addElementBackgroundImages","childImgs","reURL","LoadingImage","Background","Image","backgroundImage","addBackground","loadingImage","progressedCount","hasAnyBroken","onProgress","message","isLoaded","notify","debug","isComplete","jqMethod","getIsImageComplete","confirm","proxyImage","crossOrigin","currentSrc","unbindEvents","makeJQueryPlugin","fn","promise","assertPath","TypeError","stringify","normalizeStringPosix","allowAboveRoot","lastSegmentLength","lastSlash","lastSlashIndex","posix","resolve","cwd","resolvedPath","resolvedAbsolute","process","isAbsolute","trailingSeparator","joined","arg","relative","fromStart","fromEnd","fromLen","toStart","toLen","lastCommonSep","fromCode","_makeLong","dirname","hasRoot","matchedSlash","basename","extIdx","firstNonSlashEnd","extname","startDot","startPart","preDotState","pathObject","sep","_format","delimiter","win32","LCVariablePush","custom_variables","appConfig","LC_default_params","results","country_variant","quantity","LC_API","set_custom_variables","LiveChatWidget","__lc","license","asyncInit","c","_h","_q","_v","async","user","email","on_after_load","wwwApi","cart","getCart","then","initialImageUrl","initialImageTitle","fullScreen","hideGallery","activeImage","imageLoading","setActiveImage","imageLoaded","thumbnailClick","sourceDataEl","sourceDataset","dataset","shiftActiveImage","findIndex","nextImage","previousImage","urls","$root","thumbnail","customEvent","initialActiveVariantSku","variantSelectorDataEl","variantDataEl","variants","sku","variant","entries","pricing","dealer_price_ex_tax","rrp_ex_tax","rrp_inc_tax","go_price_ex_tax","go_price_inc_tax","clearance_corner_offer","thumbnailEl","variantSelectors","selectors","optionsByHash","hash","queryString","searchParams","compatibilityMatrix","levels","selectorCount","otherLevel","thisLevelHash","otherLevelHash","compatList","buildCompatibilityMatrix","initialSelectedOption1Hash","initialSelectedOption2Hash","initialSelectedOption3Hash","initialSelectedOption1","initialSelectedOption2","initialSelectedOption3","enhanceOptionsWithVariantData","representativeVariant","matchingVariants","optionLevel","selectedOptions","matchWithSelectedOption","findRepresentativeVariant","isAvailable","warn","otherOption","determineIfOptionIsAvailable","levelIndex","optionIndex","showDealerPrice","activeVariantSku","supersededBy","isBuyBoxSticky","compactView","activeVariant","setActiveVariant","firstThumbnail","imageTitle","variantChangeEvent","CustomEvent","params","encodeURIComponent","replaceState","htmx","getSkuForOption","getVariantForOption","getOptionVariant","isOptionAvailable","selectOption","otherLevels","foundCompatibleSelection","compatibleOptions","compatibleOption","validVariant","variantSku","selectNextOption","currentIndex","nextIndex","selectPreviousOption","activeTab","upsellDrawerOpen","addToCartSuccess","displayTradePrice","$persist","using","sessionStorage","formatMoney","toLocaleString","minimumFractionDigits","maximumFractionDigits","incrementQuantity","decrementQuantity","$el","modifiers","expression","evaluate","intendedDirection","pageWidth","coordinates","startX","startY","endY","ev","screenX","screenY","changedTouches","angle","atan","PI","dictionary","affData","wordsData","settings","rules","dictionaryTable","compoundRules","compoundRuleCodes","replacementTable","memoized","_len","_jlen","setup","runtime","browser","dictionaryPath","readDataFile","getURL","setAffData","setWordsData","__dirname","setFunc","_readFile","asyncLoad","_parseAFF","rule","ONLYINCOMPOUND","_parseDIC","ruleText","expressionText","character","loadedCallback","charset","_a","req_1","overrideMimeType","Promise","reject","fs","existsSync","readFileSync","numEntries","lineParts","_removeAffixComments","trim","definitionParts","ruleType","ruleCode","combineable","charactersToRemove","additionParts","charactersToAdd","continuationClasses","parseRuleCodes","regexToMatch","entry","_removeDicComments","addWord","ruleCodesArray","NEEDAFFIX","newWords","_applyRule","ii","_iilen","newWord","combineCode","combineRule","otherNewWords","iii","_iiilen","textCodes","FLAG","continuationRule","aWord","trimmedWord","checkExact","capitalizedWord","hasFlag","uncapitalizedWord","ruleCodes","COMPOUNDMIN","flag","wordFlags","alphabet","suggest","memoizedLimit","replacementEntry","correctedWord","alphaArray","alphaHash","edits1","words","known_only","_edit","rv","alphabetLength","word_1","lettercase","replacementLetter","ed1","weighted_corrections","ed1word","sorted_corrections","a_val","b_val","localeCompare","capitalization_scheme","working_limit","correct","startEvent","activeEvents","PointerEvent","_bindHandles","bindMethod","touchAction","unbindActivePointerEvents","withPointer","pointerId","pointerIdentifier","withTouch","changedTouch","identifier","onmousedown","pointerDown","ontouchstart","onpointerdown","cursorNodes","clickTypes","isCursorNode","isClickType","isOkayElement","pointerDownPointer","onmousemove","pointerMove","onpointermove","ontouchmove","dragMove","isPreventingClicks","onmouseup","pointerUp","onpointerup","ontouchend","staticClick","onpointercancel","ontouchcancel","pointerCancel","isMouseup","isIgnoringMouseUp","client","csrfToken","createHeaders","contentType","headers","sendRequest","fetch","genURL","url_string","APIComponent","api","v1","brandgroups","json","brands","updateCart","pk","deleteCart","selectDiscount","offer","choice","icds","categorySlug","brand","catalogue","getSlugFromUrl","pathname","cataloguePath","slug","CartComponent","RecentSalesComponent","BrandGroupsComponent","BrandsComponent","CatalogueComponent","CollectionsComponent","DiscountsComponent","FreightComponent","ProductsComponent","OrdersComponent","ItemsComponent","recentSales","collections","discounts","freight","products","orders","reboxedItems","getDetail","page","estimate","suburbUUID","dropship","weight","suburb","suburbs","country","localStore","countryCode","Client","uuid","offers","getCurrent","overrideOffers","lineItems","setFreightCharge","splitLine","lineId","newLineQuantity","line_id","new_line_quantity","resetFreightCharge","category","getOrdersForProduct","getForProduct","getRecentSales","recent_sales","initialData","uploadQueue","selectedFiles","bulkCategory","bulkAssignment","showAIModalFlag","aiSelectedFile","aiAction","isDragOver","isProcessing","aiProcessing","aiSelectedSchema","aiContext","aiProductName","urlInput","urlType","isProcessingUrl","urlProcessingStatus","draggedFile","dragOverZone","draggedProductAssetIndex","draggedContentLibraryIndex","galleryDragOverIndex","resourceDragOverIndex","draggedAssetZone","$store","product","getUploadedFiles","galleryFiles","on_product_page","product_page_type","product_page_rank","resourceFiles","fileUpdateUrl","pat","getRoutes","fileUpdatePattern","fileDeleteUrl","fileDeletePattern","fileAIUrl","fileAIProcessPattern","schemaStructureUrl","specsSchemaStructurePattern","specsSchema","httpJson","fileList","setUploadedFiles","catch","err","toastError","Alpine","store","closeCropModal","saveCrop","clearCrop","startContentLibraryDrag","allowContentLibraryDrop","targetIndex","dropContentLibraryFile","reorder","reorderContentLibraryFiles","payload","file_id","rank","product_id","getProductPk","fileReorder","patchFile","content_library_rank","toastSuccess","handleDrop","processFiles","handleFileSelect","fileObj","random","assignment","startsWith","readAsDataURL","processUploadQueue","uploadSingleFile","fileUploadProduct","httpForm","fileRecord","product_page_file_id","addOrUpdateFile","retryUpload","uploadFromURL","isValidURL","getFilenameFromURL","is_content_url","_","parsed","hostname","updateFileCategory","httpURLEncoded","updateFileAssignment","updateFileName","newName","msg","deleteFile","removeFileById","startProductPageDrag","addToProductPage","zone","assetsAdd","asset","removeFromProductPage","assetsRemove","startProductAssetDrag","allowProductAssetDrop","clearDragOverIndex","dropProductAsset","sourceList","updates","assetsReorder","assets","reload","allowDrop","canDropInZone","removeAsset","assetId","uploadedFile","otherZone","otherZoneFiles","showAIModal","selectedSchema","processWithAI","productName","schemaStructure","suggestions","applySuggestions","description","setAIDescription","categories","validCategories","confidence","setAICategories","setShowAiSuggestions","spec_values","custom_specs","setAISpecs","customSpecs","suggestedSchema","specValues","retryImageProcessing","fileRetryProcessingPattern","processing_status","cropModalFile","cropperInstance","fileCropUrl","fileCropPattern","openCropModal","$nextTick","file_url","Cropper","viewMode","autoCropArea","movable","zoomable","scalable","ready","crop_box","cd","getCanvasData","setCropBoxData","getCropBoxData","canvasData","formatFileSize","pow","initProductPk","productPk","initProductSlug","productSlug","initRoutes","routes","basicInfoCollapsed","initialBaseVariantsSnapshot","initialCountryVariantsSnapshot","initialStoreVariantsSnapshot","countries","loading","draggedIndex","newVariants","storeProductExists","creatingStoreProduct","specsCollapsed","specsLoading","availableSchemas","schemaSections","newCustomSpec","field_type","availableCustomSpecs","publishingCollapsed","publishingData","publishingLoading","storeProductPublished","originalStoreProductPublished","countryChanges","originalCountryStates","showVariantImageModal","selectedVariantForModal","draggedImageIndex","generateSlug","setProductPk","setProductSlug","setRoutes","applyAISpecs","validateUnsavedVariants","showVariantValidationError","hashBaseVariant","published","gtin","selector_1","selector_2","selector_3","variant_images","extractCountryVariantPublishMap","country_variants","cv","country_code","extractStoreVariantPublishMap","store_variant_published","snapshotAll","saveProductProgressive","createStoreProduct","setShowSaveProgressModal","setSavingError","setCurrentSavingStep","changedBase","changedCountry","changedStore","hasSpecs","hasPublishing","hasPublishingChanges","willCreateStoreProduct","willUpdateStore","steps","updateVariants","updateCountryVariants","specsPayload","schema_slug","specsSave","savePublishingChanges","success","updateStoreVariants","$refs","productForm","setSavingSteps","dismissProgressModal","applySpecsSuggestions","loadSchemaStructure","applySpecValues","fieldMap","sectionMap","groupMap","section","fields","groups","aiSectionKey","aiSectionData","sectionId","aiFieldKey","aiFieldData","groupKey","groupInstances","groupId","normalizedKey","instanceKey","instanceData","fullInstanceKey","fieldKey","fieldData","fieldId","getFieldById","toValueObj","ctx","default_unit","context_text","allows_multiple_values","groupField","loadVariants","variantsList","store_product_exists","addNewVariant","tempId","saving","saveNewVariant","newVariant","fd","variantCreate","serverVariant","savedVariant","creatingCountryVariants","countryVariantAttempts","removeNewVariant","monitorCountryVariants","checkInterval","countryVariantError","checkCountryVariants","refreshedVariant","startDrag","updateRanks","getStoreVariantPublished","variantId","updateStoreVariantPublished","errorData","showVariantImageSelectionModal","closeVariantImageModal","getAvailableImagesForVariant","vImg","assignImageToVariant","variantImageAssign","variant_id","vimg","variant_image","vi","removeImageFromVariant","variantImage","file_name","variantImageRemove","reorderVariantImages","newImageOrder","variantImageReorder","sections","initializeSpecValues","loadExistingSpecs","specsLoad","loadAvailableCustomSpecs","customSpecsList","initializeFieldValue","hasAIInstances","range_min","range_max","supports_context","createFieldValueObject","addGroupInstance","existingInstances","removeGroupInstance","_reindexGroupInstances","prefix","oldKey","newKey","getGroupInstances","addRepeatableInstance","newInstanceKey","removeRepeatableInstance","addMultipleValue","fieldPath","removeMultipleValue","valueIndex","addCustomSpec","is_new","addExistingCustomSpec","customSpecId","existingSpec","removeCustomSpec","saveSpecs","loadPublishingStatus","publishingStatus","storeProduct","store_product","markStoreProductChanged","updateCountryPublished","storeChanged","countriesChanged","storeProductChanged","updateStoreProduct","updateCountryProduct","getOverallPublishingStatus","getNotShowingReasons","baseOk","base_product_published","storeOk","exists","countriesOk","every","reasons","startVariantImageDrag","imageIndex","allowVariantImageDrop","dropVariantImage","removeVariantImage","setHeroImage","heroImageSet","aiData","customSpec","getCsrfToken","meta","cookie","decodeURIComponent","toFormUrlEncoded","handleResponse","raw","csrf","showSaveProgressModal","currentSavingStep","savingError","savingStepLabels","uploadedFiles","toasts","showAiSuggestions","aiSuggestions","getProductSlug","getCurrentSavingStep","shouldShowSaveProgressModal","getSavingError","getShowAiSuggestions","idx","patch","toast","startSaving","savingSteps","advanceStep","failSaving","finishSaving","labels","_defineProperties","descriptor","enumerable","configurable","writable","defineProperty","_toPropertyKey","_extends","_arrayLikeToArray","arr2","_createForOfIteratorHelperLoose","allowArrayLike","it","Symbol","iterator","minLen","_unsupportedIterableToArray","toPrimitive","_toPrimitive","getDefaults","baseUrl","extensions","gfm","headerIds","headerPrefix","hooks","langPrefix","mangle","pedantic","renderer","sanitize","sanitizer","silent","smartypants","tokenizer","walkTokens","xhtml","escapeTest","escapeReplace","escapeTestNoEncode","escapeReplaceNoEncode","escapeReplacements","getEscapeReplacement","escape","html","encode","unescapeTest","unescape","caret","edit","getRegex","nonWordAndColonTest","originIndependentUrl","cleanUrl","prot","baseUrls","justDomain","rtrim","relativeBase","protocol","domain","resolveUrl","noopTest","splitCells","tableRow","escaped","curr","suffLen","currChar","repeatString","outputLink","cap","lexer","inLink","inlineTokens","Tokenizer","_proto","newline","codeBlockStyle","fences","matchIndentToCode","indentToCode","matchIndentInNode","indentCodeCompensation","lang","_escapes","heading","trimmed","blockquote","blockTokens","istask","ischecked","endsWithBlankLine","rawLine","itemContents","endEarly","bull","isordered","ordered","loose","itemRegex","trimLeft","nextBulletRegex","hrRegex","fencesBeginRegex","headingBeginRegex","task","checked","trimRight","spacers","hasMultipleLineBreaks","def","rows","row","lheading","paragraph","inRawBlock","trimmedUrl","rtrimSlash","lastParenIndex","findClosingBracket","linkLen","reflink","links","nolink","emStrong","maskedSrc","prevChar","lDelim","nextChar","rDelim","rLength","lLength","delimTotal","midDelimTotal","endReg","rDelimAst","rDelimUnd","_text","codespan","hasNonSpaceChars","hasSpaceCharsOnBothEnds","br","del","autolink","prevCapZero","_backpedal","inlineText","_paragraph","_label","_title","listItemStart","_tag","_comment","reflinkSearch","_punctuation","blockSkip","escapedEmSt","_scheme","_email","_attribute","_href","middle","endAst","endUnd","_extended_email","Lexer","inlineQueue","lex","lexInline","Constructor","protoProps","staticProps","lastToken","cutSrc","lastParagraphClipped","_this","leading","tabs","extTokenizer","startBlock","tempSrc","tempStart","getStartIndex","errMsg","_this2","keepPrevChar","startInline","Renderer","_code","infostring","_html","slugger","listitem","checkbox","tablerow","tablecell","TextRenderer","Slugger","seen","serialize","getNextSafeSlug","originalSlug","isDryRun","occurenceAccumulator","dryrun","Parser","textRenderer","parseInline","l2","l3","itemBody","renderers","Hooks","preprocess","postprocess","parseMarkdown","callback","origOpt","throwError","checkSanitizeDeprecation","pending","all","_tokens","passThroughHooks","Set","setOptions","newDefaults","childTokens","_key","pack","prevRenderer","_len2","_key2","_loop","_len3","_key3","_loop2","prevTokenizer","_len4","_key4","_loop3","prevHook","_len5","_key5","_walkTokens","values","_step","_loop4","_step2","_iterator2","_step3","_iterator3","_step4","_iterator4","_cell","_iterator","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","getter","__esModule","definition","toStringTag","magic","subject","clipboard","writeText","show","forceOpen","alwaysOpen","handleResize","isOpen","persistenceKey","flkty","carousel","messages","DOMStringMap","directive","isDarkMode","matchMedia","applyDarkMode","toggleDarkMode","auPhoneNumberMask","alpineStarted"],"sourceRoot":""}