'no use strict';
((function (e) {
  function t(e, t) {
    var n = e,
      r = '';
    while (n) {
      var i = t[n];
      if (typeof i == 'string') return i + r;
      if (i) return i.location.replace(/\/*$/, '/') + (r || i.main || i.name);
      if (i === !1) return '';
      var s = n.lastIndexOf('/');
      if (s === -1) break;
      ((r = n.substr(s) + r), (n = n.slice(0, s)));
    }
    return e;
  }
  if (typeof e.window != 'undefined' && e.document) return;
  if (e.require && e.define) return;
  (e.console ||
    ((e.console = function () {
      var e = Array.prototype.slice.call(arguments, 0);
      postMessage({ type: 'log', data: e });
    }),
    (e.console.error = e.console.warn = e.console.log = e.console.trace = e.console)),
    (e.window = e),
    (e.ace = e),
    (e.onerror = function (e, t, n, r, i) {
      postMessage({ type: 'error', data: { message: e, data: i.data, file: t, line: n, col: r, stack: i.stack } });
    }),
    (e.normalizeModule = function (t, n) {
      if (n.indexOf('!') !== -1) {
        var r = n.split('!');
        return e.normalizeModule(t, r[0]) + '!' + e.normalizeModule(t, r[1]);
      }
      if (n.charAt(0) == '.') {
        var i = t.split('/').slice(0, -1).join('/');
        n = (i ? i + '/' : '') + n;
        while (n.indexOf('.') !== -1 && s != n) {
          var s = n;
          n = n
            .replace(/^\.\//, '')
            .replace(/\/\.\//, '/')
            .replace(/[^\/]+\/\.\.\//, '');
        }
      }
      return n;
    }),
    (e.require = function (r, i) {
      i || ((i = r), (r = null));
      if (!i.charAt) throw new Error('worker.js require() accepts only (parentId, id) as arguments');
      i = e.normalizeModule(r, i);
      var s = e.require.modules[i];
      if (s) return (s.initialized || ((s.initialized = !0), (s.exports = s.factory().exports)), s.exports);
      if (!e.require.tlns) return console.log('unable to load ' + i);
      var o = t(i, e.require.tlns);
      return (o.slice(-3) != '.js' && (o += '.js'), (e.require.id = i), (e.require.modules[i] = {}), importScripts(o), e.require(r, i));
    }),
    (e.require.modules = {}),
    (e.require.tlns = {}),
    (e.define = function (t, n, r) {
      arguments.length == 2 ? ((r = n), typeof t != 'string' && ((n = t), (t = e.require.id))) : arguments.length == 1 && ((r = t), (n = []), (t = e.require.id));
      if (typeof r != 'function') {
        e.require.modules[t] = { exports: r, initialized: !0 };
        return;
      }
      n.length || (n = ['require', 'exports', 'module']);
      var i = function (n) {
        return e.require(t, n);
      };
      e.require.modules[t] = {
        exports: {},
        factory: function () {
          var e = this,
            t = r.apply(
              this,
              n.map(function (t) {
                switch (t) {
                  case 'require':
                    return i;
                  case 'exports':
                    return e.exports;
                  case 'module':
                    return e;
                  default:
                    return i(t);
                }
              })
            );
          return (t && (e.exports = t), e);
        },
      };
    }),
    (e.define.amd = {}),
    (require.tlns = {}),
    (e.initBaseUrls = function (t) {
      for (var n in t) require.tlns[n] = t[n];
    }),
    (e.initSender = function () {
      var n = e.require('ace/lib/event_emitter').EventEmitter,
        r = e.require('ace/lib/oop'),
        i = function () {};
      return (
        function () {
          (r.implement(this, n),
            (this.callback = function (e, t) {
              postMessage({ type: 'call', id: t, data: e });
            }),
            (this.emit = function (e, t) {
              postMessage({ type: 'event', name: e, data: t });
            }));
        }.call(i.prototype),
        new i()
      );
    }));
  var n = (e.main = null),
    r = (e.sender = null);
  e.onmessage = function (t) {
    var i = t.data;
    if (i.event && r) r._signal(i.event, i.data);
    else if (i.command)
      if (n[i.command]) n[i.command].apply(n, i.args);
      else {
        if (!e[i.command]) throw new Error('Unknown command:' + i.command);
        e[i.command].apply(e, i.args);
      }
    else if (i.init) {
      (e.initBaseUrls(i.tlns), require('ace/lib/es5-shim'), (r = e.sender = e.initSender()));
      var s = require(i.module)[i.classname];
      n = e.main = new s(r);
    }
  };
})(this),
  ace.define('ace/lib/oop', ['require', 'exports', 'module'], function (e, t, n) {
    'use strict';
    ((t.inherits = function (e, t) {
      ((e.super_ = t), (e.prototype = Object.create(t.prototype, { constructor: { value: e, enumerable: !1, writable: !0, configurable: !0 } })));
    }),
      (t.mixin = function (e, t) {
        for (var n in t) e[n] = t[n];
        return e;
      }),
      (t.implement = function (e, n) {
        t.mixin(e, n);
      }));
  }),
  ace.define('ace/lib/lang', ['require', 'exports', 'module'], function (e, t, n) {
    'use strict';
    ((t.last = function (e) {
      return e[e.length - 1];
    }),
      (t.stringReverse = function (e) {
        return e.split('').reverse().join('');
      }),
      (t.stringRepeat = function (e, t) {
        var n = '';
        while (t > 0) {
          t & 1 && (n += e);
          if ((t >>= 1)) e += e;
        }
        return n;
      }));
    var r = /^\s\s*/,
      i = /\s\s*$/;
    ((t.stringTrimLeft = function (e) {
      return e.replace(r, '');
    }),
      (t.stringTrimRight = function (e) {
        return e.replace(i, '');
      }),
      (t.copyObject = function (e) {
        var t = {};
        for (var n in e) t[n] = e[n];
        return t;
      }),
      (t.copyArray = function (e) {
        var t = [];
        for (var n = 0, r = e.length; n < r; n++) e[n] && typeof e[n] == 'object' ? (t[n] = this.copyObject(e[n])) : (t[n] = e[n]);
        return t;
      }),
      (t.deepCopy = function s(e) {
        if (typeof e != 'object' || !e) return e;
        var t;
        if (Array.isArray(e)) {
          t = [];
          for (var n = 0; n < e.length; n++) t[n] = s(e[n]);
          return t;
        }
        if (Object.prototype.toString.call(e) !== '[object Object]') return e;
        t = {};
        for (var n in e) t[n] = s(e[n]);
        return t;
      }),
      (t.arrayToMap = function (e) {
        var t = {};
        for (var n = 0; n < e.length; n++) t[e[n]] = 1;
        return t;
      }),
      (t.createMap = function (e) {
        var t = Object.create(null);
        for (var n in e) t[n] = e[n];
        return t;
      }),
      (t.arrayRemove = function (e, t) {
        for (var n = 0; n <= e.length; n++) t === e[n] && e.splice(n, 1);
      }),
      (t.escapeRegExp = function (e) {
        return e.replace(/([.*+?^${}()|[\]\/\\])/g, '\\$1');
      }),
      (t.escapeHTML = function (e) {
        return e.replace(/&/g, '&#38;').replace(/"/g, '&#34;').replace(/'/g, '&#39;').replace(/</g, '&#60;');
      }),
      (t.getMatchOffsets = function (e, t) {
        var n = [];
        return (
          e.replace(t, function (e) {
            n.push({ offset: arguments[arguments.length - 2], length: e.length });
          }),
          n
        );
      }),
      (t.deferredCall = function (e) {
        var t = null,
          n = function () {
            ((t = null), e());
          },
          r = function (e) {
            return (r.cancel(), (t = setTimeout(n, e || 0)), r);
          };
        return (
          (r.schedule = r),
          (r.call = function () {
            return (this.cancel(), e(), r);
          }),
          (r.cancel = function () {
            return (clearTimeout(t), (t = null), r);
          }),
          (r.isPending = function () {
            return t;
          }),
          r
        );
      }),
      (t.delayedCall = function (e, t) {
        var n = null,
          r = function () {
            ((n = null), e());
          },
          i = function (e) {
            n == null && (n = setTimeout(r, e || t));
          };
        return (
          (i.delay = function (e) {
            (n && clearTimeout(n), (n = setTimeout(r, e || t)));
          }),
          (i.schedule = i),
          (i.call = function () {
            (this.cancel(), e());
          }),
          (i.cancel = function () {
            (n && clearTimeout(n), (n = null));
          }),
          (i.isPending = function () {
            return n;
          }),
          i
        );
      }));
  }),
  ace.define('ace/range', ['require', 'exports', 'module'], function (e, t, n) {
    'use strict';
    var r = function (e, t) {
        return e.row - t.row || e.column - t.column;
      },
      i = function (e, t, n, r) {
        ((this.start = { row: e, column: t }), (this.end = { row: n, column: r }));
      };
    ((function () {
      ((this.isEqual = function (e) {
        return this.start.row === e.start.row && this.end.row === e.end.row && this.start.column === e.start.column && this.end.column === e.end.column;
      }),
        (this.toString = function () {
          return 'Range: [' + this.start.row + '/' + this.start.column + '] -> [' + this.end.row + '/' + this.end.column + ']';
        }),
        (this.contains = function (e, t) {
          return this.compare(e, t) == 0;
        }),
        (this.compareRange = function (e) {
          var t,
            n = e.end,
            r = e.start;
          return ((t = this.compare(n.row, n.column)), t == 1 ? ((t = this.compare(r.row, r.column)), t == 1 ? 2 : t == 0 ? 1 : 0) : t == -1 ? -2 : ((t = this.compare(r.row, r.column)), t == -1 ? -1 : t == 1 ? 42 : 0));
        }),
        (this.comparePoint = function (e) {
          return this.compare(e.row, e.column);
        }),
        (this.containsRange = function (e) {
          return this.comparePoint(e.start) == 0 && this.comparePoint(e.end) == 0;
        }),
        (this.intersects = function (e) {
          var t = this.compareRange(e);
          return t == -1 || t == 0 || t == 1;
        }),
        (this.isEnd = function (e, t) {
          return this.end.row == e && this.end.column == t;
        }),
        (this.isStart = function (e, t) {
          return this.start.row == e && this.start.column == t;
        }),
        (this.setStart = function (e, t) {
          typeof e == 'object' ? ((this.start.column = e.column), (this.start.row = e.row)) : ((this.start.row = e), (this.start.column = t));
        }),
        (this.setEnd = function (e, t) {
          typeof e == 'object' ? ((this.end.column = e.column), (this.end.row = e.row)) : ((this.end.row = e), (this.end.column = t));
        }),
        (this.inside = function (e, t) {
          return this.compare(e, t) == 0 ? (this.isEnd(e, t) || this.isStart(e, t) ? !1 : !0) : !1;
        }),
        (this.insideStart = function (e, t) {
          return this.compare(e, t) == 0 ? (this.isEnd(e, t) ? !1 : !0) : !1;
        }),
        (this.insideEnd = function (e, t) {
          return this.compare(e, t) == 0 ? (this.isStart(e, t) ? !1 : !0) : !1;
        }),
        (this.compare = function (e, t) {
          return !this.isMultiLine() && e === this.start.row ? (t < this.start.column ? -1 : t > this.end.column ? 1 : 0) : e < this.start.row ? -1 : e > this.end.row ? 1 : this.start.row === e ? (t >= this.start.column ? 0 : -1) : this.end.row === e ? (t <= this.end.column ? 0 : 1) : 0;
        }),
        (this.compareStart = function (e, t) {
          return this.start.row == e && this.start.column == t ? -1 : this.compare(e, t);
        }),
        (this.compareEnd = function (e, t) {
          return this.end.row == e && this.end.column == t ? 1 : this.compare(e, t);
        }),
        (this.compareInside = function (e, t) {
          return this.end.row == e && this.end.column == t ? 1 : this.start.row == e && this.start.column == t ? -1 : this.compare(e, t);
        }),
        (this.clipRows = function (e, t) {
          if (this.end.row > t) var n = { row: t + 1, column: 0 };
          else if (this.end.row < e) var n = { row: e, column: 0 };
          if (this.start.row > t) var r = { row: t + 1, column: 0 };
          else if (this.start.row < e) var r = { row: e, column: 0 };
          return i.fromPoints(r || this.start, n || this.end);
        }),
        (this.extend = function (e, t) {
          var n = this.compare(e, t);
          if (n == 0) return this;
          if (n == -1) var r = { row: e, column: t };
          else var s = { row: e, column: t };
          return i.fromPoints(r || this.start, s || this.end);
        }),
        (this.isEmpty = function () {
          return this.start.row === this.end.row && this.start.column === this.end.column;
        }),
        (this.isMultiLine = function () {
          return this.start.row !== this.end.row;
        }),
        (this.clone = function () {
          return i.fromPoints(this.start, this.end);
        }),
        (this.collapseRows = function () {
          return this.end.column == 0 ? new i(this.start.row, 0, Math.max(this.start.row, this.end.row - 1), 0) : new i(this.start.row, 0, this.end.row, 0);
        }),
        (this.toScreenRange = function (e) {
          var t = e.documentToScreenPosition(this.start),
            n = e.documentToScreenPosition(this.end);
          return new i(t.row, t.column, n.row, n.column);
        }),
        (this.moveBy = function (e, t) {
          ((this.start.row += e), (this.start.column += t), (this.end.row += e), (this.end.column += t));
        }));
    }).call(i.prototype),
      (i.fromPoints = function (e, t) {
        return new i(e.row, e.column, t.row, t.column);
      }),
      (i.comparePoints = r),
      (i.comparePoints = function (e, t) {
        return e.row - t.row || e.column - t.column;
      }),
      (t.Range = i));
  }),
  ace.define('ace/apply_delta', ['require', 'exports', 'module'], function (e, t, n) {
    'use strict';
    function r(e, t) {
      throw (console.log('Invalid Delta:', e), 'Invalid Delta: ' + t);
    }
    function i(e, t) {
      return t.row >= 0 && t.row < e.length && t.column >= 0 && t.column <= e[t.row].length;
    }
    function s(e, t) {
      (t.action != 'insert' && t.action != 'remove' && r(t, "delta.action must be 'insert' or 'remove'"), t.lines instanceof Array || r(t, 'delta.lines must be an Array'), (!t.start || !t.end) && r(t, 'delta.start/end must be an present'));
      var n = t.start;
      i(e, t.start) || r(t, 'delta.start must be contained in document');
      var s = t.end;
      t.action == 'remove' && !i(e, s) && r(t, "delta.end must contained in document for 'remove' actions");
      var o = s.row - n.row,
        u = s.column - (o == 0 ? n.column : 0);
      (o != t.lines.length - 1 || t.lines[o].length != u) && r(t, 'delta.range must match delta lines');
    }
    t.applyDelta = function (e, t, n) {
      var r = t.start.row,
        i = t.start.column,
        s = e[r] || '';
      switch (t.action) {
        case 'insert':
          var o = t.lines;
          if (o.length === 1) e[r] = s.substring(0, i) + t.lines[0] + s.substring(i);
          else {
            var u = [r, 1].concat(t.lines);
            (e.splice.apply(e, u), (e[r] = s.substring(0, i) + e[r]), (e[r + t.lines.length - 1] += s.substring(i)));
          }
          break;
        case 'remove':
          var a = t.end.column,
            f = t.end.row;
          r === f ? (e[r] = s.substring(0, i) + s.substring(a)) : e.splice(r, f - r + 1, s.substring(0, i) + e[f].substring(a));
      }
    };
  }),
  ace.define('ace/lib/event_emitter', ['require', 'exports', 'module'], function (e, t, n) {
    'use strict';
    var r = {},
      i = function () {
        this.propagationStopped = !0;
      },
      s = function () {
        this.defaultPrevented = !0;
      };
    ((r._emit = r._dispatchEvent =
      function (e, t) {
        (this._eventRegistry || (this._eventRegistry = {}), this._defaultHandlers || (this._defaultHandlers = {}));
        var n = this._eventRegistry[e] || [],
          r = this._defaultHandlers[e];
        if (!n.length && !r) return;
        if (typeof t != 'object' || !t) t = {};
        (t.type || (t.type = e), t.stopPropagation || (t.stopPropagation = i), t.preventDefault || (t.preventDefault = s), (n = n.slice()));
        for (var o = 0; o < n.length; o++) {
          n[o](t, this);
          if (t.propagationStopped) break;
        }
        if (r && !t.defaultPrevented) return r(t, this);
      }),
      (r._signal = function (e, t) {
        var n = (this._eventRegistry || {})[e];
        if (!n) return;
        n = n.slice();
        for (var r = 0; r < n.length; r++) n[r](t, this);
      }),
      (r.once = function (e, t) {
        var n = this;
        t &&
          this.addEventListener(e, function r() {
            (n.removeEventListener(e, r), t.apply(null, arguments));
          });
      }),
      (r.setDefaultHandler = function (e, t) {
        var n = this._defaultHandlers;
        n || (n = this._defaultHandlers = { _disabled_: {} });
        if (n[e]) {
          var r = n[e],
            i = n._disabled_[e];
          (i || (n._disabled_[e] = i = []), i.push(r));
          var s = i.indexOf(t);
          s != -1 && i.splice(s, 1);
        }
        n[e] = t;
      }),
      (r.removeDefaultHandler = function (e, t) {
        var n = this._defaultHandlers;
        if (!n) return;
        var r = n._disabled_[e];
        if (n[e] == t) {
          var i = n[e];
          r && this.setDefaultHandler(e, r.pop());
        } else if (r) {
          var s = r.indexOf(t);
          s != -1 && r.splice(s, 1);
        }
      }),
      (r.on = r.addEventListener =
        function (e, t, n) {
          this._eventRegistry = this._eventRegistry || {};
          var r = this._eventRegistry[e];
          return (r || (r = this._eventRegistry[e] = []), r.indexOf(t) == -1 && r[n ? 'unshift' : 'push'](t), t);
        }),
      (r.off =
        r.removeListener =
        r.removeEventListener =
          function (e, t) {
            this._eventRegistry = this._eventRegistry || {};
            var n = this._eventRegistry[e];
            if (!n) return;
            var r = n.indexOf(t);
            r !== -1 && n.splice(r, 1);
          }),
      (r.removeAllListeners = function (e) {
        this._eventRegistry && (this._eventRegistry[e] = []);
      }),
      (t.EventEmitter = r));
  }),
  ace.define('ace/anchor', ['require', 'exports', 'module', 'ace/lib/oop', 'ace/lib/event_emitter'], function (e, t, n) {
    'use strict';
    var r = e('./lib/oop'),
      i = e('./lib/event_emitter').EventEmitter,
      s = (t.Anchor = function (e, t, n) {
        ((this.$onChange = this.onChange.bind(this)), this.attach(e), typeof n == 'undefined' ? this.setPosition(t.row, t.column) : this.setPosition(t, n));
      });
    (function () {
      function e(e, t, n) {
        var r = n ? e.column <= t.column : e.column < t.column;
        return e.row < t.row || (e.row == t.row && r);
      }
      function t(t, n, r) {
        var i = t.action == 'insert',
          s = (i ? 1 : -1) * (t.end.row - t.start.row),
          o = (i ? 1 : -1) * (t.end.column - t.start.column),
          u = t.start,
          a = i ? u : t.end;
        return e(n, u, r) ? { row: n.row, column: n.column } : e(a, n, !r) ? { row: n.row + s, column: n.column + (n.row == a.row ? o : 0) } : { row: u.row, column: u.column };
      }
      (r.implement(this, i),
        (this.getPosition = function () {
          return this.$clipPositionToDocument(this.row, this.column);
        }),
        (this.getDocument = function () {
          return this.document;
        }),
        (this.$insertRight = !1),
        (this.onChange = function (e) {
          if (e.start.row == e.end.row && e.start.row != this.row) return;
          if (e.start.row > this.row) return;
          var n = t(e, { row: this.row, column: this.column }, this.$insertRight);
          this.setPosition(n.row, n.column, !0);
        }),
        (this.setPosition = function (e, t, n) {
          var r;
          n ? (r = { row: e, column: t }) : (r = this.$clipPositionToDocument(e, t));
          if (this.row == r.row && this.column == r.column) return;
          var i = { row: this.row, column: this.column };
          ((this.row = r.row), (this.column = r.column), this._signal('change', { old: i, value: r }));
        }),
        (this.detach = function () {
          this.document.removeEventListener('change', this.$onChange);
        }),
        (this.attach = function (e) {
          ((this.document = e || this.document), this.document.on('change', this.$onChange));
        }),
        (this.$clipPositionToDocument = function (e, t) {
          var n = {};
          return (
            e >= this.document.getLength() ? ((n.row = Math.max(0, this.document.getLength() - 1)), (n.column = this.document.getLine(n.row).length)) : e < 0 ? ((n.row = 0), (n.column = 0)) : ((n.row = e), (n.column = Math.min(this.document.getLine(n.row).length, Math.max(0, t)))),
            t < 0 && (n.column = 0),
            n
          );
        }));
    }).call(s.prototype);
  }),
  ace.define('ace/document', ['require', 'exports', 'module', 'ace/lib/oop', 'ace/apply_delta', 'ace/lib/event_emitter', 'ace/range', 'ace/anchor'], function (e, t, n) {
    'use strict';
    var r = e('./lib/oop'),
      i = e('./apply_delta').applyDelta,
      s = e('./lib/event_emitter').EventEmitter,
      o = e('./range').Range,
      u = e('./anchor').Anchor,
      a = function (e) {
        ((this.$lines = ['']), e.length === 0 ? (this.$lines = ['']) : Array.isArray(e) ? this.insertMergedLines({ row: 0, column: 0 }, e) : this.insert({ row: 0, column: 0 }, e));
      };
    ((function () {
      (r.implement(this, s),
        (this.setValue = function (e) {
          var t = this.getLength() - 1;
          (this.remove(new o(0, 0, t, this.getLine(t).length)), this.insert({ row: 0, column: 0 }, e));
        }),
        (this.getValue = function () {
          return this.getAllLines().join(this.getNewLineCharacter());
        }),
        (this.createAnchor = function (e, t) {
          return new u(this, e, t);
        }),
        'aaa'.split(/a/).length === 0
          ? (this.$split = function (e) {
              return e.replace(/\r\n|\r/g, '\n').split('\n');
            })
          : (this.$split = function (e) {
              return e.split(/\r\n|\r|\n/);
            }),
        (this.$detectNewLine = function (e) {
          var t = e.match(/^.*?(\r\n|\r|\n)/m);
          ((this.$autoNewLine = t ? t[1] : '\n'), this._signal('changeNewLineMode'));
        }),
        (this.getNewLineCharacter = function () {
          switch (this.$newLineMode) {
            case 'windows':
              return '\r\n';
            case 'unix':
              return '\n';
            default:
              return this.$autoNewLine || '\n';
          }
        }),
        (this.$autoNewLine = ''),
        (this.$newLineMode = 'auto'),
        (this.setNewLineMode = function (e) {
          if (this.$newLineMode === e) return;
          ((this.$newLineMode = e), this._signal('changeNewLineMode'));
        }),
        (this.getNewLineMode = function () {
          return this.$newLineMode;
        }),
        (this.isNewLine = function (e) {
          return e == '\r\n' || e == '\r' || e == '\n';
        }),
        (this.getLine = function (e) {
          return this.$lines[e] || '';
        }),
        (this.getLines = function (e, t) {
          return this.$lines.slice(e, t + 1);
        }),
        (this.getAllLines = function () {
          return this.getLines(0, this.getLength());
        }),
        (this.getLength = function () {
          return this.$lines.length;
        }),
        (this.getTextRange = function (e) {
          return this.getLinesForRange(e).join(this.getNewLineCharacter());
        }),
        (this.getLinesForRange = function (e) {
          var t;
          if (e.start.row === e.end.row) t = [this.getLine(e.start.row).substring(e.start.column, e.end.column)];
          else {
            ((t = this.getLines(e.start.row, e.end.row)), (t[0] = (t[0] || '').substring(e.start.column)));
            var n = t.length - 1;
            e.end.row - e.start.row == n && (t[n] = t[n].substring(0, e.end.column));
          }
          return t;
        }),
        (this.insertLines = function (e, t) {
          return (console.warn('Use of document.insertLines is deprecated. Use the insertFullLines method instead.'), this.insertFullLines(e, t));
        }),
        (this.removeLines = function (e, t) {
          return (console.warn('Use of document.removeLines is deprecated. Use the removeFullLines method instead.'), this.removeFullLines(e, t));
        }),
        (this.insertNewLine = function (e) {
          return (console.warn("Use of document.insertNewLine is deprecated. Use insertMergedLines(position, ['', '']) instead."), this.insertMergedLines(e, ['', '']));
        }),
        (this.insert = function (e, t) {
          return (this.getLength() <= 1 && this.$detectNewLine(t), this.insertMergedLines(e, this.$split(t)));
        }),
        (this.insertInLine = function (e, t) {
          var n = this.clippedPos(e.row, e.column),
            r = this.pos(e.row, e.column + t.length);
          return (this.applyDelta({ start: n, end: r, action: 'insert', lines: [t] }, !0), this.clonePos(r));
        }),
        (this.clippedPos = function (e, t) {
          var n = this.getLength();
          e === undefined ? (e = n) : e < 0 ? (e = 0) : e >= n && ((e = n - 1), (t = undefined));
          var r = this.getLine(e);
          return (t == undefined && (t = r.length), (t = Math.min(Math.max(t, 0), r.length)), { row: e, column: t });
        }),
        (this.clonePos = function (e) {
          return { row: e.row, column: e.column };
        }),
        (this.pos = function (e, t) {
          return { row: e, column: t };
        }),
        (this.$clipPosition = function (e) {
          var t = this.getLength();
          return (e.row >= t ? ((e.row = Math.max(0, t - 1)), (e.column = this.getLine(t - 1).length)) : ((e.row = Math.max(0, e.row)), (e.column = Math.min(Math.max(e.column, 0), this.getLine(e.row).length))), e);
        }),
        (this.insertFullLines = function (e, t) {
          e = Math.min(Math.max(e, 0), this.getLength());
          var n = 0;
          (e < this.getLength() ? ((t = t.concat([''])), (n = 0)) : ((t = [''].concat(t)), e--, (n = this.$lines[e].length)), this.insertMergedLines({ row: e, column: n }, t));
        }),
        (this.insertMergedLines = function (e, t) {
          var n = this.clippedPos(e.row, e.column),
            r = { row: n.row + t.length - 1, column: (t.length == 1 ? n.column : 0) + t[t.length - 1].length };
          return (this.applyDelta({ start: n, end: r, action: 'insert', lines: t }), this.clonePos(r));
        }),
        (this.remove = function (e) {
          var t = this.clippedPos(e.start.row, e.start.column),
            n = this.clippedPos(e.end.row, e.end.column);
          return (this.applyDelta({ start: t, end: n, action: 'remove', lines: this.getLinesForRange({ start: t, end: n }) }), this.clonePos(t));
        }),
        (this.removeInLine = function (e, t, n) {
          var r = this.clippedPos(e, t),
            i = this.clippedPos(e, n);
          return (this.applyDelta({ start: r, end: i, action: 'remove', lines: this.getLinesForRange({ start: r, end: i }) }, !0), this.clonePos(r));
        }),
        (this.removeFullLines = function (e, t) {
          ((e = Math.min(Math.max(0, e), this.getLength() - 1)), (t = Math.min(Math.max(0, t), this.getLength() - 1)));
          var n = t == this.getLength() - 1 && e > 0,
            r = t < this.getLength() - 1,
            i = n ? e - 1 : e,
            s = n ? this.getLine(i).length : 0,
            u = r ? t + 1 : t,
            a = r ? 0 : this.getLine(u).length,
            f = new o(i, s, u, a),
            l = this.$lines.slice(e, t + 1);
          return (this.applyDelta({ start: f.start, end: f.end, action: 'remove', lines: this.getLinesForRange(f) }), l);
        }),
        (this.removeNewLine = function (e) {
          e < this.getLength() - 1 && e >= 0 && this.applyDelta({ start: this.pos(e, this.getLine(e).length), end: this.pos(e + 1, 0), action: 'remove', lines: ['', ''] });
        }),
        (this.replace = function (e, t) {
          e instanceof o || (e = o.fromPoints(e.start, e.end));
          if (t.length === 0 && e.isEmpty()) return e.start;
          if (t == this.getTextRange(e)) return e.end;
          this.remove(e);
          var n;
          return (t ? (n = this.insert(e.start, t)) : (n = e.start), n);
        }),
        (this.applyDeltas = function (e) {
          for (var t = 0; t < e.length; t++) this.applyDelta(e[t]);
        }),
        (this.revertDeltas = function (e) {
          for (var t = e.length - 1; t >= 0; t--) this.revertDelta(e[t]);
        }),
        (this.applyDelta = function (e, t) {
          var n = e.action == 'insert';
          if (n ? e.lines.length <= 1 && !e.lines[0] : !o.comparePoints(e.start, e.end)) return;
          (n && e.lines.length > 2e4 && this.$splitAndapplyLargeDelta(e, 2e4), i(this.$lines, e, t), this._signal('change', e));
        }),
        (this.$splitAndapplyLargeDelta = function (e, t) {
          var n = e.lines,
            r = n.length,
            i = e.start.row,
            s = e.start.column,
            o = 0,
            u = 0;
          do {
            ((o = u), (u += t - 1));
            var a = n.slice(o, u);
            if (u > r) {
              ((e.lines = a), (e.start.row = i + o), (e.start.column = s));
              break;
            }
            (a.push(''), this.applyDelta({ start: this.pos(i + o, s), end: this.pos(i + u, (s = 0)), action: e.action, lines: a }, !0));
          } while (!0);
        }),
        (this.revertDelta = function (e) {
          this.applyDelta({ start: this.clonePos(e.start), end: this.clonePos(e.end), action: e.action == 'insert' ? 'remove' : 'insert', lines: e.lines.slice() });
        }),
        (this.indexToPosition = function (e, t) {
          var n = this.$lines || this.getAllLines(),
            r = this.getNewLineCharacter().length;
          for (var i = t || 0, s = n.length; i < s; i++) {
            e -= n[i].length + r;
            if (e < 0) return { row: i, column: e + n[i].length + r };
          }
          return { row: s - 1, column: n[s - 1].length };
        }),
        (this.positionToIndex = function (e, t) {
          var n = this.$lines || this.getAllLines(),
            r = this.getNewLineCharacter().length,
            i = 0,
            s = Math.min(e.row, n.length);
          for (var o = t || 0; o < s; ++o) i += n[o].length + r;
          return i + e.column;
        }));
    }).call(a.prototype),
      (t.Document = a));
  }),
  ace.define('ace/worker/mirror', ['require', 'exports', 'module', 'ace/range', 'ace/document', 'ace/lib/lang'], function (e, t, n) {
    'use strict';
    var r = e('../range').Range,
      i = e('../document').Document,
      s = e('../lib/lang'),
      o = (t.Mirror = function (e) {
        this.sender = e;
        var t = (this.doc = new i('')),
          n = (this.deferredUpdate = s.delayedCall(this.onUpdate.bind(this))),
          r = this;
        e.on('change', function (e) {
          var i = e.data;
          if (i[0].start) t.applyDeltas(i);
          else
            for (var s = 0; s < i.length; s += 2) {
              if (Array.isArray(i[s + 1])) var o = { action: 'insert', start: i[s], lines: i[s + 1] };
              else var o = { action: 'remove', start: i[s], end: i[s + 1] };
              t.applyDelta(o, !0);
            }
          if (r.$timeout) return n.schedule(r.$timeout);
          r.onUpdate();
        });
      });
    (function () {
      ((this.$timeout = 500),
        (this.setTimeout = function (e) {
          this.$timeout = e;
        }),
        (this.setValue = function (e) {
          (this.doc.setValue(e), this.deferredUpdate.schedule(this.$timeout));
        }),
        (this.getValue = function (e) {
          this.sender.callback(this.doc.getValue(), e);
        }),
        (this.onUpdate = function () {}),
        (this.isPending = function () {
          return this.deferredUpdate.isPending();
        }));
    }).call(o.prototype);
  }),
  ace.define('ace/mode/css/csslint', ['require', 'exports', 'module'], function (require, exports, module) {
    function objectToString(e) {
      return Object.prototype.toString.call(e);
    }
    function clone(e, t, n, r) {
      function u(e, n) {
        if (e === null) return null;
        if (n == 0) return e;
        var a;
        if (typeof e != 'object') return e;
        if (util.isArray(e)) a = [];
        else if (util.isRegExp(e)) ((a = new RegExp(e.source, util.getRegExpFlags(e))), e.lastIndex && (a.lastIndex = e.lastIndex));
        else if (util.isDate(e)) a = new Date(e.getTime());
        else {
          if (o && Buffer.isBuffer(e)) return ((a = new Buffer(e.length)), e.copy(a), a);
          typeof r == 'undefined' ? (a = Object.create(Object.getPrototypeOf(e))) : (a = Object.create(r));
        }
        if (t) {
          var f = i.indexOf(e);
          if (f != -1) return s[f];
          (i.push(e), s.push(a));
        }
        for (var l in e) a[l] = u(e[l], n - 1);
        return a;
      }
      var i = [],
        s = [],
        o = typeof Buffer != 'undefined';
      return (typeof t == 'undefined' && (t = !0), typeof n == 'undefined' && (n = Infinity), u(e, n));
    }
    function Reporter(e, t) {
      ((this.messages = []), (this.stats = []), (this.lines = e), (this.ruleset = t));
    }
    var parserlib = {};
    ((function () {
      function e() {
        this._listeners = {};
      }
      function t(e) {
        ((this._input = e.replace(/\n\r?/g, '\n')), (this._line = 1), (this._col = 1), (this._cursor = 0));
      }
      function n(e, t, n) {
        ((this.col = n), (this.line = t), (this.message = e));
      }
      function r(e, t, n, r) {
        ((this.col = n), (this.line = t), (this.text = e), (this.type = r));
      }
      function i(e, n) {
        ((this._reader = e ? new t(e.toString()) : null), (this._token = null), (this._tokenData = n), (this._lt = []), (this._ltIndex = 0), (this._ltIndexCache = []));
      }
      ((e.prototype = {
        constructor: e,
        addListener: function (e, t) {
          (this._listeners[e] || (this._listeners[e] = []), this._listeners[e].push(t));
        },
        fire: function (e) {
          (typeof e == 'string' && (e = { type: e }), typeof e.target != 'undefined' && (e.target = this));
          if (typeof e.type == 'undefined') throw new Error("Event object missing 'type' property.");
          if (this._listeners[e.type]) {
            var t = this._listeners[e.type].concat();
            for (var n = 0, r = t.length; n < r; n++) t[n].call(this, e);
          }
        },
        removeListener: function (e, t) {
          if (this._listeners[e]) {
            var n = this._listeners[e];
            for (var r = 0, i = n.length; r < i; r++)
              if (n[r] === t) {
                n.splice(r, 1);
                break;
              }
          }
        },
      }),
        (t.prototype = {
          constructor: t,
          getCol: function () {
            return this._col;
          },
          getLine: function () {
            return this._line;
          },
          eof: function () {
            return this._cursor == this._input.length;
          },
          peek: function (e) {
            var t = null;
            return ((e = typeof e == 'undefined' ? 1 : e), this._cursor < this._input.length && (t = this._input.charAt(this._cursor + e - 1)), t);
          },
          read: function () {
            var e = null;
            return (this._cursor < this._input.length && (this._input.charAt(this._cursor) == '\n' ? (this._line++, (this._col = 1)) : this._col++, (e = this._input.charAt(this._cursor++))), e);
          },
          mark: function () {
            this._bookmark = { cursor: this._cursor, line: this._line, col: this._col };
          },
          reset: function () {
            this._bookmark && ((this._cursor = this._bookmark.cursor), (this._line = this._bookmark.line), (this._col = this._bookmark.col), delete this._bookmark);
          },
          readTo: function (e) {
            var t = '',
              n;
            while (t.length < e.length || t.lastIndexOf(e) != t.length - e.length) {
              n = this.read();
              if (!n) throw new Error('Expected "' + e + '" at line ' + this._line + ', col ' + this._col + '.');
              t += n;
            }
            return t;
          },
          readWhile: function (e) {
            var t = '',
              n = this.read();
            while (n !== null && e(n)) ((t += n), (n = this.read()));
            return t;
          },
          readMatch: function (e) {
            var t = this._input.substring(this._cursor),
              n = null;
            return (typeof e == 'string' ? t.indexOf(e) === 0 && (n = this.readCount(e.length)) : e instanceof RegExp && e.test(t) && (n = this.readCount(RegExp.lastMatch.length)), n);
          },
          readCount: function (e) {
            var t = '';
            while (e--) t += this.read();
            return t;
          },
        }),
        (n.prototype = new Error()),
        (r.fromToken = function (e) {
          return new r(e.value, e.startLine, e.startCol);
        }),
        (r.prototype = {
          constructor: r,
          valueOf: function () {
            return this.text;
          },
          toString: function () {
            return this.text;
          },
        }),
        (i.createTokenData = function (e) {
          var t = [],
            n = {},
            r = e.concat([]),
            i = 0,
            s = r.length + 1;
          ((r.UNKNOWN = -1), r.unshift({ name: 'EOF' }));
          for (; i < s; i++) (t.push(r[i].name), (r[r[i].name] = i), r[i].text && (n[r[i].text] = i));
          return (
            (r.name = function (e) {
              return t[e];
            }),
            (r.type = function (e) {
              return n[e];
            }),
            r
          );
        }),
        (i.prototype = {
          constructor: i,
          match: function (e, t) {
            e instanceof Array || (e = [e]);
            var n = this.get(t),
              r = 0,
              i = e.length;
            while (r < i) if (n == e[r++]) return !0;
            return (this.unget(), !1);
          },
          mustMatch: function (e, t) {
            var r;
            e instanceof Array || (e = [e]);
            if (!this.match.apply(this, arguments)) throw ((r = this.LT(1)), new n('Expected ' + this._tokenData[e[0]].name + ' at line ' + r.startLine + ', col ' + r.startCol + '.', r.startLine, r.startCol));
          },
          advance: function (e, t) {
            while (this.LA(0) !== 0 && !this.match(e, t)) this.get();
            return this.LA(0);
          },
          get: function (e) {
            var t = this._tokenData,
              n = this._reader,
              r,
              i = 0,
              s = t.length,
              o = !1,
              u,
              a;
            if (this._lt.length && this._ltIndex >= 0 && this._ltIndex < this._lt.length) {
              (i++, (this._token = this._lt[this._ltIndex++]), (a = t[this._token.type]));
              while (a.channel !== undefined && e !== a.channel && this._ltIndex < this._lt.length) ((this._token = this._lt[this._ltIndex++]), (a = t[this._token.type]), i++);
              if ((a.channel === undefined || e === a.channel) && this._ltIndex <= this._lt.length) return (this._ltIndexCache.push(i), this._token.type);
            }
            return (
              (u = this._getToken()),
              u.type > -1 &&
                !t[u.type].hide &&
                ((u.channel = t[u.type].channel), (this._token = u), this._lt.push(u), this._ltIndexCache.push(this._lt.length - this._ltIndex + i), this._lt.length > 5 && this._lt.shift(), this._ltIndexCache.length > 5 && this._ltIndexCache.shift(), (this._ltIndex = this._lt.length)),
              (a = t[u.type]),
              a && (a.hide || (a.channel !== undefined && e !== a.channel)) ? this.get(e) : u.type
            );
          },
          LA: function (e) {
            var t = e,
              n;
            if (e > 0) {
              if (e > 5) throw new Error('Too much lookahead.');
              while (t) ((n = this.get()), t--);
              while (t < e) (this.unget(), t++);
            } else if (e < 0) {
              if (!this._lt[this._ltIndex + e]) throw new Error('Too much lookbehind.');
              n = this._lt[this._ltIndex + e].type;
            } else n = this._token.type;
            return n;
          },
          LT: function (e) {
            return (this.LA(e), this._lt[this._ltIndex + e - 1]);
          },
          peek: function () {
            return this.LA(1);
          },
          token: function () {
            return this._token;
          },
          tokenName: function (e) {
            return e < 0 || e > this._tokenData.length ? 'UNKNOWN_TOKEN' : this._tokenData[e].name;
          },
          tokenType: function (e) {
            return this._tokenData[e] || -1;
          },
          unget: function () {
            if (!this._ltIndexCache.length) throw new Error('Too much lookahead.');
            ((this._ltIndex -= this._ltIndexCache.pop()), (this._token = this._lt[this._ltIndex - 1]));
          },
        }),
        (parserlib.util = { StringReader: t, SyntaxError: n, SyntaxUnit: r, EventTarget: e, TokenStreamBase: i }));
    })(),
      (function () {
        function Combinator(e, t, n) {
          (SyntaxUnit.call(this, e, t, n, Parser.COMBINATOR_TYPE), (this.type = 'unknown'), /^\s+$/.test(e) ? (this.type = 'descendant') : e == '>' ? (this.type = 'child') : e == '+' ? (this.type = 'adjacent-sibling') : e == '~' && (this.type = 'sibling'));
        }
        function MediaFeature(e, t) {
          (SyntaxUnit.call(this, '(' + e + (t !== null ? ':' + t : '') + ')', e.startLine, e.startCol, Parser.MEDIA_FEATURE_TYPE), (this.name = e), (this.value = t));
        }
        function MediaQuery(e, t, n, r, i) {
          (SyntaxUnit.call(this, (e ? e + ' ' : '') + (t ? t : '') + (t && n.length > 0 ? ' and ' : '') + n.join(' and '), r, i, Parser.MEDIA_QUERY_TYPE), (this.modifier = e), (this.mediaType = t), (this.features = n));
        }
        function Parser(e) {
          (EventTarget.call(this), (this.options = e || {}), (this._tokenStream = null));
        }
        function PropertyName(e, t, n, r) {
          (SyntaxUnit.call(this, e, n, r, Parser.PROPERTY_NAME_TYPE), (this.hack = t));
        }
        function PropertyValue(e, t, n) {
          (SyntaxUnit.call(this, e.join(' '), t, n, Parser.PROPERTY_VALUE_TYPE), (this.parts = e));
        }
        function PropertyValueIterator(e) {
          ((this._i = 0), (this._parts = e.parts), (this._marks = []), (this.value = e));
        }
        function PropertyValuePart(text, line, col) {
          (SyntaxUnit.call(this, text, line, col, Parser.PROPERTY_VALUE_PART_TYPE), (this.type = 'unknown'));
          var temp;
          if (/^([+\-]?[\d\.]+)([a-z]+)$/i.test(text)) {
            ((this.type = 'dimension'), (this.value = +RegExp.$1), (this.units = RegExp.$2));
            switch (this.units.toLowerCase()) {
              case 'em':
              case 'rem':
              case 'ex':
              case 'px':
              case 'cm':
              case 'mm':
              case 'in':
              case 'pt':
              case 'pc':
              case 'ch':
              case 'vh':
              case 'vw':
              case 'vmax':
              case 'vmin':
                this.type = 'length';
                break;
              case 'deg':
              case 'rad':
              case 'grad':
                this.type = 'angle';
                break;
              case 'ms':
              case 's':
                this.type = 'time';
                break;
              case 'hz':
              case 'khz':
                this.type = 'frequency';
                break;
              case 'dpi':
              case 'dpcm':
                this.type = 'resolution';
            }
          } else
            /^([+\-]?[\d\.]+)%$/i.test(text)
              ? ((this.type = 'percentage'), (this.value = +RegExp.$1))
              : /^([+\-]?\d+)$/i.test(text)
                ? ((this.type = 'integer'), (this.value = +RegExp.$1))
                : /^([+\-]?[\d\.]+)$/i.test(text)
                  ? ((this.type = 'number'), (this.value = +RegExp.$1))
                  : /^#([a-f0-9]{3,6})/i.test(text)
                    ? ((this.type = 'color'),
                      (temp = RegExp.$1),
                      temp.length == 3
                        ? ((this.red = parseInt(temp.charAt(0) + temp.charAt(0), 16)), (this.green = parseInt(temp.charAt(1) + temp.charAt(1), 16)), (this.blue = parseInt(temp.charAt(2) + temp.charAt(2), 16)))
                        : ((this.red = parseInt(temp.substring(0, 2), 16)), (this.green = parseInt(temp.substring(2, 4), 16)), (this.blue = parseInt(temp.substring(4, 6), 16))))
                    : /^rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/i.test(text)
                      ? ((this.type = 'color'), (this.red = +RegExp.$1), (this.green = +RegExp.$2), (this.blue = +RegExp.$3))
                      : /^rgb\(\s*(\d+)%\s*,\s*(\d+)%\s*,\s*(\d+)%\s*\)/i.test(text)
                        ? ((this.type = 'color'), (this.red = (+RegExp.$1 * 255) / 100), (this.green = (+RegExp.$2 * 255) / 100), (this.blue = (+RegExp.$3 * 255) / 100))
                        : /^rgba\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*([\d\.]+)\s*\)/i.test(text)
                          ? ((this.type = 'color'), (this.red = +RegExp.$1), (this.green = +RegExp.$2), (this.blue = +RegExp.$3), (this.alpha = +RegExp.$4))
                          : /^rgba\(\s*(\d+)%\s*,\s*(\d+)%\s*,\s*(\d+)%\s*,\s*([\d\.]+)\s*\)/i.test(text)
                            ? ((this.type = 'color'), (this.red = (+RegExp.$1 * 255) / 100), (this.green = (+RegExp.$2 * 255) / 100), (this.blue = (+RegExp.$3 * 255) / 100), (this.alpha = +RegExp.$4))
                            : /^hsl\(\s*(\d+)\s*,\s*(\d+)%\s*,\s*(\d+)%\s*\)/i.test(text)
                              ? ((this.type = 'color'), (this.hue = +RegExp.$1), (this.saturation = +RegExp.$2 / 100), (this.lightness = +RegExp.$3 / 100))
                              : /^hsla\(\s*(\d+)\s*,\s*(\d+)%\s*,\s*(\d+)%\s*,\s*([\d\.]+)\s*\)/i.test(text)
                                ? ((this.type = 'color'), (this.hue = +RegExp.$1), (this.saturation = +RegExp.$2 / 100), (this.lightness = +RegExp.$3 / 100), (this.alpha = +RegExp.$4))
                                : /^url\(["']?([^\)"']+)["']?\)/i.test(text)
                                  ? ((this.type = 'uri'), (this.uri = RegExp.$1))
                                  : /^([^\(]+)\(/i.test(text)
                                    ? ((this.type = 'function'), (this.name = RegExp.$1), (this.value = text))
                                    : /^["'][^"']*["']/.test(text)
                                      ? ((this.type = 'string'), (this.value = eval(text)))
                                      : Colors[text.toLowerCase()]
                                        ? ((this.type = 'color'), (temp = Colors[text.toLowerCase()].substring(1)), (this.red = parseInt(temp.substring(0, 2), 16)), (this.green = parseInt(temp.substring(2, 4), 16)), (this.blue = parseInt(temp.substring(4, 6), 16)))
                                        : /^[\,\/]$/.test(text)
                                          ? ((this.type = 'operator'), (this.value = text))
                                          : /^[a-z\-_\u0080-\uFFFF][a-z0-9\-_\u0080-\uFFFF]*$/i.test(text) && ((this.type = 'identifier'), (this.value = text));
        }
        function Selector(e, t, n) {
          (SyntaxUnit.call(this, e.join(' '), t, n, Parser.SELECTOR_TYPE), (this.parts = e), (this.specificity = Specificity.calculate(this)));
        }
        function SelectorPart(e, t, n, r, i) {
          (SyntaxUnit.call(this, n, r, i, Parser.SELECTOR_PART_TYPE), (this.elementName = e), (this.modifiers = t));
        }
        function SelectorSubPart(e, t, n, r) {
          (SyntaxUnit.call(this, e, n, r, Parser.SELECTOR_SUB_PART_TYPE), (this.type = t), (this.args = []));
        }
        function Specificity(e, t, n, r) {
          ((this.a = e), (this.b = t), (this.c = n), (this.d = r));
        }
        function isHexDigit(e) {
          return e !== null && h.test(e);
        }
        function isDigit(e) {
          return e !== null && /\d/.test(e);
        }
        function isWhitespace(e) {
          return e !== null && /\s/.test(e);
        }
        function isNewLine(e) {
          return e !== null && nl.test(e);
        }
        function isNameStart(e) {
          return e !== null && /[a-z_\u0080-\uFFFF\\]/i.test(e);
        }
        function isNameChar(e) {
          return e !== null && (isNameStart(e) || /[0-9\-\\]/.test(e));
        }
        function isIdentStart(e) {
          return e !== null && (isNameStart(e) || /\-\\/.test(e));
        }
        function mix(e, t) {
          for (var n in t) t.hasOwnProperty(n) && (e[n] = t[n]);
          return e;
        }
        function TokenStream(e) {
          TokenStreamBase.call(this, e, Tokens);
        }
        function ValidationError(e, t, n) {
          ((this.col = n), (this.line = t), (this.message = e));
        }
        var EventTarget = parserlib.util.EventTarget,
          TokenStreamBase = parserlib.util.TokenStreamBase,
          StringReader = parserlib.util.StringReader,
          SyntaxError = parserlib.util.SyntaxError,
          SyntaxUnit = parserlib.util.SyntaxUnit,
          Colors = {
            aliceblue: '#f0f8ff',
            antiquewhite: '#faebd7',
            aqua: '#00ffff',
            aquamarine: '#7fffd4',
            azure: '#f0ffff',
            beige: '#f5f5dc',
            bisque: '#ffe4c4',
            black: '#000000',
            blanchedalmond: '#ffebcd',
            blue: '#0000ff',
            blueviolet: '#8a2be2',
            brown: '#a52a2a',
            burlywood: '#deb887',
            cadetblue: '#5f9ea0',
            chartreuse: '#7fff00',
            chocolate: '#d2691e',
            coral: '#ff7f50',
            cornflowerblue: '#6495ed',
            cornsilk: '#fff8dc',
            crimson: '#dc143c',
            cyan: '#00ffff',
            darkblue: '#00008b',
            darkcyan: '#008b8b',
            darkgoldenrod: '#b8860b',
            darkgray: '#a9a9a9',
            darkgrey: '#a9a9a9',
            darkgreen: '#006400',
            darkkhaki: '#bdb76b',
            darkmagenta: '#8b008b',
            darkolivegreen: '#556b2f',
            darkorange: '#ff8c00',
            darkorchid: '#9932cc',
            darkred: '#8b0000',
            darksalmon: '#e9967a',
            darkseagreen: '#8fbc8f',
            darkslateblue: '#483d8b',
            darkslategray: '#2f4f4f',
            darkslategrey: '#2f4f4f',
            darkturquoise: '#00ced1',
            darkviolet: '#9400d3',
            deeppink: '#ff1493',
            deepskyblue: '#00bfff',
            dimgray: '#696969',
            dimgrey: '#696969',
            dodgerblue: '#1e90ff',
            firebrick: '#b22222',
            floralwhite: '#fffaf0',
            forestgreen: '#228b22',
            fuchsia: '#ff00ff',
            gainsboro: '#dcdcdc',
            ghostwhite: '#f8f8ff',
            gold: '#ffd700',
            goldenrod: '#daa520',
            gray: '#808080',
            grey: '#808080',
            green: '#008000',
            greenyellow: '#adff2f',
            honeydew: '#f0fff0',
            hotpink: '#ff69b4',
            indianred: '#cd5c5c',
            indigo: '#4b0082',
            ivory: '#fffff0',
            khaki: '#f0e68c',
            lavender: '#e6e6fa',
            lavenderblush: '#fff0f5',
            lawngreen: '#7cfc00',
            lemonchiffon: '#fffacd',
            lightblue: '#add8e6',
            lightcoral: '#f08080',
            lightcyan: '#e0ffff',
            lightgoldenrodyellow: '#fafad2',
            lightgray: '#d3d3d3',
            lightgrey: '#d3d3d3',
            lightgreen: '#90ee90',
            lightpink: '#ffb6c1',
            lightsalmon: '#ffa07a',
            lightseagreen: '#20b2aa',
            lightskyblue: '#87cefa',
            lightslategray: '#778899',
            lightslategrey: '#778899',
            lightsteelblue: '#b0c4de',
            lightyellow: '#ffffe0',
            lime: '#00ff00',
            limegreen: '#32cd32',
            linen: '#faf0e6',
            magenta: '#ff00ff',
            maroon: '#800000',
            mediumaquamarine: '#66cdaa',
            mediumblue: '#0000cd',
            mediumorchid: '#ba55d3',
            mediumpurple: '#9370d8',
            mediumseagreen: '#3cb371',
            mediumslateblue: '#7b68ee',
            mediumspringgreen: '#00fa9a',
            mediumturquoise: '#48d1cc',
            mediumvioletred: '#c71585',
            midnightblue: '#191970',
            mintcream: '#f5fffa',
            mistyrose: '#ffe4e1',
            moccasin: '#ffe4b5',
            navajowhite: '#ffdead',
            navy: '#000080',
            oldlace: '#fdf5e6',
            olive: '#808000',
            olivedrab: '#6b8e23',
            orange: '#ffa500',
            orangered: '#ff4500',
            orchid: '#da70d6',
            palegoldenrod: '#eee8aa',
            palegreen: '#98fb98',
            paleturquoise: '#afeeee',
            palevioletred: '#d87093',
            papayawhip: '#ffefd5',
            peachpuff: '#ffdab9',
            peru: '#cd853f',
            pink: '#ffc0cb',
            plum: '#dda0dd',
            powderblue: '#b0e0e6',
            purple: '#800080',
            red: '#ff0000',
            rosybrown: '#bc8f8f',
            royalblue: '#4169e1',
            saddlebrown: '#8b4513',
            salmon: '#fa8072',
            sandybrown: '#f4a460',
            seagreen: '#2e8b57',
            seashell: '#fff5ee',
            sienna: '#a0522d',
            silver: '#c0c0c0',
            skyblue: '#87ceeb',
            slateblue: '#6a5acd',
            slategray: '#708090',
            slategrey: '#708090',
            snow: '#fffafa',
            springgreen: '#00ff7f',
            steelblue: '#4682b4',
            tan: '#d2b48c',
            teal: '#008080',
            thistle: '#d8bfd8',
            tomato: '#ff6347',
            turquoise: '#40e0d0',
            violet: '#ee82ee',
            wheat: '#f5deb3',
            white: '#ffffff',
            whitesmoke: '#f5f5f5',
            yellow: '#ffff00',
            yellowgreen: '#9acd32',
            activeBorder: 'Active window border.',
            activecaption: 'Active window caption.',
            appworkspace: 'Background color of multiple document interface.',
            background: 'Desktop background.',
            buttonface: 'The face background color for 3-D elements that appear 3-D due to one layer of surrounding border.',
            buttonhighlight: 'The color of the border facing the light source for 3-D elements that appear 3-D due to one layer of surrounding border.',
            buttonshadow: 'The color of the border away from the light source for 3-D elements that appear 3-D due to one layer of surrounding border.',
            buttontext: 'Text on push buttons.',
            captiontext: 'Text in caption, size box, and scrollbar arrow box.',
            graytext: 'Grayed (disabled) text. This color is set to #000 if the current display driver does not support a solid gray color.',
            greytext: 'Greyed (disabled) text. This color is set to #000 if the current display driver does not support a solid grey color.',
            highlight: 'Item(s) selected in a control.',
            highlighttext: 'Text of item(s) selected in a control.',
            inactiveborder: 'Inactive window border.',
            inactivecaption: 'Inactive window caption.',
            inactivecaptiontext: 'Color of text in an inactive caption.',
            infobackground: 'Background color for tooltip controls.',
            infotext: 'Text color for tooltip controls.',
            menu: 'Menu background.',
            menutext: 'Text in menus.',
            scrollbar: 'Scroll bar gray area.',
            threeddarkshadow: 'The color of the darker (generally outer) of the two borders away from the light source for 3-D elements that appear 3-D due to two concentric layers of surrounding border.',
            threedface: 'The face background color for 3-D elements that appear 3-D due to two concentric layers of surrounding border.',
            threedhighlight: 'The color of the lighter (generally outer) of the two borders facing the light source for 3-D elements that appear 3-D due to two concentric layers of surrounding border.',
            threedlightshadow: 'The color of the darker (generally inner) of the two borders facing the light source for 3-D elements that appear 3-D due to two concentric layers of surrounding border.',
            threedshadow: 'The color of the lighter (generally inner) of the two borders away from the light source for 3-D elements that appear 3-D due to two concentric layers of surrounding border.',
            window: 'Window background.',
            windowframe: 'Window frame.',
            windowtext: 'Text in windows.',
          };
        ((Combinator.prototype = new SyntaxUnit()),
          (Combinator.prototype.constructor = Combinator),
          (MediaFeature.prototype = new SyntaxUnit()),
          (MediaFeature.prototype.constructor = MediaFeature),
          (MediaQuery.prototype = new SyntaxUnit()),
          (MediaQuery.prototype.constructor = MediaQuery),
          (Parser.DEFAULT_TYPE = 0),
          (Parser.COMBINATOR_TYPE = 1),
          (Parser.MEDIA_FEATURE_TYPE = 2),
          (Parser.MEDIA_QUERY_TYPE = 3),
          (Parser.PROPERTY_NAME_TYPE = 4),
          (Parser.PROPERTY_VALUE_TYPE = 5),
          (Parser.PROPERTY_VALUE_PART_TYPE = 6),
          (Parser.SELECTOR_TYPE = 7),
          (Parser.SELECTOR_PART_TYPE = 8),
          (Parser.SELECTOR_SUB_PART_TYPE = 9),
          (Parser.prototype = (function () {
            var e = new EventTarget(),
              t,
              n = {
                constructor: Parser,
                DEFAULT_TYPE: 0,
                COMBINATOR_TYPE: 1,
                MEDIA_FEATURE_TYPE: 2,
                MEDIA_QUERY_TYPE: 3,
                PROPERTY_NAME_TYPE: 4,
                PROPERTY_VALUE_TYPE: 5,
                PROPERTY_VALUE_PART_TYPE: 6,
                SELECTOR_TYPE: 7,
                SELECTOR_PART_TYPE: 8,
                SELECTOR_SUB_PART_TYPE: 9,
                _stylesheet: function () {
                  var e = this._tokenStream,
                    t = null,
                    n,
                    r,
                    i;
                  (this.fire('startstylesheet'), this._charset(), this._skipCruft());
                  while (e.peek() == Tokens.IMPORT_SYM) (this._import(), this._skipCruft());
                  while (e.peek() == Tokens.NAMESPACE_SYM) (this._namespace(), this._skipCruft());
                  i = e.peek();
                  while (i > Tokens.EOF) {
                    try {
                      switch (i) {
                        case Tokens.MEDIA_SYM:
                          (this._media(), this._skipCruft());
                          break;
                        case Tokens.PAGE_SYM:
                          (this._page(), this._skipCruft());
                          break;
                        case Tokens.FONT_FACE_SYM:
                          (this._font_face(), this._skipCruft());
                          break;
                        case Tokens.KEYFRAMES_SYM:
                          (this._keyframes(), this._skipCruft());
                          break;
                        case Tokens.VIEWPORT_SYM:
                          (this._viewport(), this._skipCruft());
                          break;
                        case Tokens.UNKNOWN_SYM:
                          e.get();
                          if (!!this.options.strict) throw new SyntaxError('Unknown @ rule.', e.LT(0).startLine, e.LT(0).startCol);
                          (this.fire({ type: 'error', error: null, message: 'Unknown @ rule: ' + e.LT(0).value + '.', line: e.LT(0).startLine, col: e.LT(0).startCol }), (n = 0));
                          while (e.advance([Tokens.LBRACE, Tokens.RBRACE]) == Tokens.LBRACE) n++;
                          while (n) (e.advance([Tokens.RBRACE]), n--);
                          break;
                        case Tokens.S:
                          this._readWhitespace();
                          break;
                        default:
                          if (!this._ruleset())
                            switch (i) {
                              case Tokens.CHARSET_SYM:
                                throw ((r = e.LT(1)), this._charset(!1), new SyntaxError('@charset not allowed here.', r.startLine, r.startCol));
                              case Tokens.IMPORT_SYM:
                                throw ((r = e.LT(1)), this._import(!1), new SyntaxError('@import not allowed here.', r.startLine, r.startCol));
                              case Tokens.NAMESPACE_SYM:
                                throw ((r = e.LT(1)), this._namespace(!1), new SyntaxError('@namespace not allowed here.', r.startLine, r.startCol));
                              default:
                                (e.get(), this._unexpectedToken(e.token()));
                            }
                      }
                    } catch (s) {
                      if (!(s instanceof SyntaxError && !this.options.strict)) throw s;
                      this.fire({ type: 'error', error: s, message: s.message, line: s.line, col: s.col });
                    }
                    i = e.peek();
                  }
                  (i != Tokens.EOF && this._unexpectedToken(e.token()), this.fire('endstylesheet'));
                },
                _charset: function (e) {
                  var t = this._tokenStream,
                    n,
                    r,
                    i,
                    s;
                  t.match(Tokens.CHARSET_SYM) &&
                    ((i = t.token().startLine), (s = t.token().startCol), this._readWhitespace(), t.mustMatch(Tokens.STRING), (r = t.token()), (n = r.value), this._readWhitespace(), t.mustMatch(Tokens.SEMICOLON), e !== !1 && this.fire({ type: 'charset', charset: n, line: i, col: s }));
                },
                _import: function (e) {
                  var t = this._tokenStream,
                    n,
                    r,
                    i,
                    s = [];
                  (t.mustMatch(Tokens.IMPORT_SYM),
                    (i = t.token()),
                    this._readWhitespace(),
                    t.mustMatch([Tokens.STRING, Tokens.URI]),
                    (r = t.token().value.replace(/^(?:url\()?["']?([^"']+?)["']?\)?$/, '$1')),
                    this._readWhitespace(),
                    (s = this._media_query_list()),
                    t.mustMatch(Tokens.SEMICOLON),
                    this._readWhitespace(),
                    e !== !1 && this.fire({ type: 'import', uri: r, media: s, line: i.startLine, col: i.startCol }));
                },
                _namespace: function (e) {
                  var t = this._tokenStream,
                    n,
                    r,
                    i,
                    s;
                  (t.mustMatch(Tokens.NAMESPACE_SYM),
                    (n = t.token().startLine),
                    (r = t.token().startCol),
                    this._readWhitespace(),
                    t.match(Tokens.IDENT) && ((i = t.token().value), this._readWhitespace()),
                    t.mustMatch([Tokens.STRING, Tokens.URI]),
                    (s = t.token().value.replace(/(?:url\()?["']([^"']+)["']\)?/, '$1')),
                    this._readWhitespace(),
                    t.mustMatch(Tokens.SEMICOLON),
                    this._readWhitespace(),
                    e !== !1 && this.fire({ type: 'namespace', prefix: i, uri: s, line: n, col: r }));
                },
                _media: function () {
                  var e = this._tokenStream,
                    t,
                    n,
                    r;
                  (e.mustMatch(Tokens.MEDIA_SYM), (t = e.token().startLine), (n = e.token().startCol), this._readWhitespace(), (r = this._media_query_list()), e.mustMatch(Tokens.LBRACE), this._readWhitespace(), this.fire({ type: 'startmedia', media: r, line: t, col: n }));
                  for (;;)
                    if (e.peek() == Tokens.PAGE_SYM) this._page();
                    else if (e.peek() == Tokens.FONT_FACE_SYM) this._font_face();
                    else if (e.peek() == Tokens.VIEWPORT_SYM) this._viewport();
                    else if (!this._ruleset()) break;
                  (e.mustMatch(Tokens.RBRACE), this._readWhitespace(), this.fire({ type: 'endmedia', media: r, line: t, col: n }));
                },
                _media_query_list: function () {
                  var e = this._tokenStream,
                    t = [];
                  (this._readWhitespace(), (e.peek() == Tokens.IDENT || e.peek() == Tokens.LPAREN) && t.push(this._media_query()));
                  while (e.match(Tokens.COMMA)) (this._readWhitespace(), t.push(this._media_query()));
                  return t;
                },
                _media_query: function () {
                  var e = this._tokenStream,
                    t = null,
                    n = null,
                    r = null,
                    i = [];
                  (e.match(Tokens.IDENT) && ((n = e.token().value.toLowerCase()), n != 'only' && n != 'not' ? (e.unget(), (n = null)) : (r = e.token())),
                    this._readWhitespace(),
                    e.peek() == Tokens.IDENT ? ((t = this._media_type()), r === null && (r = e.token())) : e.peek() == Tokens.LPAREN && (r === null && (r = e.LT(1)), i.push(this._media_expression())));
                  if (t === null && i.length === 0) return null;
                  this._readWhitespace();
                  while (e.match(Tokens.IDENT)) (e.token().value.toLowerCase() != 'and' && this._unexpectedToken(e.token()), this._readWhitespace(), i.push(this._media_expression()));
                  return new MediaQuery(n, t, i, r.startLine, r.startCol);
                },
                _media_type: function () {
                  return this._media_feature();
                },
                _media_expression: function () {
                  var e = this._tokenStream,
                    t = null,
                    n,
                    r = null;
                  return (
                    e.mustMatch(Tokens.LPAREN),
                    (t = this._media_feature()),
                    this._readWhitespace(),
                    e.match(Tokens.COLON) && (this._readWhitespace(), (n = e.LT(1)), (r = this._expression())),
                    e.mustMatch(Tokens.RPAREN),
                    this._readWhitespace(),
                    new MediaFeature(t, r ? new SyntaxUnit(r, n.startLine, n.startCol) : null)
                  );
                },
                _media_feature: function () {
                  var e = this._tokenStream;
                  return (e.mustMatch(Tokens.IDENT), SyntaxUnit.fromToken(e.token()));
                },
                _page: function () {
                  var e = this._tokenStream,
                    t,
                    n,
                    r = null,
                    i = null;
                  (e.mustMatch(Tokens.PAGE_SYM),
                    (t = e.token().startLine),
                    (n = e.token().startCol),
                    this._readWhitespace(),
                    e.match(Tokens.IDENT) && ((r = e.token().value), r.toLowerCase() === 'auto' && this._unexpectedToken(e.token())),
                    e.peek() == Tokens.COLON && (i = this._pseudo_page()),
                    this._readWhitespace(),
                    this.fire({ type: 'startpage', id: r, pseudo: i, line: t, col: n }),
                    this._readDeclarations(!0, !0),
                    this.fire({ type: 'endpage', id: r, pseudo: i, line: t, col: n }));
                },
                _margin: function () {
                  var e = this._tokenStream,
                    t,
                    n,
                    r = this._margin_sym();
                  return r ? ((t = e.token().startLine), (n = e.token().startCol), this.fire({ type: 'startpagemargin', margin: r, line: t, col: n }), this._readDeclarations(!0), this.fire({ type: 'endpagemargin', margin: r, line: t, col: n }), !0) : !1;
                },
                _margin_sym: function () {
                  var e = this._tokenStream;
                  return e.match([
                    Tokens.TOPLEFTCORNER_SYM,
                    Tokens.TOPLEFT_SYM,
                    Tokens.TOPCENTER_SYM,
                    Tokens.TOPRIGHT_SYM,
                    Tokens.TOPRIGHTCORNER_SYM,
                    Tokens.BOTTOMLEFTCORNER_SYM,
                    Tokens.BOTTOMLEFT_SYM,
                    Tokens.BOTTOMCENTER_SYM,
                    Tokens.BOTTOMRIGHT_SYM,
                    Tokens.BOTTOMRIGHTCORNER_SYM,
                    Tokens.LEFTTOP_SYM,
                    Tokens.LEFTMIDDLE_SYM,
                    Tokens.LEFTBOTTOM_SYM,
                    Tokens.RIGHTTOP_SYM,
                    Tokens.RIGHTMIDDLE_SYM,
                    Tokens.RIGHTBOTTOM_SYM,
                  ])
                    ? SyntaxUnit.fromToken(e.token())
                    : null;
                },
                _pseudo_page: function () {
                  var e = this._tokenStream;
                  return (e.mustMatch(Tokens.COLON), e.mustMatch(Tokens.IDENT), e.token().value);
                },
                _font_face: function () {
                  var e = this._tokenStream,
                    t,
                    n;
                  (e.mustMatch(Tokens.FONT_FACE_SYM), (t = e.token().startLine), (n = e.token().startCol), this._readWhitespace(), this.fire({ type: 'startfontface', line: t, col: n }), this._readDeclarations(!0), this.fire({ type: 'endfontface', line: t, col: n }));
                },
                _viewport: function () {
                  var e = this._tokenStream,
                    t,
                    n;
                  (e.mustMatch(Tokens.VIEWPORT_SYM), (t = e.token().startLine), (n = e.token().startCol), this._readWhitespace(), this.fire({ type: 'startviewport', line: t, col: n }), this._readDeclarations(!0), this.fire({ type: 'endviewport', line: t, col: n }));
                },
                _operator: function (e) {
                  var t = this._tokenStream,
                    n = null;
                  if (t.match([Tokens.SLASH, Tokens.COMMA]) || (e && t.match([Tokens.PLUS, Tokens.STAR, Tokens.MINUS]))) ((n = t.token()), this._readWhitespace());
                  return n ? PropertyValuePart.fromToken(n) : null;
                },
                _combinator: function () {
                  var e = this._tokenStream,
                    t = null,
                    n;
                  return (e.match([Tokens.PLUS, Tokens.GREATER, Tokens.TILDE]) && ((n = e.token()), (t = new Combinator(n.value, n.startLine, n.startCol)), this._readWhitespace()), t);
                },
                _unary_operator: function () {
                  var e = this._tokenStream;
                  return e.match([Tokens.MINUS, Tokens.PLUS]) ? e.token().value : null;
                },
                _property: function () {
                  var e = this._tokenStream,
                    t = null,
                    n = null,
                    r,
                    i,
                    s,
                    o;
                  return (
                    e.peek() == Tokens.STAR && this.options.starHack && (e.get(), (i = e.token()), (n = i.value), (s = i.startLine), (o = i.startCol)),
                    e.match(Tokens.IDENT) && ((i = e.token()), (r = i.value), r.charAt(0) == '_' && this.options.underscoreHack && ((n = '_'), (r = r.substring(1))), (t = new PropertyName(r, n, s || i.startLine, o || i.startCol)), this._readWhitespace()),
                    t
                  );
                },
                _ruleset: function () {
                  var e = this._tokenStream,
                    t,
                    n;
                  try {
                    n = this._selectors_group();
                  } catch (r) {
                    if (r instanceof SyntaxError && !this.options.strict) {
                      (this.fire({ type: 'error', error: r, message: r.message, line: r.line, col: r.col }), (t = e.advance([Tokens.RBRACE])));
                      if (t != Tokens.RBRACE) throw r;
                      return !0;
                    }
                    throw r;
                  }
                  return (n && (this.fire({ type: 'startrule', selectors: n, line: n[0].line, col: n[0].col }), this._readDeclarations(!0), this.fire({ type: 'endrule', selectors: n, line: n[0].line, col: n[0].col })), n);
                },
                _selectors_group: function () {
                  var e = this._tokenStream,
                    t = [],
                    n;
                  n = this._selector();
                  if (n !== null) {
                    t.push(n);
                    while (e.match(Tokens.COMMA)) (this._readWhitespace(), (n = this._selector()), n !== null ? t.push(n) : this._unexpectedToken(e.LT(1)));
                  }
                  return t.length ? t : null;
                },
                _selector: function () {
                  var e = this._tokenStream,
                    t = [],
                    n = null,
                    r = null,
                    i = null;
                  n = this._simple_selector_sequence();
                  if (n === null) return null;
                  t.push(n);
                  do {
                    r = this._combinator();
                    if (r !== null) (t.push(r), (n = this._simple_selector_sequence()), n === null ? this._unexpectedToken(e.LT(1)) : t.push(n));
                    else {
                      if (!this._readWhitespace()) break;
                      ((i = new Combinator(e.token().value, e.token().startLine, e.token().startCol)), (r = this._combinator()), (n = this._simple_selector_sequence()), n === null ? r !== null && this._unexpectedToken(e.LT(1)) : (r !== null ? t.push(r) : t.push(i), t.push(n)));
                    }
                  } while (!0);
                  return new Selector(t, t[0].line, t[0].col);
                },
                _simple_selector_sequence: function () {
                  var e = this._tokenStream,
                    t = null,
                    n = [],
                    r = '',
                    i = [
                      function () {
                        return e.match(Tokens.HASH) ? new SelectorSubPart(e.token().value, 'id', e.token().startLine, e.token().startCol) : null;
                      },
                      this._class,
                      this._attrib,
                      this._pseudo,
                      this._negation,
                    ],
                    s = 0,
                    o = i.length,
                    u = null,
                    a = !1,
                    f,
                    l;
                  ((f = e.LT(1).startLine), (l = e.LT(1).startCol), (t = this._type_selector()), t || (t = this._universal()), t !== null && (r += t));
                  for (;;) {
                    if (e.peek() === Tokens.S) break;
                    while (s < o && u === null) u = i[s++].call(this);
                    if (u === null) {
                      if (r === '') return null;
                      break;
                    }
                    ((s = 0), n.push(u), (r += u.toString()), (u = null));
                  }
                  return r !== '' ? new SelectorPart(t, n, r, f, l) : null;
                },
                _type_selector: function () {
                  var e = this._tokenStream,
                    t = this._namespace_prefix(),
                    n = this._element_name();
                  return n ? (t && ((n.text = t + n.text), (n.col -= t.length)), n) : (t && (e.unget(), t.length > 1 && e.unget()), null);
                },
                _class: function () {
                  var e = this._tokenStream,
                    t;
                  return e.match(Tokens.DOT) ? (e.mustMatch(Tokens.IDENT), (t = e.token()), new SelectorSubPart('.' + t.value, 'class', t.startLine, t.startCol - 1)) : null;
                },
                _element_name: function () {
                  var e = this._tokenStream,
                    t;
                  return e.match(Tokens.IDENT) ? ((t = e.token()), new SelectorSubPart(t.value, 'elementName', t.startLine, t.startCol)) : null;
                },
                _namespace_prefix: function () {
                  var e = this._tokenStream,
                    t = '';
                  if (e.LA(1) === Tokens.PIPE || e.LA(2) === Tokens.PIPE) (e.match([Tokens.IDENT, Tokens.STAR]) && (t += e.token().value), e.mustMatch(Tokens.PIPE), (t += '|'));
                  return t.length ? t : null;
                },
                _universal: function () {
                  var e = this._tokenStream,
                    t = '',
                    n;
                  return ((n = this._namespace_prefix()), n && (t += n), e.match(Tokens.STAR) && (t += '*'), t.length ? t : null);
                },
                _attrib: function () {
                  var e = this._tokenStream,
                    t = null,
                    n,
                    r;
                  return e.match(Tokens.LBRACKET)
                    ? ((r = e.token()),
                      (t = r.value),
                      (t += this._readWhitespace()),
                      (n = this._namespace_prefix()),
                      n && (t += n),
                      e.mustMatch(Tokens.IDENT),
                      (t += e.token().value),
                      (t += this._readWhitespace()),
                      e.match([Tokens.PREFIXMATCH, Tokens.SUFFIXMATCH, Tokens.SUBSTRINGMATCH, Tokens.EQUALS, Tokens.INCLUDES, Tokens.DASHMATCH]) &&
                        ((t += e.token().value), (t += this._readWhitespace()), e.mustMatch([Tokens.IDENT, Tokens.STRING]), (t += e.token().value), (t += this._readWhitespace())),
                      e.mustMatch(Tokens.RBRACKET),
                      new SelectorSubPart(t + ']', 'attribute', r.startLine, r.startCol))
                    : null;
                },
                _pseudo: function () {
                  var e = this._tokenStream,
                    t = null,
                    n = ':',
                    r,
                    i;
                  return (
                    e.match(Tokens.COLON) &&
                      (e.match(Tokens.COLON) && (n += ':'),
                      e.match(Tokens.IDENT) ? ((t = e.token().value), (r = e.token().startLine), (i = e.token().startCol - n.length)) : e.peek() == Tokens.FUNCTION && ((r = e.LT(1).startLine), (i = e.LT(1).startCol - n.length), (t = this._functional_pseudo())),
                      t && (t = new SelectorSubPart(n + t, 'pseudo', r, i))),
                    t
                  );
                },
                _functional_pseudo: function () {
                  var e = this._tokenStream,
                    t = null;
                  return (e.match(Tokens.FUNCTION) && ((t = e.token().value), (t += this._readWhitespace()), (t += this._expression()), e.mustMatch(Tokens.RPAREN), (t += ')')), t);
                },
                _expression: function () {
                  var e = this._tokenStream,
                    t = '';
                  while (e.match([Tokens.PLUS, Tokens.MINUS, Tokens.DIMENSION, Tokens.NUMBER, Tokens.STRING, Tokens.IDENT, Tokens.LENGTH, Tokens.FREQ, Tokens.ANGLE, Tokens.TIME, Tokens.RESOLUTION, Tokens.SLASH])) ((t += e.token().value), (t += this._readWhitespace()));
                  return t.length ? t : null;
                },
                _negation: function () {
                  var e = this._tokenStream,
                    t,
                    n,
                    r = '',
                    i,
                    s = null;
                  return (
                    e.match(Tokens.NOT) &&
                      ((r = e.token().value),
                      (t = e.token().startLine),
                      (n = e.token().startCol),
                      (r += this._readWhitespace()),
                      (i = this._negation_arg()),
                      (r += i),
                      (r += this._readWhitespace()),
                      e.match(Tokens.RPAREN),
                      (r += e.token().value),
                      (s = new SelectorSubPart(r, 'not', t, n)),
                      s.args.push(i)),
                    s
                  );
                },
                _negation_arg: function () {
                  var e = this._tokenStream,
                    t = [
                      this._type_selector,
                      this._universal,
                      function () {
                        return e.match(Tokens.HASH) ? new SelectorSubPart(e.token().value, 'id', e.token().startLine, e.token().startCol) : null;
                      },
                      this._class,
                      this._attrib,
                      this._pseudo,
                    ],
                    n = null,
                    r = 0,
                    i = t.length,
                    s,
                    o,
                    u,
                    a;
                  ((o = e.LT(1).startLine), (u = e.LT(1).startCol));
                  while (r < i && n === null) ((n = t[r].call(this)), r++);
                  return (n === null && this._unexpectedToken(e.LT(1)), n.type == 'elementName' ? (a = new SelectorPart(n, [], n.toString(), o, u)) : (a = new SelectorPart(null, [n], n.toString(), o, u)), a);
                },
                _declaration: function () {
                  var e = this._tokenStream,
                    t = null,
                    n = null,
                    r = null,
                    i = null,
                    s = null,
                    o = '';
                  t = this._property();
                  if (t !== null) {
                    (e.mustMatch(Tokens.COLON), this._readWhitespace(), (n = this._expr()), (!n || n.length === 0) && this._unexpectedToken(e.LT(1)), (r = this._prio()), (o = t.toString()));
                    if ((this.options.starHack && t.hack == '*') || (this.options.underscoreHack && t.hack == '_')) o = t.text;
                    try {
                      this._validateProperty(o, n);
                    } catch (u) {
                      s = u;
                    }
                    return (this.fire({ type: 'property', property: t, value: n, important: r, line: t.line, col: t.col, invalid: s }), !0);
                  }
                  return !1;
                },
                _prio: function () {
                  var e = this._tokenStream,
                    t = e.match(Tokens.IMPORTANT_SYM);
                  return (this._readWhitespace(), t);
                },
                _expr: function (e) {
                  var t = this._tokenStream,
                    n = [],
                    r = null,
                    i = null;
                  r = this._term(e);
                  if (r !== null) {
                    n.push(r);
                    do {
                      ((i = this._operator(e)), i && n.push(i), (r = this._term(e)));
                      if (r === null) break;
                      n.push(r);
                    } while (!0);
                  }
                  return n.length > 0 ? new PropertyValue(n, n[0].line, n[0].col) : null;
                },
                _term: function (e) {
                  var t = this._tokenStream,
                    n = null,
                    r = null,
                    i = null,
                    s,
                    o,
                    u;
                  return (
                    (n = this._unary_operator()),
                    n !== null && ((o = t.token().startLine), (u = t.token().startCol)),
                    t.peek() == Tokens.IE_FUNCTION && this.options.ieFilters
                      ? ((r = this._ie_function()), n === null && ((o = t.token().startLine), (u = t.token().startCol)))
                      : e && t.match([Tokens.LPAREN, Tokens.LBRACE, Tokens.LBRACKET])
                        ? ((s = t.token()), (i = s.endChar), (r = s.value + this._expr(e).text), n === null && ((o = t.token().startLine), (u = t.token().startCol)), t.mustMatch(Tokens.type(i)), (r += i), this._readWhitespace())
                        : t.match([Tokens.NUMBER, Tokens.PERCENTAGE, Tokens.LENGTH, Tokens.ANGLE, Tokens.TIME, Tokens.FREQ, Tokens.STRING, Tokens.IDENT, Tokens.URI, Tokens.UNICODE_RANGE])
                          ? ((r = t.token().value), n === null && ((o = t.token().startLine), (u = t.token().startCol)), this._readWhitespace())
                          : ((s = this._hexcolor()),
                            s === null ? (n === null && ((o = t.LT(1).startLine), (u = t.LT(1).startCol)), r === null && (t.LA(3) == Tokens.EQUALS && this.options.ieFilters ? (r = this._ie_function()) : (r = this._function()))) : ((r = s.value), n === null && ((o = s.startLine), (u = s.startCol)))),
                    r !== null ? new PropertyValuePart(n !== null ? n + r : r, o, u) : null
                  );
                },
                _function: function () {
                  var e = this._tokenStream,
                    t = null,
                    n = null,
                    r;
                  if (e.match(Tokens.FUNCTION)) {
                    ((t = e.token().value), this._readWhitespace(), (n = this._expr(!0)), (t += n));
                    if (this.options.ieFilters && e.peek() == Tokens.EQUALS)
                      do {
                        (this._readWhitespace() && (t += e.token().value), e.LA(0) == Tokens.COMMA && (t += e.token().value), e.match(Tokens.IDENT), (t += e.token().value), e.match(Tokens.EQUALS), (t += e.token().value), (r = e.peek()));
                        while (r != Tokens.COMMA && r != Tokens.S && r != Tokens.RPAREN) (e.get(), (t += e.token().value), (r = e.peek()));
                      } while (e.match([Tokens.COMMA, Tokens.S]));
                    (e.match(Tokens.RPAREN), (t += ')'), this._readWhitespace());
                  }
                  return t;
                },
                _ie_function: function () {
                  var e = this._tokenStream,
                    t = null,
                    n = null,
                    r;
                  if (e.match([Tokens.IE_FUNCTION, Tokens.FUNCTION])) {
                    t = e.token().value;
                    do {
                      (this._readWhitespace() && (t += e.token().value), e.LA(0) == Tokens.COMMA && (t += e.token().value), e.match(Tokens.IDENT), (t += e.token().value), e.match(Tokens.EQUALS), (t += e.token().value), (r = e.peek()));
                      while (r != Tokens.COMMA && r != Tokens.S && r != Tokens.RPAREN) (e.get(), (t += e.token().value), (r = e.peek()));
                    } while (e.match([Tokens.COMMA, Tokens.S]));
                    (e.match(Tokens.RPAREN), (t += ')'), this._readWhitespace());
                  }
                  return t;
                },
                _hexcolor: function () {
                  var e = this._tokenStream,
                    t = null,
                    n;
                  if (e.match(Tokens.HASH)) {
                    ((t = e.token()), (n = t.value));
                    if (!/#[a-f0-9]{3,6}/i.test(n)) throw new SyntaxError("Expected a hex color but found '" + n + "' at line " + t.startLine + ', col ' + t.startCol + '.', t.startLine, t.startCol);
                    this._readWhitespace();
                  }
                  return t;
                },
                _keyframes: function () {
                  var e = this._tokenStream,
                    t,
                    n,
                    r,
                    i = '';
                  (e.mustMatch(Tokens.KEYFRAMES_SYM),
                    (t = e.token()),
                    /^@\-([^\-]+)\-/.test(t.value) && (i = RegExp.$1),
                    this._readWhitespace(),
                    (r = this._keyframe_name()),
                    this._readWhitespace(),
                    e.mustMatch(Tokens.LBRACE),
                    this.fire({ type: 'startkeyframes', name: r, prefix: i, line: t.startLine, col: t.startCol }),
                    this._readWhitespace(),
                    (n = e.peek()));
                  while (n == Tokens.IDENT || n == Tokens.PERCENTAGE) (this._keyframe_rule(), this._readWhitespace(), (n = e.peek()));
                  (this.fire({ type: 'endkeyframes', name: r, prefix: i, line: t.startLine, col: t.startCol }), this._readWhitespace(), e.mustMatch(Tokens.RBRACE));
                },
                _keyframe_name: function () {
                  var e = this._tokenStream,
                    t;
                  return (e.mustMatch([Tokens.IDENT, Tokens.STRING]), SyntaxUnit.fromToken(e.token()));
                },
                _keyframe_rule: function () {
                  var e = this._tokenStream,
                    t,
                    n = this._key_list();
                  (this.fire({ type: 'startkeyframerule', keys: n, line: n[0].line, col: n[0].col }), this._readDeclarations(!0), this.fire({ type: 'endkeyframerule', keys: n, line: n[0].line, col: n[0].col }));
                },
                _key_list: function () {
                  var e = this._tokenStream,
                    t,
                    n,
                    r = [];
                  (r.push(this._key()), this._readWhitespace());
                  while (e.match(Tokens.COMMA)) (this._readWhitespace(), r.push(this._key()), this._readWhitespace());
                  return r;
                },
                _key: function () {
                  var e = this._tokenStream,
                    t;
                  if (e.match(Tokens.PERCENTAGE)) return SyntaxUnit.fromToken(e.token());
                  if (e.match(Tokens.IDENT)) {
                    t = e.token();
                    if (/from|to/i.test(t.value)) return SyntaxUnit.fromToken(t);
                    e.unget();
                  }
                  this._unexpectedToken(e.LT(1));
                },
                _skipCruft: function () {
                  while (this._tokenStream.match([Tokens.S, Tokens.CDO, Tokens.CDC]));
                },
                _readDeclarations: function (e, t) {
                  var n = this._tokenStream,
                    r;
                  (this._readWhitespace(), e && n.mustMatch(Tokens.LBRACE), this._readWhitespace());
                  try {
                    for (;;) {
                      if (!(n.match(Tokens.SEMICOLON) || (t && this._margin()))) {
                        if (!this._declaration()) break;
                        if (!n.match(Tokens.SEMICOLON)) break;
                      }
                      this._readWhitespace();
                    }
                    (n.mustMatch(Tokens.RBRACE), this._readWhitespace());
                  } catch (i) {
                    if (!(i instanceof SyntaxError && !this.options.strict)) throw i;
                    (this.fire({ type: 'error', error: i, message: i.message, line: i.line, col: i.col }), (r = n.advance([Tokens.SEMICOLON, Tokens.RBRACE])));
                    if (r == Tokens.SEMICOLON) this._readDeclarations(!1, t);
                    else if (r != Tokens.RBRACE) throw i;
                  }
                },
                _readWhitespace: function () {
                  var e = this._tokenStream,
                    t = '';
                  while (e.match(Tokens.S)) t += e.token().value;
                  return t;
                },
                _unexpectedToken: function (e) {
                  throw new SyntaxError("Unexpected token '" + e.value + "' at line " + e.startLine + ', col ' + e.startCol + '.', e.startLine, e.startCol);
                },
                _verifyEnd: function () {
                  this._tokenStream.LA(1) != Tokens.EOF && this._unexpectedToken(this._tokenStream.LT(1));
                },
                _validateProperty: function (e, t) {
                  Validation.validate(e, t);
                },
                parse: function (e) {
                  ((this._tokenStream = new TokenStream(e, Tokens)), this._stylesheet());
                },
                parseStyleSheet: function (e) {
                  return this.parse(e);
                },
                parseMediaQuery: function (e) {
                  this._tokenStream = new TokenStream(e, Tokens);
                  var t = this._media_query();
                  return (this._verifyEnd(), t);
                },
                parsePropertyValue: function (e) {
                  ((this._tokenStream = new TokenStream(e, Tokens)), this._readWhitespace());
                  var t = this._expr();
                  return (this._readWhitespace(), this._verifyEnd(), t);
                },
                parseRule: function (e) {
                  ((this._tokenStream = new TokenStream(e, Tokens)), this._readWhitespace());
                  var t = this._ruleset();
                  return (this._readWhitespace(), this._verifyEnd(), t);
                },
                parseSelector: function (e) {
                  ((this._tokenStream = new TokenStream(e, Tokens)), this._readWhitespace());
                  var t = this._selector();
                  return (this._readWhitespace(), this._verifyEnd(), t);
                },
                parseStyleAttribute: function (e) {
                  ((e += '}'), (this._tokenStream = new TokenStream(e, Tokens)), this._readDeclarations());
                },
              };
            for (t in n) n.hasOwnProperty(t) && (e[t] = n[t]);
            return e;
          })()));
        var Properties = {
          'align-items': 'flex-start | flex-end | center | baseline | stretch',
          'align-content': 'flex-start | flex-end | center | space-between | space-around | stretch',
          'align-self': 'auto | flex-start | flex-end | center | baseline | stretch',
          '-webkit-align-items': 'flex-start | flex-end | center | baseline | stretch',
          '-webkit-align-content': 'flex-start | flex-end | center | space-between | space-around | stretch',
          '-webkit-align-self': 'auto | flex-start | flex-end | center | baseline | stretch',
          'alignment-adjust': 'auto | baseline | before-edge | text-before-edge | middle | central | after-edge | text-after-edge | ideographic | alphabetic | hanging | mathematical | <percentage> | <length>',
          'alignment-baseline': 'baseline | use-script | before-edge | text-before-edge | after-edge | text-after-edge | central | middle | ideographic | alphabetic | hanging | mathematical',
          animation: 1,
          'animation-delay': { multi: '<time>', comma: !0 },
          'animation-direction': { multi: 'normal | reverse | alternate | alternate-reverse', comma: !0 },
          'animation-duration': { multi: '<time>', comma: !0 },
          'animation-fill-mode': { multi: 'none | forwards | backwards | both', comma: !0 },
          'animation-iteration-count': { multi: '<number> | infinite', comma: !0 },
          'animation-name': { multi: 'none | <ident>', comma: !0 },
          'animation-play-state': { multi: 'running | paused', comma: !0 },
          'animation-timing-function': 1,
          '-moz-animation-delay': { multi: '<time>', comma: !0 },
          '-moz-animation-direction': { multi: 'normal | reverse | alternate | alternate-reverse', comma: !0 },
          '-moz-animation-duration': { multi: '<time>', comma: !0 },
          '-moz-animation-iteration-count': { multi: '<number> | infinite', comma: !0 },
          '-moz-animation-name': { multi: 'none | <ident>', comma: !0 },
          '-moz-animation-play-state': { multi: 'running | paused', comma: !0 },
          '-ms-animation-delay': { multi: '<time>', comma: !0 },
          '-ms-animation-direction': { multi: 'normal | reverse | alternate | alternate-reverse', comma: !0 },
          '-ms-animation-duration': { multi: '<time>', comma: !0 },
          '-ms-animation-iteration-count': { multi: '<number> | infinite', comma: !0 },
          '-ms-animation-name': { multi: 'none | <ident>', comma: !0 },
          '-ms-animation-play-state': { multi: 'running | paused', comma: !0 },
          '-webkit-animation-delay': { multi: '<time>', comma: !0 },
          '-webkit-animation-direction': { multi: 'normal | reverse | alternate | alternate-reverse', comma: !0 },
          '-webkit-animation-duration': { multi: '<time>', comma: !0 },
          '-webkit-animation-fill-mode': { multi: 'none | forwards | backwards | both', comma: !0 },
          '-webkit-animation-iteration-count': { multi: '<number> | infinite', comma: !0 },
          '-webkit-animation-name': { multi: 'none | <ident>', comma: !0 },
          '-webkit-animation-play-state': { multi: 'running | paused', comma: !0 },
          '-o-animation-delay': { multi: '<time>', comma: !0 },
          '-o-animation-direction': { multi: 'normal | reverse | alternate | alternate-reverse', comma: !0 },
          '-o-animation-duration': { multi: '<time>', comma: !0 },
          '-o-animation-iteration-count': { multi: '<number> | infinite', comma: !0 },
          '-o-animation-name': { multi: 'none | <ident>', comma: !0 },
          '-o-animation-play-state': { multi: 'running | paused', comma: !0 },
          appearance:
            'icon | window | desktop | workspace | document | tooltip | dialog | button | push-button | hyperlink | radio-button | checkbox | menu-item | tab | menu | menubar | pull-down-menu | pop-up-menu | list-menu | radio-group | checkbox-group | outline-tree | range | field | combo-box | signature | password | normal | none | inherit',
          azimuth: function (e) {
            var t = '<angle> | leftwards | rightwards | inherit',
              n = 'left-side | far-left | left | center-left | center | center-right | right | far-right | right-side',
              r = !1,
              i = !1,
              s;
            ValidationTypes.isAny(e, t) || (ValidationTypes.isAny(e, 'behind') && ((r = !0), (i = !0)), ValidationTypes.isAny(e, n) && ((i = !0), r || ValidationTypes.isAny(e, 'behind')));
            if (e.hasNext()) throw ((s = e.next()), i ? new ValidationError("Expected end of value but found '" + s + "'.", s.line, s.col) : new ValidationError("Expected (<'azimuth'>) but found '" + s + "'.", s.line, s.col));
          },
          'backface-visibility': 'visible | hidden',
          background: 1,
          'background-attachment': { multi: '<attachment>', comma: !0 },
          'background-clip': { multi: '<box>', comma: !0 },
          'background-color': '<color> | inherit',
          'background-image': { multi: '<bg-image>', comma: !0 },
          'background-origin': { multi: '<box>', comma: !0 },
          'background-position': { multi: '<bg-position>', comma: !0 },
          'background-repeat': { multi: '<repeat-style>' },
          'background-size': { multi: '<bg-size>', comma: !0 },
          'baseline-shift': 'baseline | sub | super | <percentage> | <length>',
          behavior: 1,
          binding: 1,
          bleed: '<length>',
          'bookmark-label': '<content> | <attr> | <string>',
          'bookmark-level': 'none | <integer>',
          'bookmark-state': 'open | closed',
          'bookmark-target': 'none | <uri> | <attr>',
          border: '<border-width> || <border-style> || <color>',
          'border-bottom': '<border-width> || <border-style> || <color>',
          'border-bottom-color': '<color> | inherit',
          'border-bottom-left-radius': '<x-one-radius>',
          'border-bottom-right-radius': '<x-one-radius>',
          'border-bottom-style': '<border-style>',
          'border-bottom-width': '<border-width>',
          'border-collapse': 'collapse | separate | inherit',
          'border-color': { multi: '<color> | inherit', max: 4 },
          'border-image': 1,
          'border-image-outset': { multi: '<length> | <number>', max: 4 },
          'border-image-repeat': { multi: 'stretch | repeat | round', max: 2 },
          'border-image-slice': function (e) {
            var t = !1,
              n = '<number> | <percentage>',
              r = !1,
              i = 0,
              s = 4,
              o;
            ValidationTypes.isAny(e, 'fill') && ((r = !0), (t = !0));
            while (e.hasNext() && i < s) {
              t = ValidationTypes.isAny(e, n);
              if (!t) break;
              i++;
            }
            r ? (t = !0) : ValidationTypes.isAny(e, 'fill');
            if (e.hasNext()) throw ((o = e.next()), t ? new ValidationError("Expected end of value but found '" + o + "'.", o.line, o.col) : new ValidationError("Expected ([<number> | <percentage>]{1,4} && fill?) but found '" + o + "'.", o.line, o.col));
          },
          'border-image-source': '<image> | none',
          'border-image-width': { multi: '<length> | <percentage> | <number> | auto', max: 4 },
          'border-left': '<border-width> || <border-style> || <color>',
          'border-left-color': '<color> | inherit',
          'border-left-style': '<border-style>',
          'border-left-width': '<border-width>',
          'border-radius': function (e) {
            var t = !1,
              n = '<length> | <percentage> | inherit',
              r = !1,
              i = !1,
              s = 0,
              o = 8,
              u;
            while (e.hasNext() && s < o) {
              t = ValidationTypes.isAny(e, n);
              if (!t) {
                if (!(e.peek() == '/' && s > 0 && !r)) break;
                ((r = !0), (o = s + 5), e.next());
              }
              s++;
            }
            if (e.hasNext()) throw ((u = e.next()), t ? new ValidationError("Expected end of value but found '" + u + "'.", u.line, u.col) : new ValidationError("Expected (<'border-radius'>) but found '" + u + "'.", u.line, u.col));
          },
          'border-right': '<border-width> || <border-style> || <color>',
          'border-right-color': '<color> | inherit',
          'border-right-style': '<border-style>',
          'border-right-width': '<border-width>',
          'border-spacing': { multi: '<length> | inherit', max: 2 },
          'border-style': { multi: '<border-style>', max: 4 },
          'border-top': '<border-width> || <border-style> || <color>',
          'border-top-color': '<color> | inherit',
          'border-top-left-radius': '<x-one-radius>',
          'border-top-right-radius': '<x-one-radius>',
          'border-top-style': '<border-style>',
          'border-top-width': '<border-width>',
          'border-width': { multi: '<border-width>', max: 4 },
          bottom: '<margin-width> | inherit',
          '-moz-box-align': 'start | end | center | baseline | stretch',
          '-moz-box-decoration-break': 'slice |clone',
          '-moz-box-direction': 'normal | reverse | inherit',
          '-moz-box-flex': '<number>',
          '-moz-box-flex-group': '<integer>',
          '-moz-box-lines': 'single | multiple',
          '-moz-box-ordinal-group': '<integer>',
          '-moz-box-orient': 'horizontal | vertical | inline-axis | block-axis | inherit',
          '-moz-box-pack': 'start | end | center | justify',
          '-webkit-box-align': 'start | end | center | baseline | stretch',
          '-webkit-box-decoration-break': 'slice |clone',
          '-webkit-box-direction': 'normal | reverse | inherit',
          '-webkit-box-flex': '<number>',
          '-webkit-box-flex-group': '<integer>',
          '-webkit-box-lines': 'single | multiple',
          '-webkit-box-ordinal-group': '<integer>',
          '-webkit-box-orient': 'horizontal | vertical | inline-axis | block-axis | inherit',
          '-webkit-box-pack': 'start | end | center | justify',
          'box-shadow': function (e) {
            var t = !1,
              n;
            if (!ValidationTypes.isAny(e, 'none')) Validation.multiProperty('<shadow>', e, !0, Infinity);
            else if (e.hasNext()) throw ((n = e.next()), new ValidationError("Expected end of value but found '" + n + "'.", n.line, n.col));
          },
          'box-sizing': 'content-box | border-box | inherit',
          'break-after': 'auto | always | avoid | left | right | page | column | avoid-page | avoid-column',
          'break-before': 'auto | always | avoid | left | right | page | column | avoid-page | avoid-column',
          'break-inside': 'auto | avoid | avoid-page | avoid-column',
          'caption-side': 'top | bottom | inherit',
          clear: 'none | right | left | both | inherit',
          clip: 1,
          color: '<color> | inherit',
          'color-profile': 1,
          'column-count': '<integer> | auto',
          'column-fill': 'auto | balance',
          'column-gap': '<length> | normal',
          'column-rule': '<border-width> || <border-style> || <color>',
          'column-rule-color': '<color>',
          'column-rule-style': '<border-style>',
          'column-rule-width': '<border-width>',
          'column-span': 'none | all',
          'column-width': '<length> | auto',
          columns: 1,
          content: 1,
          'counter-increment': 1,
          'counter-reset': 1,
          crop: '<shape> | auto',
          cue: 'cue-after | cue-before | inherit',
          'cue-after': 1,
          'cue-before': 1,
          cursor: 1,
          direction: 'ltr | rtl | inherit',
          display:
            'inline | block | list-item | inline-block | table | inline-table | table-row-group | table-header-group | table-footer-group | table-row | table-column-group | table-column | table-cell | table-caption | grid | inline-grid | none | inherit | -moz-box | -moz-inline-block | -moz-inline-box | -moz-inline-grid | -moz-inline-stack | -moz-inline-table | -moz-grid | -moz-grid-group | -moz-grid-line | -moz-groupbox | -moz-deck | -moz-popup | -moz-stack | -moz-marker | -webkit-box | -webkit-inline-box | -ms-flexbox | -ms-inline-flexbox | flex | -webkit-flex | inline-flex | -webkit-inline-flex',
          'dominant-baseline': 1,
          'drop-initial-after-adjust': 'central | middle | after-edge | text-after-edge | ideographic | alphabetic | mathematical | <percentage> | <length>',
          'drop-initial-after-align': 'baseline | use-script | before-edge | text-before-edge | after-edge | text-after-edge | central | middle | ideographic | alphabetic | hanging | mathematical',
          'drop-initial-before-adjust': 'before-edge | text-before-edge | central | middle | hanging | mathematical | <percentage> | <length>',
          'drop-initial-before-align': 'caps-height | baseline | use-script | before-edge | text-before-edge | after-edge | text-after-edge | central | middle | ideographic | alphabetic | hanging | mathematical',
          'drop-initial-size': 'auto | line | <length> | <percentage>',
          'drop-initial-value': 'initial | <integer>',
          elevation: '<angle> | below | level | above | higher | lower | inherit',
          'empty-cells': 'show | hide | inherit',
          filter: 1,
          fit: 'fill | hidden | meet | slice',
          'fit-position': 1,
          flex: '<flex>',
          'flex-basis': '<width>',
          'flex-direction': 'row | row-reverse | column | column-reverse',
          'flex-flow': '<flex-direction> || <flex-wrap>',
          'flex-grow': '<number>',
          'flex-shrink': '<number>',
          'flex-wrap': 'nowrap | wrap | wrap-reverse',
          '-webkit-flex': '<flex>',
          '-webkit-flex-basis': '<width>',
          '-webkit-flex-direction': 'row | row-reverse | column | column-reverse',
          '-webkit-flex-flow': '<flex-direction> || <flex-wrap>',
          '-webkit-flex-grow': '<number>',
          '-webkit-flex-shrink': '<number>',
          '-webkit-flex-wrap': 'nowrap | wrap | wrap-reverse',
          '-ms-flex': '<flex>',
          '-ms-flex-align': 'start | end | center | stretch | baseline',
          '-ms-flex-direction': 'row | row-reverse | column | column-reverse | inherit',
          '-ms-flex-order': '<number>',
          '-ms-flex-pack': 'start | end | center | justify',
          '-ms-flex-wrap': 'nowrap | wrap | wrap-reverse',
          float: 'left | right | none | inherit',
          'float-offset': 1,
          font: 1,
          'font-family': 1,
          'font-size': '<absolute-size> | <relative-size> | <length> | <percentage> | inherit',
          'font-size-adjust': '<number> | none | inherit',
          'font-stretch': 'normal | ultra-condensed | extra-condensed | condensed | semi-condensed | semi-expanded | expanded | extra-expanded | ultra-expanded | inherit',
          'font-style': 'normal | italic | oblique | inherit',
          'font-variant': 'normal | small-caps | inherit',
          'font-weight': 'normal | bold | bolder | lighter | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900 | inherit',
          'grid-cell-stacking': 'columns | rows | layer',
          'grid-column': 1,
          'grid-columns': 1,
          'grid-column-align': 'start | end | center | stretch',
          'grid-column-sizing': 1,
          'grid-column-span': '<integer>',
          'grid-flow': 'none | rows | columns',
          'grid-layer': '<integer>',
          'grid-row': 1,
          'grid-rows': 1,
          'grid-row-align': 'start | end | center | stretch',
          'grid-row-span': '<integer>',
          'grid-row-sizing': 1,
          'hanging-punctuation': 1,
          height: '<margin-width> | <content-sizing> | inherit',
          'hyphenate-after': '<integer> | auto',
          'hyphenate-before': '<integer> | auto',
          'hyphenate-character': '<string> | auto',
          'hyphenate-lines': 'no-limit | <integer>',
          'hyphenate-resource': 1,
          hyphens: 'none | manual | auto',
          icon: 1,
          'image-orientation': 'angle | auto',
          'image-rendering': 1,
          'image-resolution': 1,
          'inline-box-align': 'initial | last | <integer>',
          'justify-content': 'flex-start | flex-end | center | space-between | space-around',
          '-webkit-justify-content': 'flex-start | flex-end | center | space-between | space-around',
          left: '<margin-width> | inherit',
          'letter-spacing': '<length> | normal | inherit',
          'line-height': '<number> | <length> | <percentage> | normal | inherit',
          'line-break': 'auto | loose | normal | strict',
          'line-stacking': 1,
          'line-stacking-ruby': 'exclude-ruby | include-ruby',
          'line-stacking-shift': 'consider-shifts | disregard-shifts',
          'line-stacking-strategy': 'inline-line-height | block-line-height | max-height | grid-height',
          'list-style': 1,
          'list-style-image': '<uri> | none | inherit',
          'list-style-position': 'inside | outside | inherit',
          'list-style-type': 'disc | circle | square | decimal | decimal-leading-zero | lower-roman | upper-roman | lower-greek | lower-latin | upper-latin | armenian | georgian | lower-alpha | upper-alpha | none | inherit',
          margin: { multi: '<margin-width> | inherit', max: 4 },
          'margin-bottom': '<margin-width> | inherit',
          'margin-left': '<margin-width> | inherit',
          'margin-right': '<margin-width> | inherit',
          'margin-top': '<margin-width> | inherit',
          mark: 1,
          'mark-after': 1,
          'mark-before': 1,
          marks: 1,
          'marquee-direction': 1,
          'marquee-play-count': 1,
          'marquee-speed': 1,
          'marquee-style': 1,
          'max-height': '<length> | <percentage> | <content-sizing> | none | inherit',
          'max-width': '<length> | <percentage> | <content-sizing> | none | inherit',
          'min-height': '<length> | <percentage> | <content-sizing> | contain-floats | -moz-contain-floats | -webkit-contain-floats | inherit',
          'min-width': '<length> | <percentage> | <content-sizing> | contain-floats | -moz-contain-floats | -webkit-contain-floats | inherit',
          'move-to': 1,
          'nav-down': 1,
          'nav-index': 1,
          'nav-left': 1,
          'nav-right': 1,
          'nav-up': 1,
          opacity: '<number> | inherit',
          order: '<integer>',
          '-webkit-order': '<integer>',
          orphans: '<integer> | inherit',
          outline: 1,
          'outline-color': '<color> | invert | inherit',
          'outline-offset': 1,
          'outline-style': '<border-style> | inherit',
          'outline-width': '<border-width> | inherit',
          overflow: 'visible | hidden | scroll | auto | inherit',
          'overflow-style': 1,
          'overflow-wrap': 'normal | break-word',
          'overflow-x': 1,
          'overflow-y': 1,
          padding: { multi: '<padding-width> | inherit', max: 4 },
          'padding-bottom': '<padding-width> | inherit',
          'padding-left': '<padding-width> | inherit',
          'padding-right': '<padding-width> | inherit',
          'padding-top': '<padding-width> | inherit',
          page: 1,
          'page-break-after': 'auto | always | avoid | left | right | inherit',
          'page-break-before': 'auto | always | avoid | left | right | inherit',
          'page-break-inside': 'auto | avoid | inherit',
          'page-policy': 1,
          pause: 1,
          'pause-after': 1,
          'pause-before': 1,
          perspective: 1,
          'perspective-origin': 1,
          phonemes: 1,
          pitch: 1,
          'pitch-range': 1,
          'play-during': 1,
          'pointer-events': 'auto | none | visiblePainted | visibleFill | visibleStroke | visible | painted | fill | stroke | all | inherit',
          position: 'static | relative | absolute | fixed | inherit',
          'presentation-level': 1,
          'punctuation-trim': 1,
          quotes: 1,
          'rendering-intent': 1,
          resize: 1,
          rest: 1,
          'rest-after': 1,
          'rest-before': 1,
          richness: 1,
          right: '<margin-width> | inherit',
          rotation: 1,
          'rotation-point': 1,
          'ruby-align': 1,
          'ruby-overhang': 1,
          'ruby-position': 1,
          'ruby-span': 1,
          size: 1,
          speak: 'normal | none | spell-out | inherit',
          'speak-header': 'once | always | inherit',
          'speak-numeral': 'digits | continuous | inherit',
          'speak-punctuation': 'code | none | inherit',
          'speech-rate': 1,
          src: 1,
          stress: 1,
          'string-set': 1,
          'table-layout': 'auto | fixed | inherit',
          'tab-size': '<integer> | <length>',
          target: 1,
          'target-name': 1,
          'target-new': 1,
          'target-position': 1,
          'text-align': 'left | right | center | justify | inherit',
          'text-align-last': 1,
          'text-decoration': 1,
          'text-emphasis': 1,
          'text-height': 1,
          'text-indent': '<length> | <percentage> | inherit',
          'text-justify': 'auto | none | inter-word | inter-ideograph | inter-cluster | distribute | kashida',
          'text-outline': 1,
          'text-overflow': 1,
          'text-rendering': 'auto | optimizeSpeed | optimizeLegibility | geometricPrecision | inherit',
          'text-shadow': 1,
          'text-transform': 'capitalize | uppercase | lowercase | none | inherit',
          'text-wrap': 'normal | none | avoid',
          top: '<margin-width> | inherit',
          '-ms-touch-action': 'auto | none | pan-x | pan-y',
          'touch-action': 'auto | none | pan-x | pan-y',
          transform: 1,
          'transform-origin': 1,
          'transform-style': 1,
          transition: 1,
          'transition-delay': 1,
          'transition-duration': 1,
          'transition-property': 1,
          'transition-timing-function': 1,
          'unicode-bidi': 'normal | embed | isolate | bidi-override | isolate-override | plaintext | inherit',
          'user-modify': 'read-only | read-write | write-only | inherit',
          'user-select': 'none | text | toggle | element | elements | all | inherit',
          'vertical-align': 'auto | use-script | baseline | sub | super | top | text-top | central | middle | bottom | text-bottom | <percentage> | <length>',
          visibility: 'visible | hidden | collapse | inherit',
          'voice-balance': 1,
          'voice-duration': 1,
          'voice-family': 1,
          'voice-pitch': 1,
          'voice-pitch-range': 1,
          'voice-rate': 1,
          'voice-stress': 1,
          'voice-volume': 1,
          volume: 1,
          'white-space': 'normal | pre | nowrap | pre-wrap | pre-line | inherit | -pre-wrap | -o-pre-wrap | -moz-pre-wrap | -hp-pre-wrap',
          'white-space-collapse': 1,
          widows: '<integer> | inherit',
          width: '<length> | <percentage> | <content-sizing> | auto | inherit',
          'word-break': 'normal | keep-all | break-all',
          'word-spacing': '<length> | normal | inherit',
          'word-wrap': 'normal | break-word',
          'writing-mode': 'horizontal-tb | vertical-rl | vertical-lr | lr-tb | rl-tb | tb-rl | bt-rl | tb-lr | bt-lr | lr-bt | rl-bt | lr | rl | tb | inherit',
          'z-index': '<integer> | auto | inherit',
          zoom: '<number> | <percentage> | normal',
        };
        ((PropertyName.prototype = new SyntaxUnit()),
          (PropertyName.prototype.constructor = PropertyName),
          (PropertyName.prototype.toString = function () {
            return (this.hack ? this.hack : '') + this.text;
          }),
          (PropertyValue.prototype = new SyntaxUnit()),
          (PropertyValue.prototype.constructor = PropertyValue),
          (PropertyValueIterator.prototype.count = function () {
            return this._parts.length;
          }),
          (PropertyValueIterator.prototype.isFirst = function () {
            return this._i === 0;
          }),
          (PropertyValueIterator.prototype.hasNext = function () {
            return this._i < this._parts.length;
          }),
          (PropertyValueIterator.prototype.mark = function () {
            this._marks.push(this._i);
          }),
          (PropertyValueIterator.prototype.peek = function (e) {
            return this.hasNext() ? this._parts[this._i + (e || 0)] : null;
          }),
          (PropertyValueIterator.prototype.next = function () {
            return this.hasNext() ? this._parts[this._i++] : null;
          }),
          (PropertyValueIterator.prototype.previous = function () {
            return this._i > 0 ? this._parts[--this._i] : null;
          }),
          (PropertyValueIterator.prototype.restore = function () {
            this._marks.length && (this._i = this._marks.pop());
          }),
          (PropertyValuePart.prototype = new SyntaxUnit()),
          (PropertyValuePart.prototype.constructor = PropertyValuePart),
          (PropertyValuePart.fromToken = function (e) {
            return new PropertyValuePart(e.value, e.startLine, e.startCol);
          }));
        var Pseudos = { ':first-letter': 1, ':first-line': 1, ':before': 1, ':after': 1 };
        ((Pseudos.ELEMENT = 1),
          (Pseudos.CLASS = 2),
          (Pseudos.isElement = function (e) {
            return e.indexOf('::') === 0 || Pseudos[e.toLowerCase()] == Pseudos.ELEMENT;
          }),
          (Selector.prototype = new SyntaxUnit()),
          (Selector.prototype.constructor = Selector),
          (SelectorPart.prototype = new SyntaxUnit()),
          (SelectorPart.prototype.constructor = SelectorPart),
          (SelectorSubPart.prototype = new SyntaxUnit()),
          (SelectorSubPart.prototype.constructor = SelectorSubPart),
          (Specificity.prototype = {
            constructor: Specificity,
            compare: function (e) {
              var t = ['a', 'b', 'c', 'd'],
                n,
                r;
              for (n = 0, r = t.length; n < r; n++) {
                if (this[t[n]] < e[t[n]]) return -1;
                if (this[t[n]] > e[t[n]]) return 1;
              }
              return 0;
            },
            valueOf: function () {
              return this.a * 1e3 + this.b * 100 + this.c * 10 + this.d;
            },
            toString: function () {
              return this.a + ',' + this.b + ',' + this.c + ',' + this.d;
            },
          }),
          (Specificity.calculate = function (e) {
            function u(e) {
              var t,
                n,
                r,
                a,
                f = e.elementName ? e.elementName.text : '',
                l;
              f && f.charAt(f.length - 1) != '*' && o++;
              for (t = 0, r = e.modifiers.length; t < r; t++) {
                l = e.modifiers[t];
                switch (l.type) {
                  case 'class':
                  case 'attribute':
                    s++;
                    break;
                  case 'id':
                    i++;
                    break;
                  case 'pseudo':
                    Pseudos.isElement(l.text) ? o++ : s++;
                    break;
                  case 'not':
                    for (n = 0, a = l.args.length; n < a; n++) u(l.args[n]);
                }
              }
            }
            var t,
              n,
              r,
              i = 0,
              s = 0,
              o = 0;
            for (t = 0, n = e.parts.length; t < n; t++) ((r = e.parts[t]), r instanceof SelectorPart && u(r));
            return new Specificity(0, i, s, o);
          }));
        var h = /^[0-9a-fA-F]$/,
          nonascii = /^[\u0080-\uFFFF]$/,
          nl = /\n|\r\n|\r|\f/;
        TokenStream.prototype = mix(new TokenStreamBase(), {
          _getToken: function (e) {
            var t,
              n = this._reader,
              r = null,
              i = n.getLine(),
              s = n.getCol();
            t = n.read();
            while (t) {
              switch (t) {
                case '/':
                  n.peek() == '*' ? (r = this.commentToken(t, i, s)) : (r = this.charToken(t, i, s));
                  break;
                case '|':
                case '~':
                case '^':
                case '$':
                case '*':
                  n.peek() == '=' ? (r = this.comparisonToken(t, i, s)) : (r = this.charToken(t, i, s));
                  break;
                case '"':
                case "'":
                  r = this.stringToken(t, i, s);
                  break;
                case '#':
                  isNameChar(n.peek()) ? (r = this.hashToken(t, i, s)) : (r = this.charToken(t, i, s));
                  break;
                case '.':
                  isDigit(n.peek()) ? (r = this.numberToken(t, i, s)) : (r = this.charToken(t, i, s));
                  break;
                case '-':
                  n.peek() == '-' ? (r = this.htmlCommentEndToken(t, i, s)) : isNameStart(n.peek()) ? (r = this.identOrFunctionToken(t, i, s)) : (r = this.charToken(t, i, s));
                  break;
                case '!':
                  r = this.importantToken(t, i, s);
                  break;
                case '@':
                  r = this.atRuleToken(t, i, s);
                  break;
                case ':':
                  r = this.notToken(t, i, s);
                  break;
                case '<':
                  r = this.htmlCommentStartToken(t, i, s);
                  break;
                case 'U':
                case 'u':
                  if (n.peek() == '+') {
                    r = this.unicodeRangeToken(t, i, s);
                    break;
                  }
                default:
                  isDigit(t) ? (r = this.numberToken(t, i, s)) : isWhitespace(t) ? (r = this.whitespaceToken(t, i, s)) : isIdentStart(t) ? (r = this.identOrFunctionToken(t, i, s)) : (r = this.charToken(t, i, s));
              }
              break;
            }
            return (!r && t === null && (r = this.createToken(Tokens.EOF, null, i, s)), r);
          },
          createToken: function (e, t, n, r, i) {
            var s = this._reader;
            return ((i = i || {}), { value: t, type: e, channel: i.channel, endChar: i.endChar, hide: i.hide || !1, startLine: n, startCol: r, endLine: s.getLine(), endCol: s.getCol() });
          },
          atRuleToken: function (e, t, n) {
            var r = e,
              i = this._reader,
              s = Tokens.CHAR,
              o = !1,
              u,
              a;
            (i.mark(), (u = this.readName()), (r = e + u), (s = Tokens.type(r.toLowerCase())));
            if (s == Tokens.CHAR || s == Tokens.UNKNOWN) r.length > 1 ? (s = Tokens.UNKNOWN_SYM) : ((s = Tokens.CHAR), (r = e), i.reset());
            return this.createToken(s, r, t, n);
          },
          charToken: function (e, t, n) {
            var r = Tokens.type(e),
              i = {};
            return (r == -1 ? (r = Tokens.CHAR) : (i.endChar = Tokens[r].endChar), this.createToken(r, e, t, n, i));
          },
          commentToken: function (e, t, n) {
            var r = this._reader,
              i = this.readComment(e);
            return this.createToken(Tokens.COMMENT, i, t, n);
          },
          comparisonToken: function (e, t, n) {
            var r = this._reader,
              i = e + r.read(),
              s = Tokens.type(i) || Tokens.CHAR;
            return this.createToken(s, i, t, n);
          },
          hashToken: function (e, t, n) {
            var r = this._reader,
              i = this.readName(e);
            return this.createToken(Tokens.HASH, i, t, n);
          },
          htmlCommentStartToken: function (e, t, n) {
            var r = this._reader,
              i = e;
            return (r.mark(), (i += r.readCount(3)), i == '<!--' ? this.createToken(Tokens.CDO, i, t, n) : (r.reset(), this.charToken(e, t, n)));
          },
          htmlCommentEndToken: function (e, t, n) {
            var r = this._reader,
              i = e;
            return (r.mark(), (i += r.readCount(2)), i == '-->' ? this.createToken(Tokens.CDC, i, t, n) : (r.reset(), this.charToken(e, t, n)));
          },
          identOrFunctionToken: function (e, t, n) {
            var r = this._reader,
              i = this.readName(e),
              s = Tokens.IDENT;
            return (
              r.peek() == '(' ? ((i += r.read()), i.toLowerCase() == 'url(' ? ((s = Tokens.URI), (i = this.readURI(i)), i.toLowerCase() == 'url(' && (s = Tokens.FUNCTION)) : (s = Tokens.FUNCTION)) : r.peek() == ':' && i.toLowerCase() == 'progid' && ((i += r.readTo('(')), (s = Tokens.IE_FUNCTION)),
              this.createToken(s, i, t, n)
            );
          },
          importantToken: function (e, t, n) {
            var r = this._reader,
              i = e,
              s = Tokens.CHAR,
              o,
              u;
            (r.mark(), (u = r.read()));
            while (u) {
              if (u == '/') {
                if (r.peek() != '*') break;
                o = this.readComment(u);
                if (o === '') break;
              } else {
                if (!isWhitespace(u)) {
                  if (/i/i.test(u)) {
                    ((o = r.readCount(8)), /mportant/i.test(o) && ((i += u + o), (s = Tokens.IMPORTANT_SYM)));
                    break;
                  }
                  break;
                }
                i += u + this.readWhitespace();
              }
              u = r.read();
            }
            return s == Tokens.CHAR ? (r.reset(), this.charToken(e, t, n)) : this.createToken(s, i, t, n);
          },
          notToken: function (e, t, n) {
            var r = this._reader,
              i = e;
            return (r.mark(), (i += r.readCount(4)), i.toLowerCase() == ':not(' ? this.createToken(Tokens.NOT, i, t, n) : (r.reset(), this.charToken(e, t, n)));
          },
          numberToken: function (e, t, n) {
            var r = this._reader,
              i = this.readNumber(e),
              s,
              o = Tokens.NUMBER,
              u = r.peek();
            return (
              isIdentStart(u)
                ? ((s = this.readName(r.read())),
                  (i += s),
                  /^em$|^ex$|^px$|^gd$|^rem$|^vw$|^vh$|^vmax$|^vmin$|^ch$|^cm$|^mm$|^in$|^pt$|^pc$/i.test(s)
                    ? (o = Tokens.LENGTH)
                    : /^deg|^rad$|^grad$/i.test(s)
                      ? (o = Tokens.ANGLE)
                      : /^ms$|^s$/i.test(s)
                        ? (o = Tokens.TIME)
                        : /^hz$|^khz$/i.test(s)
                          ? (o = Tokens.FREQ)
                          : /^dpi$|^dpcm$/i.test(s)
                            ? (o = Tokens.RESOLUTION)
                            : (o = Tokens.DIMENSION))
                : u == '%' && ((i += r.read()), (o = Tokens.PERCENTAGE)),
              this.createToken(o, i, t, n)
            );
          },
          stringToken: function (e, t, n) {
            var r = e,
              i = e,
              s = this._reader,
              o = e,
              u = Tokens.STRING,
              a = s.read();
            while (a) {
              i += a;
              if (a == r && o != '\\') break;
              if (isNewLine(s.peek()) && a != '\\') {
                u = Tokens.INVALID;
                break;
              }
              ((o = a), (a = s.read()));
            }
            return (a === null && (u = Tokens.INVALID), this.createToken(u, i, t, n));
          },
          unicodeRangeToken: function (e, t, n) {
            var r = this._reader,
              i = e,
              s,
              o = Tokens.CHAR;
            return (
              r.peek() == '+' &&
                (r.mark(), (i += r.read()), (i += this.readUnicodeRangePart(!0)), i.length == 2 ? r.reset() : ((o = Tokens.UNICODE_RANGE), i.indexOf('?') == -1 && r.peek() == '-' && (r.mark(), (s = r.read()), (s += this.readUnicodeRangePart(!1)), s.length == 1 ? r.reset() : (i += s)))),
              this.createToken(o, i, t, n)
            );
          },
          whitespaceToken: function (e, t, n) {
            var r = this._reader,
              i = e + this.readWhitespace();
            return this.createToken(Tokens.S, i, t, n);
          },
          readUnicodeRangePart: function (e) {
            var t = this._reader,
              n = '',
              r = t.peek();
            while (isHexDigit(r) && n.length < 6) (t.read(), (n += r), (r = t.peek()));
            if (e) while (r == '?' && n.length < 6) (t.read(), (n += r), (r = t.peek()));
            return n;
          },
          readWhitespace: function () {
            var e = this._reader,
              t = '',
              n = e.peek();
            while (isWhitespace(n)) (e.read(), (t += n), (n = e.peek()));
            return t;
          },
          readNumber: function (e) {
            var t = this._reader,
              n = e,
              r = e == '.',
              i = t.peek();
            while (i) {
              if (isDigit(i)) n += t.read();
              else {
                if (i != '.') break;
                if (r) break;
                ((r = !0), (n += t.read()));
              }
              i = t.peek();
            }
            return n;
          },
          readString: function () {
            var e = this._reader,
              t = e.read(),
              n = t,
              r = t,
              i = e.peek();
            while (i) {
              ((i = e.read()), (n += i));
              if (i == t && r != '\\') break;
              if (isNewLine(e.peek()) && i != '\\') {
                n = '';
                break;
              }
              ((r = i), (i = e.peek()));
            }
            return (i === null && (n = ''), n);
          },
          readURI: function (e) {
            var t = this._reader,
              n = e,
              r = '',
              i = t.peek();
            t.mark();
            while (i && isWhitespace(i)) (t.read(), (i = t.peek()));
            (i == "'" || i == '"' ? (r = this.readString()) : (r = this.readURL()), (i = t.peek()));
            while (i && isWhitespace(i)) (t.read(), (i = t.peek()));
            return (r === '' || i != ')' ? ((n = e), t.reset()) : (n += r + t.read()), n);
          },
          readURL: function () {
            var e = this._reader,
              t = '',
              n = e.peek();
            while (/^[!#$%&\\*-~]$/.test(n)) ((t += e.read()), (n = e.peek()));
            return t;
          },
          readName: function (e) {
            var t = this._reader,
              n = e || '',
              r = t.peek();
            for (;;)
              if (r == '\\') ((n += this.readEscape(t.read())), (r = t.peek()));
              else {
                if (!r || !isNameChar(r)) break;
                ((n += t.read()), (r = t.peek()));
              }
            return n;
          },
          readEscape: function (e) {
            var t = this._reader,
              n = e || '',
              r = 0,
              i = t.peek();
            if (isHexDigit(i))
              do ((n += t.read()), (i = t.peek()));
              while (i && isHexDigit(i) && ++r < 6);
            return ((n.length == 3 && /\s/.test(i)) || n.length == 7 || n.length == 1 ? t.read() : (i = ''), n + i);
          },
          readComment: function (e) {
            var t = this._reader,
              n = e || '',
              r = t.read();
            if (r == '*') {
              while (r) {
                n += r;
                if (n.length > 2 && r == '*' && t.peek() == '/') {
                  n += t.read();
                  break;
                }
                r = t.read();
              }
              return n;
            }
            return '';
          },
        });
        var Tokens = [
          { name: 'CDO' },
          { name: 'CDC' },
          { name: 'S', whitespace: !0 },
          { name: 'COMMENT', comment: !0, hide: !0, channel: 'comment' },
          { name: 'INCLUDES', text: '~=' },
          { name: 'DASHMATCH', text: '|=' },
          { name: 'PREFIXMATCH', text: '^=' },
          { name: 'SUFFIXMATCH', text: '$=' },
          { name: 'SUBSTRINGMATCH', text: '*=' },
          { name: 'STRING' },
          { name: 'IDENT' },
          { name: 'HASH' },
          { name: 'IMPORT_SYM', text: '@import' },
          { name: 'PAGE_SYM', text: '@page' },
          { name: 'MEDIA_SYM', text: '@media' },
          { name: 'FONT_FACE_SYM', text: '@font-face' },
          { name: 'CHARSET_SYM', text: '@charset' },
          { name: 'NAMESPACE_SYM', text: '@namespace' },
          { name: 'VIEWPORT_SYM', text: ['@viewport', '@-ms-viewport'] },
          { name: 'UNKNOWN_SYM' },
          { name: 'KEYFRAMES_SYM', text: ['@keyframes', '@-webkit-keyframes', '@-moz-keyframes', '@-o-keyframes'] },
          { name: 'IMPORTANT_SYM' },
          { name: 'LENGTH' },
          { name: 'ANGLE' },
          { name: 'TIME' },
          { name: 'FREQ' },
          { name: 'DIMENSION' },
          { name: 'PERCENTAGE' },
          { name: 'NUMBER' },
          { name: 'URI' },
          { name: 'FUNCTION' },
          { name: 'UNICODE_RANGE' },
          { name: 'INVALID' },
          { name: 'PLUS', text: '+' },
          { name: 'GREATER', text: '>' },
          { name: 'COMMA', text: ',' },
          { name: 'TILDE', text: '~' },
          { name: 'NOT' },
          { name: 'TOPLEFTCORNER_SYM', text: '@top-left-corner' },
          { name: 'TOPLEFT_SYM', text: '@top-left' },
          { name: 'TOPCENTER_SYM', text: '@top-center' },
          { name: 'TOPRIGHT_SYM', text: '@top-right' },
          { name: 'TOPRIGHTCORNER_SYM', text: '@top-right-corner' },
          { name: 'BOTTOMLEFTCORNER_SYM', text: '@bottom-left-corner' },
          { name: 'BOTTOMLEFT_SYM', text: '@bottom-left' },
          { name: 'BOTTOMCENTER_SYM', text: '@bottom-center' },
          { name: 'BOTTOMRIGHT_SYM', text: '@bottom-right' },
          { name: 'BOTTOMRIGHTCORNER_SYM', text: '@bottom-right-corner' },
          { name: 'LEFTTOP_SYM', text: '@left-top' },
          { name: 'LEFTMIDDLE_SYM', text: '@left-middle' },
          { name: 'LEFTBOTTOM_SYM', text: '@left-bottom' },
          { name: 'RIGHTTOP_SYM', text: '@right-top' },
          { name: 'RIGHTMIDDLE_SYM', text: '@right-middle' },
          { name: 'RIGHTBOTTOM_SYM', text: '@right-bottom' },
          { name: 'RESOLUTION', state: 'media' },
          { name: 'IE_FUNCTION' },
          { name: 'CHAR' },
          { name: 'PIPE', text: '|' },
          { name: 'SLASH', text: '/' },
          { name: 'MINUS', text: '-' },
          { name: 'STAR', text: '*' },
          { name: 'LBRACE', endChar: '}', text: '{' },
          { name: 'RBRACE', text: '}' },
          { name: 'LBRACKET', endChar: ']', text: '[' },
          { name: 'RBRACKET', text: ']' },
          { name: 'EQUALS', text: '=' },
          { name: 'COLON', text: ':' },
          { name: 'SEMICOLON', text: ';' },
          { name: 'LPAREN', endChar: ')', text: '(' },
          { name: 'RPAREN', text: ')' },
          { name: 'DOT', text: '.' },
        ];
        (function () {
          var e = [],
            t = {};
          ((Tokens.UNKNOWN = -1), Tokens.unshift({ name: 'EOF' }));
          for (var n = 0, r = Tokens.length; n < r; n++) {
            (e.push(Tokens[n].name), (Tokens[Tokens[n].name] = n));
            if (Tokens[n].text)
              if (Tokens[n].text instanceof Array) for (var i = 0; i < Tokens[n].text.length; i++) t[Tokens[n].text[i]] = n;
              else t[Tokens[n].text] = n;
          }
          ((Tokens.name = function (t) {
            return e[t];
          }),
            (Tokens.type = function (e) {
              return t[e] || -1;
            }));
        })();
        var Validation = {
          validate: function (e, t) {
            var n = e.toString().toLowerCase(),
              r = t.parts,
              i = new PropertyValueIterator(t),
              s = Properties[n],
              o,
              u,
              a,
              f,
              l,
              c,
              h,
              p,
              d,
              v,
              m;
            if (!s) {
              if (n.indexOf('-') !== 0) throw new ValidationError("Unknown property '" + e + "'.", e.line, e.col);
            } else typeof s != 'number' && (typeof s == 'string' ? (s.indexOf('||') > -1 ? this.groupProperty(s, i) : this.singleProperty(s, i, 1)) : s.multi ? this.multiProperty(s.multi, i, s.comma, s.max || Infinity) : typeof s == 'function' && s(i));
          },
          singleProperty: function (e, t, n, r) {
            var i = !1,
              s = t.value,
              o = 0,
              u;
            while (t.hasNext() && o < n) {
              i = ValidationTypes.isAny(t, e);
              if (!i) break;
              o++;
            }
            if (!i) throw t.hasNext() && !t.isFirst() ? ((u = t.peek()), new ValidationError("Expected end of value but found '" + u + "'.", u.line, u.col)) : new ValidationError('Expected (' + e + ") but found '" + s + "'.", s.line, s.col);
            if (t.hasNext()) throw ((u = t.next()), new ValidationError("Expected end of value but found '" + u + "'.", u.line, u.col));
          },
          multiProperty: function (e, t, n, r) {
            var i = !1,
              s = t.value,
              o = 0,
              u = !1,
              a;
            while (t.hasNext() && !i && o < r) {
              if (!ValidationTypes.isAny(t, e)) break;
              o++;
              if (!t.hasNext()) i = !0;
              else if (n) {
                if (t.peek() != ',') break;
                a = t.next();
              }
            }
            if (!i)
              throw t.hasNext() && !t.isFirst()
                ? ((a = t.peek()), new ValidationError("Expected end of value but found '" + a + "'.", a.line, a.col))
                : ((a = t.previous()), n && a == ',' ? new ValidationError("Expected end of value but found '" + a + "'.", a.line, a.col) : new ValidationError('Expected (' + e + ") but found '" + s + "'.", s.line, s.col));
            if (t.hasNext()) throw ((a = t.next()), new ValidationError("Expected end of value but found '" + a + "'.", a.line, a.col));
          },
          groupProperty: function (e, t, n) {
            var r = !1,
              i = t.value,
              s = e.split('||').length,
              o = { count: 0 },
              u = !1,
              a,
              f;
            while (t.hasNext() && !r) {
              a = ValidationTypes.isAnyOfGroup(t, e);
              if (!a) break;
              if (o[a]) break;
              ((o[a] = 1), o.count++, (u = !0));
              if (o.count == s || !t.hasNext()) r = !0;
            }
            if (!r) throw u && t.hasNext() ? ((f = t.peek()), new ValidationError("Expected end of value but found '" + f + "'.", f.line, f.col)) : new ValidationError('Expected (' + e + ") but found '" + i + "'.", i.line, i.col);
            if (t.hasNext()) throw ((f = t.next()), new ValidationError("Expected end of value but found '" + f + "'.", f.line, f.col));
          },
        };
        ValidationError.prototype = new Error();
        var ValidationTypes = {
          isLiteral: function (e, t) {
            var n = e.text.toString().toLowerCase(),
              r = t.split(' | '),
              i,
              s,
              o = !1;
            for (i = 0, s = r.length; i < s && !o; i++) n == r[i].toLowerCase() && (o = !0);
            return o;
          },
          isSimple: function (e) {
            return !!this.simple[e];
          },
          isComplex: function (e) {
            return !!this.complex[e];
          },
          isAny: function (e, t) {
            var n = t.split(' | '),
              r,
              i,
              s = !1;
            for (r = 0, i = n.length; r < i && !s && e.hasNext(); r++) s = this.isType(e, n[r]);
            return s;
          },
          isAnyOfGroup: function (e, t) {
            var n = t.split(' || '),
              r,
              i,
              s = !1;
            for (r = 0, i = n.length; r < i && !s; r++) s = this.isType(e, n[r]);
            return s ? n[r - 1] : !1;
          },
          isType: function (e, t) {
            var n = e.peek(),
              r = !1;
            return (t.charAt(0) != '<' ? ((r = this.isLiteral(n, t)), r && e.next()) : this.simple[t] ? ((r = this.simple[t](n)), r && e.next()) : (r = this.complex[t](e)), r);
          },
          simple: {
            '<absolute-size>': function (e) {
              return ValidationTypes.isLiteral(e, 'xx-small | x-small | small | medium | large | x-large | xx-large');
            },
            '<attachment>': function (e) {
              return ValidationTypes.isLiteral(e, 'scroll | fixed | local');
            },
            '<attr>': function (e) {
              return e.type == 'function' && e.name == 'attr';
            },
            '<bg-image>': function (e) {
              return this['<image>'](e) || this['<gradient>'](e) || e == 'none';
            },
            '<gradient>': function (e) {
              return e.type == 'function' && /^(?:\-(?:ms|moz|o|webkit)\-)?(?:repeating\-)?(?:radial\-|linear\-)?gradient/i.test(e);
            },
            '<box>': function (e) {
              return ValidationTypes.isLiteral(e, 'padding-box | border-box | content-box');
            },
            '<content>': function (e) {
              return e.type == 'function' && e.name == 'content';
            },
            '<relative-size>': function (e) {
              return ValidationTypes.isLiteral(e, 'smaller | larger');
            },
            '<ident>': function (e) {
              return e.type == 'identifier';
            },
            '<length>': function (e) {
              return e.type == 'function' && /^(?:\-(?:ms|moz|o|webkit)\-)?calc/i.test(e) ? !0 : e.type == 'length' || e.type == 'number' || e.type == 'integer' || e == '0';
            },
            '<color>': function (e) {
              return e.type == 'color' || e == 'transparent';
            },
            '<number>': function (e) {
              return e.type == 'number' || this['<integer>'](e);
            },
            '<integer>': function (e) {
              return e.type == 'integer';
            },
            '<line>': function (e) {
              return e.type == 'integer';
            },
            '<angle>': function (e) {
              return e.type == 'angle';
            },
            '<uri>': function (e) {
              return e.type == 'uri';
            },
            '<image>': function (e) {
              return this['<uri>'](e);
            },
            '<percentage>': function (e) {
              return e.type == 'percentage' || e == '0';
            },
            '<border-width>': function (e) {
              return this['<length>'](e) || ValidationTypes.isLiteral(e, 'thin | medium | thick');
            },
            '<border-style>': function (e) {
              return ValidationTypes.isLiteral(e, 'none | hidden | dotted | dashed | solid | double | groove | ridge | inset | outset');
            },
            '<content-sizing>': function (e) {
              return ValidationTypes.isLiteral(e, 'fill-available | -moz-available | -webkit-fill-available | max-content | -moz-max-content | -webkit-max-content | min-content | -moz-min-content | -webkit-min-content | fit-content | -moz-fit-content | -webkit-fit-content');
            },
            '<margin-width>': function (e) {
              return this['<length>'](e) || this['<percentage>'](e) || ValidationTypes.isLiteral(e, 'auto');
            },
            '<padding-width>': function (e) {
              return this['<length>'](e) || this['<percentage>'](e);
            },
            '<shape>': function (e) {
              return e.type == 'function' && (e.name == 'rect' || e.name == 'inset-rect');
            },
            '<time>': function (e) {
              return e.type == 'time';
            },
            '<flex-grow>': function (e) {
              return this['<number>'](e);
            },
            '<flex-shrink>': function (e) {
              return this['<number>'](e);
            },
            '<width>': function (e) {
              return this['<margin-width>'](e);
            },
            '<flex-basis>': function (e) {
              return this['<width>'](e);
            },
            '<flex-direction>': function (e) {
              return ValidationTypes.isLiteral(e, 'row | row-reverse | column | column-reverse');
            },
            '<flex-wrap>': function (e) {
              return ValidationTypes.isLiteral(e, 'nowrap | wrap | wrap-reverse');
            },
          },
          complex: {
            '<bg-position>': function (e) {
              var t = this,
                n = !1,
                r = '<percentage> | <length>',
                i = 'left | right',
                s = 'top | bottom',
                o = 0,
                u = function () {
                  return e.hasNext() && e.peek() != ',';
                };
              while (e.peek(o) && e.peek(o) != ',') o++;
              return (
                o < 3
                  ? ValidationTypes.isAny(e, i + ' | center | ' + r)
                    ? ((n = !0), ValidationTypes.isAny(e, s + ' | center | ' + r))
                    : ValidationTypes.isAny(e, s) && ((n = !0), ValidationTypes.isAny(e, i + ' | center'))
                  : ValidationTypes.isAny(e, i)
                    ? ValidationTypes.isAny(e, s)
                      ? ((n = !0), ValidationTypes.isAny(e, r))
                      : ValidationTypes.isAny(e, r) && (ValidationTypes.isAny(e, s) ? ((n = !0), ValidationTypes.isAny(e, r)) : ValidationTypes.isAny(e, 'center') && (n = !0))
                    : ValidationTypes.isAny(e, s)
                      ? ValidationTypes.isAny(e, i)
                        ? ((n = !0), ValidationTypes.isAny(e, r))
                        : ValidationTypes.isAny(e, r) && (ValidationTypes.isAny(e, i) ? ((n = !0), ValidationTypes.isAny(e, r)) : ValidationTypes.isAny(e, 'center') && (n = !0))
                      : ValidationTypes.isAny(e, 'center') && ValidationTypes.isAny(e, i + ' | ' + s) && ((n = !0), ValidationTypes.isAny(e, r)),
                n
              );
            },
            '<bg-size>': function (e) {
              var t = this,
                n = !1,
                r = '<percentage> | <length> | auto',
                i,
                s,
                o;
              return (ValidationTypes.isAny(e, 'cover | contain') ? (n = !0) : ValidationTypes.isAny(e, r) && ((n = !0), ValidationTypes.isAny(e, r)), n);
            },
            '<repeat-style>': function (e) {
              var t = !1,
                n = 'repeat | space | round | no-repeat',
                r;
              return (e.hasNext() && ((r = e.next()), ValidationTypes.isLiteral(r, 'repeat-x | repeat-y') ? (t = !0) : ValidationTypes.isLiteral(r, n) && ((t = !0), e.hasNext() && ValidationTypes.isLiteral(e.peek(), n) && e.next())), t);
            },
            '<shadow>': function (e) {
              var t = !1,
                n = 0,
                r = !1,
                i = !1,
                s;
              if (e.hasNext()) {
                (ValidationTypes.isAny(e, 'inset') && (r = !0), ValidationTypes.isAny(e, '<color>') && (i = !0));
                while (ValidationTypes.isAny(e, '<length>') && n < 4) n++;
                (e.hasNext() && (i || ValidationTypes.isAny(e, '<color>'), r || ValidationTypes.isAny(e, 'inset')), (t = n >= 2 && n <= 4));
              }
              return t;
            },
            '<x-one-radius>': function (e) {
              var t = !1,
                n = '<length> | <percentage> | inherit';
              return (ValidationTypes.isAny(e, n) && ((t = !0), ValidationTypes.isAny(e, n)), t);
            },
            '<flex>': function (e) {
              var t,
                n = !1;
              ValidationTypes.isAny(e, 'none | inherit')
                ? (n = !0)
                : ValidationTypes.isType(e, '<flex-grow>')
                  ? e.peek()
                    ? ValidationTypes.isType(e, '<flex-shrink>')
                      ? e.peek()
                        ? (n = ValidationTypes.isType(e, '<flex-basis>'))
                        : (n = !0)
                      : ValidationTypes.isType(e, '<flex-basis>') && (n = e.peek() === null)
                    : (n = !0)
                  : ValidationTypes.isType(e, '<flex-basis>') && (n = !0);
              if (!n) throw ((t = e.peek()), new ValidationError("Expected (none | [ <flex-grow> <flex-shrink>? || <flex-basis> ]) but found '" + e.value.text + "'.", t.line, t.col));
              return n;
            },
          },
        };
        parserlib.css = {
          Colors: Colors,
          Combinator: Combinator,
          Parser: Parser,
          PropertyName: PropertyName,
          PropertyValue: PropertyValue,
          PropertyValuePart: PropertyValuePart,
          MediaFeature: MediaFeature,
          MediaQuery: MediaQuery,
          Selector: Selector,
          SelectorPart: SelectorPart,
          SelectorSubPart: SelectorSubPart,
          Specificity: Specificity,
          TokenStream: TokenStream,
          Tokens: Tokens,
          ValidationError: ValidationError,
        };
      })(),
      (function () {
        for (var e in parserlib) exports[e] = parserlib[e];
      })());
    var util = {
      isArray: function (e) {
        return Array.isArray(e) || (typeof e == 'object' && objectToString(e) === '[object Array]');
      },
      isDate: function (e) {
        return typeof e == 'object' && objectToString(e) === '[object Date]';
      },
      isRegExp: function (e) {
        return typeof e == 'object' && objectToString(e) === '[object RegExp]';
      },
      getRegExpFlags: function (e) {
        var t = '';
        return (e.global && (t += 'g'), e.ignoreCase && (t += 'i'), e.multiline && (t += 'm'), t);
      },
    };
    (typeof module == 'object' && (module.exports = clone),
      (clone.clonePrototype = function (e) {
        if (e === null) return null;
        var t = function () {};
        return ((t.prototype = e), new t());
      }));
    var CSSLint = (function () {
      function i(e, t) {
        var r,
          i = e && e.match(n),
          s = i && i[1];
        return (
          s &&
            ((r = { true: 2, '': 1, false: 0, 2: 2, 1: 1, 0: 0 }),
            s
              .toLowerCase()
              .split(',')
              .forEach(function (e) {
                var n = e.split(':'),
                  i = n[0] || '',
                  s = n[1] || '';
                t[i.trim()] = r[s.trim()];
              })),
          t
        );
      }
      var e = [],
        t = [],
        n = /\/\*csslint([^\*]*)\*\//,
        r = new parserlib.util.EventTarget();
      return (
        (r.version = '@VERSION@'),
        (r.addRule = function (t) {
          (e.push(t), (e[t.id] = t));
        }),
        (r.clearRules = function () {
          e = [];
        }),
        (r.getRules = function () {
          return [].concat(e).sort(function (e, t) {
            return e.id > t.id ? 1 : 0;
          });
        }),
        (r.getRuleset = function () {
          var t = {},
            n = 0,
            r = e.length;
          while (n < r) t[e[n++].id] = 1;
          return t;
        }),
        (r.addFormatter = function (e) {
          t[e.id] = e;
        }),
        (r.getFormatter = function (e) {
          return t[e];
        }),
        (r.format = function (e, t, n, r) {
          var i = this.getFormatter(n),
            s = null;
          return (i && ((s = i.startFormat()), (s += i.formatResults(e, t, r || {})), (s += i.endFormat())), s);
        }),
        (r.hasFormat = function (e) {
          return t.hasOwnProperty(e);
        }),
        (r.verify = function (t, r) {
          var s = 0,
            o,
            u,
            a,
            f = new parserlib.css.Parser({ starHack: !0, ieFilters: !0, underscoreHack: !0, strict: !1 });
          ((u = t.replace(/\n\r?/g, '$split$').split('$split$')), r || (r = this.getRuleset()), n.test(t) && ((r = clone(r)), (r = i(t, r))), (o = new Reporter(u, r)), (r.errors = 2));
          for (s in r) r.hasOwnProperty(s) && r[s] && e[s] && e[s].init(f, o);
          try {
            f.parse(t);
          } catch (l) {
            o.error('Fatal error, cannot continue: ' + l.message, l.line, l.col, {});
          }
          return (
            (a = { messages: o.messages, stats: o.stats, ruleset: o.ruleset }),
            a.messages.sort(function (e, t) {
              return e.rollup && !t.rollup ? 1 : !e.rollup && t.rollup ? -1 : e.line - t.line;
            }),
            a
          );
        }),
        r
      );
    })();
    ((Reporter.prototype = {
      constructor: Reporter,
      error: function (e, t, n, r) {
        this.messages.push({ type: 'error', line: t, col: n, message: e, evidence: this.lines[t - 1], rule: r || {} });
      },
      warn: function (e, t, n, r) {
        this.report(e, t, n, r);
      },
      report: function (e, t, n, r) {
        this.messages.push({ type: this.ruleset[r.id] === 2 ? 'error' : 'warning', line: t, col: n, message: e, evidence: this.lines[t - 1], rule: r });
      },
      info: function (e, t, n, r) {
        this.messages.push({ type: 'info', line: t, col: n, message: e, evidence: this.lines[t - 1], rule: r });
      },
      rollupError: function (e, t) {
        this.messages.push({ type: 'error', rollup: !0, message: e, rule: t });
      },
      rollupWarn: function (e, t) {
        this.messages.push({ type: 'warning', rollup: !0, message: e, rule: t });
      },
      stat: function (e, t) {
        this.stats[e] = t;
      },
    }),
      (CSSLint._Reporter = Reporter),
      (CSSLint.Util = {
        mix: function (e, t) {
          var n;
          for (n in t) t.hasOwnProperty(n) && (e[n] = t[n]);
          return n;
        },
        indexOf: function (e, t) {
          if (e.indexOf) return e.indexOf(t);
          for (var n = 0, r = e.length; n < r; n++) if (e[n] === t) return n;
          return -1;
        },
        forEach: function (e, t) {
          if (e.forEach) return e.forEach(t);
          for (var n = 0, r = e.length; n < r; n++) t(e[n], n, e);
        },
      }),
      CSSLint.addRule({
        id: 'adjoining-classes',
        name: 'Disallow adjoining classes',
        desc: "Don't use adjoining classes.",
        browsers: 'IE6',
        init: function (e, t) {
          var n = this;
          e.addListener('startrule', function (r) {
            var i = r.selectors,
              s,
              o,
              u,
              a,
              f,
              l,
              c;
            for (f = 0; f < i.length; f++) {
              s = i[f];
              for (l = 0; l < s.parts.length; l++) {
                o = s.parts[l];
                if (o.type === e.SELECTOR_PART_TYPE) {
                  a = 0;
                  for (c = 0; c < o.modifiers.length; c++) ((u = o.modifiers[c]), u.type === 'class' && a++, a > 1 && t.report("Don't use adjoining classes.", o.line, o.col, n));
                }
              }
            }
          });
        },
      }),
      CSSLint.addRule({
        id: 'box-model',
        name: 'Beware of broken box size',
        desc: "Don't use width or height when using padding or border.",
        browsers: 'All',
        init: function (e, t) {
          function u() {
            ((s = {}), (o = !1));
          }
          function a() {
            var e, u;
            if (!o) {
              if (s.height) for (e in i) i.hasOwnProperty(e) && s[e] && ((u = s[e].value), (e !== 'padding' || u.parts.length !== 2 || u.parts[0].value !== 0) && t.report('Using height with ' + e + ' can sometimes make elements larger than you expect.', s[e].line, s[e].col, n));
              if (s.width) for (e in r) r.hasOwnProperty(e) && s[e] && ((u = s[e].value), (e !== 'padding' || u.parts.length !== 2 || u.parts[1].value !== 0) && t.report('Using width with ' + e + ' can sometimes make elements larger than you expect.', s[e].line, s[e].col, n));
            }
          }
          var n = this,
            r = { border: 1, 'border-left': 1, 'border-right': 1, padding: 1, 'padding-left': 1, 'padding-right': 1 },
            i = { border: 1, 'border-bottom': 1, 'border-top': 1, padding: 1, 'padding-bottom': 1, 'padding-top': 1 },
            s,
            o = !1;
          (e.addListener('startrule', u),
            e.addListener('startfontface', u),
            e.addListener('startpage', u),
            e.addListener('startpagemargin', u),
            e.addListener('startkeyframerule', u),
            e.addListener('property', function (e) {
              var t = e.property.text.toLowerCase();
              i[t] || r[t]
                ? !/^0\S*$/.test(e.value) && (t !== 'border' || e.value.toString() !== 'none') && (s[t] = { line: e.property.line, col: e.property.col, value: e.value })
                : /^(width|height)/i.test(t) && /^(length|percentage)/.test(e.value.parts[0].type)
                  ? (s[t] = 1)
                  : t === 'box-sizing' && (o = !0);
            }),
            e.addListener('endrule', a),
            e.addListener('endfontface', a),
            e.addListener('endpage', a),
            e.addListener('endpagemargin', a),
            e.addListener('endkeyframerule', a));
        },
      }),
      CSSLint.addRule({
        id: 'box-sizing',
        name: 'Disallow use of box-sizing',
        desc: "The box-sizing properties isn't supported in IE6 and IE7.",
        browsers: 'IE6, IE7',
        tags: ['Compatibility'],
        init: function (e, t) {
          var n = this;
          e.addListener('property', function (e) {
            var r = e.property.text.toLowerCase();
            r === 'box-sizing' && t.report("The box-sizing property isn't supported in IE6 and IE7.", e.line, e.col, n);
          });
        },
      }),
      CSSLint.addRule({
        id: 'bulletproof-font-face',
        name: 'Use the bulletproof @font-face syntax',
        desc: "Use the bulletproof @font-face syntax to avoid 404's in old IE (http://www.fontspring.com/blog/the-new-bulletproof-font-face-syntax).",
        browsers: 'All',
        init: function (e, t) {
          var n = this,
            r = !1,
            i = !0,
            s = !1,
            o,
            u;
          (e.addListener('startfontface', function () {
            r = !0;
          }),
            e.addListener('property', function (e) {
              if (!r) return;
              var t = e.property.toString().toLowerCase(),
                n = e.value.toString();
              ((o = e.line), (u = e.col));
              if (t === 'src') {
                var a = /^\s?url\(['"].+\.eot\?.*['"]\)\s*format\(['"]embedded-opentype['"]\).*$/i;
                !n.match(a) && i ? ((s = !0), (i = !1)) : n.match(a) && !i && (s = !1);
              }
            }),
            e.addListener('endfontface', function () {
              ((r = !1), s && t.report("@font-face declaration doesn't follow the fontspring bulletproof syntax.", o, u, n));
            }));
        },
      }),
      CSSLint.addRule({
        id: 'compatible-vendor-prefixes',
        name: 'Require compatible vendor prefixes',
        desc: 'Include all compatible vendor prefixes to reach a wider range of users.',
        browsers: 'All',
        init: function (e, t) {
          var n = this,
            r,
            i,
            s,
            o,
            u,
            a,
            f,
            l = !1,
            c = Array.prototype.push,
            h = [];
          r = {
            animation: 'webkit moz',
            'animation-delay': 'webkit moz',
            'animation-direction': 'webkit moz',
            'animation-duration': 'webkit moz',
            'animation-fill-mode': 'webkit moz',
            'animation-iteration-count': 'webkit moz',
            'animation-name': 'webkit moz',
            'animation-play-state': 'webkit moz',
            'animation-timing-function': 'webkit moz',
            appearance: 'webkit moz',
            'border-end': 'webkit moz',
            'border-end-color': 'webkit moz',
            'border-end-style': 'webkit moz',
            'border-end-width': 'webkit moz',
            'border-image': 'webkit moz o',
            'border-radius': 'webkit',
            'border-start': 'webkit moz',
            'border-start-color': 'webkit moz',
            'border-start-style': 'webkit moz',
            'border-start-width': 'webkit moz',
            'box-align': 'webkit moz ms',
            'box-direction': 'webkit moz ms',
            'box-flex': 'webkit moz ms',
            'box-lines': 'webkit ms',
            'box-ordinal-group': 'webkit moz ms',
            'box-orient': 'webkit moz ms',
            'box-pack': 'webkit moz ms',
            'box-sizing': 'webkit moz',
            'box-shadow': 'webkit moz',
            'column-count': 'webkit moz ms',
            'column-gap': 'webkit moz ms',
            'column-rule': 'webkit moz ms',
            'column-rule-color': 'webkit moz ms',
            'column-rule-style': 'webkit moz ms',
            'column-rule-width': 'webkit moz ms',
            'column-width': 'webkit moz ms',
            hyphens: 'epub moz',
            'line-break': 'webkit ms',
            'margin-end': 'webkit moz',
            'margin-start': 'webkit moz',
            'marquee-speed': 'webkit wap',
            'marquee-style': 'webkit wap',
            'padding-end': 'webkit moz',
            'padding-start': 'webkit moz',
            'tab-size': 'moz o',
            'text-size-adjust': 'webkit ms',
            transform: 'webkit moz ms o',
            'transform-origin': 'webkit moz ms o',
            transition: 'webkit moz o',
            'transition-delay': 'webkit moz o',
            'transition-duration': 'webkit moz o',
            'transition-property': 'webkit moz o',
            'transition-timing-function': 'webkit moz o',
            'user-modify': 'webkit moz',
            'user-select': 'webkit moz ms',
            'word-break': 'epub ms',
            'writing-mode': 'epub ms',
          };
          for (s in r)
            if (r.hasOwnProperty(s)) {
              ((o = []), (u = r[s].split(' ')));
              for (a = 0, f = u.length; a < f; a++) o.push('-' + u[a] + '-' + s);
              ((r[s] = o), c.apply(h, o));
            }
          (e.addListener('startrule', function () {
            i = [];
          }),
            e.addListener('startkeyframes', function (e) {
              l = e.prefix || !0;
            }),
            e.addListener('endkeyframes', function () {
              l = !1;
            }),
            e.addListener('property', function (e) {
              var t = e.property;
              CSSLint.Util.indexOf(h, t.text) > -1 && (!l || typeof l != 'string' || t.text.indexOf('-' + l + '-') !== 0) && i.push(t);
            }),
            e.addListener('endrule', function () {
              if (!i.length) return;
              var e = {},
                s,
                o,
                u,
                a,
                f,
                l,
                c,
                h,
                p,
                d;
              for (s = 0, o = i.length; s < o; s++) {
                u = i[s];
                for (a in r) r.hasOwnProperty(a) && ((f = r[a]), CSSLint.Util.indexOf(f, u.text) > -1 && (e[a] || (e[a] = { full: f.slice(0), actual: [], actualNodes: [] }), CSSLint.Util.indexOf(e[a].actual, u.text) === -1 && (e[a].actual.push(u.text), e[a].actualNodes.push(u))));
              }
              for (a in e)
                if (e.hasOwnProperty(a)) {
                  ((l = e[a]), (c = l.full), (h = l.actual));
                  if (c.length > h.length)
                    for (s = 0, o = c.length; s < o; s++)
                      ((p = c[s]), CSSLint.Util.indexOf(h, p) === -1 && ((d = h.length === 1 ? h[0] : h.length === 2 ? h.join(' and ') : h.join(', ')), t.report('The property ' + p + ' is compatible with ' + d + ' and should be included as well.', l.actualNodes[0].line, l.actualNodes[0].col, n)));
                }
            }));
        },
      }),
      CSSLint.addRule({
        id: 'display-property-grouping',
        name: 'Require properties appropriate for display',
        desc: "Certain properties shouldn't be used with certain display property values.",
        browsers: 'All',
        init: function (e, t) {
          function s(e, s, o) {
            i[e] && (typeof r[e] != 'string' || i[e].value.toLowerCase() !== r[e]) && t.report(o || e + " can't be used with display: " + s + '.', i[e].line, i[e].col, n);
          }
          function o() {
            i = {};
          }
          function u() {
            var e = i.display ? i.display.value : null;
            if (e)
              switch (e) {
                case 'inline':
                  (s('height', e), s('width', e), s('margin', e), s('margin-top', e), s('margin-bottom', e), s('float', e, 'display:inline has no effect on floated elements (but may be used to fix the IE6 double-margin bug).'));
                  break;
                case 'block':
                  s('vertical-align', e);
                  break;
                case 'inline-block':
                  s('float', e);
                  break;
                default:
                  e.indexOf('table-') === 0 && (s('margin', e), s('margin-left', e), s('margin-right', e), s('margin-top', e), s('margin-bottom', e), s('float', e));
              }
          }
          var n = this,
            r = { display: 1, float: 'none', height: 1, width: 1, margin: 1, 'margin-left': 1, 'margin-right': 1, 'margin-bottom': 1, 'margin-top': 1, padding: 1, 'padding-left': 1, 'padding-right': 1, 'padding-bottom': 1, 'padding-top': 1, 'vertical-align': 1 },
            i;
          (e.addListener('startrule', o),
            e.addListener('startfontface', o),
            e.addListener('startkeyframerule', o),
            e.addListener('startpagemargin', o),
            e.addListener('startpage', o),
            e.addListener('property', function (e) {
              var t = e.property.text.toLowerCase();
              r[t] && (i[t] = { value: e.value.text, line: e.property.line, col: e.property.col });
            }),
            e.addListener('endrule', u),
            e.addListener('endfontface', u),
            e.addListener('endkeyframerule', u),
            e.addListener('endpagemargin', u),
            e.addListener('endpage', u));
        },
      }),
      CSSLint.addRule({
        id: 'duplicate-background-images',
        name: 'Disallow duplicate background images',
        desc: 'Every background-image should be unique. Use a common class for e.g. sprites.',
        browsers: 'All',
        init: function (e, t) {
          var n = this,
            r = {};
          e.addListener('property', function (e) {
            var i = e.property.text,
              s = e.value,
              o,
              u;
            if (i.match(/background/i))
              for (o = 0, u = s.parts.length; o < u; o++)
                s.parts[o].type === 'uri' &&
                  (typeof r[s.parts[o].uri] == 'undefined' ? (r[s.parts[o].uri] = e) : t.report("Background image '" + s.parts[o].uri + "' was used multiple times, first declared at line " + r[s.parts[o].uri].line + ', col ' + r[s.parts[o].uri].col + '.', e.line, e.col, n));
          });
        },
      }),
      CSSLint.addRule({
        id: 'duplicate-properties',
        name: 'Disallow duplicate properties',
        desc: 'Duplicate properties must appear one after the other.',
        browsers: 'All',
        init: function (e, t) {
          function s() {
            r = {};
          }
          var n = this,
            r,
            i;
          (e.addListener('startrule', s),
            e.addListener('startfontface', s),
            e.addListener('startpage', s),
            e.addListener('startpagemargin', s),
            e.addListener('startkeyframerule', s),
            e.addListener('property', function (e) {
              var s = e.property,
                o = s.text.toLowerCase();
              (r[o] && (i !== o || r[o] === e.value.text) && t.report("Duplicate property '" + e.property + "' found.", e.line, e.col, n), (r[o] = e.value.text), (i = o));
            }));
        },
      }),
      CSSLint.addRule({
        id: 'empty-rules',
        name: 'Disallow empty rules',
        desc: 'Rules without any properties specified should be removed.',
        browsers: 'All',
        init: function (e, t) {
          var n = this,
            r = 0;
          (e.addListener('startrule', function () {
            r = 0;
          }),
            e.addListener('property', function () {
              r++;
            }),
            e.addListener('endrule', function (e) {
              var i = e.selectors;
              r === 0 && t.report('Rule is empty.', i[0].line, i[0].col, n);
            }));
        },
      }),
      CSSLint.addRule({
        id: 'errors',
        name: 'Parsing Errors',
        desc: 'This rule looks for recoverable syntax errors.',
        browsers: 'All',
        init: function (e, t) {
          var n = this;
          e.addListener('error', function (e) {
            t.error(e.message, e.line, e.col, n);
          });
        },
      }),
      CSSLint.addRule({
        id: 'fallback-colors',
        name: 'Require fallback colors',
        desc: "For older browsers that don't support RGBA, HSL, or HSLA, provide a fallback color.",
        browsers: 'IE6,IE7,IE8',
        init: function (e, t) {
          function o() {
            ((s = {}), (r = null));
          }
          var n = this,
            r,
            i = { color: 1, background: 1, 'border-color': 1, 'border-top-color': 1, 'border-right-color': 1, 'border-bottom-color': 1, 'border-left-color': 1, border: 1, 'border-top': 1, 'border-right': 1, 'border-bottom': 1, 'border-left': 1, 'background-color': 1 },
            s;
          (e.addListener('startrule', o),
            e.addListener('startfontface', o),
            e.addListener('startpage', o),
            e.addListener('startpagemargin', o),
            e.addListener('startkeyframerule', o),
            e.addListener('property', function (e) {
              var s = e.property,
                o = s.text.toLowerCase(),
                u = e.value.parts,
                a = 0,
                f = '',
                l = u.length;
              if (i[o])
                while (a < l)
                  (u[a].type === 'color' &&
                    ('alpha' in u[a] || 'hue' in u[a]
                      ? (/([^\)]+)\(/.test(u[a]) && (f = RegExp.$1.toUpperCase()), (!r || r.property.text.toLowerCase() !== o || r.colorType !== 'compat') && t.report('Fallback ' + o + ' (hex or RGB) should precede ' + f + ' ' + o + '.', e.line, e.col, n))
                      : (e.colorType = 'compat')),
                    a++);
              r = e;
            }));
        },
      }),
      CSSLint.addRule({
        id: 'floats',
        name: 'Disallow too many floats',
        desc: 'This rule tests if the float property is used too many times',
        browsers: 'All',
        init: function (e, t) {
          var n = this,
            r = 0;
          (e.addListener('property', function (e) {
            e.property.text.toLowerCase() === 'float' && e.value.text.toLowerCase() !== 'none' && r++;
          }),
            e.addListener('endstylesheet', function () {
              (t.stat('floats', r), r >= 10 && t.rollupWarn('Too many floats (' + r + "), you're probably using them for layout. Consider using a grid system instead.", n));
            }));
        },
      }),
      CSSLint.addRule({
        id: 'font-faces',
        name: "Don't use too many web fonts",
        desc: 'Too many different web fonts in the same stylesheet.',
        browsers: 'All',
        init: function (e, t) {
          var n = this,
            r = 0;
          (e.addListener('startfontface', function () {
            r++;
          }),
            e.addListener('endstylesheet', function () {
              r > 5 && t.rollupWarn('Too many @font-face declarations (' + r + ').', n);
            }));
        },
      }),
      CSSLint.addRule({
        id: 'font-sizes',
        name: 'Disallow too many font sizes',
        desc: 'Checks the number of font-size declarations.',
        browsers: 'All',
        init: function (e, t) {
          var n = this,
            r = 0;
          (e.addListener('property', function (e) {
            e.property.toString() === 'font-size' && r++;
          }),
            e.addListener('endstylesheet', function () {
              (t.stat('font-sizes', r), r >= 10 && t.rollupWarn('Too many font-size declarations (' + r + '), abstraction needed.', n));
            }));
        },
      }),
      CSSLint.addRule({
        id: 'gradients',
        name: 'Require all gradient definitions',
        desc: 'When using a vendor-prefixed gradient, make sure to use them all.',
        browsers: 'All',
        init: function (e, t) {
          var n = this,
            r;
          (e.addListener('startrule', function () {
            r = { moz: 0, webkit: 0, oldWebkit: 0, o: 0 };
          }),
            e.addListener('property', function (e) {
              /\-(moz|o|webkit)(?:\-(?:linear|radial))\-gradient/i.test(e.value) ? (r[RegExp.$1] = 1) : /\-webkit\-gradient/i.test(e.value) && (r.oldWebkit = 1);
            }),
            e.addListener('endrule', function (e) {
              var i = [];
              (r.moz || i.push('Firefox 3.6+'),
                r.webkit || i.push('Webkit (Safari 5+, Chrome)'),
                r.oldWebkit || i.push('Old Webkit (Safari 4+, Chrome)'),
                r.o || i.push('Opera 11.1+'),
                i.length && i.length < 4 && t.report('Missing vendor-prefixed CSS gradients for ' + i.join(', ') + '.', e.selectors[0].line, e.selectors[0].col, n));
            }));
        },
      }),
      CSSLint.addRule({
        id: 'ids',
        name: 'Disallow IDs in selectors',
        desc: 'Selectors should not contain IDs.',
        browsers: 'All',
        init: function (e, t) {
          var n = this;
          e.addListener('startrule', function (r) {
            var i = r.selectors,
              s,
              o,
              u,
              a,
              f,
              l,
              c;
            for (f = 0; f < i.length; f++) {
              ((s = i[f]), (a = 0));
              for (l = 0; l < s.parts.length; l++) {
                o = s.parts[l];
                if (o.type === e.SELECTOR_PART_TYPE) for (c = 0; c < o.modifiers.length; c++) ((u = o.modifiers[c]), u.type === 'id' && a++);
              }
              a === 1 ? t.report("Don't use IDs in selectors.", s.line, s.col, n) : a > 1 && t.report(a + ' IDs in the selector, really?', s.line, s.col, n);
            }
          });
        },
      }),
      CSSLint.addRule({
        id: 'import',
        name: 'Disallow @import',
        desc: "Don't use @import, use <link> instead.",
        browsers: 'All',
        init: function (e, t) {
          var n = this;
          e.addListener('import', function (e) {
            t.report('@import prevents parallel downloads, use <link> instead.', e.line, e.col, n);
          });
        },
      }),
      CSSLint.addRule({
        id: 'important',
        name: 'Disallow !important',
        desc: 'Be careful when using !important declaration',
        browsers: 'All',
        init: function (e, t) {
          var n = this,
            r = 0;
          (e.addListener('property', function (e) {
            e.important === !0 && (r++, t.report('Use of !important', e.line, e.col, n));
          }),
            e.addListener('endstylesheet', function () {
              (t.stat('important', r), r >= 10 && t.rollupWarn('Too many !important declarations (' + r + '), try to use less than 10 to avoid specificity issues.', n));
            }));
        },
      }),
      CSSLint.addRule({
        id: 'known-properties',
        name: 'Require use of known properties',
        desc: 'Properties should be known (listed in CSS3 specification) or be a vendor-prefixed property.',
        browsers: 'All',
        init: function (e, t) {
          var n = this;
          e.addListener('property', function (e) {
            e.invalid && t.report(e.invalid.message, e.line, e.col, n);
          });
        },
      }),
      CSSLint.addRule({
        id: 'order-alphabetical',
        name: 'Alphabetical order',
        desc: 'Assure properties are in alphabetical order',
        browsers: 'All',
        init: function (e, t) {
          var n = this,
            r,
            i = function () {
              r = [];
            };
          (e.addListener('startrule', i),
            e.addListener('startfontface', i),
            e.addListener('startpage', i),
            e.addListener('startpagemargin', i),
            e.addListener('startkeyframerule', i),
            e.addListener('property', function (e) {
              var t = e.property.text,
                n = t.toLowerCase().replace(/^-.*?-/, '');
              r.push(n);
            }),
            e.addListener('endrule', function (e) {
              var i = r.join(','),
                s = r.sort().join(',');
              i !== s && t.report("Rule doesn't have all its properties in alphabetical ordered.", e.line, e.col, n);
            }));
        },
      }),
      CSSLint.addRule({
        id: 'outline-none',
        name: 'Disallow outline: none',
        desc: 'Use of outline: none or outline: 0 should be limited to :focus rules.',
        browsers: 'All',
        tags: ['Accessibility'],
        init: function (e, t) {
          function i(e) {
            e.selectors ? (r = { line: e.line, col: e.col, selectors: e.selectors, propCount: 0, outline: !1 }) : (r = null);
          }
          function s() {
            r && r.outline && (r.selectors.toString().toLowerCase().indexOf(':focus') === -1 ? t.report('Outlines should only be modified using :focus.', r.line, r.col, n) : r.propCount === 1 && t.report("Outlines shouldn't be hidden unless other visual changes are made.", r.line, r.col, n));
          }
          var n = this,
            r;
          (e.addListener('startrule', i),
            e.addListener('startfontface', i),
            e.addListener('startpage', i),
            e.addListener('startpagemargin', i),
            e.addListener('startkeyframerule', i),
            e.addListener('property', function (e) {
              var t = e.property.text.toLowerCase(),
                n = e.value;
              r && (r.propCount++, t === 'outline' && (n.toString() === 'none' || n.toString() === '0') && (r.outline = !0));
            }),
            e.addListener('endrule', s),
            e.addListener('endfontface', s),
            e.addListener('endpage', s),
            e.addListener('endpagemargin', s),
            e.addListener('endkeyframerule', s));
        },
      }),
      CSSLint.addRule({
        id: 'overqualified-elements',
        name: 'Disallow overqualified elements',
        desc: "Don't use classes or IDs with elements (a.foo or a#foo).",
        browsers: 'All',
        init: function (e, t) {
          var n = this,
            r = {};
          (e.addListener('startrule', function (i) {
            var s = i.selectors,
              o,
              u,
              a,
              f,
              l,
              c;
            for (f = 0; f < s.length; f++) {
              o = s[f];
              for (l = 0; l < o.parts.length; l++) {
                u = o.parts[l];
                if (u.type === e.SELECTOR_PART_TYPE)
                  for (c = 0; c < u.modifiers.length; c++)
                    ((a = u.modifiers[c]), u.elementName && a.type === 'id' ? t.report('Element (' + u + ') is overqualified, just use ' + a + ' without element name.', u.line, u.col, n) : a.type === 'class' && (r[a] || (r[a] = []), r[a].push({ modifier: a, part: u })));
              }
            }
          }),
            e.addListener('endstylesheet', function () {
              var e;
              for (e in r) r.hasOwnProperty(e) && r[e].length === 1 && r[e][0].part.elementName && t.report('Element (' + r[e][0].part + ') is overqualified, just use ' + r[e][0].modifier + ' without element name.', r[e][0].part.line, r[e][0].part.col, n);
            }));
        },
      }),
      CSSLint.addRule({
        id: 'qualified-headings',
        name: 'Disallow qualified headings',
        desc: 'Headings should not be qualified (namespaced).',
        browsers: 'All',
        init: function (e, t) {
          var n = this;
          e.addListener('startrule', function (r) {
            var i = r.selectors,
              s,
              o,
              u,
              a;
            for (u = 0; u < i.length; u++) {
              s = i[u];
              for (a = 0; a < s.parts.length; a++) ((o = s.parts[a]), o.type === e.SELECTOR_PART_TYPE && o.elementName && /h[1-6]/.test(o.elementName.toString()) && a > 0 && t.report('Heading (' + o.elementName + ') should not be qualified.', o.line, o.col, n));
            }
          });
        },
      }),
      CSSLint.addRule({
        id: 'regex-selectors',
        name: 'Disallow selectors that look like regexs',
        desc: 'Selectors that look like regular expressions are slow and should be avoided.',
        browsers: 'All',
        init: function (e, t) {
          var n = this;
          e.addListener('startrule', function (r) {
            var i = r.selectors,
              s,
              o,
              u,
              a,
              f,
              l;
            for (a = 0; a < i.length; a++) {
              s = i[a];
              for (f = 0; f < s.parts.length; f++) {
                o = s.parts[f];
                if (o.type === e.SELECTOR_PART_TYPE) for (l = 0; l < o.modifiers.length; l++) ((u = o.modifiers[l]), u.type === 'attribute' && /([\~\|\^\$\*]=)/.test(u) && t.report('Attribute selectors with ' + RegExp.$1 + ' are slow!', u.line, u.col, n));
              }
            }
          });
        },
      }),
      CSSLint.addRule({
        id: 'rules-count',
        name: 'Rules Count',
        desc: 'Track how many rules there are.',
        browsers: 'All',
        init: function (e, t) {
          var n = 0;
          (e.addListener('startrule', function () {
            n++;
          }),
            e.addListener('endstylesheet', function () {
              t.stat('rule-count', n);
            }));
        },
      }),
      CSSLint.addRule({
        id: 'selector-max-approaching',
        name: 'Warn when approaching the 4095 selector limit for IE',
        desc: 'Will warn when selector count is >= 3800 selectors.',
        browsers: 'IE',
        init: function (e, t) {
          var n = this,
            r = 0;
          (e.addListener('startrule', function (e) {
            r += e.selectors.length;
          }),
            e.addListener('endstylesheet', function () {
              r >= 3800 && t.report('You have ' + r + ' selectors. Internet Explorer supports a maximum of 4095 selectors per stylesheet. Consider refactoring.', 0, 0, n);
            }));
        },
      }),
      CSSLint.addRule({
        id: 'selector-max',
        name: 'Error when past the 4095 selector limit for IE',
        desc: 'Will error when selector count is > 4095.',
        browsers: 'IE',
        init: function (e, t) {
          var n = this,
            r = 0;
          (e.addListener('startrule', function (e) {
            r += e.selectors.length;
          }),
            e.addListener('endstylesheet', function () {
              r > 4095 && t.report('You have ' + r + ' selectors. Internet Explorer supports a maximum of 4095 selectors per stylesheet. Consider refactoring.', 0, 0, n);
            }));
        },
      }),
      CSSLint.addRule({
        id: 'selector-newline',
        name: 'Disallow new-line characters in selectors',
        desc: 'New-line characters in selectors are usually a forgotten comma and not a descendant combinator.',
        browsers: 'All',
        init: function (e, t) {
          function r(e) {
            var r,
              i,
              s,
              o,
              u,
              a,
              f,
              l,
              c,
              h,
              p,
              d = e.selectors;
            for (r = 0, i = d.length; r < i; r++) {
              s = d[r];
              for (o = 0, a = s.parts.length; o < a; o++) for (u = o + 1; u < a; u++) ((f = s.parts[o]), (l = s.parts[u]), (c = f.type), (h = f.line), (p = l.line), c === 'descendant' && p > h && t.report('newline character found in selector (forgot a comma?)', h, d[r].parts[0].col, n));
            }
          }
          var n = this;
          e.addListener('startrule', r);
        },
      }),
      CSSLint.addRule({
        id: 'shorthand',
        name: 'Require shorthand properties',
        desc: 'Use shorthand properties where possible.',
        browsers: 'All',
        init: function (e, t) {
          function f() {
            u = {};
          }
          function l(e) {
            var r, i, s, o;
            for (r in a)
              if (a.hasOwnProperty(r)) {
                o = 0;
                for (i = 0, s = a[r].length; i < s; i++) o += u[a[r][i]] ? 1 : 0;
                o === a[r].length && t.report('The properties ' + a[r].join(', ') + ' can be replaced by ' + r + '.', e.line, e.col, n);
              }
          }
          var n = this,
            r,
            i,
            s,
            o = {},
            u,
            a = { margin: ['margin-top', 'margin-bottom', 'margin-left', 'margin-right'], padding: ['padding-top', 'padding-bottom', 'padding-left', 'padding-right'] };
          for (r in a) if (a.hasOwnProperty(r)) for (i = 0, s = a[r].length; i < s; i++) o[a[r][i]] = r;
          (e.addListener('startrule', f),
            e.addListener('startfontface', f),
            e.addListener('property', function (e) {
              var t = e.property.toString().toLowerCase();
              o[t] && (u[t] = 1);
            }),
            e.addListener('endrule', l),
            e.addListener('endfontface', l));
        },
      }),
      CSSLint.addRule({
        id: 'star-property-hack',
        name: 'Disallow properties with a star prefix',
        desc: 'Checks for the star property hack (targets IE6/7)',
        browsers: 'All',
        init: function (e, t) {
          var n = this;
          e.addListener('property', function (e) {
            var r = e.property;
            r.hack === '*' && t.report('Property with star prefix found.', e.property.line, e.property.col, n);
          });
        },
      }),
      CSSLint.addRule({
        id: 'text-indent',
        name: 'Disallow negative text-indent',
        desc: 'Checks for text indent less than -99px',
        browsers: 'All',
        init: function (e, t) {
          function s() {
            ((r = !1), (i = 'inherit'));
          }
          function o() {
            r && i !== 'ltr' && t.report("Negative text-indent doesn't work well with RTL. If you use text-indent for image replacement explicitly set direction for that item to ltr.", r.line, r.col, n);
          }
          var n = this,
            r,
            i;
          (e.addListener('startrule', s),
            e.addListener('startfontface', s),
            e.addListener('property', function (e) {
              var t = e.property.toString().toLowerCase(),
                n = e.value;
              t === 'text-indent' && n.parts[0].value < -99 ? (r = e.property) : t === 'direction' && n.toString() === 'ltr' && (i = 'ltr');
            }),
            e.addListener('endrule', o),
            e.addListener('endfontface', o));
        },
      }),
      CSSLint.addRule({
        id: 'underscore-property-hack',
        name: 'Disallow properties with an underscore prefix',
        desc: 'Checks for the underscore property hack (targets IE6)',
        browsers: 'All',
        init: function (e, t) {
          var n = this;
          e.addListener('property', function (e) {
            var r = e.property;
            r.hack === '_' && t.report('Property with underscore prefix found.', e.property.line, e.property.col, n);
          });
        },
      }),
      CSSLint.addRule({
        id: 'unique-headings',
        name: 'Headings should only be defined once',
        desc: 'Headings should be defined only once.',
        browsers: 'All',
        init: function (e, t) {
          var n = this,
            r = { h1: 0, h2: 0, h3: 0, h4: 0, h5: 0, h6: 0 };
          (e.addListener('startrule', function (e) {
            var i = e.selectors,
              s,
              o,
              u,
              a,
              f;
            for (a = 0; a < i.length; a++) {
              ((s = i[a]), (o = s.parts[s.parts.length - 1]));
              if (o.elementName && /(h[1-6])/i.test(o.elementName.toString())) {
                for (f = 0; f < o.modifiers.length; f++)
                  if (o.modifiers[f].type === 'pseudo') {
                    u = !0;
                    break;
                  }
                u || (r[RegExp.$1]++, r[RegExp.$1] > 1 && t.report('Heading (' + o.elementName + ') has already been defined.', o.line, o.col, n));
              }
            }
          }),
            e.addListener('endstylesheet', function () {
              var e,
                i = [];
              for (e in r) r.hasOwnProperty(e) && r[e] > 1 && i.push(r[e] + ' ' + e + 's');
              i.length && t.rollupWarn('You have ' + i.join(', ') + ' defined in this stylesheet.', n);
            }));
        },
      }),
      CSSLint.addRule({
        id: 'universal-selector',
        name: 'Disallow universal selector',
        desc: 'The universal selector (*) is known to be slow.',
        browsers: 'All',
        init: function (e, t) {
          var n = this;
          e.addListener('startrule', function (e) {
            var r = e.selectors,
              i,
              s,
              o;
            for (o = 0; o < r.length; o++) ((i = r[o]), (s = i.parts[i.parts.length - 1]), s.elementName === '*' && t.report(n.desc, s.line, s.col, n));
          });
        },
      }),
      CSSLint.addRule({
        id: 'unqualified-attributes',
        name: 'Disallow unqualified attribute selectors',
        desc: 'Unqualified attribute selectors are known to be slow.',
        browsers: 'All',
        init: function (e, t) {
          var n = this;
          e.addListener('startrule', function (r) {
            var i = r.selectors,
              s,
              o,
              u,
              a,
              f;
            for (a = 0; a < i.length; a++) {
              ((s = i[a]), (o = s.parts[s.parts.length - 1]));
              if (o.type === e.SELECTOR_PART_TYPE) for (f = 0; f < o.modifiers.length; f++) ((u = o.modifiers[f]), u.type === 'attribute' && (!o.elementName || o.elementName === '*') && t.report(n.desc, o.line, o.col, n));
            }
          });
        },
      }),
      CSSLint.addRule({
        id: 'vendor-prefix',
        name: 'Require standard property with vendor prefix',
        desc: 'When using a vendor-prefixed property, make sure to include the standard one.',
        browsers: 'All',
        init: function (e, t) {
          function o() {
            ((r = {}), (i = 1));
          }
          function u() {
            var e,
              i,
              o,
              u,
              a,
              f = [];
            for (e in r) s[e] && f.push({ actual: e, needed: s[e] });
            for (i = 0, o = f.length; i < o; i++)
              ((u = f[i].needed),
                (a = f[i].actual),
                r[u]
                  ? r[u][0].pos < r[a][0].pos && t.report("Standard property '" + u + "' should come after vendor-prefixed property '" + a + "'.", r[a][0].name.line, r[a][0].name.col, n)
                  : t.report("Missing standard property '" + u + "' to go along with '" + a + "'.", r[a][0].name.line, r[a][0].name.col, n));
          }
          var n = this,
            r,
            i,
            s = {
              '-webkit-border-radius': 'border-radius',
              '-webkit-border-top-left-radius': 'border-top-left-radius',
              '-webkit-border-top-right-radius': 'border-top-right-radius',
              '-webkit-border-bottom-left-radius': 'border-bottom-left-radius',
              '-webkit-border-bottom-right-radius': 'border-bottom-right-radius',
              '-o-border-radius': 'border-radius',
              '-o-border-top-left-radius': 'border-top-left-radius',
              '-o-border-top-right-radius': 'border-top-right-radius',
              '-o-border-bottom-left-radius': 'border-bottom-left-radius',
              '-o-border-bottom-right-radius': 'border-bottom-right-radius',
              '-moz-border-radius': 'border-radius',
              '-moz-border-radius-topleft': 'border-top-left-radius',
              '-moz-border-radius-topright': 'border-top-right-radius',
              '-moz-border-radius-bottomleft': 'border-bottom-left-radius',
              '-moz-border-radius-bottomright': 'border-bottom-right-radius',
              '-moz-column-count': 'column-count',
              '-webkit-column-count': 'column-count',
              '-moz-column-gap': 'column-gap',
              '-webkit-column-gap': 'column-gap',
              '-moz-column-rule': 'column-rule',
              '-webkit-column-rule': 'column-rule',
              '-moz-column-rule-style': 'column-rule-style',
              '-webkit-column-rule-style': 'column-rule-style',
              '-moz-column-rule-color': 'column-rule-color',
              '-webkit-column-rule-color': 'column-rule-color',
              '-moz-column-rule-width': 'column-rule-width',
              '-webkit-column-rule-width': 'column-rule-width',
              '-moz-column-width': 'column-width',
              '-webkit-column-width': 'column-width',
              '-webkit-column-span': 'column-span',
              '-webkit-columns': 'columns',
              '-moz-box-shadow': 'box-shadow',
              '-webkit-box-shadow': 'box-shadow',
              '-moz-transform': 'transform',
              '-webkit-transform': 'transform',
              '-o-transform': 'transform',
              '-ms-transform': 'transform',
              '-moz-transform-origin': 'transform-origin',
              '-webkit-transform-origin': 'transform-origin',
              '-o-transform-origin': 'transform-origin',
              '-ms-transform-origin': 'transform-origin',
              '-moz-box-sizing': 'box-sizing',
              '-webkit-box-sizing': 'box-sizing',
            };
          (e.addListener('startrule', o),
            e.addListener('startfontface', o),
            e.addListener('startpage', o),
            e.addListener('startpagemargin', o),
            e.addListener('startkeyframerule', o),
            e.addListener('property', function (e) {
              var t = e.property.text.toLowerCase();
              (r[t] || (r[t] = []), r[t].push({ name: e.property, value: e.value, pos: i++ }));
            }),
            e.addListener('endrule', u),
            e.addListener('endfontface', u),
            e.addListener('endpage', u),
            e.addListener('endpagemargin', u),
            e.addListener('endkeyframerule', u));
        },
      }),
      CSSLint.addRule({
        id: 'zero-units',
        name: 'Disallow units for 0 values',
        desc: "You don't need to specify units when a value is 0.",
        browsers: 'All',
        init: function (e, t) {
          var n = this;
          e.addListener('property', function (e) {
            var r = e.value.parts,
              i = 0,
              s = r.length;
            while (i < s) ((r[i].units || r[i].type === 'percentage') && r[i].value === 0 && r[i].type !== 'time' && t.report("Values of 0 shouldn't have units specified.", r[i].line, r[i].col, n), i++);
          });
        },
      }),
      (function () {
        var e = function (e) {
          return !e || e.constructor !== String
            ? ''
            : e.replace(/[\"&><]/g, function (e) {
                switch (e) {
                  case '"':
                    return '&quot;';
                  case '&':
                    return '&amp;';
                  case '<':
                    return '&lt;';
                  case '>':
                    return '&gt;';
                }
              });
        };
        CSSLint.addFormatter({
          id: 'checkstyle-xml',
          name: 'Checkstyle XML format',
          startFormat: function () {
            return '<?xml version="1.0" encoding="utf-8"?><checkstyle>';
          },
          endFormat: function () {
            return '</checkstyle>';
          },
          readError: function (t, n) {
            return '<file name="' + e(t) + '"><error line="0" column="0" severty="error" message="' + e(n) + '"></error></file>';
          },
          formatResults: function (t, n) {
            var r = t.messages,
              i = [],
              s = function (e) {
                return !!e && 'name' in e ? 'net.csslint.' + e.name.replace(/\s/g, '') : '';
              };
            return (
              r.length > 0 &&
                (i.push('<file name="' + n + '">'),
                CSSLint.Util.forEach(r, function (t) {
                  t.rollup || i.push('<error line="' + t.line + '" column="' + t.col + '" severity="' + t.type + '"' + ' message="' + e(t.message) + '" source="' + s(t.rule) + '"/>');
                }),
                i.push('</file>')),
              i.join('')
            );
          },
        });
      })(),
      CSSLint.addFormatter({
        id: 'compact',
        name: "Compact, 'porcelain' format",
        startFormat: function () {
          return '';
        },
        endFormat: function () {
          return '';
        },
        formatResults: function (e, t, n) {
          var r = e.messages,
            i = '';
          n = n || {};
          var s = function (e) {
            return e.charAt(0).toUpperCase() + e.slice(1);
          };
          return r.length === 0
            ? n.quiet
              ? ''
              : t + ': Lint Free!'
            : (CSSLint.Util.forEach(r, function (e) {
                e.rollup ? (i += t + ': ' + s(e.type) + ' - ' + e.message + '\n') : (i += t + ': ' + 'line ' + e.line + ', col ' + e.col + ', ' + s(e.type) + ' - ' + e.message + ' (' + e.rule.id + ')\n');
              }),
              i);
        },
      }),
      CSSLint.addFormatter({
        id: 'csslint-xml',
        name: 'CSSLint XML format',
        startFormat: function () {
          return '<?xml version="1.0" encoding="utf-8"?><csslint>';
        },
        endFormat: function () {
          return '</csslint>';
        },
        formatResults: function (e, t) {
          var n = e.messages,
            r = [],
            i = function (e) {
              return !e || e.constructor !== String ? '' : e.replace(/\"/g, "'").replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
            };
          return (
            n.length > 0 &&
              (r.push('<file name="' + t + '">'),
              CSSLint.Util.forEach(n, function (e) {
                e.rollup ? r.push('<issue severity="' + e.type + '" reason="' + i(e.message) + '" evidence="' + i(e.evidence) + '"/>') : r.push('<issue line="' + e.line + '" char="' + e.col + '" severity="' + e.type + '"' + ' reason="' + i(e.message) + '" evidence="' + i(e.evidence) + '"/>');
              }),
              r.push('</file>')),
            r.join('')
          );
        },
      }),
      CSSLint.addFormatter({
        id: 'junit-xml',
        name: 'JUNIT XML format',
        startFormat: function () {
          return '<?xml version="1.0" encoding="utf-8"?><testsuites>';
        },
        endFormat: function () {
          return '</testsuites>';
        },
        formatResults: function (e, t) {
          var n = e.messages,
            r = [],
            i = { error: 0, failure: 0 },
            s = function (e) {
              return !!e && 'name' in e ? 'net.csslint.' + e.name.replace(/\s/g, '') : '';
            },
            o = function (e) {
              return !e || e.constructor !== String ? '' : e.replace(/\"/g, "'").replace(/</g, '&lt;').replace(/>/g, '&gt;');
            };
          return (
            n.length > 0 &&
              (n.forEach(function (e) {
                var t = e.type === 'warning' ? 'error' : e.type;
                e.rollup || (r.push('<testcase time="0" name="' + s(e.rule) + '">'), r.push('<' + t + ' message="' + o(e.message) + '"><![CDATA[' + e.line + ':' + e.col + ':' + o(e.evidence) + ']]></' + t + '>'), r.push('</testcase>'), (i[t] += 1));
              }),
              r.unshift('<testsuite time="0" tests="' + n.length + '" skipped="0" errors="' + i.error + '" failures="' + i.failure + '" package="net.csslint" name="' + t + '">'),
              r.push('</testsuite>')),
            r.join('')
          );
        },
      }),
      CSSLint.addFormatter({
        id: 'lint-xml',
        name: 'Lint XML format',
        startFormat: function () {
          return '<?xml version="1.0" encoding="utf-8"?><lint>';
        },
        endFormat: function () {
          return '</lint>';
        },
        formatResults: function (e, t) {
          var n = e.messages,
            r = [],
            i = function (e) {
              return !e || e.constructor !== String ? '' : e.replace(/\"/g, "'").replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
            };
          return (
            n.length > 0 &&
              (r.push('<file name="' + t + '">'),
              CSSLint.Util.forEach(n, function (e) {
                e.rollup ? r.push('<issue severity="' + e.type + '" reason="' + i(e.message) + '" evidence="' + i(e.evidence) + '"/>') : r.push('<issue line="' + e.line + '" char="' + e.col + '" severity="' + e.type + '"' + ' reason="' + i(e.message) + '" evidence="' + i(e.evidence) + '"/>');
              }),
              r.push('</file>')),
            r.join('')
          );
        },
      }),
      CSSLint.addFormatter({
        id: 'text',
        name: 'Plain Text',
        startFormat: function () {
          return '';
        },
        endFormat: function () {
          return '';
        },
        formatResults: function (e, t, n) {
          var r = e.messages,
            i = '';
          n = n || {};
          if (r.length === 0) return n.quiet ? '' : '\n\ncsslint: No errors in ' + t + '.';
          ((i = '\n\ncsslint: There '), r.length === 1 ? (i += 'is 1 problem') : (i += 'are ' + r.length + ' problems'), (i += ' in ' + t + '.'));
          var s = t.lastIndexOf('/'),
            o = t;
          return (
            s === -1 && (s = t.lastIndexOf('\\')),
            s > -1 && (o = t.substring(s + 1)),
            CSSLint.Util.forEach(r, function (e, t) {
              ((i = i + '\n\n' + o), e.rollup ? ((i += '\n' + (t + 1) + ': ' + e.type), (i += '\n' + e.message)) : ((i += '\n' + (t + 1) + ': ' + e.type + ' at line ' + e.line + ', col ' + e.col), (i += '\n' + e.message), (i += '\n' + e.evidence)));
            }),
            i
          );
        },
      }),
      (module.exports.CSSLint = CSSLint));
  }),
  ace.define('ace/mode/css_worker', ['require', 'exports', 'module', 'ace/lib/oop', 'ace/lib/lang', 'ace/worker/mirror', 'ace/mode/css/csslint'], function (e, t, n) {
    'use strict';
    var r = e('../lib/oop'),
      i = e('../lib/lang'),
      s = e('../worker/mirror').Mirror,
      o = e('./css/csslint').CSSLint,
      u = (t.Worker = function (e) {
        (s.call(this, e), this.setTimeout(400), (this.ruleset = null), this.setDisabledRules('ids|order-alphabetical'), this.setInfoRules('adjoining-classes|qualified-headings|zero-units|gradients|import|outline-none|vendor-prefix'));
      });
    (r.inherits(u, s),
      function () {
        ((this.setInfoRules = function (e) {
          (typeof e == 'string' && (e = e.split('|')), (this.infoRules = i.arrayToMap(e)), this.doc.getValue() && this.deferredUpdate.schedule(100));
        }),
          (this.setDisabledRules = function (e) {
            if (!e) this.ruleset = null;
            else {
              typeof e == 'string' && (e = e.split('|'));
              var t = {};
              (o.getRules().forEach(function (e) {
                t[e.id] = !0;
              }),
                e.forEach(function (e) {
                  delete t[e];
                }),
                (this.ruleset = t));
            }
            this.doc.getValue() && this.deferredUpdate.schedule(100);
          }),
          (this.onUpdate = function () {
            var e = this.doc.getValue();
            if (!e) return this.sender.emit('annotate', []);
            var t = this.infoRules,
              n = o.verify(e, this.ruleset);
            this.sender.emit(
              'annotate',
              n.messages.map(function (e) {
                return { row: e.line - 1, column: e.col - 1, text: e.message, type: t[e.rule.id] ? 'info' : e.type, rule: e.rule.name };
              })
            );
          }));
      }.call(u.prototype));
  }),
  ace.define('ace/lib/es5-shim', ['require', 'exports', 'module'], function (e, t, n) {
    function r() {}
    function w(e) {
      try {
        return (Object.defineProperty(e, 'sentinel', {}), 'sentinel' in e);
      } catch (t) {}
    }
    function H(e) {
      return ((e = +e), e !== e ? (e = 0) : e !== 0 && e !== 1 / 0 && e !== -1 / 0 && (e = (e > 0 || -1) * Math.floor(Math.abs(e))), e);
    }
    function B(e) {
      var t = typeof e;
      return e === null || t === 'undefined' || t === 'boolean' || t === 'number' || t === 'string';
    }
    function j(e) {
      var t, n, r;
      if (B(e)) return e;
      n = e.valueOf;
      if (typeof n == 'function') {
        t = n.call(e);
        if (B(t)) return t;
      }
      r = e.toString;
      if (typeof r == 'function') {
        t = r.call(e);
        if (B(t)) return t;
      }
      throw new TypeError();
    }
    Function.prototype.bind ||
      (Function.prototype.bind = function (t) {
        var n = this;
        if (typeof n != 'function') throw new TypeError('Function.prototype.bind called on incompatible ' + n);
        var i = u.call(arguments, 1),
          s = function () {
            if (this instanceof s) {
              var e = n.apply(this, i.concat(u.call(arguments)));
              return Object(e) === e ? e : this;
            }
            return n.apply(t, i.concat(u.call(arguments)));
          };
        return (n.prototype && ((r.prototype = n.prototype), (s.prototype = new r()), (r.prototype = null)), s);
      });
    var i = Function.prototype.call,
      s = Array.prototype,
      o = Object.prototype,
      u = s.slice,
      a = i.bind(o.toString),
      f = i.bind(o.hasOwnProperty),
      l,
      c,
      h,
      p,
      d;
    if ((d = f(o, '__defineGetter__'))) ((l = i.bind(o.__defineGetter__)), (c = i.bind(o.__defineSetter__)), (h = i.bind(o.__lookupGetter__)), (p = i.bind(o.__lookupSetter__)));
    if ([1, 2].splice(0).length != 2)
      if (
        !(function () {
          function e(e) {
            var t = new Array(e + 2);
            return ((t[0] = t[1] = 0), t);
          }
          var t = [],
            n;
          (t.splice.apply(t, e(20)), t.splice.apply(t, e(26)), (n = t.length), t.splice(5, 0, 'XXX'), n + 1 == t.length);
          if (n + 1 == t.length) return !0;
        })()
      )
        Array.prototype.splice = function (e, t) {
          var n = this.length;
          (e > 0 ? e > n && (e = n) : e == void 0 ? (e = 0) : e < 0 && (e = Math.max(n + e, 0)), e + t < n || (t = n - e));
          var r = this.slice(e, e + t),
            i = u.call(arguments, 2),
            s = i.length;
          if (e === n) s && this.push.apply(this, i);
          else {
            var o = Math.min(t, n - e),
              a = e + o,
              f = a + s - o,
              l = n - a,
              c = n - o;
            if (f < a) for (var h = 0; h < l; ++h) this[f + h] = this[a + h];
            else if (f > a) for (h = l; h--; ) this[f + h] = this[a + h];
            if (s && e === c) ((this.length = c), this.push.apply(this, i));
            else {
              this.length = c + s;
              for (h = 0; h < s; ++h) this[e + h] = i[h];
            }
          }
          return r;
        };
      else {
        var v = Array.prototype.splice;
        Array.prototype.splice = function (e, t) {
          return arguments.length ? v.apply(this, [e === void 0 ? 0 : e, t === void 0 ? this.length - e : t].concat(u.call(arguments, 2))) : [];
        };
      }
    Array.isArray ||
      (Array.isArray = function (t) {
        return a(t) == '[object Array]';
      });
    var m = Object('a'),
      g = m[0] != 'a' || !(0 in m);
    (Array.prototype.forEach ||
      (Array.prototype.forEach = function (t) {
        var n = F(this),
          r = g && a(this) == '[object String]' ? this.split('') : n,
          i = arguments[1],
          s = -1,
          o = r.length >>> 0;
        if (a(t) != '[object Function]') throw new TypeError();
        while (++s < o) s in r && t.call(i, r[s], s, n);
      }),
      Array.prototype.map ||
        (Array.prototype.map = function (t) {
          var n = F(this),
            r = g && a(this) == '[object String]' ? this.split('') : n,
            i = r.length >>> 0,
            s = Array(i),
            o = arguments[1];
          if (a(t) != '[object Function]') throw new TypeError(t + ' is not a function');
          for (var u = 0; u < i; u++) u in r && (s[u] = t.call(o, r[u], u, n));
          return s;
        }),
      Array.prototype.filter ||
        (Array.prototype.filter = function (t) {
          var n = F(this),
            r = g && a(this) == '[object String]' ? this.split('') : n,
            i = r.length >>> 0,
            s = [],
            o,
            u = arguments[1];
          if (a(t) != '[object Function]') throw new TypeError(t + ' is not a function');
          for (var f = 0; f < i; f++) f in r && ((o = r[f]), t.call(u, o, f, n) && s.push(o));
          return s;
        }),
      Array.prototype.every ||
        (Array.prototype.every = function (t) {
          var n = F(this),
            r = g && a(this) == '[object String]' ? this.split('') : n,
            i = r.length >>> 0,
            s = arguments[1];
          if (a(t) != '[object Function]') throw new TypeError(t + ' is not a function');
          for (var o = 0; o < i; o++) if (o in r && !t.call(s, r[o], o, n)) return !1;
          return !0;
        }),
      Array.prototype.some ||
        (Array.prototype.some = function (t) {
          var n = F(this),
            r = g && a(this) == '[object String]' ? this.split('') : n,
            i = r.length >>> 0,
            s = arguments[1];
          if (a(t) != '[object Function]') throw new TypeError(t + ' is not a function');
          for (var o = 0; o < i; o++) if (o in r && t.call(s, r[o], o, n)) return !0;
          return !1;
        }),
      Array.prototype.reduce ||
        (Array.prototype.reduce = function (t) {
          var n = F(this),
            r = g && a(this) == '[object String]' ? this.split('') : n,
            i = r.length >>> 0;
          if (a(t) != '[object Function]') throw new TypeError(t + ' is not a function');
          if (!i && arguments.length == 1) throw new TypeError('reduce of empty array with no initial value');
          var s = 0,
            o;
          if (arguments.length >= 2) o = arguments[1];
          else
            do {
              if (s in r) {
                o = r[s++];
                break;
              }
              if (++s >= i) throw new TypeError('reduce of empty array with no initial value');
            } while (!0);
          for (; s < i; s++) s in r && (o = t.call(void 0, o, r[s], s, n));
          return o;
        }),
      Array.prototype.reduceRight ||
        (Array.prototype.reduceRight = function (t) {
          var n = F(this),
            r = g && a(this) == '[object String]' ? this.split('') : n,
            i = r.length >>> 0;
          if (a(t) != '[object Function]') throw new TypeError(t + ' is not a function');
          if (!i && arguments.length == 1) throw new TypeError('reduceRight of empty array with no initial value');
          var s,
            o = i - 1;
          if (arguments.length >= 2) s = arguments[1];
          else
            do {
              if (o in r) {
                s = r[o--];
                break;
              }
              if (--o < 0) throw new TypeError('reduceRight of empty array with no initial value');
            } while (!0);
          do o in this && (s = t.call(void 0, s, r[o], o, n));
          while (o--);
          return s;
        }));
    if (!Array.prototype.indexOf || [0, 1].indexOf(1, 2) != -1)
      Array.prototype.indexOf = function (t) {
        var n = g && a(this) == '[object String]' ? this.split('') : F(this),
          r = n.length >>> 0;
        if (!r) return -1;
        var i = 0;
        (arguments.length > 1 && (i = H(arguments[1])), (i = i >= 0 ? i : Math.max(0, r + i)));
        for (; i < r; i++) if (i in n && n[i] === t) return i;
        return -1;
      };
    if (!Array.prototype.lastIndexOf || [0, 1].lastIndexOf(0, -3) != -1)
      Array.prototype.lastIndexOf = function (t) {
        var n = g && a(this) == '[object String]' ? this.split('') : F(this),
          r = n.length >>> 0;
        if (!r) return -1;
        var i = r - 1;
        (arguments.length > 1 && (i = Math.min(i, H(arguments[1]))), (i = i >= 0 ? i : r - Math.abs(i)));
        for (; i >= 0; i--) if (i in n && t === n[i]) return i;
        return -1;
      };
    Object.getPrototypeOf ||
      (Object.getPrototypeOf = function (t) {
        return t.__proto__ || (t.constructor ? t.constructor.prototype : o);
      });
    if (!Object.getOwnPropertyDescriptor) {
      var y = 'Object.getOwnPropertyDescriptor called on a non-object: ';
      Object.getOwnPropertyDescriptor = function (t, n) {
        if ((typeof t != 'object' && typeof t != 'function') || t === null) throw new TypeError(y + t);
        if (!f(t, n)) return;
        var r, i, s;
        r = { enumerable: !0, configurable: !0 };
        if (d) {
          var u = t.__proto__;
          t.__proto__ = o;
          var i = h(t, n),
            s = p(t, n);
          t.__proto__ = u;
          if (i || s) return (i && (r.get = i), s && (r.set = s), r);
        }
        return ((r.value = t[n]), r);
      };
    }
    Object.getOwnPropertyNames ||
      (Object.getOwnPropertyNames = function (t) {
        return Object.keys(t);
      });
    if (!Object.create) {
      var b;
      (Object.prototype.__proto__ === null
        ? (b = function () {
            return { __proto__: null };
          })
        : (b = function () {
            var e = {};
            for (var t in e) e[t] = null;
            return ((e.constructor = e.hasOwnProperty = e.propertyIsEnumerable = e.isPrototypeOf = e.toLocaleString = e.toString = e.valueOf = e.__proto__ = null), e);
          }),
        (Object.create = function (t, n) {
          var r;
          if (t === null) r = b();
          else {
            if (typeof t != 'object') throw new TypeError('typeof prototype[' + typeof t + "] != 'object'");
            var i = function () {};
            ((i.prototype = t), (r = new i()), (r.__proto__ = t));
          }
          return (n !== void 0 && Object.defineProperties(r, n), r);
        }));
    }
    if (Object.defineProperty) {
      var E = w({}),
        S = typeof document == 'undefined' || w(document.createElement('div'));
      if (!E || !S) var x = Object.defineProperty;
    }
    if (!Object.defineProperty || x) {
      var T = 'Property description must be an object: ',
        N = 'Object.defineProperty called on non-object: ',
        C = 'getters & setters can not be defined on this javascript engine';
      Object.defineProperty = function (t, n, r) {
        if ((typeof t != 'object' && typeof t != 'function') || t === null) throw new TypeError(N + t);
        if ((typeof r != 'object' && typeof r != 'function') || r === null) throw new TypeError(T + r);
        if (x)
          try {
            return x.call(Object, t, n, r);
          } catch (i) {}
        if (f(r, 'value'))
          if (d && (h(t, n) || p(t, n))) {
            var s = t.__proto__;
            ((t.__proto__ = o), delete t[n], (t[n] = r.value), (t.__proto__ = s));
          } else t[n] = r.value;
        else {
          if (!d) throw new TypeError(C);
          (f(r, 'get') && l(t, n, r.get), f(r, 'set') && c(t, n, r.set));
        }
        return t;
      };
    }
    (Object.defineProperties ||
      (Object.defineProperties = function (t, n) {
        for (var r in n) f(n, r) && Object.defineProperty(t, r, n[r]);
        return t;
      }),
      Object.seal ||
        (Object.seal = function (t) {
          return t;
        }),
      Object.freeze ||
        (Object.freeze = function (t) {
          return t;
        }));
    try {
      Object.freeze(function () {});
    } catch (k) {
      Object.freeze = (function (t) {
        return function (n) {
          return typeof n == 'function' ? n : t(n);
        };
      })(Object.freeze);
    }
    (Object.preventExtensions ||
      (Object.preventExtensions = function (t) {
        return t;
      }),
      Object.isSealed ||
        (Object.isSealed = function (t) {
          return !1;
        }),
      Object.isFrozen ||
        (Object.isFrozen = function (t) {
          return !1;
        }),
      Object.isExtensible ||
        (Object.isExtensible = function (t) {
          if (Object(t) === t) throw new TypeError();
          var n = '';
          while (f(t, n)) n += '?';
          t[n] = !0;
          var r = f(t, n);
          return (delete t[n], r);
        }));
    if (!Object.keys) {
      var L = !0,
        A = ['toString', 'toLocaleString', 'valueOf', 'hasOwnProperty', 'isPrototypeOf', 'propertyIsEnumerable', 'constructor'],
        O = A.length;
      for (var M in { toString: null }) L = !1;
      Object.keys = function I(e) {
        if ((typeof e != 'object' && typeof e != 'function') || e === null) throw new TypeError('Object.keys called on a non-object');
        var I = [];
        for (var t in e) f(e, t) && I.push(t);
        if (L)
          for (var n = 0, r = O; n < r; n++) {
            var i = A[n];
            f(e, i) && I.push(i);
          }
        return I;
      };
    }
    Date.now ||
      (Date.now = function () {
        return new Date().getTime();
      });
    var _ = '	\n\f\r \u00a0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029\ufeff';
    if (!String.prototype.trim || _.trim()) {
      _ = '[' + _ + ']';
      var D = new RegExp('^' + _ + _ + '*'),
        P = new RegExp(_ + _ + '*$');
      String.prototype.trim = function () {
        return String(this).replace(D, '').replace(P, '');
      };
    }
    var F = function (e) {
      if (e == null) throw new TypeError("can't convert " + e + ' to object');
      return Object(e);
    };
  }));
