text: 'use strict';
  
  exports.__esModule = true;
  exports.default = tokenize;
  var singleQuote = 39,
      doubleQuote = 34,
      backslash = 92,
      slash = 47,
      newline = 10,
      space = 32,
      feed = 12,
      tab = 9,
      cr = 13,
      plus = 43,
      gt = 62,
      tilde = 126,
      pipe = 124,
      comma = 44,
      openBracket = 40,
      closeBracket = 41,
      openSq = 91,
      closeSq = 93,
      semicolon = 59,
      asterisk = 42,
      colon = 58,
      ampersand = 38,
      at = 64,
      atEnd = /[ \n\t\r\{\(\)'"\\;/]/g,
      wordEnd = /[ \n\t\r\(\)\*:;@!&'"\+\|~>,\[\]\\]|\/(?=\*)/g;
  
  function tokenize(input) {
      var tokens = [];
      var css = input.css.valueOf();
  
      var code = void 0,
          next = void 0,
          quote = void 0,
          lines = void 0,
          last = void 0,
          content = void 0,
          escape = void 0,
          nextLine = void 0,
          nextOffset = void 0,
          escaped = void 0,
          escapePos = void 0;
  
      var length = css.length;
      var offset = -1;
      var line = 1;
      var pos = 0;
  
      var unclosed = function unclosed(what, end) {
          if (input.safe) {
              css += end;
              next = css.length - 1;
          } else {
              throw input.error('Unclosed ' + what, line, pos - offset, pos);
          }
      };
  
      while (pos < length) {
          code = css.charCodeAt(pos);
  
          if (code === newline) {
              offset = pos;
              line += 1;
          }
  
          switch (code) {
              case newline:
              case space:
              case tab:
              case cr:
              case feed:
                  next = pos;
                  do {
                      next += 1;
                      code = css.charCodeAt(next);
                      if (code === newline) {
                          offset = next;
                          line += 1;
                      }
                  } while (code === space || code === newline || code === tab || code === cr || code === feed);
  
                  tokens.push(['space', css.slice(pos, next), line, pos - offset, pos]);
                  pos = next - 1;
                  break;
  
              case plus:
              case gt:
              case tilde:
              case pipe:
                  next = pos;
                  do {
                      next += 1;
                      code = css.charCodeAt(next);
                  } while (code === plus || code === gt || code === tilde || code === pipe);
                  tokens.push(['combinator', css.slice(pos, next), line, pos - offset, pos]);
                  pos = next - 1;
                  break;
  
              case asterisk:
                  tokens.push(['*', '*', line, pos - offset, pos]);
                  break;
  
              case ampersand:
                  tokens.push(['&', '&', line, pos - offset, pos]);
                  break;
  
              case comma:
                  tokens.push([',', ',', line, pos - offset, pos]);
                  break;
  
              case openSq:
                  tokens.push(['[', '[', line, pos - offset, pos]);
                  break;
  
              case closeSq:
                  tokens.push([']', ']', line, pos - offset, pos]);
                  break;
  
              case colon:
                  tokens.push([':', ':', line, pos - offset, pos]);
                  break;
  
              case semicolon:
                  tokens.push([';', ';', line, pos - offset, pos]);
                  break;
  
              case openBracket:
                  tokens.push(['(', '(', line, pos - offset, pos]);
                  break;
  
              case closeBracket:
                  tokens.push([')', ')', line, pos - offset, pos]);
                  break;
  
              case singleQuote:
              case doubleQuote:
                  quote = code === singleQuote ? "'" : '"';
                  next = pos;
                  do {
                      escaped = false;
                      next = css.indexOf(quote, next + 1);
                      if (next === -1) {
                          unclosed('quote', quote);
                      }
                      escapePos = next;
                      while (css.charCodeAt(escapePos - 1) === backslash) {
                          escapePos -= 1;
                          escaped = !escaped;
                      }
                  } while (escaped);
  
                  tokens.push(['string', css.slice(pos, next + 1), line, pos - offset, line, next - offset, pos]);
                  pos = next;
                  break;
  
              case at:
                  atEnd.lastIndex = pos + 1;
                  atEnd.test(css);
                  if (atEnd.lastIndex === 0) {
                      next = css.length - 1;
                  } else {
                      next = atEnd.lastIndex - 2;
                  }
                  tokens.push(['at-word', css.slice(pos, next + 1), line, pos - offset, line, next - offset, pos]);
                  pos = next;
                  break;
  
              case backslash:
                  next = pos;
                  escape = true;
                  while (css.charCodeAt(next + 1) === backslash) {
                      next += 1;
                      escape = !escape;
                  }
                  code = css.charCodeAt(next + 1);
                  if (escape && code !== slash && code !== space && code !== newline && code !== tab && code !== cr && code !== feed) {
                      next += 1;
                  }
                  tokens.push(['word', css.slice(pos, next + 1), line, pos - offset, line, next - offset, pos]);
                  pos = next;
                  break;
  
              default:
                  if (code === slash && css.charCodeAt(pos + 1) === asterisk) {
                      next = css.indexOf('*/', pos + 2) + 1;
                      if (next === 0) {
                          unclosed('comment', '*/');
                      }
  
                      content = css.slice(pos, next + 1);
                      lines = content.split('\n');
                      last = lines.length - 1;
  
                      if (last > 0) {
                          nextLine = line + last;
                          nextOffset = next - lines[last].length;
                      } else {
                          nextLine = line;
                          nextOffset = offset;
                      }
  
                      tokens.push(['comment', content, line, pos - offset, nextLine, next - nextOffset, pos]);
  
                      offset = nextOffset;
                      line = nextLine;
                      pos = next;
                  } else {
                      wordEnd.lastIndex = pos + 1;
                      wordEnd.test(css);
                      if (wordEnd.lastIndex === 0) {
                          next = css.length - 1;
                      } else {
                          next = wordEnd.lastIndex - 2;
                      }
  
                      tokens.push(['word', css.slice(pos, next + 1), line, pos - offset, line, next - offset, pos]);
                      pos = next;
                  }
  
                  break;
          }
  
          pos++;
      }
  
      return tokens;
  }
  module.exports = exports['default'];
  