if (Function.prototype.name === undefined && Object.defineProperty !== undefined) {
  Object.defineProperty(Function.prototype, "name", {
    get: function () {
      var regex = /function\s([^(]{1,})\(/, match = regex.exec(this.toString());
      return match && match.length > 1 ? match[1].trim() : ""
    },
  })
}
if (String.prototype.trimRight === undefined) {
  String.prototype.trimRight = function () {
    return String(this).replace(/\s+$/, "")
  }
}
var stylus = function () {
  function require(p) {
    var path = require.resolve(p), mod = require.modules[path];
    if (!mod) throw new Error('failed to require "' + p + '"');
    if (!mod.exports) {
      mod.exports = {};
      mod.call(mod.exports, mod, mod.exports, require.relative(path))
    }
    return mod.exports
  }

  var bifs = "called-from = ()\n\nvendors = moz webkit o ms official\n\n// stringify the given arg\n\n-string(arg)\n  type(arg) + ' ' + arg\n\n// require a color\n\nrequire-color(color)\n  unless color is a 'color'\n    error('RGB or HSL value expected, got a ' + -string(color))\n\n// require a unit\n\nrequire-unit(n)\n  unless n is a 'unit'\n    error('unit expected, got a ' + -string(n))\n\n// require a string\n\nrequire-string(str)\n  unless str is a 'string' or str is a 'ident'\n    error('string expected, got a ' + -string(str))\n\n// Math functions\n\nabs(n) { math(n, 'abs') }\nmin(a, b) { a < b ? a : b }\nmax(a, b) { a > b ? a : b }\n\n// Trigonometrics\nPI = -math-prop('PI')\n\nradians-to-degrees(angle)\n  angle * (180 / PI)\n\ndegrees-to-radians(angle)\n  unit(angle * (PI / 180),'')\n\nsin(n)\n  n = degrees-to-radians(n) if unit(n) == 'deg'\n  round(math(n, 'sin'), 9)\n\ncos(n)\n  n = degrees-to-radians(n) if unit(n) == 'deg'\n  round(math(n, 'cos'), 9)\n\n// Rounding Math functions\n\nceil(n, precision = 0)\n  multiplier = 10 ** precision\n  math(n * multiplier, 'ceil') / multiplier\n\nfloor(n, precision = 0)\n  multiplier = 10 ** precision\n  math(n * multiplier, 'floor') / multiplier\n\nround(n, precision = 0)\n  multiplier = 10 ** precision\n  math(n * multiplier, 'round') / multiplier\n\n// return the sum of the given numbers\n\nsum(nums)\n  sum = 0\n  sum += n for n in nums\n\n// return the average of the given numbers\n\navg(nums)\n  sum(nums) / length(nums)\n\n// return a unitless number, or pass through\n\nremove-unit(n)\n  if typeof(n) is 'unit'\n    unit(n, '')\n  else\n    n\n\n// convert a percent to a decimal, or pass through\n\npercent-to-decimal(n)\n  if unit(n) is '%'\n    remove-unit(n) / 100\n  else\n    n\n\n// check if n is an odd number\n\nodd(n)\n  1 == n % 2\n\n// check if n is an even number\n\neven(n)\n  0 == n % 2\n\n// check if color is light\n\nlight(color)\n  lightness(color) >= 50%\n\n// check if color is dark\n\ndark(color)\n  lightness(color) < 50%\n\n// desaturate color by amount\n\ndesaturate(color, amount)\n  adjust(color, 'saturation', - amount)\n\n// saturate color by amount\n\nsaturate(color = '', amount = 100%)\n  if color is a 'color'\n    adjust(color, 'saturation', amount)\n  else\n    unquote( 'saturate(' + color + ')' )\n\n// darken by the given amount\n\ndarken(color, amount)\n  adjust(color, 'lightness', - amount)\n\n// lighten by the given amount\n\nlighten(color, amount)\n  adjust(color, 'lightness', amount)\n\n// decrease opacity by amount\n\nfade-out(color, amount)\n  color - rgba(black, percent-to-decimal(amount))\n\n// increase opacity by amount\n\nfade-in(color, amount)\n  color + rgba(black, percent-to-decimal(amount))\n\n// spin hue by a given amount\n\nspin(color, amount)\n  color + unit(amount, deg)\n\n// mix two colors by a given amount\n\nmix(color1, color2, weight = 50%)\n  unless weight in 0..100\n    error('Weight must be between 0% and 100%')\n\n  if length(color1) == 2\n    weight = color1[0]\n    color1 = color1[1]\n\n  else if length(color2) == 2\n    weight = 100 - color2[0]\n    color2 = color2[1]\n\n  require-color(color1)\n  require-color(color2)\n\n  p = unit(weight / 100, '')\n  w = p * 2 - 1\n\n  a = alpha(color1) - alpha(color2)\n\n  w1 = (((w * a == -1) ? w : (w + a) / (1 + w * a)) + 1) / 2\n  w2 = 1 - w1\n\n  channels = (red(color1) red(color2)) (green(color1) green(color2)) (blue(color1) blue(color2))\n  rgb = ()\n\n  for pair in channels\n    push(rgb, floor(pair[0] * w1 + pair[1] * w2))\n\n  a1 = alpha(color1) * p\n  a2 = alpha(color2) * (1 - p)\n  alpha = a1 + a2\n\n  rgba(rgb[0], rgb[1], rgb[2], alpha)\n\n// invert colors, leave alpha intact\n\ninvert(color = '')\n  if color is a 'color'\n    rgba(#fff - color, alpha(color))\n  else\n    unquote( 'invert(' + color + ')' )\n\n// give complement of the given color\n\ncomplement( color )\n  spin( color, 180 )\n\n// give grayscale of the given color\n\ngrayscale( color = '' )\n  if color is a 'color'\n    desaturate( color, 100% )\n  else\n    unquote( 'grayscale(' + color + ')' )\n\n// mix the given color with white\n\ntint( color, percent )\n  mix( white, color, percent )\n\n// mix the given color with black\n\nshade( color, percent )\n  mix( black, color, percent )\n\n// return the last value in the given expr\n\nlast(expr)\n  expr[length(expr) - 1]\n\n// return keys in the given pairs or object\n\nkeys(pairs)\n  ret = ()\n  if type(pairs) == 'object'\n    for key in pairs\n      push(ret, key)\n  else\n    for pair in pairs\n      push(ret, pair[0]);\n  ret\n\n// return values in the given pairs or object\n\nvalues(pairs)\n  ret = ()\n  if type(pairs) == 'object'\n    for key, val in pairs\n      push(ret, val)\n  else\n    for pair in pairs\n      push(ret, pair[1]);\n  ret\n\n// join values with the given delimiter\n\njoin(delim, vals...)\n  buf = ''\n  vals = vals[0] if length(vals) == 1\n  for val, i in vals\n    buf += i ? delim + val : val\n\n// add a CSS rule to the containing block\n\n// - This definition allows add-property to be used as a mixin\n// - It has the same effect as interpolation but allows users\n//   to opt for a functional style\n\nadd-property-function = add-property\nadd-property(name, expr)\n  if mixin\n    {name} expr\n  else\n    add-property-function(name, expr)\n\nprefix-classes(prefix)\n  -prefix-classes(prefix, block)\n\n// Caching mixin, use inside your functions to enable caching by extending.\n\n$stylus_mixin_cache = {}\ncache()\n  $key = (current-media() or 'no-media') + '__' + called-from[0] + '__' + arguments\n  if $key in $stylus_mixin_cache\n    @extend {'$cache_placeholder_for_' + $stylus_mixin_cache[$key]}\n  else if 'cache' in called-from\n    {block}\n  else\n    $id = length($stylus_mixin_cache)\n\n    &,\n    /$cache_placeholder_for_{$id}\n      $stylus_mixin_cache[$key] = $id\n      {block}\n\n// Percentage function to convert a number, e.g. '.45', into a percentage, e.g. '45%'\n\npercentage(num)\n  return unit(num * 100, '%')\n\n// Returns the position of a `value` within a `list`\n\nindex(list, value)\n  for val, i in list\n    return i if val == value\n";
  require.modules = {};
  require.resolve = function (path) {
    var orig = path, reg = path + ".js", index = path + "/index.js";
    return require.modules[reg] && reg || require.modules[index] && index || orig
  };
  require.register = function (path, fn) {
    require.modules[path] = fn
  };
  require.relative = function (parent) {
    return function (p) {
      if ("." != p[0]) return require(p);
      var path = parent.split("/"), segs = p.split("/");
      path.pop();
      for (var i = 0; i < segs.length; i++) {
        var seg = segs[i];
        if (".." == seg) path.pop(); else if ("." != seg) path.push(seg)
      }
      return require(path.join("/"))
    }
  };
  require.register("path.js", function (module, exports, require) {
    var isWindows = false;

    function normalizeArray(parts, allowAboveRoot) {
      var up = 0;
      for (var i = parts.length - 1; i >= 0; i--) {
        var last = parts[i];
        if (last == ".") {parts.splice(i, 1)} else if (last === "..") {
          parts.splice(i, 1);
          up++
        } else if (up) {
          parts.splice(i, 1);
          up--
        }
      }
      if (allowAboveRoot) {for (; up--; up) {parts.unshift("..")}}
      return parts
    }

    var splitPathRe = /^([\s\S]+\/(?!$)|\/)?((?:[\s\S]+?)?(\.[^.]*)?)$/;
    exports.normalize = function (path) {
      var isAbsolute = path.charAt(0) === "/", trailingSlash = path.slice(-1) === "/";
      path = normalizeArray(path.split("/").filter(function (p) {
        return !!p
      }), !isAbsolute).join("/");
      if (!path && !isAbsolute) {path = "."}
      if (path && trailingSlash) {path += "/"}
      return (isAbsolute ? "/" : "") + path
    };
    exports.join = function () {
      var paths = Array.prototype.slice.call(arguments, 0);
      return exports.normalize(paths.filter(function (p, index) {
        return p && typeof p === "string"
      }).join("/"))
    };
    exports.relative = function (from, to) {
      from = exports.resolve(from).substr(1);
      to = exports.resolve(to).substr(1);

      function trim(arr) {
        var start = 0;
        for (; start < arr.length; start++) {if (arr[start] !== "") break}
        var end = arr.length - 1;
        for (; end >= 0; end--) {if (arr[end] !== "") break}
        if (start > end) return [];
        return arr.slice(start, end - start + 1)
      }

      var fromParts = trim(from.split("/"));
      var toParts = trim(to.split("/"));
      var length = Math.min(fromParts.length, toParts.length);
      var samePartsLength = length;
      for (var i = 0; i < length; i++) {
        if (fromParts[i] !== toParts[i]) {
          samePartsLength = i;
          break
        }
      }
      var outputParts = [];
      for (var i = samePartsLength; i < fromParts.length; i++) {outputParts.push("..")}
      outputParts = outputParts.concat(toParts.slice(samePartsLength));
      return outputParts.join("/")
    };
    exports.dirname = function (path) {
      var dir = splitPathRe.exec(path)[1] || "";
      if (!dir) {return "."} else if (dir.length === 1 || isWindows && dir.length <= 3 && dir.charAt(1) === ":") {return dir} else {return dir.substring(0, dir.length - 1)}
    };
    exports.basename = function (path, ext) {
      var f = splitPathRe.exec(path)[2] || "";
      if (ext && f.substr(-1 * ext.length) === ext) {f = f.substr(0, f.length - ext.length)}
      return f
    };
    exports.extname = function (path) {
      return splitPathRe.exec(path)[3] || ""
    }
  });
  require.register("colors.js", function (module, exports, require) {
    module.exports = {
      aliceblue:         [240, 248, 255, 1], antiquewhite: [250, 235, 215, 1], aqua: [0, 255, 255, 1],
      aquamarine:        [127, 255, 212, 1], azure: [240, 255, 255, 1], beige: [245, 245, 220, 1],
      bisque:            [255, 228, 196, 1], black: [0, 0, 0, 1], blanchedalmond: [255, 235, 205, 1],
      blue:              [0, 0, 255, 1], blueviolet: [138, 43, 226, 1], brown: [165, 42, 42, 1],
      burlywood:         [222, 184, 135, 1], cadetblue: [95, 158, 160, 1], chartreuse: [127, 255, 0, 1],
      chocolate:         [210, 105, 30, 1], coral: [255, 127, 80, 1], cornflowerblue: [100, 149, 237, 1],
      cornsilk:          [255, 248, 220, 1], crimson: [220, 20, 60, 1], cyan: [0, 255, 255, 1],
      darkblue:          [0, 0, 139, 1], darkcyan: [0, 139, 139, 1], darkgoldenrod: [184, 134, 11, 1],
      darkgray:          [169, 169, 169, 1], darkgreen: [0, 100, 0, 1], darkgrey: [169, 169, 169, 1],
      darkkhaki:         [189, 183, 107, 1], darkmagenta: [139, 0, 139, 1], darkolivegreen: [85, 107, 47, 1],
      darkorange:        [255, 140, 0, 1], darkorchid: [153, 50, 204, 1], darkred: [139, 0, 0, 1],
      darksalmon:        [233, 150, 122, 1], darkseagreen: [143, 188, 143, 1], darkslateblue: [72, 61, 139, 1],
      darkslategray:     [47, 79, 79, 1], darkslategrey: [47, 79, 79, 1], darkturquoise: [0, 206, 209, 1],
      darkviolet:        [148, 0, 211, 1], deeppink: [255, 20, 147, 1], deepskyblue: [0, 191, 255, 1],
      dimgray:           [105, 105, 105, 1], dimgrey: [105, 105, 105, 1], dodgerblue: [30, 144, 255, 1],
      firebrick:         [178, 34, 34, 1], floralwhite: [255, 250, 240, 1], forestgreen: [34, 139, 34, 1],
      fuchsia:           [255, 0, 255, 1], gainsboro: [220, 220, 220, 1], ghostwhite: [248, 248, 255, 1],
      gold:              [255, 215, 0, 1], goldenrod: [218, 165, 32, 1], gray: [128, 128, 128, 1],
      green:             [0, 128, 0, 1], greenyellow: [173, 255, 47, 1], grey: [128, 128, 128, 1],
      honeydew:          [240, 255, 240, 1], hotpink: [255, 105, 180, 1], indianred: [205, 92, 92, 1],
      indigo:            [75, 0, 130, 1], ivory: [255, 255, 240, 1], khaki: [240, 230, 140, 1],
      lavender:          [230, 230, 250, 1], lavenderblush: [255, 240, 245, 1], lawngreen: [124, 252, 0, 1],
      lemonchiffon:      [255, 250, 205, 1], lightblue: [173, 216, 230, 1], lightcoral: [240, 128, 128, 1],
      lightcyan:         [224, 255, 255, 1], lightgoldenrodyellow: [250, 250, 210, 1], lightgray: [211, 211, 211, 1],
      lightgreen:        [144, 238, 144, 1], lightgrey: [211, 211, 211, 1], lightpink: [255, 182, 193, 1],
      lightsalmon:       [255, 160, 122, 1], lightseagreen: [32, 178, 170, 1], lightskyblue: [135, 206, 250, 1],
      lightslategray:    [119, 136, 153, 1], lightslategrey: [119, 136, 153, 1], lightsteelblue: [176, 196, 222, 1],
      lightyellow:       [255, 255, 224, 1], lime: [0, 255, 0, 1], limegreen: [50, 205, 50, 1],
      linen:             [250, 240, 230, 1], magenta: [255, 0, 255, 1], maroon: [128, 0, 0, 1],
      mediumaquamarine:  [102, 205, 170, 1], mediumblue: [0, 0, 205, 1], mediumorchid: [186, 85, 211, 1],
      mediumpurple:      [147, 112, 219, 1], mediumseagreen: [60, 179, 113, 1], mediumslateblue: [123, 104, 238, 1],
      mediumspringgreen: [0, 250, 154, 1], mediumturquoise: [72, 209, 204, 1], mediumvioletred: [199, 21, 133, 1],
      midnightblue:      [25, 25, 112, 1], mintcream: [245, 255, 250, 1], mistyrose: [255, 228, 225, 1],
      moccasin:          [255, 228, 181, 1], navajowhite: [255, 222, 173, 1], navy: [0, 0, 128, 1],
      oldlace:           [253, 245, 230, 1], olive: [128, 128, 0, 1], olivedrab: [107, 142, 35, 1],
      orange:            [255, 165, 0, 1], orangered: [255, 69, 0, 1], orchid: [218, 112, 214, 1],
      palegoldenrod:     [238, 232, 170, 1], palegreen: [152, 251, 152, 1], paleturquoise: [175, 238, 238, 1],
      palevioletred:     [219, 112, 147, 1], papayawhip: [255, 239, 213, 1], peachpuff: [255, 218, 185, 1],
      peru:              [205, 133, 63, 1], pink: [255, 192, 203, 1], plum: [221, 160, 221, 1],
      powderblue:        [176, 224, 230, 1], purple: [128, 0, 128, 1], red: [255, 0, 0, 1],
      rosybrown:         [188, 143, 143, 1], royalblue: [65, 105, 225, 1], saddlebrown: [139, 69, 19, 1],
      salmon:            [250, 128, 114, 1], sandybrown: [244, 164, 96, 1], seagreen: [46, 139, 87, 1],
      seashell:          [255, 245, 238, 1], sienna: [160, 82, 45, 1], silver: [192, 192, 192, 1],
      skyblue:           [135, 206, 235, 1], slateblue: [106, 90, 205, 1], slategray: [112, 128, 144, 1],
      slategrey:         [112, 128, 144, 1], snow: [255, 250, 250, 1], springgreen: [0, 255, 127, 1],
      steelblue:         [70, 130, 180, 1], tan: [210, 180, 140, 1], teal: [0, 128, 128, 1],
      thistle:           [216, 191, 216, 1], tomato: [255, 99, 71, 1], transparent: [0, 0, 0, 0],
      turquoise:         [64, 224, 208, 1], violet: [238, 130, 238, 1], wheat: [245, 222, 179, 1],
      white:             [255, 255, 255, 1], whitesmoke: [245, 245, 245, 1], yellow: [255, 255, 0, 1],
      yellowgreen:       [154, 205, 50, 1], rebeccapurple: [102, 51, 153, 1],
    }
  });
  require.register("errors.js", function (module, exports, require) {
    exports.ParseError = ParseError;
    exports.SyntaxError = SyntaxError;
    SyntaxError.prototype.__proto__ = Error.prototype;

    function ParseError(msg) {
      this.name = "ParseError";
      this.message = msg;
      Error.captureStackTrace(this, ParseError)
    }

    ParseError.prototype.__proto__ = Error.prototype;

    function SyntaxError(msg) {
      this.name = "SyntaxError";
      this.message = msg;
      Error.captureStackTrace(this, ParseError)
    }

    SyntaxError.prototype.__proto__ = Error.prototype
  });
  require.register("units.js", function (module, exports, require) {
    module.exports = ["em", "ex", "ch", "rem", "vw", "vh", "vmin", "vmax", "cm", "mm", "in", "pt", "pc", "px", "deg", "grad", "rad", "turn", "s", "ms", "Hz", "kHz", "dpi", "dpcm", "dppx", "x", "%", "fr"]
  });
  require.register("functions/index.js", function (module, exports, require) {
    exports["add-property"] = require("./add-property");
    exports.adjust = require("./adjust");
    exports.alpha = require("./alpha");
    exports["base-convert"] = require("./base-convert");
    exports.basename = require("./basename");
    exports.blend = require("./blend");
    exports.blue = require("./blue");
    exports.clone = require("./clone");
    exports.component = require("./component");
    exports.contrast = require("./contrast");
    exports.convert = require("./convert");
    exports["current-media"] = require("./current-media");
    exports.define = require("./define");
    exports.dirname = require("./dirname");
    exports.error = require("./error");
    exports.extname = require("./extname");
    exports.green = require("./green");
    exports.hsl = require("./hsl");
    exports.hsla = require("./hsla");
    exports.hue = require("./hue");
    exports.length = require("./length");
    exports.lightness = require("./lightness");
    exports["list-separator"] = require("./list-separator");
    exports.lookup = require("./lookup");
    exports.luminosity = require("./luminosity");
    exports.match = require("./match");
    exports.math = require("./math");
    exports.merge = exports.extend = require("./merge");
    exports.operate = require("./operate");
    exports["opposite-position"] = require("./opposite-position");
    exports.p = require("./p");
    exports.pathjoin = require("./pathjoin");
    exports.pop = require("./pop");
    exports.push = exports.append = require("./push");
    exports.range = require("./range");
    exports.red = require("./red");
    exports.remove = require("./remove");
    exports.replace = require("./replace");
    exports.rgb = require("./rgb");
    exports.rgba = require("./rgba");
    exports.s = require("./s");
    exports.saturation = require("./saturation");
    exports["selector-exists"] = require("./selector-exists");
    exports.selector = require("./selector");
    exports.selectors = require("./selectors");
    exports.shift = require("./shift");
    exports.split = require("./split");
    exports.substr = require("./substr");
    exports.slice = require("./slice");
    exports.tan = require("./tan");
    exports.trace = require("./trace");
    exports.transparentify = require("./transparentify");
    exports.type = exports.typeof = exports["type-of"] = require("./type");
    exports.unit = require("./unit");
    exports.unquote = require("./unquote");
    exports.unshift = exports.prepend = require("./unshift");
    exports.warn = require("./warn");
    exports["-math-prop"] = require("./math-prop");
    exports["-prefix-classes"] = require("./prefix-classes")
  });
  require.register("functions/url.js", function (module, exports, require) {
    var Compiler = require("../visitor/compiler"),
      events = require("../renderer").events,
      nodes = require("../nodes"),
      extname = require("../path").extname,
      utils = require("../utils");
    var defaultMimes = {
      ".gif":  "image/gif", ".png": "image/png", ".jpg": "image/jpeg", ".jpeg": "image/jpeg", ".svg": "image/svg+xml",
      ".webp": "image/webp", ".ttf": "application/x-font-ttf", ".eot": "application/vnd.ms-fontobject",
      ".woff": "application/font-woff", ".woff2": "application/font-woff2",
    };
    var encodingTypes = {BASE_64: "base64", UTF8: "charset=utf-8"};
    module.exports = function (options) {
      options = options || {};
      var _paths = options.paths || [];
      var sizeLimit = null != options.limit ? options.limit : 3e4;
      var mimes = options.mimes || defaultMimes;

      function fn(url, enc) {
        var compiler = new Compiler(url), encoding = encodingTypes.BASE_64;
        compiler.isURL = true;
        url = url.nodes.map(function (node) {
          return compiler.visit(node)
        }).join("");
        url = parse(url);
        var ext = extname(url.pathname),
          mime = mimes[ext],
          hash = url.hash || "",
          literal = new nodes.Literal('url("' + url.href + '")'),
          paths = _paths.concat(this.paths),
          buf,
          result;
        if (!mime) return literal;
        if (url.protocol) return literal;
        var found = utils.lookup(url.pathname, paths);
        if (!found) {
          events.emit("file not found", "File " + literal + " could not be found, literal url retained!");
          return literal
        }
        buf = fs.readFileSync(found);
        if (false !== sizeLimit && buf.length > sizeLimit) return literal;
        if (enc && "utf8" == enc.first.val.toLowerCase()) {
          encoding = encodingTypes.UTF8;
          result = buf.toString("utf8").replace(/\s+/g, " ").replace(/[{}\|\\\^~\[\]`"<>#%]/g, function (match) {
            return "%" + match[0].charCodeAt(0).toString(16).toUpperCase()
          }).trim()
        } else {result = buf.toString(encoding) + hash}
        return new nodes.Literal('url("data:' + mime + ";" + encoding + "," + result + '")')
      }

      fn.raw = true;
      return fn
    };
    module.exports.mimes = defaultMimes
  });
  require.register("functions/add-property.js", function (module, exports, require) {
    var utils = require("../utils"), nodes = require("../nodes");
    (module.exports = function addProperty(name, expr) {
      utils.assertType(name, "expression", "name");
      name = utils.unwrap(name).first;
      utils.assertString(name, "name");
      utils.assertType(expr, "expression", "expr");
      var prop = new nodes.Property([name], expr);
      var block = this.closestBlock;
      var len = block.nodes.length,
        head = block.nodes.slice(0, block.index),
        tail = block.nodes.slice(block.index++, len);
      head.push(prop);
      block.nodes = head.concat(tail);
      return prop
    }).raw = true
  });
  require.register("functions/adjust.js", function (module, exports, require) {
    var utils = require("../utils");
    module.exports = function adjust(color, prop, amount) {
      utils.assertColor(color, "color");
      utils.assertString(prop, "prop");
      utils.assertType(amount, "unit", "amount");
      var hsl = color.hsla.clone();
      prop = {hue: "h", saturation: "s", lightness: "l"}[prop.string];
      if (!prop) throw new Error("invalid adjustment property");
      var val = amount.val;
      if ("%" == amount.type) {val = "l" == prop && val > 0 ? (100 - hsl[prop]) * val / 100 : hsl[prop] * (val / 100)}
      hsl[prop] += val;
      return hsl.rgba
    }
  });
  require.register("functions/alpha.js", function (module, exports, require) {
    var nodes = require("../nodes"), rgba = require("./rgba");
    module.exports = function alpha(color, value) {
      color = color.rgba;
      if (value) {return rgba(new nodes.Unit(color.r), new nodes.Unit(color.g), new nodes.Unit(color.b), value)}
      return new nodes.Unit(color.a, "")
    }
  });
  require.register("functions/base-convert.js", function (module, exports, require) {
    var utils = require("../utils"), nodes = require("../nodes");
    (module.exports = function (num, base, width) {
      utils.assertPresent(num, "number");
      utils.assertPresent(base, "base");
      num = utils.unwrap(num).nodes[0].val;
      base = utils.unwrap(base).nodes[0].val;
      width = width && utils.unwrap(width).nodes[0].val || 2;
      var result = Number(num).toString(base);
      while (result.length < width) {result = "0" + result}
      return new nodes.Literal(result)
    }).raw = true
  });
  require.register("functions/basename.js", function (module, exports, require) {
    var utils = require("../utils"), path = require("../path");
    module.exports = function basename(p, ext) {
      utils.assertString(p, "path");
      return path.basename(p.val, ext && ext.val)
    }
  });
  require.register("functions/blend.js", function (module, exports, require) {
    var utils = require("../utils"), nodes = require("../nodes");
    module.exports = function blend(top, bottom) {
      utils.assertColor(top);
      top = top.rgba;
      bottom = bottom || new nodes.RGBA(255, 255, 255, 1);
      utils.assertColor(bottom);
      bottom = bottom.rgba;
      return new nodes.RGBA(top.r * top.a + bottom.r * (1 - top.a), top.g * top.a + bottom.g * (1 - top.a), top.b * top.a + bottom.b * (1 - top.a), top.a + bottom.a - top.a * bottom.a)
    }
  });
  require.register("functions/blue.js", function (module, exports, require) {
    var nodes = require("../nodes"), rgba = require("./rgba");
    module.exports = function blue(color, value) {
      color = color.rgba;
      if (value) {return rgba(new nodes.Unit(color.r), new nodes.Unit(color.g), value, new nodes.Unit(color.a))}
      return new nodes.Unit(color.b, "")
    }
  });
  require.register("functions/clone.js", function (module, exports, require) {
    var utils = require("../utils");
    (module.exports = function clone(expr) {
      utils.assertPresent(expr, "expr");
      return expr.clone()
    }).raw = true
  });
  require.register("functions/component.js", function (module, exports, require) {
    var utils = require("../utils"), nodes = require("../nodes");
    var componentMap = {red: "r", green: "g", blue: "b", alpha: "a", hue: "h", saturation: "s", lightness: "l"};
    var unitMap = {hue: "deg", saturation: "%", lightness: "%"};
    var typeMap = {
      red: "rgba", blue: "rgba", green: "rgba", alpha: "rgba", hue: "hsla", saturation: "hsla", lightness: "hsla",
    };
    module.exports = function component(color, name) {
      utils.assertColor(color, "color");
      utils.assertString(name, "name");
      var name = name.string, unit = unitMap[name], type = typeMap[name], name = componentMap[name];
      if (!name) throw new Error('invalid color component "' + name + '"');
      return new nodes.Unit(color[type][name], unit)
    }
  });
  require.register("functions/contrast.js", function (module, exports, require) {
    var utils = require("../utils"),
      nodes = require("../nodes"),
      blend = require("./blend"),
      luminosity = require("./luminosity");
    module.exports = function contrast(top, bottom) {
      if ("rgba" != top.nodeName && "hsla" != top.nodeName) {return new nodes.Literal("contrast(" + (top.isNull ? "" : top.toString()) + ")")}
      var result = new nodes.Object;
      top = top.rgba;
      bottom = bottom || new nodes.RGBA(255, 255, 255, 1);
      utils.assertColor(bottom);
      bottom = bottom.rgba;

      function contrast(top, bottom) {
        if (1 > top.a) {top = blend(top, bottom)}
        var l1 = luminosity(bottom).val + .05, l2 = luminosity(top).val + .05, ratio = l1 / l2;
        if (l2 > l1) {ratio = 1 / ratio}
        return Math.round(ratio * 10) / 10
      }

      if (1 <= bottom.a) {
        var resultRatio = new nodes.Unit(contrast(top, bottom));
        result.set("ratio", resultRatio);
        result.set("error", new nodes.Unit(0));
        result.set("min", resultRatio);
        result.set("max", resultRatio)
      } else {
        var onBlack = contrast(top, blend(bottom, new nodes.RGBA(0, 0, 0, 1))),
          onWhite = contrast(top, blend(bottom, new nodes.RGBA(255, 255, 255, 1))),
          max = Math.max(onBlack, onWhite);

        function processChannel(topChannel, bottomChannel) {
          return Math.min(Math.max(0, (topChannel - bottomChannel * bottom.a) / (1 - bottom.a)), 255)
        }

        var closest = new nodes.RGBA(processChannel(top.r, bottom.r), processChannel(top.g, bottom.g), processChannel(top.b, bottom.b), 1);
        var min = contrast(top, blend(bottom, closest));
        result.set("ratio", new nodes.Unit(Math.round((min + max) * 50) / 100));
        result.set("error", new nodes.Unit(Math.round((max - min) * 50) / 100));
        result.set("min", new nodes.Unit(min));
        result.set("max", new nodes.Unit(max))
      }
      return result
    }
  });
  require.register("functions/convert.js", function (module, exports, require) {
    var utils = require("../utils");
    module.exports = function convert(str) {
      utils.assertString(str, "str");
      return utils.parseString(str.string)
    }
  });
  require.register("functions/current-media.js", function (module, exports, require) {
    var nodes = require("../nodes");
    module.exports = function currentMedia() {
      var self = this;
      return new nodes.String(lookForMedia(this.closestBlock.node) || "");

      function lookForMedia(node) {
        if ("media" == node.nodeName) {
          node.val = self.visit(node.val);
          return node.toString()
        } else if (node.block.parent.node) {return lookForMedia(node.block.parent.node)}
      }
    }
  });
  require.register("functions/define.js", function (module, exports, require) {
    var utils = require("../utils"), nodes = require("../nodes");
    module.exports = function define(name, expr, global) {
      utils.assertType(name, "string", "name");
      expr = utils.unwrap(expr);
      var scope = this.currentScope;
      if (global && global.toBoolean().isTrue) {scope = this.global.scope}
      var node = new nodes.Ident(name.val, expr);
      scope.add(node);
      return nodes.nil
    }
  });
  require.register("functions/dirname.js", function (module, exports, require) {
    var utils = require("../utils"), path = require("../path");
    module.exports = function dirname(p) {
      utils.assertString(p, "path");
      return path.dirname(p.val).replace(/\\/g, "/")
    }
  });
  require.register("functions/error.js", function (module, exports, require) {
    var utils = require("../utils");
    module.exports = function error(msg) {
      utils.assertType(msg, "string", "msg");
      var err = new Error(msg.val);
      err.fromStylus = true;
      throw err
    }
  });
  require.register("functions/extname.js", function (module, exports, require) {
    var utils = require("../utils"), path = require("../path");
    module.exports = function extname(p) {
      utils.assertString(p, "path");
      return path.extname(p.val)
    }
  });
  require.register("functions/green.js", function (module, exports, require) {
    var nodes = require("../nodes"), rgba = require("./rgba");
    module.exports = function green(color, value) {
      color = color.rgba;
      if (value) {return rgba(new nodes.Unit(color.r), value, new nodes.Unit(color.b), new nodes.Unit(color.a))}
      return new nodes.Unit(color.g, "")
    }
  });
  require.register("functions/hsl.js", function (module, exports, require) {
    var utils = require("../utils"), nodes = require("../nodes"), hsla = require("./hsla");
    module.exports = function hsl(hue, saturation, lightness) {
      if (1 == arguments.length) {
        utils.assertColor(hue, "color");
        return hue.hsla
      } else {return hsla(hue, saturation, lightness, new nodes.Unit(1))}
    }
  });
  require.register("functions/hsla.js", function (module, exports, require) {
    var utils = require("../utils"), nodes = require("../nodes");
    module.exports = function hsla(hue, saturation, lightness, alpha) {
      switch (arguments.length) {
        case 1:
          utils.assertColor(hue);
          return hue.hsla;
        case 2:
          utils.assertColor(hue);
          var color = hue.hsla;
          utils.assertType(saturation, "unit", "alpha");
          var alpha = saturation.clone();
          if ("%" == alpha.type) alpha.val /= 100;
          return new nodes.HSLA(color.h, color.s, color.l, alpha.val);
        default:
          utils.assertType(hue, "unit", "hue");
          utils.assertType(saturation, "unit", "saturation");
          utils.assertType(lightness, "unit", "lightness");
          utils.assertType(alpha, "unit", "alpha");
          var alpha = alpha.clone();
          if (alpha && "%" == alpha.type) alpha.val /= 100;
          return new nodes.HSLA(hue.val, saturation.val, lightness.val, alpha.val)
      }
    }
  });
  require.register("functions/hue.js", function (module, exports, require) {
    var nodes = require("../nodes"), hsla = require("./hsla"), component = require("./component");
    module.exports = function hue(color, value) {
      if (value) {
        var hslaColor = color.hsla;
        return hsla(value, new nodes.Unit(hslaColor.s), new nodes.Unit(hslaColor.l), new nodes.Unit(hslaColor.a))
      }
      return component(color, new nodes.String("hue"))
    }
  });
  require.register("functions/length.js", function (module, exports, require) {
    var utils = require("../utils");
    (module.exports = function length(expr) {
      if (expr) {
        if (expr.nodes) {
          var nodes = utils.unwrap(expr).nodes;
          if (1 == nodes.length && "object" == nodes[0].nodeName) {return nodes[0].length} else {return nodes.length}
        } else {return 1}
      }
      return 0
    }).raw = true
  });
  require.register("functions/lightness.js", function (module, exports, require) {
    var nodes = require("../nodes"), hsla = require("./hsla"), component = require("./component");
    module.exports = function lightness(color, value) {
      if (value) {
        var hslaColor = color.hsla;
        return hsla(new nodes.Unit(hslaColor.h), new nodes.Unit(hslaColor.s), value, new nodes.Unit(hslaColor.a))
      }
      return component(color, new nodes.String("lightness"))
    }
  });
  require.register("functions/list-separator.js", function (module, exports, require) {
    var utils = require("../utils"), nodes = require("../nodes");
    (module.exports = function listSeparator(list) {
      list = utils.unwrap(list);
      return new nodes.String(list.isList ? "," : " ")
    }).raw = true
  });
  require.register("functions/lookup.js", function (module, exports, require) {
    var utils = require("../utils"), nodes = require("../nodes");
    module.exports = function lookup(name) {
      utils.assertType(name, "string", "name");
      var node = this.lookup(name.val);
      if (!node) return nodes.nil;
      return this.visit(node)
    }
  });
  require.register("functions/luminosity.js", function (module, exports, require) {
    var utils = require("../utils"), nodes = require("../nodes");
    module.exports = function luminosity(color) {
      utils.assertColor(color);
      color = color.rgba;

      function processChannel(channel) {
        channel = channel / 255;
        return .03928 > channel ? channel / 12.92 : Math.pow((channel + .055) / 1.055, 2.4)
      }

      return new nodes.Unit(.2126 * processChannel(color.r) + .7152 * processChannel(color.g) + .0722 * processChannel(color.b))
    }
  });
  require.register("functions/match.js", function (module, exports, require) {
    var utils = require("../utils"), nodes = require("../nodes");
    var VALID_FLAGS = "igm";
    module.exports = function match(pattern, val, flags) {
      utils.assertType(pattern, "string", "pattern");
      utils.assertString(val, "val");
      var re = new RegExp(pattern.val, validateFlags(flags) ? flags.string : "");
      return val.string.match(re)
    };

    function validateFlags(flags) {
      flags = flags && flags.string;
      if (flags) {
        return flags.split("").every(function (flag) {
          return ~VALID_FLAGS.indexOf(flag)
        })
      }
      return false
    }
  });
  require.register("functions/math-prop.js", function (module, exports, require) {
    var nodes = require("../nodes");
    module.exports = function math(prop) {
      return new nodes.Unit(Math[prop.string])
    }
  });
  require.register("functions/math.js", function (module, exports, require) {
    var utils = require("../utils"), nodes = require("../nodes");
    module.exports = function math(n, fn) {
      utils.assertType(n, "unit", "n");
      utils.assertString(fn, "fn");
      return new nodes.Unit(Math[fn.string](n.val), n.type)
    }
  });
  require.register("functions/merge.js", function (module, exports, require) {
    var utils = require("../utils");
    (module.exports = function merge(dest) {
      utils.assertPresent(dest, "dest");
      dest = utils.unwrap(dest).first;
      utils.assertType(dest, "object", "dest");
      var last = utils.unwrap(arguments[arguments.length - 1]).first, deep = true === last.val;
      for (var i = 1, len = arguments.length - deep; i < len; ++i) {utils.merge(dest.vals, utils.unwrap(arguments[i]).first.vals, deep)}
      return dest
    }).raw = true
  });
  require.register("functions/operate.js", function (module, exports, require) {
    var utils = require("../utils");
    module.exports = function operate(op, left, right) {
      utils.assertType(op, "string", "op");
      utils.assertPresent(left, "left");
      utils.assertPresent(right, "right");
      return left.operate(op.val, right)
    }
  });
  require.register("functions/opposite-position.js", function (module, exports, require) {
    var utils = require("../utils"), nodes = require("../nodes");
    (module.exports = function oppositePosition(positions) {
      var expr = [];
      utils.unwrap(positions).nodes.forEach(function (pos, i) {
        utils.assertString(pos, "position " + i);
        pos = function () {
          switch (pos.string) {
            case"top":
              return "bottom";
            case"bottom":
              return "top";
            case"left":
              return "right";
            case"right":
              return "left";
            case"center":
              return "center";
            default:
              throw new Error("invalid position " + pos)
          }
        }();
        expr.push(new nodes.Literal(pos))
      });
      return expr
    }).raw = true
  });
  require.register("functions/p.js", function (module, exports, require) {
    var utils = require("../utils"), nodes = require("../nodes");
    (module.exports = function p() {
      [].slice.call(arguments).forEach(function (expr) {
        expr = utils.unwrap(expr);
        if (!expr.nodes.length) return;
        console.log("inspect: %s", expr.toString().replace(/^\(|\)$/g, ""))
      });
      return nodes.nil
    }).raw = true
  });
  require.register("functions/pathjoin.js", function (module, exports, require) {
    var path = require("../path");
    (module.exports = function pathjoin() {
      var paths = [].slice.call(arguments).map(function (path) {
        return path.first.string
      });
      return path.join.apply(null, paths).replace(/\\/g, "/")
    }).raw = true
  });
  require.register("functions/pop.js", function (module, exports, require) {
    var utils = require("../utils");
    (module.exports = function pop(expr) {
      expr = utils.unwrap(expr);
      return expr.nodes.pop()
    }).raw = true
  });
  require.register("functions/prefix-classes.js", function (module, exports, require) {
    var utils = require("../utils");
    module.exports = function prefixClasses(prefix, block) {
      utils.assertString(prefix, "prefix");
      utils.assertType(block, "block", "block");
      var _prefix = this.prefix;
      this.options.prefix = this.prefix = prefix.string;
      block = this.visit(block);
      this.options.prefix = this.prefix = _prefix;
      return block
    }
  });
  require.register("functions/push.js", function (module, exports, require) {
    var utils = require("../utils");
    (module.exports = function (expr) {
      expr = utils.unwrap(expr);
      for (var i = 1, len = arguments.length; i < len; ++i) {expr.nodes.push(utils.unwrap(arguments[i]).clone())}
      return expr.nodes.length
    }).raw = true
  });
  require.register("functions/range.js", function (module, exports, require) {
    var utils = require("../utils"), nodes = require("../nodes");
    module.exports = function range(start, stop, step) {
      utils.assertType(start, "unit", "start");
      utils.assertType(stop, "unit", "stop");
      if (step) {
        utils.assertType(step, "unit", "step");
        if (0 == step.val) {throw new Error('ArgumentError: "step" argument must not be zero')}
      } else {step = new nodes.Unit(1)}
      var list = new nodes.Expression;
      for (var i = start.val; i <= stop.val; i += step.val) {list.push(new nodes.Unit(i, start.type))}
      return list
    }
  });
  require.register("functions/red.js", function (module, exports, require) {
    var nodes = require("../nodes"), rgba = require("./rgba");
    module.exports = function red(color, value) {
      color = color.rgba;
      if (value) {return rgba(value, new nodes.Unit(color.g), new nodes.Unit(color.b), new nodes.Unit(color.a))}
      return new nodes.Unit(color.r, "")
    }
  });
  require.register("functions/remove.js", function (module, exports, require) {
    var utils = require("../utils");
    module.exports = function remove(object, key) {
      utils.assertType(object, "object", "object");
      utils.assertString(key, "key");
      delete object.vals[key.string];
      return object
    }
  });
  require.register("functions/replace.js", function (module, exports, require) {
    var utils = require("../utils"), nodes = require("../nodes");
    module.exports = function replace(pattern, replacement, val) {
      utils.assertString(pattern, "pattern");
      utils.assertString(replacement, "replacement");
      utils.assertString(val, "val");
      pattern = new RegExp(pattern.string, "g");
      var res = val.string.replace(pattern, replacement.string);
      return val instanceof nodes.Ident ? new nodes.Ident(res) : new nodes.String(res)
    }
  });
  require.register("functions/rgb.js", function (module, exports, require) {
    var utils = require("../utils"), nodes = require("../nodes"), rgba = require("./rgba");
    module.exports = function rgb(red, green, blue) {
      switch (arguments.length) {
        case 1:
          utils.assertColor(red);
          var color = red.rgba;
          return new nodes.RGBA(color.r, color.g, color.b, 1);
        default:
          return rgba(red, green, blue, new nodes.Unit(1))
      }
    }
  });
  require.register("functions/rgba.js", function (module, exports, require) {
    var utils = require("../utils"), nodes = require("../nodes");
    module.exports = function rgba(red, green, blue, alpha) {
      switch (arguments.length) {
        case 1:
          utils.assertColor(red);
          return red.rgba;
        case 2:
          utils.assertColor(red);
          var color = red.rgba;
          utils.assertType(green, "unit", "alpha");
          alpha = green.clone();
          if ("%" == alpha.type) alpha.val /= 100;
          return new nodes.RGBA(color.r, color.g, color.b, alpha.val);
        default:
          utils.assertType(red, "unit", "red");
          utils.assertType(green, "unit", "green");
          utils.assertType(blue, "unit", "blue");
          utils.assertType(alpha, "unit", "alpha");
          var r = "%" == red.type ? Math.round(red.val * 2.55) : red.val,
            g = "%" == green.type ? Math.round(green.val * 2.55) : green.val,
            b = "%" == blue.type ? Math.round(blue.val * 2.55) : blue.val;
          alpha = alpha.clone();
          if (alpha && "%" == alpha.type) alpha.val /= 100;
          return new nodes.RGBA(r, g, b, alpha.val)
      }
    }
  });
  require.register("functions/s.js", function (module, exports, require) {
    var utils = require("../utils"), nodes = require("../nodes"), Compiler = require("../visitor/compiler");
    (module.exports = function s(fmt) {
      fmt = utils.unwrap(fmt).nodes[0];
      utils.assertString(fmt);
      var self = this, str = fmt.string, args = arguments, i = 1;
      str = str.replace(/%(s|d)/g, function (_, specifier) {
        var arg = args[i++] || nodes.nil;
        switch (specifier) {
          case"s":
            return new Compiler(arg, self.options).compile();
          case"d":
            arg = utils.unwrap(arg).first;
            if ("unit" != arg.nodeName) throw new Error("%d requires a unit");
            return arg.val
        }
      });
      return new nodes.Literal(str)
    }).raw = true
  });
  require.register("functions/saturation.js", function (module, exports, require) {
    var nodes = require("../nodes"), hsla = require("./hsla"), component = require("./component");
    module.exports = function saturation(color, value) {
      if (value) {
        var hslaColor = color.hsla;
        return hsla(new nodes.Unit(hslaColor.h), value, new nodes.Unit(hslaColor.l), new nodes.Unit(hslaColor.a))
      }
      return component(color, new nodes.String("saturation"))
    }
  });
  require.register("functions/selector-exists.js", function (module, exports, require) {
    var utils = require("../utils");
    module.exports = function selectorExists(sel) {
      utils.assertString(sel, "selector");
      if (!this.__selectorsMap__) {
        var Normalizer = require("../visitor/normalizer"),
          visitor = new Normalizer(this.root.clone());
        visitor.visit(visitor.root);
        this.__selectorsMap__ = visitor.map
      }
      return sel.string in this.__selectorsMap__
    }
  });
  require.register("functions/selector.js", function (module, exports, require) {
    var utils = require("../utils");
    (module.exports = function selector() {
      var stack = this.selectorStack, args = [].slice.call(arguments);
      if (1 == args.length) {
        var expr = utils.unwrap(args[0]), len = expr.nodes.length;
        if (1 == len) {
          utils.assertString(expr.first, "selector");
          var SelectorParser = require("../selector-parser"),
            val = expr.first.string,
            parsed = new SelectorParser(val).parse().val;
          if (parsed == val) return val;
          stack.push(parse(val))
        } else if (len > 1) {
          if (expr.isList) {pushToStack(expr.nodes, stack)} else {
            stack.push(parse(expr.nodes.map(function (node) {
              utils.assertString(node, "selector");
              return node.string
            }).join(" ")))
          }
        }
      } else if (args.length > 1) {pushToStack(args, stack)}
      return stack.length ? utils.compileSelectors(stack).join(",") : "&"
    }).raw = true;

    function pushToStack(selectors, stack) {
      selectors.forEach(function (sel) {
        sel = sel.first;
        utils.assertString(sel, "selector");
        stack.push(parse(sel.string))
      })
    }

    function parse(selector) {
      var Parser = new require("../parser"), parser = new Parser(selector), nodes;
      parser.state.push("selector-parts");
      nodes = parser.selector();
      nodes.forEach(function (node) {
        node.val = node.segments.map(function (seg) {
          return seg.toString()
        }).join("")
      });
      return nodes
    }
  });
  require.register("functions/selectors.js", function (module, exports, require) {
    var nodes = require("../nodes"), Parser = require("../selector-parser");
    module.exports = function selectors() {
      var stack = this.selectorStack, expr = new nodes.Expression(true);
      if (stack.length) {
        for (var i = 0; i < stack.length; i++) {
          var group = stack[i], nested;
          if (group.length > 1) {
            expr.push(new nodes.String(group.map(function (selector) {
              nested = new Parser(selector.val).parse().nested;
              return (nested && i ? "& " : "") + selector.val
            }).join(",")))
          } else {
            var selector = group[0].val;
            nested = new Parser(selector).parse().nested;
            expr.push(new nodes.String((nested && i ? "& " : "") + selector))
          }
        }
      } else {expr.push(new nodes.String("&"))}
      return expr
    }
  });
  require.register("functions/shift.js", function (module, exports, require) {
    var utils = require("../utils");
    (module.exports = function (expr) {
      expr = utils.unwrap(expr);
      return expr.nodes.shift()
    }).raw = true
  });
  require.register("functions/split.js", function (module, exports, require) {
    var utils = require("../utils"), nodes = require("../nodes");
    module.exports = function split(delim, val) {
      utils.assertString(delim, "delimiter");
      utils.assertString(val, "val");
      var splitted = val.string.split(delim.string);
      var expr = new nodes.Expression;
      var ItemNode = val instanceof nodes.Ident ? nodes.Ident : nodes.String;
      for (var i = 0, len = splitted.length; i < len; ++i) {expr.nodes.push(new ItemNode(splitted[i]))}
      return expr
    }
  });
  require.register("functions/slice.js", function (module, exports, require) {
    var utils = require("../utils"), nodes = require("../nodes");
    (module.exports = function slice(val, start, end) {
      start = start && start.nodes[0].val;
      end = end && end.nodes[0].val;
      val = utils.unwrap(val).nodes;
      if (val.length > 1) {return utils.coerce(val.slice(start, end), true)}
      var result = val[0].string.slice(start, end);
      return val[0] instanceof nodes.Ident ? new nodes.Ident(result) : new nodes.String(result)
    }).raw = true
  });
  require.register("functions/substr.js", function (module, exports, require) {
    var utils = require("../utils"), nodes = require("../nodes");
    module.exports = function substr(val, start, length) {
      utils.assertString(val, "val");
      utils.assertType(start, "unit", "start");
      length = length && length.val;
      var res = val.string.substr(start.val, length);
      return val instanceof nodes.Ident ? new nodes.Ident(res) : new nodes.String(res)
    }
  });
  require.register("functions/tan.js", function (module, exports, require) {
    var utils = require("../utils"), nodes = require("../nodes");
    module.exports = function tan(angle) {
      utils.assertType(angle, "unit", "angle");
      var radians = angle.val;
      if (angle.type === "deg") {radians *= Math.PI / 180}
      var m = Math.pow(10, 9);
      var sin = Math.round(Math.sin(radians) * m) / m,
        cos = Math.round(Math.cos(radians) * m) / m,
        tan = Math.round(m * sin / cos) / m;
      return new nodes.Unit(tan, "")
    }
  });
  require.register("functions/trace.js", function (module, exports, require) {
    var nodes = require("../nodes");
    module.exports = function trace() {
      console.log(this.stack);
      return nodes.nil
    }
  });
  require.register("functions/transparentify.js", function (module, exports, require) {
    var utils = require("../utils"), nodes = require("../nodes");
    module.exports = function transparentify(top, bottom, alpha) {
      utils.assertColor(top);
      top = top.rgba;
      bottom = bottom || new nodes.RGBA(255, 255, 255, 1);
      if (!alpha && bottom && !bottom.rgba) {
        alpha = bottom;
        bottom = new nodes.RGBA(255, 255, 255, 1)
      }
      utils.assertColor(bottom);
      bottom = bottom.rgba;
      var bestAlpha = ["r", "g", "b"].map(function (channel) {
        return (top[channel] - bottom[channel]) / ((0 < top[channel] - bottom[channel] ? 255 : 0) - bottom[channel])
      }).sort(function (a, b) {
        return a < b
      })[0];
      if (alpha) {
        utils.assertType(alpha, "unit", "alpha");
        if ("%" == alpha.type) {bestAlpha = alpha.val / 100} else if (!alpha.type) {bestAlpha = alpha = alpha.val}
      }
      bestAlpha = Math.max(Math.min(bestAlpha, 1), 0);

      function processChannel(channel) {
        if (0 == bestAlpha) {return bottom[channel]} else {return bottom[channel] + (top[channel] - bottom[channel]) / bestAlpha}
      }

      return new nodes.RGBA(processChannel("r"), processChannel("g"), processChannel("b"), Math.round(bestAlpha * 100) / 100)
    }
  });
  require.register("functions/type.js", function (module, exports, require) {
    var utils = require("../utils");
    module.exports = function type(node) {
      utils.assertPresent(node, "expression");
      return node.nodeName
    }
  });
  require.register("functions/unit.js", function (module, exports, require) {
    var utils = require("../utils"), nodes = require("../nodes");
    module.exports = function unit(unit, type) {
      utils.assertType(unit, "unit", "unit");
      if (type) {
        utils.assertString(type, "type");
        return new nodes.Unit(unit.val, type.string)
      } else {return unit.type || ""}
    }
  });
  require.register("functions/unquote.js", function (module, exports, require) {
    var utils = require("../utils"), nodes = require("../nodes");
    module.exports = function unquote(string) {
      utils.assertString(string, "string");
      return new nodes.Literal(string.string)
    }
  });
  require.register("functions/unshift.js", function (module, exports, require) {
    var utils = require("../utils");
    (module.exports = function (expr) {
      expr = utils.unwrap(expr);
      for (var i = 1, len = arguments.length; i < len; ++i) {expr.nodes.unshift(utils.unwrap(arguments[i]))}
      return expr.nodes.length
    }).raw = true
  });
  require.register("functions/warn.js", function (module, exports, require) {
    var utils = require("../utils"), nodes = require("../nodes");
    module.exports = function warn(msg) {
      utils.assertType(msg, "string", "msg");
      console.warn("Warning: %s", msg.val);
      return nodes.nil
    }
  });
  require.register("lexer.js", function (module, exports, require) {
    var Token = require("./token"), nodes = require("./nodes"), errors = require("./errors");
    exports = module.exports = Lexer;
    var alias = {and: "&&", or: "||", is: "==", isnt: "!=", "is not": "!=", ":=": "?="};

    function Lexer(str, options) {
      options = options || {};
      this.stash = [];
      this.indentStack = [];
      this.indentRe = null;
      this.lineno = 1;
      this.column = 1;

      function comment(str, val, offset, s) {
        var inComment = s.lastIndexOf("/*", offset) > s.lastIndexOf("*/", offset),
          commentIdx = s.lastIndexOf("//", offset),
          i = s.lastIndexOf("\n", offset),
          double = 0,
          single = 0;
        if (~commentIdx && commentIdx > i) {
          while (i != offset) {
            if ("'" == s[i]) single ? single-- : single++;
            if ('"' == s[i]) double ? double-- : double++;
            if ("/" == s[i] && "/" == s[i + 1]) {
              inComment = !single && !double;
              break
            }
            ++i
          }
        }
        return inComment ? str : val + "\r"
      }

      if ("\ufeff" == str.charAt(0)) str = str.slice(1);
      this.str = str.replace(/\s+$/, "\n").replace(/\r\n?/g, "\n").replace(/\\ *\n/g, "\r").replace(/([,(:](?!\/\/[^ ])) *(?:\/\/[^\n]*|\/\*.*?\*\/)?\n\s*/g, comment).replace(/\s*\n[ \t]*([,)])/g, comment)
    }

    Lexer.prototype = {
      inspect:             function () {
        var tok, tmp = this.str, buf = [];
        while ("eos" != (tok = this.next()).type) {buf.push(tok.inspect())}
        this.str = tmp;
        return buf.concat(tok.inspect()).join("\n")
      }, lookahead:        function (n) {
        var fetch = n - this.stash.length;
        while (fetch-- > 0) this.stash.push(this.advance());
        return this.stash[--n]
      }, skip:             function (len) {
        var chunk = len[0];
        len = chunk ? chunk.length : len;
        this.str = this.str.substr(len);
        if (chunk) {this.move(chunk)} else {this.column += len}
      }, move:             function (str) {
        var lines = str.match(/\n/g), idx = str.lastIndexOf("\n");
        if (lines) this.lineno += lines.length;
        this.column = ~idx ? str.length - idx : this.column + str.length
      }, next:             function () {
        var tok = this.stashed() || this.advance();
        this.prev = tok;
        return tok
      }, isPartOfSelector: function () {
        var tok = this.stash[this.stash.length - 1] || this.prev;
        switch (tok && tok.type) {
          case"color":
            return 2 == tok.val.raw.length;
          case".":
          case"[":
            return true
        }
        return false
      }, advance:          function () {
        var column = this.column,
          line = this.lineno,
          tok = this.eos() || this.nil() || this.sep() || this.keyword() || this.urlchars() || this.comment() || this.newline() || this.escaped() || this.important() || this.literal() || this.fun() || this.anonFunc() || this.atrule() || this.brace() || this.paren() || this.color() || this.string() || this.unit() || this.namedop() || this.boolean() || this.unicode() || this.ident() || this.op() || this.eol() || this.space() || this.selector();
        tok.lineno = line;
        tok.column = column;
        return tok
      }, peek:             function () {
        return this.lookahead(1)
      }, stashed:          function () {
        return this.stash.shift()
      }, eos:              function () {
        if (this.str.length) return;
        if (this.indentStack.length) {
          this.indentStack.shift();
          return new Token("outdent")
        } else {return new Token("eos")}
      }, urlchars:         function () {
        var captures;
        if (!this.isURL) return;
        if (captures = /^[\/:@.;?&=*!,<>#%0-9]+/.exec(this.str)) {
          this.skip(captures);
          return new Token("literal", new nodes.Literal(captures[0]))
        }
      }, sep:              function () {
        var captures;
        if (captures = /^;[ \t]*/.exec(this.str)) {
          this.skip(captures);
          return new Token(";")
        }
      }, eol:              function () {
        if ("\r" == this.str[0]) {
          ++this.lineno;
          this.skip(1);
          return this.advance()
        }
      }, space:            function () {
        var captures;
        if (captures = /^([ \t]+)/.exec(this.str)) {
          this.skip(captures);
          return new Token("space")
        }
      }, escaped:          function () {
        var captures;
        if (captures = /^\\(.)[ \t]*/.exec(this.str)) {
          var c = captures[1];
          this.skip(captures);
          return new Token("ident", new nodes.Literal(c))
        }
      }, literal:          function () {
        var captures;
        if (captures = /^@css[ \t]*\{/.exec(this.str)) {
          this.skip(captures);
          var c, braces = 1, css = "", node;
          while (c = this.str[0]) {
            this.str = this.str.substr(1);
            switch (c) {
              case"{":
                ++braces;
                break;
              case"}":
                --braces;
                break;
              case"\n":
              case"\r":
                ++this.lineno;
                break
            }
            css += c;
            if (!braces) break
          }
          css = css.replace(/\s*}$/, "");
          node = new nodes.Literal(css);
          node.css = true;
          return new Token("literal", node)
        }
      }, important:        function () {
        var captures;
        if (captures = /^!important[ \t]*/.exec(this.str)) {
          this.skip(captures);
          return new Token("ident", new nodes.Literal("!important"))
        }
      }, brace:            function () {
        var captures;
        if (captures = /^([{}])/.exec(this.str)) {
          this.skip(1);
          var brace = captures[1];
          return new Token(brace, brace)
        }
      }, paren:            function () {
        var captures;
        if (captures = /^([()])([ \t]*)/.exec(this.str)) {
          var paren = captures[1];
          this.skip(captures);
          if (")" == paren) this.isURL = false;
          var tok = new Token(paren, paren);
          tok.space = captures[2];
          return tok
        }
      }, nil:              function () {
        var captures, tok;
        if (captures = /^(null)\b[ \t]*/.exec(this.str)) {
          this.skip(captures);
          if (this.isPartOfSelector()) {tok = new Token("ident", new nodes.Ident(captures[0]))} else {tok = new Token("null", nodes.nil)}
          return tok
        }
      }, keyword:          function () {
        var captures, tok;
        if (captures = /^(return|if|else|unless|for|in)\b[ \t]*/.exec(this.str)) {
          var keyword = captures[1];
          this.skip(captures);
          if (this.isPartOfSelector()) {tok = new Token("ident", new nodes.Ident(captures[0]))} else {tok = new Token(keyword, keyword)}
          return tok
        }
      }, namedop:          function () {
        var captures, tok;
        if (captures = /^(not|and|or|is a|is defined|isnt|is not|is)(?!-)\b([ \t]*)/.exec(this.str)) {
          var op = captures[1];
          this.skip(captures);
          if (this.isPartOfSelector()) {tok = new Token("ident", new nodes.Ident(captures[0]))} else {
            op = alias[op] || op;
            tok = new Token(op, op)
          }
          tok.space = captures[2];
          return tok
        }
      }, op:               function () {
        var captures;
        if (captures = /^([.]{1,3}|&&|\|\||[!<>=?:]=|\*\*|[-+*\/%]=?|[,=?:!~<>&\[\]])([ \t]*)/.exec(this.str)) {
          var op = captures[1];
          this.skip(captures);
          op = alias[op] || op;
          var tok = new Token(op, op);
          tok.space = captures[2];
          this.isURL = false;
          return tok
        }
      }, anonFunc:         function () {
        var tok;
        if ("@" == this.str[0] && "(" == this.str[1]) {
          this.skip(2);
          tok = new Token("function", new nodes.Ident("anonymous"));
          tok.anonymous = true;
          return tok
        }
      }, atrule:           function () {
        var captures;
        if (captures = /^@(?:-(\w+)-)?([a-zA-Z0-9-_]+)[ \t]*/.exec(this.str)) {
          this.skip(captures);
          var vendor = captures[1], type = captures[2], tok;
          switch (type) {
            case"require":
            case"import":
            case"charset":
            case"namespace":
            case"media":
            case"scope":
            case"supports":
              return new Token(type);
            case"document":
              return new Token("-moz-document");
            case"block":
              return new Token("atblock");
            case"extend":
            case"extends":
              return new Token("extend");
            case"keyframes":
              return new Token(type, vendor);
            default:
              return new Token("atrule", vendor ? "-" + vendor + "-" + type : type)
          }
        }
      }, comment:          function () {
        if ("/" == this.str[0] && "/" == this.str[1]) {
          var end = this.str.indexOf("\n");
          if (-1 == end) end = this.str.length;
          this.skip(end);
          return this.advance()
        }
        if ("/" == this.str[0] && "*" == this.str[1]) {
          var end = this.str.indexOf("*/");
          if (-1 == end) end = this.str.length;
          var str = this.str.substr(0, end + 2), lines = str.split(/\n|\r/).length - 1, suppress = true, inline = false;
          this.lineno += lines;
          this.skip(end + 2);
          if ("!" == str[2]) {
            str = str.replace("*!", "*");
            suppress = false
          }
          if (this.prev && ";" == this.prev.type) inline = true;
          return new Token("comment", new nodes.Comment(str, suppress, inline))
        }
      }, "boolean":        function () {
        var captures;
        if (captures = /^(true|false)\b([ \t]*)/.exec(this.str)) {
          var val = nodes.Boolean("true" == captures[1]);
          this.skip(captures);
          var tok = new Token("boolean", val);
          tok.space = captures[2];
          return tok
        }
      }, unicode:          function () {
        var captures;
        if (captures = /^u\+[0-9a-f?]{1,6}(?:-[0-9a-f]{1,6})?/i.exec(this.str)) {
          this.skip(captures);
          return new Token("literal", new nodes.Literal(captures[0]))
        }
      }, fun:              function () {
        var captures;
        if (captures = /^(-*[_a-zA-Z$][-\w\d$]*)\(([ \t]*)/.exec(this.str)) {
          var name = captures[1];
          this.skip(captures);
          this.isURL = "url" == name;
          var tok = new Token("function", new nodes.Ident(name));
          tok.space = captures[2];
          return tok
        }
      }, ident:            function () {
        var captures;
        if (captures = /^-*[_a-zA-Z$][-\w\d$]*/.exec(this.str)) {
          this.skip(captures);
          return new Token("ident", new nodes.Ident(captures[0]))
        }
      }, newline:          function () {
        var captures, re;
        if (this.indentRe) {captures = this.indentRe.exec(this.str)} else {
          re = /^\n([\t]*)[ \t]*/;
          captures = re.exec(this.str);
          if (captures && !captures[1].length) {
            re = /^\n([ \t]*)/;
            captures = re.exec(this.str)
          }
          if (captures && captures[1].length) this.indentRe = re
        }
        if (captures) {
          var tok, indents = captures[1].length;
          this.skip(captures);
          if (this.str[0] === " " || this.str[0] === "	") {throw new errors.SyntaxError("Invalid indentation. You can use tabs or spaces to indent, but not both.")}
          if ("\n" == this.str[0]) return this.advance();
          if (this.indentStack.length && indents < this.indentStack[0]) {
            while (this.indentStack.length && this.indentStack[0] > indents) {
              this.stash.push(new Token("outdent"));
              this.indentStack.shift()
            }
            tok = this.stash.pop()
          } else if (indents && indents != this.indentStack[0]) {
            this.indentStack.unshift(indents);
            tok = new Token("indent")
          } else {tok = new Token("newline")}
          return tok
        }
      }, unit:             function () {
        var captures;
        if (captures = /^(-)?(\d+\.\d+|\d+|\.\d+)(%|[a-zA-Z]+)?[ \t]*/.exec(this.str)) {
          this.skip(captures);
          var n = parseFloat(captures[2]);
          if ("-" == captures[1]) n = -n;
          var node = new nodes.Unit(n, captures[3]);
          node.raw = captures[0];
          return new Token("unit", node)
        }
      }, string:           function () {
        var captures;
        if (captures = /^("[^"]*"|'[^']*')[ \t]*/.exec(this.str)) {
          var str = captures[1], quote = captures[0][0];
          this.skip(captures);
          str = str.slice(1, -1).replace(/\\n/g, "\n");
          return new Token("string", new nodes.String(str, quote))
        }
      }, color:            function () {
        return this.rrggbbaa() || this.rrggbb() || this.rgba() || this.rgb() || this.nn() || this.n()
      }, n:                function () {
        var captures;
        if (captures = /^#([a-fA-F0-9]{1})[ \t]*/.exec(this.str)) {
          this.skip(captures);
          var n = parseInt(captures[1] + captures[1], 16), color = new nodes.RGBA(n, n, n, 1);
          color.raw = captures[0];
          return new Token("color", color)
        }
      }, nn:               function () {
        var captures;
        if (captures = /^#([a-fA-F0-9]{2})[ \t]*/.exec(this.str)) {
          this.skip(captures);
          var n = parseInt(captures[1], 16), color = new nodes.RGBA(n, n, n, 1);
          color.raw = captures[0];
          return new Token("color", color)
        }
      }, rgb:              function () {
        var captures;
        if (captures = /^#([a-fA-F0-9]{3})[ \t]*/.exec(this.str)) {
          this.skip(captures);
          var rgb = captures[1],
            r = parseInt(rgb[0] + rgb[0], 16),
            g = parseInt(rgb[1] + rgb[1], 16),
            b = parseInt(rgb[2] + rgb[2], 16),
            color = new nodes.RGBA(r, g, b, 1);
          color.raw = captures[0];
          return new Token("color", color)
        }
      }, rgba:             function () {
        var captures;
        if (captures = /^#([a-fA-F0-9]{4})[ \t]*/.exec(this.str)) {
          this.skip(captures);
          var rgb = captures[1],
            r = parseInt(rgb[0] + rgb[0], 16),
            g = parseInt(rgb[1] + rgb[1], 16),
            b = parseInt(rgb[2] + rgb[2], 16),
            a = parseInt(rgb[3] + rgb[3], 16),
            color = new nodes.RGBA(r, g, b, a / 255);
          color.raw = captures[0];
          return new Token("color", color)
        }
      }, rrggbb:           function () {
        var captures;
        if (captures = /^#([a-fA-F0-9]{6})[ \t]*/.exec(this.str)) {
          this.skip(captures);
          var rgb = captures[1],
            r = parseInt(rgb.substr(0, 2), 16),
            g = parseInt(rgb.substr(2, 2), 16),
            b = parseInt(rgb.substr(4, 2), 16),
            color = new nodes.RGBA(r, g, b, 1);
          color.raw = captures[0];
          return new Token("color", color)
        }
      }, rrggbbaa:         function () {
        var captures;
        if (captures = /^#([a-fA-F0-9]{8})[ \t]*/.exec(this.str)) {
          this.skip(captures);
          var rgb = captures[1],
            r = parseInt(rgb.substr(0, 2), 16),
            g = parseInt(rgb.substr(2, 2), 16),
            b = parseInt(rgb.substr(4, 2), 16),
            a = parseInt(rgb.substr(6, 2), 16),
            color = new nodes.RGBA(r, g, b, a / 255);
          color.raw = captures[0];
          return new Token("color", color)
        }
      }, selector:         function () {
        var captures;
        if (captures = /^\^|.*?(?=\/\/(?![^\[]*\])|[,\n{])/.exec(this.str)) {
          var selector = captures[0];
          this.skip(captures);
          return new Token("selector", selector)
        }
      },
    }
  });
  require.register("nodes/arguments.js", function (module, exports, require) {
    var Node = require("./node"), nodes = require("../nodes"), utils = require("../utils");
    var Arguments = module.exports = function Arguments() {
      nodes.Expression.call(this);
      this.map = {}
    };
    Arguments.prototype.__proto__ = nodes.Expression.prototype;
    Arguments.fromExpression = function (expr) {
      var args = new Arguments, len = expr.nodes.length;
      args.lineno = expr.lineno;
      args.column = expr.column;
      args.isList = expr.isList;
      for (var i = 0; i < len; ++i) {args.push(expr.nodes[i])}
      return args
    };
    Arguments.prototype.clone = function (parent) {
      var clone = nodes.Expression.prototype.clone.call(this, parent);
      clone.map = {};
      for (var key in this.map) {clone.map[key] = this.map[key].clone(parent, clone)}
      clone.isList = this.isList;
      clone.lineno = this.lineno;
      clone.column = this.column;
      clone.filename = this.filename;
      return clone
    };
    Arguments.prototype.toJSON = function () {
      return {
        __type: "Arguments", map: this.map, isList: this.isList, preserve: this.preserve, lineno: this.lineno,
        column: this.column, filename: this.filename, nodes: this.nodes,
      }
    }
  });
  require.register("nodes/binop.js", function (module, exports, require) {
    var Node = require("./node");
    var BinOp = module.exports = function BinOp(op, left, right) {
      Node.call(this);
      this.op = op;
      this.left = left;
      this.right = right
    };
    BinOp.prototype.__proto__ = Node.prototype;
    BinOp.prototype.clone = function (parent) {
      var clone = new BinOp(this.op);
      clone.left = this.left.clone(parent, clone);
      clone.right = this.right && this.right.clone(parent, clone);
      clone.lineno = this.lineno;
      clone.column = this.column;
      clone.filename = this.filename;
      if (this.val) clone.val = this.val.clone(parent, clone);
      return clone
    };
    BinOp.prototype.toString = function () {
      return this.left.toString() + " " + this.op + " " + this.right.toString()
    };
    BinOp.prototype.toJSON = function () {
      var json = {
        __type:   "BinOp", left: this.left, right: this.right, op: this.op, lineno: this.lineno, column: this.column,
        filename: this.filename,
      };
      if (this.val) json.val = this.val;
      return json
    }
  });
  require.register("nodes/block.js", function (module, exports, require) {
    var Node = require("./node");
    var Block = module.exports = function Block(parent, node) {
      Node.call(this);
      this.nodes = [];
      this.parent = parent;
      this.node = node;
      this.scope = true
    };
    Block.prototype.__proto__ = Node.prototype;
    Block.prototype.__defineGetter__("hasProperties", function () {
      for (var i = 0, len = this.nodes.length; i < len; ++i) {if ("property" == this.nodes[i].nodeName) {return true}}
    });
    Block.prototype.__defineGetter__("hasMedia", function () {
      for (var i = 0, len = this.nodes.length; i < len; ++i) {
        var nodeName = this.nodes[i].nodeName;
        if ("media" == nodeName) {return true}
      }
      return false
    });
    Block.prototype.__defineGetter__("isEmpty", function () {
      return !this.nodes.length
    });
    Block.prototype.clone = function (parent, node) {
      parent = parent || this.parent;
      var clone = new Block(parent, node || this.node);
      clone.lineno = this.lineno;
      clone.column = this.column;
      clone.filename = this.filename;
      clone.scope = this.scope;
      this.nodes.forEach(function (node) {
        clone.push(node.clone(clone, clone))
      });
      return clone
    };
    Block.prototype.push = function (node) {
      this.nodes.push(node)
    };
    Block.prototype.toJSON = function () {
      return {
        __type: "Block", scope: this.scope, lineno: this.lineno, column: this.column, filename: this.filename,
        nodes:  this.nodes,
      }
    }
  });
  require.register("nodes/boolean.js", function (module, exports, require) {
    var Node = require("./node"), nodes = require("./index");
    var Boolean = module.exports = function Boolean(val) {
      Node.call(this);
      if (this.nodeName) {this.val = !!val} else {return new Boolean(val)}
    };
    Boolean.prototype.__proto__ = Node.prototype;
    Boolean.prototype.toBoolean = function () {
      return this
    };
    Boolean.prototype.__defineGetter__("isTrue", function () {
      return this.val
    });
    Boolean.prototype.__defineGetter__("isFalse", function () {
      return !this.val
    });
    Boolean.prototype.negate = function () {
      return new Boolean(!this.val)
    };
    Boolean.prototype.inspect = function () {
      return "[Boolean " + this.val + "]"
    };
    Boolean.prototype.toString = function () {
      return this.val ? "true" : "false"
    };
    Boolean.prototype.toJSON = function () {
      return {__type: "Boolean", val: this.val}
    }
  });
  require.register("nodes/call.js", function (module, exports, require) {
    var Node = require("./node");
    var Call = module.exports = function Call(name, args) {
      Node.call(this);
      this.name = name;
      this.args = args
    };
    Call.prototype.__proto__ = Node.prototype;
    Call.prototype.clone = function (parent) {
      var clone = new Call(this.name);
      clone.args = this.args.clone(parent, clone);
      if (this.block) clone.block = this.block.clone(parent, clone);
      clone.lineno = this.lineno;
      clone.column = this.column;
      clone.filename = this.filename;
      return clone
    };
    Call.prototype.toString = function () {
      var args = this.args.nodes.map(function (node) {
        var str = node.toString();
        return str.slice(1, str.length - 1)
      }).join(", ");
      return this.name + "(" + args + ")"
    };
    Call.prototype.toJSON = function () {
      var json = {
        __type:   "Call", name: this.name, args: this.args, lineno: this.lineno, column: this.column,
        filename: this.filename,
      };
      if (this.block) json.block = this.block;
      return json
    }
  });
  require.register("nodes/charset.js", function (module, exports, require) {
    var Node = require("./node");
    var Charset = module.exports = function Charset(val) {
      Node.call(this);
      this.val = val
    };
    Charset.prototype.__proto__ = Node.prototype;
    Charset.prototype.toString = function () {
      return "@charset " + this.val
    };
    Charset.prototype.toJSON = function () {
      return {__type: "Charset", val: this.val, lineno: this.lineno, column: this.column, filename: this.filename}
    }
  });
  require.register("nodes/namespace.js", function (module, exports, require) {
    var Node = require("./node");
    var Namespace = module.exports = function Namespace(val, prefix) {
      Node.call(this);
      this.val = val;
      this.prefix = prefix
    };
    Namespace.prototype.__proto__ = Node.prototype;
    Namespace.prototype.toString = function () {
      return "@namespace " + (this.prefix ? this.prefix + " " : "") + this.val
    };
    Namespace.prototype.toJSON = function () {
      return {
        __type:   "Namespace", val: this.val, prefix: this.prefix, lineno: this.lineno, column: this.column,
        filename: this.filename,
      }
    }
  });
  require.register("nodes/comment.js", function (module, exports, require) {
    var Node = require("./node");
    var Comment = module.exports = function Comment(str, suppress, inline) {
      Node.call(this);
      this.str = str;
      this.suppress = suppress;
      this.inline = inline
    };
    Comment.prototype.__proto__ = Node.prototype;
    Comment.prototype.toJSON = function () {
      return {
        __type: "Comment", str: this.str, suppress: this.suppress, inline: this.inline, lineno: this.lineno,
        column: this.column, filename: this.filename,
      }
    };
    Comment.prototype.toString = function () {
      return this.str
    }
  });
  require.register("nodes/each.js", function (module, exports, require) {
    var Node = require("./node"), nodes = require("./index");
    var Each = module.exports = function Each(val, key, expr, block) {
      Node.call(this);
      this.val = val;
      this.key = key;
      this.expr = expr;
      this.block = block
    };
    Each.prototype.__proto__ = Node.prototype;
    Each.prototype.clone = function (parent) {
      var clone = new Each(this.val, this.key);
      clone.expr = this.expr.clone(parent, clone);
      clone.block = this.block.clone(parent, clone);
      clone.lineno = this.lineno;
      clone.column = this.column;
      clone.filename = this.filename;
      return clone
    };
    Each.prototype.toJSON = function () {
      return {
        __type: "Each", val: this.val, key: this.key, expr: this.expr, block: this.block, lineno: this.lineno,
        column: this.column, filename: this.filename,
      }
    }
  });
  require.register("nodes/expression.js", function (module, exports, require) {
    var Node = require("./node"), nodes = require("../nodes"), utils = require("../utils");
    var Expression = module.exports = function Expression(isList) {
      Node.call(this);
      this.nodes = [];
      this.isList = isList
    };
    Expression.prototype.__defineGetter__("isEmpty", function () {
      return !this.nodes.length
    });
    Expression.prototype.__defineGetter__("first", function () {
      return this.nodes[0] ? this.nodes[0].first : nodes.nil
    });
    Expression.prototype.__defineGetter__("hash", function () {
      return this.nodes.map(function (node) {
        return node.hash
      }).join("::")
    });
    Expression.prototype.__proto__ = Node.prototype;
    Expression.prototype.clone = function (parent) {
      var clone = new this.constructor(this.isList);
      clone.preserve = this.preserve;
      clone.lineno = this.lineno;
      clone.column = this.column;
      clone.filename = this.filename;
      clone.nodes = this.nodes.map(function (node) {
        return node.clone(parent, clone)
      });
      return clone
    };
    Expression.prototype.push = function (node) {
      this.nodes.push(node)
    };
    Expression.prototype.operate = function (op, right, val) {
      switch (op) {
        case"[]=":
          var self = this, range = utils.unwrap(right).nodes, val = utils.unwrap(val), len, node;
          range.forEach(function (unit) {
            len = self.nodes.length;
            if ("unit" == unit.nodeName) {
              var i = unit.val < 0 ? len + unit.val : unit.val, n = i;
              while (i-- > len) self.nodes[i] = nodes.nil;
              self.nodes[n] = val
            } else if (unit.string) {
              node = self.nodes[0];
              if (node && "object" == node.nodeName) node.set(unit.string, val.clone())
            }
          });
          return val;
        case"[]":
          var expr = new nodes.Expression, vals = utils.unwrap(this).nodes, range = utils.unwrap(right).nodes, node;
          range.forEach(function (unit) {
            if ("unit" == unit.nodeName) {node = vals[unit.val < 0 ? vals.length + unit.val : unit.val]} else if ("object" == vals[0].nodeName) {node = vals[0].get(unit.string)}
            if (node) expr.push(node)
          });
          return expr.isEmpty ? nodes.nil : utils.unwrap(expr);
        case"||":
          return this.toBoolean().isTrue ? this : right;
        case"in":
          return Node.prototype.operate.call(this, op, right);
        case"!=":
          return this.operate("==", right, val).negate();
        case"==":
          var len = this.nodes.length, right = right.toExpression(), a, b;
          if (len != right.nodes.length) return nodes.no;
          for (var i = 0; i < len; ++i) {
            a = this.nodes[i];
            b = right.nodes[i];
            if (a.operate(op, b).isTrue) continue;
            return nodes.no
          }
          return nodes.yes;
          break;
        default:
          return this.first.operate(op, right, val)
      }
    };
    Expression.prototype.toBoolean = function () {
      if (this.nodes.length > 1) return nodes.yes;
      return this.first.toBoolean()
    };
    Expression.prototype.toString = function () {
      return "(" + this.nodes.map(function (node) {
        return node.toString()
      }).join(this.isList ? ", " : " ") + ")"
    };
    Expression.prototype.toJSON = function () {
      return {
        __type:   "Expression", isList: this.isList, preserve: this.preserve, lineno: this.lineno, column: this.column,
        filename: this.filename, nodes: this.nodes,
      }
    }
  });
  require.register("nodes/function.js", function (module, exports, require) {
    var Node = require("./node");
    var Function = module.exports = function Function(name, params, body) {
      Node.call(this);
      this.name = name;
      this.params = params;
      this.block = body;
      if ("function" == typeof params) this.fn = params
    };
    Function.prototype.__defineGetter__("arity", function () {
      return this.params.length
    });
    Function.prototype.__proto__ = Node.prototype;
    Function.prototype.__defineGetter__("hash", function () {
      return "function " + this.name
    });
    Function.prototype.clone = function (parent) {
      if (this.fn) {var clone = new Function(this.name, this.fn)} else {
        var clone = new Function(this.name);
        clone.params = this.params.clone(parent, clone);
        clone.block = this.block.clone(parent, clone)
      }
      clone.lineno = this.lineno;
      clone.column = this.column;
      clone.filename = this.filename;
      return clone
    };
    Function.prototype.toString = function () {
      if (this.fn) {return this.name + "(" + this.fn.toString().match(/^function *\w*\((.*?)\)/).slice(1).join(", ") + ")"} else {return this.name + "(" + this.params.nodes.join(", ") + ")"}
    };
    Function.prototype.toJSON = function () {
      var json = {
        __type: "Function", name: this.name, lineno: this.lineno, column: this.column, filename: this.filename,
      };
      if (this.fn) {json.fn = this.fn} else {
        json.params = this.params;
        json.block = this.block
      }
      return json
    }
  });
  require.register("nodes/group.js", function (module, exports, require) {
    var Node = require("./node");
    var Group = module.exports = function Group() {
      Node.call(this);
      this.nodes = [];
      this.extends = []
    };
    Group.prototype.__proto__ = Node.prototype;
    Group.prototype.push = function (selector) {
      this.nodes.push(selector)
    };
    Group.prototype.__defineGetter__("block", function () {
      return this.nodes[0].block
    });
    Group.prototype.__defineSetter__("block", function (block) {
      for (var i = 0, len = this.nodes.length; i < len; ++i) {this.nodes[i].block = block}
    });
    Group.prototype.__defineGetter__("hasOnlyPlaceholders", function () {
      return this.nodes.every(function (selector) {
        return selector.isPlaceholder
      })
    });
    Group.prototype.clone = function (parent) {
      var clone = new Group;
      clone.lineno = this.lineno;
      clone.column = this.column;
      this.nodes.forEach(function (node) {
        clone.push(node.clone(parent, clone))
      });
      clone.filename = this.filename;
      clone.block = this.block.clone(parent, clone);
      return clone
    };
    Group.prototype.toJSON = function () {
      return {
        __type:   "Group", nodes: this.nodes, block: this.block, lineno: this.lineno, column: this.column,
        filename: this.filename,
      }
    }
  });
  require.register("nodes/hsla.js", function (module, exports, require) {
    var Node = require("./node"), nodes = require("./index");
    var HSLA = exports = module.exports = function HSLA(h, s, l, a) {
      Node.call(this);
      this.h = clampDegrees(h);
      this.s = clampPercentage(s);
      this.l = clampPercentage(l);
      this.a = clampAlpha(a);
      this.hsla = this
    };
    HSLA.prototype.__proto__ = Node.prototype;
    HSLA.prototype.toString = function () {
      return "hsla(" + this.h + "," + this.s.toFixed(0) + "%," + this.l.toFixed(0) + "%," + this.a + ")"
    };
    HSLA.prototype.clone = function (parent) {
      var clone = new HSLA(this.h, this.s, this.l, this.a);
      clone.lineno = this.lineno;
      clone.column = this.column;
      clone.filename = this.filename;
      return clone
    };
    HSLA.prototype.toJSON = function () {
      return {
        __type:   "HSLA", h: this.h, s: this.s, l: this.l, a: this.a, lineno: this.lineno, column: this.column,
        filename: this.filename,
      }
    };
    HSLA.prototype.__defineGetter__("rgba", function () {
      return nodes.RGBA.fromHSLA(this)
    });
    HSLA.prototype.__defineGetter__("hash", function () {
      return this.rgba.toString()
    });
    HSLA.prototype.add = function (h, s, l) {
      return new HSLA(this.h + h, this.s + s, this.l + l, this.a)
    };
    HSLA.prototype.sub = function (h, s, l) {
      return this.add(-h, -s, -l)
    };
    HSLA.prototype.operate = function (op, right) {
      switch (op) {
        case"==":
        case"!=":
        case"<=":
        case">=":
        case"<":
        case">":
        case"is a":
        case"||":
        case"&&":
          return this.rgba.operate(op, right);
        default:
          return this.rgba.operate(op, right).hsla
      }
    };
    exports.fromRGBA = function (rgba) {
      var r = rgba.r / 255, g = rgba.g / 255, b = rgba.b / 255, a = rgba.a;
      var min = Math.min(r, g, b), max = Math.max(r, g, b), l = (max + min) / 2, d = max - min, h, s;
      switch (max) {
        case min:
          h = 0;
          break;
        case r:
          h = 60 * (g - b) / d;
          break;
        case g:
          h = 60 * (b - r) / d + 120;
          break;
        case b:
          h = 60 * (r - g) / d + 240;
          break
      }
      if (max == min) {s = 0} else if (l < .5) {s = d / (2 * l)} else {s = d / (2 - 2 * l)}
      h %= 360;
      s *= 100;
      l *= 100;
      return new HSLA(h, s, l, a)
    };
    HSLA.prototype.adjustLightness = function (percent) {
      this.l = clampPercentage(this.l + this.l * (percent / 100));
      return this
    };
    HSLA.prototype.adjustHue = function (deg) {
      this.h = clampDegrees(this.h + deg);
      return this
    };

    function clampDegrees(n) {
      n = n % 360;
      return n >= 0 ? n : 360 + n
    }

    function clampPercentage(n) {
      return Math.max(0, Math.min(n, 100))
    }

    function clampAlpha(n) {
      return Math.max(0, Math.min(n, 1))
    }
  });
  require.register("nodes/ident.js", function (module, exports, require) {
    var Node = require("./node"), nodes = require("./index");
    var Ident = module.exports = function Ident(name, val, mixin) {
      Node.call(this);
      this.name = name;
      this.string = name;
      this.val = val || nodes.nil;
      this.mixin = !!mixin
    };
    Ident.prototype.__defineGetter__("isEmpty", function () {
      return undefined == this.val
    });
    Ident.prototype.__defineGetter__("hash", function () {
      return this.name
    });
    Ident.prototype.__proto__ = Node.prototype;
    Ident.prototype.clone = function (parent) {
      var clone = new Ident(this.name);
      clone.val = this.val.clone(parent, clone);
      clone.mixin = this.mixin;
      clone.lineno = this.lineno;
      clone.column = this.column;
      clone.filename = this.filename;
      clone.property = this.property;
      clone.rest = this.rest;
      return clone
    };
    Ident.prototype.toJSON = function () {
      return {
        __type: "Ident", name: this.name, val: this.val, mixin: this.mixin, property: this.property, rest: this.rest,
        lineno: this.lineno, column: this.column, filename: this.filename,
      }
    };
    Ident.prototype.toString = function () {
      return this.name
    };
    Ident.prototype.coerce = function (other) {
      switch (other.nodeName) {
        case"ident":
        case"string":
        case"literal":
          return new Ident(other.string);
        case"unit":
          return new Ident(other.toString());
        default:
          return Node.prototype.coerce.call(this, other)
      }
    };
    Ident.prototype.operate = function (op, right) {
      var val = right.first;
      switch (op) {
        case"-":
          if ("unit" == val.nodeName) {
            var expr = new nodes.Expression;
            val = val.clone();
            val.val = -val.val;
            expr.push(this);
            expr.push(val);
            return expr
          }
        case"+":
          return new nodes.Ident(this.string + this.coerce(val).string)
      }
      return Node.prototype.operate.call(this, op, right)
    }
  });
  require.register("nodes/if.js", function (module, exports, require) {
    var Node = require("./node");
    var If = module.exports = function If(cond, negate) {
      Node.call(this);
      this.cond = cond;
      this.elses = [];
      if (negate && negate.nodeName) {this.block = negate} else {this.negate = negate}
    };
    If.prototype.__proto__ = Node.prototype;
    If.prototype.clone = function (parent) {
      var clone = new If;
      clone.cond = this.cond.clone(parent, clone);
      clone.block = this.block.clone(parent, clone);
      clone.elses = this.elses.map(function (node) {
        return node.clone(parent, clone)
      });
      clone.negate = this.negate;
      clone.postfix = this.postfix;
      clone.lineno = this.lineno;
      clone.column = this.column;
      clone.filename = this.filename;
      return clone
    };
    If.prototype.toJSON = function () {
      return {
        __type: "If", cond: this.cond, block: this.block, elses: this.elses, negate: this.negate, postfix: this.postfix,
        lineno: this.lineno, column: this.column, filename: this.filename,
      }
    }
  });
  require.register("nodes/import.js", function (module, exports, require) {
    var Node = require("./node");
    var Import = module.exports = function Import(expr, once) {
      Node.call(this);
      this.path = expr;
      this.once = once || false
    };
    Import.prototype.__proto__ = Node.prototype;
    Import.prototype.clone = function (parent) {
      var clone = new Import;
      clone.path = this.path.nodeName ? this.path.clone(parent, clone) : this.path;
      clone.once = this.once;
      clone.mtime = this.mtime;
      clone.lineno = this.lineno;
      clone.column = this.column;
      clone.filename = this.filename;
      return clone
    };
    Import.prototype.toJSON = function () {
      return {
        __type: "Import", path: this.path, once: this.once, mtime: this.mtime, lineno: this.lineno,
        column: this.column, filename: this.filename,
      }
    }
  });
  require.register("nodes/extend.js", function (module, exports, require) {
    var Node = require("./node");
    var Extend = module.exports = function Extend(selectors) {
      Node.call(this);
      this.selectors = selectors
    };
    Extend.prototype.__proto__ = Node.prototype;
    Extend.prototype.clone = function () {
      return new Extend(this.selectors)
    };
    Extend.prototype.toString = function () {
      return "@extend " + this.selectors.join(", ")
    };
    Extend.prototype.toJSON = function () {
      return {
        __type: "Extend", selectors: this.selectors, lineno: this.lineno, column: this.column, filename: this.filename,
      }
    }
  });
  require.register("nodes/index.js", function (module, exports, require) {
    exports.Node = require("./node");
    exports.Root = require("./root");
    exports.Null = require("./null");
    exports.Each = require("./each");
    exports.If = require("./if");
    exports.Call = require("./call");
    exports.UnaryOp = require("./unaryop");
    exports.BinOp = require("./binop");
    exports.Ternary = require("./ternary");
    exports.Block = require("./block");
    exports.Unit = require("./unit");
    exports.String = require("./string");
    exports.HSLA = require("./hsla");
    exports.RGBA = require("./rgba");
    exports.Ident = require("./ident");
    exports.Group = require("./group");
    exports.Literal = require("./literal");
    exports.Boolean = require("./boolean");
    exports.Return = require("./return");
    exports.Media = require("./media");
    exports.QueryList = require("./query-list");
    exports.Query = require("./query");
    exports.Feature = require("./feature");
    exports.Params = require("./params");
    exports.Comment = require("./comment");
    exports.Keyframes = require("./keyframes");
    exports.Member = require("./member");
    exports.Charset = require("./charset");
    exports.Namespace = require("./namespace");
    exports.Import = require("./import");
    exports.Extend = require("./extend");
    exports.Object = require("./object");
    exports.Function = require("./function");
    exports.Property = require("./property");
    exports.Selector = require("./selector");
    exports.Expression = require("./expression");
    exports.Arguments = require("./arguments");
    exports.Atblock = require("./atblock");
    exports.Atrule = require("./atrule");
    exports.Supports = require("./supports");
    exports.yes = new exports.Boolean(true);
    exports.no = new exports.Boolean(false);
    exports.nil = new exports.Null
  });
  require.register("nodes/keyframes.js", function (module, exports, require) {
    var Atrule = require("./atrule");
    var Keyframes = module.exports = function Keyframes(segs, prefix) {
      Atrule.call(this, "keyframes");
      this.segments = segs;
      this.prefix = prefix || "official"
    };
    Keyframes.prototype.__proto__ = Atrule.prototype;
    Keyframes.prototype.clone = function (parent) {
      var clone = new Keyframes;
      clone.lineno = this.lineno;
      clone.column = this.column;
      clone.filename = this.filename;
      clone.segments = this.segments.map(function (node) {
        return node.clone(parent, clone)
      });
      clone.prefix = this.prefix;
      clone.block = this.block.clone(parent, clone);
      return clone
    };
    Keyframes.prototype.toJSON = function () {
      return {
        __type: "Keyframes", segments: this.segments, prefix: this.prefix, block: this.block, lineno: this.lineno,
        column: this.column, filename: this.filename,
      }
    };
    Keyframes.prototype.toString = function () {
      return "@keyframes " + this.segments.join("")
    }
  });
  require.register("nodes/literal.js", function (module, exports, require) {
    var Node = require("./node"), nodes = require("./index");
    var Literal = module.exports = function Literal(str) {
      Node.call(this);
      this.val = str;
      this.string = str;
      this.prefixed = false
    };
    Literal.prototype.__proto__ = Node.prototype;
    Literal.prototype.__defineGetter__("hash", function () {
      return this.val
    });
    Literal.prototype.toString = function () {
      return this.val
    };
    Literal.prototype.coerce = function (other) {
      switch (other.nodeName) {
        case"ident":
        case"string":
        case"literal":
          return new Literal(other.string);
        default:
          return Node.prototype.coerce.call(this, other)
      }
    };
    Literal.prototype.operate = function (op, right) {
      var val = right.first;
      switch (op) {
        case"+":
          return new nodes.Literal(this.string + this.coerce(val).string);
        default:
          return Node.prototype.operate.call(this, op, right)
      }
    };
    Literal.prototype.toJSON = function () {
      return {
        __type: "Literal", val: this.val, string: this.string, prefixed: this.prefixed, lineno: this.lineno,
        column: this.column, filename: this.filename,
      }
    }
  });
  require.register("nodes/media.js", function (module, exports, require) {
    var Atrule = require("./atrule");
    var Media = module.exports = function Media(val) {
      Atrule.call(this, "media");
      this.val = val
    };
    Media.prototype.__proto__ = Atrule.prototype;
    Media.prototype.clone = function (parent) {
      var clone = new Media;
      clone.val = this.val.clone(parent, clone);
      clone.block = this.block.clone(parent, clone);
      clone.lineno = this.lineno;
      clone.column = this.column;
      clone.filename = this.filename;
      return clone
    };
    Media.prototype.toJSON = function () {
      return {
        __type:   "Media", val: this.val, block: this.block, lineno: this.lineno, column: this.column,
        filename: this.filename,
      }
    };
    Media.prototype.toString = function () {
      return "@media " + this.val
    }
  });
  require.register("nodes/query-list.js", function (module, exports, require) {
    var Node = require("./node");
    var QueryList = module.exports = function QueryList() {
      Node.call(this);
      this.nodes = []
    };
    QueryList.prototype.__proto__ = Node.prototype;
    QueryList.prototype.clone = function (parent) {
      var clone = new QueryList;
      clone.lineno = this.lineno;
      clone.column = this.column;
      clone.filename = this.filename;
      for (var i = 0; i < this.nodes.length; ++i) {clone.push(this.nodes[i].clone(parent, clone))}
      return clone
    };
    QueryList.prototype.push = function (node) {
      this.nodes.push(node)
    };
    QueryList.prototype.merge = function (other) {
      var list = new QueryList, merged;
      this.nodes.forEach(function (query) {
        for (var i = 0, len = other.nodes.length; i < len; ++i) {
          merged = query.merge(other.nodes[i]);
          if (merged) list.push(merged)
        }
      });
      return list
    };
    QueryList.prototype.toString = function () {
      return "(" + this.nodes.map(function (node) {
        return node.toString()
      }).join(", ") + ")"
    };
    QueryList.prototype.toJSON = function () {
      return {__type: "QueryList", nodes: this.nodes, lineno: this.lineno, column: this.column, filename: this.filename}
    }
  });
  require.register("nodes/query.js", function (module, exports, require) {
    var Node = require("./node");
    var Query = module.exports = function Query() {
      Node.call(this);
      this.nodes = [];
      this.type = "";
      this.predicate = ""
    };
    Query.prototype.__proto__ = Node.prototype;
    Query.prototype.clone = function (parent) {
      var clone = new Query;
      clone.predicate = this.predicate;
      clone.type = this.type;
      for (var i = 0, len = this.nodes.length; i < len; ++i) {clone.push(this.nodes[i].clone(parent, clone))}
      clone.lineno = this.lineno;
      clone.column = this.column;
      clone.filename = this.filename;
      return clone
    };
    Query.prototype.push = function (feature) {
      this.nodes.push(feature)
    };
    Query.prototype.__defineGetter__("resolvedType", function () {
      if (this.type) {return this.type.nodeName ? this.type.string : this.type}
    });
    Query.prototype.__defineGetter__("resolvedPredicate", function () {
      if (this.predicate) {return this.predicate.nodeName ? this.predicate.string : this.predicate}
    });
    Query.prototype.merge = function (other) {
      var query = new Query,
        p1 = this.resolvedPredicate,
        p2 = other.resolvedPredicate,
        t1 = this.resolvedType,
        t2 = other.resolvedType,
        type,
        pred;
      t1 = t1 || t2;
      t2 = t2 || t1;
      if ("not" == p1 ^ "not" == p2) {
        if (t1 == t2) return;
        type = "not" == p1 ? t2 : t1;
        pred = "not" == p1 ? p2 : p1
      } else if ("not" == p1 && "not" == p2) {
        if (t1 != t2) return;
        type = t1;
        pred = "not"
      } else if (t1 != t2) {return} else {
        type = t1;
        pred = p1 || p2
      }
      query.predicate = pred;
      query.type = type;
      query.nodes = this.nodes.concat(other.nodes);
      return query
    };
    Query.prototype.toString = function () {
      var pred = this.predicate ? this.predicate + " " : "",
        type = this.type || "",
        len = this.nodes.length,
        str = pred + type;
      if (len) {
        str += (type && " and ") + this.nodes.map(function (expr) {
          return expr.toString()
        }).join(" and ")
      }
      return str
    };
    Query.prototype.toJSON = function () {
      return {
        __type: "Query", predicate: this.predicate, type: this.type, nodes: this.nodes, lineno: this.lineno,
        column: this.column, filename: this.filename,
      }
    }
  });
  require.register("nodes/feature.js", function (module, exports, require) {
    var Node = require("./node");
    var Feature = module.exports = function Feature(segs) {
      Node.call(this);
      this.segments = segs;
      this.expr = null
    };
    Feature.prototype.__proto__ = Node.prototype;
    Feature.prototype.clone = function (parent) {
      var clone = new Feature;
      clone.segments = this.segments.map(function (node) {
        return node.clone(parent, clone)
      });
      if (this.expr) clone.expr = this.expr.clone(parent, clone);
      if (this.name) clone.name = this.name;
      clone.lineno = this.lineno;
      clone.column = this.column;
      clone.filename = this.filename;
      return clone
    };
    Feature.prototype.toString = function () {
      if (this.expr) {return "(" + this.segments.join("") + ": " + this.expr.toString() + ")"} else {return this.segments.join("")}
    };
    Feature.prototype.toJSON = function () {
      var json = {
        __type: "Feature", segments: this.segments, lineno: this.lineno, column: this.column, filename: this.filename,
      };
      if (this.expr) json.expr = this.expr;
      if (this.name) json.name = this.name;
      return json
    }
  });
  require.register("nodes/node.js", function (module, exports, require) {
    var Evaluator = require("../visitor/evaluator"), utils = require("../utils"), nodes = require("./index");

    function CoercionError(msg) {
      this.name = "CoercionError";
      this.message = msg;
      Error.captureStackTrace(this, CoercionError)
    }

    CoercionError.prototype.__proto__ = Error.prototype;
    var Node = module.exports = function Node() {
      this.lineno = nodes.lineno || 1;
      this.column = nodes.column || 1;
      this.filename = nodes.filename
    };
    Node.prototype = {
      constructor:     Node, get first() {
        return this
      }, get hash() {
        return this.val
      }, get nodeName() {
        return this.constructor.name.toLowerCase()
      }, clone:        function () {
        return this
      }, toJSON:       function () {
        return {lineno: this.lineno, column: this.column, filename: this.filename}
      }, eval:         function () {
        return new Evaluator(this).evaluate()
      }, toBoolean:    function () {
        return nodes.yes
      }, toExpression: function () {
        if ("expression" == this.nodeName) return this;
        var expr = new nodes.Expression;
        expr.push(this);
        return expr
      }, shouldCoerce: function (op) {
        switch (op) {
          case"is a":
          case"in":
          case"||":
          case"&&":
            return false;
          default:
            return true
        }
      }, operate:      function (op, right) {
        switch (op) {
          case"is a":
            if ("string" == right.first.nodeName) {return nodes.Boolean(this.nodeName == right.val)} else {throw new Error('"is a" expects a string, got ' + right.toString())}
          case"==":
            return nodes.Boolean(this.hash == right.hash);
          case"!=":
            return nodes.Boolean(this.hash != right.hash);
          case">=":
            return nodes.Boolean(this.hash >= right.hash);
          case"<=":
            return nodes.Boolean(this.hash <= right.hash);
          case">":
            return nodes.Boolean(this.hash > right.hash);
          case"<":
            return nodes.Boolean(this.hash < right.hash);
          case"||":
            return this.toBoolean().isTrue ? this : right;
          case"in":
            var vals = utils.unwrap(right).nodes, len = vals && vals.length, hash = this.hash;
            if (!vals) throw new Error('"in" given invalid right-hand operand, expecting an expression');
            if (1 == len && "object" == vals[0].nodeName) {return nodes.Boolean(vals[0].has(this.hash))}
            for (var i = 0; i < len; ++i) {if (hash == vals[i].hash) {return nodes.yes}}
            return nodes.no;
          case"&&":
            var a = this.toBoolean(), b = right.toBoolean();
            return a.isTrue && b.isTrue ? right : a.isFalse ? this : right;
          default:
            if ("[]" == op) {var msg = "cannot perform " + this + "[" + right + "]"} else {var msg = "cannot perform" + " " + this + " " + op + " " + right}
            throw new Error(msg)
        }
      }, coerce:       function (other) {
        if (other.nodeName == this.nodeName) return other;
        throw new CoercionError("cannot coerce " + other + " to " + this.nodeName)
      },
    }
  });
  require.register("nodes/null.js", function (module, exports, require) {
    var Node = require("./node"), nodes = require("./index");
    var Null = module.exports = function Null() {
    };
    Null.prototype.__proto__ = Node.prototype;
    Null.prototype.inspect = Null.prototype.toString = function () {
      return "null"
    };
    Null.prototype.toBoolean = function () {
      return nodes.no
    };
    Null.prototype.__defineGetter__("isNull", function () {
      return true
    });
    Null.prototype.__defineGetter__("hash", function () {
      return null
    });
    Null.prototype.toJSON = function () {
      return {__type: "Null", lineno: this.lineno, column: this.column, filename: this.filename}
    }
  });
  require.register("nodes/params.js", function (module, exports, require) {
    var Node = require("./node");
    var Params = module.exports = function Params() {
      Node.call(this);
      this.nodes = []
    };
    Params.prototype.__defineGetter__("length", function () {
      return this.nodes.length
    });
    Params.prototype.__proto__ = Node.prototype;
    Params.prototype.push = function (node) {
      this.nodes.push(node)
    };
    Params.prototype.clone = function (parent) {
      var clone = new Params;
      clone.lineno = this.lineno;
      clone.column = this.column;
      clone.filename = this.filename;
      this.nodes.forEach(function (node) {
        clone.push(node.clone(parent, clone))
      });
      return clone
    };
    Params.prototype.toJSON = function () {
      return {__type: "Params", nodes: this.nodes, lineno: this.lineno, column: this.column, filename: this.filename}
    }
  });
  require.register("nodes/property.js", function (module, exports, require) {
    var Node = require("./node");
    var Property = module.exports = function Property(segs, expr) {
      Node.call(this);
      this.segments = segs;
      this.expr = expr
    };
    Property.prototype.__proto__ = Node.prototype;
    Property.prototype.clone = function (parent) {
      var clone = new Property(this.segments);
      clone.name = this.name;
      if (this.literal) clone.literal = this.literal;
      clone.lineno = this.lineno;
      clone.column = this.column;
      clone.filename = this.filename;
      clone.segments = this.segments.map(function (node) {
        return node.clone(parent, clone)
      });
      if (this.expr) clone.expr = this.expr.clone(parent, clone);
      return clone
    };
    Property.prototype.toJSON = function () {
      var json = {
        __type:   "Property", segments: this.segments, name: this.name, lineno: this.lineno, column: this.column,
        filename: this.filename,
      };
      if (this.expr) json.expr = this.expr;
      if (this.literal) json.literal = this.literal;
      return json
    };
    Property.prototype.toString = function () {
      return "property(" + this.segments.join("") + ", " + this.expr + ")"
    };
    Property.prototype.operate = function (op, right, val) {
      return this.expr.operate(op, right, val)
    }
  });
  require.register("nodes/return.js", function (module, exports, require) {
    var Node = require("./node"), nodes = require("./index");
    var Return = module.exports = function Return(expr) {
      this.expr = expr || nodes.nil
    };
    Return.prototype.__proto__ = Node.prototype;
    Return.prototype.clone = function (parent) {
      var clone = new Return;
      clone.expr = this.expr.clone(parent, clone);
      clone.lineno = this.lineno;
      clone.column = this.column;
      clone.filename = this.filename;
      return clone
    };
    Return.prototype.toJSON = function () {
      return {__type: "Return", expr: this.expr, lineno: this.lineno, column: this.column, filename: this.filename}
    }
  });
  require.register("nodes/rgba.js", function (module, exports, require) {
    var Node = require("./node"),
      HSLA = require("./hsla"),
      functions = require("../functions"),
      adjust = functions.adjust,
      nodes = require("./index");
    var RGBA = exports = module.exports = function RGBA(r, g, b, a) {
      Node.call(this);
      this.r = clamp(r);
      this.g = clamp(g);
      this.b = clamp(b);
      this.a = clampAlpha(a);
      this.name = "";
      this.rgba = this
    };
    RGBA.prototype.__proto__ = Node.prototype;
    RGBA.withoutClamping = function (r, g, b, a) {
      var rgba = new RGBA(0, 0, 0, 0);
      rgba.r = r;
      rgba.g = g;
      rgba.b = b;
      rgba.a = a;
      return rgba
    };
    RGBA.prototype.clone = function () {
      var clone = new RGBA(this.r, this.g, this.b, this.a);
      clone.raw = this.raw;
      clone.name = this.name;
      clone.lineno = this.lineno;
      clone.column = this.column;
      clone.filename = this.filename;
      return clone
    };
    RGBA.prototype.toJSON = function () {
      return {
        __type: "RGBA", r: this.r, g: this.g, b: this.b, a: this.a, raw: this.raw, name: this.name, lineno: this.lineno,
        column: this.column, filename: this.filename,
      }
    };
    RGBA.prototype.toBoolean = function () {
      return nodes.yes
    };
    RGBA.prototype.__defineGetter__("hsla", function () {
      return HSLA.fromRGBA(this)
    });
    RGBA.prototype.__defineGetter__("hash", function () {
      return this.toString()
    });
    RGBA.prototype.add = function (r, g, b, a) {
      return new RGBA(this.r + r, this.g + g, this.b + b, this.a + a)
    };
    RGBA.prototype.sub = function (r, g, b, a) {
      return new RGBA(this.r - r, this.g - g, this.b - b, a == 1 ? this.a : this.a - a)
    };
    RGBA.prototype.multiply = function (n) {
      return new RGBA(this.r * n, this.g * n, this.b * n, this.a)
    };
    RGBA.prototype.divide = function (n) {
      return new RGBA(this.r / n, this.g / n, this.b / n, this.a)
    };
    RGBA.prototype.operate = function (op, right) {
      if ("in" != op) right = right.first;
      switch (op) {
        case"is a":
          if ("string" == right.nodeName && "color" == right.string) {return nodes.yes}
          break;
        case"+":
          switch (right.nodeName) {
            case"unit":
              var n = right.val;
              switch (right.type) {
                case"%":
                  return adjust(this, new nodes.String("lightness"), right);
                case"deg":
                  return this.hsla.adjustHue(n).rgba;
                default:
                  return this.add(n, n, n, 0)
              }
            case"rgba":
              return this.add(right.r, right.g, right.b, right.a);
            case"hsla":
              return this.hsla.add(right.h, right.s, right.l)
          }
          break;
        case"-":
          switch (right.nodeName) {
            case"unit":
              var n = right.val;
              switch (right.type) {
                case"%":
                  return adjust(this, new nodes.String("lightness"), new nodes.Unit(-n, "%"));
                case"deg":
                  return this.hsla.adjustHue(-n).rgba;
                default:
                  return this.sub(n, n, n, 0)
              }
            case"rgba":
              return this.sub(right.r, right.g, right.b, right.a);
            case"hsla":
              return this.hsla.sub(right.h, right.s, right.l)
          }
          break;
        case"*":
          switch (right.nodeName) {
            case"unit":
              return this.multiply(right.val)
          }
          break;
        case"/":
          switch (right.nodeName) {
            case"unit":
              return this.divide(right.val)
          }
          break
      }
      return Node.prototype.operate.call(this, op, right)
    };
    RGBA.prototype.toString = function () {
      function pad(n) {
        return n < 16 ? "0" + n.toString(16) : n.toString(16)
      }

      if ("transparent" == this.name) return this.name;
      if (1 == this.a) {
        var r = pad(this.r), g = pad(this.g), b = pad(this.b);
        if (r[0] == r[1] && g[0] == g[1] && b[0] == b[1]) {return "#" + r[0] + g[0] + b[0]} else {return "#" + r + g + b}
      } else {return "rgba(" + this.r + "," + this.g + "," + this.b + "," + +this.a.toFixed(3) + ")"}
    };
    exports.fromHSLA = function (hsla) {
      var h = hsla.h / 360, s = hsla.s / 100, l = hsla.l / 100, a = hsla.a;
      var m2 = l <= .5 ? l * (s + 1) : l + s - l * s, m1 = l * 2 - m2;
      var r = hue(h + 1 / 3) * 255, g = hue(h) * 255, b = hue(h - 1 / 3) * 255;

      function hue(h) {
        if (h < 0) ++h;
        if (h > 1) --h;
        if (h * 6 < 1) return m1 + (m2 - m1) * h * 6;
        if (h * 2 < 1) return m2;
        if (h * 3 < 2) return m1 + (m2 - m1) * (2 / 3 - h) * 6;
        return m1
      }

      return new RGBA(r, g, b, a)
    };

    function clamp(n) {
      return Math.max(0, Math.min(n.toFixed(0), 255))
    }

    function clampAlpha(n) {
      return Math.max(0, Math.min(n, 1))
    }
  });
  require.register("nodes/root.js", function (module, exports, require) {
    var Node = require("./node");
    var Root = module.exports = function Root() {
      this.nodes = []
    };
    Root.prototype.__proto__ = Node.prototype;
    Root.prototype.push = function (node) {
      this.nodes.push(node)
    };
    Root.prototype.unshift = function (node) {
      this.nodes.unshift(node)
    };
    Root.prototype.clone = function () {
      var clone = new Root;
      clone.lineno = this.lineno;
      clone.column = this.column;
      clone.filename = this.filename;
      this.nodes.forEach(function (node) {
        clone.push(node.clone(clone, clone))
      });
      return clone
    };
    Root.prototype.toString = function () {
      return "[Root]"
    };
    Root.prototype.toJSON = function () {
      return {__type: "Root", nodes: this.nodes, lineno: this.lineno, column: this.column, filename: this.filename}
    }
  });
  require.register("nodes/selector.js", function (module, exports, require) {
    var Block = require("./block"), Node = require("./node");
    var Selector = module.exports = function Selector(segs) {
      Node.call(this);
      this.inherits = true;
      this.segments = segs;
      this.optional = false
    };
    Selector.prototype.__proto__ = Node.prototype;
    Selector.prototype.toString = function () {
      return this.segments.join("") + (this.optional ? " !optional" : "")
    };
    Selector.prototype.__defineGetter__("isPlaceholder", function () {
      return this.val && ~this.val.substr(0, 2).indexOf("$")
    });
    Selector.prototype.clone = function (parent) {
      var clone = new Selector;
      clone.lineno = this.lineno;
      clone.column = this.column;
      clone.filename = this.filename;
      clone.inherits = this.inherits;
      clone.val = this.val;
      clone.segments = this.segments.map(function (node) {
        return node.clone(parent, clone)
      });
      clone.optional = this.optional;
      return clone
    };
    Selector.prototype.toJSON = function () {
      return {
        __type: "Selector", inherits: this.inherits, segments: this.segments, optional: this.optional, val: this.val,
        lineno: this.lineno, column: this.column, filename: this.filename,
      }
    }
  });
  require.register("nodes/string.js", function (module, exports, require) {
    var Node = require("./node"),
      sprintf = require("../functions").s,
      utils = require("../utils"),
      nodes = require("./index");
    var String = module.exports = function String(val, quote) {
      Node.call(this);
      this.val = val;
      this.string = val;
      this.prefixed = false;
      if (typeof quote !== "string") {this.quote = "'"} else {this.quote = quote}
    };
    String.prototype.__proto__ = Node.prototype;
    String.prototype.toString = function () {
      return this.quote + this.val + this.quote
    };
    String.prototype.clone = function () {
      var clone = new String(this.val, this.quote);
      clone.lineno = this.lineno;
      clone.column = this.column;
      clone.filename = this.filename;
      return clone
    };
    String.prototype.toJSON = function () {
      return {
        __type:   "String", val: this.val, quote: this.quote, lineno: this.lineno, column: this.column,
        filename: this.filename,
      }
    };
    String.prototype.toBoolean = function () {
      return nodes.Boolean(this.val.length)
    };
    String.prototype.coerce = function (other) {
      switch (other.nodeName) {
        case"string":
          return other;
        case"expression":
          return new String(other.nodes.map(function (node) {
            return this.coerce(node).val
          }, this).join(" "));
        default:
          return new String(other.toString())
      }
    };
    String.prototype.operate = function (op, right) {
      switch (op) {
        case"%":
          var expr = new nodes.Expression;
          expr.push(this);
          var args = "expression" == right.nodeName ? utils.unwrap(right).nodes : [right];
          return sprintf.apply(null, [expr].concat(args));
        case"+":
          var expr = new nodes.Expression;
          expr.push(new String(this.val + this.coerce(right).val));
          return expr;
        default:
          return Node.prototype.operate.call(this, op, right)
      }
    }
  });
  require.register("nodes/ternary.js", function (module, exports, require) {
    var Node = require("./node");
    var Ternary = module.exports = function Ternary(cond, trueExpr, falseExpr) {
      Node.call(this);
      this.cond = cond;
      this.trueExpr = trueExpr;
      this.falseExpr = falseExpr
    };
    Ternary.prototype.__proto__ = Node.prototype;
    Ternary.prototype.clone = function (parent) {
      var clone = new Ternary;
      clone.cond = this.cond.clone(parent, clone);
      clone.trueExpr = this.trueExpr.clone(parent, clone);
      clone.falseExpr = this.falseExpr.clone(parent, clone);
      clone.lineno = this.lineno;
      clone.column = this.column;
      clone.filename = this.filename;
      return clone
    };
    Ternary.prototype.toJSON = function () {
      return {
        __type: "Ternary", cond: this.cond, trueExpr: this.trueExpr, falseExpr: this.falseExpr, lineno: this.lineno,
        column: this.column, filename: this.filename,
      }
    }
  });
  require.register("nodes/unaryop.js", function (module, exports, require) {
    var Node = require("./node");
    var UnaryOp = module.exports = function UnaryOp(op, expr) {
      Node.call(this);
      this.op = op;
      this.expr = expr
    };
    UnaryOp.prototype.__proto__ = Node.prototype;
    UnaryOp.prototype.clone = function (parent) {
      var clone = new UnaryOp(this.op);
      clone.expr = this.expr.clone(parent, clone);
      clone.lineno = this.lineno;
      clone.column = this.column;
      clone.filename = this.filename;
      return clone
    };
    UnaryOp.prototype.toJSON = function () {
      return {
        __type:   "UnaryOp", op: this.op, expr: this.expr, lineno: this.lineno, column: this.column,
        filename: this.filename,
      }
    }
  });
  require.register("nodes/unit.js", function (module, exports, require) {
    var Node = require("./node"), nodes = require("./index");
    var FACTOR_TABLE = {
      mm: {val: 1, label: "mm"}, cm: {val: 10, label: "mm"}, "in": {val: 25.4, label: "mm"},
      pt: {val: 25.4 / 72, label: "mm"}, ms: {val: 1, label: "ms"}, s: {val: 1e3, label: "ms"},
      Hz: {val: 1, label: "Hz"}, kHz: {val: 1e3, label: "Hz"},
    };
    var Unit = module.exports = function Unit(val, type) {
      Node.call(this);
      this.val = val;
      this.type = type
    };
    Unit.prototype.__proto__ = Node.prototype;
    Unit.prototype.toBoolean = function () {
      return nodes.Boolean(this.type ? true : this.val)
    };
    Unit.prototype.toString = function () {
      return this.val + (this.type || "")
    };
    Unit.prototype.clone = function () {
      var clone = new Unit(this.val, this.type);
      clone.lineno = this.lineno;
      clone.column = this.column;
      clone.filename = this.filename;
      return clone
    };
    Unit.prototype.toJSON = function () {
      return {
        __type:   "Unit", val: this.val, type: this.type, lineno: this.lineno, column: this.column,
        filename: this.filename,
      }
    };
    Unit.prototype.operate = function (op, right) {
      var type = this.type || right.first.type;
      if ("rgba" == right.nodeName || "hsla" == right.nodeName) {return right.operate(op, this)}
      if (this.shouldCoerce(op)) {
        right = right.first;
        if ("%" != this.type && ("-" == op || "+" == op) && "%" == right.type) {right = new Unit(this.val * (right.val / 100), "%")} else {right = this.coerce(right)}
        switch (op) {
          case"-":
            return new Unit(this.val - right.val, type);
          case"+":
            type = type || right.type == "%" && right.type;
            return new Unit(this.val + right.val, type);
          case"/":
            return new Unit(this.val / right.val, type);
          case"*":
            return new Unit(this.val * right.val, type);
          case"%":
            return new Unit(this.val % right.val, type);
          case"**":
            return new Unit(Math.pow(this.val, right.val), type);
          case"..":
          case"...":
            var start = this.val, end = right.val, expr = new nodes.Expression, inclusive = ".." == op;
            if (start < end) {do {expr.push(new nodes.Unit(start))} while (inclusive ? ++start <= end : ++start < end)} else {do {expr.push(new nodes.Unit(start))} while (inclusive ? --start >= end : --start > end)}
            return expr
        }
      }
      return Node.prototype.operate.call(this, op, right)
    };
    Unit.prototype.coerce = function (other) {
      if ("unit" == other.nodeName) {
        var a = this,
          b = other,
          factorA = FACTOR_TABLE[a.type],
          factorB = FACTOR_TABLE[b.type];
        if (factorA && factorB && factorA.label == factorB.label) {
          var bVal = b.val * (factorB.val / factorA.val);
          return new nodes.Unit(bVal, a.type)
        } else {return new nodes.Unit(b.val, a.type)}
      } else if ("string" == other.nodeName) {
        if ("%" == other.val) return new nodes.Unit(0, "%");
        var val = parseFloat(other.val);
        if (isNaN(val)) Node.prototype.coerce.call(this, other);
        return new nodes.Unit(val)
      } else {return Node.prototype.coerce.call(this, other)}
    }
  });
  require.register("nodes/object.js", function (module, exports, require) {
    var Node = require("./node"), nodes = require("./index"), nativeObj = {}.constructor;
    var Object = module.exports = function Object() {
      Node.call(this);
      this.vals = {}
    };
    Object.prototype.__proto__ = Node.prototype;
    Object.prototype.set = function (key, val) {
      this.vals[key] = val;
      return this
    };
    Object.prototype.__defineGetter__("length", function () {
      return nativeObj.keys(this.vals).length
    });
    Object.prototype.get = function (key) {
      return this.vals[key] || nodes.nil
    };
    Object.prototype.has = function (key) {
      return key in this.vals
    };
    Object.prototype.operate = function (op, right) {
      switch (op) {
        case".":
        case"[]":
          return this.get(right.hash);
        case"==":
          var vals = this.vals, a, b;
          if ("object" != right.nodeName || this.length != right.length) return nodes.no;
          for (var key in vals) {
            a = vals[key];
            b = right.vals[key];
            if (a.operate(op, b).isFalse) return nodes.no;
          }
          return nodes.yes;
        case"!=":
          return this.operate("==", right).negate();
        default:
          return Node.prototype.operate.call(this, op, right)
      }
    };
    Object.prototype.toBoolean = function () {
      return nodes.Boolean(this.length)
    };
    Object.prototype.toBlock = function () {
      var str = "{", key, val;
      for (key in this.vals) {
        val = this.get(key);
        if ("object" == val.first.nodeName) {str += key + " " + val.first.toBlock()} else {
          switch (key) {
            case"@charset":
              str += key + " " + val.first.toString() + ";";
              break;
            default:
              str += key + ":" + toString(val) + ";"
          }
        }
      }
      str += "}";
      return str;

      function toString(node) {
        if (node.nodes) {return node.nodes.map(toString).join(node.isList ? "," : " ")} else if ("literal" == node.nodeName && "," == node.val) {return "\\,"}
        return node.toString()
      }
    };
    Object.prototype.clone = function (parent) {
      var clone = new Object;
      clone.lineno = this.lineno;
      clone.column = this.column;
      clone.filename = this.filename;
      for (var key in this.vals) {clone.vals[key] = this.vals[key].clone(parent, clone)}
      return clone
    };
    Object.prototype.toJSON = function () {
      return {__type: "Object", vals: this.vals, lineno: this.lineno, column: this.column, filename: this.filename}
    };
    Object.prototype.toString = function () {
      var obj = {};
      for (var prop in this.vals) {obj[prop] = this.vals[prop].toString()}
      return JSON.stringify(obj)
    }
  });
  require.register("nodes/supports.js", function (module, exports, require) {
    var Atrule = require("./atrule");
    var Supports = module.exports = function Supports(condition) {
      Atrule.call(this, "supports");
      this.condition = condition
    };
    Supports.prototype.__proto__ = Atrule.prototype;
    Supports.prototype.clone = function (parent) {
      var clone = new Supports;
      clone.condition = this.condition.clone(parent, clone);
      clone.block = this.block.clone(parent, clone);
      clone.lineno = this.lineno;
      clone.column = this.column;
      clone.filename = this.filename;
      return clone
    };
    Supports.prototype.toJSON = function () {
      return {
        __type:   "Supports", condition: this.condition, block: this.block, lineno: this.lineno, column: this.column,
        filename: this.filename,
      }
    };
    Supports.prototype.toString = function () {
      return "@supports " + this.condition
    }
  });
  require.register("nodes/member.js", function (module, exports, require) {
    var Node = require("./node");
    var Member = module.exports = function Member(left, right) {
      Node.call(this);
      this.left = left;
      this.right = right
    };
    Member.prototype.__proto__ = Node.prototype;
    Member.prototype.clone = function (parent) {
      var clone = new Member;
      clone.left = this.left.clone(parent, clone);
      clone.right = this.right.clone(parent, clone);
      if (this.val) clone.val = this.val.clone(parent, clone);
      clone.lineno = this.lineno;
      clone.column = this.column;
      clone.filename = this.filename;
      return clone
    };
    Member.prototype.toJSON = function () {
      var json = {
        __type:   "Member", left: this.left, right: this.right, lineno: this.lineno, column: this.column,
        filename: this.filename,
      };
      if (this.val) json.val = this.val;
      return json
    };
    Member.prototype.toString = function () {
      return this.left.toString() + "." + this.right.toString()
    }
  });
  require.register("nodes/atblock.js", function (module, exports, require) {
    var Node = require("./node");
    var Atblock = module.exports = function Atblock() {
      Node.call(this)
    };
    Atblock.prototype.__defineGetter__("nodes", function () {
      return this.block.nodes
    });
    Atblock.prototype.__proto__ = Node.prototype;
    Atblock.prototype.clone = function (parent) {
      var clone = new Atblock;
      clone.block = this.block.clone(parent, clone);
      clone.lineno = this.lineno;
      clone.column = this.column;
      clone.filename = this.filename;
      return clone
    };
    Atblock.prototype.toString = function () {
      return "@block"
    };
    Atblock.prototype.toJSON = function () {
      return {__type: "Atblock", block: this.block, lineno: this.lineno, column: this.column, fileno: this.fileno}
    }
  });
  require.register("nodes/atrule.js", function (module, exports, require) {
    var Node = require("./node");
    var Atrule = module.exports = function Atrule(type) {
      Node.call(this);
      this.type = type
    };
    Atrule.prototype.__proto__ = Node.prototype;
    Atrule.prototype.__defineGetter__("hasOnlyProperties", function () {
      if (!this.block) return false;
      var nodes = this.block.nodes;
      for (var i = 0, len = nodes.length; i < len; ++i) {
        var nodeName = nodes[i].nodeName;
        switch (nodes[i].nodeName) {
          case"property":
          case"expression":
          case"comment":
            continue;
          default:
            return false
        }
      }
      return true
    });
    Atrule.prototype.clone = function (parent) {
      var clone = new Atrule(this.type);
      if (this.block) clone.block = this.block.clone(parent, clone);
      clone.segments = this.segments.map(function (node) {
        return node.clone(parent, clone)
      });
      clone.lineno = this.lineno;
      clone.column = this.column;
      clone.filename = this.filename;
      return clone
    };
    Atrule.prototype.toJSON = function () {
      var json = {
        __type:   "Atrule", type: this.type, segments: this.segments, lineno: this.lineno, column: this.column,
        filename: this.filename,
      };
      if (this.block) json.block = this.block;
      return json
    };
    Atrule.prototype.toString = function () {
      return "@" + this.type
    };
    Atrule.prototype.__defineGetter__("hasOutput", function () {
      return !!this.block && hasOutput(this.block)
    });

    function hasOutput(block) {
      var nodes = block.nodes;
      if (nodes.every(function (node) {
        return "group" == node.nodeName && node.hasOnlyPlaceholders
      })) {
        return false;
      }
      return nodes.some(function (node) {
        switch (node.nodeName) {
          case"property":
          case"literal":
          case"import":
            return true;
          case"block":
            return hasOutput(node);
          default:
            if (node.block) return hasOutput(node.block)
        }
      })
    }
  });
  require.register("parser.js", function (module, exports, require) {
    var Lexer = require("./lexer"),
      nodes = require("./nodes"),
      Token = require("./token"),
      units = require("./units"),
      errors = require("./errors");
    var selectorTokens = ["ident", "string", "selector", "function", "comment", "boolean", "space", "color", "unit", "for", "in", "[", "]", "(", ")", "+", "-", "*", "*=", "<", ">", "=", ":", "&", "&&", "~", "{", "}", ".", "..", "/"];
    var pseudoSelectors = ["matches", "not", "dir", "lang", "any-link", "link", "visited", "local-link", "target", "scope", "hover", "active", "focus", "drop", "current", "past", "future", "enabled", "disabled", "read-only", "read-write", "placeholder-shown", "checked", "indeterminate", "valid", "invalid", "in-range", "out-of-range", "required", "optional", "user-error", "root", "empty", "blank", "nth-child", "nth-last-child", "first-child", "last-child", "only-child", "nth-of-type", "nth-last-of-type", "first-of-type", "last-of-type", "only-of-type", "nth-match", "nth-last-match", "nth-column", "nth-last-column", "first-line", "first-letter", "before", "after", "selection"];
    var Parser = module.exports = function Parser(str, options) {
      var self = this;
      options = options || {};
      this.lexer = new Lexer(str, options);
      this.prefix = options.prefix || "";
      this.root = options.root || new nodes.Root;
      this.state = ["root"];
      this.stash = [];
      this.parens = 0;
      this.css = 0;
      this.state.pop = function () {
        self.prevState = [].pop.call(this)
      }
    };
    Parser.prototype = {
      constructor:                    Parser, currentState: function () {
        return this.state[this.state.length - 1]
      }, previousState:               function () {
        return this.state[this.state.length - 2]
      }, parse:                       function () {
        var block = this.parent = this.root;
        while ("eos" != this.peek().type) {
          this.skipWhitespace();
          if ("eos" == this.peek().type) break;
          var stmt = this.statement();
          this.accept(";");
          if (!stmt) this.error("unexpected token {peek}, not allowed at the root level");
          block.push(stmt)
        }
        return block
      }, error:                       function (msg) {
        var type = this.peek().type, val = undefined == this.peek().val ? "" : " " + this.peek().toString();
        if (val.trim() == type.trim()) val = "";
        throw new errors.ParseError(msg.replace("{peek}", '"' + type + val + '"'))
      }, accept:                      function (type) {
        if (type == this.peek().type) {return this.next()}
      }, expect:                      function (type) {
        if (type != this.peek().type) {this.error('expected "' + type + '", got {peek}')}
        return this.next()
      }, next:                        function () {
        var tok = this.stash.length ? this.stash.pop() : this.lexer.next(), line = tok.lineno, column = tok.column || 1;
        if (tok.val && tok.val.nodeName) {
          tok.val.lineno = line;
          tok.val.column = column
        }
        nodes.lineno = line;
        nodes.column = column;
        return tok
      }, peek:                        function () {
        return this.lexer.peek()
      }, lookahead:                   function (n) {
        return this.lexer.lookahead(n)
      }, isSelectorToken:             function (n) {
        var la = this.lookahead(n).type;
        switch (la) {
          case"for":
            return this.bracketed;
          case"[":
            this.bracketed = true;
            return true;
          case"]":
            this.bracketed = false;
            return true;
          default:
            return ~selectorTokens.indexOf(la)
        }
      }, isPseudoSelector:            function (n) {
        var val = this.lookahead(n).val;
        return val && ~pseudoSelectors.indexOf(val.name)
      }, lineContains:                function (type) {
        var i = 1, la;
        while (la = this.lookahead(i++)) {
          if (~["indent", "outdent", "newline", "eos"].indexOf(la.type)) return;
          if (type == la.type) return true
        }
      }, selectorToken:               function () {
        if (this.isSelectorToken(1)) {
          if ("{" == this.peek().type) {
            if (!this.lineContains("}")) return;
            var i = 0, la;
            while (la = this.lookahead(++i)) {
              if ("}" == la.type) {
                if (i == 2 || i == 3 && this.lookahead(i - 1).type == "space") return;
                break
              }
              if (":" == la.type) return
            }
          }
          return this.next()
        }
      }, skip:                        function (tokens) {
        while (~tokens.indexOf(this.peek().type)) this.next()
      }, skipWhitespace:              function () {
        this.skip(["space", "indent", "outdent", "newline"])
      }, skipNewlines:                function () {
        while ("newline" == this.peek().type) this.next()
      }, skipSpaces:                  function () {
        while ("space" == this.peek().type) this.next()
      }, skipSpacesAndComments:       function () {
        while ("space" == this.peek().type || "comment" == this.peek().type) this.next()
      }, looksLikeFunctionDefinition: function (i) {
        return "indent" == this.lookahead(i).type || "{" == this.lookahead(i).type
      }, looksLikeSelector:           function (fromProperty) {
        var i = 1, brace;
        if (fromProperty && ":" == this.lookahead(i + 1).type && (this.lookahead(i + 1).space || "indent" == this.lookahead(i + 2).type)) return false;
        while ("ident" == this.lookahead(i).type && ("newline" == this.lookahead(i + 1).type || "," == this.lookahead(i + 1).type)) i += 2;
        while (this.isSelectorToken(i) || "," == this.lookahead(i).type) {
          if ("selector" == this.lookahead(i).type) return true;
          if ("&" == this.lookahead(i + 1).type) return true;
          if ("." == this.lookahead(i).type && "ident" == this.lookahead(i + 1).type) return true;
          if ("*" == this.lookahead(i).type && "newline" == this.lookahead(i + 1).type) return true;
          if (":" == this.lookahead(i).type && ":" == this.lookahead(i + 1).type) return true;
          if ("color" == this.lookahead(i).type && "newline" == this.lookahead(i - 1).type) return true;
          if (this.looksLikeAttributeSelector(i)) return true;
          if (("=" == this.lookahead(i).type || "function" == this.lookahead(i).type) && "{" == this.lookahead(i + 1).type) return false;
          if (":" == this.lookahead(i).type && !this.isPseudoSelector(i + 1) && this.lineContains(".")) return false;
          if ("{" == this.lookahead(i).type) brace = true; else if ("}" == this.lookahead(i).type) brace = false;
          if (brace && ":" == this.lookahead(i).type) return true;
          if ("space" == this.lookahead(i).type && "{" == this.lookahead(i + 1).type) return true;
          if (":" == this.lookahead(i++).type && !this.lookahead(i - 1).space && this.isPseudoSelector(i)) return true;
          if ("space" == this.lookahead(i).type && "newline" == this.lookahead(i + 1).type && "{" == this.lookahead(i + 2).type) return true;
          if ("," == this.lookahead(i).type && "newline" == this.lookahead(i + 1).type) return true
        }
        if ("," == this.lookahead(i).type && "newline" == this.lookahead(i + 1).type) return true;
        if ("{" == this.lookahead(i).type && "newline" == this.lookahead(i + 1).type) return true;
        if (this.css) {if (";" == this.lookahead(i).type || "}" == this.lookahead(i - 1).type) return false}
        while (!~["indent", "outdent", "newline", "for", "if", ";", "}", "eos"].indexOf(this.lookahead(i).type)) ++i;
        if ("indent" == this.lookahead(i).type) return true
      }, looksLikeAttributeSelector:  function (n) {
        var type = this.lookahead(n).type;
        if ("=" == type && this.bracketed) return true;
        return ("ident" == type || "string" == type) && "]" == this.lookahead(n + 1).type && ("newline" == this.lookahead(n + 2).type || this.isSelectorToken(n + 2)) && !this.lineContains(":") && !this.lineContains("=")
      }, looksLikeKeyframe:           function () {
        var i = 2, type;
        switch (this.lookahead(i).type) {
          case"{":
          case"indent":
          case",":
            return true;
          case"newline":
            while ("unit" == this.lookahead(++i).type || "newline" == this.lookahead(i).type) ;
            type = this.lookahead(i).type;
            return "indent" == type || "{" == type
        }
      }, stateAllowsSelector:         function () {
        switch (this.currentState()) {
          case"root":
          case"atblock":
          case"selector":
          case"conditional":
          case"function":
          case"atrule":
          case"for":
            return true
        }
      }, assignAtblock:               function (expr) {
        try {expr.push(this.atblock(expr))}
        catch (err) {this.error("invalid right-hand side operand in assignment, got {peek}")}
      }, statement:                   function () {
        var stmt = this.stmt(), state = this.prevState, block, op;
        if (this.allowPostfix) {
          this.allowPostfix = false;
          state = "expression"
        }
        switch (state) {
          case"assignment":
          case"expression":
          case"function arguments":
            while (op = this.accept("if") || this.accept("unless") || this.accept("for")) {
              switch (op.type) {
                case"if":
                case"unless":
                  stmt = new nodes.If(this.expression(), stmt);
                  stmt.postfix = true;
                  stmt.negate = "unless" == op.type;
                  this.accept(";");
                  break;
                case"for":
                  var key, val = this.id().name;
                  if (this.accept(",")) key = this.id().name;
                  this.expect("in");
                  var each = new nodes.Each(val, key, this.expression());
                  block = new nodes.Block(this.parent, each);
                  block.push(stmt);
                  each.block = block;
                  stmt = each
              }
            }
        }
        return stmt
      }, stmt:                        function () {
        var type = this.peek().type;
        switch (type) {
          case"keyframes":
            return this.keyframes();
          case"-moz-document":
            return this.mozdocument();
          case"comment":
          case"selector":
          case"extend":
          case"literal":
          case"charset":
          case"namespace":
          case"require":
          case"extend":
          case"media":
          case"atrule":
          case"ident":
          case"scope":
          case"supports":
          case"unless":
            return this[type]();
          case"function":
            return this.fun();
          case"import":
            return this.atimport();
          case"if":
            return this.ifstmt();
          case"for":
            return this.forin();
          case"return":
            return this.ret();
          case"{":
            return this.property();
          default:
            if (this.stateAllowsSelector()) {
              switch (type) {
                case"color":
                case"~":
                case">":
                case"<":
                case":":
                case"&":
                case"&&":
                case"[":
                case".":
                case"/":
                  return this.selector();
                case"..":
                  if ("/" == this.lookahead(2).type) return this.selector();
                case"+":
                  return "function" == this.lookahead(2).type ? this.functionCall() : this.selector();
                case"*":
                  return this.property();
                case"unit":
                  if (this.looksLikeKeyframe()) return this.selector();
                case"-":
                  if ("{" == this.lookahead(2).type) return this.property()
              }
            }
            var expr = this.expression();
            if (expr.isEmpty) this.error("unexpected {peek}");
            return expr
        }
      }, block:                       function (node, scope) {
        var delim, stmt, next, block = this.parent = new nodes.Block(this.parent, node);
        if (false === scope) block.scope = false;
        this.accept("newline");
        if (this.accept("{")) {
          this.css++;
          delim = "}";
          this.skipWhitespace()
        } else {
          delim = "outdent";
          this.expect("indent")
        }
        while (delim != this.peek().type) {
          if (this.css) {
            if (this.accept("newline") || this.accept("indent")) continue;
            stmt = this.statement();
            this.accept(";");
            this.skipWhitespace()
          } else {
            if (this.accept("newline")) continue;
            next = this.lookahead(2).type;
            if ("indent" == this.peek().type && ~["outdent", "newline", "comment"].indexOf(next)) {
              this.skip(["indent", "outdent"]);
              continue
            }
            if ("eos" == this.peek().type) return block;
            stmt = this.statement();
            this.accept(";")
          }
          if (!stmt) this.error("unexpected token {peek} in block");
          block.push(stmt)
        }
        if (this.css) {
          this.skipWhitespace();
          this.expect("}");
          this.skipSpaces();
          this.css--
        } else {this.expect("outdent")}
        this.parent = block.parent;
        return block
      }, comment:                     function () {
        var node = this.next().val;
        this.skipSpaces();
        return node
      }, forin:                       function () {
        this.expect("for");
        var key, val = this.id().name;
        if (this.accept(",")) key = this.id().name;
        this.expect("in");
        this.state.push("for");
        this.cond = true;
        var each = new nodes.Each(val, key, this.expression());
        this.cond = false;
        each.block = this.block(each, false);
        this.state.pop();
        return each
      }, ret:                         function () {
        this.expect("return");
        var expr = this.expression();
        return expr.isEmpty ? new nodes.Return : new nodes.Return(expr)
      }, unless:                      function () {
        this.expect("unless");
        this.state.push("conditional");
        this.cond = true;
        var node = new nodes.If(this.expression(), true);
        this.cond = false;
        node.block = this.block(node, false);
        this.state.pop();
        return node
      }, ifstmt:                      function () {
        this.expect("if");
        this.state.push("conditional");
        this.cond = true;
        var node = new nodes.If(this.expression()), cond, block;
        this.cond = false;
        node.block = this.block(node, false);
        this.skip(["newline", "comment"]);
        while (this.accept("else")) {
          if (this.accept("if")) {
            this.cond = true;
            cond = this.expression();
            this.cond = false;
            block = this.block(node, false);
            node.elses.push(new nodes.If(cond, block))
          } else {
            node.elses.push(this.block(node, false));
            break
          }
          this.skip(["newline", "comment"])
        }
        this.state.pop();
        return node
      }, atblock:                     function (node) {
        if (!node) this.expect("atblock");
        node = new nodes.Atblock;
        this.state.push("atblock");
        node.block = this.block(node, false);
        this.state.pop();
        return node
      }, atrule:                      function () {
        var type = this.expect("atrule").val, node = new nodes.Atrule(type), tok;
        this.skipSpacesAndComments();
        node.segments = this.selectorParts();
        this.skipSpacesAndComments();
        tok = this.peek().type;
        if ("indent" == tok || "{" == tok || "newline" == tok && "{" == this.lookahead(2).type) {
          this.state.push("atrule");
          node.block = this.block(node);
          this.state.pop()
        }
        return node
      }, scope:                       function () {
        this.expect("scope");
        var selector = this.selectorParts().map(function (selector) {
          return selector.val
        }).join("");
        this.selectorScope = selector.trim();
        return nodes.nil
      }, supports:                    function () {
        this.expect("supports");
        var node = new nodes.Supports(this.supportsCondition());
        this.state.push("atrule");
        node.block = this.block(node);
        this.state.pop();
        return node
      }, supportsCondition:           function () {
        var node = this.supportsNegation() || this.supportsOp();
        if (!node) {
          this.cond = true;
          node = this.expression();
          this.cond = false
        }
        return node
      }, supportsNegation:            function () {
        if (this.accept("not")) {
          var node = new nodes.Expression;
          node.push(new nodes.Literal("not"));
          node.push(this.supportsFeature());
          return node
        }
      }, supportsOp:                  function () {
        var feature = this.supportsFeature(), op, expr;
        if (feature) {
          expr = new nodes.Expression;
          expr.push(feature);
          while (op = this.accept("&&") || this.accept("||")) {
            expr.push(new nodes.Literal("&&" == op.val ? "and" : "or"));
            expr.push(this.supportsFeature())
          }
          return expr
        }
      }, supportsFeature:             function () {
        this.skipSpacesAndComments();
        if ("(" == this.peek().type) {
          var la = this.lookahead(2).type;
          if ("ident" == la || "{" == la) {return this.feature()} else {
            this.expect("(");
            var node = new nodes.Expression;
            node.push(new nodes.Literal("("));
            node.push(this.supportsCondition());
            this.expect(")");
            node.push(new nodes.Literal(")"));
            this.skipSpacesAndComments();
            return node
          }
        }
      }, extend:                      function () {
        var tok = this.expect("extend"), selectors = [], sel, node, arr;
        do {
          arr = this.selectorParts();
          if (!arr.length) continue;
          sel = new nodes.Selector(arr);
          selectors.push(sel);
          if ("!" !== this.peek().type) continue;
          tok = this.lookahead(2);
          if ("ident" !== tok.type || "optional" !== tok.val.name) continue;
          this.skip(["!", "ident"]);
          sel.optional = true
        } while (this.accept(","));
        node = new nodes.Extend(selectors);
        node.lineno = tok.lineno;
        node.column = tok.column;
        return node
      }, media:                       function () {
        this.expect("media");
        this.state.push("atrule");
        var media = new nodes.Media(this.queries());
        media.block = this.block(media);
        this.state.pop();
        return media
      }, queries:                     function () {
        var queries = new nodes.QueryList, skip = ["comment", "newline", "space"];
        do {
          this.skip(skip);
          queries.push(this.query());
          this.skip(skip)
        } while (this.accept(","));
        return queries
      }, query:                       function () {
        var query = new nodes.Query, expr, pred, id;
        if ("ident" == this.peek().type && ("." == this.lookahead(2).type || "[" == this.lookahead(2).type)) {
          this.cond = true;
          expr = this.expression();
          this.cond = false;
          query.push(new nodes.Feature(expr.nodes));
          return query
        }
        if (pred = this.accept("ident") || this.accept("not")) {
          pred = new nodes.Literal(pred.val.string || pred.val);
          this.skipSpacesAndComments();
          if (id = this.accept("ident")) {
            query.type = id.val;
            query.predicate = pred
          } else {query.type = pred}
          this.skipSpacesAndComments();
          if (!this.accept("&&")) return query
        }
        do {query.push(this.feature())} while (this.accept("&&"));
        return query
      }, feature:                     function () {
        this.skipSpacesAndComments();
        this.expect("(");
        this.skipSpacesAndComments();
        var node = new nodes.Feature(this.interpolate());
        this.skipSpacesAndComments();
        this.accept(":");
        this.skipSpacesAndComments();
        this.inProperty = true;
        node.expr = this.list();
        this.inProperty = false;
        this.skipSpacesAndComments();
        this.expect(")");
        this.skipSpacesAndComments();
        return node
      }, mozdocument:                 function () {
        this.expect("-moz-document");
        var mozdocument = new nodes.Atrule("-moz-document"), calls = [];
        do {
          this.skipSpacesAndComments();
          calls.push(this.functionCall());
          this.skipSpacesAndComments()
        } while (this.accept(","));
        mozdocument.segments = [new nodes.Literal(calls.join(", "))];
        this.state.push("atrule");
        mozdocument.block = this.block(mozdocument, false);
        this.state.pop();
        return mozdocument
      }, atimport:                    function () {
        this.expect("import");
        this.allowPostfix = true;
        return new nodes.Import(this.expression(), false)
      }, require:                     function () {
        this.expect("require");
        this.allowPostfix = true;
        return new nodes.Import(this.expression(), true)
      }, charset:                     function () {
        this.expect("charset");
        var str = this.expect("string").val;
        this.allowPostfix = true;
        return new nodes.Charset(str)
      }, namespace:                   function () {
        var str, prefix;
        this.expect("namespace");
        this.skipSpacesAndComments();
        if (prefix = this.accept("ident")) {prefix = prefix.val}
        this.skipSpacesAndComments();
        str = this.accept("string") || this.url();
        this.allowPostfix = true;
        return new nodes.Namespace(str, prefix)
      }, keyframes:                   function () {
        var tok = this.expect("keyframes"), keyframes;
        this.skipSpacesAndComments();
        keyframes = new nodes.Keyframes(this.selectorParts(), tok.val);
        this.skipSpacesAndComments();
        this.state.push("atrule");
        keyframes.block = this.block(keyframes);
        this.state.pop();
        return keyframes
      }, literal:                     function () {
        return this.expect("literal").val
      }, id:                          function () {
        var tok = this.expect("ident");
        this.accept("space");
        return tok.val
      }, ident:                       function () {
        var i = 2, la = this.lookahead(i).type;
        while ("space" == la) la = this.lookahead(++i).type;
        switch (la) {
          case"=":
          case"?=":
          case"-=":
          case"+=":
          case"*=":
          case"/=":
          case"%=":
            return this.assignment();
          case".":
            if ("space" == this.lookahead(i - 1).type) return this.selector();
            if (this._ident == this.peek()) return this.id();
            while ("=" != this.lookahead(++i).type && !~["[", ",", "newline", "indent", "eos"].indexOf(this.lookahead(i).type)) ;
            if ("=" == this.lookahead(i).type) {
              this._ident = this.peek();
              return this.expression()
            } else if (this.looksLikeSelector() && this.stateAllowsSelector()) {return this.selector()}
          case"[":
            if (this._ident == this.peek()) return this.id();
            while ("]" != this.lookahead(i++).type && "selector" != this.lookahead(i).type && "eos" != this.lookahead(i).type) ;
            if ("=" == this.lookahead(i).type) {
              this._ident = this.peek();
              return this.expression()
            } else if (this.looksLikeSelector() && this.stateAllowsSelector()) {return this.selector()}
          case"-":
          case"+":
          case"/":
          case"*":
          case"%":
          case"**":
          case"&&":
          case"||":
          case">":
          case"<":
          case">=":
          case"<=":
          case"!=":
          case"==":
          case"?":
          case"in":
          case"is a":
          case"is defined":
            if (this._ident == this.peek()) {return this.id()} else {
              this._ident = this.peek();
              switch (this.currentState()) {
                case"for":
                case"selector":
                  return this.property();
                case"root":
                case"atblock":
                case"atrule":
                  return "[" == la ? this.subscript() : this.selector();
                case"function":
                case"conditional":
                  return this.looksLikeSelector() ? this.selector() : this.expression();
                default:
                  return this.operand ? this.id() : this.expression()
              }
            }
          default:
            switch (this.currentState()) {
              case"root":
                return this.selector();
              case"for":
              case"selector":
              case"function":
              case"conditional":
              case"atblock":
              case"atrule":
                return this.property();
              default:
                var id = this.id();
                if ("interpolation" == this.previousState()) id.mixin = true;
                return id
            }
        }
      }, interpolate:                 function () {
        var node, segs = [], star;
        star = this.accept("*");
        if (star) segs.push(new nodes.Literal("*"));
        while (true) {
          if (this.accept("{")) {
            this.state.push("interpolation");
            segs.push(this.expression());
            this.expect("}");
            this.state.pop()
          } else if (node = this.accept("-")) {segs.push(new nodes.Literal("-"))} else if (node = this.accept("ident")) {segs.push(node.val)} else {break}
        }
        if (!segs.length) this.expect("ident");
        return segs
      }, property:                    function () {
        if (this.looksLikeSelector(true)) return this.selector();
        var ident = this.interpolate(), prop = new nodes.Property(ident), ret = prop;
        this.accept("space");
        if (this.accept(":")) this.accept("space");
        this.state.push("property");
        this.inProperty = true;
        prop.expr = this.list();
        if (prop.expr.isEmpty) ret = ident[0];
        this.inProperty = false;
        this.allowPostfix = true;
        this.state.pop();
        this.accept(";");
        return ret
      }, selector:                    function () {
        var arr, group = new nodes.Group, scope = this.selectorScope, isRoot = "root" == this.currentState(), selector;
        do {
          this.accept("newline");
          arr = this.selectorParts();
          if (isRoot && scope) arr.unshift(new nodes.Literal(scope + " "));
          if (arr.length) {
            selector = new nodes.Selector(arr);
            selector.lineno = arr[0].lineno;
            selector.column = arr[0].column;
            group.push(selector)
          }
        } while (this.accept(",") || this.accept("newline"));
        if ("selector-parts" == this.currentState()) return group.nodes;
        this.state.push("selector");
        group.block = this.block(group);
        this.state.pop();
        return group
      }, selectorParts:               function () {
        var tok, arr = [];
        while (tok = this.selectorToken()) {
          switch (tok.type) {
            case"{":
              this.skipSpaces();
              var expr = this.expression();
              this.skipSpaces();
              this.expect("}");
              arr.push(expr);
              break;
            case this.prefix && ".":
              var literal = new nodes.Literal(tok.val + this.prefix);
              literal.prefixed = true;
              arr.push(literal);
              break;
            case"comment":
              break;
            case"color":
            case"unit":
              arr.push(new nodes.Literal(tok.val.raw));
              break;
            case"space":
              arr.push(new nodes.Literal(" "));
              break;
            case"function":
              arr.push(new nodes.Literal(tok.val.name + "("));
              break;
            case"ident":
              arr.push(new nodes.Literal(tok.val.name || tok.val.string));
              break;
            default:
              arr.push(new nodes.Literal(tok.val));
              if (tok.space) arr.push(new nodes.Literal(" "))
          }
        }
        return arr
      }, assignment:                  function () {
        var op, node, name = this.id().name;
        if (op = this.accept("=") || this.accept("?=") || this.accept("+=") || this.accept("-=") || this.accept("*=") || this.accept("/=") || this.accept("%=")) {
          this.state.push("assignment");
          var expr = this.list();
          if (expr.isEmpty) this.assignAtblock(expr);
          node = new nodes.Ident(name, expr);
          this.state.pop();
          switch (op.type) {
            case"?=":
              var defined = new nodes.BinOp("is defined", node), lookup = new nodes.Expression;
              lookup.push(new nodes.Ident(name));
              node = new nodes.Ternary(defined, lookup, node);
              break;
            case"+=":
            case"-=":
            case"*=":
            case"/=":
            case"%=":
              node.val = new nodes.BinOp(op.type[0], new nodes.Ident(name), expr);
              break
          }
        }
        return node
      }, fun:                         function () {
        var parens = 1, i = 2, tok;
        out:while (tok = this.lookahead(i++)) {
          switch (tok.type) {
            case"function":
            case"(":
              ++parens;
              break;
            case")":
              if (!--parens) break out;
              break;
            case"eos":
              this.error('failed to find closing paren ")"')
          }
        }
        switch (this.currentState()) {
          case"expression":
            return this.functionCall();
          default:
            return this.looksLikeFunctionDefinition(i) ? this.functionDefinition() : this.expression()
        }
      }, url:                         function () {
        this.expect("function");
        this.state.push("function arguments");
        var args = this.args();
        this.expect(")");
        this.state.pop();
        return new nodes.Call("url", args)
      }, functionCall:                function () {
        var withBlock = this.accept("+");
        if ("url" == this.peek().val.name) return this.url();
        var name = this.expect("function").val.name;
        this.state.push("function arguments");
        this.parens++;
        var args = this.args();
        this.expect(")");
        this.parens--;
        this.state.pop();
        var call = new nodes.Call(name, args);
        if (withBlock) {
          this.state.push("function");
          call.block = this.block(call);
          this.state.pop()
        }
        return call
      }, functionDefinition:          function () {
        var name = this.expect("function").val.name;
        this.state.push("function params");
        this.skipWhitespace();
        var params = this.params();
        this.skipWhitespace();
        this.expect(")");
        this.state.pop();
        this.state.push("function");
        var fn = new nodes.Function(name, params);
        fn.block = this.block(fn);
        this.state.pop();
        return new nodes.Ident(name, fn)
      }, params:                      function () {
        var tok, node, params = new nodes.Params;
        while (tok = this.accept("ident")) {
          this.accept("space");
          params.push(node = tok.val);
          if (this.accept("...")) {node.rest = true} else if (this.accept("=")) {node.val = this.expression()}
          this.skipWhitespace();
          this.accept(",");
          this.skipWhitespace()
        }
        return params
      }, args:                        function () {
        var args = new nodes.Arguments, keyword;
        do {
          if ("ident" == this.peek().type && ":" == this.lookahead(2).type) {
            keyword = this.next().val.string;
            this.expect(":");
            args.map[keyword] = this.expression()
          } else {args.push(this.expression())}
        } while (this.accept(","));
        return args
      }, list:                        function () {
        var node = this.expression();
        while (this.accept(",")) {
          if (node.isList) {list.push(this.expression())} else {
            var list = new nodes.Expression(true);
            list.push(node);
            list.push(this.expression());
            node = list
          }
        }
        return node
      }, expression:                  function () {
        var node, expr = new nodes.Expression;
        this.state.push("expression");
        while (node = this.negation()) {
          if (!node) this.error("unexpected token {peek} in expression");
          expr.push(node)
        }
        this.state.pop();
        if (expr.nodes.length) {
          expr.lineno = expr.nodes[0].lineno;
          expr.column = expr.nodes[0].column
        }
        return expr
      }, negation:                    function () {
        if (this.accept("not")) {return new nodes.UnaryOp("!", this.negation())}
        return this.ternary()
      }, ternary:                     function () {
        var node = this.logical();
        if (this.accept("?")) {
          var trueExpr = this.expression();
          this.expect(":");
          var falseExpr = this.expression();
          node = new nodes.Ternary(node, trueExpr, falseExpr)
        }
        return node
      }, logical:                     function () {
        var op, node = this.typecheck();
        while (op = this.accept("&&") || this.accept("||")) {node = new nodes.BinOp(op.type, node, this.typecheck())}
        return node
      }, typecheck:                   function () {
        var op, node = this.equality();
        while (op = this.accept("is a")) {
          this.operand = true;
          if (!node) this.error('illegal unary "' + op + '", missing left-hand operand');
          node = new nodes.BinOp(op.type, node, this.equality());
          this.operand = false
        }
        return node
      }, equality:                    function () {
        var op, node = this.inop();
        while (op = this.accept("==") || this.accept("!=")) {
          this.operand = true;
          if (!node) this.error('illegal unary "' + op + '", missing left-hand operand');
          node = new nodes.BinOp(op.type, node, this.inop());
          this.operand = false
        }
        return node
      }, inop:                        function () {
        var node = this.relational();
        while (this.accept("in")) {
          this.operand = true;
          if (!node) this.error('illegal unary "in", missing left-hand operand');
          node = new nodes.BinOp("in", node, this.relational());
          this.operand = false
        }
        return node
      }, relational:                  function () {
        var op, node = this.range();
        while (op = this.accept(">=") || this.accept("<=") || this.accept("<") || this.accept(">")) {
          this.operand = true;
          if (!node) this.error('illegal unary "' + op + '", missing left-hand operand');
          node = new nodes.BinOp(op.type, node, this.range());
          this.operand = false
        }
        return node
      }, range:                       function () {
        var op, node = this.additive();
        if (op = this.accept("...") || this.accept("..")) {
          this.operand = true;
          if (!node) this.error('illegal unary "' + op + '", missing left-hand operand');
          node = new nodes.BinOp(op.val, node, this.additive());
          this.operand = false
        }
        return node
      }, additive:                    function () {
        var op, node = this.multiplicative();
        while (op = this.accept("+") || this.accept("-")) {
          this.operand = true;
          node = new nodes.BinOp(op.type, node, this.multiplicative());
          this.operand = false
        }
        return node
      }, multiplicative:              function () {
        var op, node = this.defined();
        while (op = this.accept("**") || this.accept("*") || this.accept("/") || this.accept("%")) {
          this.operand = true;
          if ("/" == op && this.inProperty && !this.parens) {
            this.stash.push(new Token("literal", new nodes.Literal("/")));
            this.operand = false;
            return node
          } else {
            if (!node) this.error('illegal unary "' + op + '", missing left-hand operand');
            node = new nodes.BinOp(op.type, node, this.defined());
            this.operand = false
          }
        }
        return node
      }, defined:                     function () {
        var node = this.unary();
        if (this.accept("is defined")) {
          if (!node) this.error('illegal unary "is defined", missing left-hand operand');
          node = new nodes.BinOp("is defined", node)
        }
        return node
      }, unary:                       function () {
        var op, node;
        if (op = this.accept("!") || this.accept("~") || this.accept("+") || this.accept("-")) {
          this.operand = true;
          node = this.unary();
          if (!node) this.error('illegal unary "' + op + '"');
          node = new nodes.UnaryOp(op.type, node);
          this.operand = false;
          return node
        }
        return this.subscript()
      }, subscript:                   function () {
        var node = this.member(), id;
        while (this.accept("[")) {
          node = new nodes.BinOp("[]", node, this.expression());
          this.expect("]")
        }
        if (this.accept("=")) {
          node.op += "=";
          node.val = this.list();
          if (node.val.isEmpty) this.assignAtblock(node.val)
        }
        return node
      }, member:                      function () {
        var node = this.primary();
        if (node) {
          while (this.accept(".")) {
            var id = new nodes.Ident(this.expect("ident").val.string);
            node = new nodes.Member(node, id)
          }
          this.skipSpaces();
          if (this.accept("=")) {
            node.val = this.list();
            if (node.val.isEmpty) this.assignAtblock(node.val)
          }
        }
        return node
      }, object:                      function () {
        var obj = new nodes.Object, id, val, comma;
        this.expect("{");
        this.skipWhitespace();
        while (!this.accept("}")) {
          if (this.accept("comment") || this.accept("newline")) continue;
          if (!comma) this.accept(",");
          id = this.accept("ident") || this.accept("string");
          if (!id) this.error('expected "ident" or "string", got {peek}');
          id = id.val.hash;
          this.skipSpacesAndComments();
          this.expect(":");
          val = this.expression();
          obj.set(id, val);
          comma = this.accept(",");
          this.skipWhitespace()
        }
        return obj
      }, primary:                     function () {
        var tok;
        this.skipSpaces();
        if (this.accept("(")) {
          ++this.parens;
          var expr = this.expression(), paren = this.expect(")");
          --this.parens;
          if (this.accept("%")) expr.push(new nodes.Ident("%"));
          tok = this.peek();
          if (!paren.space && "ident" == tok.type && ~units.indexOf(tok.val.string)) {
            expr.push(new nodes.Ident(tok.val.string));
            this.next()
          }
          return expr
        }
        tok = this.peek();
        switch (tok.type) {
          case"null":
          case"unit":
          case"color":
          case"string":
          case"literal":
          case"boolean":
          case"comment":
            return this.next().val;
          case!this.cond && "{":
            return this.object();
          case"atblock":
            return this.atblock();
          case"atrule":
            var id = new nodes.Ident(this.next().val);
            id.property = true;
            return id;
          case"ident":
            return this.ident();
          case"function":
            return tok.anonymous ? this.functionDefinition() : this.functionCall()
        }
      },
    }
  });
  require.register("renderer.js", function (module, exports, require) {
    var Parser = require("./parser"),
      Evaluator = require("./visitor/evaluator"),
      Normalizer = require("./visitor/normalizer"),
      utils = require("./utils"),
      nodes = require("./nodes"),
      join = require("./path").join;
    module.exports = Renderer;

    function Renderer(str, options) {
      options = options || {};
      options.globals = options.globals || {};
      options.functions = options.functions || {};
      options.use = options.use || [];
      options.use = Array.isArray(options.use) ? options.use : [options.use];
      options.imports = [];
      options.paths = options.paths || [];
      options.filename = options.filename || "stylus";
      options.Evaluator = options.Evaluator || Evaluator;
      this.options = options;
      this.str = str
    }

    Renderer.prototype.render = function (fn) {
      var parser = this.parser = new Parser(this.str, this.options);
      for (var i = 0, len = this.options.use.length; i < len; i++) {this.use(this.options.use[i])}
      try {
        nodes.filename = this.options.filename;
        var ast = parser.parse();
        this.evaluator = new this.options.Evaluator(ast, this.options);
        this.nodes = nodes;
        this.evaluator.renderer = this;
        ast = this.evaluator.evaluate();
        var normalizer = new Normalizer(ast, this.options);
        ast = normalizer.normalize();
        var compiler = this.options.sourcemap ? new (require("./visitor/sourcemapper"))(ast, this.options) : new (require("./visitor/compiler"))(ast, this.options),
          css = compiler.compile();
        if (this.options.sourcemap) this.sourcemap = compiler.map.toJSON()
      }
      catch (err) {
        var options = {};
        options.input = err.input || this.str;
        options.filename = err.filename || this.options.filename;
        options.lineno = err.lineno || parser.lexer.lineno;
        options.column = err.column || parser.lexer.column;
        if (!fn) throw utils.formatException(err, options);
        return fn(utils.formatException(err, options))
      }
      if (!fn) return css;
      fn(null, css)
    };
    Renderer.prototype.deps = function (filename) {
      var opts = utils.merge({cache: false}, this.options);
      if (filename) opts.filename = filename;
      var DepsResolver = require("./visitor/deps-resolver"), parser = new Parser(this.str, opts);
      try {
        nodes.filename = opts.filename;
        var ast = parser.parse(), resolver = new DepsResolver(ast, opts);
        return resolver.resolve()
      }
      catch (err) {
        var options = {};
        options.input = err.input || this.str;
        options.filename = err.filename || opts.filename;
        options.lineno = err.lineno || parser.lexer.lineno;
        options.column = err.column || parser.lexer.column;
        throw utils.formatException(err, options)
      }
    };
    Renderer.prototype.set = function (key, val) {
      this.options[key] = val;
      return this
    };
    Renderer.prototype.get = function (key) {
      return this.options[key]
    };
    Renderer.prototype.include = function (path) {
      this.options.paths.push(path);
      return this
    };
    Renderer.prototype.use = function (fn) {
      fn.call(this, this);
      return this
    };
    Renderer.prototype.define = function (name, fn, raw) {
      fn = utils.coerce(fn, raw);
      if (fn.nodeName) {
        this.options.globals[name] = fn;
        return this
      }
      this.options.functions[name] = fn;
      if (undefined != raw) fn.raw = raw;
      return this
    }
  });
  require.register("selector-parser.js", function (module, exports, require) {
    var COMBINATORS = [">", "+", "~"];
    var SelectorParser = module.exports = function SelectorParser(str, stack, parts) {
      this.str = str;
      this.stack = stack || [];
      this.parts = parts || [];
      this.pos = 0;
      this.level = 2;
      this.nested = true;
      this.ignore = false
    };
    SelectorParser.prototype.skip = function (len) {
      this.str = this.str.substr(len);
      this.pos += len
    };
    SelectorParser.prototype.skipSpaces = function () {
      while (" " == this.str[0]) this.skip(1)
    };
    SelectorParser.prototype.advance = function () {
      return this.root() || this.relative() || this.initial() || this.escaped() || this.parent() || this.partial() || this.char()
    };
    SelectorParser.prototype.root = function () {
      if (!this.pos && "/" == this.str[0] && "deep" != this.str.slice(1, 5)) {
        this.nested = false;
        this.skip(1)
      }
    };
    SelectorParser.prototype.relative = function (multi) {
      if ((!this.pos || multi) && "../" == this.str.slice(0, 3)) {
        this.nested = false;
        this.skip(3);
        while (this.relative(true)) this.level++;
        if (!this.raw) {
          var ret = this.stack[this.stack.length - this.level];
          if (ret) {return ret} else {this.ignore = true}
        }
      }
    };
    SelectorParser.prototype.initial = function () {
      if (!this.pos && "~" == this.str[0] && "/" == this.str[1]) {
        this.nested = false;
        this.skip(2);
        return this.stack[0]
      }
    };
    SelectorParser.prototype.escaped = function () {
      if ("\\" == this.str[0]) {
        var char = this.str[1];
        if ("&" == char || "^" == char) {
          this.skip(2);
          return char
        }
      }
    };
    SelectorParser.prototype.parent = function () {
      if ("&" == this.str[0]) {
        this.nested = false;
        if (!this.pos && (!this.stack.length || this.raw)) {
          var i = 0;
          while (" " == this.str[++i]) ;
          if (~COMBINATORS.indexOf(this.str[i])) {
            this.skip(i + 1);
            return
          }
        }
        this.skip(1);
        if (!this.raw) return this.stack[this.stack.length - 1]
      }
    };
    SelectorParser.prototype.partial = function () {
      if ("^" == this.str[0] && "[" == this.str[1]) {
        this.skip(2);
        this.skipSpaces();
        var ret = this.range();
        this.skipSpaces();
        if ("]" != this.str[0]) return "^[";
        this.nested = false;
        this.skip(1);
        if (ret) {return ret} else {this.ignore = true}
      }
    };
    SelectorParser.prototype.number = function () {
      var i = 0, ret = "";
      if ("-" == this.str[i]) ret += this.str[i++];
      while (this.str.charCodeAt(i) >= 48 && this.str.charCodeAt(i) <= 57) ret += this.str[i++];
      if (ret) {
        this.skip(i);
        return Number(ret)
      }
    };
    SelectorParser.prototype.range = function () {
      var start = this.number(), ret;
      if (".." == this.str.slice(0, 2)) {
        this.skip(2);
        var end = this.number(), len = this.parts.length;
        if (start < 0) start = len + start - 1;
        if (end < 0) end = len + end - 1;
        if (start > end) {
          var tmp = start;
          start = end;
          end = tmp
        }
        if (end < len - 1) {
          ret = this.parts.slice(start, end + 1).map(function (part) {
            var selector = new SelectorParser(part, this.stack, this.parts);
            selector.raw = true;
            return selector.parse()
          }, this).map(function (selector) {
            return (selector.nested ? " " : "") + selector.val
          }).join("").trim()
        }
      } else {ret = this.stack[start < 0 ? this.stack.length + start - 1 : start]}
      if (ret) {return ret} else {this.ignore = true}
    };
    SelectorParser.prototype.char = function () {
      var char = this.str[0];
      this.skip(1);
      return char
    };
    SelectorParser.prototype.parse = function () {
      var val = "";
      while (this.str.length) {
        val += this.advance() || "";
        if (this.ignore) {
          val = "";
          break
        }
      }
      return {val: val.trimRight(), nested: this.nested}
    }
  });
  require.register("stack/index.js", function (module, exports, require) {
    var Stack = module.exports = function Stack() {
      Array.apply(this, arguments)
    };
    Stack.prototype.__proto__ = Array.prototype;
    Stack.prototype.push = function (frame) {
      frame.stack = this;
      frame.parent = this.currentFrame;
      return [].push.apply(this, arguments)
    };
    Stack.prototype.__defineGetter__("currentFrame", function () {
      return this[this.length - 1]
    });
    Stack.prototype.getBlockFrame = function (block) {
      for (var i = 0; i < this.length; ++i) {if (block == this[i].block) {return this[i]}}
    };
    Stack.prototype.lookup = function (name) {
      var block = this.currentFrame.block, val, ret;
      do {
        var frame = this.getBlockFrame(block);
        if (frame && (val = frame.lookup(name))) {return val}
      } while (block = block.parent)
    };
    Stack.prototype.inspect = function () {
      return this.reverse().map(function (frame) {
        return frame.inspect()
      }).join("\n")
    };
    Stack.prototype.toString = function () {
      var block, node, buf = [], location, len = this.length;
      while (len--) {
        block = this[len].block;
        if (node = block.node) {
          location = "(" + node.filename + ":" + (node.lineno + 1) + ":" + node.column + ")";
          switch (node.nodeName) {
            case"function":
              buf.push("    at " + node.name + "() " + location);
              break;
            case"group":
              buf.push('    at "' + node.nodes[0].val + '" ' + location);
              break
          }
        }
      }
      return buf.join("\n")
    }
  });
  require.register("stack/frame.js", function (module, exports, require) {
    var Scope = require("./scope");
    var Frame = module.exports = function Frame(block) {
      this._scope = false === block.scope ? null : new Scope;
      this.block = block
    };
    Frame.prototype.__defineGetter__("scope", function () {
      return this._scope || this.parent.scope
    });
    Frame.prototype.lookup = function (name) {
      return this.scope.lookup(name)
    };
    Frame.prototype.inspect = function () {
      return "[Frame " + (false === this.block.scope ? "scope-less" : this.scope.inspect()) + "]"
    }
  });
  require.register("stack/scope.js", function (module, exports, require) {
    var Scope = module.exports = function Scope() {
      this.locals = {}
    };
    Scope.prototype.add = function (ident) {
      this.locals[ident.name] = ident.val
    };
    Scope.prototype.lookup = function (name) {
      return this.locals[name]
    };
    Scope.prototype.inspect = function () {
      var keys = Object.keys(this.locals).map(function (key) {
        return "@" + key
      });
      return "[Scope" + (keys.length ? " " + keys.join(", ") : "") + "]"
    }
  });
  require.register("stylus.js", function (module, exports, require) {
    var Renderer = require("./renderer"), nodes = require("./nodes"), utils = require("./utils");
    exports = module.exports = render;
    exports.version = "0.54.5";
    exports.nodes = nodes;
    exports.functions = require("./functions");
    exports.utils = require("./utils");
    exports.Visitor = require("./visitor");
    exports.Parser = require("./parser");
    exports.Evaluator = require("./visitor/evaluator");
    exports.Normalizer = require("./visitor/normalizer");
    exports.Compiler = require("./visitor/compiler");
    exports.render = function (str, options, fn) {
      if ("function" == typeof options) fn = options, options = {};
      if (bifs) str = bifs + str;
      return new Renderer(str, options).render(fn)
    };

    function render(str, options) {
      if (bifs) str = bifs + str;
      return new Renderer(str, options)
    }

    exports.url = require("./functions/url")
  });
  require.register("token.js", function (module, exports, require) {
    var Token = exports = module.exports = function Token(type, val) {
      this.type = type;
      this.val = val
    };
    Token.prototype.inspect = function () {
      var val = " " + this.val;
      return "[Token:" + this.lineno + ":" + this.column + " " + "" + this.type + "" + "" + (this.val ? val : "") + "" + "]"
    };
    Token.prototype.toString = function () {
      return (undefined === this.val ? this.type : this.val).toString()
    }
  });
  require.register("utils.js", function (module, exports, require) {
    var nodes = require("./nodes"), join = require("./path").join, isAbsolute = require("./path").isAbsolute;
    exports.absolute = isAbsolute || function (path) {
      return path.substr(0, 2) == "\\\\" || "/" === path.charAt(0) || /^[a-z]:[\\\/]/i.test(path)
    };
    exports.lookup = function (path, paths, ignore) {
      var lookup, i = paths.length;
      if (exports.absolute(path)) {
        try {return path}
        catch (err) {}
      }
      while (i--) {
        try {
          lookup = join(paths[i], path);
          if (ignore == lookup) continue;
          return lookup
        }
        catch (err) {}
      }
    };
    exports.find = function (path, paths, ignore) {
      var lookup, found, i = paths.length;
      if (exports.absolute(path)) {if ((found = glob.sync(path)).length) {return found}}
      while (i--) {
        lookup = join(paths[i], path);
        if (ignore == lookup) continue;
        if ((found = glob.sync(lookup)).length) {return found}
      }
    };
    exports.lookupIndex = function (name, paths, filename) {
      var found = exports.find(join(name, "index.styl"), paths, filename);
      if (!found) {found = exports.find(join(name, basename(name).replace(/\.styl/i, "") + ".styl"), paths, filename)}
      if (!found && !~name.indexOf("node_modules")) {found = lookupPackage(join("node_modules", name))}
      return found;

      function lookupPackage(dir) {
        var pkg = exports.lookup(join(dir, "package.json"), paths, filename);
        if (!pkg) {return /\.styl$/i.test(dir) ? exports.lookupIndex(dir, paths, filename) : lookupPackage(dir + ".styl")}
        var main = require(relative(__dirname, pkg)).main;
        if (main) {found = exports.find(join(dir, main), paths, filename)} else {found = exports.lookupIndex(dir, paths, filename)}
        return found
      }
    };
    exports.formatException = function (err, options) {
      var lineno = options.lineno,
        column = options.column,
        filename = options.filename,
        str = options.input,
        context = options.context || 8,
        context = context / 2,
        lines = ("\n" + str).split("\n"),
        start = Math.max(lineno - context, 1),
        end = Math.min(lines.length, lineno + context),
        pad = end.toString().length;
      var context = lines.slice(start, end).map(function (line, i) {
        var curr = i + start;
        return "   " + Array(pad - curr.toString().length + 1).join(" ") + curr + "| " + line + (curr == lineno ? "\n" + Array(curr.toString().length + 5 + column).join("-") + "^" : "")
      }).join("\n");
      err.message = filename + ":" + lineno + ":" + column + "\n" + context + "\n\n" + err.message + "\n" + (err.stylusStack ? err.stylusStack + "\n" : "");
      if (err.fromStylus) err.stack = "Error: " + err.message;
      return err
    };
    exports.assertType = function (node, type, param) {
      exports.assertPresent(node, param);
      if (node.nodeName == type) return;
      var actual = node.nodeName,
        msg = "expected " + (param ? '"' + param + '" to be a ' : "") + type + ", but got " + actual + ":" + node;
      throw new Error("TypeError: " + msg)
    };
    exports.assertString = function (node, param) {
      exports.assertPresent(node, param);
      switch (node.nodeName) {
        case"string":
        case"ident":
        case"literal":
          return;
        default:
          var actual = node.nodeName, msg = "expected string, ident or literal, but got " + actual + ":" + node;
          throw new Error("TypeError: " + msg)
      }
    };
    exports.assertColor = function (node, param) {
      exports.assertPresent(node, param);
      switch (node.nodeName) {
        case"rgba":
        case"hsla":
          return;
        default:
          var actual = node.nodeName, msg = "expected rgba or hsla, but got " + actual + ":" + node;
          throw new Error("TypeError: " + msg)
      }
    };
    exports.assertPresent = function (node, name) {
      if (node) return;
      if (name) throw new Error('"' + name + '" argument required');
      throw new Error("argument missing")
    };
    exports.unwrap = function (expr) {
      if (expr.preserve) return expr;
      if ("arguments" != expr.nodeName && "expression" != expr.nodeName) return expr;
      if (1 != expr.nodes.length) return expr;
      if ("arguments" != expr.nodes[0].nodeName && "expression" != expr.nodes[0].nodeName) return expr;
      return exports.unwrap(expr.nodes[0])
    };
    exports.coerce = function (val, raw) {
      switch (typeof val) {
        case"function":
          return val;
        case"string":
          return new nodes.String(val);
        case"boolean":
          return new nodes.Boolean(val);
        case"number":
          return new nodes.Unit(val);
        default:
          if (null == val) return nodes.nil;
          if (Array.isArray(val)) return exports.coerceArray(val, raw);
          if (val.nodeName) return val;
          return exports.coerceObject(val, raw)
      }
    };
    exports.coerceArray = function (val, raw) {
      var expr = new nodes.Expression;
      val.forEach(function (val) {
        expr.push(exports.coerce(val, raw))
      });
      return expr
    };
    exports.coerceObject = function (obj, raw) {
      var node = raw ? new nodes.Object : new nodes.Expression, val;
      for (var key in obj) {
        val = exports.coerce(obj[key], raw);
        key = new nodes.Ident(key);
        if (raw) {node.set(key, val)} else {node.push(exports.coerceArray([key, val]))}
      }
      return node
    };
    exports.params = function (fn) {
      return fn.toString().match(/\(([^)]*)\)/)[1].split(/ *, */)
    };
    exports.merge = function (a, b, deep) {
      for (var k in b) {
        if (deep && a[k]) {
          var nodeA = exports.unwrap(a[k]).first, nodeB = exports.unwrap(b[k]).first;
          if ("object" == nodeA.nodeName && "object" == nodeB.nodeName) {a[k].first.vals = exports.merge(nodeA.vals, nodeB.vals, deep)} else {a[k] = b[k]}
        } else {a[k] = b[k]}
      }
      return a
    };
    exports.uniq = function (arr) {
      var obj = {}, ret = [];
      for (var i = 0, len = arr.length; i < len; ++i) {
        if (arr[i] in obj) continue;
        obj[arr[i]] = true;
        ret.push(arr[i])
      }
      return ret
    };
    exports.compileSelectors = function (arr, leaveHidden) {
      var selectors = [], Parser = require("./selector-parser"), indent = this.indent || "", buf = [];

      function parse(selector, buf) {
        var parts = [selector.val], str = new Parser(parts[0], parents, parts).parse().val, parents = [];
        if (buf.length) {
          for (var i = 0, len = buf.length; i < len; ++i) {
            parts.push(buf[i]);
            parents.push(str);
            var child = new Parser(buf[i], parents, parts).parse();
            if (child.nested) {str += " " + child.val} else {str = child.val}
          }
        }
        return str.trim()
      }

      function compile(arr, i) {
        if (i) {
          arr[i].forEach(function (selector) {
            if (!leaveHidden && selector.isPlaceholder) return;
            if (selector.inherits) {
              buf.unshift(selector.val);
              compile(arr, i - 1);
              buf.shift()
            } else {selectors.push(indent + parse(selector, buf))}
          })
        } else {
          arr[0].forEach(function (selector) {
            if (!leaveHidden && selector.isPlaceholder) return;
            var str = parse(selector, buf);
            if (str) selectors.push(indent + str)
          })
        }
      }

      compile(arr, arr.length - 1);
      return exports.uniq(selectors)
    };
    exports.parseString = function (str) {
      var Parser = require("./parser"), parser, ret;
      try {
        parser = new Parser(str);
        parser.state.push("expression");
        ret = new nodes.Expression;
        ret.nodes = parser.parse().nodes
      }
      catch (e) {ret = new nodes.Literal(str)}
      return ret
    }
  });
  require.register("visitor/index.js", function (module, exports, require) {
    var Visitor = module.exports = function Visitor(root) {
      this.root = root
    };
    Visitor.prototype.visit = function (node, fn) {
      var method = "visit" + node.constructor.name;
      if (this[method]) return this[method](node);
      return node
    }
  });
  require.register("visitor/compiler.js", function (module, exports, require) {
    var Visitor = require("./index"), utils = require("../utils");
    var Compiler = module.exports = function Compiler(root, options) {
      options = options || {};
      this.compress = options.compress;
      this.firebug = options.firebug;
      this.linenos = options.linenos;
      this.spaces = options["indent spaces"] || 2;
      this.indents = 1;
      Visitor.call(this, root);
      this.stack = []
    };
    Compiler.prototype.__proto__ = Visitor.prototype;
    Compiler.prototype.compile = function () {
      return this.visit(this.root)
    };
    Compiler.prototype.out = function (str, node) {
      return str
    };
    Compiler.prototype.__defineGetter__("indent", function () {
      if (this.compress) return "";
      return new Array(this.indents).join(Array(this.spaces + 1).join(" "))
    });
    Compiler.prototype.needBrackets = function (node) {
      return 1 == this.indents || "atrule" != node.nodeName || node.hasOnlyProperties
    };
    Compiler.prototype.visitRoot = function (block) {
      this.buf = "";
      for (var i = 0, len = block.nodes.length; i < len; ++i) {
        var node = block.nodes[i];
        if (this.linenos || this.firebug) this.debugInfo(node);
        var ret = this.visit(node);
        if (ret) this.buf += this.out(ret + "\n", node)
      }
      return this.buf
    };
    Compiler.prototype.visitBlock = function (block) {
      var node, separator = this.compress ? "" : "\n", needBrackets;
      if (block.hasProperties && !block.lacksRenderedSelectors) {
        needBrackets = this.needBrackets(block.node);
        if (needBrackets) {
          this.buf += this.out(this.compress ? "{" : " {\n");
          ++this.indents
        }
        for (var i = 0, len = block.nodes.length; i < len; ++i) {
          this.last = len - 1 == i;
          node = block.nodes[i];
          switch (node.nodeName) {
            case"null":
            case"expression":
            case"function":
            case"group":
            case"block":
            case"unit":
            case"media":
            case"keyframes":
            case"atrule":
            case"supports":
              continue;
            case!this.compress && node.inline && "comment":
              this.buf = this.buf.slice(0, -1);
              this.buf += this.out(" " + this.visit(node) + "\n", node);
              break;
            case"property":
              var ret = this.visit(node) + separator;
              this.buf += this.compress ? ret : this.out(ret, node);
              break;
            default:
              this.buf += this.out(this.visit(node) + separator, node)
          }
        }
        if (needBrackets) {
          --this.indents;
          this.buf += this.out(this.indent + "}" + separator)
        }
      }
      for (var i = 0, len = block.nodes.length; i < len; ++i) {
        node = block.nodes[i];
        switch (node.nodeName) {
          case"group":
          case"block":
          case"keyframes":
            if (this.linenos || this.firebug) this.debugInfo(node);
            this.visit(node);
            break;
          case"media":
          case"import":
          case"atrule":
          case"supports":
            this.visit(node);
            break;
          case"comment":
            if (!node.suppress) {this.buf += this.out(this.indent + this.visit(node) + "\n", node)}
            break;
          case"charset":
          case"literal":
          case"namespace":
            this.buf += this.out(this.visit(node) + "\n", node);
            break
        }
      }
    };
    Compiler.prototype.visitKeyframes = function (node) {
      if (!node.frames) return;
      var prefix = "official" == node.prefix ? "" : "-" + node.prefix + "-";
      this.buf += this.out("@" + prefix + "keyframes " + this.visit(node.val) + (this.compress ? "{" : " {\n"), node);
      this.keyframe = true;
      ++this.indents;
      this.visit(node.block);
      --this.indents;
      this.keyframe = false;
      this.buf += this.out("}" + (this.compress ? "" : "\n"))
    };
    Compiler.prototype.visitMedia = function (media) {
      var val = media.val;
      if (!media.hasOutput || !val.nodes.length) return;
      this.buf += this.out("@media ", media);
      this.visit(val);
      this.buf += this.out(this.compress ? "{" : " {\n");
      ++this.indents;
      this.visit(media.block);
      --this.indents;
      this.buf += this.out("}" + (this.compress ? "" : "\n"))
    };
    Compiler.prototype.visitQueryList = function (queries) {
      for (var i = 0, len = queries.nodes.length; i < len; ++i) {
        this.visit(queries.nodes[i]);
        if (len - 1 != i) this.buf += this.out("," + (this.compress ? "" : " "))
      }
    };
    Compiler.prototype.visitQuery = function (node) {
      var len = node.nodes.length;
      if (node.predicate) this.buf += this.out(node.predicate + " ");
      if (node.type) this.buf += this.out(node.type + (len ? " and " : ""));
      for (var i = 0; i < len; ++i) {
        this.buf += this.out(this.visit(node.nodes[i]));
        if (len - 1 != i) this.buf += this.out(" and ")
      }
    };
    Compiler.prototype.visitFeature = function (node) {
      if (!node.expr) {return node.name} else if (node.expr.isEmpty) {return "(" + node.name + ")"} else {return "(" + node.name + ":" + (this.compress ? "" : " ") + this.visit(node.expr) + ")"}
    };
    Compiler.prototype.visitImport = function (imported) {
      this.buf += this.out("@import " + this.visit(imported.path) + ";\n", imported)
    };
    Compiler.prototype.visitAtrule = function (atrule) {
      var newline = this.compress ? "" : "\n";
      this.buf += this.out(this.indent + "@" + atrule.type, atrule);
      if (atrule.val) this.buf += this.out(" " + atrule.val.trim());
      if (atrule.block) {
        if (atrule.hasOnlyProperties) {this.visit(atrule.block)} else {
          this.buf += this.out(this.compress ? "{" : " {\n");
          ++this.indents;
          this.visit(atrule.block);
          --this.indents;
          this.buf += this.out(this.indent + "}" + newline)
        }
      } else {this.buf += this.out(";" + newline)}
    };
    Compiler.prototype.visitSupports = function (node) {
      if (!node.hasOutput) return;
      this.buf += this.out(this.indent + "@supports ", node);
      this.isCondition = true;
      this.buf += this.out(this.visit(node.condition));
      this.isCondition = false;
      this.buf += this.out(this.compress ? "{" : " {\n");
      ++this.indents;
      this.visit(node.block);
      --this.indents;
      this.buf += this.out(this.indent + "}" + (this.compress ? "" : "\n"))
    }, Compiler.prototype.visitComment = function (comment) {
      return this.compress ? comment.suppress ? "" : comment.str : comment.str
    };
    Compiler.prototype.visitFunction = function (fn) {
      return fn.name
    };
    Compiler.prototype.visitCharset = function (charset) {
      return "@charset " + this.visit(charset.val) + ";"
    };
    Compiler.prototype.visitNamespace = function (namespace) {
      return "@namespace " + (namespace.prefix ? this.visit(namespace.prefix) + " " : "") + this.visit(namespace.val) + ";"
    };
    Compiler.prototype.visitLiteral = function (lit) {
      var val = lit.val;
      if (lit.css) val = val.replace(/^  /gm, "");
      return val
    };
    Compiler.prototype.visitBoolean = function (bool) {
      return bool.toString()
    };
    Compiler.prototype.visitRGBA = function (rgba) {
      return rgba.toString()
    };
    Compiler.prototype.visitHSLA = function (hsla) {
      return hsla.rgba.toString()
    };
    Compiler.prototype.visitUnit = function (unit) {
      var type = unit.type || "", n = unit.val, float = n != (n | 0);
      if (this.compress) {
        if ("%" != type && "s" != type && "ms" != type && 0 == n) return "0";
        if (float && n < 1 && n > -1) {return n.toString().replace("0.", ".") + type}
      }
      return (float ? parseFloat(n.toFixed(15)) : n).toString() + type
    };
    Compiler.prototype.visitGroup = function (group) {
      var stack = this.keyframe ? [] : this.stack, comma = this.compress ? "," : ",\n";
      stack.push(group.nodes);
      if (group.block.hasProperties) {
        var selectors = utils.compileSelectors.call(this, stack), len = selectors.length;
        if (len) {
          if (this.keyframe) comma = this.compress ? "," : ", ";
          for (var i = 0; i < len; ++i) {
            var selector = selectors[i], last = i == len - 1;
            if (this.keyframe) selector = i ? selector.trim() : selector;
            this.buf += this.out(selector + (last ? "" : comma), group.nodes[i])
          }
        } else {group.block.lacksRenderedSelectors = true}
      }
      this.visit(group.block);
      stack.pop()
    };
    Compiler.prototype.visitIdent = function (ident) {
      return ident.name
    };
    Compiler.prototype.visitString = function (string) {
      return this.isURL ? string.val : string.toString()
    };
    Compiler.prototype.visitNull = function (node) {
      return ""
    };
    Compiler.prototype.visitCall = function (call) {
      this.isURL = "url" == call.name;
      var args = call.args.nodes.map(function (arg) {
        return this.visit(arg)
      }, this).join(this.compress ? "," : ", ");
      if (this.isURL) args = '"' + args + '"';
      this.isURL = false;
      return call.name + "(" + args + ")"
    };
    Compiler.prototype.visitExpression = function (expr) {
      var buf = [], self = this, len = expr.nodes.length, nodes = expr.nodes.map(function (node) {
        return self.visit(node)
      });
      nodes.forEach(function (node, i) {
        var last = i == len - 1;
        buf.push(node);
        if ("/" == nodes[i + 1] || "/" == node) return;
        if (last) return;
        var space = self.isURL || self.isCondition && (")" == nodes[i + 1] || "(" == node) ? "" : " ";
        buf.push(expr.isList ? self.compress ? "," : ", " : space)
      });
      return buf.join("")
    };
    Compiler.prototype.visitArguments = Compiler.prototype.visitExpression;
    Compiler.prototype.visitProperty = function (prop) {
      var val = this.visit(prop.expr).trim(), name = prop.name || prop.segments.join(""), arr = [];
      arr.push(this.out(this.indent), this.out(name + (this.compress ? ":" : ": "), prop), this.out(val, prop.expr), this.out(this.compress ? this.last ? "" : ";" : ";"));
      return arr.join("")
    };
    Compiler.prototype.debugInfo = function (node) {
      var path = node.filename == "stdin" ? "stdin" : fs.realpathSync(node.filename),
        line = (node.nodes && node.nodes.length ? node.nodes[0].lineno : node.lineno) || 1;
      if (this.linenos) {this.buf += "\n/* " + "line " + line + " : " + path + " */\n"}
      if (this.firebug) {
        path = "file\\:\\/\\/" + path.replace(/([.:\/\\])/g, function (m) {
          return "\\" + (m === "\\" ? "/" : m)
        });
        line = "\\00003" + line;
        this.buf += "\n@media -stylus-debug-info" + "{filename{font-family:" + path + "}line{font-family:" + line + "}}\n"
      }
    }
  });
  require.register("visitor/evaluator.js", function (module, exports, require) {
    var Visitor = require("./index"),
      nodes = require("../nodes"),
      Stack = require("../stack"),
      Frame = require("../stack/frame"),
      utils = require("../utils"),
      bifs = require("../functions"),
      dirname = require("../path").dirname,
      colors = require("../colors"),
      units = require("../units");

    function cloneNode(node) {
      if (node.block && node.block.node) {node.block.node = node.block.node.clone()}
      if (node.nodes && node.nodes.length) {node.nodes.map(cloneNode)}
      return node
    }

    function importFile(node, file, literal) {
      var importStack = this.importStack, Parser = require("../parser"), stat;
      if (node.once) {
        if (this.requireHistory[file]) return nodes.nil;
        this.requireHistory[file] = true;
        if (literal && !this.includeCSS) {return node}
      }
      if (~importStack.indexOf(file)) throw new Error("import loop has been found");
      var str = fs.readFileSync(file, "utf8");
      if (!str.trim()) return nodes.nil;
      node.path = file;
      node.dirname = dirname(file);
      stat = fs.statSync(file);
      node.mtime = stat.mtime;
      this.paths.push(node.dirname);
      if (this.options._imports) this.options._imports.push(node.clone());
      importStack.push(file);
      nodes.filename = file;
      if (literal) {
        literal = new nodes.Literal(str.replace(/\r\n?/g, "\n"));
        literal.lineno = literal.column = 1;
        if (!this.resolveURL) return literal
      }
      var block = new nodes.Block, parser = new Parser(str, utils.merge({root: block}, this.options));
      try {block = parser.parse()}
      catch (err) {
        var line = parser.lexer.lineno, column = parser.lexer.column;
        if (literal && this.includeCSS && this.resolveURL) {
          this.warn("ParseError: " + file + ":" + line + ":" + column + ". This file included as-is");
          return literal
        } else {
          err.filename = file;
          err.lineno = line;
          err.column = column;
          err.input = str;
          throw err
        }
      }
      block = block.clone(this.currentBlock);
      block.parent = this.currentBlock;
      block.scope = false;
      var ret = this.visit(block);
      importStack.pop();
      if (!this.resolveURL || this.resolveURL.nocheck) this.paths.pop();
      return ret
    }

    var Evaluator = module.exports = function Evaluator(root, options) {
      options = options || {};
      Visitor.call(this, root);
      var functions = this.functions = options.functions || {};
      this.stack = new Stack;
      this.imports = options.imports || [];
      this.globals = options.globals || {};
      this.paths = options.paths || [];
      this.prefix = options.prefix || "";
      this.filename = options.filename;
      this.includeCSS = options["include css"];
      this.resolveURL = functions.url && "resolver" == functions.url.name && functions.url.options;
      this.paths.push(dirname(options.filename || "."));
      this.stack.push(this.global = new Frame(root));
      this.warnings = options.warn;
      this.options = options;
      this.calling = [];
      this.importStack = [];
      this.ret = 0;
      this.requireHistory = {}
    };
    Evaluator.prototype.__proto__ = Visitor.prototype;
    var visit = Visitor.prototype.visit;
    Evaluator.prototype.visit = function (node) {
      try {return visit.call(this, node)}
      catch (err) {
        if (err.filename) throw err;
        err.lineno = node.lineno;
        err.column = node.column;
        err.filename = node.filename;
        err.stylusStack = this.stack.toString();
        try {}
        catch (err) {}
        throw err
      }
    };
    Evaluator.prototype.setup = function () {
      var root = this.root;
      var imports = [];
      this.populateGlobalScope();
      this.imports.forEach(function (file) {
        var expr = new nodes.Expression;
        expr.push(new nodes.String(file));
        imports.push(new nodes.Import(expr))
      }, this);
      root.nodes = imports.concat(root.nodes)
    };
    Evaluator.prototype.populateGlobalScope = function () {
      var scope = this.global.scope;
      Object.keys(colors).forEach(function (name) {
        var color = colors[name],
          rgba = new nodes.RGBA(color[0], color[1], color[2], color[3]),
          node = new nodes.Ident(name, rgba);
        rgba.name = name;
        scope.add(node)
      });
      scope.add(new nodes.Ident("embedurl", new nodes.Function("embedurl", require("../functions/url")({limit: false}))));
      var globals = this.globals;
      Object.keys(globals).forEach(function (name) {
        var val = globals[name];
        if (!val.nodeName) val = new nodes.Literal(val);
        scope.add(new nodes.Ident(name, val))
      })
    };
    Evaluator.prototype.evaluate = function () {
      this.setup();
      return this.visit(this.root)
    };
    Evaluator.prototype.visitGroup = function (group) {
      group.nodes = group.nodes.map(function (selector) {
        selector.val = this.interpolate(selector);
        return selector
      }, this);
      group.block = this.visit(group.block);
      return group
    };
    Evaluator.prototype.visitReturn = function (ret) {
      ret.expr = this.visit(ret.expr);
      throw ret
    };
    Evaluator.prototype.visitMedia = function (media) {
      media.block = this.visit(media.block);
      media.val = this.visit(media.val);
      return media
    };
    Evaluator.prototype.visitQueryList = function (queries) {
      var val, query;
      queries.nodes.forEach(this.visit, this);
      if (1 == queries.nodes.length) {
        query = queries.nodes[0];
        if (val = this.lookup(query.type)) {
          val = val.first.string;
          if (!val) return queries;
          var Parser = require("../parser"), parser = new Parser(val, this.options);
          queries = this.visit(parser.queries())
        }
      }
      return queries
    };
    Evaluator.prototype.visitQuery = function (node) {
      node.predicate = this.visit(node.predicate);
      node.type = this.visit(node.type);
      node.nodes.forEach(this.visit, this);
      return node
    };
    Evaluator.prototype.visitFeature = function (node) {
      node.name = this.interpolate(node);
      if (node.expr) {
        this.ret++;
        node.expr = this.visit(node.expr);
        this.ret--
      }
      return node
    };
    Evaluator.prototype.visitObject = function (obj) {
      for (var key in obj.vals) {obj.vals[key] = this.visit(obj.vals[key])}
      return obj
    };
    Evaluator.prototype.visitMember = function (node) {
      var left = node.left, right = node.right, obj = this.visit(left).first;
      if ("object" != obj.nodeName) {throw new Error(left.toString() + " has no property ." + right)}
      if (node.val) {
        this.ret++;
        obj.set(right.name, this.visit(node.val));
        this.ret--
      }
      return obj.get(right.name)
    };
    Evaluator.prototype.visitKeyframes = function (keyframes) {
      var val;
      if (keyframes.fabricated) return keyframes;
      keyframes.val = this.interpolate(keyframes).trim();
      if (val = this.lookup(keyframes.val)) {keyframes.val = val.first.string || val.first.name}
      keyframes.block = this.visit(keyframes.block);
      if ("official" != keyframes.prefix) return keyframes;
      this.vendors.forEach(function (prefix) {
        if ("ms" == prefix) return;
        var node = keyframes.clone();
        node.val = keyframes.val;
        node.prefix = prefix;
        node.block = keyframes.block;
        node.fabricated = true;
        this.currentBlock.push(node)
      }, this);
      return nodes.nil
    };
    Evaluator.prototype.visitFunction = function (fn) {
      var local = this.stack.currentFrame.scope.lookup(fn.name);
      if (local) this.warn("local " + local.nodeName + ' "' + fn.name + '" previously defined in this scope');
      var user = this.functions[fn.name];
      if (user) this.warn('user-defined function "' + fn.name + '" is already defined');
      var bif = bifs[fn.name];
      if (bif) this.warn('built-in function "' + fn.name + '" is already defined');
      return fn
    };
    Evaluator.prototype.visitEach = function (each) {
      this.ret++;
      var expr = utils.unwrap(this.visit(each.expr)),
        len = expr.nodes.length,
        val = new nodes.Ident(each.val),
        key = new nodes.Ident(each.key || "__index__"),
        scope = this.currentScope,
        block = this.currentBlock,
        vals = [],
        self = this,
        body,
        obj;
      this.ret--;
      each.block.scope = false;

      function visitBody(key, val) {
        scope.add(val);
        scope.add(key);
        body = self.visit(each.block.clone());
        vals = vals.concat(body.nodes)
      }

      if (1 == len && "object" == expr.nodes[0].nodeName) {
        obj = expr.nodes[0];
        for (var prop in obj.vals) {
          val.val = new nodes.String(prop);
          key.val = obj.get(prop);
          visitBody(key, val)
        }
      } else {
        for (var i = 0; i < len; ++i) {
          val.val = expr.nodes[i];
          key.val = new nodes.Unit(i);
          visitBody(key, val)
        }
      }
      this.mixin(vals, block);
      return vals[vals.length - 1] || nodes.nil
    };
    Evaluator.prototype.visitCall = function (call) {
      var fn = this.lookup(call.name), literal, ret;
      this.ignoreColors = "url" == call.name;
      if (fn && "expression" == fn.nodeName) {fn = fn.nodes[0]}
      if (fn && "function" != fn.nodeName) {fn = this.lookupFunction(call.name)}
      if (!fn || fn.nodeName != "function") {
        if ("calc" == this.unvendorize(call.name)) {
          literal = call.args.nodes && call.args.nodes[0];
          if (literal) ret = new nodes.Literal(call.name + literal)
        } else {ret = this.literalCall(call)}
        this.ignoreColors = false;
        return ret
      }
      this.calling.push(call.name);
      if (this.calling.length > 200) {throw new RangeError("Maximum stylus call stack size exceeded")}
      if ("expression" == fn.nodeName) fn = fn.first;
      this.ret++;
      var args = this.visit(call.args);
      for (var key in args.map) {args.map[key] = this.visit(args.map[key].clone())}
      this.ret--;
      if (fn.fn) {ret = this.invokeBuiltin(fn.fn, args)} else if ("function" == fn.nodeName) {
        if (call.block) call.block = this.visit(call.block);
        ret = this.invokeFunction(fn, args, call.block)
      }
      this.calling.pop();
      this.ignoreColors = false;
      return ret
    };
    Evaluator.prototype.visitIdent = function (ident) {
      var prop;
      if (ident.property) {
        if (prop = this.lookupProperty(ident.name)) {return this.visit(prop.expr.clone())}
        return nodes.nil
      } else if (ident.val.isNull) {
        var val = this.lookup(ident.name);
        if (val && ident.mixin) this.mixinNode(val);
        return val ? this.visit(val) : ident
      } else {
        this.ret++;
        ident.val = this.visit(ident.val);
        this.ret--;
        this.currentScope.add(ident);
        return ident.val
      }
    };
    Evaluator.prototype.visitBinOp = function (binop) {
      if ("is defined" == binop.op) return this.isDefined(binop.left);
      this.ret++;
      var op = binop.op,
        left = this.visit(binop.left),
        right = "||" == op || "&&" == op ? binop.right : this.visit(binop.right);
      var val = binop.val ? this.visit(binop.val) : null;
      this.ret--;
      try {return this.visit(left.operate(op, right, val))}
      catch (err) {
        if ("CoercionError" == err.name) {
          switch (op) {
            case"==":
              return nodes.no;
            case"!=":
              return nodes.yes
          }
        }
        throw err
      }
    };
    Evaluator.prototype.visitUnaryOp = function (unary) {
      var op = unary.op, node = this.visit(unary.expr);
      if ("!" != op) {
        node = node.first.clone();
        utils.assertType(node, "unit")
      }
      switch (op) {
        case"-":
          node.val = -node.val;
          break;
        case"+":
          node.val = +node.val;
          break;
        case"~":
          node.val = ~node.val;
          break;
        case"!":
          return node.toBoolean().negate()
      }
      return node
    };
    Evaluator.prototype.visitTernary = function (ternary) {
      var ok = this.visit(ternary.cond).toBoolean();
      return ok.isTrue ? this.visit(ternary.trueExpr) : this.visit(ternary.falseExpr)
    };
    Evaluator.prototype.visitExpression = function (expr) {
      for (var i = 0, len = expr.nodes.length; i < len; ++i) {expr.nodes[i] = this.visit(expr.nodes[i])}
      if (this.castable(expr)) expr = this.cast(expr);
      return expr
    };
    Evaluator.prototype.visitArguments = Evaluator.prototype.visitExpression;
    Evaluator.prototype.visitProperty = function (prop) {
      var name = this.interpolate(prop),
        fn = this.lookup(name),
        call = fn && "function" == fn.first.nodeName,
        literal = ~this.calling.indexOf(name),
        _prop = this.property;
      if (call && !literal && !prop.literal) {
        var args = nodes.Arguments.fromExpression(utils.unwrap(prop.expr.clone()));
        prop.name = name;
        this.property = prop;
        this.ret++;
        this.property.expr = this.visit(prop.expr);
        this.ret--;
        var ret = this.visit(new nodes.Call(name, args));
        this.property = _prop;
        return ret
      } else {
        this.ret++;
        prop.name = name;
        prop.literal = true;
        this.property = prop;
        prop.expr = this.visit(prop.expr);
        this.property = _prop;
        this.ret--;
        return prop
      }
    };
    Evaluator.prototype.visitRoot = function (block) {
      if (block != this.root) {
        block.constructor = nodes.Block;
        return this.visit(block)
      }
      for (var i = 0; i < block.nodes.length; ++i) {
        block.index = i;
        block.nodes[i] = this.visit(block.nodes[i])
      }
      return block
    };
    Evaluator.prototype.visitBlock = function (block) {
      this.stack.push(new Frame(block));
      for (block.index = 0; block.index < block.nodes.length; ++block.index) {
        try {block.nodes[block.index] = this.visit(block.nodes[block.index])}
        catch (err) {
          if ("return" == err.nodeName) {
            if (this.ret) {
              this.stack.pop();
              throw err
            } else {
              block.nodes[block.index] = err;
              break
            }
          } else {throw err}
        }
      }
      this.stack.pop();
      return block
    };
    Evaluator.prototype.visitAtblock = function (atblock) {
      atblock.block = this.visit(atblock.block);
      return atblock
    };
    Evaluator.prototype.visitAtrule = function (atrule) {
      atrule.val = this.interpolate(atrule);
      if (atrule.block) atrule.block = this.visit(atrule.block);
      return atrule
    };
    Evaluator.prototype.visitSupports = function (node) {
      var condition = node.condition, val;
      this.ret++;
      node.condition = this.visit(condition);
      this.ret--;
      val = condition.first;
      if (1 == condition.nodes.length && "string" == val.nodeName) {node.condition = val.string}
      node.block = this.visit(node.block);
      return node
    };
    Evaluator.prototype.visitIf = function (node) {
      var ret, block = this.currentBlock, negate = node.negate;
      this.ret++;
      var ok = this.visit(node.cond).first.toBoolean();
      this.ret--;
      node.block.scope = node.block.hasMedia;
      if (negate) {if (ok.isFalse) {ret = this.visit(node.block)}} else {
        if (ok.isTrue) {ret = this.visit(node.block)} else if (node.elses.length) {
          var elses = node.elses,
            len = elses.length,
            cond;
          for (var i = 0; i < len; ++i) {
            if (elses[i].cond) {
              elses[i].block.scope = elses[i].block.hasMedia;
              this.ret++;
              cond = this.visit(elses[i].cond).first.toBoolean();
              this.ret--;
              if (cond.isTrue) {
                ret = this.visit(elses[i].block);
                break
              }
            } else {
              elses[i].scope = elses[i].hasMedia;
              ret = this.visit(elses[i])
            }
          }
        }
      }
      if (ret && !node.postfix && block.node && ~["group", "atrule", "media", "supports", "keyframes"].indexOf(block.node.nodeName)) {
        this.mixin(ret.nodes, block);
        return nodes.nil
      }
      return ret || nodes.nil
    };
    Evaluator.prototype.visitExtend = function (extend) {
      var block = this.currentBlock;
      if ("group" != block.node.nodeName) block = this.closestGroup;
      extend.selectors.forEach(function (selector) {
        block.node.extends.push({
          selector: this.interpolate(selector.clone()).trim(), optional: selector.optional, lineno: selector.lineno,
          column:   selector.column,
        })
      }, this);
      return nodes.nil
    };
    Evaluator.prototype.visitImport = function (imported) {
      this.ret++;
      var path = this.visit(imported.path).first, nodeName = imported.once ? "require" : "import", found, literal;
      this.ret--;
      if ("url" == path.name) {
        if (imported.once) throw new Error("You cannot @require a url");
        return imported
      }
      if (!path.string) throw new Error("@" + nodeName + " string expected");
      var name = path = path.string;
      if (/(?:url\s*\(\s*)?['"]?(?:#|(?:https?:)?\/\/)/i.test(path)) {
        if (imported.once) throw new Error("You cannot @require a url");
        return imported
      }
      if (/\.css(?:"|$)/.test(path)) {
        literal = true;
        if (!imported.once && !this.includeCSS) {return imported}
      }
      if (!literal && !/\.styl$/i.test(path)) path += ".styl";
      found = utils.find(path, this.paths, this.filename);
      if (!found) {found = utils.lookupIndex(name, this.paths, this.filename)}
      if (!found) throw new Error("failed to locate @" + nodeName + " file " + path);
      var block = new nodes.Block;
      for (var i = 0, len = found.length; i < len; ++i) {block.push(importFile.call(this, imported, found[i], literal))}
      return block
    };
    Evaluator.prototype.invokeFunction = function (fn, args, content) {
      var block = new nodes.Block(fn.block.parent);
      var body = fn.block.clone(block);
      var mixinBlock = this.stack.currentFrame.block;
      this.stack.push(new Frame(block));
      var scope = this.currentScope;
      if ("arguments" != args.nodeName) {
        var expr = new nodes.Expression;
        expr.push(args);
        args = nodes.Arguments.fromExpression(expr)
      }
      scope.add(new nodes.Ident("arguments", args));
      scope.add(new nodes.Ident("mixin", this.ret ? nodes.no : new nodes.String(mixinBlock.nodeName)));
      if (this.property) {
        var prop = this.propertyExpression(this.property, fn.name);
        scope.add(new nodes.Ident("current-property", prop))
      } else {scope.add(new nodes.Ident("current-property", nodes.nil))}
      var expr = new nodes.Expression;
      for (var i = this.calling.length - 1; i--;) {expr.push(new nodes.Literal(this.calling[i]))}
      scope.add(new nodes.Ident("called-from", expr));
      var i = 0, len = args.nodes.length;
      fn.params.nodes.forEach(function (node) {
        if (node.rest) {
          node.val = new nodes.Expression;
          for (; i < len; ++i) node.val.push(args.nodes[i]);
          node.val.preserve = true;
          node.val.isList = args.isList
        } else {
          var arg = args.map[node.name] || args.nodes[i++];
          node = node.clone();
          if (arg) {arg.isEmpty ? args.nodes[i - 1] = this.visit(node) : node.val = arg} else {args.push(node.val)}
          if (node.val.isNull) {throw new Error('argument "' + node + '" required for ' + fn)}
        }
        scope.add(node)
      }, this);
      if (content) scope.add(new nodes.Ident("block", content, true));
      return this.invoke(body, true, fn.filename)
    };
    Evaluator.prototype.invokeBuiltin = function (fn, args) {
      if (fn.raw) {args = args.nodes} else {
        args = utils.params(fn).reduce(function (ret, param) {
          var arg = args.map[param] || args.nodes.shift();
          if (arg) {
            arg = utils.unwrap(arg);
            var len = arg.nodes.length;
            if (len > 1) {for (var i = 0; i < len; ++i) {ret.push(utils.unwrap(arg.nodes[i].first))}} else {ret.push(arg.first)}
          }
          return ret
        }, [])
      }
      var body = utils.coerce(fn.apply(this, args));
      var expr = new nodes.Expression;
      expr.push(body);
      body = expr;
      return this.invoke(body)
    };
    Evaluator.prototype.invoke = function (body, stack, filename) {
      var self = this, ret;
      if (filename) this.paths.push(dirname(filename));
      if (this.ret) {
        ret = this.eval(body.nodes);
        if (stack) this.stack.pop()
      } else {
        body = this.visit(body);
        if (stack) this.stack.pop();
        this.mixin(body.nodes, this.currentBlock);
        ret = nodes.nil
      }
      if (filename) this.paths.pop();
      return ret
    };
    Evaluator.prototype.mixin = function (nodes, block) {
      if (!nodes.length) return;
      var len = block.nodes.length,
        head = block.nodes.slice(0, block.index),
        tail = block.nodes.slice(block.index + 1, len);
      this._mixin(nodes, head, block);
      block.index = 0;
      block.nodes = head.concat(tail)
    };
    Evaluator.prototype._mixin = function (items, dest, block) {
      var node, len = items.length;
      for (var i = 0; i < len; ++i) {
        switch ((node = items[i]).nodeName) {
          case"return":
            return;
          case"block":
            this._mixin(node.nodes, dest, block);
            break;
          case"media":
            var parentNode = node.block.parent.node;
            if (parentNode && "call" != parentNode.nodeName) {node.block.parent = block}
          case"property":
            var val = node.expr;
            if (node.literal && "block" == val.first.name) {
              val = utils.unwrap(val);
              val.nodes[0] = new nodes.Literal("block")
            }
          default:
            dest.push(node)
        }
      }
    };
    Evaluator.prototype.mixinNode = function (node) {
      node = this.visit(node.first);
      switch (node.nodeName) {
        case"object":
          this.mixinObject(node);
          return nodes.nil;
        case"block":
        case"atblock":
          this.mixin(node.nodes, this.currentBlock);
          return nodes.nil
      }
    };
    Evaluator.prototype.mixinObject = function (object) {
      var Parser = require("../parser"),
        root = this.root,
        str = "$block " + object.toBlock(),
        parser = new Parser(str, utils.merge({root: block}, this.options)),
        block;
      try {block = parser.parse()}
      catch (err) {
        err.filename = this.filename;
        err.lineno = parser.lexer.lineno;
        err.column = parser.lexer.column;
        err.input = str;
        throw err
      }
      block.parent = root;
      block.scope = false;
      var ret = this.visit(block), vals = ret.first.nodes;
      for (var i = 0, len = vals.length; i < len; ++i) {
        if (vals[i].block) {
          this.mixin(vals[i].block.nodes, this.currentBlock);
          break
        }
      }
    };
    Evaluator.prototype.eval = function (vals) {
      if (!vals) return nodes.nil;
      var len = vals.length, node = nodes.nil;
      try {
        for (var i = 0; i < len; ++i) {
          node = vals[i];
          switch (node.nodeName) {
            case"if":
              if ("block" != node.block.nodeName) {
                node = this.visit(node);
                break
              }
            case"each":
            case"block":
              node = this.visit(node);
              if (node.nodes) node = this.eval(node.nodes);
              break;
            default:
              node = this.visit(node)
          }
        }
      }
      catch (err) {if ("return" == err.nodeName) {return err.expr} else {throw err}}
      return node
    };
    Evaluator.prototype.literalCall = function (call) {
      call.args = this.visit(call.args);
      return call
    };
    Evaluator.prototype.lookupProperty = function (name) {
      var i = this.stack.length, index = this.currentBlock.index, top = i, nodes, block, len, other;
      while (i--) {
        block = this.stack[i].block;
        if (!block.node) continue;
        switch (block.node.nodeName) {
          case"group":
          case"function":
          case"if":
          case"each":
          case"atrule":
          case"media":
          case"atblock":
          case"call":
            nodes = block.nodes;
            if (i + 1 == top) {
              while (index--) {
                if (this.property == nodes[index]) continue;
                other = this.interpolate(nodes[index]);
                if (name == other) return nodes[index].clone()
              }
            } else {
              len = nodes.length;
              while (len--) {
                if ("property" != nodes[len].nodeName || this.property == nodes[len]) continue;
                other = this.interpolate(nodes[len]);
                if (name == other) return nodes[len].clone()
              }
            }
            break
        }
      }
      return nodes.nil
    };
    Evaluator.prototype.__defineGetter__("closestBlock", function () {
      var i = this.stack.length, block;
      while (i--) {
        block = this.stack[i].block;
        if (block.node) {
          switch (block.node.nodeName) {
            case"group":
            case"keyframes":
            case"atrule":
            case"atblock":
            case"media":
            case"call":
              return block
          }
        }
      }
    });
    Evaluator.prototype.__defineGetter__("closestGroup", function () {
      var i = this.stack.length, block;
      while (i--) {
        block = this.stack[i].block;
        if (block.node && "group" == block.node.nodeName) {return block}
      }
    });
    Evaluator.prototype.__defineGetter__("selectorStack", function () {
      var block, stack = [];
      for (var i = 0, len = this.stack.length; i < len; ++i) {
        block = this.stack[i].block;
        if (block.node && "group" == block.node.nodeName) {
          block.node.nodes.forEach(function (selector) {
            if (!selector.val) selector.val = this.interpolate(selector)
          }, this);
          stack.push(block.node.nodes)
        }
      }
      return stack
    });
    Evaluator.prototype.lookup = function (name) {
      var val;
      if (this.ignoreColors && name in colors) return;
      if (val = this.stack.lookup(name)) {return utils.unwrap(val)} else {return this.lookupFunction(name)}
    };
    Evaluator.prototype.interpolate = function (node) {
      var self = this, isSelector = "selector" == node.nodeName;

      function toString(node) {
        switch (node.nodeName) {
          case"function":
          case"ident":
            return node.name;
          case"literal":
          case"string":
            if (self.prefix && !node.prefixed && !node.val.nodeName) {
              node.val = node.val.replace(/\./g, "." + self.prefix);
              node.prefixed = true
            }
            return node.val;
          case"unit":
            return "%" == node.type ? node.val + "%" : node.val;
          case"member":
            return toString(self.visit(node));
          case"expression":
            if (self.calling && ~self.calling.indexOf("selector") && self._selector) return self._selector;
            self.ret++;
            var ret = toString(self.visit(node).first);
            self.ret--;
            if (isSelector) self._selector = ret;
            return ret
        }
      }

      if (node.segments) {return node.segments.map(toString).join("")} else {return toString(node)}
    };
    Evaluator.prototype.lookupFunction = function (name) {
      var fn = this.functions[name] || bifs[name];
      if (fn) return new nodes.Function(name, fn)
    };
    Evaluator.prototype.isDefined = function (node) {
      if ("ident" == node.nodeName) {return nodes.Boolean(this.lookup(node.name))} else {throw new Error('invalid "is defined" check on non-variable ' + node)}
    };
    Evaluator.prototype.propertyExpression = function (prop, name) {
      var expr = new nodes.Expression, val = prop.expr.clone();
      expr.push(new nodes.String(prop.name));

      function replace(node) {
        if ("call" == node.nodeName && name == node.name) {return new nodes.Literal("__CALL__")}
        if (node.nodes) node.nodes = node.nodes.map(replace);
        return node
      }

      replace(val);
      expr.push(val);
      return expr
    };
    Evaluator.prototype.cast = function (expr) {
      return new nodes.Unit(expr.first.val, expr.nodes[1].name)
    };
    Evaluator.prototype.castable = function (expr) {
      return 2 == expr.nodes.length && "unit" == expr.first.nodeName && ~units.indexOf(expr.nodes[1].name)
    };
    Evaluator.prototype.warn = function (msg) {
      if (!this.warnings) return;
      console.warn("Warning: " + msg)
    };
    Evaluator.prototype.__defineGetter__("currentBlock", function () {
      return this.stack.currentFrame.block
    });
    Evaluator.prototype.__defineGetter__("vendors", function () {
      return this.lookup("vendors").nodes.map(function (node) {
        return node.string
      })
    });
    Evaluator.prototype.unvendorize = function (prop) {
      for (var i = 0, len = this.vendors.length; i < len; i++) {
        if ("official" != this.vendors[i]) {
          var vendor = "-" + this.vendors[i] + "-";
          if (~prop.indexOf(vendor)) return prop.replace(vendor, "")
        }
      }
      return prop
    };
    Evaluator.prototype.__defineGetter__("currentScope", function () {
      return this.stack.currentFrame.scope
    });
    Evaluator.prototype.__defineGetter__("currentFrame", function () {
      return this.stack.currentFrame
    })
  });
  require.register("visitor/normalizer.js", function (module, exports, require) {
    var Visitor = require("./index"), nodes = require("../nodes/index"), utils = require("../utils");
    var Normalizer = module.exports = function Normalizer(root, options) {
      options = options || {};
      Visitor.call(this, root);
      this.hoist = options["hoist atrules"];
      this.stack = [];
      this.map = {};
      this.imports = []
    };
    Normalizer.prototype.__proto__ = Visitor.prototype;
    Normalizer.prototype.normalize = function () {
      var ret = this.visit(this.root);
      if (this.hoist) {
        if (this.imports.length) ret.nodes = this.imports.concat(ret.nodes);
        if (this.charset) ret.nodes = [this.charset].concat(ret.nodes)
      }
      return ret
    };
    Normalizer.prototype.bubble = function (node) {
      var props = [], other = [], self = this;

      function filterProps(block) {
        block.nodes.forEach(function (node) {
          node = self.visit(node);
          switch (node.nodeName) {
            case"property":
              props.push(node);
              break;
            case"block":
              filterProps(node);
              break;
            default:
              other.push(node)
          }
        })
      }

      filterProps(node.block);
      if (props.length) {
        var selector = new nodes.Selector([new nodes.Literal("&")]);
        selector.lineno = node.lineno;
        selector.column = node.column;
        selector.filename = node.filename;
        selector.val = "&";
        var group = new nodes.Group;
        group.lineno = node.lineno;
        group.column = node.column;
        group.filename = node.filename;
        var block = new nodes.Block(node.block, group);
        block.lineno = node.lineno;
        block.column = node.column;
        block.filename = node.filename;
        props.forEach(function (prop) {
          block.push(prop)
        });
        group.push(selector);
        group.block = block;
        node.block.nodes = [];
        node.block.push(group);
        other.forEach(function (n) {
          node.block.push(n)
        });
        var group = this.closestGroup(node.block);
        if (group) node.group = group.clone();
        node.bubbled = true
      }
    };
    Normalizer.prototype.closestGroup = function (block) {
      var parent = block.parent, node;
      while (parent && (node = parent.node)) {
        if ("group" == node.nodeName) return node;
        parent = node.block && node.block.parent
      }
    };
    Normalizer.prototype.visitRoot = function (block) {
      var ret = new nodes.Root, node;
      for (var i = 0; i < block.nodes.length; ++i) {
        node = block.nodes[i];
        switch (node.nodeName) {
          case"null":
          case"expression":
          case"function":
          case"unit":
          case"atblock":
            continue;
          default:
            this.rootIndex = i;
            ret.push(this.visit(node))
        }
      }
      return ret
    };
    Normalizer.prototype.visitProperty = function (prop) {
      this.visit(prop.expr);
      return prop
    };
    Normalizer.prototype.visitExpression = function (expr) {
      expr.nodes = expr.nodes.map(function (node) {
        if ("block" == node.nodeName) {
          var literal = new nodes.Literal("block");
          literal.lineno = expr.lineno;
          literal.column = expr.column;
          return literal
        }
        return node
      });
      return expr
    };
    Normalizer.prototype.visitBlock = function (block) {
      var node;
      if (block.hasProperties) {
        for (var i = 0, len = block.nodes.length; i < len; ++i) {
          node = block.nodes[i];
          switch (node.nodeName) {
            case"null":
            case"expression":
            case"function":
            case"group":
            case"unit":
            case"atblock":
              continue;
            default:
              block.nodes[i] = this.visit(node)
          }
        }
      }
      for (var i = 0, len = block.nodes.length; i < len; ++i) {
        node = block.nodes[i];
        block.nodes[i] = this.visit(node)
      }
      return block
    };
    Normalizer.prototype.visitGroup = function (group) {
      var stack = this.stack, map = this.map, parts;
      group.nodes.forEach(function (selector, i) {
        if (!~selector.val.indexOf(",")) return;
        if (~selector.val.indexOf("\\,")) {
          selector.val = selector.val.replace(/\\,/g, ",");
          return
        }
        parts = selector.val.split(",");
        var root = "/" == selector.val.charAt(0), part, s;
        for (var k = 0, len = parts.length; k < len; ++k) {
          part = parts[k].trim();
          if (root && k > 0 && !~part.indexOf("&")) {part = "/" + part}
          s = new nodes.Selector([new nodes.Literal(part)]);
          s.val = part;
          s.block = group.block;
          group.nodes[i++] = s
        }
      });
      stack.push(group.nodes);
      var selectors = utils.compileSelectors(stack, true);
      selectors.forEach(function (selector) {
        map[selector] = map[selector] || [];
        map[selector].push(group)
      });
      this.extend(group, selectors);
      stack.pop();
      return group
    };
    Normalizer.prototype.visitFunction = function () {
      return nodes.nil
    };
    Normalizer.prototype.visitMedia = function (media) {
      var medias = [], group = this.closestGroup(media.block), parent;

      function mergeQueries(block) {
        block.nodes.forEach(function (node, i) {
          switch (node.nodeName) {
            case"media":
              node.val = media.val.merge(node.val);
              medias.push(node);
              block.nodes[i] = nodes.nil;
              break;
            case"block":
              mergeQueries(node);
              break;
            default:
              if (node.block && node.block.nodes) mergeQueries(node.block)
          }
        })
      }

      mergeQueries(media.block);
      this.bubble(media);
      if (medias.length) {
        medias.forEach(function (node) {
          if (group) {group.block.push(node)} else {this.root.nodes.splice(++this.rootIndex, 0, node)}
          node = this.visit(node);
          parent = node.block.parent;
          if (node.bubbled && (!group || "group" == parent.node.nodeName)) {
            node.group.block = node.block.nodes[0].block;
            node.block.nodes[0] = node.group
          }
        }, this)
      }
      return media
    };
    Normalizer.prototype.visitSupports = function (node) {
      this.bubble(node);
      return node
    };
    Normalizer.prototype.visitAtrule = function (node) {
      if (node.block) node.block = this.visit(node.block);
      return node
    };
    Normalizer.prototype.visitKeyframes = function (node) {
      var frames = node.block.nodes.filter(function (frame) {
        return frame.block && frame.block.hasProperties
      });
      node.frames = frames.length;
      return node
    };
    Normalizer.prototype.visitImport = function (node) {
      this.imports.push(node);
      return this.hoist ? nodes.nil : node
    };
    Normalizer.prototype.visitCharset = function (node) {
      this.charset = node;
      return this.hoist ? nodes.nil : node
    };
    Normalizer.prototype.extend = function (group, selectors) {
      var map = this.map, self = this, parent = this.closestGroup(group.block);
      group.extends.forEach(function (extend) {
        var groups = map[extend.selector];
        if (!groups) {
          if (extend.optional) return;
          var err = new Error('Failed to @extend "' + extend.selector + '"');
          err.lineno = extend.lineno;
          err.column = extend.column;
          throw err
        }
        selectors.forEach(function (selector) {
          var node = new nodes.Selector;
          node.val = selector;
          node.inherits = false;
          groups.forEach(function (group) {
            if (!parent || parent != group) self.extend(group, selectors);
            group.push(node)
          })
        })
      });
      group.block = this.visit(group.block)
    }
  });
  return require("stylus")
}();