'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.slice(0, r.length).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), (r = e.sender = e.initSender())
			var s = require(i.module)[i.classname]
			n = e.main = new s(r)
		}
	}
})(this),
	ace.define('ace/lib/oop', [], 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', [], 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', [], 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', [], 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', [], 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
				this.on(e, function r() {
					n.off(e, r), t.apply(null, arguments)
				})
				if (!t)
					return new Promise(function (e) {
						t = e
					})
			}),
			(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) r && this.setDefaultHandler(e, r.pop())
				else if (r) {
					var i = r.indexOf(t)
					i != -1 && r.splice(i, 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) {
				e || (this._eventRegistry = this._defaultHandlers = undefined),
					this._eventRegistry && (this._eventRegistry[e] = undefined),
					this._defaultHandlers && (this._defaultHandlers[e] = undefined)
			}),
			(t.EventEmitter = r)
	}),
	ace.define('ace/anchor', [], 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.off('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', [], 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.$safeApplyDelta = function (e) {
					var t = this.$lines.length
					;((e.action == 'remove' && e.start.row < t && e.end.row < t) ||
						(e.action == 'insert' && e.start.row <= t)) &&
						this.applyDelta(e)
				}),
				(this.$splitAndapplyLargeDelta = function (e, t) {
					var n = e.lines,
						r = n.length - t + 1,
						i = e.start.row,
						s = e.start.column
					for (var o = 0, u = 0; o < r; o = u) {
						u += t - 1
						var a = n.slice(o, u)
						a.push(''),
							this.applyDelta(
								{
									start: this.pos(i + o, s),
									end: this.pos(i + u, (s = 0)),
									action: e.action,
									lines: a,
								},
								!0
							)
					}
					;(e.lines = n.slice(o)),
						(e.start.row = i + o),
						(e.start.column = s),
						this.applyDelta(e, !0)
				}),
				(this.revertDelta = function (e) {
					this.$safeApplyDelta({
						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: e + n[s - 1].length + r }
				}),
				(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', [], 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', [], 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 'fr':
							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),
										this._readWhitespace(),
										(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-gap': 1,
					'grid-row-span': '<integer>',
					'grid-row-sizing': 1,
					'grid-template': 1,
					'grid-template-areas': 1,
					'grid-template-columns': 1,
					'grid-template-rows': 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',
					'max-zoom': '<number> | <percentage> | auto',
					'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',
					'min-zoom': '<number> | <percentage> | auto',
					'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',
					'user-zoom': 'zoom | fixed',
					'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$|^fr$|^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', [], 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)
	})
