text: /* http://prismjs.com/download.html?themes=prism&languages=markup+css+clike+javascript */
  var _self = (typeof window !== 'undefined')
      ? window   // if in browser
      : (
      (typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope)
          ? self // if in worker
          : {}   // if in node js
  );
  
  /**
   * Prism: Lightweight, robust, elegant syntax highlighting
   * MIT license http://www.opensource.org/licenses/mit-license.php/
   * @author Lea Verou http://lea.verou.me
   */
  
  var Prism = (function(){
  
  // Private helper vars
      var lang = /\blang(?:uage)?-(?!\*)(\w+)\b/i;
  
      var _ = _self.Prism = {
          util: {
              encode: function (tokens) {
                  if (tokens instanceof Token) {
                      return new Token(tokens.type, _.util.encode(tokens.content), tokens.alias);
                  } else if (_.util.type(tokens) === 'Array') {
                      return tokens.map(_.util.encode);
                  } else {
                      return tokens.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/\u00a0/g, ' ');
                  }
              },
  
              type: function (o) {
                  return Object.prototype.toString.call(o).match(/\[object (\w+)\]/)[1];
              },
  
              // Deep clone a language definition (e.g. to extend it)
              clone: function (o) {
                  var type = _.util.type(o);
  
                  switch (type) {
                      case 'Object':
                          var clone = {};
  
                          for (var key in o) {
                              if (o.hasOwnProperty(key)) {
                                  clone[key] = _.util.clone(o[key]);
                              }
                          }
  
                          return clone;
  
                      case 'Array':
                          // Check for existence for IE8
                          return o.map && o.map(function(v) { return _.util.clone(v); });
                  }
  
                  return o;
              }
          },
  
          languages: {
              extend: function (id, redef) {
                  var lang = _.util.clone(_.languages[id]);
  
                  for (var key in redef) {
                      lang[key] = redef[key];
                  }
  
                  return lang;
              },
  
              /**
               * Insert a token before another token in a language literal
               * As this needs to recreate the object (we cannot actually insert before keys in object literals),
               * we cannot just provide an object, we need anobject and a key.
               * @param inside The key (or language id) of the parent
               * @param before The key to insert before. If not provided, the function appends instead.
               * @param insert Object with the key/value pairs to insert
               * @param root The object that contains `inside`. If equal to Prism.languages, it can be omitted.
               */
              insertBefore: function (inside, before, insert, root) {
                  root = root || _.languages;
                  var grammar = root[inside];
  
                  if (arguments.length == 2) {
                      insert = arguments[1];
  
                      for (var newToken in insert) {
                          if (insert.hasOwnProperty(newToken)) {
                              grammar[newToken] = insert[newToken];
                          }
                      }
  
                      return grammar;
                  }
  
                  var ret = {};
  
                  for (var token in grammar) {
  
                      if (grammar.hasOwnProperty(token)) {
  
                          if (token == before) {
  
                              for (var newToken in insert) {
  
                                  if (insert.hasOwnProperty(newToken)) {
                                      ret[newToken] = insert[newToken];
                                  }
                              }
                          }
  
                          ret[token] = grammar[token];
                      }
                  }
  
                  // Update references in other language definitions
                  _.languages.DFS(_.languages, function(key, value) {
                      if (value === root[inside] && key != inside) {
                          this[key] = ret;
                      }
                  });
  
                  return root[inside] = ret;
              },
  
              // Traverse a language definition with Depth First Search
              DFS: function(o, callback, type) {
                  for (var i in o) {
                      if (o.hasOwnProperty(i)) {
                          callback.call(o, i, o[i], type || i);
  
                          if (_.util.type(o[i]) === 'Object') {
                              _.languages.DFS(o[i], callback);
                          }
                          else if (_.util.type(o[i]) === 'Array') {
                              _.languages.DFS(o[i], callback, i);
                          }
                      }
                  }
              }
          },
          plugins: {},
  
          highlightAll: function(async, callback) {
              var elements = document.querySelectorAll('code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code');
  
              for (var i=0, element; element = elements[i++];) {
                  _.highlightElement(element, async === true, callback);
              }
          },
  
          highlightElement: function(element, async, callback) {
              // Find language
              var language, grammar, parent = element;
  
              while (parent && !lang.test(parent.className)) {
                  parent = parent.parentNode;
              }
  
              if (parent) {
                  language = (parent.className.match(lang) || [,''])[1];
                  grammar = _.languages[language];
              }
  
              // Set language on the element, if not present
              element.className = element.className.replace(lang, '').replace(/\s+/g, ' ') + ' language-' + language;
  
              // Set language on the parent, for styling
              parent = element.parentNode;
  
              if (/pre/i.test(parent.nodeName)) {
                  parent.className = parent.className.replace(lang, '').replace(/\s+/g, ' ') + ' language-' + language;
              }
  
              var code = element.textContent;
  
              var env = {
                  element: element,
                  language: language,
                  grammar: grammar,
                  code: code
              };
  
              if (!code || !grammar) {
                  _.hooks.run('complete', env);
                  return;
              }
  
              _.hooks.run('before-highlight', env);
  
              if (async && _self.Worker) {
                  var worker = new Worker(_.filename);
  
                  worker.onmessage = function(evt) {
                      env.highlightedCode = Token.stringify(JSON.parse(evt.data), language);
  
                      _.hooks.run('before-insert', env);
  
                      env.element.innerHTML = env.highlightedCode;
  
                      callback && callback.call(env.element);
                      _.hooks.run('after-highlight', env);
                      _.hooks.run('complete', env);
                  };
  
                  worker.postMessage(JSON.stringify({
                      language: env.language,
                      code: env.code,
                      immediateClose: true
                  }));
              }
              else {
                  env.highlightedCode = _.highlight(env.code, env.grammar, env.language);
  
                  _.hooks.run('before-insert', env);
  
                  env.element.innerHTML = env.highlightedCode;
  
                  callback && callback.call(element);
  
                  _.hooks.run('after-highlight', env);
                  _.hooks.run('complete', env);
              }
          },
  
          highlight: function (text, grammar, language) {
              var tokens = _.tokenize(text, grammar);
              return Token.stringify(_.util.encode(tokens), language);
          },
  
          tokenize: function(text, grammar, language) {
              var Token = _.Token;
  
              var strarr = [text];
  
              var rest = grammar.rest;
  
              if (rest) {
                  for (var token in rest) {
                      grammar[token] = rest[token];
                  }
  
                  delete grammar.rest;
              }
  
              tokenloop: for (var token in grammar) {
                  if(!grammar.hasOwnProperty(token) || !grammar[token]) {
                      continue;
                  }
  
                  var patterns = grammar[token];
                  patterns = (_.util.type(patterns) === "Array") ? patterns : [patterns];
  
                  for (var j = 0; j < patterns.length; ++j) {
                      var pattern = patterns[j],
                          inside = pattern.inside,
                          lookbehind = !!pattern.lookbehind,
                          lookbehindLength = 0,
                          alias = pattern.alias;
  
                      pattern = pattern.pattern || pattern;
  
                      for (var i=0; i<strarr.length; i++) { // Don’t cache length as it changes during the loop
  
                          var str = strarr[i];
  
                          if (strarr.length > text.length) {
                              // Something went terribly wrong, ABORT, ABORT!
                              break tokenloop;
                          }
  
                          if (str instanceof Token) {
                              continue;
                          }
  
                          pattern.lastIndex = 0;
  
                          var match = pattern.exec(str);
  
                          if (match) {
                              if(lookbehind) {
                                  lookbehindLength = match[1].length;
                              }
  
                              var from = match.index - 1 + lookbehindLength,
                                  match = match[0].slice(lookbehindLength),
                                  len = match.length,
                                  to = from + len,
                                  before = str.slice(0, from + 1),
                                  after = str.slice(to + 1);
  
                              var args = [i, 1];
  
                              if (before) {
                                  args.push(before);
                              }
  
                              var wrapped = new Token(token, inside? _.tokenize(match, inside) : match, alias);
  
                              args.push(wrapped);
  
                              if (after) {
                                  args.push(after);
                              }
  
                              Array.prototype.splice.apply(strarr, args);
                          }
                      }
                  }
              }
  
              return strarr;
          },
  
          hooks: {
              all: {},
  
              add: function (name, callback) {
                  var hooks = _.hooks.all;
  
                  hooks[name] = hooks[name] || [];
  
                  hooks[name].push(callback);
              },
  
              run: function (name, env) {
                  var callbacks = _.hooks.all[name];
  
                  if (!callbacks || !callbacks.length) {
                      return;
                  }
  
                  for (var i=0, callback; callback = callbacks[i++];) {
                      callback(env);
                  }
              }
          }
      };
  
      var Token = _.Token = function(type, content, alias) {
          this.type = type;
          this.content = content;
          this.alias = alias;
      };
  
      Token.stringify = function(o, language, parent) {
          if (typeof o == 'string') {
              return o;
          }
  
          if (_.util.type(o) === 'Array') {
              return o.map(function(element) {
                  return Token.stringify(element, language, o);
              }).join('');
          }
  
          var env = {
              type: o.type,
              content: Token.stringify(o.content, language, parent),
              tag: 'span',
              classes: ['token', o.type],
              attributes: {},
              language: language,
              parent: parent
          };
  
          if (env.type == 'comment') {
              env.attributes['spellcheck'] = 'true';
          }
  
          if (o.alias) {
              var aliases = _.util.type(o.alias) === 'Array' ? o.alias : [o.alias];
              Array.prototype.push.apply(env.classes, aliases);
          }
  
          _.hooks.run('wrap', env);
  
          var attributes = '';
  
          for (var name in env.attributes) {
              attributes += (attributes ? ' ' : '') + name + '="' + (env.attributes[name] || '') + '"';
          }
  
          return '<' + env.tag + ' class="' + env.classes.join(' ') + '" ' + attributes + '>' + env.content + '</' + env.tag + '>';
  
      };
  
      if (!_self.document) {
          if (!_self.addEventListener) {
              // in Node.js
              return _self.Prism;
          }
          // In worker
          _self.addEventListener('message', function(evt) {
              var message = JSON.parse(evt.data),
                  lang = message.language,
                  code = message.code,
                  immediateClose = message.immediateClose;
  
              _self.postMessage(JSON.stringify(_.util.encode(_.tokenize(code, _.languages[lang]))));
              if (immediateClose) {
                  _self.close();
              }
          }, false);
  
          return _self.Prism;
      }
  
  // Get current script and highlight
      var script = document.getElementsByTagName('script');
  
      script = script[script.length - 1];
  
      if (script) {
          _.filename = script.src;
  
          if (document.addEventListener && !script.hasAttribute('data-manual')) {
              document.addEventListener('DOMContentLoaded', _.highlightAll);
          }
      }
  
      return _self.Prism;
  
  })();
  
  if (typeof module !== 'undefined' && module.exports) {
      module.exports = Prism;
  }
  
  // hack for components to work correctly in node.js
  if (typeof global !== 'undefined') {
      global.Prism = Prism;
  }
  ;
  Prism.languages.markup = {
      'comment': /<!--[\w\W]*?-->/,
      'prolog': /<\?[\w\W]+?\?>/,
      'doctype': /<!DOCTYPE[\w\W]+?>/,
      'cdata': /<!\[CDATA\[[\w\W]*?]]>/i,
      'tag': {
          pattern: /<\/?[^\s>\/=.]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\\1|\\?(?!\1)[\w\W])*\1|[^\s'">=]+))?)*\s*\/?>/i,
          inside: {
              'tag': {
                  pattern: /^<\/?[^\s>\/]+/i,
                  inside: {
                      'punctuation': /^<\/?/,
                      'namespace': /^[^\s>\/:]+:/
                  }
              },
              'attr-value': {
                  pattern: /=(?:('|")[\w\W]*?(\1)|[^\s>]+)/i,
                  inside: {
                      'punctuation': /[=>"']/
                  }
              },
              'punctuation': /\/?>/,
              'attr-name': {
                  pattern: /[^\s>\/]+/,
                  inside: {
                      'namespace': /^[^\s>\/:]+:/
                  }
              }
  
          }
      },
      'entity': /&#?[\da-z]{1,8};/i
  };
  
  // Plugin to make entity title show the real entity, idea by Roman Komarov
  Prism.hooks.add('wrap', function(env) {
  
      if (env.type === 'entity') {
          env.attributes['title'] = env.content.replace(/&amp;/, '&');
      }
  });
  
  Prism.languages.xml = Prism.languages.markup;
  Prism.languages.html = Prism.languages.markup;
  Prism.languages.mathml = Prism.languages.markup;
  Prism.languages.svg = Prism.languages.markup;
  
  Prism.languages.css = {
      'comment': /\/\*[\w\W]*?\*\//,
      'atrule': {
          pattern: /@[\w-]+?.*?(;|(?=\s*\{))/i,
          inside: {
              'rule': /@[\w-]+/
              // See rest below
          }
      },
      'url': /url\((?:(["'])(\\(?:\r\n|[\w\W])|(?!\1)[^\\\r\n])*\1|.*?)\)/i,
      'selector': /[^\{\}\s][^\{\};]*?(?=\s*\{)/,
      'string': /("|')(\\(?:\r\n|[\w\W])|(?!\1)[^\\\r\n])*\1/,
      'property': /(\b|\B)[\w-]+(?=\s*:)/i,
      'important': /\B!important\b/i,
      'function': /[-a-z0-9]+(?=\()/i,
      'punctuation': /[(){};:]/
  };
  
  Prism.languages.css['atrule'].inside.rest = Prism.util.clone(Prism.languages.css);
  
  if (Prism.languages.markup) {
      Prism.languages.insertBefore('markup', 'tag', {
          'style': {
              pattern: /<style[\w\W]*?>[\w\W]*?<\/style>/i,
              inside: {
                  'tag': {
                      pattern: /<style[\w\W]*?>|<\/style>/i,
                      inside: Prism.languages.markup.tag.inside
                  },
                  rest: Prism.languages.css
              },
              alias: 'language-css'
          }
      });
  
      Prism.languages.insertBefore('inside', 'attr-value', {
          'style-attr': {
              pattern: /\s*style=("|').*?\1/i,
              inside: {
                  'attr-name': {
                      pattern: /^\s*style/i,
                      inside: Prism.languages.markup.tag.inside
                  },
                  'punctuation': /^\s*=\s*['"]|['"]\s*$/,
                  'attr-value': {
                      pattern: /.+/i,
                      inside: Prism.languages.css
                  }
              },
              alias: 'language-css'
          }
      }, Prism.languages.markup.tag);
  };
  Prism.languages.clike = {
      'comment': [
          {
              pattern: /(^|[^\\])\/\*[\w\W]*?\*\//,
              lookbehind: true
          },
          {
              pattern: /(^|[^\\:])\/\/.*/,
              lookbehind: true
          }
      ],
      'string': /("|')(\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,
      'class-name': {
          pattern: /((?:\b(?:class|interface|extends|implements|trait|instanceof|new)\s+)|(?:catch\s+\())[a-z0-9_\.\\]+/i,
          lookbehind: true,
          inside: {
              punctuation: /(\.|\\)/
          }
      },
      'keyword': /\b(if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/,
      'boolean': /\b(true|false)\b/,
      'function': /[a-z0-9_]+(?=\()/i,
      'number': /\b-?(?:0x[\da-f]+|\d*\.?\d+(?:e[+-]?\d+)?)\b/i,
      'operator': /--?|\+\+?|!=?=?|<=?|>=?|==?=?|&&?|\|\|?|\?|\*|\/|~|\^|%/,
      'punctuation': /[{}[\];(),.:]/
  };
  
  Prism.languages.javascript = Prism.languages.extend('clike', {
      'keyword': /\b(as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|false|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|true|try|typeof|var|void|while|with|yield)\b/,
      'number': /\b-?(0x[\dA-Fa-f]+|0b[01]+|0o[0-7]+|\d*\.?\d+([Ee][+-]?\d+)?|NaN|Infinity)\b/,
      // Allow for all non-ASCII characters (See http://stackoverflow.com/a/2008444)
      'function': /[_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*(?=\()/i
  });
  
  Prism.languages.insertBefore('javascript', 'keyword', {
      'regex': {
          pattern: /(^|[^/])\/(?!\/)(\[.+?]|\\.|[^/\\\r\n])+\/[gimyu]{0,5}(?=\s*($|[\r\n,.;})]))/,
          lookbehind: true
      }
  });
  
  Prism.languages.insertBefore('javascript', 'class-name', {
      'template-string': {
          pattern: /`(?:\\`|\\?[^`])*`/,
          inside: {
              'interpolation': {
                  pattern: /\$\{[^}]+\}/,
                  inside: {
                      'interpolation-punctuation': {
                          pattern: /^\$\{|\}$/,
                          alias: 'punctuation'
                      },
                      rest: Prism.languages.javascript
                  }
              },
              'string': /[\s\S]+/
          }
      }
  });
  
  if (Prism.languages.markup) {
      Prism.languages.insertBefore('markup', 'tag', {
          'script': {
              pattern: /<script[\w\W]*?>[\w\W]*?<\/script>/i,
              inside: {
                  'tag': {
                      pattern: /<script[\w\W]*?>|<\/script>/i,
                      inside: Prism.languages.markup.tag.inside
                  },
                  rest: Prism.languages.javascript
              },
              alias: 'language-javascript'
          }
      });
  }
  
  Prism.languages.js = Prism.languages.javascript;