adding missing node_modules
diff --git a/node_modules/.bin/shjs b/node_modules/.bin/shjs
new file mode 120000
index 0000000..a044997
--- /dev/null
+++ b/node_modules/.bin/shjs
@@ -0,0 +1 @@
+../shelljs/bin/shjs
\ No newline at end of file
diff --git a/node_modules/colors/MIT-LICENSE.txt b/node_modules/colors/MIT-LICENSE.txt
new file mode 100644
index 0000000..7dca107
--- /dev/null
+++ b/node_modules/colors/MIT-LICENSE.txt
@@ -0,0 +1,22 @@
+Copyright (c) 2010 
+
+Marak Squires
+Alexis Sellier (cloudhead)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
\ No newline at end of file
diff --git a/node_modules/colors/ReadMe.md b/node_modules/colors/ReadMe.md
new file mode 100644
index 0000000..0eda52d
--- /dev/null
+++ b/node_modules/colors/ReadMe.md
@@ -0,0 +1,77 @@
+# colors.js - get color and style in your node.js console ( and browser ) like what
+
+<img src="http://i.imgur.com/goJdO.png" border = "0"/>
+
+
+## Installation
+
+    npm install colors
+
+## colors and styles!
+
+- bold
+- italic
+- underline
+- inverse
+- yellow
+- cyan
+- white
+- magenta
+- green
+- red
+- grey
+- blue
+- rainbow
+- zebra
+- random
+
+## Usage
+
+``` js
+var colors = require('./colors');
+
+console.log('hello'.green); // outputs green text
+console.log('i like cake and pies'.underline.red) // outputs red underlined text
+console.log('inverse the color'.inverse); // inverses the color
+console.log('OMG Rainbows!'.rainbow); // rainbow (ignores spaces)
+```
+
+# Creating Custom themes
+
+```js
+
+var colors = require('colors');
+
+colors.setTheme({
+  silly: 'rainbow',
+  input: 'grey',
+  verbose: 'cyan',
+  prompt: 'grey',
+  info: 'green',
+  data: 'grey',
+  help: 'cyan',
+  warn: 'yellow',
+  debug: 'blue',
+  error: 'red'
+});
+
+// outputs red text
+console.log("this is an error".error);
+
+// outputs yellow text
+console.log("this is a warning".warn);
+```
+
+
+### Contributors 
+
+Marak (Marak Squires)
+Alexis Sellier (cloudhead)
+mmalecki (Maciej Małecki)
+nicoreed (Nico Reed)
+morganrallen (Morgan Allen)
+JustinCampbell (Justin Campbell)
+ded (Dustin Diaz)
+
+
+####  , Marak Squires , Justin Campbell, Dustin Diaz (@ded)
diff --git a/node_modules/colors/colors.js b/node_modules/colors/colors.js
new file mode 100644
index 0000000..7a537d8
--- /dev/null
+++ b/node_modules/colors/colors.js
@@ -0,0 +1,342 @@
+/*
+colors.js
+
+Copyright (c) 2010
+
+Marak Squires
+Alexis Sellier (cloudhead)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+*/
+
+var isHeadless = false;
+
+if (typeof module !== 'undefined') {
+  isHeadless = true;
+}
+
+if (!isHeadless) {
+  var exports = {};
+  var module = {};
+  var colors = exports;
+  exports.mode = "browser";
+} else {
+  exports.mode = "console";
+}
+
+//
+// Prototypes the string object to have additional method calls that add terminal colors
+//
+var addProperty = function (color, func) {
+  exports[color] = function (str) {
+    return func.apply(str);
+  };
+  String.prototype.__defineGetter__(color, func);
+};
+
+function stylize(str, style) {
+
+  var styles;
+
+  if (exports.mode === 'console') {
+    styles = {
+      //styles
+      'bold'      : ['\x1B[1m',  '\x1B[22m'],
+      'italic'    : ['\x1B[3m',  '\x1B[23m'],
+      'underline' : ['\x1B[4m',  '\x1B[24m'],
+      'inverse'   : ['\x1B[7m',  '\x1B[27m'],
+      'strikethrough' : ['\x1B[9m',  '\x1B[29m'],
+      //text colors
+      //grayscale
+      'white'     : ['\x1B[37m', '\x1B[39m'],
+      'grey'      : ['\x1B[90m', '\x1B[39m'],
+      'black'     : ['\x1B[30m', '\x1B[39m'],
+      //colors
+      'blue'      : ['\x1B[34m', '\x1B[39m'],
+      'cyan'      : ['\x1B[36m', '\x1B[39m'],
+      'green'     : ['\x1B[32m', '\x1B[39m'],
+      'magenta'   : ['\x1B[35m', '\x1B[39m'],
+      'red'       : ['\x1B[31m', '\x1B[39m'],
+      'yellow'    : ['\x1B[33m', '\x1B[39m'],
+      //background colors
+      //grayscale
+      'whiteBG'     : ['\x1B[47m', '\x1B[49m'],
+      'greyBG'      : ['\x1B[49;5;8m', '\x1B[49m'],
+      'blackBG'     : ['\x1B[40m', '\x1B[49m'],
+      //colors
+      'blueBG'      : ['\x1B[44m', '\x1B[49m'],
+      'cyanBG'      : ['\x1B[46m', '\x1B[49m'],
+      'greenBG'     : ['\x1B[42m', '\x1B[49m'],
+      'magentaBG'   : ['\x1B[45m', '\x1B[49m'],
+      'redBG'       : ['\x1B[41m', '\x1B[49m'],
+      'yellowBG'    : ['\x1B[43m', '\x1B[49m']
+    };
+  } else if (exports.mode === 'browser') {
+    styles = {
+      //styles
+      'bold'      : ['<b>',  '</b>'],
+      'italic'    : ['<i>',  '</i>'],
+      'underline' : ['<u>',  '</u>'],
+      'inverse'   : ['<span style="background-color:black;color:white;">',  '</span>'],
+      'strikethrough' : ['<del>',  '</del>'],
+      //text colors
+      //grayscale
+      'white'     : ['<span style="color:white;">',   '</span>'],
+      'grey'      : ['<span style="color:gray;">',    '</span>'],
+      'black'     : ['<span style="color:black;">',   '</span>'],
+      //colors
+      'blue'      : ['<span style="color:blue;">',    '</span>'],
+      'cyan'      : ['<span style="color:cyan;">',    '</span>'],
+      'green'     : ['<span style="color:green;">',   '</span>'],
+      'magenta'   : ['<span style="color:magenta;">', '</span>'],
+      'red'       : ['<span style="color:red;">',     '</span>'],
+      'yellow'    : ['<span style="color:yellow;">',  '</span>'],
+      //background colors
+      //grayscale
+      'whiteBG'     : ['<span style="background-color:white;">',   '</span>'],
+      'greyBG'      : ['<span style="background-color:gray;">',    '</span>'],
+      'blackBG'     : ['<span style="background-color:black;">',   '</span>'],
+      //colors
+      'blueBG'      : ['<span style="background-color:blue;">',    '</span>'],
+      'cyanBG'      : ['<span style="background-color:cyan;">',    '</span>'],
+      'greenBG'     : ['<span style="background-color:green;">',   '</span>'],
+      'magentaBG'   : ['<span style="background-color:magenta;">', '</span>'],
+      'redBG'       : ['<span style="background-color:red;">',     '</span>'],
+      'yellowBG'    : ['<span style="background-color:yellow;">',  '</span>']
+    };
+  } else if (exports.mode === 'none') {
+    return str + '';
+  } else {
+    console.log('unsupported mode, try "browser", "console" or "none"');
+  }
+  return styles[style][0] + str + styles[style][1];
+}
+
+function applyTheme(theme) {
+
+  //
+  // Remark: This is a list of methods that exist
+  // on String that you should not overwrite.
+  //
+  var stringPrototypeBlacklist = [
+    '__defineGetter__', '__defineSetter__', '__lookupGetter__', '__lookupSetter__', 'charAt', 'constructor',
+    'hasOwnProperty', 'isPrototypeOf', 'propertyIsEnumerable', 'toLocaleString', 'toString', 'valueOf', 'charCodeAt',
+    'indexOf', 'lastIndexof', 'length', 'localeCompare', 'match', 'replace', 'search', 'slice', 'split', 'substring',
+    'toLocaleLowerCase', 'toLocaleUpperCase', 'toLowerCase', 'toUpperCase', 'trim', 'trimLeft', 'trimRight'
+  ];
+
+  Object.keys(theme).forEach(function (prop) {
+    if (stringPrototypeBlacklist.indexOf(prop) !== -1) {
+      console.log('warn: '.red + ('String.prototype' + prop).magenta + ' is probably something you don\'t want to override. Ignoring style name');
+    }
+    else {
+      if (typeof(theme[prop]) === 'string') {
+        addProperty(prop, function () {
+          return exports[theme[prop]](this);
+        });
+      }
+      else {
+        addProperty(prop, function () {
+          var ret = this;
+          for (var t = 0; t < theme[prop].length; t++) {
+            ret = exports[theme[prop][t]](ret);
+          }
+          return ret;
+        });
+      }
+    }
+  });
+}
+
+
+//
+// Iterate through all default styles and colors
+//
+var x = ['bold', 'underline', 'strikethrough', 'italic', 'inverse', 'grey', 'black', 'yellow', 'red', 'green', 'blue', 'white', 'cyan', 'magenta', 'greyBG', 'blackBG', 'yellowBG', 'redBG', 'greenBG', 'blueBG', 'whiteBG', 'cyanBG', 'magentaBG'];
+x.forEach(function (style) {
+
+  // __defineGetter__ at the least works in more browsers
+  // http://robertnyman.com/javascript/javascript-getters-setters.html
+  // Object.defineProperty only works in Chrome
+  addProperty(style, function () {
+    return stylize(this, style);
+  });
+});
+
+function sequencer(map) {
+  return function () {
+    if (!isHeadless) {
+      return this.replace(/( )/, '$1');
+    }
+    var exploded = this.split(""), i = 0;
+    exploded = exploded.map(map);
+    return exploded.join("");
+  };
+}
+
+var rainbowMap = (function () {
+  var rainbowColors = ['red', 'yellow', 'green', 'blue', 'magenta']; //RoY G BiV
+  return function (letter, i, exploded) {
+    if (letter === " ") {
+      return letter;
+    } else {
+      return stylize(letter, rainbowColors[i++ % rainbowColors.length]);
+    }
+  };
+})();
+
+exports.themes = {};
+
+exports.addSequencer = function (name, map) {
+  addProperty(name, sequencer(map));
+};
+
+exports.addSequencer('rainbow', rainbowMap);
+exports.addSequencer('zebra', function (letter, i, exploded) {
+  return i % 2 === 0 ? letter : letter.inverse;
+});
+
+exports.setTheme = function (theme) {
+  if (typeof theme === 'string') {
+    try {
+      exports.themes[theme] = require(theme);
+      applyTheme(exports.themes[theme]);
+      return exports.themes[theme];
+    } catch (err) {
+      console.log(err);
+      return err;
+    }
+  } else {
+    applyTheme(theme);
+  }
+};
+
+
+addProperty('stripColors', function () {
+  return ("" + this).replace(/\x1B\[\d+m/g, '');
+});
+
+// please no
+function zalgo(text, options) {
+  var soul = {
+    "up" : [
+      '̍', '̎', '̄', '̅',
+      '̿', '̑', '̆', '̐',
+      '͒', '͗', '͑', '̇',
+      '̈', '̊', '͂', '̓',
+      '̈', '͊', '͋', '͌',
+      '̃', '̂', '̌', '͐',
+      '̀', '́', '̋', '̏',
+      '̒', '̓', '̔', '̽',
+      '̉', 'ͣ', 'ͤ', 'ͥ',
+      'ͦ', 'ͧ', 'ͨ', 'ͩ',
+      'ͪ', 'ͫ', 'ͬ', 'ͭ',
+      'ͮ', 'ͯ', '̾', '͛',
+      '͆', '̚'
+    ],
+    "down" : [
+      '̖', '̗', '̘', '̙',
+      '̜', '̝', '̞', '̟',
+      '̠', '̤', '̥', '̦',
+      '̩', '̪', '̫', '̬',
+      '̭', '̮', '̯', '̰',
+      '̱', '̲', '̳', '̹',
+      '̺', '̻', '̼', 'ͅ',
+      '͇', '͈', '͉', '͍',
+      '͎', '͓', '͔', '͕',
+      '͖', '͙', '͚', '̣'
+    ],
+    "mid" : [
+      '̕', '̛', '̀', '́',
+      '͘', '̡', '̢', '̧',
+      '̨', '̴', '̵', '̶',
+      '͜', '͝', '͞',
+      '͟', '͠', '͢', '̸',
+      '̷', '͡', ' ҉'
+    ]
+  },
+  all = [].concat(soul.up, soul.down, soul.mid),
+  zalgo = {};
+
+  function randomNumber(range) {
+    var r = Math.floor(Math.random() * range);
+    return r;
+  }
+
+  function is_char(character) {
+    var bool = false;
+    all.filter(function (i) {
+      bool = (i === character);
+    });
+    return bool;
+  }
+
+  function heComes(text, options) {
+    var result = '', counts, l;
+    options = options || {};
+    options["up"] = options["up"] || true;
+    options["mid"] = options["mid"] || true;
+    options["down"] = options["down"] || true;
+    options["size"] = options["size"] || "maxi";
+    text = text.split('');
+    for (l in text) {
+      if (is_char(l)) {
+        continue;
+      }
+      result = result + text[l];
+      counts = {"up" : 0, "down" : 0, "mid" : 0};
+      switch (options.size) {
+      case 'mini':
+        counts.up = randomNumber(8);
+        counts.min = randomNumber(2);
+        counts.down = randomNumber(8);
+        break;
+      case 'maxi':
+        counts.up = randomNumber(16) + 3;
+        counts.min = randomNumber(4) + 1;
+        counts.down = randomNumber(64) + 3;
+        break;
+      default:
+        counts.up = randomNumber(8) + 1;
+        counts.mid = randomNumber(6) / 2;
+        counts.down = randomNumber(8) + 1;
+        break;
+      }
+
+      var arr = ["up", "mid", "down"];
+      for (var d in arr) {
+        var index = arr[d];
+        for (var i = 0 ; i <= counts[index]; i++) {
+          if (options[index]) {
+            result = result + soul[index][randomNumber(soul[index].length)];
+          }
+        }
+      }
+    }
+    return result;
+  }
+  return heComes(text);
+}
+
+
+// don't summon zalgo
+addProperty('zalgo', function () {
+  return zalgo(this);
+});
diff --git a/node_modules/colors/example.html b/node_modules/colors/example.html
new file mode 100644
index 0000000..7a2ae60
--- /dev/null
+++ b/node_modules/colors/example.html
@@ -0,0 +1,76 @@
+<!DOCTYPE HTML>
+<html lang="en-us">
+  <head>
+    <meta http-equiv="Content-type" content="text/html; charset=utf-8">
+    <title>Colors Example</title>
+    <script src="colors.js"></script>
+  </head>
+  <body>
+    <script>
+
+    var test = colors.red("hopefully colorless output");
+
+    document.write('Rainbows are fun!'.rainbow + '<br/>');
+    document.write('So '.italic + 'are'.underline + ' styles! '.bold + 'inverse'.inverse); // styles not widely supported
+    document.write('Chains are also cool.'.bold.italic.underline.red); // styles not widely supported
+    //document.write('zalgo time!'.zalgo);
+    document.write(test.stripColors);
+    document.write("a".grey + " b".black);
+
+    document.write("Zebras are so fun!".zebra);
+
+    document.write(colors.rainbow('Rainbows are fun!'));
+    document.write("This is " + "not".strikethrough + " fun.");
+
+    document.write(colors.italic('So ') + colors.underline('are') + colors.bold(' styles! ') + colors.inverse('inverse')); // styles not widely supported
+    document.write(colors.bold(colors.italic(colors.underline(colors.red('Chains are also cool.'))))); // styles not widely supported
+    //document.write(colors.zalgo('zalgo time!'));
+    document.write(colors.stripColors(test));
+    document.write(colors.grey("a") + colors.black(" b"));
+
+    colors.addSequencer("america", function(letter, i, exploded) {
+      if(letter === " ") return letter;
+      switch(i%3) {
+        case 0: return letter.red;
+        case 1: return letter.white;
+        case 2: return letter.blue;
+      }
+    });
+
+    colors.addSequencer("random", (function() {
+      var available = ['bold', 'underline', 'italic', 'inverse', 'grey', 'yellow', 'red', 'green', 'blue', 'white', 'cyan', 'magenta'];
+
+      return function(letter, i, exploded) {
+        return letter === " " ? letter : letter[available[Math.round(Math.random() * (available.length - 1))]];
+      };
+    })());
+
+    document.write("AMERICA! F--K YEAH!".america);
+    document.write("So apparently I've been to Mars, with all the little green men. But you know, I don't recall.".random);
+
+    //
+    // Custom themes
+    //
+
+    colors.setTheme({
+      silly: 'rainbow',
+      input: 'grey',
+      verbose: 'cyan',
+      prompt: 'grey',
+      info: 'green',
+      data: 'grey',
+      help: 'cyan',
+      warn: 'yellow',
+      debug: 'blue',
+      error: 'red'
+    });
+
+    // outputs red text
+    document.write("this is an error".error);
+
+    // outputs yellow text
+    document.write("this is a warning".warn);
+
+    </script>
+  </body>
+</html>
\ No newline at end of file
diff --git a/node_modules/colors/example.js b/node_modules/colors/example.js
new file mode 100644
index 0000000..b1e03a4
--- /dev/null
+++ b/node_modules/colors/example.js
@@ -0,0 +1,77 @@
+var colors = require('./colors');
+
+//colors.mode = "browser";
+
+var test = colors.red("hopefully colorless output");
+console.log('Rainbows are fun!'.rainbow);
+console.log('So '.italic + 'are'.underline + ' styles! '.bold + 'inverse'.inverse); // styles not widely supported
+console.log('Chains are also cool.'.bold.italic.underline.red); // styles not widely supported
+//console.log('zalgo time!'.zalgo);
+console.log(test.stripColors);
+console.log("a".grey + " b".black);
+console.log("Zebras are so fun!".zebra);
+console.log('background color attack!'.black.whiteBG)
+
+//
+// Remark: .strikethrough may not work with Mac OS Terminal App
+//
+console.log("This is " + "not".strikethrough + " fun.");
+console.log(colors.rainbow('Rainbows are fun!'));
+console.log(colors.italic('So ') + colors.underline('are') + colors.bold(' styles! ') + colors.inverse('inverse')); // styles not widely supported
+console.log(colors.bold(colors.italic(colors.underline(colors.red('Chains are also cool.'))))); // styles not widely supported
+//console.log(colors.zalgo('zalgo time!'));
+console.log(colors.stripColors(test));
+console.log(colors.grey("a") + colors.black(" b"));
+
+colors.addSequencer("america", function(letter, i, exploded) {
+  if(letter === " ") return letter;
+  switch(i%3) {
+    case 0: return letter.red;
+    case 1: return letter.white;
+    case 2: return letter.blue;
+  }
+});
+
+colors.addSequencer("random", (function() {
+  var available = ['bold', 'underline', 'italic', 'inverse', 'grey', 'yellow', 'red', 'green', 'blue', 'white', 'cyan', 'magenta'];
+
+  return function(letter, i, exploded) {
+    return letter === " " ? letter : letter[available[Math.round(Math.random() * (available.length - 1))]];
+  };
+})());
+
+console.log("AMERICA! F--K YEAH!".america);
+console.log("So apparently I've been to Mars, with all the little green men. But you know, I don't recall.".random);
+
+//
+// Custom themes
+//
+
+// Load theme with JSON literal
+colors.setTheme({
+  silly: 'rainbow',
+  input: 'grey',
+  verbose: 'cyan',
+  prompt: 'grey',
+  info: 'green',
+  data: 'grey',
+  help: 'cyan',
+  warn: 'yellow',
+  debug: 'blue',
+  error: 'red'
+});
+
+// outputs red text
+console.log("this is an error".error);
+
+// outputs yellow text
+console.log("this is a warning".warn);
+
+// outputs grey text
+console.log("this is an input".input);
+
+// Load a theme from file
+colors.setTheme('./themes/winston-dark.js');
+
+console.log("this is an input".input);
+
diff --git a/node_modules/colors/package.json b/node_modules/colors/package.json
new file mode 100644
index 0000000..3b15773
--- /dev/null
+++ b/node_modules/colors/package.json
@@ -0,0 +1,46 @@
+{
+  "name": "colors",
+  "description": "get colors in your node.js console like what",
+  "version": "0.6.2",
+  "author": {
+    "name": "Marak Squires"
+  },
+  "homepage": "https://github.com/Marak/colors.js",
+  "bugs": {
+    "url": "https://github.com/Marak/colors.js/issues"
+  },
+  "keywords": [
+    "ansi",
+    "terminal",
+    "colors"
+  ],
+  "repository": {
+    "type": "git",
+    "url": "git+ssh://git@github.com/Marak/colors.js.git"
+  },
+  "engines": {
+    "node": ">=0.1.90"
+  },
+  "main": "colors",
+  "_id": "colors@0.6.2",
+  "dist": {
+    "shasum": "2423fe6678ac0c5dae8852e5d0e5be08c997abcc",
+    "tarball": "http://registry.npmjs.org/colors/-/colors-0.6.2.tgz"
+  },
+  "_from": "colors@0.6.2",
+  "_npmVersion": "1.2.30",
+  "_npmUser": {
+    "name": "marak",
+    "email": "marak.squires@gmail.com"
+  },
+  "maintainers": [
+    {
+      "name": "marak",
+      "email": "marak.squires@gmail.com"
+    }
+  ],
+  "directories": {},
+  "_shasum": "2423fe6678ac0c5dae8852e5d0e5be08c997abcc",
+  "_resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz",
+  "readme": "ERROR: No README data found!"
+}
diff --git a/node_modules/colors/test.js b/node_modules/colors/test.js
new file mode 100644
index 0000000..c32417d
--- /dev/null
+++ b/node_modules/colors/test.js
@@ -0,0 +1,70 @@
+var assert = require('assert'),
+    colors = require('./colors');
+
+var s = 'string';
+
+function a(s, code) {
+  return '\x1B[' + code.toString() + 'm' + s + '\x1B[39m';
+}
+
+function aE(s, color, code) {
+  assert.equal(s[color], a(s, code));
+  assert.equal(colors[color](s), a(s, code));
+  assert.equal(s[color], colors[color](s));
+  assert.equal(s[color].stripColors, s);
+  assert.equal(s[color].stripColors, colors.stripColors(s));
+}
+
+function h(s, color) {
+  return '<span style="color:' + color + ';">' + s + '</span>';
+}
+
+var stylesColors = ['white', 'black', 'blue', 'cyan', 'green', 'magenta', 'red', 'yellow'];
+var stylesAll = stylesColors.concat(['bold', 'italic', 'underline', 'inverse', 'rainbow']);
+
+colors.mode = 'console';
+assert.equal(s.bold, '\x1B[1m' + s + '\x1B[22m');
+assert.equal(s.italic, '\x1B[3m' + s + '\x1B[23m');
+assert.equal(s.underline, '\x1B[4m' + s + '\x1B[24m');
+assert.equal(s.strikethrough, '\x1B[9m' + s + '\x1B[29m');
+assert.equal(s.inverse, '\x1B[7m' + s + '\x1B[27m');
+assert.ok(s.rainbow);
+aE(s, 'white', 37);
+aE(s, 'grey', 90);
+aE(s, 'black', 30);
+aE(s, 'blue', 34);
+aE(s, 'cyan', 36);
+aE(s, 'green', 32);
+aE(s, 'magenta', 35);
+aE(s, 'red', 31);
+aE(s, 'yellow', 33);
+assert.equal(s, 'string');
+
+colors.setTheme({error:'red'});
+
+assert.equal(typeof("astring".red),'string');
+assert.equal(typeof("astring".error),'string');
+
+colors.mode = 'browser';
+assert.equal(s.bold, '<b>' + s + '</b>');
+assert.equal(s.italic, '<i>' + s + '</i>');
+assert.equal(s.underline, '<u>' + s + '</u>');
+assert.equal(s.strikethrough, '<del>' + s + '</del>');
+assert.equal(s.inverse, '<span style="background-color:black;color:white;">' + s + '</span>');
+assert.ok(s.rainbow);
+stylesColors.forEach(function (color) {
+  assert.equal(s[color], h(s, color));
+  assert.equal(colors[color](s), h(s, color));
+});
+
+assert.equal(typeof("astring".red),'string');
+assert.equal(typeof("astring".error),'string');
+
+colors.mode = 'none';
+stylesAll.forEach(function (style) {
+  assert.equal(s[style], s);
+  assert.equal(colors[style](s), s);
+});
+
+assert.equal(typeof("astring".red),'string');
+assert.equal(typeof("astring".error),'string');
diff --git a/node_modules/colors/themes/winston-dark.js b/node_modules/colors/themes/winston-dark.js
new file mode 100644
index 0000000..49a905b
--- /dev/null
+++ b/node_modules/colors/themes/winston-dark.js
@@ -0,0 +1,12 @@
+module['exports'] = {
+  silly: 'rainbow',
+  input: 'black',
+  verbose: 'cyan',
+  prompt: 'grey',
+  info: 'green',
+  data: 'grey',
+  help: 'cyan',
+  warn: 'yellow',
+  debug: 'blue',
+  error: 'red'
+};
\ No newline at end of file
diff --git a/node_modules/colors/themes/winston-light.js b/node_modules/colors/themes/winston-light.js
new file mode 100644
index 0000000..571972c
--- /dev/null
+++ b/node_modules/colors/themes/winston-light.js
@@ -0,0 +1,12 @@
+module['exports'] = {
+  silly: 'rainbow',
+  input: 'grey',
+  verbose: 'cyan',
+  prompt: 'grey',
+  info: 'green',
+  data: 'grey',
+  help: 'cyan',
+  warn: 'yellow',
+  debug: 'blue',
+  error: 'red'
+};
\ No newline at end of file
diff --git a/node_modules/elementtree/.npmignore b/node_modules/elementtree/.npmignore
new file mode 100644
index 0000000..3c3629e
--- /dev/null
+++ b/node_modules/elementtree/.npmignore
@@ -0,0 +1 @@
+node_modules
diff --git a/node_modules/elementtree/.travis.yml b/node_modules/elementtree/.travis.yml
new file mode 100644
index 0000000..6f27c96
--- /dev/null
+++ b/node_modules/elementtree/.travis.yml
@@ -0,0 +1,10 @@
+language: node_js
+
+node_js:
+  - 0.6
+
+script: make test
+
+notifications:
+  email:
+    - tomaz+travisci@tomaz.me
diff --git a/node_modules/elementtree/CHANGES.md b/node_modules/elementtree/CHANGES.md
new file mode 100644
index 0000000..50d415d
--- /dev/null
+++ b/node_modules/elementtree/CHANGES.md
@@ -0,0 +1,39 @@
+elementtree v0.1.6 (in development)
+
+* Add support for CData elements. (#14)
+  [hermannpencole]
+
+elementtree v0.1.5 - 2012-11-14
+
+* Fix a bug in the find() and findtext() method which could manifest itself
+  under some conditions.
+  [metagriffin]
+
+elementtree v0.1.4 - 2012-10-15
+
+* Allow user to use namespaced attributes when using find* functions.
+  [Andrew Lunny]
+
+elementtree v0.1.3 - 2012-09-21
+
+* Improve the output of text content in the tags (strip unnecessary line break
+  characters).
+
+[Darryl Pogue]
+
+elementtree v0.1.2 - 2012-09-04
+
+ * Allow user to pass 'indent' option to ElementTree.write method. If this
+   option is specified (e.g. {'indent': 4}). XML will be pretty printed.
+   [Darryl Pogue, Tomaz Muraus]
+
+ * Bump sax dependency version.
+
+elementtree v0.1.1 - 2011-09-23
+
+ * Improve special character escaping.
+   [Ryan Phillips]
+
+elementtree v0.1.0 - 2011-09-05
+
+ * Initial release.
diff --git a/node_modules/elementtree/LICENSE.txt b/node_modules/elementtree/LICENSE.txt
new file mode 100644
index 0000000..6b0b127
--- /dev/null
+++ b/node_modules/elementtree/LICENSE.txt
@@ -0,0 +1,203 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
diff --git a/node_modules/elementtree/Makefile b/node_modules/elementtree/Makefile
new file mode 100755
index 0000000..ab7c4e0
--- /dev/null
+++ b/node_modules/elementtree/Makefile
@@ -0,0 +1,21 @@
+TESTS := \
+	tests/test-simple.js
+
+
+
+PATH := ./node_modules/.bin:$(PATH)
+
+WHISKEY := $(shell bash -c 'PATH=$(PATH) type -p whiskey')
+
+default: test
+
+test:
+	NODE_PATH=`pwd`/lib/ ${WHISKEY} --scope-leaks --sequential --real-time --tests "${TESTS}"
+
+tap:
+	NODE_PATH=`pwd`/lib/ ${WHISKEY} --test-reporter tap --sequential --real-time --tests "${TESTS}"
+
+coverage:
+	NODE_PATH=`pwd`/lib/ ${WHISKEY} --sequential --coverage  --coverage-reporter html --coverage-dir coverage_html --tests "${TESTS}"
+
+.PHONY: default test coverage tap scope
diff --git a/node_modules/elementtree/NOTICE b/node_modules/elementtree/NOTICE
new file mode 100644
index 0000000..28ad70a
--- /dev/null
+++ b/node_modules/elementtree/NOTICE
@@ -0,0 +1,5 @@
+node-elementtree
+Copyright (c) 2011, Rackspace, Inc.
+
+The ElementTree toolkit is Copyright (c) 1999-2007 by Fredrik Lundh
+
diff --git a/node_modules/elementtree/README.md b/node_modules/elementtree/README.md
new file mode 100644
index 0000000..738420c
--- /dev/null
+++ b/node_modules/elementtree/README.md
@@ -0,0 +1,141 @@
+node-elementtree
+====================
+
+node-elementtree is a [Node.js](http://nodejs.org) XML parser and serializer based upon the [Python ElementTree v1.3](http://effbot.org/zone/element-index.htm) module.
+
+Installation
+====================
+
+    $ npm install elementtree
+    
+Using the library
+====================
+
+For the usage refer to the Python ElementTree library documentation - [http://effbot.org/zone/element-index.htm#usage](http://effbot.org/zone/element-index.htm#usage).
+
+Supported XPath expressions in `find`, `findall` and `findtext` methods are listed on [http://effbot.org/zone/element-xpath.htm](http://effbot.org/zone/element-xpath.htm).
+
+Example 1 – Creating An XML Document
+====================
+
+This example shows how to build a valid XML document that can be published to
+Atom Hopper. Atom Hopper is used internally as a bridge from products all the
+way to collecting revenue, called “Usage.”  MaaS and other products send similar
+events to it every time user performs an action on a resource
+(e.g. creates,updates or deletes). Below is an example of leveraging the API
+to create a new XML document.
+
+```javascript
+var et = require('elementtree');
+var XML = et.XML;
+var ElementTree = et.ElementTree;
+var element = et.Element;
+var subElement = et.SubElement;
+
+var date, root, tenantId, serviceName, eventType, usageId, dataCenter, region,
+checks, resourceId, category, startTime, resourceName, etree, xml;
+
+date = new Date();
+
+root = element('entry');
+root.set('xmlns', 'http://www.w3.org/2005/Atom');
+
+tenantId = subElement(root, 'TenantId');
+tenantId.text = '12345';
+
+serviceName = subElement(root, 'ServiceName');
+serviceName.text = 'MaaS';
+
+resourceId = subElement(root, 'ResourceID');
+resourceId.text = 'enAAAA';
+
+usageId = subElement(root, 'UsageID');
+usageId.text = '550e8400-e29b-41d4-a716-446655440000';
+
+eventType = subElement(root, 'EventType');
+eventType.text = 'create';
+
+category = subElement(root, 'category');
+category.set('term', 'monitoring.entity.create');
+
+dataCenter = subElement(root, 'DataCenter');
+dataCenter.text = 'global';
+
+region = subElement(root, 'Region');
+region.text = 'global';
+
+startTime = subElement(root, 'StartTime');
+startTime.text = date;
+
+resourceName = subElement(root, 'ResourceName');
+resourceName.text = 'entity';
+
+etree = new ElementTree(root);
+xml = etree.write({'xml_declaration': false});
+console.log(xml);
+```
+
+As you can see, both et.Element and et.SubElement are factory methods which
+return a new instance of Element and SubElement class, respectively.
+When you create a new element (tag) you can use set method to set an attribute.
+To set the tag value, assign a value to the .text attribute.
+
+This example would output a document that looks like this:
+
+```xml
+<entry xmlns="http://www.w3.org/2005/Atom">
+  <TenantId>12345</TenantId>
+  <ServiceName>MaaS</ServiceName>
+  <ResourceID>enAAAA</ResourceID>
+  <UsageID>550e8400-e29b-41d4-a716-446655440000</UsageID>
+  <EventType>create</EventType>
+  <category term="monitoring.entity.create"/>
+  <DataCenter>global</DataCenter>
+  <Region>global</Region>
+  <StartTime>Sun Apr 29 2012 16:37:32 GMT-0700 (PDT)</StartTime>
+  <ResourceName>entity</ResourceName>
+</entry>
+```
+
+Example 2 – Parsing An XML Document
+====================
+
+This example shows how to parse an XML document and use simple XPath selectors.
+For demonstration purposes, we will use the XML document located at
+https://gist.github.com/2554343.
+
+Behind the scenes, node-elementtree uses Isaac’s sax library for parsing XML,
+but the library has a concept of “parsers,” which means it’s pretty simple to
+add support for a different parser.
+
+```javascript
+var fs = require('fs');
+
+var et = require('elementtree');
+
+var XML = et.XML;
+var ElementTree = et.ElementTree;
+var element = et.Element;
+var subElement = et.SubElement;
+
+var data, etree;
+
+data = fs.readFileSync('document.xml').toString();
+etree = et.parse(data);
+
+console.log(etree.findall('./entry/TenantId').length); // 2
+console.log(etree.findtext('./entry/ServiceName')); // MaaS
+console.log(etree.findall('./entry/category')[0].get('term')); // monitoring.entity.create
+console.log(etree.findall('*/category/[@term="monitoring.entity.update"]').length); // 1
+```
+
+Build status
+====================
+
+[![Build Status](https://secure.travis-ci.org/racker/node-elementtree.png)](http://travis-ci.org/racker/node-elementtree)
+
+
+License
+====================
+
+node-elementtree is distributed under the [Apache license](http://www.apache.org/licenses/LICENSE-2.0.html).
diff --git a/node_modules/elementtree/lib/constants.js b/node_modules/elementtree/lib/constants.js
new file mode 100644
index 0000000..b057faf
--- /dev/null
+++ b/node_modules/elementtree/lib/constants.js
@@ -0,0 +1,20 @@
+/*
+ *  Copyright 2011 Rackspace
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+
+var DEFAULT_PARSER = 'sax';
+
+exports.DEFAULT_PARSER = DEFAULT_PARSER;
diff --git a/node_modules/elementtree/lib/elementpath.js b/node_modules/elementtree/lib/elementpath.js
new file mode 100644
index 0000000..2e93f47
--- /dev/null
+++ b/node_modules/elementtree/lib/elementpath.js
@@ -0,0 +1,343 @@
+/**
+ *  Copyright 2011 Rackspace
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+
+var sprintf = require('./sprintf').sprintf;
+
+var utils = require('./utils');
+var SyntaxError = require('./errors').SyntaxError;
+
+var _cache = {};
+
+var RE = new RegExp(
+  "(" +
+  "'[^']*'|\"[^\"]*\"|" +
+  "::|" +
+  "//?|" +
+  "\\.\\.|" +
+  "\\(\\)|" +
+  "[/.*:\\[\\]\\(\\)@=])|" +
+  "((?:\\{[^}]+\\})?[^/\\[\\]\\(\\)@=\\s]+)|" +
+  "\\s+", 'g'
+);
+
+var xpath_tokenizer = utils.findall.bind(null, RE);
+
+function prepare_tag(next, token) {
+  var tag = token[0];
+
+  function select(context, result) {
+    var i, len, elem, rv = [];
+
+    for (i = 0, len = result.length; i < len; i++) {
+      elem = result[i];
+      elem._children.forEach(function(e) {
+        if (e.tag === tag) {
+          rv.push(e);
+        }
+      });
+    }
+
+    return rv;
+  }
+
+  return select;
+}
+
+function prepare_star(next, token) {
+  function select(context, result) {
+    var i, len, elem, rv = [];
+
+    for (i = 0, len = result.length; i < len; i++) {
+      elem = result[i];
+      elem._children.forEach(function(e) {
+        rv.push(e);
+      });
+    }
+
+    return rv;
+  }
+
+  return select;
+}
+
+function prepare_dot(next, token) {
+  function select(context, result) {
+    var i, len, elem, rv = [];
+
+    for (i = 0, len = result.length; i < len; i++) {
+      elem = result[i];
+      rv.push(elem);
+    }
+
+    return rv;
+  }
+
+  return select;
+}
+
+function prepare_iter(next, token) {
+  var tag;
+  token = next();
+
+  if (token[1] === '*') {
+    tag = '*';
+  }
+  else if (!token[1]) {
+    tag = token[0] || '';
+  }
+  else {
+    throw new SyntaxError(token);
+  }
+
+  function select(context, result) {
+    var i, len, elem, rv = [];
+
+    for (i = 0, len = result.length; i < len; i++) {
+      elem = result[i];
+      elem.iter(tag, function(e) {
+        if (e !== elem) {
+          rv.push(e);
+        }
+      });
+    }
+
+    return rv;
+  }
+
+  return select;
+}
+
+function prepare_dot_dot(next, token) {
+  function select(context, result) {
+    var i, len, elem, rv = [], parent_map = context.parent_map;
+
+    if (!parent_map) {
+      context.parent_map = parent_map = {};
+
+      context.root.iter(null, function(p) {
+        p._children.forEach(function(e) {
+          parent_map[e] = p;
+        });
+      });
+    }
+
+    for (i = 0, len = result.length; i < len; i++) {
+      elem = result[i];
+
+      if (parent_map.hasOwnProperty(elem)) {
+        rv.push(parent_map[elem]);
+      }
+    }
+
+    return rv;
+  }
+
+  return select;
+}
+
+
+function prepare_predicate(next, token) {
+  var tag, key, value, select;
+  token = next();
+
+  if (token[1] === '@') {
+    // attribute
+    token = next();
+
+    if (token[1]) {
+      throw new SyntaxError(token, 'Invalid attribute predicate');
+    }
+
+    key = token[0];
+    token = next();
+
+    if (token[1] === ']') {
+      select = function(context, result) {
+        var i, len, elem, rv = [];
+
+        for (i = 0, len = result.length; i < len; i++) {
+          elem = result[i];
+
+          if (elem.get(key)) {
+            rv.push(elem);
+          }
+        }
+
+        return rv;
+      };
+    }
+    else if (token[1] === '=') {
+      value = next()[1];
+
+      if (value[0] === '"' || value[value.length - 1] === '\'') {
+        value = value.slice(1, value.length - 1);
+      }
+      else {
+        throw new SyntaxError(token, 'Ivalid comparison target');
+      }
+
+      token = next();
+      select = function(context, result) {
+        var i, len, elem, rv = [];
+
+        for (i = 0, len = result.length; i < len; i++) {
+          elem = result[i];
+
+          if (elem.get(key) === value) {
+            rv.push(elem);
+          }
+        }
+
+        return rv;
+      };
+    }
+
+    if (token[1] !== ']') {
+      throw new SyntaxError(token, 'Invalid attribute predicate');
+    }
+  }
+  else if (!token[1]) {
+    tag = token[0] || '';
+    token = next();
+
+    if (token[1] !== ']') {
+      throw new SyntaxError(token, 'Invalid node predicate');
+    }
+
+    select = function(context, result) {
+      var i, len, elem, rv = [];
+
+      for (i = 0, len = result.length; i < len; i++) {
+        elem = result[i];
+
+        if (elem.find(tag)) {
+          rv.push(elem);
+        }
+      }
+
+      return rv;
+    };
+  }
+  else {
+    throw new SyntaxError(null, 'Invalid predicate');
+  }
+
+  return select;
+}
+
+
+
+var ops = {
+  "": prepare_tag,
+  "*": prepare_star,
+  ".": prepare_dot,
+  "..": prepare_dot_dot,
+  "//": prepare_iter,
+  "[": prepare_predicate,
+};
+
+function _SelectorContext(root) {
+  this.parent_map = null;
+  this.root = root;
+}
+
+function findall(elem, path) {
+  var selector, result, i, len, token, value, select, context;
+
+  if (_cache.hasOwnProperty(path)) {
+    selector = _cache[path];
+  }
+  else {
+    // TODO: Use smarter cache purging approach
+    if (Object.keys(_cache).length > 100) {
+      _cache = {};
+    }
+
+    if (path.charAt(0) === '/') {
+      throw new SyntaxError(null, 'Cannot use absolute path on element');
+    }
+
+    result = xpath_tokenizer(path);
+    selector = [];
+
+    function getToken() {
+      return result.shift();
+    }
+
+    token = getToken();
+    while (true) {
+      var c = token[1] || '';
+      value = ops[c](getToken, token);
+
+      if (!value) {
+        throw new SyntaxError(null, sprintf('Invalid path: %s', path));
+      }
+
+      selector.push(value);
+      token = getToken();
+
+      if (!token) {
+        break;
+      }
+      else if (token[1] === '/') {
+        token = getToken();
+      }
+
+      if (!token) {
+        break;
+      }
+    }
+
+    _cache[path] = selector;
+  }
+
+  // Execute slector pattern
+  result = [elem];
+  context = new _SelectorContext(elem);
+
+  for (i = 0, len = selector.length; i < len; i++) {
+    select = selector[i];
+    result = select(context, result);
+  }
+
+  return result || [];
+}
+
+function find(element, path) {
+  var resultElements = findall(element, path);
+
+  if (resultElements && resultElements.length > 0) {
+    return resultElements[0];
+  }
+
+  return null;
+}
+
+function findtext(element, path, defvalue) {
+  var resultElements = findall(element, path);
+
+  if (resultElements && resultElements.length > 0) {
+    return resultElements[0].text;
+  }
+
+  return defvalue;
+}
+
+
+exports.find = find;
+exports.findall = findall;
+exports.findtext = findtext;
diff --git a/node_modules/elementtree/lib/elementtree.js b/node_modules/elementtree/lib/elementtree.js
new file mode 100644
index 0000000..61d9276
--- /dev/null
+++ b/node_modules/elementtree/lib/elementtree.js
@@ -0,0 +1,611 @@
+/**
+ *  Copyright 2011 Rackspace
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+
+var sprintf = require('./sprintf').sprintf;
+
+var utils = require('./utils');
+var ElementPath = require('./elementpath');
+var TreeBuilder = require('./treebuilder').TreeBuilder;
+var get_parser = require('./parser').get_parser;
+var constants = require('./constants');
+
+var element_ids = 0;
+
+function Element(tag, attrib)
+{
+  this._id = element_ids++;
+  this.tag = tag;
+  this.attrib = {};
+  this.text = null;
+  this.tail = null;
+  this._children = [];
+
+  if (attrib) {
+    this.attrib = utils.merge(this.attrib, attrib);
+  }
+}
+
+Element.prototype.toString = function()
+{
+  return sprintf("<Element %s at %s>", this.tag, this._id);
+};
+
+Element.prototype.makeelement = function(tag, attrib)
+{
+  return new Element(tag, attrib);
+};
+
+Element.prototype.len = function()
+{
+  return this._children.length;
+};
+
+Element.prototype.getItem = function(index)
+{
+  return this._children[index];
+};
+
+Element.prototype.setItem = function(index, element)
+{
+  this._children[index] = element;
+};
+
+Element.prototype.delItem = function(index)
+{
+  this._children.splice(index, 1);
+};
+
+Element.prototype.getSlice = function(start, stop)
+{
+  return this._children.slice(start, stop);
+};
+
+Element.prototype.setSlice = function(start, stop, elements)
+{
+  var i;
+  var k = 0;
+  for (i = start; i < stop; i++, k++) {
+    this._children[i] = elements[k];
+  }
+};
+
+Element.prototype.delSlice = function(start, stop)
+{
+  this._children.splice(start, stop - start);
+};
+
+Element.prototype.append = function(element)
+{
+  this._children.push(element);
+};
+
+Element.prototype.extend = function(elements)
+{
+  this._children.concat(elements);
+};
+
+Element.prototype.insert = function(index, element)
+{
+  this._children[index] = element;
+};
+
+Element.prototype.remove = function(element)
+{
+  this._children = this._children.filter(function(e) {
+    /* TODO: is this the right way to do this? */
+    if (e._id === element._id) {
+      return false;
+    }
+    return true;
+  });
+};
+
+Element.prototype.getchildren = function() {
+  return this._children;
+};
+
+Element.prototype.find = function(path)
+{
+  return ElementPath.find(this, path);
+};
+
+Element.prototype.findtext = function(path, defvalue)
+{
+  return ElementPath.findtext(this, path, defvalue);
+};
+
+Element.prototype.findall = function(path, defvalue)
+{
+  return ElementPath.findall(this, path, defvalue);
+};
+
+Element.prototype.clear = function()
+{
+  this.attrib = {};
+  this._children = [];
+  this.text = null;
+  this.tail = null;
+};
+
+Element.prototype.get = function(key, defvalue)
+{
+  if (this.attrib[key] !== undefined) {
+    return this.attrib[key];
+  }
+  else {
+    return defvalue;
+  }
+};
+
+Element.prototype.set = function(key, value)
+{
+  this.attrib[key] = value;
+};
+
+Element.prototype.keys = function()
+{
+  return Object.keys(this.attrib);
+};
+
+Element.prototype.items = function()
+{
+  return utils.items(this.attrib);
+};
+
+/*
+ * In python this uses a generator, but in v8 we don't have em,
+ * so we use a callback instead.
+ **/
+Element.prototype.iter = function(tag, callback)
+{
+  var self = this;
+  var i, child;
+
+  if (tag === "*") {
+    tag = null;
+  }
+
+  if (tag === null || this.tag === tag) {
+    callback(self);
+  }
+
+  for (i = 0; i < this._children.length; i++) {
+    child = this._children[i];
+    child.iter(tag, function(e) {
+      callback(e);
+    });
+  }
+};
+
+Element.prototype.itertext = function(callback)
+{
+  this.iter(null, function(e) {
+    if (e.text) {
+      callback(e.text);
+    }
+
+    if (e.tail) {
+      callback(e.tail);
+    }
+  });
+};
+
+
+function SubElement(parent, tag, attrib) {
+  var element = parent.makeelement(tag, attrib);
+  parent.append(element);
+  return element;
+}
+
+function Comment(text) {
+  var element = new Element(Comment);
+  if (text) {
+    element.text = text;
+  }
+  return element;
+}
+
+function CData(text) {
+  var element = new Element(CData);
+  if (text) {
+    element.text = text;
+  }
+  return element;
+}
+
+function ProcessingInstruction(target, text)
+{
+  var element = new Element(ProcessingInstruction);
+  element.text = target;
+  if (text) {
+    element.text = element.text + " " + text;
+  }
+  return element;
+}
+
+function QName(text_or_uri, tag)
+{
+  if (tag) {
+    text_or_uri = sprintf("{%s}%s", text_or_uri, tag);
+  }
+  this.text = text_or_uri;
+}
+
+QName.prototype.toString = function() {
+  return this.text;
+};
+
+function ElementTree(element)
+{
+  this._root = element;
+}
+
+ElementTree.prototype.getroot = function() {
+  return this._root;
+};
+
+ElementTree.prototype._setroot = function(element) {
+  this._root = element;
+};
+
+ElementTree.prototype.parse = function(source, parser) {
+  if (!parser) {
+    parser = get_parser(constants.DEFAULT_PARSER);
+    parser = new parser.XMLParser(new TreeBuilder());
+  }
+
+  parser.feed(source);
+  this._root = parser.close();
+  return this._root;
+};
+
+ElementTree.prototype.iter = function(tag, callback) {
+  this._root.iter(tag, callback);
+};
+
+ElementTree.prototype.find = function(path) {
+  return this._root.find(path);
+};
+
+ElementTree.prototype.findtext = function(path, defvalue) {
+  return this._root.findtext(path, defvalue);
+};
+
+ElementTree.prototype.findall = function(path) {
+  return this._root.findall(path);
+};
+
+/**
+ * Unlike ElementTree, we don't write to a file, we return you a string.
+ */
+ElementTree.prototype.write = function(options) {
+  var sb = [];
+  options = utils.merge({
+    encoding: 'utf-8',
+    xml_declaration: null,
+    default_namespace: null,
+    method: 'xml'}, options);
+
+  if (options.xml_declaration !== false) {
+    sb.push("<?xml version='1.0' encoding='"+options.encoding +"'?>\n");
+  }
+
+  if (options.method === "text") {
+    _serialize_text(sb, self._root, encoding);
+  }
+  else {
+    var qnames, namespaces, indent, indent_string;
+    var x = _namespaces(this._root, options.encoding, options.default_namespace);
+    qnames = x[0];
+    namespaces = x[1];
+
+    if (options.hasOwnProperty('indent')) {
+      indent = 0;
+      indent_string = new Array(options.indent + 1).join(' ');
+    }
+    else {
+      indent = false;
+    }
+
+    if (options.method === "xml") {
+      _serialize_xml(function(data) {
+        sb.push(data);
+      }, this._root, options.encoding, qnames, namespaces, indent, indent_string);
+    }
+    else {
+      /* TODO: html */
+      throw new Error("unknown serialization method "+ options.method);
+    }
+  }
+
+  return sb.join("");
+};
+
+var _namespace_map = {
+    /* "well-known" namespace prefixes */
+    "http://www.w3.org/XML/1998/namespace": "xml",
+    "http://www.w3.org/1999/xhtml": "html",
+    "http://www.w3.org/1999/02/22-rdf-syntax-ns#": "rdf",
+    "http://schemas.xmlsoap.org/wsdl/": "wsdl",
+    /* xml schema */
+    "http://www.w3.org/2001/XMLSchema": "xs",
+    "http://www.w3.org/2001/XMLSchema-instance": "xsi",
+    /* dublic core */
+    "http://purl.org/dc/elements/1.1/": "dc",
+};
+
+function register_namespace(prefix, uri) {
+  if (/ns\d+$/.test(prefix)) {
+    throw new Error('Prefix format reserved for internal use');
+  }
+
+  if (_namespace_map.hasOwnProperty(uri) && _namespace_map[uri] === prefix) {
+    delete _namespace_map[uri];
+  }
+
+  _namespace_map[uri] = prefix;
+}
+
+
+function _escape(text, encoding, isAttribute, isText) {
+  if (text) {
+    text = text.toString();
+    text = text.replace(/&/g, '&amp;');
+    text = text.replace(/</g, '&lt;');
+    text = text.replace(/>/g, '&gt;');
+    if (!isText) {
+        text = text.replace(/\n/g, '&#xA;');
+        text = text.replace(/\r/g, '&#xD;');
+    }
+    if (isAttribute) {
+      text = text.replace(/"/g, '&quot;');
+    }
+  }
+  return text;
+}
+
+/* TODO: benchmark single regex */
+function _escape_attrib(text, encoding) {
+  return _escape(text, encoding, true);
+}
+
+function _escape_cdata(text, encoding) {
+  return _escape(text, encoding, false);
+}
+
+function _escape_text(text, encoding) {
+  return _escape(text, encoding, false, true);
+}
+
+function _namespaces(elem, encoding, default_namespace) {
+  var qnames = {};
+  var namespaces = {};
+
+  if (default_namespace) {
+    namespaces[default_namespace] = "";
+  }
+
+  function encode(text) {
+    return text;
+  }
+
+  function add_qname(qname) {
+    if (qname[0] === "{") {
+      var tmp = qname.substring(1).split("}", 2);
+      var uri = tmp[0];
+      var tag = tmp[1];
+      var prefix = namespaces[uri];
+
+      if (prefix === undefined) {
+        prefix = _namespace_map[uri];
+        if (prefix === undefined) {
+          prefix = "ns" + Object.keys(namespaces).length;
+        }
+        if (prefix !== "xml") {
+          namespaces[uri] = prefix;
+        }
+      }
+
+      if (prefix) {
+        qnames[qname] = sprintf("%s:%s", prefix, tag);
+      }
+      else {
+        qnames[qname] = tag;
+      }
+    }
+    else {
+      if (default_namespace) {
+        throw new Error('cannot use non-qualified names with default_namespace option');
+      }
+
+      qnames[qname] = qname;
+    }
+  }
+
+
+  elem.iter(null, function(e) {
+    var i;
+    var tag = e.tag;
+    var text = e.text;
+    var items = e.items();
+
+    if (tag instanceof QName && qnames[tag.text] === undefined) {
+      add_qname(tag.text);
+    }
+    else if (typeof(tag) === "string") {
+      add_qname(tag);
+    }
+    else if (tag !== null && tag !== Comment && tag !== CData && tag !== ProcessingInstruction) {
+      throw new Error('Invalid tag type for serialization: '+ tag);
+    }
+
+    if (text instanceof QName && qnames[text.text] === undefined) {
+      add_qname(text.text);
+    }
+
+    items.forEach(function(item) {
+      var key = item[0],
+          value = item[1];
+      if (key instanceof QName) {
+        key = key.text;
+      }
+
+      if (qnames[key] === undefined) {
+        add_qname(key);
+      }
+
+      if (value instanceof QName && qnames[value.text] === undefined) {
+        add_qname(value.text);
+      }
+    });
+  });
+  return [qnames, namespaces];
+}
+
+function _serialize_xml(write, elem, encoding, qnames, namespaces, indent, indent_string) {
+  var tag = elem.tag;
+  var text = elem.text;
+  var items;
+  var i;
+
+  var newlines = indent || (indent === 0);
+  write(Array(indent + 1).join(indent_string));
+
+  if (tag === Comment) {
+    write(sprintf("<!--%s-->", _escape_cdata(text, encoding)));
+  }
+  else if (tag === ProcessingInstruction) {
+    write(sprintf("<?%s?>", _escape_cdata(text, encoding)));
+  }
+  else if (tag === CData) {
+    text = text || '';
+    write(sprintf("<![CDATA[%s]]>", text));
+  }
+  else {
+    tag = qnames[tag];
+    if (tag === undefined) {
+      if (text) {
+        write(_escape_text(text, encoding));
+      }
+      elem.iter(function(e) {
+        _serialize_xml(write, e, encoding, qnames, null, newlines ? indent + 1 : false, indent_string);
+      });
+    }
+    else {
+      write("<" + tag);
+      items = elem.items();
+
+      if (items || namespaces) {
+        items.sort(); // lexical order
+
+        items.forEach(function(item) {
+          var k = item[0],
+              v = item[1];
+
+            if (k instanceof QName) {
+              k = k.text;
+            }
+
+            if (v instanceof QName) {
+              v = qnames[v.text];
+            }
+            else {
+              v = _escape_attrib(v, encoding);
+            }
+            write(sprintf(" %s=\"%s\"", qnames[k], v));
+        });
+
+        if (namespaces) {
+          items = utils.items(namespaces);
+          items.sort(function(a, b) { return a[1] < b[1]; });
+
+          items.forEach(function(item) {
+            var k = item[1],
+                v = item[0];
+
+            if (k) {
+              k = ':' + k;
+            }
+
+            write(sprintf(" xmlns%s=\"%s\"", k, _escape_attrib(v, encoding)));
+          });
+        }
+      }
+
+      if (text || elem.len()) {
+        if (text && text.toString().match(/^\s*$/)) {
+            text = null;
+        }
+
+        write(">");
+        if (!text && newlines) {
+          write("\n");
+        }
+
+        if (text) {
+          write(_escape_text(text, encoding));
+        }
+        elem._children.forEach(function(e) {
+          _serialize_xml(write, e, encoding, qnames, null, newlines ? indent + 1 : false, indent_string);
+        });
+
+        if (!text && indent) {
+          write(Array(indent + 1).join(indent_string));
+        }
+        write("</" + tag + ">");
+      }
+      else {
+        write(" />");
+      }
+    }
+  }
+
+  if (newlines) {
+    write("\n");
+  }
+}
+
+function parse(source, parser) {
+  var tree = new ElementTree();
+  tree.parse(source, parser);
+  return tree;
+}
+
+function tostring(element, options) {
+  return new ElementTree(element).write(options);
+}
+
+exports.PI = ProcessingInstruction;
+exports.Comment = Comment;
+exports.CData = CData;
+exports.ProcessingInstruction = ProcessingInstruction;
+exports.SubElement = SubElement;
+exports.QName = QName;
+exports.ElementTree = ElementTree;
+exports.ElementPath = ElementPath;
+exports.Element = function(tag, attrib) {
+  return new Element(tag, attrib);
+};
+
+exports.XML = function(data) {
+  var et = new ElementTree();
+  return et.parse(data);
+};
+
+exports.parse = parse;
+exports.register_namespace = register_namespace;
+exports.tostring = tostring;
diff --git a/node_modules/elementtree/lib/errors.js b/node_modules/elementtree/lib/errors.js
new file mode 100644
index 0000000..e8742be
--- /dev/null
+++ b/node_modules/elementtree/lib/errors.js
@@ -0,0 +1,31 @@
+/**
+ *  Copyright 2011 Rackspace
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+
+var util = require('util');
+
+var sprintf = require('./sprintf').sprintf;
+
+function SyntaxError(token, msg) {
+  msg = msg || sprintf('Syntax Error at token %s', token.toString());
+  this.token = token;
+  this.message = msg;
+  Error.call(this, msg);
+}
+
+util.inherits(SyntaxError, Error);
+
+exports.SyntaxError = SyntaxError;
diff --git a/node_modules/elementtree/lib/parser.js b/node_modules/elementtree/lib/parser.js
new file mode 100644
index 0000000..7307ee4
--- /dev/null
+++ b/node_modules/elementtree/lib/parser.js
@@ -0,0 +1,33 @@
+/*
+ *  Copyright 2011 Rackspace
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+
+/* TODO: support node-expat C++ module optionally */
+
+var util = require('util');
+var parsers = require('./parsers/index');
+
+function get_parser(name) {
+  if (name === 'sax') {
+    return parsers.sax;
+  }
+  else {
+    throw new Error('Invalid parser: ' + name);
+  }
+}
+
+
+exports.get_parser = get_parser;
diff --git a/node_modules/elementtree/lib/parsers/index.js b/node_modules/elementtree/lib/parsers/index.js
new file mode 100644
index 0000000..5eac5c8
--- /dev/null
+++ b/node_modules/elementtree/lib/parsers/index.js
@@ -0,0 +1 @@
+exports.sax = require('./sax');
diff --git a/node_modules/elementtree/lib/parsers/sax.js b/node_modules/elementtree/lib/parsers/sax.js
new file mode 100644
index 0000000..69b0a59
--- /dev/null
+++ b/node_modules/elementtree/lib/parsers/sax.js
@@ -0,0 +1,56 @@
+var util = require('util');
+
+var sax = require('sax');
+
+var TreeBuilder = require('./../treebuilder').TreeBuilder;
+
+function XMLParser(target) {
+  this.parser = sax.parser(true);
+
+  this.target = (target) ? target : new TreeBuilder();
+
+  this.parser.onopentag = this._handleOpenTag.bind(this);
+  this.parser.ontext = this._handleText.bind(this);
+  this.parser.oncdata = this._handleCdata.bind(this);
+  this.parser.ondoctype = this._handleDoctype.bind(this);
+  this.parser.oncomment = this._handleComment.bind(this);
+  this.parser.onclosetag = this._handleCloseTag.bind(this);
+  this.parser.onerror = this._handleError.bind(this);
+}
+
+XMLParser.prototype._handleOpenTag = function(tag) {
+  this.target.start(tag.name, tag.attributes);
+};
+
+XMLParser.prototype._handleText = function(text) {
+  this.target.data(text);
+};
+
+XMLParser.prototype._handleCdata = function(text) {
+  this.target.data(text);
+};
+
+XMLParser.prototype._handleDoctype = function(text) {
+};
+
+XMLParser.prototype._handleComment = function(comment) {
+};
+
+XMLParser.prototype._handleCloseTag = function(tag) {
+  this.target.end(tag);
+};
+
+XMLParser.prototype._handleError = function(err) {
+  throw err;
+};
+
+XMLParser.prototype.feed = function(chunk) {
+  this.parser.write(chunk);
+};
+
+XMLParser.prototype.close = function() {
+  this.parser.close();
+  return this.target.close();
+};
+
+exports.XMLParser = XMLParser;
diff --git a/node_modules/elementtree/lib/sprintf.js b/node_modules/elementtree/lib/sprintf.js
new file mode 100644
index 0000000..f802c1b
--- /dev/null
+++ b/node_modules/elementtree/lib/sprintf.js
@@ -0,0 +1,86 @@
+/*
+ *  Copyright 2011 Rackspace
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+
+var cache = {};
+
+
+// Do any others need escaping?
+var TO_ESCAPE = {
+  '\'': '\\\'',
+  '\n': '\\n'
+};
+
+
+function populate(formatter) {
+  var i, type,
+      key = formatter,
+      prev = 0,
+      arg = 1,
+      builder = 'return \'';
+
+  for (i = 0; i < formatter.length; i++) {
+    if (formatter[i] === '%') {
+      type = formatter[i + 1];
+
+      switch (type) {
+        case 's':
+          builder += formatter.slice(prev, i) + '\' + arguments[' + arg + '] + \'';
+          prev = i + 2;
+          arg++;
+          break;
+        case 'j':
+          builder += formatter.slice(prev, i) + '\' + JSON.stringify(arguments[' + arg + ']) + \'';
+          prev = i + 2;
+          arg++;
+          break;
+        case '%':
+          builder += formatter.slice(prev, i + 1);
+          prev = i + 2;
+          i++;
+          break;
+      }
+
+
+    } else if (TO_ESCAPE[formatter[i]]) {
+      builder += formatter.slice(prev, i) + TO_ESCAPE[formatter[i]];
+      prev = i + 1;
+    }
+  }
+
+  builder += formatter.slice(prev) + '\';';
+  cache[key] = new Function(builder);
+}
+
+
+/**
+ * A fast version of sprintf(), which currently only supports the %s and %j.
+ * This caches a formatting function for each format string that is used, so
+ * you should only use this sprintf() will be called many times with a single
+ * format string and a limited number of format strings will ever be used (in
+ * general this means that format strings should be string literals).
+ *
+ * @param {String} formatter A format string.
+ * @param {...String} var_args Values that will be formatted by %s and %j.
+ * @return {String} The formatted output.
+ */
+exports.sprintf = function(formatter, var_args) {
+  if (!cache[formatter]) {
+    populate(formatter);
+  }
+
+  return cache[formatter].apply(null, arguments);
+};
diff --git a/node_modules/elementtree/lib/treebuilder.js b/node_modules/elementtree/lib/treebuilder.js
new file mode 100644
index 0000000..393a98f
--- /dev/null
+++ b/node_modules/elementtree/lib/treebuilder.js
@@ -0,0 +1,60 @@
+function TreeBuilder(element_factory) {
+  this._data = [];
+  this._elem = [];
+  this._last = null;
+  this._tail = null;
+  if (!element_factory) {
+    /* evil circular dep */
+    element_factory = require('./elementtree').Element;
+  }
+  this._factory = element_factory;
+}
+
+TreeBuilder.prototype.close = function() {
+  return this._last;
+};
+
+TreeBuilder.prototype._flush = function() {
+  if (this._data) {
+    if (this._last !== null) {
+      var text = this._data.join("");
+      if (this._tail) {
+        this._last.tail = text;
+      }
+      else {
+        this._last.text = text;
+      }
+    }
+    this._data = [];
+  }
+};
+
+TreeBuilder.prototype.data = function(data) {
+  this._data.push(data);
+};
+
+TreeBuilder.prototype.start = function(tag, attrs) {
+  this._flush();
+  var elem = this._factory(tag, attrs);
+  this._last = elem;
+
+  if (this._elem.length) {
+    this._elem[this._elem.length - 1].append(elem);
+  }
+
+  this._elem.push(elem);
+
+  this._tail = null;
+};
+
+TreeBuilder.prototype.end = function(tag) {
+  this._flush();
+  this._last = this._elem.pop();
+  if (this._last.tag !== tag) {
+    throw new Error("end tag mismatch");
+  }
+  this._tail = 1;
+  return this._last;
+};
+
+exports.TreeBuilder = TreeBuilder;
diff --git a/node_modules/elementtree/lib/utils.js b/node_modules/elementtree/lib/utils.js
new file mode 100644
index 0000000..b08a670
--- /dev/null
+++ b/node_modules/elementtree/lib/utils.js
@@ -0,0 +1,72 @@
+/**
+ *  Copyright 2011 Rackspace
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+
+/**
+ * @param {Object} hash.
+ * @param {Array} ignored.
+ */
+function items(hash, ignored) {
+  ignored = ignored || null;
+  var k, rv = [];
+
+  function is_ignored(key) {
+    if (!ignored || ignored.length === 0) {
+      return false;
+    }
+
+    return ignored.indexOf(key);
+  }
+
+  for (k in hash) {
+    if (hash.hasOwnProperty(k) && !(is_ignored(ignored))) {
+      rv.push([k, hash[k]]);
+    }
+  }
+
+  return rv;
+}
+
+
+function findall(re, str) {
+  var match, matches = [];
+
+  while ((match = re.exec(str))) {
+      matches.push(match);
+  }
+
+  return matches;
+}
+
+function merge(a, b) {
+  var c = {}, attrname;
+
+  for (attrname in a) {
+    if (a.hasOwnProperty(attrname)) {
+      c[attrname] = a[attrname];
+    }
+  }
+  for (attrname in b) {
+    if (b.hasOwnProperty(attrname)) {
+      c[attrname] = b[attrname];
+    }
+  }
+  return c;
+}
+
+exports.items = items;
+exports.findall = findall;
+exports.merge = merge;
diff --git a/node_modules/elementtree/node_modules/sax/AUTHORS b/node_modules/elementtree/node_modules/sax/AUTHORS
new file mode 100644
index 0000000..26d8659
--- /dev/null
+++ b/node_modules/elementtree/node_modules/sax/AUTHORS
@@ -0,0 +1,9 @@
+# contributors sorted by whether or not they're me.
+Isaac Z. Schlueter <i@izs.me>
+Stein Martin Hustad <stein@hustad.com>
+Mikeal Rogers <mikeal.rogers@gmail.com>
+Laurie Harper <laurie@holoweb.net>
+Jann Horn <jann@Jann-PC.fritz.box>
+Elijah Insua <tmpvar@gmail.com>
+Henry Rawas <henryr@schakra.com>
+Justin Makeig <jmpublic@makeig.com>
diff --git a/node_modules/elementtree/node_modules/sax/LICENSE b/node_modules/elementtree/node_modules/sax/LICENSE
new file mode 100644
index 0000000..05a4010
--- /dev/null
+++ b/node_modules/elementtree/node_modules/sax/LICENSE
@@ -0,0 +1,23 @@
+Copyright 2009, 2010, 2011 Isaac Z. Schlueter.
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/elementtree/node_modules/sax/README.md b/node_modules/elementtree/node_modules/sax/README.md
new file mode 100644
index 0000000..9c63dc4
--- /dev/null
+++ b/node_modules/elementtree/node_modules/sax/README.md
@@ -0,0 +1,213 @@
+# sax js
+
+A sax-style parser for XML and HTML.
+
+Designed with [node](http://nodejs.org/) in mind, but should work fine in
+the browser or other CommonJS implementations.
+
+## What This Is
+
+* A very simple tool to parse through an XML string.
+* A stepping stone to a streaming HTML parser.
+* A handy way to deal with RSS and other mostly-ok-but-kinda-broken XML 
+  docs.
+
+## What This Is (probably) Not
+
+* An HTML Parser - That's a fine goal, but this isn't it.  It's just
+  XML.
+* A DOM Builder - You can use it to build an object model out of XML,
+  but it doesn't do that out of the box.
+* XSLT - No DOM = no querying.
+* 100% Compliant with (some other SAX implementation) - Most SAX
+  implementations are in Java and do a lot more than this does.
+* An XML Validator - It does a little validation when in strict mode, but
+  not much.
+* A Schema-Aware XSD Thing - Schemas are an exercise in fetishistic 
+  masochism.
+* A DTD-aware Thing - Fetching DTDs is a much bigger job.
+
+## Regarding `<!DOCTYPE`s and `<!ENTITY`s
+
+The parser will handle the basic XML entities in text nodes and attribute
+values: `&amp; &lt; &gt; &apos; &quot;`. It's possible to define additional
+entities in XML by putting them in the DTD. This parser doesn't do anything
+with that. If you want to listen to the `ondoctype` event, and then fetch
+the doctypes, and read the entities and add them to `parser.ENTITIES`, then
+be my guest.
+
+Unknown entities will fail in strict mode, and in loose mode, will pass
+through unmolested.
+
+## Usage
+
+    var sax = require("./lib/sax"),
+      strict = true, // set to false for html-mode
+      parser = sax.parser(strict);
+
+    parser.onerror = function (e) {
+      // an error happened.
+    };
+    parser.ontext = function (t) {
+      // got some text.  t is the string of text.
+    };
+    parser.onopentag = function (node) {
+      // opened a tag.  node has "name" and "attributes"
+    };
+    parser.onattribute = function (attr) {
+      // an attribute.  attr has "name" and "value"
+    };
+    parser.onend = function () {
+      // parser stream is done, and ready to have more stuff written to it.
+    };
+
+    parser.write('<xml>Hello, <who name="world">world</who>!</xml>').close();
+
+    // stream usage
+    // takes the same options as the parser
+    var saxStream = require("sax").createStream(strict, options)
+    saxStream.on("error", function (e) {
+      // unhandled errors will throw, since this is a proper node
+      // event emitter.
+      console.error("error!", e)
+      // clear the error
+      this._parser.error = null
+      this._parser.resume()
+    })
+    saxStream.on("opentag", function (node) {
+      // same object as above
+    })
+    // pipe is supported, and it's readable/writable
+    // same chunks coming in also go out.
+    fs.createReadStream("file.xml")
+      .pipe(saxStream)
+      .pipe(fs.createReadStream("file-copy.xml"))
+
+
+
+## Arguments
+
+Pass the following arguments to the parser function.  All are optional.
+
+`strict` - Boolean. Whether or not to be a jerk. Default: `false`.
+
+`opt` - Object bag of settings regarding string formatting.  All default to `false`.
+
+Settings supported:
+
+* `trim` - Boolean. Whether or not to trim text and comment nodes.
+* `normalize` - Boolean. If true, then turn any whitespace into a single
+  space.
+* `lowercasetags` - Boolean. If true, then lowercase tags in loose mode, 
+  rather than uppercasing them.
+* `xmlns` - Boolean. If true, then namespaces are supported.
+
+## Methods
+
+`write` - Write bytes onto the stream. You don't have to do this all at
+once. You can keep writing as much as you want.
+
+`close` - Close the stream. Once closed, no more data may be written until
+it is done processing the buffer, which is signaled by the `end` event.
+
+`resume` - To gracefully handle errors, assign a listener to the `error`
+event. Then, when the error is taken care of, you can call `resume` to
+continue parsing. Otherwise, the parser will not continue while in an error
+state.
+
+## Members
+
+At all times, the parser object will have the following members:
+
+`line`, `column`, `position` - Indications of the position in the XML
+document where the parser currently is looking.
+
+`startTagPosition` - Indicates the position where the current tag starts.
+
+`closed` - Boolean indicating whether or not the parser can be written to.
+If it's `true`, then wait for the `ready` event to write again.
+
+`strict` - Boolean indicating whether or not the parser is a jerk.
+
+`opt` - Any options passed into the constructor.
+
+`tag` - The current tag being dealt with.
+
+And a bunch of other stuff that you probably shouldn't touch.
+
+## Events
+
+All events emit with a single argument. To listen to an event, assign a
+function to `on<eventname>`. Functions get executed in the this-context of
+the parser object. The list of supported events are also in the exported
+`EVENTS` array.
+
+When using the stream interface, assign handlers using the EventEmitter
+`on` function in the normal fashion.
+
+`error` - Indication that something bad happened. The error will be hanging
+out on `parser.error`, and must be deleted before parsing can continue. By
+listening to this event, you can keep an eye on that kind of stuff. Note:
+this happens *much* more in strict mode. Argument: instance of `Error`.
+
+`text` - Text node. Argument: string of text.
+
+`doctype` - The `<!DOCTYPE` declaration. Argument: doctype string.
+
+`processinginstruction` - Stuff like `<?xml foo="blerg" ?>`. Argument:
+object with `name` and `body` members. Attributes are not parsed, as
+processing instructions have implementation dependent semantics.
+
+`sgmldeclaration` - Random SGML declarations. Stuff like `<!ENTITY p>`
+would trigger this kind of event. This is a weird thing to support, so it
+might go away at some point. SAX isn't intended to be used to parse SGML,
+after all.
+
+`opentag` - An opening tag. Argument: object with `name` and `attributes`.
+In non-strict mode, tag names are uppercased, unless the `lowercasetags`
+option is set.  If the `xmlns` option is set, then it will contain
+namespace binding information on the `ns` member, and will have a
+`local`, `prefix`, and `uri` member.
+
+`closetag` - A closing tag. In loose mode, tags are auto-closed if their
+parent closes. In strict mode, well-formedness is enforced. Note that
+self-closing tags will have `closeTag` emitted immediately after `openTag`.
+Argument: tag name.
+
+`attribute` - An attribute node.  Argument: object with `name` and `value`,
+and also namespace information if the `xmlns` option flag is set.
+
+`comment` - A comment node.  Argument: the string of the comment.
+
+`opencdata` - The opening tag of a `<![CDATA[` block.
+
+`cdata` - The text of a `<![CDATA[` block. Since `<![CDATA[` blocks can get
+quite large, this event may fire multiple times for a single block, if it
+is broken up into multiple `write()`s. Argument: the string of random
+character data.
+
+`closecdata` - The closing tag (`]]>`) of a `<![CDATA[` block.
+
+`opennamespace` - If the `xmlns` option is set, then this event will
+signal the start of a new namespace binding.
+
+`closenamespace` - If the `xmlns` option is set, then this event will
+signal the end of a namespace binding.
+
+`end` - Indication that the closed stream has ended.
+
+`ready` - Indication that the stream has reset, and is ready to be written
+to.
+
+`noscript` - In non-strict mode, `<script>` tags trigger a `"script"`
+event, and their contents are not checked for special xml characters.
+If you pass `noscript: true`, then this behavior is suppressed.
+
+## Reporting Problems
+
+It's best to write a failing test if you find an issue.  I will always
+accept pull requests with failing tests if they demonstrate intended
+behavior, but it is very hard to figure out what issue you're describing
+without a test.  Writing a test is also the best way for you yourself
+to figure out if you really understand the issue you think you have with
+sax-js.
diff --git a/node_modules/elementtree/node_modules/sax/examples/big-not-pretty.xml b/node_modules/elementtree/node_modules/sax/examples/big-not-pretty.xml
new file mode 100644
index 0000000..fb5265d
--- /dev/null
+++ b/node_modules/elementtree/node_modules/sax/examples/big-not-pretty.xml
@@ -0,0 +1,8002 @@
+<big>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
+</big>
diff --git a/node_modules/elementtree/node_modules/sax/examples/example.js b/node_modules/elementtree/node_modules/sax/examples/example.js
new file mode 100644
index 0000000..e7f81e6
--- /dev/null
+++ b/node_modules/elementtree/node_modules/sax/examples/example.js
@@ -0,0 +1,41 @@
+
+var fs = require("fs"),
+  sys = require("sys"),
+  path = require("path"),
+  xml = fs.cat(path.join(__dirname, "test.xml")),
+  sax = require("../lib/sax"),
+  strict = sax.parser(true),
+  loose = sax.parser(false, {trim:true}),
+  inspector = function (ev) { return function (data) {
+    // sys.error("");
+    // sys.error(ev+": "+sys.inspect(data));
+    // for (var i in data) sys.error(i+ " "+sys.inspect(data[i]));
+    // sys.error(this.line+":"+this.column);
+  }};
+
+xml.addCallback(function (xml) {
+  // strict.write(xml);
+  
+  sax.EVENTS.forEach(function (ev) {
+    loose["on"+ev] = inspector(ev);
+  });
+  loose.onend = function () {
+    // sys.error("end");
+    // sys.error(sys.inspect(loose));
+  };
+  
+  // do this one char at a time to verify that it works.
+  // (function () {
+  //   if (xml) {
+  //     loose.write(xml.substr(0,1000));
+  //     xml = xml.substr(1000);
+  //     process.nextTick(arguments.callee);
+  //   } else loose.close();
+  // })();
+  
+  for (var i = 0; i < 1000; i ++) {
+    loose.write(xml);
+    loose.close();
+  }
+
+});
diff --git a/node_modules/elementtree/node_modules/sax/examples/get-products.js b/node_modules/elementtree/node_modules/sax/examples/get-products.js
new file mode 100644
index 0000000..9e8d74a
--- /dev/null
+++ b/node_modules/elementtree/node_modules/sax/examples/get-products.js
@@ -0,0 +1,58 @@
+// pull out /GeneralSearchResponse/categories/category/items/product tags
+// the rest we don't care about.
+
+var sax = require("../lib/sax.js")
+var fs = require("fs")
+var path = require("path")
+var xmlFile = path.resolve(__dirname, "shopping.xml")
+var util = require("util")
+var http = require("http")
+
+fs.readFile(xmlFile, function (er, d) {
+  http.createServer(function (req, res) {
+    if (er) throw er
+    var xmlstr = d.toString("utf8")
+
+    var parser = sax.parser(true)
+    var products = []
+    var product = null
+    var currentTag = null
+
+    parser.onclosetag = function (tagName) {
+      if (tagName === "product") {
+        products.push(product)
+        currentTag = product = null
+        return
+      }
+      if (currentTag && currentTag.parent) {
+        var p = currentTag.parent
+        delete currentTag.parent
+        currentTag = p
+      }
+    }
+
+    parser.onopentag = function (tag) {
+      if (tag.name !== "product" && !product) return
+      if (tag.name === "product") {
+        product = tag
+      }
+      tag.parent = currentTag
+      tag.children = []
+      tag.parent && tag.parent.children.push(tag)
+      currentTag = tag
+    }
+
+    parser.ontext = function (text) {
+      if (currentTag) currentTag.children.push(text)
+    }
+
+    parser.onend = function () {
+      var out = util.inspect(products, false, 3, true)
+      res.writeHead(200, {"content-type":"application/json"})
+      res.end("{\"ok\":true}")
+      // res.end(JSON.stringify(products))
+    }
+
+    parser.write(xmlstr).end()
+  }).listen(1337)
+})
diff --git a/node_modules/elementtree/node_modules/sax/examples/hello-world.js b/node_modules/elementtree/node_modules/sax/examples/hello-world.js
new file mode 100644
index 0000000..cbfa518
--- /dev/null
+++ b/node_modules/elementtree/node_modules/sax/examples/hello-world.js
@@ -0,0 +1,4 @@
+require("http").createServer(function (req, res) {
+  res.writeHead(200, {"content-type":"application/json"})
+  res.end(JSON.stringify({ok: true}))
+}).listen(1337)
diff --git a/node_modules/elementtree/node_modules/sax/examples/not-pretty.xml b/node_modules/elementtree/node_modules/sax/examples/not-pretty.xml
new file mode 100644
index 0000000..9592852
--- /dev/null
+++ b/node_modules/elementtree/node_modules/sax/examples/not-pretty.xml
@@ -0,0 +1,8 @@
+<root>
+		something<else>  blerm <slurm 
+		
+		
+	attrib = 
+	"blorg"       ></else><!-- COMMENT!
+	
+--><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
diff --git a/node_modules/elementtree/node_modules/sax/examples/pretty-print.js b/node_modules/elementtree/node_modules/sax/examples/pretty-print.js
new file mode 100644
index 0000000..cd6aca9
--- /dev/null
+++ b/node_modules/elementtree/node_modules/sax/examples/pretty-print.js
@@ -0,0 +1,74 @@
+var sax = require("../lib/sax")
+  , printer = sax.createStream(false, {lowercasetags:true, trim:true})
+  , fs = require("fs")
+
+function entity (str) {
+  return str.replace('"', '&quot;')
+}
+
+printer.tabstop = 2
+printer.level = 0
+printer.indent = function () {
+  print("\n")
+  for (var i = this.level; i > 0; i --) {
+    for (var j = this.tabstop; j > 0; j --) {
+      print(" ")
+    }
+  }
+}
+printer.on("opentag", function (tag) {
+  this.indent()
+  this.level ++
+  print("<"+tag.name)
+  for (var i in tag.attributes) {
+    print(" "+i+"=\""+entity(tag.attributes[i])+"\"")
+  }
+  print(">")
+})
+
+printer.on("text", ontext)
+printer.on("doctype", ontext)
+function ontext (text) {
+  this.indent()
+  print(text)
+}
+
+printer.on("closetag", function (tag) {
+  this.level --
+  this.indent()
+  print("</"+tag+">")
+})
+
+printer.on("cdata", function (data) {
+  this.indent()
+  print("<![CDATA["+data+"]]>")
+})
+
+printer.on("comment", function (comment) {
+  this.indent()
+  print("<!--"+comment+"-->")
+})
+
+printer.on("error", function (error) {
+  console.error(error)
+  throw error
+})
+
+if (!process.argv[2]) {
+  throw new Error("Please provide an xml file to prettify\n"+
+    "TODO: read from stdin or take a file")
+}
+var xmlfile = require("path").join(process.cwd(), process.argv[2])
+var fstr = fs.createReadStream(xmlfile, { encoding: "utf8" })
+
+function print (c) {
+  if (!process.stdout.write(c)) {
+    fstr.pause()
+  }
+}
+
+process.stdout.on("drain", function () {
+  fstr.resume()
+})
+
+fstr.pipe(printer)
diff --git a/node_modules/elementtree/node_modules/sax/examples/shopping.xml b/node_modules/elementtree/node_modules/sax/examples/shopping.xml
new file mode 100644
index 0000000..223c6c6
--- /dev/null
+++ b/node_modules/elementtree/node_modules/sax/examples/shopping.xml
@@ -0,0 +1,2 @@
+
+<GeneralSearchResponse xmlns="urn:types.partner.api.shopping.com"><serverDetail><apiEnv>sandbox</apiEnv><apiVersion>3.1 r31.Kadu4DC.phase3</apiVersion><buildNumber>5778</buildNumber><buildTimestamp>2011.10.06 15:37:23 PST</buildTimestamp><requestId>p2.a121bc2aaf029435dce6</requestId><timestamp>2011-10-21T18:38:45.982-04:00</timestamp><responseTime>P0Y0M0DT0H0M0.169S</responseTime></serverDetail><exceptions exceptionCount="1"><exception type="warning"><code>1112</code><message>You are currently using the SDC API sandbox environment!  No clicks to merchant URLs from this response will be paid.  Please change the host of your API requests to 'publisher.api.shopping.com' when you have finished development and testing</message></exception></exceptions><clientTracking height="19" type="logo" width="106"><sourceURL>http://statTest.dealtime.com/pixel/noscript?PV_EvnTyp=APPV&amp;APPV_APITSP=10%2F21%2F11_06%3A38%3A45_PM&amp;APPV_DSPRQSID=p2.a121bc2aaf029435dce6&amp;APPV_IMGURL=http://img.shopping.com/sc/glb/sdc_logo_106x19.gif&amp;APPV_LI_LNKINID=7000610&amp;APPV_LI_SBMKYW=nikon&amp;APPV_MTCTYP=1000&amp;APPV_PRTID=2002&amp;APPV_BrnID=14804</sourceURL><hrefURL>http://www.shopping.com/digital-cameras/products</hrefURL><titleText>Digital Cameras</titleText><altText>Digital Cameras</altText></clientTracking><searchHistory><categorySelection id="3"><name>Electronics</name><categoryURL>http://www.shopping.com/xCH-electronics-nikon~linkin_id-7000610?oq=nikon</categoryURL></categorySelection><categorySelection id="449"><name>Cameras and Photography</name><categoryURL>http://www.shopping.com/xCH-cameras_and_photography-nikon~linkin_id-7000610?oq=nikon</categoryURL></categorySelection><categorySelection id="7185"><name>Digital Cameras</name><categoryURL>http://www.shopping.com/digital-cameras/nikon/products?oq=nikon&amp;linkin_id=7000610</categoryURL></categorySelection><dynamicNavigationHistory><keywordSearch dropped="false" modified="false"><originalKeyword>nikon</originalKeyword><resultKeyword>nikon</resultKeyword></keywordSearch></dynamicNavigationHistory></searchHistory><categories matchedCategoryCount="1" returnedCategoryCount="1"><category id="7185"><name>Digital Cameras</name><categoryURL>http://www.shopping.com/digital-cameras/nikon/products?oq=nikon&amp;linkin_id=7000610</categoryURL><items matchedItemCount="322" pageNumber="1" returnedItemCount="5"><product id="101677489"><name>Nikon D3100 Digital Camera</name><shortDescription>14.2 Megapixel, SLR Camera, 3 in. LCD Screen, With High Definition Video, Weight: 1 lb.</shortDescription><fullDescription>The Nikon D3100 digital SLR camera speaks to the growing ranks of enthusiastic D-SLR users and aspiring photographers by providing an easy-to-use and affordable entrance to the world of Nikon D-SLR’s. The 14.2-megapixel D3100 has powerful features, such as the enhanced Guide Mode that makes it easy to unleash creative potential and capture memories with still images and full HD video. Like having a personal photo tutor at your fingertips, this unique feature provides a simple graphical interface on the camera’s LCD that guides users by suggesting and/or adjusting camera settings to achieve the desired end result images. The D3100 is also the world’s first D-SLR to introduce full time auto focus (AF) in Live View and D-Movie mode to effortlessly achieve the critical focus needed when shooting Full HD 1080p video.</fullDescription><images><image available="true" height="100" width="100"><sourceURL>http://di1.shopping.com/images/pi/93/bc/04/101677489-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di1.shopping.com/images/pi/93/bc/04/101677489-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di1.shopping.com/images/pi/93/bc/04/101677489-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="400" width="400"><sourceURL>http://di1.shopping.com/images/pi/93/bc/04/101677489-400x400-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="500" width="606"><sourceURL>http://di1.shopping.com/images/pi/93/bc/04/101677489-606x500-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image></images><rating><reviewCount>9</reviewCount><rating>4.56</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/pr/sdc_stars_sm_4.5.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/Nikon-D3100/reviews~linkin_id-7000610</reviewURL></rating><minPrice>429.00</minPrice><maxPrice>1360.00</maxPrice><productOffersURL>http://www.shopping.com/Nikon-D3100/prices~linkin_id-7000610</productOffersURL><productSpecsURL>http://www.shopping.com/Nikon-D3100/info~linkin_id-7000610</productSpecsURL><offers matchedOfferCount="64" pageNumber="1" returnedOfferCount="5"><offer featured="false" id="-ZW6BMZqz6fbS-aULwga_g==" smartBuy="false" used="false"><name>Nikon D3100 Digital SLR Camera with 18-55mm NIKKOR VR Lens</name><description>The Nikon D3100 Digital SLR Camera is an affordable  compact  and lightweight photographic power-house. It features the all-purpose 18-55mm VR lens  a high-resolution 14.2 MP CMOS sensor along with a feature set that's comprehensive yet easy to navigate - the intuitive onboard learn-as-you grow guide mode allows the photographer to understand what the 3100 can do quickly and easily. Capture beautiful pictures and amazing Full HD 1080p movies with sound and full-time autofocus.  Availabilty: In Stock!</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di102.shopping.com/images/di/2d/5a/57/36424d5a717a366662532d61554c7767615f67-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di102.shopping.com/images/di/2d/5a/57/36424d5a717a366662532d61554c7767615f67-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di102.shopping.com/images/di/2d/5a/57/36424d5a717a366662532d61554c7767615f67-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="false" height="400" width="400"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="350" width="350"><sourceURL>http://di102.shopping.com/images/di/2d/5a/57/36424d5a717a366662532d61554c7767615f67-350x350-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><storeNotes>Free Shipping with Any Purchase!</storeNotes><basePrice currency="USD">529.00</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">0.00</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">799.00</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=647&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=475674&amp;crawler_id=475674&amp;dealId=-ZW6BMZqz6fbS-aULwga_g%3D%3D&amp;url=http%3A%2F%2Fwww.fumfie.com%2Fproduct%2F343.5%2Fshopping-com%3F&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=Nikon+D3100+Digital+SLR+Camera+with+18-55mm+NIKKOR+VR+Lens&amp;dlprc=529.0&amp;crn=&amp;istrsmrc=1&amp;isathrsl=0&amp;AR=1&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=101677489&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=1&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=1&amp;SL=1&amp;FS=1&amp;code=&amp;acode=658&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="475674" trusted="true"><name>FumFie</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/475674.gif</sourceURL></logo><phoneNumber>866 666 9198</phoneNumber><ratingInfo><reviewCount>560</reviewCount><rating>4.27</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/mr/sdc_checks_45.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/xMR-store_fumfie~MRD-475674~S-1~linkin_id-7000610</reviewURL></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>F343C5</sku></offer><offer featured="false" id="md1e9lD8vdOu4FHQfJqKng==" smartBuy="false" used="false"><name>Nikon Nikon D3100 14.2MP Digital SLR Camera with 18-55mm f/3.5-5.6 AF-S DX VR, Cameras</name><description>Nikon D3100 14.2MP Digital SLR Camera with 18-55mm f/3.5-5.6 AF-S DX VR</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di109.shopping.com/images/di/6d/64/31/65396c443876644f7534464851664a714b6e67-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di109.shopping.com/images/di/6d/64/31/65396c443876644f7534464851664a714b6e67-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di109.shopping.com/images/di/6d/64/31/65396c443876644f7534464851664a714b6e67-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="false" height="400" width="400"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="true" height="352" width="385"><sourceURL>http://di109.shopping.com/images/di/6d/64/31/65396c443876644f7534464851664a714b6e67-385x352-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><basePrice currency="USD">549.00</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">0.00</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">549.00</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=779&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=305814&amp;crawler_id=305814&amp;dealId=md1e9lD8vdOu4FHQfJqKng%3D%3D&amp;url=http%3A%2F%2Fwww.electronics-expo.com%2Findex.php%3Fpage%3Ditem%26id%3DNIKD3100%26source%3DSideCar%26scpid%3D8%26scid%3Dscsho318727%26&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=Nikon+Nikon+D3100+14.2MP+Digital+SLR+Camera+with+18-55mm+f%2F3.5-5.6+AF-S+DX+VR%2C+Cameras&amp;dlprc=549.0&amp;crn=&amp;istrsmrc=1&amp;isathrsl=0&amp;AR=9&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=101677489&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=9&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=0&amp;FS=1&amp;code=&amp;acode=771&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="305814" trusted="true"><name>Electronics Expo</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/305814.gif</sourceURL></logo><phoneNumber>1-888-707-EXPO</phoneNumber><ratingInfo><reviewCount>371</reviewCount><rating>3.90</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/mr/sdc_checks_4.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/xMR-store_electronics_expo~MRD-305814~S-1~linkin_id-7000610</reviewURL></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>NIKD3100</sku></offer><offer featured="false" id="yYuaXnDFtCY7rDUjkY2aaw==" smartBuy="false" used="false"><name>Nikon D3100 14.2-Megapixel Digital SLR Camera With 18-55mm Zoom-Nikkor Lens, Black</name><description>Split-second shutter response captures shots other cameras may have missed Helps eliminate the frustration of shutter delay! 14.2-megapixels for enlargements worth framing and hanging. Takes breathtaking 1080p HD movies. ISO sensitivity from 100-1600 for bright or dimly lit settings. 3.0in. color LCD for beautiful, wide-angle framing and viewing. In-camera image editing lets you retouch with no PC. Automatic scene modes include Child, Sports, Night Portrait and more. Accepts SDHC memory cards. Nikon D3100 14.2-Megapixel Digital SLR Camera With 18-55mm Zoom-Nikkor Lens, Black is one of many Digital SLR Cameras available through Office Depot. Made by Nikon.</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di109.shopping.com/images/di/79/59/75/61586e4446744359377244556a6b5932616177-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di109.shopping.com/images/di/79/59/75/61586e4446744359377244556a6b5932616177-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="false" height="300" width="300"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="false" height="400" width="400"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="true" height="250" width="250"><sourceURL>http://di109.shopping.com/images/di/79/59/75/61586e4446744359377244556a6b5932616177-250x250-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><basePrice currency="USD">549.99</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">0.00</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">699.99</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=698&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=467671&amp;crawler_id=467671&amp;dealId=yYuaXnDFtCY7rDUjkY2aaw%3D%3D&amp;url=http%3A%2F%2Flink.mercent.com%2Fredirect.ashx%3Fmr%3AmerchantID%3DOfficeDepot%26mr%3AtrackingCode%3DCEC9669E-6ABC-E011-9F24-0019B9C043EB%26mr%3AtargetUrl%3Dhttp%3A%2F%2Fwww.officedepot.com%2Fa%2Fproducts%2F486292%2FNikon-D3100-142-Megapixel-Digital-SLR%2F%253fcm_mmc%253dMercent-_-Shopping-_-Cameras_and_Camcorders-_-486292&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=Nikon+D3100+14.2-Megapixel+Digital+SLR+Camera+With+18-55mm+Zoom-Nikkor+Lens%2C+Black&amp;dlprc=549.99&amp;crn=&amp;istrsmrc=1&amp;isathrsl=0&amp;AR=10&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=101677489&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=10&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=1&amp;SL=1&amp;FS=1&amp;code=&amp;acode=690&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="467671" trusted="true"><name>Office Depot</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/467671.gif</sourceURL></logo><phoneNumber>1-800-GO-DEPOT</phoneNumber><ratingInfo><reviewCount>135</reviewCount><rating>2.37</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/mr/sdc_checks_25.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/xMR-store_office_depot_4158555~MRD-467671~S-1~linkin_id-7000610</reviewURL></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>486292</sku></offer><offer featured="false" id="Rl56U7CuiTYsH4MGZ02lxQ==" smartBuy="false" used="false"><name>Nikon® D3100™ 14.2MP Digital SLR with 18-55mm Lens</name><description>The Nikon D3100 DSLR will surprise you with its simplicity and impress you with superb results.</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di103.shopping.com/images/di/52/6c/35/36553743756954597348344d475a30326c7851-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di103.shopping.com/images/di/52/6c/35/36553743756954597348344d475a30326c7851-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="false" height="300" width="300"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="false" height="400" width="400"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="true" height="220" width="220"><sourceURL>http://di103.shopping.com/images/di/52/6c/35/36553743756954597348344d475a30326c7851-220x220-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><basePrice currency="USD">549.99</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">6.05</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">549.99</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=504&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=332477&amp;crawler_id=332477&amp;dealId=Rl56U7CuiTYsH4MGZ02lxQ%3D%3D&amp;url=http%3A%2F%2Ftracking.searchmarketing.com%2Fgsic.asp%3Faid%3D903483107%26&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=Nikon%C2%AE+D3100%E2%84%A2+14.2MP+Digital+SLR+with+18-55mm+Lens&amp;dlprc=549.99&amp;crn=&amp;istrsmrc=0&amp;isathrsl=0&amp;AR=11&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=101677489&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=11&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=0&amp;FS=0&amp;code=&amp;acode=496&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="332477" trusted="false"><name>RadioShack</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/332477.gif</sourceURL></logo><ratingInfo><reviewCount>24</reviewCount><rating>2.25</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/mr/sdc_checks_25.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/xMR-store_radioshack_9689~MRD-332477~S-1~linkin_id-7000610</reviewURL></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>9614867</sku></offer><offer featured="false" id="huS6xZKDKaKMTMP71eI6DA==" smartBuy="false" used="false"><name>Nikon D3100 SLR w/Nikon 18-55mm VR &amp; 55-200mm VR Lenses</name><description>14.2 Megapixels3" LCDLive ViewHD 1080p Video w/ Sound &amp; Autofocus11-point Autofocus3 Frames per Second ShootingISO 100 to 3200 (Expand to 12800-Hi2)Self Cleaning SensorEXPEED 2, Image Processing EngineScene Recognition System</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di105.shopping.com/images/di/68/75/53/36785a4b444b614b4d544d5037316549364441-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di105.shopping.com/images/di/68/75/53/36785a4b444b614b4d544d5037316549364441-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di105.shopping.com/images/di/68/75/53/36785a4b444b614b4d544d5037316549364441-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="false" height="400" width="400"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="true" height="345" width="345"><sourceURL>http://di105.shopping.com/images/di/68/75/53/36785a4b444b614b4d544d5037316549364441-345x345-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><basePrice currency="USD">695.00</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">0.00</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">695.00</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=371&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=487342&amp;crawler_id=487342&amp;dealId=huS6xZKDKaKMTMP71eI6DA%3D%3D&amp;url=http%3A%2F%2Fwww.rythercamera.com%2Fcatalog%2Fproduct_info.php%3Fcsv%3Dsh%26products_id%3D32983%26&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=Nikon+D3100+SLR+w%2FNikon+18-55mm+VR+%26+55-200mm+VR+Lenses&amp;dlprc=695.0&amp;crn=&amp;istrsmrc=0&amp;isathrsl=0&amp;AR=15&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=101677489&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=15&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=0&amp;FS=1&amp;code=&amp;acode=379&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="487342" trusted="false"><name>RytherCamera.com</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/487342.gif</sourceURL></logo><phoneNumber>1-877-644-7593</phoneNumber><ratingInfo><reviewCount>0</reviewCount></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>32983</sku></offer></offers></product><product id="95397883"><name>Nikon COOLPIX S203 Digital Camera</name><shortDescription>10 Megapixel, Ultra-Compact Camera, 2.5 in. LCD Screen, 3x Optical Zoom, With Video Capability, Weight: 0.23 lb.</shortDescription><fullDescription>With 10.34 mega pixel, electronic VR vibration reduction, 5-level brightness adjustment, 3x optical zoom, and TFT LCD, Nikon Coolpix s203 fulfills all the demands of any photographer. The digital camera has an inbuilt memory of 44MB and an external memory slot made for all kinds of SD (Secure Digital) cards.</fullDescription><images><image available="true" height="100" width="100"><sourceURL>http://di1.shopping.com/images/pi/c4/ef/1b/95397883-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di1.shopping.com/images/pi/c4/ef/1b/95397883-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di1.shopping.com/images/pi/c4/ef/1b/95397883-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="true" height="400" width="400"><sourceURL>http://di1.shopping.com/images/pi/c4/ef/1b/95397883-400x400-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="true" height="499" width="500"><sourceURL>http://di1.shopping.com/images/pi/c4/ef/1b/95397883-500x499-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image></images><rating><reviewCount>0</reviewCount></rating><minPrice>139.00</minPrice><maxPrice>139.00</maxPrice><productOffersURL>http://www.shopping.com/Nikon-Coolpix-S203/prices~linkin_id-7000610</productOffersURL><productSpecsURL>http://www.shopping.com/Nikon-Coolpix-S203/info~linkin_id-7000610</productSpecsURL><offers matchedOfferCount="1" pageNumber="1" returnedOfferCount="1"><offer featured="false" id="sBd2JnIEPM-A_lBAM1RZgQ==" smartBuy="false" used="false"><name>Nikon Coolpix S203 Digital Camera (Red)</name><description>With 10.34 mega pixel, electronic VR vibration reduction, 5-level brightness adjustment, 3x optical zoom, and TFT LCD, Nikon Coolpix s203 fulfills all the demands of any photographer. The digital camera has an inbuilt memory of 44MB and an external memory slot made for all kinds of SD (Secure Digital) cards.</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di108.shopping.com/images/di/73/42/64/324a6e4945504d2d415f6c42414d31525a6751-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di108.shopping.com/images/di/73/42/64/324a6e4945504d2d415f6c42414d31525a6751-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di108.shopping.com/images/di/73/42/64/324a6e4945504d2d415f6c42414d31525a6751-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="400" width="400"><sourceURL>http://di108.shopping.com/images/di/73/42/64/324a6e4945504d2d415f6c42414d31525a6751-400x400-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="500" width="500"><sourceURL>http://di108.shopping.com/images/di/73/42/64/324a6e4945504d2d415f6c42414d31525a6751-500x500-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><storeNotes>Fantastic prices with ease &amp; comfort of Amazon.com!</storeNotes><basePrice currency="USD">139.00</basePrice><shippingCost currency="USD">9.50</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">139.00</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=566&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=301531&amp;crawler_id=1903313&amp;dealId=sBd2JnIEPM-A_lBAM1RZgQ%3D%3D&amp;url=http%3A%2F%2Fwww.amazon.com%2Fdp%2FB002T964IM%2Fref%3Dasc_df_B002T964IM1751618%3Fsmid%3DA22UHVNXG98FAT%26tag%3Ddealtime-ce-mp01feed-20%26linkCode%3Dasn%26creative%3D395105%26creativeASIN%3DB002T964IM&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=Nikon+Coolpix+S203+Digital+Camera+%28Red%29&amp;dlprc=139.0&amp;crn=&amp;istrsmrc=0&amp;isathrsl=0&amp;AR=63&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=95397883&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=63&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=0&amp;FS=0&amp;code=&amp;acode=518&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="301531" trusted="false"><name>Amazon Marketplace</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/301531.gif</sourceURL></logo><ratingInfo><reviewCount>213</reviewCount><rating>2.73</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/mr/sdc_checks_25.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/xMR-store_amazon_marketplace_9689~MRD-301531~S-1~linkin_id-7000610</reviewURL></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>B002T964IM</sku></offer></offers></product><product id="106834268"><name>Nikon S3100 Digital Camera</name><shortDescription>14.5 Megapixel, Compact Camera, 2.7 in. LCD Screen, 5x Optical Zoom, With High Definition Video, Weight: 0.23 lb.</shortDescription><fullDescription>This digital camera features a wide-angle optical Zoom-NIKKOR glass lens that allows you to capture anything from landscapes to portraits to action shots. The high-definition movie mode with one-touch recording makes it easy to capture video clips.</fullDescription><images><image available="true" height="100" width="100"><sourceURL>http://di1.shopping.com/images/pi/66/2d/33/106834268-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di1.shopping.com/images/pi/66/2d/33/106834268-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di1.shopping.com/images/pi/66/2d/33/106834268-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="true" height="400" width="400"><sourceURL>http://di1.shopping.com/images/pi/66/2d/33/106834268-400x400-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="true" height="387" width="507"><sourceURL>http://di1.shopping.com/images/pi/66/2d/33/106834268-507x387-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image></images><rating><reviewCount>1</reviewCount><rating>2.00</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/pr/sdc_stars_sm_2.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/nikon-s3100/reviews~linkin_id-7000610</reviewURL></rating><minPrice>99.95</minPrice><maxPrice>134.95</maxPrice><productOffersURL>http://www.shopping.com/nikon-s3100/prices~linkin_id-7000610</productOffersURL><productSpecsURL>http://www.shopping.com/nikon-s3100/info~linkin_id-7000610</productSpecsURL><offers matchedOfferCount="67" pageNumber="1" returnedOfferCount="5"><offer featured="false" id="UUyGoqV8r0-xrkn-rnGNbg==" smartBuy="false" used="false"><name>CoolPix S3100 14 Megapixel Compact Digital Camera- Red</name><description>Nikon Coolpix S3100 - Digital camera - compact - 14.0 Mpix - optical zoom: 5 x - supported memory: SD, SDXC, SDHC - red</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di111.shopping.com/images/di/55/55/79/476f71563872302d78726b6e2d726e474e6267-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di111.shopping.com/images/di/55/55/79/476f71563872302d78726b6e2d726e474e6267-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di111.shopping.com/images/di/55/55/79/476f71563872302d78726b6e2d726e474e6267-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="400" width="400"><sourceURL>http://di111.shopping.com/images/di/55/55/79/476f71563872302d78726b6e2d726e474e6267-400x400-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><storeNotes>Get 30 days FREE SHIPPING w/ ShipVantage</storeNotes><basePrice currency="USD">119.95</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">6.95</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">139.95</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=578&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=485615&amp;crawler_id=485615&amp;dealId=UUyGoqV8r0-xrkn-rnGNbg%3D%3D&amp;url=http%3A%2F%2Fsears.rdr.channelintelligence.com%2Fgo.asp%3FfVhzOGNRAAQIASNiE1NbQBJpFHJ3Yx0CTAICI2BbH1lEFmgKP3QvUVpEREdlfUAUHAQPLVpFTVdtJzxAHUNYW3AhQBM0QhFvEXAbYh8EAAVmDAJeU1oyGG0GcBdhGwUGCAVqYF9SO0xSN1sZdmA7dmMdBQAJB24qX1NbQxI6AjA2ME5dVFULPDsGPFcQTTdaLTA6SR0OFlQvPAwMDxYcYlxIVkcoLTcCDA%3D%3D%26nAID%3D13736960%26&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=CoolPix+S3100+14+Megapixel+Compact+Digital+Camera-+Red&amp;dlprc=119.95&amp;crn=&amp;istrsmrc=1&amp;isathrsl=0&amp;AR=28&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=106834268&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=28&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=1&amp;FS=0&amp;code=&amp;acode=583&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="485615" trusted="true"><name>Sears</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/485615.gif</sourceURL></logo><phoneNumber>1-800-349-4358</phoneNumber><ratingInfo><reviewCount>888</reviewCount><rating>2.85</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/mr/sdc_checks_3.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/xMR-store_sears_4189479~MRD-485615~S-1~linkin_id-7000610</reviewURL></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>00337013000</sku></offer><offer featured="false" id="X87AwXlW1dXoMXk4QQDToQ==" smartBuy="false" used="false"><name>COOLPIX S3100 Pink</name><description>Nikon Coolpix S3100 - Digital camera - compact - 14.0 Mpix - optical zoom: 5 x - supported memory: SD, SDXC, SDHC - pink</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di111.shopping.com/images/di/58/38/37/4177586c573164586f4d586b34515144546f51-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di111.shopping.com/images/di/58/38/37/4177586c573164586f4d586b34515144546f51-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di111.shopping.com/images/di/58/38/37/4177586c573164586f4d586b34515144546f51-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="true" height="400" width="400"><sourceURL>http://di111.shopping.com/images/di/58/38/37/4177586c573164586f4d586b34515144546f51-400x400-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><storeNotes>Get 30 days FREE SHIPPING w/ ShipVantage</storeNotes><basePrice currency="USD">119.95</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">6.95</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">139.95</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=578&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=485615&amp;crawler_id=485615&amp;dealId=X87AwXlW1dXoMXk4QQDToQ%3D%3D&amp;url=http%3A%2F%2Fsears.rdr.channelintelligence.com%2Fgo.asp%3FfVhzOGNRAAQIASNiE1NbQBJpFHJxYx0CTAICI2BbH1lEFmgKP3QvUVpEREdlfUAUHAQPLVpFTVdtJzxAHUNYW3AhQBM0QhFvEXAbYh8EAAVmb2JcUFxDEGsPc3QDEkFZVQ0WFhdRW0MWbgYWDlxzdGMdAVQWRi0xDAwPFhw9TSobb05eWVVYKzsLTFVVQi5RICs3SA8MU1s2MQQKD1wf%26nAID%3D13736960%26&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=COOLPIX+S3100+Pink&amp;dlprc=119.95&amp;crn=&amp;istrsmrc=1&amp;isathrsl=0&amp;AR=31&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=106834268&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=31&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=1&amp;FS=0&amp;code=&amp;acode=583&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="485615" trusted="true"><name>Sears</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/485615.gif</sourceURL></logo><phoneNumber>1-800-349-4358</phoneNumber><ratingInfo><reviewCount>888</reviewCount><rating>2.85</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/mr/sdc_checks_3.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/xMR-store_sears_4189479~MRD-485615~S-1~linkin_id-7000610</reviewURL></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>00337015000</sku></offer><offer featured="false" id="nvFwnpfA4rlA1Dbksdsa0w==" smartBuy="false" used="false"><name>Nikon Coolpix S3100 14.0 MP Digital Camera - Silver</name><description>Nikon Coolpix S3100 14.0 MP Digital Camera - Silver</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di109.shopping.com/images/di/6e/76/46/776e70664134726c413144626b736473613077-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di109.shopping.com/images/di/6e/76/46/776e70664134726c413144626b736473613077-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="false" height="300" width="300"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="false" height="400" width="400"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="true" height="270" width="270"><sourceURL>http://di109.shopping.com/images/di/6e/76/46/776e70664134726c413144626b736473613077-270x270-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><basePrice currency="USD">109.97</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">0.00</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">109.97</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=803&amp;BEFID=7185&amp;aon=%5E&amp;MerchantID=475774&amp;crawler_id=475774&amp;dealId=nvFwnpfA4rlA1Dbksdsa0w%3D%3D&amp;url=http%3A%2F%2Fwww.thewiz.com%2Fcatalog%2Fproduct.jsp%3FmodelNo%3DS3100SILVER%26gdftrk%3DgdfV2677_a_7c996_a_7c4049_a_7c26262&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=Nikon+Coolpix+S3100+14.0+MP+Digital+Camera+-+Silver&amp;dlprc=109.97&amp;crn=&amp;istrsmrc=0&amp;isathrsl=0&amp;AR=33&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=106834268&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=33&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=0&amp;FS=1&amp;code=&amp;acode=797&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="475774" trusted="false"><name>TheWiz.com</name><logo available="false" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/475774.gif</sourceURL></logo><phoneNumber>877-542-6988</phoneNumber><ratingInfo><reviewCount>0</reviewCount></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>26262</sku></offer><offer featured="false" id="5GtaN2NeryKwps-Se2l-4g==" smartBuy="false" used="false"><name>Nikon� COOLPIX� S3100 14MP Digital Camera (Silver)</name><description>The Nikon COOLPIX S3100 is the easy way to share your life and stay connected.</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di102.shopping.com/images/di/35/47/74/614e324e6572794b7770732d5365326c2d3467-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di102.shopping.com/images/di/35/47/74/614e324e6572794b7770732d5365326c2d3467-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="false" height="300" width="300"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="false" height="400" width="400"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="true" height="220" width="220"><sourceURL>http://di102.shopping.com/images/di/35/47/74/614e324e6572794b7770732d5365326c2d3467-220x220-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><basePrice currency="USD">119.99</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">6.05</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">119.99</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=504&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=332477&amp;crawler_id=332477&amp;dealId=5GtaN2NeryKwps-Se2l-4g%3D%3D&amp;url=http%3A%2F%2Ftracking.searchmarketing.com%2Fgsic.asp%3Faid%3D848064082%26&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=Nikon%C3%AF%C2%BF%C2%BD+COOLPIX%C3%AF%C2%BF%C2%BD+S3100+14MP+Digital+Camera+%28Silver%29&amp;dlprc=119.99&amp;crn=&amp;istrsmrc=0&amp;isathrsl=0&amp;AR=37&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=106834268&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=37&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=0&amp;FS=0&amp;code=&amp;acode=509&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="332477" trusted="false"><name>RadioShack</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/332477.gif</sourceURL></logo><ratingInfo><reviewCount>24</reviewCount><rating>2.25</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/mr/sdc_checks_25.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/xMR-store_radioshack_9689~MRD-332477~S-1~linkin_id-7000610</reviewURL></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>10101095</sku></offer><offer featured="false" id="a43m0RXulX38zCnQjU59jw==" smartBuy="false" used="false"><name>COOLPIX S3100 Yellow</name><description>Nikon Coolpix S3100 - Digital camera - compact - 14.0 Mpix - optical zoom: 5 x - supported memory: SD, SDXC, SDHC - yellow</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di107.shopping.com/images/di/61/34/33/6d305258756c5833387a436e516a5535396a77-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di107.shopping.com/images/di/61/34/33/6d305258756c5833387a436e516a5535396a77-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di107.shopping.com/images/di/61/34/33/6d305258756c5833387a436e516a5535396a77-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="true" height="400" width="400"><sourceURL>http://di107.shopping.com/images/di/61/34/33/6d305258756c5833387a436e516a5535396a77-400x400-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><storeNotes>Get 30 days FREE SHIPPING w/ ShipVantage</storeNotes><basePrice currency="USD">119.95</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">6.95</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">139.95</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=578&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=485615&amp;crawler_id=485615&amp;dealId=a43m0RXulX38zCnQjU59jw%3D%3D&amp;url=http%3A%2F%2Fsears.rdr.channelintelligence.com%2Fgo.asp%3FfVhzOGNRAAQIASNiE1NbQBJpFHJwYx0CTAICI2BbH1lEFmgKP3QvUVpEREdlfUAUHAQPLVpFTVdtJzxAHUNYW3AhQBM0QhFvEXAbYh8EAAVmb2JcUFxDEGoPc3QDEkFZVQ0WFhdRW0MWbgYWDlxzdGMdAVQWRi0xDAwPFhw9TSobb05eWVVYKzsLTFVVQi5RICs3SA8MU1s2MQQKD1wf%26nAID%3D13736960%26&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=COOLPIX+S3100+Yellow&amp;dlprc=119.95&amp;crn=&amp;istrsmrc=1&amp;isathrsl=0&amp;AR=38&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=106834268&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=38&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=1&amp;FS=0&amp;code=&amp;acode=583&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="485615" trusted="true"><name>Sears</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/485615.gif</sourceURL></logo><phoneNumber>1-800-349-4358</phoneNumber><ratingInfo><reviewCount>888</reviewCount><rating>2.85</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/mr/sdc_checks_3.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/xMR-store_sears_4189479~MRD-485615~S-1~linkin_id-7000610</reviewURL></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>00337014000</sku></offer></offers></product><product id="99671132"><name>Nikon D90 Digital Camera</name><shortDescription>12.3 Megapixel, Point and Shoot Camera, 3 in. LCD Screen, With Video Capability, Weight: 1.36 lb.</shortDescription><fullDescription>Untitled Document Nikon D90 SLR Digital Camera With 28-80mm 75-300mm Lens Kit The Nikon D90 SLR Digital Camera, with its 12.3-megapixel DX-format CMOS, 3" High resolution LCD display, Scene Recognition System, Picture Control, Active D-Lighting, and one-button Live View, provides photo enthusiasts with the image quality and performance they need to pursue their own vision while still being intuitive enough for use as an everyday camera.</fullDescription><images><image available="true" height="100" width="100"><sourceURL>http://di1.shopping.com/images/pi/52/fb/d3/99671132-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di1.shopping.com/images/pi/52/fb/d3/99671132-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di1.shopping.com/images/pi/52/fb/d3/99671132-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="true" height="400" width="400"><sourceURL>http://di1.shopping.com/images/pi/52/fb/d3/99671132-400x400-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="true" height="255" width="499"><sourceURL>http://di1.shopping.com/images/pi/52/fb/d3/99671132-499x255-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image></images><rating><reviewCount>7</reviewCount><rating>5.00</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/pr/sdc_stars_sm_5.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/Nikon-D90-with-18-270mm-Lens/reviews~linkin_id-7000610</reviewURL></rating><minPrice>689.00</minPrice><maxPrice>2299.00</maxPrice><productOffersURL>http://www.shopping.com/Nikon-D90-with-18-270mm-Lens/prices~linkin_id-7000610</productOffersURL><productSpecsURL>http://www.shopping.com/Nikon-D90-with-18-270mm-Lens/info~linkin_id-7000610</productSpecsURL><offers matchedOfferCount="43" pageNumber="1" returnedOfferCount="5"><offer featured="false" id="GU5JJkpUAxe5HujB7fkwAA==" smartBuy="false" used="false"><name>Nikon® D90 12.3MP Digital SLR Camera (Body Only)</name><description>The Nikon D90 will make you rethink what a digital SLR camera can achieve.</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di106.shopping.com/images/di/47/55/35/4a4a6b70554178653548756a4237666b774141-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di106.shopping.com/images/di/47/55/35/4a4a6b70554178653548756a4237666b774141-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="false" height="300" width="300"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="false" height="400" width="400"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="220" width="220"><sourceURL>http://di106.shopping.com/images/di/47/55/35/4a4a6b70554178653548756a4237666b774141-220x220-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><basePrice currency="USD">1015.99</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">6.05</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">1015.99</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=504&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=332477&amp;crawler_id=332477&amp;dealId=GU5JJkpUAxe5HujB7fkwAA%3D%3D&amp;url=http%3A%2F%2Ftracking.searchmarketing.com%2Fgsic.asp%3Faid%3D851830266%26&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=Nikon%C2%AE+D90+12.3MP+Digital+SLR+Camera+%28Body+Only%29&amp;dlprc=1015.99&amp;crn=&amp;istrsmrc=0&amp;isathrsl=0&amp;AR=14&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=99671132&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=14&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=0&amp;FS=0&amp;code=&amp;acode=496&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="332477" trusted="false"><name>RadioShack</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/332477.gif</sourceURL></logo><ratingInfo><reviewCount>24</reviewCount><rating>2.25</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/mr/sdc_checks_25.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/xMR-store_radioshack_9689~MRD-332477~S-1~linkin_id-7000610</reviewURL></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>10148659</sku></offer><offer featured="false" id="XhURuSC-spBbTIDfo4qfzQ==" smartBuy="false" used="false"><name>Nikon D90 SLR Digital Camera (Camera Body)</name><description>The Nikon D90 SLR Digital Camera  with its 12.3-megapixel DX-format CCD  3" High resolution LCD display  Scene Recognition System  Picture Control  Active D-Lighting  and one-button Live View  provides photo enthusiasts with the image quality and performance they need to pursue their own vision while still being intuitive enough for use as an everyday camera. In addition  the D90 introduces the D-Movie mode  allowing for the first time  an interchangeable lens SLR camera that is capable of recording 720p HD movie clips.  Availabilty: In Stock</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di109.shopping.com/images/di/58/68/55/527553432d73704262544944666f3471667a51-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di109.shopping.com/images/di/58/68/55/527553432d73704262544944666f3471667a51-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di109.shopping.com/images/di/58/68/55/527553432d73704262544944666f3471667a51-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="false" height="400" width="400"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="true" height="350" width="350"><sourceURL>http://di109.shopping.com/images/di/58/68/55/527553432d73704262544944666f3471667a51-350x350-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><storeNotes>Free Shipping with Any Purchase!</storeNotes><basePrice currency="USD">689.00</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">0.00</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">900.00</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=647&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=475674&amp;crawler_id=475674&amp;dealId=XhURuSC-spBbTIDfo4qfzQ%3D%3D&amp;url=http%3A%2F%2Fwww.fumfie.com%2Fproduct%2F169.5%2Fshopping-com%3F&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=Nikon+D90+SLR+Digital+Camera+%28Camera+Body%29&amp;dlprc=689.0&amp;crn=&amp;istrsmrc=1&amp;isathrsl=0&amp;AR=16&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=99671132&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=16&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=1&amp;SL=1&amp;FS=1&amp;code=&amp;acode=658&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="475674" trusted="true"><name>FumFie</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/475674.gif</sourceURL></logo><phoneNumber>866 666 9198</phoneNumber><ratingInfo><reviewCount>560</reviewCount><rating>4.27</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/mr/sdc_checks_45.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/xMR-store_fumfie~MRD-475674~S-1~linkin_id-7000610</reviewURL></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>F169C5</sku></offer><offer featured="false" id="o0Px_XLWDbrxAYRy3rCmyQ==" smartBuy="false" used="false"><name>Nikon D90 SLR w/Nikon 18-105mm VR &amp; 55-200mm VR Lenses</name><description>12.3 MegapixelDX Format CMOS Sensor3" VGA LCD DisplayLive ViewSelf Cleaning SensorD-Movie ModeHigh Sensitivity (ISO 3200)4.5 fps BurstIn-Camera Image Editing</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di101.shopping.com/images/di/6f/30/50/785f584c5744627278415952793372436d7951-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di101.shopping.com/images/di/6f/30/50/785f584c5744627278415952793372436d7951-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di101.shopping.com/images/di/6f/30/50/785f584c5744627278415952793372436d7951-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="true" height="400" width="400"><sourceURL>http://di101.shopping.com/images/di/6f/30/50/785f584c5744627278415952793372436d7951-400x400-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="true" height="500" width="500"><sourceURL>http://di101.shopping.com/images/di/6f/30/50/785f584c5744627278415952793372436d7951-500x500-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><basePrice currency="USD">1189.00</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">0.00</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">1189.00</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=371&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=487342&amp;crawler_id=487342&amp;dealId=o0Px_XLWDbrxAYRy3rCmyQ%3D%3D&amp;url=http%3A%2F%2Fwww.rythercamera.com%2Fcatalog%2Fproduct_info.php%3Fcsv%3Dsh%26products_id%3D30619%26&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=Nikon+D90+SLR+w%2FNikon+18-105mm+VR+%26+55-200mm+VR+Lenses&amp;dlprc=1189.0&amp;crn=&amp;istrsmrc=0&amp;isathrsl=0&amp;AR=20&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=99671132&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=20&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=0&amp;FS=1&amp;code=&amp;acode=379&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="487342" trusted="false"><name>RytherCamera.com</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/487342.gif</sourceURL></logo><phoneNumber>1-877-644-7593</phoneNumber><ratingInfo><reviewCount>0</reviewCount></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>30619</sku></offer><offer featured="false" id="4HgbWJSJ8ssgIf8B0MXIwA==" smartBuy="false" used="false"><name>Nikon D90 12.3 Megapixel Digital SLR Camera (Body Only)</name><description>Fusing 12.3 megapixel image quality and a cinematic 24fps D-Movie Mode, the Nikon D90 exceeds the demands of passionate photographers. Coupled with Nikon's EXPEED image processing technologies and NIKKOR optics, breathtaking image fidelity is assured. Combined with fast 0.15ms power-up and split-second 65ms shooting lag, dramatic action and decisive moments are captured easily. Effective 4-frequency, ultrasonic sensor cleaning frees image degrading dust particles from the sensor's optical low pass filter.</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di110.shopping.com/images/di/34/48/67/62574a534a3873736749663842304d58497741-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di110.shopping.com/images/di/34/48/67/62574a534a3873736749663842304d58497741-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di110.shopping.com/images/di/34/48/67/62574a534a3873736749663842304d58497741-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><storeNotes>FREE FEDEX 2-3 DAY DELIVERY</storeNotes><basePrice currency="USD">899.95</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">0.00</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">899.95</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=269&amp;BEFID=7185&amp;aon=%5E&amp;MerchantID=9296&amp;crawler_id=811558&amp;dealId=4HgbWJSJ8ssgIf8B0MXIwA%3D%3D&amp;url=http%3A%2F%2Fwww.pcnation.com%2Foptics-gallery%2Fdetails.asp%3Faffid%3D305%26item%3D2N145P&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=Nikon+D90+12.3+Megapixel+Digital+SLR+Camera+%28Body+Only%29&amp;dlprc=899.95&amp;crn=&amp;istrsmrc=1&amp;isathrsl=0&amp;AR=21&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=99671132&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=21&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=0&amp;FS=1&amp;code=&amp;acode=257&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="9296" trusted="true"><name>PCNation</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/9296.gif</sourceURL></logo><phoneNumber>800-470-7079</phoneNumber><ratingInfo><reviewCount>1622</reviewCount><rating>4.43</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/mr/sdc_checks_45.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/xMR-store_pcnation_9689~MRD-9296~S-1~linkin_id-7000610</reviewURL></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>2N145P</sku></offer><offer featured="false" id="UNDa3uMDZXOnvD_7sTILYg==" smartBuy="false" used="false"><name>Nikon D90 12.3MP Digital SLR Camera (Body Only)</name><description>Fusing 12.3-megapixel image quality inherited from the award-winning D300 with groundbreaking features, the D90's breathtaking, low-noise image quality is further advanced with EXPEED image processing. Split-second shutter response and continuous shooting at up to 4.5 frames-per-second provide the power to capture fast action and precise moments perfectly, while Nikon's exclusive Scene Recognition System contributes to faster 11-area autofocus performance, finer white balance detection and more. The D90 delivers the control passionate photographers demand, utilizing comprehensive exposure functions and the intelligence of 3D Color Matrix Metering II. Stunning results come to life on a 3-inch 920,000-dot color LCD monitor, providing accurate image review, Live View composition and brilliant playback of the D90's cinematic-quality 24-fps HD D-Movie mode.</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di102.shopping.com/images/di/55/4e/44/6133754d445a584f6e76445f377354494c5967-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di102.shopping.com/images/di/55/4e/44/6133754d445a584f6e76445f377354494c5967-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di102.shopping.com/images/di/55/4e/44/6133754d445a584f6e76445f377354494c5967-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="true" height="400" width="400"><sourceURL>http://di102.shopping.com/images/di/55/4e/44/6133754d445a584f6e76445f377354494c5967-400x400-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="true" height="500" width="500"><sourceURL>http://di102.shopping.com/images/di/55/4e/44/6133754d445a584f6e76445f377354494c5967-500x500-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><storeNotes>Fantastic prices with ease &amp; comfort of Amazon.com!</storeNotes><basePrice currency="USD">780.00</basePrice><shippingCost currency="USD">0.00</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">780.00</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=566&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=301531&amp;crawler_id=1903313&amp;dealId=UNDa3uMDZXOnvD_7sTILYg%3D%3D&amp;url=http%3A%2F%2Fwww.amazon.com%2Fdp%2FB001ET5U92%2Fref%3Dasc_df_B001ET5U921751618%3Fsmid%3DAHF4SYKP09WBH%26tag%3Ddealtime-ce-mp01feed-20%26linkCode%3Dasn%26creative%3D395105%26creativeASIN%3DB001ET5U92&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=Nikon+D90+12.3MP+Digital+SLR+Camera+%28Body+Only%29&amp;dlprc=780.0&amp;crn=&amp;istrsmrc=0&amp;isathrsl=0&amp;AR=29&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=99671132&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=29&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=0&amp;FS=1&amp;code=&amp;acode=520&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="301531" trusted="false"><name>Amazon Marketplace</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/301531.gif</sourceURL></logo><ratingInfo><reviewCount>213</reviewCount><rating>2.73</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/mr/sdc_checks_25.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/xMR-store_amazon_marketplace_9689~MRD-301531~S-1~linkin_id-7000610</reviewURL></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>B001ET5U92</sku></offer></offers></product><product id="70621646"><name>Nikon D90 Digital Camera with 18-105mm lens</name><shortDescription>12.9 Megapixel, SLR Camera, 3 in. LCD Screen, 5.8x Optical Zoom, With Video Capability, Weight: 2.3 lb.</shortDescription><fullDescription>Its 12.3 megapixel DX-format CMOS image sensor and EXPEED image processing system offer outstanding image quality across a wide ISO light sensitivity range. Live View mode lets you compose and shoot via the high-resolution 3-inch LCD monitor, and an advanced Scene Recognition System and autofocus performance help capture images with astounding accuracy. Movies can be shot in Motion JPEG format using the D-Movie function. The camera’s large image sensor ensures exceptional movie image quality and you can create dramatic effects by shooting with a wide range of interchangeable NIKKOR lenses, from wide-angle to macro to fisheye, or by adjusting the lens aperture and experimenting with depth-of-field. The D90 – designed to fuel your passion for photography.</fullDescription><images><image available="true" height="100" width="100"><sourceURL>http://di1.shopping.com/images/pi/57/6a/4f/70621646-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di1.shopping.com/images/pi/57/6a/4f/70621646-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di1.shopping.com/images/pi/57/6a/4f/70621646-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="true" height="400" width="400"><sourceURL>http://di1.shopping.com/images/pi/57/6a/4f/70621646-400x400-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="true" height="489" width="490"><sourceURL>http://di1.shopping.com/images/pi/57/6a/4f/70621646-490x489-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image></images><rating><reviewCount>32</reviewCount><rating>4.81</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/pr/sdc_stars_sm_5.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/Nikon-D90-with-18-105mm-lens/reviews~linkin_id-7000610</reviewURL></rating><minPrice>849.95</minPrice><maxPrice>1599.95</maxPrice><productOffersURL>http://www.shopping.com/Nikon-D90-with-18-105mm-lens/prices~linkin_id-7000610</productOffersURL><productSpecsURL>http://www.shopping.com/Nikon-D90-with-18-105mm-lens/info~linkin_id-7000610</productSpecsURL><offers matchedOfferCount="25" pageNumber="1" returnedOfferCount="5"><offer featured="false" id="3o5e1VghgJPfhLvT1JFKTA==" smartBuy="false" used="false"><name>Nikon D90 18-105mm VR Lens</name><description>The Nikon D90 SLR Digital Camera  with its 12.3-megapixel DX-format CMOS  3" High resolution LCD display  Scene Recognition System  Picture Control  Active D-Lighting  and one-button Live View  prov</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di111.shopping.com/images/di/33/6f/35/6531566768674a5066684c7654314a464b5441-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di111.shopping.com/images/di/33/6f/35/6531566768674a5066684c7654314a464b5441-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="false" height="300" width="300"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="false" height="400" width="400"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="260" width="260"><sourceURL>http://di111.shopping.com/images/di/33/6f/35/6531566768674a5066684c7654314a464b5441-260x260-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><basePrice currency="USD">849.95</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">0.00</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">849.95</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=419&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=9390&amp;crawler_id=1905054&amp;dealId=3o5e1VghgJPfhLvT1JFKTA%3D%3D&amp;url=http%3A%2F%2Fwww.ajrichard.com%2FNikon-D90-18-105mm-VR-Lens%2Fp-292%3Frefid%3DShopping%26&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=Nikon+D90+18-105mm+VR+Lens&amp;dlprc=849.95&amp;crn=&amp;istrsmrc=0&amp;isathrsl=0&amp;AR=2&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=70621646&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=2&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=0&amp;FS=1&amp;code=&amp;acode=425&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="9390" trusted="false"><name>AJRichard</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/9390.gif</sourceURL></logo><phoneNumber>1-888-871-1256</phoneNumber><ratingInfo><reviewCount>3124</reviewCount><rating>4.48</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/mr/sdc_checks_45.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/xMR-store_ajrichard~MRD-9390~S-1~linkin_id-7000610</reviewURL></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>292</sku></offer><offer featured="false" id="_lYWj_jbwfsSkfcwUcDuww==" smartBuy="false" used="false"><name>Nikon D90 SLR w/Nikon 18-105mm VR Lens</name><description>12.3 MegapixelDX Format CMOS Sensor3" VGA LCD DisplayLive ViewSelf Cleaning SensorD-Movie ModeHigh Sensitivity (ISO 3200)4.5 fps BurstIn-Camera Image Editing</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di108.shopping.com/images/di/5f/6c/59/576a5f6a62776673536b666377556344757777-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di108.shopping.com/images/di/5f/6c/59/576a5f6a62776673536b666377556344757777-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di108.shopping.com/images/di/5f/6c/59/576a5f6a62776673536b666377556344757777-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="true" height="400" width="400"><sourceURL>http://di108.shopping.com/images/di/5f/6c/59/576a5f6a62776673536b666377556344757777-400x400-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="true" height="500" width="500"><sourceURL>http://di108.shopping.com/images/di/5f/6c/59/576a5f6a62776673536b666377556344757777-500x500-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><basePrice currency="USD">909.00</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">0.00</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">909.00</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=371&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=487342&amp;crawler_id=487342&amp;dealId=_lYWj_jbwfsSkfcwUcDuww%3D%3D&amp;url=http%3A%2F%2Fwww.rythercamera.com%2Fcatalog%2Fproduct_info.php%3Fcsv%3Dsh%26products_id%3D30971%26&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=Nikon+D90+SLR+w%2FNikon+18-105mm+VR+Lens&amp;dlprc=909.0&amp;crn=&amp;istrsmrc=0&amp;isathrsl=0&amp;AR=3&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=70621646&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=3&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=0&amp;FS=1&amp;code=&amp;acode=379&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="487342" trusted="false"><name>RytherCamera.com</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/487342.gif</sourceURL></logo><phoneNumber>1-877-644-7593</phoneNumber><ratingInfo><reviewCount>0</reviewCount></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>30971</sku></offer><offer featured="false" id="1KCclCGuWvty2XKU9skadg==" smartBuy="false" used="false"><name>25448/D90 12.3 Megapixel Digital Camera 18-105mm Zoom Lens w/ 3" Screen - Black</name><description>Nikon D90 - Digital camera - SLR - 12.3 Mpix - Nikon AF-S DX 18-105mm lens - optical zoom: 5.8 x - supported memory: SD, SDHC</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di110.shopping.com/images/di/31/4b/43/636c4347755776747932584b5539736b616467-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di110.shopping.com/images/di/31/4b/43/636c4347755776747932584b5539736b616467-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di110.shopping.com/images/di/31/4b/43/636c4347755776747932584b5539736b616467-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="true" height="400" width="400"><sourceURL>http://di110.shopping.com/images/di/31/4b/43/636c4347755776747932584b5539736b616467-400x400-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><storeNotes>Get 30 days FREE SHIPPING w/ ShipVantage</storeNotes><basePrice currency="USD">1199.00</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">8.20</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">1199.00</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=578&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=485615&amp;crawler_id=485615&amp;dealId=1KCclCGuWvty2XKU9skadg%3D%3D&amp;url=http%3A%2F%2Fsears.rdr.channelintelligence.com%2Fgo.asp%3FfVhzOGNRAAQIASNiE1NbQBRtFXpzYx0CTAICI2BbH1lEFmgKP3QvUVpEREdlfUAUHAQPLVpFTVdtJzxAHUNYW3AhQBM0QhFvEXAbYh8EAAVmb2JcVlhCGGkPc3QDEkFZVQ0WFhdRW0MWbgYWDlxzdGMdAVQWRi0xDAwPFhw9TSobb05eWVVYKzsLTFVVQi5RICs3SA8MU1s2MQQKD1wf%26nAID%3D13736960%26&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=25448%2FD90+12.3+Megapixel+Digital+Camera+18-105mm+Zoom+Lens+w%2F+3%22+Screen+-+Black&amp;dlprc=1199.0&amp;crn=&amp;istrsmrc=1&amp;isathrsl=0&amp;AR=4&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=70621646&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=4&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=0&amp;FS=0&amp;code=&amp;acode=586&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="485615" trusted="true"><name>Sears</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/485615.gif</sourceURL></logo><phoneNumber>1-800-349-4358</phoneNumber><ratingInfo><reviewCount>888</reviewCount><rating>2.85</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/mr/sdc_checks_3.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/xMR-store_sears_4189479~MRD-485615~S-1~linkin_id-7000610</reviewURL></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>00353197000</sku></offer><offer featured="false" id="3-VOSfVV5Jo7HlA4kJtanA==" smartBuy="false" used="false"><name>Nikon® D90 12.3MP Digital SLR with 18-105mm Lens</name><description>The Nikon D90 will make you rethink what a digital SLR camera can achieve.</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di101.shopping.com/images/di/33/2d/56/4f53665656354a6f37486c41346b4a74616e41-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di101.shopping.com/images/di/33/2d/56/4f53665656354a6f37486c41346b4a74616e41-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="false" height="300" width="300"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="false" height="400" width="400"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="true" height="220" width="220"><sourceURL>http://di101.shopping.com/images/di/33/2d/56/4f53665656354a6f37486c41346b4a74616e41-220x220-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><basePrice currency="USD">1350.99</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">6.05</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">1350.99</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=504&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=332477&amp;crawler_id=332477&amp;dealId=3-VOSfVV5Jo7HlA4kJtanA%3D%3D&amp;url=http%3A%2F%2Ftracking.searchmarketing.com%2Fgsic.asp%3Faid%3D982673361%26&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=Nikon%C2%AE+D90+12.3MP+Digital+SLR+with+18-105mm+Lens&amp;dlprc=1350.99&amp;crn=&amp;istrsmrc=0&amp;isathrsl=0&amp;AR=5&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=70621646&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=5&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=0&amp;FS=0&amp;code=&amp;acode=496&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="332477" trusted="false"><name>RadioShack</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/332477.gif</sourceURL></logo><ratingInfo><reviewCount>24</reviewCount><rating>2.25</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/mr/sdc_checks_25.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/xMR-store_radioshack_9689~MRD-332477~S-1~linkin_id-7000610</reviewURL></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>11148905</sku></offer><offer featured="false" id="kQnB6rS4AjN5dx5h2_631g==" smartBuy="false" used="false"><name>Nikon D90 Kit 12.3-megapixel Digital SLR with 18-105mm VR Lens</name><description>Photographers, take your passion further!Now is the time for new creativity, and to rethink what a digital SLR camera can achieve. It's time for the D90, a camera with everything you would expect from Nikon's next-generation D-SLRs, and some unexpected surprises, as well. The stunning image quality is inherited from the D300, Nikon's DX-format flagship. The D90 also has Nikon's unmatched ergonomics and high performance, and now takes high-quality movies with beautifully cinematic results. The world of photography has changed, and with the D90 in your hands, it's time to make your own rules.AF-S DX NIKKOR 18-105mm f/3.5-5.6G ED VR LensWide-ratio 5.8x zoom Compact, versatile and ideal for a broad range of shooting situations, ranging from interiors and landscapes to beautiful portraits� a perfect everyday zoom. Nikon VR (Vibration Reduction) image stabilization Vibration Reduction is engineered specifically for each VR NIKKOR lens and enables handheld shooting at up to 3 shutter speeds slower than would</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di110.shopping.com/images/di/6b/51/6e/4236725334416a4e3564783568325f36333167-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di110.shopping.com/images/di/6b/51/6e/4236725334416a4e3564783568325f36333167-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di110.shopping.com/images/di/6b/51/6e/4236725334416a4e3564783568325f36333167-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="false" height="400" width="400"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="true" height="232" width="300"><sourceURL>http://di110.shopping.com/images/di/6b/51/6e/4236725334416a4e3564783568325f36333167-300x232-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><storeNotes>Shipping Included!</storeNotes><basePrice currency="USD">1050.00</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">0.00</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">1199.00</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=135&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=313162&amp;crawler_id=313162&amp;dealId=kQnB6rS4AjN5dx5h2_631g%3D%3D&amp;url=http%3A%2F%2Fonecall.rdr.channelintelligence.com%2Fgo.asp%3FfVhzOGNRAAQIASNiE1pZSxNoWHFwLx8GTAICa2ZeH1sPXTZLNzRpAh1HR0BxPQEGCBJNMhFHUElsFCFCVkVTTHAcBggEHQ4aHXNpGERGH3RQODsbAgdechJtbBt8fx8JAwhtZFAzJj1oGgIWCxRlNyFOUV9UUGIxBgo0T0IyTSYqJ0RWHw4QPCIBAAQXRGMDICg6TllZVBhh%26nAID%3D13736960&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=Nikon+D90+Kit+12.3-megapixel+Digital+SLR+with+18-105mm+VR+Lens&amp;dlprc=1050.0&amp;crn=&amp;istrsmrc=1&amp;isathrsl=0&amp;AR=6&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=70621646&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=6&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=1&amp;FS=1&amp;code=&amp;acode=143&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="313162" trusted="true"><name>OneCall</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/313162.gif</sourceURL></logo><phoneNumber>1.800.398.0766</phoneNumber><ratingInfo><reviewCount>180</reviewCount><rating>4.44</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/mr/sdc_checks_45.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/xMR-store_onecall_9689~MRD-313162~S-1~linkin_id-7000610</reviewURL></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>92826</sku></offer></offers></product></items><attributes matchedAttributeCount="5" returnedAttributeCount="5"><attribute id="Dynamic_Price_Range"><name>Price range</name><attributeURL>http://www.shopping.com/digital-cameras/nikon/products?oq=nikon&amp;linkin_id=7000610</attributeURL><attributeValues matchedValueCount="2" returnedValueCount="2"><attributeValue id="price_range_24_4012" matchingItemsCount="1"><name>$24 - $4012</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon/products?minPrice=24&amp;maxPrice=4012&amp;linkin_id=7000610</attributeValueURL></attributeValue><attributeValue id="price_range_4012_7999" matchingItemsCount="1"><name>$4012 - $7999</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon/products?minPrice=4012&amp;maxPrice=7999&amp;linkin_id=7000610</attributeValueURL></attributeValue></attributeValues></attribute><attribute id="9688_brand"><name>Brand</name><attributeURL>http://www.shopping.com/digital-cameras/nikon/products~all-9688-brand~MS-1?oq=nikon&amp;linkin_id=7000610</attributeURL><attributeValues matchedValueCount="7" returnedValueCount="5"><attributeValue id="brand_nikon" matchingItemsCount="2261"><name>Nikon</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+brand-nikon/products~linkin_id-7000610</attributeValueURL></attributeValue><attributeValue id="9688_brand_crane" matchingItemsCount="17"><name>Crane</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+9688-brand-crane/products~linkin_id-7000610</attributeValueURL></attributeValue><attributeValue id="ikelite" matchingItemsCount="2"><name>Ikelite</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+ikelite/products~linkin_id-7000610</attributeValueURL></attributeValue><attributeValue id="bower" matchingItemsCount="1"><name>Bower</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+bower/products~linkin_id-7000610</attributeValueURL></attributeValue><attributeValue id="brand_fuji" matchingItemsCount="2"><name>FUJIFILM</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+brand-fuji/products~linkin_id-7000610</attributeValueURL></attributeValue></attributeValues></attribute><attribute id="store"><name>Store</name><attributeURL>http://www.shopping.com/digital-cameras/nikon/products~all-store~MS-1?oq=nikon&amp;linkin_id=7000610</attributeURL><attributeValues matchedValueCount="35" returnedValueCount="5"><attributeValue id="store_amazon_marketplace_9689" matchingItemsCount="808"><name>Amazon Marketplace</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+store-amazon-marketplace-9689/products~linkin_id-7000610</attributeValueURL></attributeValue><attributeValue id="store_amazon" matchingItemsCount="83"><name>Amazon</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+store-amazon/products~linkin_id-7000610</attributeValueURL></attributeValue><attributeValue id="store_adorama" matchingItemsCount="81"><name>Adorama</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+store-adorama/products~linkin_id-7000610</attributeValueURL></attributeValue><attributeValue id="store_j_r_music_and_computer_world" matchingItemsCount="78"><name>J&amp;R Music and Computer World</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+store-j-r-music-and-computer-world/products~linkin_id-7000610</attributeValueURL></attributeValue><attributeValue id="store_rythercamera_com" matchingItemsCount="78"><name>RytherCamera.com</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+store-rythercamera-com/products~linkin_id-7000610</attributeValueURL></attributeValue></attributeValues></attribute><attribute id="21885_resolution"><name>Resolution</name><attributeURL>http://www.shopping.com/digital-cameras/nikon/products~all-21885-resolution~MS-1?oq=nikon&amp;linkin_id=7000610</attributeURL><attributeValues matchedValueCount="13" returnedValueCount="5"><attributeValue id="under_4_megapixel" matchingItemsCount="3"><name>Under 4 Megapixel</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+under-4-megapixel/products~linkin_id-7000610</attributeValueURL></attributeValue><attributeValue id="5_megapixel_digital_cameras" matchingItemsCount="1085"><name>At least 5 Megapixel</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+5-megapixel-digital-cameras/products~linkin_id-7000610</attributeValueURL></attributeValue><attributeValue id="6_megapixel_digital_cameras" matchingItemsCount="1080"><name>At least 6 Megapixel</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+6-megapixel-digital-cameras/products~linkin_id-7000610</attributeValueURL></attributeValue><attributeValue id="7_megapixel_digital_cameras" matchingItemsCount="1066"><name>At least 7 Megapixel</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+7-megapixel-digital-cameras/products~linkin_id-7000610</attributeValueURL></attributeValue><attributeValue id="8_megapixel_digital_cameras" matchingItemsCount="1056"><name>At least 8 Megapixel</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+8-megapixel-digital-cameras/products~linkin_id-7000610</attributeValueURL></attributeValue></attributeValues></attribute><attribute id="32804-features"><name>Features</name><attributeURL>http://www.shopping.com/digital-cameras/nikon/products~all-32804-features~MS-1?oq=nikon&amp;linkin_id=7000610</attributeURL><attributeValues matchedValueCount="12" returnedValueCount="5"><attributeValue id="32804_features_shockproof" matchingItemsCount="7"><name>Shockproof</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+32804-features-shockproof/products~linkin_id-7000610</attributeValueURL></attributeValue><attributeValue id="32804_features_waterproof" matchingItemsCount="32"><name>Waterproof</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+32804-features-waterproof/products~linkin_id-7000610</attributeValueURL></attributeValue><attributeValue id="32804_features_freezeproof" matchingItemsCount="7"><name>Freezeproof</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+32804-features-freezeproof/products~linkin_id-7000610</attributeValueURL></attributeValue><attributeValue id="32804_features_dust_proof" matchingItemsCount="23"><name>Dust proof</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+32804-features-dust-proof/products~linkin_id-7000610</attributeValueURL></attributeValue><attributeValue id="32804_features_image_stabilization" matchingItemsCount="797"><name>Image Stabilization</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+32804-features-image-stabilization/products~linkin_id-7000610</attributeValueURL></attributeValue></attributeValues></attribute></attributes><contentType>hybrid</contentType></category></categories><relatedTerms><term>digital camera</term><term>g1</term><term>sony</term><term>camera</term><term>canon</term><term>nikon</term><term>kodak digital camera</term><term>kodak</term><term>sony cybershot</term><term>kodak easyshare digital camera</term><term>nikon coolpix</term><term>olympus</term><term>pink digital camera</term><term>canon powershot</term></relatedTerms></GeneralSearchResponse>
\ No newline at end of file
diff --git a/node_modules/elementtree/node_modules/sax/examples/strict.dtd b/node_modules/elementtree/node_modules/sax/examples/strict.dtd
new file mode 100644
index 0000000..b274559
--- /dev/null
+++ b/node_modules/elementtree/node_modules/sax/examples/strict.dtd
@@ -0,0 +1,870 @@
+<!--
+    This is HTML 4.01 Strict DTD, which excludes the presentation 
+    attributes and elements that W3C expects to phase out as 
+    support for style sheets matures. Authors should use the Strict
+    DTD when possible, but may use the Transitional DTD when support
+    for presentation attribute and elements is required.
+    
+    HTML 4 includes mechanisms for style sheets, scripting,
+    embedding objects, improved support for right to left and mixed
+    direction text, and enhancements to forms for improved
+    accessibility for people with disabilities.
+
+          Draft: $Date: 1999/12/24 23:37:48 $
+
+          Authors:
+              Dave Raggett <dsr@w3.org>
+              Arnaud Le Hors <lehors@w3.org>
+              Ian Jacobs <ij@w3.org>
+
+    Further information about HTML 4.01 is available at:
+
+        http://www.w3.org/TR/1999/REC-html401-19991224
+
+
+    The HTML 4.01 specification includes additional
+    syntactic constraints that cannot be expressed within
+    the DTDs.
+
+-->
+<!--
+    Typical usage:
+
+    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+            "http://www.w3.org/TR/html4/strict.dtd">
+    <html>
+    <head>
+    ...
+    </head>
+    <body>
+    ...
+    </body>
+    </html>
+
+    The URI used as a system identifier with the public identifier allows
+    the user agent to download the DTD and entity sets as needed.
+
+    The FPI for the Transitional HTML 4.01 DTD is:
+
+        "-//W3C//DTD HTML 4.01 Transitional//EN"
+
+    This version of the transitional DTD is:
+
+        http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd
+
+    If you are writing a document that includes frames, use 
+    the following FPI:
+
+        "-//W3C//DTD HTML 4.01 Frameset//EN"
+
+    This version of the frameset DTD is:
+
+        http://www.w3.org/TR/1999/REC-html401-19991224/frameset.dtd
+
+    Use the following (relative) URIs to refer to 
+    the DTDs and entity definitions of this specification:
+
+    "strict.dtd"
+    "loose.dtd"
+    "frameset.dtd"
+    "HTMLlat1.ent"
+    "HTMLsymbol.ent"
+    "HTMLspecial.ent"
+
+-->
+
+<!--================== Imported Names ====================================-->
+<!-- Feature Switch for frameset documents -->
+<!ENTITY % HTML.Frameset "IGNORE">
+
+<!ENTITY % ContentType "CDATA"
+    -- media type, as per [RFC2045]
+    -->
+
+<!ENTITY % ContentTypes "CDATA"
+    -- comma-separated list of media types, as per [RFC2045]
+    -->
+
+<!ENTITY % Charset "CDATA"
+    -- a character encoding, as per [RFC2045]
+    -->
+
+<!ENTITY % Charsets "CDATA"
+    -- a space-separated list of character encodings, as per [RFC2045]
+    -->
+
+<!ENTITY % LanguageCode "NAME"
+    -- a language code, as per [RFC1766]
+    -->
+
+<!ENTITY % Character "CDATA"
+    -- a single character from [ISO10646] 
+    -->
+
+<!ENTITY % LinkTypes "CDATA"
+    -- space-separated list of link types
+    -->
+
+<!ENTITY % MediaDesc "CDATA"
+    -- single or comma-separated list of media descriptors
+    -->
+
+<!ENTITY % URI "CDATA"
+    -- a Uniform Resource Identifier,
+       see [URI]
+    -->
+
+<!ENTITY % Datetime "CDATA" -- date and time information. ISO date format -->
+
+
+<!ENTITY % Script "CDATA" -- script expression -->
+
+<!ENTITY % StyleSheet "CDATA" -- style sheet data -->
+
+
+
+<!ENTITY % Text "CDATA">
+
+
+<!-- Parameter Entities -->
+
+<!ENTITY % head.misc "SCRIPT|STYLE|META|LINK|OBJECT" -- repeatable head elements -->
+
+<!ENTITY % heading "H1|H2|H3|H4|H5|H6">
+
+<!ENTITY % list "UL | OL">
+
+<!ENTITY % preformatted "PRE">
+
+
+<!--================ Character mnemonic entities =========================-->
+
+<!ENTITY % HTMLlat1 PUBLIC
+   "-//W3C//ENTITIES Latin1//EN//HTML"
+   "HTMLlat1.ent">
+%HTMLlat1;
+
+<!ENTITY % HTMLsymbol PUBLIC
+   "-//W3C//ENTITIES Symbols//EN//HTML"
+   "HTMLsymbol.ent">
+%HTMLsymbol;
+
+<!ENTITY % HTMLspecial PUBLIC
+   "-//W3C//ENTITIES Special//EN//HTML"
+   "HTMLspecial.ent">
+%HTMLspecial;
+<!--=================== Generic Attributes ===============================-->
+
+<!ENTITY % coreattrs
+ "id          ID             #IMPLIED  -- document-wide unique id --
+  class       CDATA          #IMPLIED  -- space-separated list of classes --
+  style       %StyleSheet;   #IMPLIED  -- associated style info --
+  title       %Text;         #IMPLIED  -- advisory title --"
+  >
+
+<!ENTITY % i18n
+ "lang        %LanguageCode; #IMPLIED  -- language code --
+  dir         (ltr|rtl)      #IMPLIED  -- direction for weak/neutral text --"
+  >
+
+<!ENTITY % events
+ "onclick     %Script;       #IMPLIED  -- a pointer button was clicked --
+  ondblclick  %Script;       #IMPLIED  -- a pointer button was double clicked--
+  onmousedown %Script;       #IMPLIED  -- a pointer button was pressed down --
+  onmouseup   %Script;       #IMPLIED  -- a pointer button was released --
+  onmouseover %Script;       #IMPLIED  -- a pointer was moved onto --
+  onmousemove %Script;       #IMPLIED  -- a pointer was moved within --
+  onmouseout  %Script;       #IMPLIED  -- a pointer was moved away --
+  onkeypress  %Script;       #IMPLIED  -- a key was pressed and released --
+  onkeydown   %Script;       #IMPLIED  -- a key was pressed down --
+  onkeyup     %Script;       #IMPLIED  -- a key was released --"
+  >
+
+<!-- Reserved Feature Switch -->
+<!ENTITY % HTML.Reserved "IGNORE">
+
+<!-- The following attributes are reserved for possible future use -->
+<![ %HTML.Reserved; [
+<!ENTITY % reserved
+ "datasrc     %URI;          #IMPLIED  -- a single or tabular Data Source --
+  datafld     CDATA          #IMPLIED  -- the property or column name --
+  dataformatas (plaintext|html) plaintext -- text or html --"
+  >
+]]>
+
+<!ENTITY % reserved "">
+
+<!ENTITY % attrs "%coreattrs; %i18n; %events;">
+
+
+<!--=================== Text Markup ======================================-->
+
+<!ENTITY % fontstyle
+ "TT | I | B | BIG | SMALL">
+
+<!ENTITY % phrase "EM | STRONG | DFN | CODE |
+                   SAMP | KBD | VAR | CITE | ABBR | ACRONYM" >
+
+<!ENTITY % special
+   "A | IMG | OBJECT | BR | SCRIPT | MAP | Q | SUB | SUP | SPAN | BDO">
+
+<!ENTITY % formctrl "INPUT | SELECT | TEXTAREA | LABEL | BUTTON">
+
+<!-- %inline; covers inline or "text-level" elements -->
+<!ENTITY % inline "#PCDATA | %fontstyle; | %phrase; | %special; | %formctrl;">
+
+<!ELEMENT (%fontstyle;|%phrase;) - - (%inline;)*>
+<!ATTLIST (%fontstyle;|%phrase;)
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  >
+
+<!ELEMENT (SUB|SUP) - - (%inline;)*    -- subscript, superscript -->
+<!ATTLIST (SUB|SUP)
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  >
+
+<!ELEMENT SPAN - - (%inline;)*         -- generic language/style container -->
+<!ATTLIST SPAN
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  %reserved;			       -- reserved for possible future use --
+  >
+
+<!ELEMENT BDO - - (%inline;)*          -- I18N BiDi over-ride -->
+<!ATTLIST BDO
+  %coreattrs;                          -- id, class, style, title --
+  lang        %LanguageCode; #IMPLIED  -- language code --
+  dir         (ltr|rtl)      #REQUIRED -- directionality --
+  >
+
+
+<!ELEMENT BR - O EMPTY                 -- forced line break -->
+<!ATTLIST BR
+  %coreattrs;                          -- id, class, style, title --
+  >
+
+<!--================== HTML content models ===============================-->
+
+<!--
+    HTML has two basic content models:
+
+        %inline;     character level elements and text strings
+        %block;      block-like elements e.g. paragraphs and lists
+-->
+
+<!ENTITY % block
+     "P | %heading; | %list; | %preformatted; | DL | DIV | NOSCRIPT |
+      BLOCKQUOTE | FORM | HR | TABLE | FIELDSET | ADDRESS">
+
+<!ENTITY % flow "%block; | %inline;">
+
+<!--=================== Document Body ====================================-->
+
+<!ELEMENT BODY O O (%block;|SCRIPT)+ +(INS|DEL) -- document body -->
+<!ATTLIST BODY
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  onload          %Script;   #IMPLIED  -- the document has been loaded --
+  onunload        %Script;   #IMPLIED  -- the document has been removed --
+  >
+
+<!ELEMENT ADDRESS - - (%inline;)* -- information on author -->
+<!ATTLIST ADDRESS
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  >
+
+<!ELEMENT DIV - - (%flow;)*            -- generic language/style container -->
+<!ATTLIST DIV
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  %reserved;                           -- reserved for possible future use --
+  >
+
+
+<!--================== The Anchor Element ================================-->
+
+<!ENTITY % Shape "(rect|circle|poly|default)">
+<!ENTITY % Coords "CDATA" -- comma-separated list of lengths -->
+
+<!ELEMENT A - - (%inline;)* -(A)       -- anchor -->
+<!ATTLIST A
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  charset     %Charset;      #IMPLIED  -- char encoding of linked resource --
+  type        %ContentType;  #IMPLIED  -- advisory content type --
+  name        CDATA          #IMPLIED  -- named link end --
+  href        %URI;          #IMPLIED  -- URI for linked resource --
+  hreflang    %LanguageCode; #IMPLIED  -- language code --
+  rel         %LinkTypes;    #IMPLIED  -- forward link types --
+  rev         %LinkTypes;    #IMPLIED  -- reverse link types --
+  accesskey   %Character;    #IMPLIED  -- accessibility key character --
+  shape       %Shape;        rect      -- for use with client-side image maps --
+  coords      %Coords;       #IMPLIED  -- for use with client-side image maps --
+  tabindex    NUMBER         #IMPLIED  -- position in tabbing order --
+  onfocus     %Script;       #IMPLIED  -- the element got the focus --
+  onblur      %Script;       #IMPLIED  -- the element lost the focus --
+  >
+
+<!--================== Client-side image maps ============================-->
+
+<!-- These can be placed in the same document or grouped in a
+     separate document although this isn't yet widely supported -->
+
+<!ELEMENT MAP - - ((%block;) | AREA)+ -- client-side image map -->
+<!ATTLIST MAP
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  name        CDATA          #REQUIRED -- for reference by usemap --
+  >
+
+<!ELEMENT AREA - O EMPTY               -- client-side image map area -->
+<!ATTLIST AREA
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  shape       %Shape;        rect      -- controls interpretation of coords --
+  coords      %Coords;       #IMPLIED  -- comma-separated list of lengths --
+  href        %URI;          #IMPLIED  -- URI for linked resource --
+  nohref      (nohref)       #IMPLIED  -- this region has no action --
+  alt         %Text;         #REQUIRED -- short description --
+  tabindex    NUMBER         #IMPLIED  -- position in tabbing order --
+  accesskey   %Character;    #IMPLIED  -- accessibility key character --
+  onfocus     %Script;       #IMPLIED  -- the element got the focus --
+  onblur      %Script;       #IMPLIED  -- the element lost the focus --
+  >
+
+<!--================== The LINK Element ==================================-->
+
+<!--
+  Relationship values can be used in principle:
+
+   a) for document specific toolbars/menus when used
+      with the LINK element in document head e.g.
+        start, contents, previous, next, index, end, help
+   b) to link to a separate style sheet (rel=stylesheet)
+   c) to make a link to a script (rel=script)
+   d) by stylesheets to control how collections of
+      html nodes are rendered into printed documents
+   e) to make a link to a printable version of this document
+      e.g. a postscript or pdf version (rel=alternate media=print)
+-->
+
+<!ELEMENT LINK - O EMPTY               -- a media-independent link -->
+<!ATTLIST LINK
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  charset     %Charset;      #IMPLIED  -- char encoding of linked resource --
+  href        %URI;          #IMPLIED  -- URI for linked resource --
+  hreflang    %LanguageCode; #IMPLIED  -- language code --
+  type        %ContentType;  #IMPLIED  -- advisory content type --
+  rel         %LinkTypes;    #IMPLIED  -- forward link types --
+  rev         %LinkTypes;    #IMPLIED  -- reverse link types --
+  media       %MediaDesc;    #IMPLIED  -- for rendering on these media --
+  >
+
+<!--=================== Images ===========================================-->
+
+<!-- Length defined in strict DTD for cellpadding/cellspacing -->
+<!ENTITY % Length "CDATA" -- nn for pixels or nn% for percentage length -->
+<!ENTITY % MultiLength "CDATA" -- pixel, percentage, or relative -->
+
+<![ %HTML.Frameset; [
+<!ENTITY % MultiLengths "CDATA" -- comma-separated list of MultiLength -->
+]]>
+
+<!ENTITY % Pixels "CDATA" -- integer representing length in pixels -->
+
+
+<!-- To avoid problems with text-only UAs as well as 
+   to make image content understandable and navigable 
+   to users of non-visual UAs, you need to provide
+   a description with ALT, and avoid server-side image maps -->
+<!ELEMENT IMG - O EMPTY                -- Embedded image -->
+<!ATTLIST IMG
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  src         %URI;          #REQUIRED -- URI of image to embed --
+  alt         %Text;         #REQUIRED -- short description --
+  longdesc    %URI;          #IMPLIED  -- link to long description
+                                          (complements alt) --
+  name        CDATA          #IMPLIED  -- name of image for scripting --
+  height      %Length;       #IMPLIED  -- override height --
+  width       %Length;       #IMPLIED  -- override width --
+  usemap      %URI;          #IMPLIED  -- use client-side image map --
+  ismap       (ismap)        #IMPLIED  -- use server-side image map --
+  >
+
+<!-- USEMAP points to a MAP element which may be in this document
+  or an external document, although the latter is not widely supported -->
+
+<!--==================== OBJECT ======================================-->
+<!--
+  OBJECT is used to embed objects as part of HTML pages 
+  PARAM elements should precede other content. SGML mixed content
+  model technicality precludes specifying this formally ...
+-->
+
+<!ELEMENT OBJECT - - (PARAM | %flow;)*
+ -- generic embedded object -->
+<!ATTLIST OBJECT
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  declare     (declare)      #IMPLIED  -- declare but don't instantiate flag --
+  classid     %URI;          #IMPLIED  -- identifies an implementation --
+  codebase    %URI;          #IMPLIED  -- base URI for classid, data, archive--
+  data        %URI;          #IMPLIED  -- reference to object's data --
+  type        %ContentType;  #IMPLIED  -- content type for data --
+  codetype    %ContentType;  #IMPLIED  -- content type for code --
+  archive     CDATA          #IMPLIED  -- space-separated list of URIs --
+  standby     %Text;         #IMPLIED  -- message to show while loading --
+  height      %Length;       #IMPLIED  -- override height --
+  width       %Length;       #IMPLIED  -- override width --
+  usemap      %URI;          #IMPLIED  -- use client-side image map --
+  name        CDATA          #IMPLIED  -- submit as part of form --
+  tabindex    NUMBER         #IMPLIED  -- position in tabbing order --
+  %reserved;                           -- reserved for possible future use --
+  >
+
+<!ELEMENT PARAM - O EMPTY              -- named property value -->
+<!ATTLIST PARAM
+  id          ID             #IMPLIED  -- document-wide unique id --
+  name        CDATA          #REQUIRED -- property name --
+  value       CDATA          #IMPLIED  -- property value --
+  valuetype   (DATA|REF|OBJECT) DATA   -- How to interpret value --
+  type        %ContentType;  #IMPLIED  -- content type for value
+                                          when valuetype=ref --
+  >
+
+
+<!--=================== Horizontal Rule ==================================-->
+
+<!ELEMENT HR - O EMPTY -- horizontal rule -->
+<!ATTLIST HR
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  >
+
+<!--=================== Paragraphs =======================================-->
+
+<!ELEMENT P - O (%inline;)*            -- paragraph -->
+<!ATTLIST P
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  >
+
+<!--=================== Headings =========================================-->
+
+<!--
+  There are six levels of headings from H1 (the most important)
+  to H6 (the least important).
+-->
+
+<!ELEMENT (%heading;)  - - (%inline;)* -- heading -->
+<!ATTLIST (%heading;)
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  >
+
+<!--=================== Preformatted Text ================================-->
+
+<!-- excludes markup for images and changes in font size -->
+<!ENTITY % pre.exclusion "IMG|OBJECT|BIG|SMALL|SUB|SUP">
+
+<!ELEMENT PRE - - (%inline;)* -(%pre.exclusion;) -- preformatted text -->
+<!ATTLIST PRE
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  >
+
+<!--===================== Inline Quotes ==================================-->
+
+<!ELEMENT Q - - (%inline;)*            -- short inline quotation -->
+<!ATTLIST Q
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  cite        %URI;          #IMPLIED  -- URI for source document or msg --
+  >
+
+<!--=================== Block-like Quotes ================================-->
+
+<!ELEMENT BLOCKQUOTE - - (%block;|SCRIPT)+ -- long quotation -->
+<!ATTLIST BLOCKQUOTE
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  cite        %URI;          #IMPLIED  -- URI for source document or msg --
+  >
+
+<!--=================== Inserted/Deleted Text ============================-->
+
+
+<!-- INS/DEL are handled by inclusion on BODY -->
+<!ELEMENT (INS|DEL) - - (%flow;)*      -- inserted text, deleted text -->
+<!ATTLIST (INS|DEL)
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  cite        %URI;          #IMPLIED  -- info on reason for change --
+  datetime    %Datetime;     #IMPLIED  -- date and time of change --
+  >
+
+<!--=================== Lists ============================================-->
+
+<!-- definition lists - DT for term, DD for its definition -->
+
+<!ELEMENT DL - - (DT|DD)+              -- definition list -->
+<!ATTLIST DL
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  >
+
+<!ELEMENT DT - O (%inline;)*           -- definition term -->
+<!ELEMENT DD - O (%flow;)*             -- definition description -->
+<!ATTLIST (DT|DD)
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  >
+
+
+<!ELEMENT OL - - (LI)+                 -- ordered list -->
+<!ATTLIST OL
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  >
+
+<!-- Unordered Lists (UL) bullet styles -->
+<!ELEMENT UL - - (LI)+                 -- unordered list -->
+<!ATTLIST UL
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  >
+
+
+
+<!ELEMENT LI - O (%flow;)*             -- list item -->
+<!ATTLIST LI
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  >
+
+<!--================ Forms ===============================================-->
+<!ELEMENT FORM - - (%block;|SCRIPT)+ -(FORM) -- interactive form -->
+<!ATTLIST FORM
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  action      %URI;          #REQUIRED -- server-side form handler --
+  method      (GET|POST)     GET       -- HTTP method used to submit the form--
+  enctype     %ContentType;  "application/x-www-form-urlencoded"
+  accept      %ContentTypes; #IMPLIED  -- list of MIME types for file upload --
+  name        CDATA          #IMPLIED  -- name of form for scripting --
+  onsubmit    %Script;       #IMPLIED  -- the form was submitted --
+  onreset     %Script;       #IMPLIED  -- the form was reset --
+  accept-charset %Charsets;  #IMPLIED  -- list of supported charsets --
+  >
+
+<!-- Each label must not contain more than ONE field -->
+<!ELEMENT LABEL - - (%inline;)* -(LABEL) -- form field label text -->
+<!ATTLIST LABEL
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  for         IDREF          #IMPLIED  -- matches field ID value --
+  accesskey   %Character;    #IMPLIED  -- accessibility key character --
+  onfocus     %Script;       #IMPLIED  -- the element got the focus --
+  onblur      %Script;       #IMPLIED  -- the element lost the focus --
+  >
+
+<!ENTITY % InputType
+  "(TEXT | PASSWORD | CHECKBOX |
+    RADIO | SUBMIT | RESET |
+    FILE | HIDDEN | IMAGE | BUTTON)"
+   >
+
+<!-- attribute name required for all but submit and reset -->
+<!ELEMENT INPUT - O EMPTY              -- form control -->
+<!ATTLIST INPUT
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  type        %InputType;    TEXT      -- what kind of widget is needed --
+  name        CDATA          #IMPLIED  -- submit as part of form --
+  value       CDATA          #IMPLIED  -- Specify for radio buttons and checkboxes --
+  checked     (checked)      #IMPLIED  -- for radio buttons and check boxes --
+  disabled    (disabled)     #IMPLIED  -- unavailable in this context --
+  readonly    (readonly)     #IMPLIED  -- for text and passwd --
+  size        CDATA          #IMPLIED  -- specific to each type of field --
+  maxlength   NUMBER         #IMPLIED  -- max chars for text fields --
+  src         %URI;          #IMPLIED  -- for fields with images --
+  alt         CDATA          #IMPLIED  -- short description --
+  usemap      %URI;          #IMPLIED  -- use client-side image map --
+  ismap       (ismap)        #IMPLIED  -- use server-side image map --
+  tabindex    NUMBER         #IMPLIED  -- position in tabbing order --
+  accesskey   %Character;    #IMPLIED  -- accessibility key character --
+  onfocus     %Script;       #IMPLIED  -- the element got the focus --
+  onblur      %Script;       #IMPLIED  -- the element lost the focus --
+  onselect    %Script;       #IMPLIED  -- some text was selected --
+  onchange    %Script;       #IMPLIED  -- the element value was changed --
+  accept      %ContentTypes; #IMPLIED  -- list of MIME types for file upload --
+  %reserved;                           -- reserved for possible future use --
+  >
+
+<!ELEMENT SELECT - - (OPTGROUP|OPTION)+ -- option selector -->
+<!ATTLIST SELECT
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  name        CDATA          #IMPLIED  -- field name --
+  size        NUMBER         #IMPLIED  -- rows visible --
+  multiple    (multiple)     #IMPLIED  -- default is single selection --
+  disabled    (disabled)     #IMPLIED  -- unavailable in this context --
+  tabindex    NUMBER         #IMPLIED  -- position in tabbing order --
+  onfocus     %Script;       #IMPLIED  -- the element got the focus --
+  onblur      %Script;       #IMPLIED  -- the element lost the focus --
+  onchange    %Script;       #IMPLIED  -- the element value was changed --
+  %reserved;                           -- reserved for possible future use --
+  >
+
+<!ELEMENT OPTGROUP - - (OPTION)+ -- option group -->
+<!ATTLIST OPTGROUP
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  disabled    (disabled)     #IMPLIED  -- unavailable in this context --
+  label       %Text;         #REQUIRED -- for use in hierarchical menus --
+  >
+
+<!ELEMENT OPTION - O (#PCDATA)         -- selectable choice -->
+<!ATTLIST OPTION
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  selected    (selected)     #IMPLIED
+  disabled    (disabled)     #IMPLIED  -- unavailable in this context --
+  label       %Text;         #IMPLIED  -- for use in hierarchical menus --
+  value       CDATA          #IMPLIED  -- defaults to element content --
+  >
+
+<!ELEMENT TEXTAREA - - (#PCDATA)       -- multi-line text field -->
+<!ATTLIST TEXTAREA
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  name        CDATA          #IMPLIED
+  rows        NUMBER         #REQUIRED
+  cols        NUMBER         #REQUIRED
+  disabled    (disabled)     #IMPLIED  -- unavailable in this context --
+  readonly    (readonly)     #IMPLIED
+  tabindex    NUMBER         #IMPLIED  -- position in tabbing order --
+  accesskey   %Character;    #IMPLIED  -- accessibility key character --
+  onfocus     %Script;       #IMPLIED  -- the element got the focus --
+  onblur      %Script;       #IMPLIED  -- the element lost the focus --
+  onselect    %Script;       #IMPLIED  -- some text was selected --
+  onchange    %Script;       #IMPLIED  -- the element value was changed --
+  %reserved;                           -- reserved for possible future use --
+  >
+
+<!--
+  #PCDATA is to solve the mixed content problem,
+  per specification only whitespace is allowed there!
+ -->
+<!ELEMENT FIELDSET - - (#PCDATA,LEGEND,(%flow;)*) -- form control group -->
+<!ATTLIST FIELDSET
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  >
+
+<!ELEMENT LEGEND - - (%inline;)*       -- fieldset legend -->
+
+<!ATTLIST LEGEND
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  accesskey   %Character;    #IMPLIED  -- accessibility key character --
+  >
+
+<!ELEMENT BUTTON - -
+     (%flow;)* -(A|%formctrl;|FORM|FIELDSET)
+     -- push button -->
+<!ATTLIST BUTTON
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  name        CDATA          #IMPLIED
+  value       CDATA          #IMPLIED  -- sent to server when submitted --
+  type        (button|submit|reset) submit -- for use as form button --
+  disabled    (disabled)     #IMPLIED  -- unavailable in this context --
+  tabindex    NUMBER         #IMPLIED  -- position in tabbing order --
+  accesskey   %Character;    #IMPLIED  -- accessibility key character --
+  onfocus     %Script;       #IMPLIED  -- the element got the focus --
+  onblur      %Script;       #IMPLIED  -- the element lost the focus --
+  %reserved;                           -- reserved for possible future use --
+  >
+
+<!--======================= Tables =======================================-->
+
+<!-- IETF HTML table standard, see [RFC1942] -->
+
+<!--
+ The BORDER attribute sets the thickness of the frame around the
+ table. The default units are screen pixels.
+
+ The FRAME attribute specifies which parts of the frame around
+ the table should be rendered. The values are not the same as
+ CALS to avoid a name clash with the VALIGN attribute.
+
+ The value "border" is included for backwards compatibility with
+ <TABLE BORDER> which yields frame=border and border=implied
+ For <TABLE BORDER=1> you get border=1 and frame=implied. In this
+ case, it is appropriate to treat this as frame=border for backwards
+ compatibility with deployed browsers.
+-->
+<!ENTITY % TFrame "(void|above|below|hsides|lhs|rhs|vsides|box|border)">
+
+<!--
+ The RULES attribute defines which rules to draw between cells:
+
+ If RULES is absent then assume:
+     "none" if BORDER is absent or BORDER=0 otherwise "all"
+-->
+
+<!ENTITY % TRules "(none | groups | rows | cols | all)">
+  
+<!-- horizontal placement of table relative to document -->
+<!ENTITY % TAlign "(left|center|right)">
+
+<!-- horizontal alignment attributes for cell contents -->
+<!ENTITY % cellhalign
+  "align      (left|center|right|justify|char) #IMPLIED
+   char       %Character;    #IMPLIED  -- alignment char, e.g. char=':' --
+   charoff    %Length;       #IMPLIED  -- offset for alignment char --"
+  >
+
+<!-- vertical alignment attributes for cell contents -->
+<!ENTITY % cellvalign
+  "valign     (top|middle|bottom|baseline) #IMPLIED"
+  >
+
+<!ELEMENT TABLE - -
+     (CAPTION?, (COL*|COLGROUP*), THEAD?, TFOOT?, TBODY+)>
+<!ELEMENT CAPTION  - - (%inline;)*     -- table caption -->
+<!ELEMENT THEAD    - O (TR)+           -- table header -->
+<!ELEMENT TFOOT    - O (TR)+           -- table footer -->
+<!ELEMENT TBODY    O O (TR)+           -- table body -->
+<!ELEMENT COLGROUP - O (COL)*          -- table column group -->
+<!ELEMENT COL      - O EMPTY           -- table column -->
+<!ELEMENT TR       - O (TH|TD)+        -- table row -->
+<!ELEMENT (TH|TD)  - O (%flow;)*       -- table header cell, table data cell-->
+
+<!ATTLIST TABLE                        -- table element --
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  summary     %Text;         #IMPLIED  -- purpose/structure for speech output--
+  width       %Length;       #IMPLIED  -- table width --
+  border      %Pixels;       #IMPLIED  -- controls frame width around table --
+  frame       %TFrame;       #IMPLIED  -- which parts of frame to render --
+  rules       %TRules;       #IMPLIED  -- rulings between rows and cols --
+  cellspacing %Length;       #IMPLIED  -- spacing between cells --
+  cellpadding %Length;       #IMPLIED  -- spacing within cells --
+  %reserved;                           -- reserved for possible future use --
+  datapagesize CDATA         #IMPLIED  -- reserved for possible future use --
+  >
+
+
+<!ATTLIST CAPTION
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  >
+
+<!--
+COLGROUP groups a set of COL elements. It allows you to group
+several semantically related columns together.
+-->
+<!ATTLIST COLGROUP
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  span        NUMBER         1         -- default number of columns in group --
+  width       %MultiLength;  #IMPLIED  -- default width for enclosed COLs --
+  %cellhalign;                         -- horizontal alignment in cells --
+  %cellvalign;                         -- vertical alignment in cells --
+  >
+
+<!--
+ COL elements define the alignment properties for cells in
+ one or more columns.
+
+ The WIDTH attribute specifies the width of the columns, e.g.
+
+     width=64        width in screen pixels
+     width=0.5*      relative width of 0.5
+
+ The SPAN attribute causes the attributes of one
+ COL element to apply to more than one column.
+-->
+<!ATTLIST COL                          -- column groups and properties --
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  span        NUMBER         1         -- COL attributes affect N columns --
+  width       %MultiLength;  #IMPLIED  -- column width specification --
+  %cellhalign;                         -- horizontal alignment in cells --
+  %cellvalign;                         -- vertical alignment in cells --
+  >
+
+<!--
+    Use THEAD to duplicate headers when breaking table
+    across page boundaries, or for static headers when
+    TBODY sections are rendered in scrolling panel.
+
+    Use TFOOT to duplicate footers when breaking table
+    across page boundaries, or for static footers when
+    TBODY sections are rendered in scrolling panel.
+
+    Use multiple TBODY sections when rules are needed
+    between groups of table rows.
+-->
+<!ATTLIST (THEAD|TBODY|TFOOT)          -- table section --
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  %cellhalign;                         -- horizontal alignment in cells --
+  %cellvalign;                         -- vertical alignment in cells --
+  >
+
+<!ATTLIST TR                           -- table row --
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  %cellhalign;                         -- horizontal alignment in cells --
+  %cellvalign;                         -- vertical alignment in cells --
+  >
+
+
+<!-- Scope is simpler than headers attribute for common tables -->
+<!ENTITY % Scope "(row|col|rowgroup|colgroup)">
+
+<!-- TH is for headers, TD for data, but for cells acting as both use TD -->
+<!ATTLIST (TH|TD)                      -- header or data cell --
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  abbr        %Text;         #IMPLIED  -- abbreviation for header cell --
+  axis        CDATA          #IMPLIED  -- comma-separated list of related headers--
+  headers     IDREFS         #IMPLIED  -- list of id's for header cells --
+  scope       %Scope;        #IMPLIED  -- scope covered by header cells --
+  rowspan     NUMBER         1         -- number of rows spanned by cell --
+  colspan     NUMBER         1         -- number of cols spanned by cell --
+  %cellhalign;                         -- horizontal alignment in cells --
+  %cellvalign;                         -- vertical alignment in cells --
+  >
+
+
+<!--================ Document Head =======================================-->
+<!-- %head.misc; defined earlier on as "SCRIPT|STYLE|META|LINK|OBJECT" -->
+<!ENTITY % head.content "TITLE & BASE?">
+
+<!ELEMENT HEAD O O (%head.content;) +(%head.misc;) -- document head -->
+<!ATTLIST HEAD
+  %i18n;                               -- lang, dir --
+  profile     %URI;          #IMPLIED  -- named dictionary of meta info --
+  >
+
+<!-- The TITLE element is not considered part of the flow of text.
+       It should be displayed, for example as the page header or
+       window title. Exactly one title is required per document.
+    -->
+<!ELEMENT TITLE - - (#PCDATA) -(%head.misc;) -- document title -->
+<!ATTLIST TITLE %i18n>
+
+
+<!ELEMENT BASE - O EMPTY               -- document base URI -->
+<!ATTLIST BASE
+  href        %URI;          #REQUIRED -- URI that acts as base URI --
+  >
+
+<!ELEMENT META - O EMPTY               -- generic metainformation -->
+<!ATTLIST META
+  %i18n;                               -- lang, dir, for use with content --
+  http-equiv  NAME           #IMPLIED  -- HTTP response header name  --
+  name        NAME           #IMPLIED  -- metainformation name --
+  content     CDATA          #REQUIRED -- associated information --
+  scheme      CDATA          #IMPLIED  -- select form of content --
+  >
+
+<!ELEMENT STYLE - - %StyleSheet        -- style info -->
+<!ATTLIST STYLE
+  %i18n;                               -- lang, dir, for use with title --
+  type        %ContentType;  #REQUIRED -- content type of style language --
+  media       %MediaDesc;    #IMPLIED  -- designed for use with these media --
+  title       %Text;         #IMPLIED  -- advisory title --
+  >
+
+<!ELEMENT SCRIPT - - %Script;          -- script statements -->
+<!ATTLIST SCRIPT
+  charset     %Charset;      #IMPLIED  -- char encoding of linked resource --
+  type        %ContentType;  #REQUIRED -- content type of script language --
+  src         %URI;          #IMPLIED  -- URI for an external script --
+  defer       (defer)        #IMPLIED  -- UA may defer execution of script --
+  event       CDATA          #IMPLIED  -- reserved for possible future use --
+  for         %URI;          #IMPLIED  -- reserved for possible future use --
+  >
+
+<!ELEMENT NOSCRIPT - - (%block;)+
+  -- alternate content container for non script-based rendering -->
+<!ATTLIST NOSCRIPT
+  %attrs;                              -- %coreattrs, %i18n, %events --
+  >
+
+<!--================ Document Structure ==================================-->
+<!ENTITY % html.content "HEAD, BODY">
+
+<!ELEMENT HTML O O (%html.content;)    -- document root element -->
+<!ATTLIST HTML
+  %i18n;                               -- lang, dir --
+  >
diff --git a/node_modules/elementtree/node_modules/sax/examples/switch-bench.js b/node_modules/elementtree/node_modules/sax/examples/switch-bench.js
new file mode 100755
index 0000000..4d3cf14
--- /dev/null
+++ b/node_modules/elementtree/node_modules/sax/examples/switch-bench.js
@@ -0,0 +1,45 @@
+#!/usr/local/bin/node-bench
+
+var Promise = require("events").Promise;
+
+var xml = require("posix").cat("test.xml").wait(),
+  path = require("path"),
+  sax = require("../lib/sax"),
+  saxT = require("../lib/sax-trampoline"),
+  
+  parser = sax.parser(false, {trim:true}),
+  parserT = saxT.parser(false, {trim:true}),
+  
+  sys = require("sys");
+
+
+var count = exports.stepsPerLap = 500,
+  l = xml.length,
+  runs = 0;
+exports.countPerLap = 1000;
+exports.compare = {
+  "switch" : function () {
+    // sys.debug("switch runs: "+runs++);
+    // for (var x = 0; x < l; x += 1000) {
+    //   parser.write(xml.substr(x, 1000))
+    // }
+    // for (var i = 0; i < count; i ++) {
+      parser.write(xml);
+      parser.close();
+    // }
+    // done();
+  },
+  trampoline : function () {
+    // sys.debug("trampoline runs: "+runs++);
+    // for (var x = 0; x < l; x += 1000) {
+    //   parserT.write(xml.substr(x, 1000))
+    // }
+    // for (var i = 0; i < count; i ++) {
+      parserT.write(xml);
+      parserT.close();
+    // }
+    // done();
+  },
+};
+
+sys.debug("rock and roll...");
\ No newline at end of file
diff --git a/node_modules/elementtree/node_modules/sax/examples/test.html b/node_modules/elementtree/node_modules/sax/examples/test.html
new file mode 100644
index 0000000..61f8f1a
--- /dev/null
+++ b/node_modules/elementtree/node_modules/sax/examples/test.html
@@ -0,0 +1,15 @@
+<!doctype html>
+
+<html lang="en">
+<head>
+	<title>testing the parser</title>
+</head>
+<body>
+
+<p>hello
+
+<script>
+
+</script>
+</body>
+</html>
diff --git a/node_modules/elementtree/node_modules/sax/examples/test.xml b/node_modules/elementtree/node_modules/sax/examples/test.xml
new file mode 100644
index 0000000..801292d
--- /dev/null
+++ b/node_modules/elementtree/node_modules/sax/examples/test.xml
@@ -0,0 +1,1254 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE RootElement [
+	<!ENTITY e SYSTEM "001.ent">
+]>
+<RootElement param="value">
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+    <FirstElement>
+        Some Text
+    </FirstElement>
+    <?some_pi some_attr="some_value"?>
+    <!-- this is a comment -- but this isnt part of the comment -->
+    <!-- this is a comment == and this is a part of the comment -->
+    <!-- this is a comment > and this is also part of the thing -->
+    <!invalid comment>
+    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+    <SecondElement param2="something">
+        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+        &#xF8FF;
+    </SecondElement>
+</RootElement>
\ No newline at end of file
diff --git a/node_modules/elementtree/node_modules/sax/lib/sax.js b/node_modules/elementtree/node_modules/sax/lib/sax.js
new file mode 100644
index 0000000..17fb08e
--- /dev/null
+++ b/node_modules/elementtree/node_modules/sax/lib/sax.js
@@ -0,0 +1,1006 @@
+// wrapper for non-node envs
+;(function (sax) {
+
+sax.parser = function (strict, opt) { return new SAXParser(strict, opt) }
+sax.SAXParser = SAXParser
+sax.SAXStream = SAXStream
+sax.createStream = createStream
+
+// When we pass the MAX_BUFFER_LENGTH position, start checking for buffer overruns.
+// When we check, schedule the next check for MAX_BUFFER_LENGTH - (max(buffer lengths)),
+// since that's the earliest that a buffer overrun could occur.  This way, checks are
+// as rare as required, but as often as necessary to ensure never crossing this bound.
+// Furthermore, buffers are only tested at most once per write(), so passing a very
+// large string into write() might have undesirable effects, but this is manageable by
+// the caller, so it is assumed to be safe.  Thus, a call to write() may, in the extreme
+// edge case, result in creating at most one complete copy of the string passed in.
+// Set to Infinity to have unlimited buffers.
+sax.MAX_BUFFER_LENGTH = 64 * 1024
+
+var buffers = [
+  "comment", "sgmlDecl", "textNode", "tagName", "doctype",
+  "procInstName", "procInstBody", "entity", "attribName",
+  "attribValue", "cdata", "script"
+]
+
+sax.EVENTS = // for discoverability.
+  [ "text"
+  , "processinginstruction"
+  , "sgmldeclaration"
+  , "doctype"
+  , "comment"
+  , "attribute"
+  , "opentag"
+  , "closetag"
+  , "opencdata"
+  , "cdata"
+  , "closecdata"
+  , "error"
+  , "end"
+  , "ready"
+  , "script"
+  , "opennamespace"
+  , "closenamespace"
+  ]
+
+function SAXParser (strict, opt) {
+  if (!(this instanceof SAXParser)) return new SAXParser(strict, opt)
+
+  var parser = this
+  clearBuffers(parser)
+  parser.q = parser.c = ""
+  parser.bufferCheckPosition = sax.MAX_BUFFER_LENGTH
+  parser.opt = opt || {}
+  parser.tagCase = parser.opt.lowercasetags ? "toLowerCase" : "toUpperCase"
+  parser.tags = []
+  parser.closed = parser.closedRoot = parser.sawRoot = false
+  parser.tag = parser.error = null
+  parser.strict = !!strict
+  parser.noscript = !!(strict || parser.opt.noscript)
+  parser.state = S.BEGIN
+  parser.ENTITIES = Object.create(sax.ENTITIES)
+  parser.attribList = []
+
+  // namespaces form a prototype chain.
+  // it always points at the current tag,
+  // which protos to its parent tag.
+  if (parser.opt.xmlns) parser.ns = Object.create(rootNS)
+
+  // mostly just for error reporting
+  parser.position = parser.line = parser.column = 0
+  emit(parser, "onready")
+}
+
+if (!Object.create) Object.create = function (o) {
+  function f () { this.__proto__ = o }
+  f.prototype = o
+  return new f
+}
+
+if (!Object.getPrototypeOf) Object.getPrototypeOf = function (o) {
+  return o.__proto__
+}
+
+if (!Object.keys) Object.keys = function (o) {
+  var a = []
+  for (var i in o) if (o.hasOwnProperty(i)) a.push(i)
+  return a
+}
+
+function checkBufferLength (parser) {
+  var maxAllowed = Math.max(sax.MAX_BUFFER_LENGTH, 10)
+    , maxActual = 0
+  for (var i = 0, l = buffers.length; i < l; i ++) {
+    var len = parser[buffers[i]].length
+    if (len > maxAllowed) {
+      // Text/cdata nodes can get big, and since they're buffered,
+      // we can get here under normal conditions.
+      // Avoid issues by emitting the text node now,
+      // so at least it won't get any bigger.
+      switch (buffers[i]) {
+        case "textNode":
+          closeText(parser)
+        break
+
+        case "cdata":
+          emitNode(parser, "oncdata", parser.cdata)
+          parser.cdata = ""
+        break
+
+        case "script":
+          emitNode(parser, "onscript", parser.script)
+          parser.script = ""
+        break
+
+        default:
+          error(parser, "Max buffer length exceeded: "+buffers[i])
+      }
+    }
+    maxActual = Math.max(maxActual, len)
+  }
+  // schedule the next check for the earliest possible buffer overrun.
+  parser.bufferCheckPosition = (sax.MAX_BUFFER_LENGTH - maxActual)
+                             + parser.position
+}
+
+function clearBuffers (parser) {
+  for (var i = 0, l = buffers.length; i < l; i ++) {
+    parser[buffers[i]] = ""
+  }
+}
+
+SAXParser.prototype =
+  { end: function () { end(this) }
+  , write: write
+  , resume: function () { this.error = null; return this }
+  , close: function () { return this.write(null) }
+  , end: function () { return this.write(null) }
+  }
+
+try {
+  var Stream = require("stream").Stream
+} catch (ex) {
+  var Stream = function () {}
+}
+
+
+var streamWraps = sax.EVENTS.filter(function (ev) {
+  return ev !== "error" && ev !== "end"
+})
+
+function createStream (strict, opt) {
+  return new SAXStream(strict, opt)
+}
+
+function SAXStream (strict, opt) {
+  if (!(this instanceof SAXStream)) return new SAXStream(strict, opt)
+
+  Stream.apply(me)
+
+  this._parser = new SAXParser(strict, opt)
+  this.writable = true
+  this.readable = true
+
+
+  var me = this
+
+  this._parser.onend = function () {
+    me.emit("end")
+  }
+
+  this._parser.onerror = function (er) {
+    me.emit("error", er)
+
+    // if didn't throw, then means error was handled.
+    // go ahead and clear error, so we can write again.
+    me._parser.error = null
+  }
+
+  streamWraps.forEach(function (ev) {
+    Object.defineProperty(me, "on" + ev, {
+      get: function () { return me._parser["on" + ev] },
+      set: function (h) {
+        if (!h) {
+          me.removeAllListeners(ev)
+          return me._parser["on"+ev] = h
+        }
+        me.on(ev, h)
+      },
+      enumerable: true,
+      configurable: false
+    })
+  })
+}
+
+SAXStream.prototype = Object.create(Stream.prototype,
+  { constructor: { value: SAXStream } })
+
+SAXStream.prototype.write = function (data) {
+  this._parser.write(data.toString())
+  this.emit("data", data)
+  return true
+}
+
+SAXStream.prototype.end = function (chunk) {
+  if (chunk && chunk.length) this._parser.write(chunk.toString())
+  this._parser.end()
+  return true
+}
+
+SAXStream.prototype.on = function (ev, handler) {
+  var me = this
+  if (!me._parser["on"+ev] && streamWraps.indexOf(ev) !== -1) {
+    me._parser["on"+ev] = function () {
+      var args = arguments.length === 1 ? [arguments[0]]
+               : Array.apply(null, arguments)
+      args.splice(0, 0, ev)
+      me.emit.apply(me, args)
+    }
+  }
+
+  return Stream.prototype.on.call(me, ev, handler)
+}
+
+
+
+// character classes and tokens
+var whitespace = "\r\n\t "
+  // this really needs to be replaced with character classes.
+  // XML allows all manner of ridiculous numbers and digits.
+  , number = "0124356789"
+  , letter = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
+  // (Letter | "_" | ":")
+  , nameStart = letter+"_:"
+  , nameBody = nameStart+number+"-."
+  , quote = "'\""
+  , entity = number+letter+"#"
+  , attribEnd = whitespace + ">"
+  , CDATA = "[CDATA["
+  , DOCTYPE = "DOCTYPE"
+  , XML_NAMESPACE = "http://www.w3.org/XML/1998/namespace"
+  , XMLNS_NAMESPACE = "http://www.w3.org/2000/xmlns/"
+  , rootNS = { xml: XML_NAMESPACE, xmlns: XMLNS_NAMESPACE }
+
+// turn all the string character sets into character class objects.
+whitespace = charClass(whitespace)
+number = charClass(number)
+letter = charClass(letter)
+nameStart = charClass(nameStart)
+nameBody = charClass(nameBody)
+quote = charClass(quote)
+entity = charClass(entity)
+attribEnd = charClass(attribEnd)
+
+function charClass (str) {
+  return str.split("").reduce(function (s, c) {
+    s[c] = true
+    return s
+  }, {})
+}
+
+function is (charclass, c) {
+  return charclass[c]
+}
+
+function not (charclass, c) {
+  return !charclass[c]
+}
+
+var S = 0
+sax.STATE =
+{ BEGIN                     : S++
+, TEXT                      : S++ // general stuff
+, TEXT_ENTITY               : S++ // &amp and such.
+, OPEN_WAKA                 : S++ // <
+, SGML_DECL                 : S++ // <!BLARG
+, SGML_DECL_QUOTED          : S++ // <!BLARG foo "bar
+, DOCTYPE                   : S++ // <!DOCTYPE
+, DOCTYPE_QUOTED            : S++ // <!DOCTYPE "//blah
+, DOCTYPE_DTD               : S++ // <!DOCTYPE "//blah" [ ...
+, DOCTYPE_DTD_QUOTED        : S++ // <!DOCTYPE "//blah" [ "foo
+, COMMENT_STARTING          : S++ // <!-
+, COMMENT                   : S++ // <!--
+, COMMENT_ENDING            : S++ // <!-- blah -
+, COMMENT_ENDED             : S++ // <!-- blah --
+, CDATA                     : S++ // <![CDATA[ something
+, CDATA_ENDING              : S++ // ]
+, CDATA_ENDING_2            : S++ // ]]
+, PROC_INST                 : S++ // <?hi
+, PROC_INST_BODY            : S++ // <?hi there
+, PROC_INST_QUOTED          : S++ // <?hi "there
+, PROC_INST_ENDING          : S++ // <?hi "there" ?
+, OPEN_TAG                  : S++ // <strong
+, OPEN_TAG_SLASH            : S++ // <strong /
+, ATTRIB                    : S++ // <a
+, ATTRIB_NAME               : S++ // <a foo
+, ATTRIB_NAME_SAW_WHITE     : S++ // <a foo _
+, ATTRIB_VALUE              : S++ // <a foo=
+, ATTRIB_VALUE_QUOTED       : S++ // <a foo="bar
+, ATTRIB_VALUE_UNQUOTED     : S++ // <a foo=bar
+, ATTRIB_VALUE_ENTITY_Q     : S++ // <foo bar="&quot;"
+, ATTRIB_VALUE_ENTITY_U     : S++ // <foo bar=&quot;
+, CLOSE_TAG                 : S++ // </a
+, CLOSE_TAG_SAW_WHITE       : S++ // </a   >
+, SCRIPT                    : S++ // <script> ...
+, SCRIPT_ENDING             : S++ // <script> ... <
+}
+
+sax.ENTITIES =
+{ "apos" : "'"
+, "quot" : "\""
+, "amp"  : "&"
+, "gt"   : ">"
+, "lt"   : "<"
+}
+
+for (var S in sax.STATE) sax.STATE[sax.STATE[S]] = S
+
+// shorthand
+S = sax.STATE
+
+function emit (parser, event, data) {
+  parser[event] && parser[event](data)
+}
+
+function emitNode (parser, nodeType, data) {
+  if (parser.textNode) closeText(parser)
+  emit(parser, nodeType, data)
+}
+
+function closeText (parser) {
+  parser.textNode = textopts(parser.opt, parser.textNode)
+  if (parser.textNode) emit(parser, "ontext", parser.textNode)
+  parser.textNode = ""
+}
+
+function textopts (opt, text) {
+  if (opt.trim) text = text.trim()
+  if (opt.normalize) text = text.replace(/\s+/g, " ")
+  return text
+}
+
+function error (parser, er) {
+  closeText(parser)
+  er += "\nLine: "+parser.line+
+        "\nColumn: "+parser.column+
+        "\nChar: "+parser.c
+  er = new Error(er)
+  parser.error = er
+  emit(parser, "onerror", er)
+  return parser
+}
+
+function end (parser) {
+  if (parser.state !== S.TEXT) error(parser, "Unexpected end")
+  closeText(parser)
+  parser.c = ""
+  parser.closed = true
+  emit(parser, "onend")
+  SAXParser.call(parser, parser.strict, parser.opt)
+  return parser
+}
+
+function strictFail (parser, message) {
+  if (parser.strict) error(parser, message)
+}
+
+function newTag (parser) {
+  if (!parser.strict) parser.tagName = parser.tagName[parser.tagCase]()
+  var parent = parser.tags[parser.tags.length - 1] || parser
+    , tag = parser.tag = { name : parser.tagName, attributes : {} }
+
+  // will be overridden if tag contails an xmlns="foo" or xmlns:foo="bar"
+  if (parser.opt.xmlns) tag.ns = parent.ns
+  parser.attribList.length = 0
+}
+
+function qname (name) {
+  var i = name.indexOf(":")
+    , qualName = i < 0 ? [ "", name ] : name.split(":")
+    , prefix = qualName[0]
+    , local = qualName[1]
+
+  // <x "xmlns"="http://foo">
+  if (name === "xmlns") {
+    prefix = "xmlns"
+    local = ""
+  }
+
+  return { prefix: prefix, local: local }
+}
+
+function attrib (parser) {
+  if (parser.opt.xmlns) {
+    var qn = qname(parser.attribName)
+      , prefix = qn.prefix
+      , local = qn.local
+
+    if (prefix === "xmlns") {
+      // namespace binding attribute; push the binding into scope
+      if (local === "xml" && parser.attribValue !== XML_NAMESPACE) {
+        strictFail( parser
+                  , "xml: prefix must be bound to " + XML_NAMESPACE + "\n"
+                  + "Actual: " + parser.attribValue )
+      } else if (local === "xmlns" && parser.attribValue !== XMLNS_NAMESPACE) {
+        strictFail( parser
+                  , "xmlns: prefix must be bound to " + XMLNS_NAMESPACE + "\n"
+                  + "Actual: " + parser.attribValue )
+      } else {
+        var tag = parser.tag
+          , parent = parser.tags[parser.tags.length - 1] || parser
+        if (tag.ns === parent.ns) {
+          tag.ns = Object.create(parent.ns)
+        }
+        tag.ns[local] = parser.attribValue
+      }
+    }
+
+    // defer onattribute events until all attributes have been seen
+    // so any new bindings can take effect; preserve attribute order
+    // so deferred events can be emitted in document order
+    parser.attribList.push([parser.attribName, parser.attribValue])
+  } else {
+    // in non-xmlns mode, we can emit the event right away
+    parser.tag.attributes[parser.attribName] = parser.attribValue
+    emitNode( parser
+            , "onattribute"
+            , { name: parser.attribName
+              , value: parser.attribValue } )
+  }
+
+  parser.attribName = parser.attribValue = ""
+}
+
+function openTag (parser, selfClosing) {
+  if (parser.opt.xmlns) {
+    // emit namespace binding events
+    var tag = parser.tag
+
+    // add namespace info to tag
+    var qn = qname(parser.tagName)
+    tag.prefix = qn.prefix
+    tag.local = qn.local
+    tag.uri = tag.ns[qn.prefix] || qn.prefix
+
+    if (tag.prefix && !tag.uri) {
+      strictFail(parser, "Unbound namespace prefix: "
+                       + JSON.stringify(parser.tagName))
+    }
+
+    var parent = parser.tags[parser.tags.length - 1] || parser
+    if (tag.ns && parent.ns !== tag.ns) {
+      Object.keys(tag.ns).forEach(function (p) {
+        emitNode( parser
+                , "onopennamespace"
+                , { prefix: p , uri: tag.ns[p] } )
+      })
+    }
+
+    // handle deferred onattribute events
+    for (var i = 0, l = parser.attribList.length; i < l; i ++) {
+      var nv = parser.attribList[i]
+      var name = nv[0]
+        , value = nv[1]
+        , qualName = qname(name)
+        , prefix = qualName.prefix
+        , local = qualName.local
+        , uri = tag.ns[prefix] || ""
+        , a = { name: name
+              , value: value
+              , prefix: prefix
+              , local: local
+              , uri: uri
+              }
+
+      // if there's any attributes with an undefined namespace,
+      // then fail on them now.
+      if (prefix && prefix != "xmlns" && !uri) {
+        strictFail(parser, "Unbound namespace prefix: "
+                         + JSON.stringify(prefix))
+        a.uri = prefix
+      }
+      parser.tag.attributes[name] = a
+      emitNode(parser, "onattribute", a)
+    }
+    parser.attribList.length = 0
+  }
+
+  // process the tag
+  parser.sawRoot = true
+  parser.tags.push(parser.tag)
+  emitNode(parser, "onopentag", parser.tag)
+  if (!selfClosing) {
+    // special case for <script> in non-strict mode.
+    if (!parser.noscript && parser.tagName.toLowerCase() === "script") {
+      parser.state = S.SCRIPT
+    } else {
+      parser.state = S.TEXT
+    }
+    parser.tag = null
+    parser.tagName = ""
+  }
+  parser.attribName = parser.attribValue = ""
+  parser.attribList.length = 0
+}
+
+function closeTag (parser) {
+  if (!parser.tagName) {
+    strictFail(parser, "Weird empty close tag.")
+    parser.textNode += "</>"
+    parser.state = S.TEXT
+    return
+  }
+  // first make sure that the closing tag actually exists.
+  // <a><b></c></b></a> will close everything, otherwise.
+  var t = parser.tags.length
+  var tagName = parser.tagName
+  if (!parser.strict) tagName = tagName[parser.tagCase]()
+  var closeTo = tagName
+  while (t --) {
+    var close = parser.tags[t]
+    if (close.name !== closeTo) {
+      // fail the first time in strict mode
+      strictFail(parser, "Unexpected close tag")
+    } else break
+  }
+
+  // didn't find it.  we already failed for strict, so just abort.
+  if (t < 0) {
+    strictFail(parser, "Unmatched closing tag: "+parser.tagName)
+    parser.textNode += "</" + parser.tagName + ">"
+    parser.state = S.TEXT
+    return
+  }
+  parser.tagName = tagName
+  var s = parser.tags.length
+  while (s --> t) {
+    var tag = parser.tag = parser.tags.pop()
+    parser.tagName = parser.tag.name
+    emitNode(parser, "onclosetag", parser.tagName)
+
+    var x = {}
+    for (var i in tag.ns) x[i] = tag.ns[i]
+
+    var parent = parser.tags[parser.tags.length - 1] || parser
+    if (parser.opt.xmlns && tag.ns !== parent.ns) {
+      // remove namespace bindings introduced by tag
+      Object.keys(tag.ns).forEach(function (p) {
+        var n = tag.ns[p]
+        emitNode(parser, "onclosenamespace", { prefix: p, uri: n })
+      })
+    }
+  }
+  if (t === 0) parser.closedRoot = true
+  parser.tagName = parser.attribValue = parser.attribName = ""
+  parser.attribList.length = 0
+  parser.state = S.TEXT
+}
+
+function parseEntity (parser) {
+  var entity = parser.entity.toLowerCase()
+    , num
+    , numStr = ""
+  if (parser.ENTITIES[entity]) return parser.ENTITIES[entity]
+  if (entity.charAt(0) === "#") {
+    if (entity.charAt(1) === "x") {
+      entity = entity.slice(2)
+      num = parseInt(entity, 16)
+      numStr = num.toString(16)
+    } else {
+      entity = entity.slice(1)
+      num = parseInt(entity, 10)
+      numStr = num.toString(10)
+    }
+  }
+  entity = entity.replace(/^0+/, "")
+  if (numStr.toLowerCase() !== entity) {
+    strictFail(parser, "Invalid character entity")
+    return "&"+parser.entity + ";"
+  }
+  return String.fromCharCode(num)
+}
+
+function write (chunk) {
+  var parser = this
+  if (this.error) throw this.error
+  if (parser.closed) return error(parser,
+    "Cannot write after close. Assign an onready handler.")
+  if (chunk === null) return end(parser)
+  var i = 0, c = ""
+  while (parser.c = c = chunk.charAt(i++)) {
+    parser.position ++
+    if (c === "\n") {
+      parser.line ++
+      parser.column = 0
+    } else parser.column ++
+    switch (parser.state) {
+
+      case S.BEGIN:
+        if (c === "<") parser.state = S.OPEN_WAKA
+        else if (not(whitespace,c)) {
+          // have to process this as a text node.
+          // weird, but happens.
+          strictFail(parser, "Non-whitespace before first tag.")
+          parser.textNode = c
+          parser.state = S.TEXT
+        }
+      continue
+
+      case S.TEXT:
+        if (parser.sawRoot && !parser.closedRoot) {
+          var starti = i-1
+          while (c && c!=="<" && c!=="&") {
+            c = chunk.charAt(i++)
+            if (c) {
+              parser.position ++
+              if (c === "\n") {
+                parser.line ++
+                parser.column = 0
+              } else parser.column ++
+            }
+          }
+          parser.textNode += chunk.substring(starti, i-1)
+        }
+        if (c === "<") parser.state = S.OPEN_WAKA
+        else {
+          if (not(whitespace, c) && (!parser.sawRoot || parser.closedRoot))
+            strictFail("Text data outside of root node.")
+          if (c === "&") parser.state = S.TEXT_ENTITY
+          else parser.textNode += c
+        }
+      continue
+
+      case S.SCRIPT:
+        // only non-strict
+        if (c === "<") {
+          parser.state = S.SCRIPT_ENDING
+        } else parser.script += c
+      continue
+
+      case S.SCRIPT_ENDING:
+        if (c === "/") {
+          emitNode(parser, "onscript", parser.script)
+          parser.state = S.CLOSE_TAG
+          parser.script = ""
+          parser.tagName = ""
+        } else {
+          parser.script += "<" + c
+          parser.state = S.SCRIPT
+        }
+      continue
+
+      case S.OPEN_WAKA:
+        // either a /, ?, !, or text is coming next.
+        if (c === "!") {
+          parser.state = S.SGML_DECL
+          parser.sgmlDecl = ""
+        } else if (is(whitespace, c)) {
+          // wait for it...
+        } else if (is(nameStart,c)) {
+          parser.startTagPosition = parser.position - 1
+          parser.state = S.OPEN_TAG
+          parser.tagName = c
+        } else if (c === "/") {
+          parser.startTagPosition = parser.position - 1
+          parser.state = S.CLOSE_TAG
+          parser.tagName = ""
+        } else if (c === "?") {
+          parser.state = S.PROC_INST
+          parser.procInstName = parser.procInstBody = ""
+        } else {
+          strictFail(parser, "Unencoded <")
+          parser.textNode += "<" + c
+          parser.state = S.TEXT
+        }
+      continue
+
+      case S.SGML_DECL:
+        if ((parser.sgmlDecl+c).toUpperCase() === CDATA) {
+          emitNode(parser, "onopencdata")
+          parser.state = S.CDATA
+          parser.sgmlDecl = ""
+          parser.cdata = ""
+        } else if (parser.sgmlDecl+c === "--") {
+          parser.state = S.COMMENT
+          parser.comment = ""
+          parser.sgmlDecl = ""
+        } else if ((parser.sgmlDecl+c).toUpperCase() === DOCTYPE) {
+          parser.state = S.DOCTYPE
+          if (parser.doctype || parser.sawRoot) strictFail(parser,
+            "Inappropriately located doctype declaration")
+          parser.doctype = ""
+          parser.sgmlDecl = ""
+        } else if (c === ">") {
+          emitNode(parser, "onsgmldeclaration", parser.sgmlDecl)
+          parser.sgmlDecl = ""
+          parser.state = S.TEXT
+        } else if (is(quote, c)) {
+          parser.state = S.SGML_DECL_QUOTED
+          parser.sgmlDecl += c
+        } else parser.sgmlDecl += c
+      continue
+
+      case S.SGML_DECL_QUOTED:
+        if (c === parser.q) {
+          parser.state = S.SGML_DECL
+          parser.q = ""
+        }
+        parser.sgmlDecl += c
+      continue
+
+      case S.DOCTYPE:
+        if (c === ">") {
+          parser.state = S.TEXT
+          emitNode(parser, "ondoctype", parser.doctype)
+          parser.doctype = true // just remember that we saw it.
+        } else {
+          parser.doctype += c
+          if (c === "[") parser.state = S.DOCTYPE_DTD
+          else if (is(quote, c)) {
+            parser.state = S.DOCTYPE_QUOTED
+            parser.q = c
+          }
+        }
+      continue
+
+      case S.DOCTYPE_QUOTED:
+        parser.doctype += c
+        if (c === parser.q) {
+          parser.q = ""
+          parser.state = S.DOCTYPE
+        }
+      continue
+
+      case S.DOCTYPE_DTD:
+        parser.doctype += c
+        if (c === "]") parser.state = S.DOCTYPE
+        else if (is(quote,c)) {
+          parser.state = S.DOCTYPE_DTD_QUOTED
+          parser.q = c
+        }
+      continue
+
+      case S.DOCTYPE_DTD_QUOTED:
+        parser.doctype += c
+        if (c === parser.q) {
+          parser.state = S.DOCTYPE_DTD
+          parser.q = ""
+        }
+      continue
+
+      case S.COMMENT:
+        if (c === "-") parser.state = S.COMMENT_ENDING
+        else parser.comment += c
+      continue
+
+      case S.COMMENT_ENDING:
+        if (c === "-") {
+          parser.state = S.COMMENT_ENDED
+          parser.comment = textopts(parser.opt, parser.comment)
+          if (parser.comment) emitNode(parser, "oncomment", parser.comment)
+          parser.comment = ""
+        } else {
+          parser.comment += "-" + c
+          parser.state = S.COMMENT
+        }
+      continue
+
+      case S.COMMENT_ENDED:
+        if (c !== ">") {
+          strictFail(parser, "Malformed comment")
+          // allow <!-- blah -- bloo --> in non-strict mode,
+          // which is a comment of " blah -- bloo "
+          parser.comment += "--" + c
+          parser.state = S.COMMENT
+        } else parser.state = S.TEXT
+      continue
+
+      case S.CDATA:
+        if (c === "]") parser.state = S.CDATA_ENDING
+        else parser.cdata += c
+      continue
+
+      case S.CDATA_ENDING:
+        if (c === "]") parser.state = S.CDATA_ENDING_2
+        else {
+          parser.cdata += "]" + c
+          parser.state = S.CDATA
+        }
+      continue
+
+      case S.CDATA_ENDING_2:
+        if (c === ">") {
+          if (parser.cdata) emitNode(parser, "oncdata", parser.cdata)
+          emitNode(parser, "onclosecdata")
+          parser.cdata = ""
+          parser.state = S.TEXT
+        } else if (c === "]") {
+          parser.cdata += "]"
+        } else {
+          parser.cdata += "]]" + c
+          parser.state = S.CDATA
+        }
+      continue
+
+      case S.PROC_INST:
+        if (c === "?") parser.state = S.PROC_INST_ENDING
+        else if (is(whitespace, c)) parser.state = S.PROC_INST_BODY
+        else parser.procInstName += c
+      continue
+
+      case S.PROC_INST_BODY:
+        if (!parser.procInstBody && is(whitespace, c)) continue
+        else if (c === "?") parser.state = S.PROC_INST_ENDING
+        else if (is(quote, c)) {
+          parser.state = S.PROC_INST_QUOTED
+          parser.q = c
+          parser.procInstBody += c
+        } else parser.procInstBody += c
+      continue
+
+      case S.PROC_INST_ENDING:
+        if (c === ">") {
+          emitNode(parser, "onprocessinginstruction", {
+            name : parser.procInstName,
+            body : parser.procInstBody
+          })
+          parser.procInstName = parser.procInstBody = ""
+          parser.state = S.TEXT
+        } else {
+          parser.procInstBody += "?" + c
+          parser.state = S.PROC_INST_BODY
+        }
+      continue
+
+      case S.PROC_INST_QUOTED:
+        parser.procInstBody += c
+        if (c === parser.q) {
+          parser.state = S.PROC_INST_BODY
+          parser.q = ""
+        }
+      continue
+
+      case S.OPEN_TAG:
+        if (is(nameBody, c)) parser.tagName += c
+        else {
+          newTag(parser)
+          if (c === ">") openTag(parser)
+          else if (c === "/") parser.state = S.OPEN_TAG_SLASH
+          else {
+            if (not(whitespace, c)) strictFail(
+              parser, "Invalid character in tag name")
+            parser.state = S.ATTRIB
+          }
+        }
+      continue
+
+      case S.OPEN_TAG_SLASH:
+        if (c === ">") {
+          openTag(parser, true)
+          closeTag(parser)
+        } else {
+          strictFail(parser, "Forward-slash in opening tag not followed by >")
+          parser.state = S.ATTRIB
+        }
+      continue
+
+      case S.ATTRIB:
+        // haven't read the attribute name yet.
+        if (is(whitespace, c)) continue
+        else if (c === ">") openTag(parser)
+        else if (c === "/") parser.state = S.OPEN_TAG_SLASH
+        else if (is(nameStart, c)) {
+          parser.attribName = c
+          parser.attribValue = ""
+          parser.state = S.ATTRIB_NAME
+        } else strictFail(parser, "Invalid attribute name")
+      continue
+
+      case S.ATTRIB_NAME:
+        if (c === "=") parser.state = S.ATTRIB_VALUE
+        else if (is(whitespace, c)) parser.state = S.ATTRIB_NAME_SAW_WHITE
+        else if (is(nameBody, c)) parser.attribName += c
+        else strictFail(parser, "Invalid attribute name")
+      continue
+
+      case S.ATTRIB_NAME_SAW_WHITE:
+        if (c === "=") parser.state = S.ATTRIB_VALUE
+        else if (is(whitespace, c)) continue
+        else {
+          strictFail(parser, "Attribute without value")
+          parser.tag.attributes[parser.attribName] = ""
+          parser.attribValue = ""
+          emitNode(parser, "onattribute",
+                   { name : parser.attribName, value : "" })
+          parser.attribName = ""
+          if (c === ">") openTag(parser)
+          else if (is(nameStart, c)) {
+            parser.attribName = c
+            parser.state = S.ATTRIB_NAME
+          } else {
+            strictFail(parser, "Invalid attribute name")
+            parser.state = S.ATTRIB
+          }
+        }
+      continue
+
+      case S.ATTRIB_VALUE:
+        if (is(whitespace, c)) continue
+        else if (is(quote, c)) {
+          parser.q = c
+          parser.state = S.ATTRIB_VALUE_QUOTED
+        } else {
+          strictFail(parser, "Unquoted attribute value")
+          parser.state = S.ATTRIB_VALUE_UNQUOTED
+          parser.attribValue = c
+        }
+      continue
+
+      case S.ATTRIB_VALUE_QUOTED:
+        if (c !== parser.q) {
+          if (c === "&") parser.state = S.ATTRIB_VALUE_ENTITY_Q
+          else parser.attribValue += c
+          continue
+        }
+        attrib(parser)
+        parser.q = ""
+        parser.state = S.ATTRIB
+      continue
+
+      case S.ATTRIB_VALUE_UNQUOTED:
+        if (not(attribEnd,c)) {
+          if (c === "&") parser.state = S.ATTRIB_VALUE_ENTITY_U
+          else parser.attribValue += c
+          continue
+        }
+        attrib(parser)
+        if (c === ">") openTag(parser)
+        else parser.state = S.ATTRIB
+      continue
+
+      case S.CLOSE_TAG:
+        if (!parser.tagName) {
+          if (is(whitespace, c)) continue
+          else if (not(nameStart, c)) strictFail(parser,
+            "Invalid tagname in closing tag.")
+          else parser.tagName = c
+        }
+        else if (c === ">") closeTag(parser)
+        else if (is(nameBody, c)) parser.tagName += c
+        else {
+          if (not(whitespace, c)) strictFail(parser,
+            "Invalid tagname in closing tag")
+          parser.state = S.CLOSE_TAG_SAW_WHITE
+        }
+      continue
+
+      case S.CLOSE_TAG_SAW_WHITE:
+        if (is(whitespace, c)) continue
+        if (c === ">") closeTag(parser)
+        else strictFail("Invalid characters in closing tag")
+      continue
+
+      case S.TEXT_ENTITY:
+      case S.ATTRIB_VALUE_ENTITY_Q:
+      case S.ATTRIB_VALUE_ENTITY_U:
+        switch(parser.state) {
+          case S.TEXT_ENTITY:
+            var returnState = S.TEXT, buffer = "textNode"
+          break
+
+          case S.ATTRIB_VALUE_ENTITY_Q:
+            var returnState = S.ATTRIB_VALUE_QUOTED, buffer = "attribValue"
+          break
+
+          case S.ATTRIB_VALUE_ENTITY_U:
+            var returnState = S.ATTRIB_VALUE_UNQUOTED, buffer = "attribValue"
+          break
+        }
+        if (c === ";") {
+          parser[buffer] += parseEntity(parser)
+          parser.entity = ""
+          parser.state = returnState
+        }
+        else if (is(entity, c)) parser.entity += c
+        else {
+          strictFail("Invalid character entity")
+          parser[buffer] += "&" + parser.entity + c
+          parser.entity = ""
+          parser.state = returnState
+        }
+      continue
+
+      default:
+        throw new Error(parser, "Unknown state: " + parser.state)
+    }
+  } // while
+  // cdata blocks can get very big under normal conditions. emit and move on.
+  // if (parser.state === S.CDATA && parser.cdata) {
+  //   emitNode(parser, "oncdata", parser.cdata)
+  //   parser.cdata = ""
+  // }
+  if (parser.position >= parser.bufferCheckPosition) checkBufferLength(parser)
+  return parser
+}
+
+})(typeof exports === "undefined" ? sax = {} : exports)
diff --git a/node_modules/elementtree/node_modules/sax/package.json b/node_modules/elementtree/node_modules/sax/package.json
new file mode 100644
index 0000000..52c3b23
--- /dev/null
+++ b/node_modules/elementtree/node_modules/sax/package.json
@@ -0,0 +1,89 @@
+{
+  "name": "sax",
+  "description": "An evented streaming XML parser in JavaScript",
+  "author": {
+    "name": "Isaac Z. Schlueter",
+    "email": "i@izs.me",
+    "url": "http://blog.izs.me/"
+  },
+  "version": "0.3.5",
+  "main": "lib/sax.js",
+  "license": {
+    "type": "MIT",
+    "url": "https://raw.github.com/isaacs/sax-js/master/LICENSE"
+  },
+  "scripts": {
+    "test": "node test/index.js"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/isaacs/sax-js.git"
+  },
+  "_npmUser": {
+    "name": "isaacs",
+    "email": "i@izs.me"
+  },
+  "_id": "sax@0.3.5",
+  "contributors": [
+    {
+      "name": "Isaac Z. Schlueter",
+      "email": "i@izs.me"
+    },
+    {
+      "name": "Stein Martin Hustad",
+      "email": "stein@hustad.com"
+    },
+    {
+      "name": "Mikeal Rogers",
+      "email": "mikeal.rogers@gmail.com"
+    },
+    {
+      "name": "Laurie Harper",
+      "email": "laurie@holoweb.net"
+    },
+    {
+      "name": "Jann Horn",
+      "email": "jann@Jann-PC.fritz.box"
+    },
+    {
+      "name": "Elijah Insua",
+      "email": "tmpvar@gmail.com"
+    },
+    {
+      "name": "Henry Rawas",
+      "email": "henryr@schakra.com"
+    },
+    {
+      "name": "Justin Makeig",
+      "email": "jmpublic@makeig.com"
+    }
+  ],
+  "dependencies": {},
+  "devDependencies": {},
+  "engines": {
+    "node": "*"
+  },
+  "_engineSupported": true,
+  "_npmVersion": "1.1.0-beta-7",
+  "_nodeVersion": "v0.6.7-pre",
+  "_defaultsLoaded": true,
+  "dist": {
+    "shasum": "88fcfc1f73c0c8bbd5b7c776b6d3f3501eed073d",
+    "tarball": "http://registry.npmjs.org/sax/-/sax-0.3.5.tgz"
+  },
+  "maintainers": [
+    {
+      "name": "isaacs",
+      "email": "i@izs.me"
+    }
+  ],
+  "directories": {},
+  "_shasum": "88fcfc1f73c0c8bbd5b7c776b6d3f3501eed073d",
+  "_resolved": "https://registry.npmjs.org/sax/-/sax-0.3.5.tgz",
+  "_from": "sax@0.3.5",
+  "bugs": {
+    "url": "https://github.com/isaacs/sax-js/issues"
+  },
+  "readme": "ERROR: No README data found!",
+  "homepage": "https://github.com/isaacs/sax-js#readme"
+}
diff --git a/node_modules/elementtree/node_modules/sax/test/buffer-overrun.js b/node_modules/elementtree/node_modules/sax/test/buffer-overrun.js
new file mode 100644
index 0000000..8d12fac
--- /dev/null
+++ b/node_modules/elementtree/node_modules/sax/test/buffer-overrun.js
@@ -0,0 +1,25 @@
+// set this really low so that I don't have to put 64 MB of xml in here.
+var sax = require("../lib/sax")
+var bl = sax.MAX_BUFFER_LENGTH
+sax.MAX_BUFFER_LENGTH = 5;
+
+require(__dirname).test({
+  expect : [
+    ["error", "Max buffer length exceeded: tagName\nLine: 0\nColumn: 15\nChar: "],
+    ["error", "Max buffer length exceeded: tagName\nLine: 0\nColumn: 30\nChar: "],
+    ["error", "Max buffer length exceeded: tagName\nLine: 0\nColumn: 45\nChar: "],
+    ["opentag", {
+     "name": "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ",
+     "attributes": {}
+    }],
+    ["text", "yo"],
+    ["closetag", "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ"]
+  ]
+}).write("<abcdefghijklmn")
+  .write("opqrstuvwxyzABC")
+  .write("DEFGHIJKLMNOPQR")
+  .write("STUVWXYZ>")
+  .write("yo")
+  .write("</abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ>")
+  .close();
+sax.MAX_BUFFER_LENGTH = bl
diff --git a/node_modules/elementtree/node_modules/sax/test/cdata-chunked.js b/node_modules/elementtree/node_modules/sax/test/cdata-chunked.js
new file mode 100644
index 0000000..ccd5ee6
--- /dev/null
+++ b/node_modules/elementtree/node_modules/sax/test/cdata-chunked.js
@@ -0,0 +1,11 @@
+
+require(__dirname).test({
+  expect : [
+    ["opentag", {"name": "R","attributes": {}}],
+    ["opencdata", undefined],
+    ["cdata", " this is character data  "],
+    ["closecdata", undefined],
+    ["closetag", "R"]
+  ]
+}).write("<r><![CDATA[ this is ").write("character data  ").write("]]></r>").close();
+
diff --git a/node_modules/elementtree/node_modules/sax/test/cdata-end-split.js b/node_modules/elementtree/node_modules/sax/test/cdata-end-split.js
new file mode 100644
index 0000000..b41bd00
--- /dev/null
+++ b/node_modules/elementtree/node_modules/sax/test/cdata-end-split.js
@@ -0,0 +1,15 @@
+
+require(__dirname).test({
+  expect : [
+    ["opentag", {"name": "R","attributes": {}}],
+    ["opencdata", undefined],
+    ["cdata", " this is "],
+    ["closecdata", undefined],
+    ["closetag", "R"]
+  ]
+})
+  .write("<r><![CDATA[ this is ]")
+  .write("]>")
+  .write("</r>")
+  .close();
+
diff --git a/node_modules/elementtree/node_modules/sax/test/cdata-fake-end.js b/node_modules/elementtree/node_modules/sax/test/cdata-fake-end.js
new file mode 100644
index 0000000..07aeac4
--- /dev/null
+++ b/node_modules/elementtree/node_modules/sax/test/cdata-fake-end.js
@@ -0,0 +1,28 @@
+
+var p = require(__dirname).test({
+  expect : [
+    ["opentag", {"name": "R","attributes": {}}],
+    ["opencdata", undefined],
+    ["cdata", "[[[[[[[[]]]]]]]]"],
+    ["closecdata", undefined],
+    ["closetag", "R"]
+  ]
+})
+var x = "<r><![CDATA[[[[[[[[[]]]]]]]]]]></r>"
+for (var i = 0; i < x.length ; i ++) {
+  p.write(x.charAt(i))
+}
+p.close();
+
+
+var p2 = require(__dirname).test({
+  expect : [
+    ["opentag", {"name": "R","attributes": {}}],
+    ["opencdata", undefined],
+    ["cdata", "[[[[[[[[]]]]]]]]"],
+    ["closecdata", undefined],
+    ["closetag", "R"]
+  ]
+})
+var x = "<r><![CDATA[[[[[[[[[]]]]]]]]]]></r>"
+p2.write(x).close();
diff --git a/node_modules/elementtree/node_modules/sax/test/cdata-multiple.js b/node_modules/elementtree/node_modules/sax/test/cdata-multiple.js
new file mode 100644
index 0000000..dab2015
--- /dev/null
+++ b/node_modules/elementtree/node_modules/sax/test/cdata-multiple.js
@@ -0,0 +1,15 @@
+
+require(__dirname).test({
+  expect : [
+    ["opentag", {"name": "R","attributes": {}}],
+    ["opencdata", undefined],
+    ["cdata", " this is "],
+    ["closecdata", undefined],
+    ["opencdata", undefined],
+    ["cdata", "character data  "],
+    ["closecdata", undefined],
+    ["closetag", "R"]
+  ]
+}).write("<r><![CDATA[ this is ]]>").write("<![CDA").write("T").write("A[")
+  .write("character data  ").write("]]></r>").close();
+
diff --git a/node_modules/elementtree/node_modules/sax/test/cdata.js b/node_modules/elementtree/node_modules/sax/test/cdata.js
new file mode 100644
index 0000000..0f09cce
--- /dev/null
+++ b/node_modules/elementtree/node_modules/sax/test/cdata.js
@@ -0,0 +1,10 @@
+require(__dirname).test({
+  xml : "<r><![CDATA[ this is character data  ]]></r>",
+  expect : [
+    ["opentag", {"name": "R","attributes": {}}],
+    ["opencdata", undefined],
+    ["cdata", " this is character data  "],
+    ["closecdata", undefined],
+    ["closetag", "R"]
+  ]
+});
diff --git a/node_modules/elementtree/node_modules/sax/test/index.js b/node_modules/elementtree/node_modules/sax/test/index.js
new file mode 100644
index 0000000..d4e1ef4
--- /dev/null
+++ b/node_modules/elementtree/node_modules/sax/test/index.js
@@ -0,0 +1,86 @@
+var globalsBefore = JSON.stringify(Object.keys(global))
+  , util = require("util")
+  , assert = require("assert")
+  , fs = require("fs")
+  , path = require("path")
+  , sax = require("../lib/sax")
+
+exports.sax = sax
+
+// handy way to do simple unit tests
+// if the options contains an xml string, it'll be written and the parser closed.
+// otherwise, it's assumed that the test will write and close.
+exports.test = function test (options) {
+  var xml = options.xml
+    , parser = sax.parser(options.strict, options.opt)
+    , expect = options.expect
+    , e = 0
+  sax.EVENTS.forEach(function (ev) {
+    parser["on" + ev] = function (n) {
+      if (process.env.DEBUG) {
+        console.error({ expect: expect[e]
+                      , actual: [ev, n] })
+      }
+      if (e >= expect.length && (ev === "end" || ev === "ready")) return
+      assert.ok( e < expect.length,
+        "expectation #"+e+" "+util.inspect(expect[e])+"\n"+
+        "Unexpected event: "+ev+" "+(n ? util.inspect(n) : ""))
+      var inspected = n instanceof Error ? "\n"+ n.message : util.inspect(n)
+      assert.equal(ev, expect[e][0],
+        "expectation #"+e+"\n"+
+        "Didn't get expected event\n"+
+        "expect: "+expect[e][0] + " " +util.inspect(expect[e][1])+"\n"+
+        "actual: "+ev+" "+inspected+"\n")
+      if (ev === "error") assert.equal(n.message, expect[e][1])
+      else assert.deepEqual(n, expect[e][1],
+        "expectation #"+e+"\n"+
+        "Didn't get expected argument\n"+
+        "expect: "+expect[e][0] + " " +util.inspect(expect[e][1])+"\n"+
+        "actual: "+ev+" "+inspected+"\n")
+      e++
+      if (ev === "error") parser.resume()
+    }
+  })
+  if (xml) parser.write(xml).close()
+  return parser
+}
+
+if (module === require.main) {
+  var running = true
+    , failures = 0
+
+  function fail (file, er) {
+    util.error("Failed: "+file)
+    util.error(er.stack || er.message)
+    failures ++
+  }
+
+  fs.readdir(__dirname, function (error, files) {
+    files = files.filter(function (file) {
+      return (/\.js$/.exec(file) && file !== 'index.js')
+    })
+    var n = files.length
+      , i = 0
+    console.log("0.." + n)
+    files.forEach(function (file) {
+      // run this test.
+      try {
+        require(path.resolve(__dirname, file))
+        var globalsAfter = JSON.stringify(Object.keys(global))
+        if (globalsAfter !== globalsBefore) {
+          var er = new Error("new globals introduced\n"+
+                             "expected: "+globalsBefore+"\n"+
+                             "actual:   "+globalsAfter)
+          globalsBefore = globalsAfter
+          throw er
+        }
+        console.log("ok " + (++i) + " - " + file)
+      } catch (er) {
+        console.log("not ok "+ (++i) + " - " + file)
+        fail(file, er)
+      }
+    })
+    if (!failures) return console.log("#all pass")
+    else return console.error(failures + " failure" + (failures > 1 ? "s" : ""))
+  })
+}
diff --git a/node_modules/elementtree/node_modules/sax/test/issue-23.js b/node_modules/elementtree/node_modules/sax/test/issue-23.js
new file mode 100644
index 0000000..e7991b2
--- /dev/null
+++ b/node_modules/elementtree/node_modules/sax/test/issue-23.js
@@ -0,0 +1,43 @@
+
+require(__dirname).test
+  ( { xml :
+      "<compileClassesResponse>"+
+        "<result>"+
+          "<bodyCrc>653724009</bodyCrc>"+
+          "<column>-1</column>"+
+          "<id>01pG0000002KoSUIA0</id>"+
+          "<line>-1</line>"+
+          "<name>CalendarController</name>"+
+          "<success>true</success>"+
+        "</result>"+
+      "</compileClassesResponse>"
+
+    , expect :
+      [ [ "opentag", { name: "COMPILECLASSESRESPONSE", attributes: {} } ]
+      , [ "opentag", { name : "RESULT", attributes: {} } ]
+      , [ "opentag", { name: "BODYCRC", attributes: {} } ]
+      , [ "text", "653724009" ]
+      , [ "closetag", "BODYCRC" ]
+      , [ "opentag", { name: "COLUMN", attributes: {} } ]
+      , [ "text", "-1" ]
+      , [ "closetag", "COLUMN" ]
+      , [ "opentag", { name: "ID", attributes: {} } ]
+      , [ "text", "01pG0000002KoSUIA0" ]
+      , [ "closetag", "ID" ]
+      , [ "opentag", {name: "LINE", attributes: {} } ]
+      , [ "text", "-1" ]
+      , [ "closetag", "LINE" ]
+      , [ "opentag", {name: "NAME", attributes: {} } ]
+      , [ "text", "CalendarController" ]
+      , [ "closetag", "NAME" ]
+      , [ "opentag", {name: "SUCCESS", attributes: {} } ]
+      , [ "text", "true" ]
+      , [ "closetag", "SUCCESS" ]
+      , [ "closetag", "RESULT" ]
+      , [ "closetag", "COMPILECLASSESRESPONSE" ]
+      ]
+    , strict : false
+    , opt : {}
+    }
+  )
+
diff --git a/node_modules/elementtree/node_modules/sax/test/issue-30.js b/node_modules/elementtree/node_modules/sax/test/issue-30.js
new file mode 100644
index 0000000..c2cc809
--- /dev/null
+++ b/node_modules/elementtree/node_modules/sax/test/issue-30.js
@@ -0,0 +1,24 @@
+// https://github.com/isaacs/sax-js/issues/33
+require(__dirname).test
+  ( { xml : "<xml>\n"+
+            "<!-- \n"+
+            "  comment with a single dash- in it\n"+
+            "-->\n"+
+            "<data/>\n"+
+            "</xml>"
+
+    , expect :
+      [ [ "opentag", { name: "xml", attributes: {} } ]
+      , [ "text", "\n" ]
+      , [ "comment", " \n  comment with a single dash- in it\n" ]
+      , [ "text", "\n" ]
+      , [ "opentag", { name: "data", attributes: {} } ]
+      , [ "closetag", "data" ]
+      , [ "text", "\n" ]
+      , [ "closetag", "xml" ]
+      ]
+    , strict : true
+    , opt : {}
+    }
+  )
+
diff --git a/node_modules/elementtree/node_modules/sax/test/issue-35.js b/node_modules/elementtree/node_modules/sax/test/issue-35.js
new file mode 100644
index 0000000..7c521c5
--- /dev/null
+++ b/node_modules/elementtree/node_modules/sax/test/issue-35.js
@@ -0,0 +1,15 @@
+// https://github.com/isaacs/sax-js/issues/35
+require(__dirname).test
+  ( { xml : "<xml>&#Xd;&#X0d;\n"+
+            "</xml>"
+
+    , expect :
+      [ [ "opentag", { name: "xml", attributes: {} } ]
+      , [ "text", "\r\r\n" ]
+      , [ "closetag", "xml" ]
+      ]
+    , strict : true
+    , opt : {}
+    }
+  )
+
diff --git a/node_modules/elementtree/node_modules/sax/test/issue-47.js b/node_modules/elementtree/node_modules/sax/test/issue-47.js
new file mode 100644
index 0000000..911c7d0
--- /dev/null
+++ b/node_modules/elementtree/node_modules/sax/test/issue-47.js
@@ -0,0 +1,13 @@
+// https://github.com/isaacs/sax-js/issues/47
+require(__dirname).test
+  ( { xml : '<a href="query.svc?x=1&y=2&z=3"/>'
+    , expect : [ 
+        [ "attribute", { name:'href', value:"query.svc?x=1&y=2&z=3"} ],
+        [ "opentag", { name: "a", attributes: { href:"query.svc?x=1&y=2&z=3"} } ],
+        [ "closetag", "a" ]
+      ]
+    , strict : true
+    , opt : {}
+    }
+  )
+
diff --git a/node_modules/elementtree/node_modules/sax/test/issue-49.js b/node_modules/elementtree/node_modules/sax/test/issue-49.js
new file mode 100644
index 0000000..2964325
--- /dev/null
+++ b/node_modules/elementtree/node_modules/sax/test/issue-49.js
@@ -0,0 +1,31 @@
+// https://github.com/isaacs/sax-js/issues/49
+require(__dirname).test
+  ( { xml : "<xml><script>hello world</script></xml>"
+    , expect :
+      [ [ "opentag", { name: "xml", attributes: {} } ]
+      , [ "opentag", { name: "script", attributes: {} } ]
+      , [ "text", "hello world" ]
+      , [ "closetag", "script" ]
+      , [ "closetag", "xml" ]
+      ]
+    , strict : false
+    , opt : { lowercasetags: true, noscript: true }
+    }
+  )
+
+require(__dirname).test
+  ( { xml : "<xml><script><![CDATA[hello world]]></script></xml>"
+    , expect :
+      [ [ "opentag", { name: "xml", attributes: {} } ]
+      , [ "opentag", { name: "script", attributes: {} } ]
+      , [ "opencdata", undefined ]
+      , [ "cdata", "hello world" ]
+      , [ "closecdata", undefined ]
+      , [ "closetag", "script" ]
+      , [ "closetag", "xml" ]
+      ]
+    , strict : false
+    , opt : { lowercasetags: true, noscript: true }
+    }
+  )
+
diff --git a/node_modules/elementtree/node_modules/sax/test/parser-position.js b/node_modules/elementtree/node_modules/sax/test/parser-position.js
new file mode 100644
index 0000000..e4a68b1
--- /dev/null
+++ b/node_modules/elementtree/node_modules/sax/test/parser-position.js
@@ -0,0 +1,28 @@
+var sax = require("../lib/sax"),
+    assert = require("assert")
+
+function testPosition(chunks, expectedEvents) {
+  var parser = sax.parser();
+  expectedEvents.forEach(function(expectation) {
+    parser['on' + expectation[0]] = function() {
+      for (var prop in expectation[1]) {
+        assert.equal(parser[prop], expectation[1][prop]);
+      }
+    }
+  });
+  chunks.forEach(function(chunk) {
+    parser.write(chunk);
+  });
+};
+
+testPosition(['<div>abcdefgh</div>'],
+             [ ['opentag',  { position:  5, startTagPosition:  1 }]
+             , ['text',     { position: 19, startTagPosition: 14 }]
+             , ['closetag', { position: 19, startTagPosition: 14 }]
+             ]);
+
+testPosition(['<div>abcde','fgh</div>'],
+             [ ['opentag',  { position:  5, startTagPosition:  1 }]
+             , ['text',     { position: 19, startTagPosition: 14 }]
+             , ['closetag', { position: 19, startTagPosition: 14 }]
+             ]);
diff --git a/node_modules/elementtree/node_modules/sax/test/script.js b/node_modules/elementtree/node_modules/sax/test/script.js
new file mode 100644
index 0000000..464c051
--- /dev/null
+++ b/node_modules/elementtree/node_modules/sax/test/script.js
@@ -0,0 +1,12 @@
+require(__dirname).test({
+  xml : "<html><head><script>if (1 < 0) { console.log('elo there'); }</script></head></html>",
+  expect : [
+    ["opentag", {"name": "HTML","attributes": {}}],
+    ["opentag", {"name": "HEAD","attributes": {}}],
+    ["opentag", {"name": "SCRIPT","attributes": {}}],
+    ["script", "if (1 < 0) { console.log('elo there'); }"],
+    ["closetag", "SCRIPT"],
+    ["closetag", "HEAD"],
+    ["closetag", "HTML"]
+  ]
+});
diff --git a/node_modules/elementtree/node_modules/sax/test/self-closing-child-strict.js b/node_modules/elementtree/node_modules/sax/test/self-closing-child-strict.js
new file mode 100644
index 0000000..ce9c045
--- /dev/null
+++ b/node_modules/elementtree/node_modules/sax/test/self-closing-child-strict.js
@@ -0,0 +1,40 @@
+
+require(__dirname).test({
+  xml :
+  "<root>"+
+    "<child>" +
+      "<haha />" +
+    "</child>" +
+    "<monkey>" +
+      "=(|)" +
+    "</monkey>" +
+  "</root>",
+  expect : [
+    ["opentag", {
+     "name": "root",
+     "attributes": {}
+    }],
+    ["opentag", {
+     "name": "child",
+     "attributes": {}
+    }],
+    ["opentag", {
+     "name": "haha",
+     "attributes": {}
+    }],
+    ["closetag", "haha"],
+    ["closetag", "child"],
+    ["opentag", {
+     "name": "monkey",
+     "attributes": {}
+    }],
+    ["text", "=(|)"],
+    ["closetag", "monkey"],
+    ["closetag", "root"],
+    ["end"],
+    ["ready"]
+  ],
+  strict : true,
+  opt : {}
+});
+
diff --git a/node_modules/elementtree/node_modules/sax/test/self-closing-child.js b/node_modules/elementtree/node_modules/sax/test/self-closing-child.js
new file mode 100644
index 0000000..bc6b52b
--- /dev/null
+++ b/node_modules/elementtree/node_modules/sax/test/self-closing-child.js
@@ -0,0 +1,40 @@
+
+require(__dirname).test({
+  xml :
+  "<root>"+
+    "<child>" +
+      "<haha />" +
+    "</child>" +
+    "<monkey>" +
+      "=(|)" +
+    "</monkey>" +
+  "</root>",
+  expect : [
+    ["opentag", {
+     "name": "ROOT",
+     "attributes": {}
+    }],
+    ["opentag", {
+     "name": "CHILD",
+     "attributes": {}
+    }],
+    ["opentag", {
+     "name": "HAHA",
+     "attributes": {}
+    }],
+    ["closetag", "HAHA"],
+    ["closetag", "CHILD"],
+    ["opentag", {
+     "name": "MONKEY",
+     "attributes": {}
+    }],
+    ["text", "=(|)"],
+    ["closetag", "MONKEY"],
+    ["closetag", "ROOT"],
+    ["end"],
+    ["ready"]
+  ],
+  strict : false,
+  opt : {}
+});
+
diff --git a/node_modules/elementtree/node_modules/sax/test/self-closing-tag.js b/node_modules/elementtree/node_modules/sax/test/self-closing-tag.js
new file mode 100644
index 0000000..b2c5736
--- /dev/null
+++ b/node_modules/elementtree/node_modules/sax/test/self-closing-tag.js
@@ -0,0 +1,25 @@
+
+require(__dirname).test({
+  xml :
+  "<root>   "+
+    "<haha /> "+
+    "<haha/>  "+
+    "<monkey> "+
+      "=(|)     "+
+    "</monkey>"+
+  "</root>  ",
+  expect : [
+    ["opentag", {name:"ROOT", attributes:{}}],
+    ["opentag", {name:"HAHA", attributes:{}}],
+    ["closetag", "HAHA"],
+    ["opentag", {name:"HAHA", attributes:{}}],
+    ["closetag", "HAHA"],
+    // ["opentag", {name:"HAHA", attributes:{}}],
+    // ["closetag", "HAHA"],
+    ["opentag", {name:"MONKEY", attributes:{}}],
+    ["text", "=(|)"],
+    ["closetag", "MONKEY"],
+    ["closetag", "ROOT"]
+  ],
+  opt : { trim : true }
+});
\ No newline at end of file
diff --git a/node_modules/elementtree/node_modules/sax/test/stray-ending.js b/node_modules/elementtree/node_modules/sax/test/stray-ending.js
new file mode 100644
index 0000000..6b0aa7f
--- /dev/null
+++ b/node_modules/elementtree/node_modules/sax/test/stray-ending.js
@@ -0,0 +1,17 @@
+// stray ending tags should just be ignored in non-strict mode.
+// https://github.com/isaacs/sax-js/issues/32
+require(__dirname).test
+  ( { xml :
+      "<a><b></c></b></a>"
+    , expect :
+      [ [ "opentag", { name: "A", attributes: {} } ]
+      , [ "opentag", { name: "B", attributes: {} } ]
+      , [ "text", "</c>" ]
+      , [ "closetag", "B" ]
+      , [ "closetag", "A" ]
+      ]
+    , strict : false
+    , opt : {}
+    }
+  )
+
diff --git a/node_modules/elementtree/node_modules/sax/test/trailing-non-whitespace.js b/node_modules/elementtree/node_modules/sax/test/trailing-non-whitespace.js
new file mode 100644
index 0000000..3e1fb2e
--- /dev/null
+++ b/node_modules/elementtree/node_modules/sax/test/trailing-non-whitespace.js
@@ -0,0 +1,17 @@
+
+require(__dirname).test({
+  xml : "<span>Welcome,</span> to monkey land",
+  expect : [
+    ["opentag", {
+     "name": "SPAN",
+     "attributes": {}
+    }],
+    ["text", "Welcome,"],
+    ["closetag", "SPAN"],
+    ["text", " to monkey land"],
+    ["end"],
+    ["ready"]
+  ],
+  strict : false,
+  opt : {}
+});
diff --git a/node_modules/elementtree/node_modules/sax/test/unquoted.js b/node_modules/elementtree/node_modules/sax/test/unquoted.js
new file mode 100644
index 0000000..79f1d0b
--- /dev/null
+++ b/node_modules/elementtree/node_modules/sax/test/unquoted.js
@@ -0,0 +1,17 @@
+// unquoted attributes should be ok in non-strict mode
+// https://github.com/isaacs/sax-js/issues/31
+require(__dirname).test
+  ( { xml :
+      "<span class=test hello=world></span>"
+    , expect :
+      [ [ "attribute", { name: "class", value: "test" } ]
+      , [ "attribute", { name: "hello", value: "world" } ]
+      , [ "opentag", { name: "SPAN",
+                       attributes: { class: "test", hello: "world" } } ]
+      , [ "closetag", "SPAN" ]
+      ]
+    , strict : false
+    , opt : {}
+    }
+  )
+
diff --git a/node_modules/elementtree/node_modules/sax/test/xmlns-issue-41.js b/node_modules/elementtree/node_modules/sax/test/xmlns-issue-41.js
new file mode 100644
index 0000000..596d82b
--- /dev/null
+++ b/node_modules/elementtree/node_modules/sax/test/xmlns-issue-41.js
@@ -0,0 +1,67 @@
+var t = require(__dirname)
+
+  , xmls = // should be the same both ways.
+    [ "<parent xmlns:a='http://ATTRIBUTE' a:attr='value' />"
+    , "<parent a:attr='value' xmlns:a='http://ATTRIBUTE' />" ]
+
+  , ex1 =
+    [ [ "opennamespace"
+      , { prefix: "a"
+        , uri: "http://ATTRIBUTE"
+        }
+      ]
+    , [ "attribute"
+      , { name: "xmlns:a"
+        , value: "http://ATTRIBUTE"
+        , prefix: "xmlns"
+        , local: "a"
+        , uri: "http://www.w3.org/2000/xmlns/"
+        }
+      ]
+    , [ "attribute"
+      , { name: "a:attr"
+        , local: "attr"
+        , prefix: "a"
+        , uri: "http://ATTRIBUTE"
+        , value: "value"
+        }
+      ]
+    , [ "opentag"
+      , { name: "parent"
+        , uri: ""
+        , prefix: ""
+        , local: "parent"
+        , attributes:
+          { "a:attr":
+            { name: "a:attr"
+            , local: "attr"
+            , prefix: "a"
+            , uri: "http://ATTRIBUTE"
+            , value: "value"
+            }
+          , "xmlns:a":
+            { name: "xmlns:a"
+            , local: "a"
+            , prefix: "xmlns"
+            , uri: "http://www.w3.org/2000/xmlns/"
+            , value: "http://ATTRIBUTE"
+            }
+          }
+        , ns: {"a": "http://ATTRIBUTE"}
+        }
+      ]
+    , ["closetag", "parent"]
+    , ["closenamespace", { prefix: "a", uri: "http://ATTRIBUTE" }]
+    ]
+
+  // swap the order of elements 2 and 1
+  , ex2 = [ex1[0], ex1[2], ex1[1]].concat(ex1.slice(3))
+  , expected = [ex1, ex2]
+
+xmls.forEach(function (x, i) {
+  t.test({ xml: x
+         , expect: expected[i]
+         , strict: true
+         , opt: { xmlns: true }
+         })
+})
diff --git a/node_modules/elementtree/node_modules/sax/test/xmlns-rebinding.js b/node_modules/elementtree/node_modules/sax/test/xmlns-rebinding.js
new file mode 100644
index 0000000..f464876
--- /dev/null
+++ b/node_modules/elementtree/node_modules/sax/test/xmlns-rebinding.js
@@ -0,0 +1,59 @@
+
+require(__dirname).test
+  ( { xml :
+      "<root xmlns:x='x1' xmlns:y='y1' x:a='x1' y:a='y1'>"+
+        "<rebind xmlns:x='x2'>"+
+          "<check x:a='x2' y:a='y1'/>"+
+        "</rebind>"+
+        "<check x:a='x1' y:a='y1'/>"+
+      "</root>"
+
+    , expect :
+      [ [ "opennamespace", { prefix: "x", uri: "x1" } ]
+      , [ "opennamespace", { prefix: "y", uri: "y1" } ]
+      , [ "attribute", { name: "xmlns:x", value: "x1", uri: "http://www.w3.org/2000/xmlns/", prefix: "xmlns", local: "x" } ]
+      , [ "attribute", { name: "xmlns:y", value: "y1", uri: "http://www.w3.org/2000/xmlns/", prefix: "xmlns", local: "y" } ]
+      , [ "attribute", { name: "x:a", value: "x1", uri: "x1", prefix: "x", local: "a" } ]
+      , [ "attribute", { name: "y:a", value: "y1", uri: "y1", prefix: "y", local: "a" } ]
+      , [ "opentag", { name: "root", uri: "", prefix: "", local: "root",
+            attributes: { "xmlns:x": { name: "xmlns:x", value: "x1", uri: "http://www.w3.org/2000/xmlns/", prefix: "xmlns", local: "x" }
+                        , "xmlns:y": { name: "xmlns:y", value: "y1", uri: "http://www.w3.org/2000/xmlns/", prefix: "xmlns", local: "y" }
+                        , "x:a": { name: "x:a", value: "x1", uri: "x1", prefix: "x", local: "a" }
+                        , "y:a": { name: "y:a", value: "y1", uri: "y1", prefix: "y", local: "a" } },
+            ns: { x: 'x1', y: 'y1' } } ]
+
+      , [ "opennamespace", { prefix: "x", uri: "x2" } ]
+      , [ "attribute", { name: "xmlns:x", value: "x2", uri: "http://www.w3.org/2000/xmlns/", prefix: "xmlns", local: "x" } ]
+      , [ "opentag", { name: "rebind", uri: "", prefix: "", local: "rebind",
+            attributes: { "xmlns:x": { name: "xmlns:x", value: "x2", uri: "http://www.w3.org/2000/xmlns/", prefix: "xmlns", local: "x" } },
+            ns: { x: 'x2' } } ]
+
+      , [ "attribute", { name: "x:a", value: "x2", uri: "x2", prefix: "x", local: "a" } ]
+      , [ "attribute", { name: "y:a", value: "y1", uri: "y1", prefix: "y", local: "a" } ]
+      , [ "opentag", { name: "check", uri: "", prefix: "", local: "check",
+            attributes: { "x:a": { name: "x:a", value: "x2", uri: "x2", prefix: "x", local: "a" }
+                        , "y:a": { name: "y:a", value: "y1", uri: "y1", prefix: "y", local: "a" } },
+            ns: { x: 'x2' } } ]
+
+      , [ "closetag", "check" ]
+
+      , [ "closetag", "rebind" ]
+      , [ "closenamespace", { prefix: "x", uri: "x2" } ]
+
+      , [ "attribute", { name: "x:a", value: "x1", uri: "x1", prefix: "x", local: "a" } ]
+      , [ "attribute", { name: "y:a", value: "y1", uri: "y1", prefix: "y", local: "a" } ]
+      , [ "opentag", { name: "check", uri: "", prefix: "", local: "check",
+            attributes: { "x:a": { name: "x:a", value: "x1", uri: "x1", prefix: "x", local: "a" }
+                        , "y:a": { name: "y:a", value: "y1", uri: "y1", prefix: "y", local: "a" } },
+            ns: { x: 'x1', y: 'y1' } } ]
+      , [ "closetag", "check" ]
+
+      , [ "closetag", "root" ]
+      , [ "closenamespace", { prefix: "x", uri: "x1" } ]
+      , [ "closenamespace", { prefix: "y", uri: "y1" } ]
+      ]
+    , strict : true
+    , opt : { xmlns: true }
+    }
+  )
+
diff --git a/node_modules/elementtree/node_modules/sax/test/xmlns-strict.js b/node_modules/elementtree/node_modules/sax/test/xmlns-strict.js
new file mode 100644
index 0000000..4ad615b
--- /dev/null
+++ b/node_modules/elementtree/node_modules/sax/test/xmlns-strict.js
@@ -0,0 +1,71 @@
+
+require(__dirname).test
+  ( { xml :
+      "<root>"+
+        "<plain attr='normal'/>"+
+        "<ns1 xmlns='uri:default'>"+
+          "<plain attr='normal'/>"+
+        "</ns1>"+
+        "<ns2 xmlns:a='uri:nsa'>"+
+          "<plain attr='normal'/>"+
+          "<a:ns a:attr='namespaced'/>"+
+        "</ns2>"+
+      "</root>"
+
+    , expect :
+      [ [ "opentag", { name: "root", prefix: "", local: "root", uri: "",
+            attributes: {}, ns: {} } ]
+
+      , [ "attribute", { name: "attr", value: "normal", prefix: "", local: "attr", uri: "" } ]
+      , [ "opentag", { name: "plain", prefix: "", local: "plain", uri: "",
+            attributes: { "attr": { name: "attr", value: "normal", uri: "", prefix: "", local: "attr", uri: "" } },
+            ns: {} } ]
+      , [ "closetag", "plain" ]
+
+      , [ "opennamespace", { prefix: "", uri: "uri:default" } ]
+
+      , [ "attribute", { name: "xmlns", value: "uri:default", prefix: "xmlns", local: "", uri: "http://www.w3.org/2000/xmlns/" } ]
+      , [ "opentag", { name: "ns1", prefix: "", local: "ns1", uri: "uri:default",
+            attributes: { "xmlns": { name: "xmlns", value: "uri:default", prefix: "xmlns", local: "", uri: "http://www.w3.org/2000/xmlns/" } },
+            ns: { "": "uri:default" } } ]
+
+      , [ "attribute", { name: "attr", value: "normal", prefix: "", local: "attr", uri: "uri:default" } ]
+      , [ "opentag", { name: "plain", prefix: "", local: "plain", uri: "uri:default", ns: { '': 'uri:default' },
+            attributes: { "attr": { name: "attr", value: "normal", prefix: "", local: "attr", uri: "uri:default" } } } ]
+      , [ "closetag", "plain" ]
+
+      , [ "closetag", "ns1" ]
+
+      , [ "closenamespace", { prefix: "", uri: "uri:default" } ]
+
+      , [ "opennamespace", { prefix: "a", uri: "uri:nsa" } ]
+
+      , [ "attribute", { name: "xmlns:a", value: "uri:nsa", prefix: "xmlns", local: "a", uri: "http://www.w3.org/2000/xmlns/" } ]
+
+      , [ "opentag", { name: "ns2", prefix: "", local: "ns2", uri: "",
+            attributes: { "xmlns:a": { name: "xmlns:a", value: "uri:nsa", prefix: "xmlns", local: "a", uri: "http://www.w3.org/2000/xmlns/" } },
+            ns: { a: "uri:nsa" } } ]
+
+      , [ "attribute", { name: "attr", value: "normal", prefix: "", local: "attr", uri: "" } ]
+      , [ "opentag", { name: "plain", prefix: "", local: "plain", uri: "",
+            attributes: { "attr": { name: "attr", value: "normal", prefix: "", local: "attr", uri: "" } },
+            ns: { a: 'uri:nsa' } } ]
+      , [ "closetag", "plain" ]
+
+      , [ "attribute", { name: "a:attr", value: "namespaced", prefix: "a", local: "attr", uri: "uri:nsa" } ]
+      , [ "opentag", { name: "a:ns", prefix: "a", local: "ns", uri: "uri:nsa",
+            attributes: { "a:attr": { name: "a:attr", value: "namespaced", prefix: "a", local: "attr", uri: "uri:nsa" } },
+            ns: { a: 'uri:nsa' } } ]
+      , [ "closetag", "a:ns" ]
+
+      , [ "closetag", "ns2" ]
+
+      , [ "closenamespace", { prefix: "a", uri: "uri:nsa" } ]
+
+      , [ "closetag", "root" ]
+      ]
+    , strict : true
+    , opt : { xmlns: true }
+    }
+  )
+
diff --git a/node_modules/elementtree/node_modules/sax/test/xmlns-unbound.js b/node_modules/elementtree/node_modules/sax/test/xmlns-unbound.js
new file mode 100644
index 0000000..2944b87
--- /dev/null
+++ b/node_modules/elementtree/node_modules/sax/test/xmlns-unbound.js
@@ -0,0 +1,15 @@
+
+require(__dirname).test(
+  { strict : true
+  , opt : { xmlns: true }
+  , expect :
+    [ ["error", "Unbound namespace prefix: \"unbound\"\nLine: 0\nColumn: 28\nChar: >"]
+
+    , [ "attribute", { name: "unbound:attr", value: "value", uri: "unbound", prefix: "unbound", local: "attr" } ]
+    , [ "opentag", { name: "root", uri: "", prefix: "", local: "root",
+          attributes: { "unbound:attr": { name: "unbound:attr", value: "value", uri: "unbound", prefix: "unbound", local: "attr" } },
+          ns: {} } ]
+    , [ "closetag", "root" ]
+    ]
+  }
+).write("<root unbound:attr='value'/>")
diff --git a/node_modules/elementtree/node_modules/sax/test/xmlns-xml-default-prefix-attribute.js b/node_modules/elementtree/node_modules/sax/test/xmlns-xml-default-prefix-attribute.js
new file mode 100644
index 0000000..16da771
--- /dev/null
+++ b/node_modules/elementtree/node_modules/sax/test/xmlns-xml-default-prefix-attribute.js
@@ -0,0 +1,35 @@
+require(__dirname).test(
+  { xml : "<root xml:lang='en'/>"
+  , expect :
+    [ [ "attribute"
+      , { name: "xml:lang"
+        , local: "lang"
+        , prefix: "xml"
+        , uri: "http://www.w3.org/XML/1998/namespace"
+        , value: "en"
+        }
+      ]
+    , [ "opentag"
+      , { name: "root"
+        , uri: ""
+        , prefix: ""
+        , local: "root"
+        , attributes:
+          { "xml:lang":
+            { name: "xml:lang"
+            , local: "lang"
+            , prefix: "xml"
+            , uri: "http://www.w3.org/XML/1998/namespace"
+            , value: "en"
+            }
+          }
+        , ns: {}
+        }
+      ]
+    , ["closetag", "root"]
+    ]
+  , strict : true
+  , opt : { xmlns: true }
+  }
+)
+
diff --git a/node_modules/elementtree/node_modules/sax/test/xmlns-xml-default-prefix.js b/node_modules/elementtree/node_modules/sax/test/xmlns-xml-default-prefix.js
new file mode 100644
index 0000000..9a1ce1b
--- /dev/null
+++ b/node_modules/elementtree/node_modules/sax/test/xmlns-xml-default-prefix.js
@@ -0,0 +1,20 @@
+require(__dirname).test(
+  { xml : "<xml:root/>"
+  , expect :
+    [
+      [ "opentag"
+      , { name: "xml:root"
+        , uri: "http://www.w3.org/XML/1998/namespace"
+        , prefix: "xml"
+        , local: "root"
+        , attributes: {}
+        , ns: {}
+        }
+      ]
+    , ["closetag", "xml:root"]
+    ]
+  , strict : true
+  , opt : { xmlns: true }
+  }
+)
+
diff --git a/node_modules/elementtree/node_modules/sax/test/xmlns-xml-default-redefine.js b/node_modules/elementtree/node_modules/sax/test/xmlns-xml-default-redefine.js
new file mode 100644
index 0000000..1eba9c7
--- /dev/null
+++ b/node_modules/elementtree/node_modules/sax/test/xmlns-xml-default-redefine.js
@@ -0,0 +1,40 @@
+require(__dirname).test(
+  { xml : "<xml:root xmlns:xml='ERROR'/>"
+  , expect :
+    [ ["error"
+      , "xml: prefix must be bound to http://www.w3.org/XML/1998/namespace\n"
+                        + "Actual: ERROR\n"
+      + "Line: 0\nColumn: 27\nChar: '"
+      ]
+    , [ "attribute"
+      , { name: "xmlns:xml"
+        , local: "xml"
+        , prefix: "xmlns"
+        , uri: "http://www.w3.org/2000/xmlns/"
+        , value: "ERROR"
+        }
+      ]
+    , [ "opentag"
+      , { name: "xml:root"
+        , uri: "http://www.w3.org/XML/1998/namespace"
+        , prefix: "xml"
+        , local: "root"
+        , attributes:
+          { "xmlns:xml":
+            { name: "xmlns:xml"
+            , local: "xml"
+            , prefix: "xmlns"
+            , uri: "http://www.w3.org/2000/xmlns/"
+            , value: "ERROR"
+            }
+          }
+        , ns: {}
+        }
+      ]
+    , ["closetag", "xml:root"]
+    ]
+  , strict : true
+  , opt : { xmlns: true }
+  }
+)
+
diff --git a/node_modules/elementtree/package.json b/node_modules/elementtree/package.json
new file mode 100644
index 0000000..78938f1
--- /dev/null
+++ b/node_modules/elementtree/package.json
@@ -0,0 +1,75 @@
+{
+  "author": {
+    "name": "Rackspace US, Inc."
+  },
+  "contributors": [
+    {
+      "name": "Paul Querna",
+      "email": "paul.querna@rackspace.com"
+    },
+    {
+      "name": "Tomaz Muraus",
+      "email": "tomaz.muraus@rackspace.com"
+    }
+  ],
+  "name": "elementtree",
+  "description": "XML Serialization and Parsing module based on Python's ElementTree.",
+  "version": "0.1.6",
+  "keywords": [
+    "xml",
+    "sax",
+    "parser",
+    "seralization",
+    "elementtree"
+  ],
+  "homepage": "https://github.com/racker/node-elementtree",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/racker/node-elementtree.git"
+  },
+  "main": "lib/elementtree.js",
+  "directories": {
+    "lib": "lib"
+  },
+  "scripts": {
+    "test": "make test"
+  },
+  "engines": {
+    "node": ">= 0.4.0"
+  },
+  "dependencies": {
+    "sax": "0.3.5"
+  },
+  "devDependencies": {
+    "whiskey": "0.8.x"
+  },
+  "licenses": [
+    {
+      "type": "Apache",
+      "url": "http://www.apache.org/licenses/LICENSE-2.0.html"
+    }
+  ],
+  "bugs": {
+    "url": "https://github.com/racker/node-elementtree/issues"
+  },
+  "_id": "elementtree@0.1.6",
+  "dist": {
+    "shasum": "2ac4c46ea30516c8c4cbdb5e3ac7418e592de20c",
+    "tarball": "http://registry.npmjs.org/elementtree/-/elementtree-0.1.6.tgz"
+  },
+  "_from": "elementtree@*",
+  "_npmVersion": "1.3.24",
+  "_npmUser": {
+    "name": "rphillips",
+    "email": "ryan@trolocsis.com"
+  },
+  "maintainers": [
+    {
+      "name": "rphillips",
+      "email": "ryan@trolocsis.com"
+    }
+  ],
+  "_shasum": "2ac4c46ea30516c8c4cbdb5e3ac7418e592de20c",
+  "_resolved": "https://registry.npmjs.org/elementtree/-/elementtree-0.1.6.tgz",
+  "readme": "ERROR: No README data found!"
+}
diff --git a/node_modules/elementtree/tests/data/xml1.xml b/node_modules/elementtree/tests/data/xml1.xml
new file mode 100644
index 0000000..72c33ae
--- /dev/null
+++ b/node_modules/elementtree/tests/data/xml1.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0"?>
+<container name="test_container_1" xmlns:android="http://schemas.android.com/apk/res/android">
+  <object>dd
+    <name>test_object_1</name>
+    <hash>4281c348eaf83e70ddce0e07221c3d28</hash>
+    <bytes android:type="cool">14</bytes>
+    <content_type>application/octetstream</content_type>
+    <last_modified>2009-02-03T05:26:32.612278</last_modified>
+  </object>
+  <object>
+    <name>test_object_2</name>
+    <hash>b039efe731ad111bc1b0ef221c3849d0</hash>
+    <bytes android:type="lame">64</bytes>
+    <content_type>application/octetstream</content_type>
+    <last_modified>2009-02-03T05:26:32.612278</last_modified>
+  </object>
+</container>
diff --git a/node_modules/elementtree/tests/data/xml2.xml b/node_modules/elementtree/tests/data/xml2.xml
new file mode 100644
index 0000000..5f94bbd
--- /dev/null
+++ b/node_modules/elementtree/tests/data/xml2.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0"?>
+<object>
+    <title>
+        Hello World
+    </title>
+    <children>
+        <object id="obj1" />
+        <object id="obj2" />
+        <object id="obj3" />
+    </children>
+    <text><![CDATA[
+        Test & Test & Test
+    ]]></text>
+</object>
diff --git a/node_modules/elementtree/tests/test-simple.js b/node_modules/elementtree/tests/test-simple.js
new file mode 100644
index 0000000..1fc04b8
--- /dev/null
+++ b/node_modules/elementtree/tests/test-simple.js
@@ -0,0 +1,339 @@
+/**
+ *  Copyright 2011 Rackspace
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+
+var fs = require('fs');
+var path = require('path');
+
+var sprintf = require('./../lib/sprintf').sprintf;
+var et = require('elementtree');
+var XML = et.XML;
+var ElementTree = et.ElementTree;
+var Element = et.Element;
+var SubElement = et.SubElement;
+var SyntaxError = require('./../lib/errors').SyntaxError;
+
+function readFile(name) {
+  return fs.readFileSync(path.join(__dirname, '/data/', name), 'utf8');
+}
+
+exports['test_simplest'] = function(test, assert) {
+  /* Ported from <https://github.com/lxml/lxml/blob/master/src/lxml/tests/test_elementtree.py> */
+  var Element = et.Element;
+  var root = Element('root');
+  root.append(Element('one'));
+  root.append(Element('two'));
+  root.append(Element('three'));
+  assert.equal(3, root.len());
+  assert.equal('one', root.getItem(0).tag);
+  assert.equal('two', root.getItem(1).tag);
+  assert.equal('three', root.getItem(2).tag);
+  test.finish();
+};
+
+
+exports['test_attribute_values'] = function(test, assert) {
+  var XML = et.XML;
+  var root = XML('<doc alpha="Alpha" beta="Beta" gamma="Gamma"/>');
+  assert.equal('Alpha', root.attrib['alpha']);
+  assert.equal('Beta', root.attrib['beta']);
+  assert.equal('Gamma', root.attrib['gamma']);
+  test.finish();
+};
+
+
+exports['test_findall'] = function(test, assert) {
+  var XML = et.XML;
+  var root = XML('<a><b><c/></b><b/><c><b/></c></a>');
+
+  assert.equal(root.findall("c").length, 1);
+  assert.equal(root.findall(".//c").length, 2);
+  assert.equal(root.findall(".//b").length, 3);
+  assert.equal(root.findall(".//b")[0]._children.length, 1);
+  assert.equal(root.findall(".//b")[1]._children.length, 0);
+  assert.equal(root.findall(".//b")[2]._children.length, 0);
+  assert.deepEqual(root.findall('.//b')[0], root.getchildren()[0]);
+
+  test.finish();
+};
+
+exports['test_find'] = function(test, assert) {
+  var a = Element('a');
+  var b = SubElement(a, 'b');
+  var c = SubElement(a, 'c');
+
+  assert.deepEqual(a.find('./b/..'), a);
+  test.finish();
+};
+
+exports['test_elementtree_find_qname'] = function(test, assert) {
+  var tree = new et.ElementTree(XML('<a><b><c/></b><b/><c><b/></c></a>'));
+  assert.deepEqual(tree.find(new et.QName('c')), tree.getroot()._children[2]);
+  test.finish();
+};
+
+exports['test_attrib_ns_clear'] = function(test, assert) {
+  var attribNS = '{http://foo/bar}x';
+
+  var par = Element('par');
+  par.set(attribNS, 'a');
+  var child = SubElement(par, 'child');
+  child.set(attribNS, 'b');
+
+  assert.equal('a', par.get(attribNS));
+  assert.equal('b', child.get(attribNS));
+
+  par.clear();
+  assert.equal(null, par.get(attribNS));
+  assert.equal('b', child.get(attribNS));
+  test.finish();
+};
+
+exports['test_create_tree_and_parse_simple'] = function(test, assert) {
+  var i = 0;
+  var e = new Element('bar', {});
+  var expected = "<?xml version='1.0' encoding='utf-8'?>\n" +
+    '<bar><blah a="11" /><blah a="12" /><gag a="13" b="abc">ponies</gag></bar>';
+
+  SubElement(e, "blah", {a: 11});
+  SubElement(e, "blah", {a: 12});
+  var se = et.SubElement(e, "gag", {a: '13', b: 'abc'});
+  se.text = 'ponies';
+
+  se.itertext(function(text) {
+    assert.equal(text, 'ponies');
+    i++;
+  });
+
+  assert.equal(i, 1);
+  var etree = new ElementTree(e);
+  var xml = etree.write();
+  assert.equal(xml, expected);
+  test.finish();
+};
+
+exports['test_write_with_options'] = function(test, assert) {
+  var i = 0;
+  var e = new Element('bar', {});
+  var expected1 = "<?xml version='1.0' encoding='utf-8'?>\n" +
+    '<bar>\n' +
+    '    <blah a="11">\n' +
+    '        <baz d="11">test</baz>\n' +
+    '    </blah>\n' +
+    '    <blah a="12" />\n' +
+    '    <gag a="13" b="abc">ponies</gag>\n' +
+    '</bar>\n';
+    var expected2 = "<?xml version='1.0' encoding='utf-8'?>\n" +
+    '<bar>\n' +
+    '  <blah a="11">\n' +
+    '    <baz d="11">test</baz>\n' +
+    '  </blah>\n' +
+    '  <blah a="12" />\n' +
+    '  <gag a="13" b="abc">ponies</gag>\n' +
+    '</bar>\n';
+
+    var expected3 = "<?xml version='1.0' encoding='utf-8'?>\n" +
+    '<object>\n' +
+    '    <title>\n' +
+    '        Hello World\n' +
+    '    </title>\n' +
+    '    <children>\n' +
+    '        <object id="obj1" />\n' +
+    '        <object id="obj2" />\n' +
+    '        <object id="obj3" />\n' +
+    '    </children>\n' +
+    '    <text>\n' +
+    '        Test &amp; Test &amp; Test\n' +
+    '    </text>\n' +
+    '</object>\n';
+
+  var se1 = SubElement(e, "blah", {a: 11});
+  var se2 = SubElement(se1, "baz", {d: 11});
+  se2.text = 'test';
+  SubElement(e, "blah", {a: 12});
+  var se = et.SubElement(e, "gag", {a: '13', b: 'abc'});
+  se.text = 'ponies';
+
+  se.itertext(function(text) {
+    assert.equal(text, 'ponies');
+    i++;
+  });
+
+  assert.equal(i, 1);
+  var etree = new ElementTree(e);
+  var xml1 = etree.write({'indent': 4});
+  var xml2 = etree.write({'indent': 2});
+  assert.equal(xml1, expected1);
+  assert.equal(xml2, expected2);
+
+  var file = readFile('xml2.xml');
+  var etree2 = et.parse(file);
+  var xml3 = etree2.write({'indent': 4});
+  assert.equal(xml3, expected3);
+  test.finish();
+};
+
+exports['test_parse_and_find_2'] = function(test, assert) {
+  var data = readFile('xml1.xml');
+  var etree = et.parse(data);
+
+  assert.equal(etree.findall('./object').length, 2);
+  assert.equal(etree.findall('[@name]').length, 1);
+  assert.equal(etree.findall('[@name="test_container_1"]').length, 1);
+  assert.equal(etree.findall('[@name=\'test_container_1\']').length, 1);
+  assert.equal(etree.findall('./object')[0].findtext('name'), 'test_object_1');
+  assert.equal(etree.findtext('./object/name'), 'test_object_1');
+  assert.equal(etree.findall('.//bytes').length, 2);
+  assert.equal(etree.findall('*/bytes').length, 2);
+  assert.equal(etree.findall('*/foobar').length, 0);
+
+  test.finish();
+};
+
+exports['test_namespaced_attribute'] = function(test, assert) {
+  var data = readFile('xml1.xml');
+  var etree = et.parse(data);
+
+  assert.equal(etree.findall('*/bytes[@android:type="cool"]').length, 1);
+
+  test.finish();
+}
+
+exports['test_syntax_errors'] = function(test, assert) {
+  var expressions = [ './/@bar', '[@bar', '[@foo=bar]', '[@', '/bar' ];
+  var errCount = 0;
+  var data = readFile('xml1.xml');
+  var etree = et.parse(data);
+
+  expressions.forEach(function(expression) {
+    try {
+      etree.findall(expression);
+    }
+    catch (err) {
+      errCount++;
+    }
+  });
+
+  assert.equal(errCount, expressions.length);
+  test.finish();
+};
+
+exports['test_register_namespace'] = function(test, assert){
+  var prefix = 'TESTPREFIX';
+  var namespace = 'http://seriously.unknown/namespace/URI';
+  var errCount = 0;
+
+  var etree = Element(sprintf('{%s}test', namespace));
+  assert.equal(et.tostring(etree, { 'xml_declaration': false}),
+               sprintf('<ns0:test xmlns:ns0="%s" />', namespace));
+
+  et.register_namespace(prefix, namespace);
+  var etree = Element(sprintf('{%s}test', namespace));
+  assert.equal(et.tostring(etree, { 'xml_declaration': false}),
+               sprintf('<%s:test xmlns:%s="%s" />', prefix, prefix, namespace));
+
+  try {
+    et.register_namespace('ns25', namespace);
+  }
+  catch (err) {
+    errCount++;
+  }
+
+  assert.equal(errCount, 1, 'Reserved prefix used, but exception was not thrown');
+  test.finish();
+};
+
+exports['test_tostring'] = function(test, assert) {
+  var a = Element('a');
+  var b = SubElement(a, 'b');
+  var c = SubElement(a, 'c');
+  c.text = 543;
+
+  assert.equal(et.tostring(a, { 'xml_declaration': false }), '<a><b /><c>543</c></a>');
+  assert.equal(et.tostring(c, { 'xml_declaration': false }), '<c>543</c>');
+  test.finish();
+};
+
+exports['test_escape'] = function(test, assert) {
+  var a = Element('a');
+  var b = SubElement(a, 'b');
+  b.text = '&&&&<>"\n\r';
+
+  assert.equal(et.tostring(a, { 'xml_declaration': false }), '<a><b>&amp;&amp;&amp;&amp;&lt;&gt;\"\n\r</b></a>');
+  test.finish();
+};
+
+exports['test_find_null'] = function(test, assert) {
+  var root = Element('root');
+  var node = SubElement(root, 'node');
+  var leaf  = SubElement(node, 'leaf');
+  leaf.text = 'ipsum';
+
+  assert.equal(root.find('node/leaf'), leaf);
+  assert.equal(root.find('no-such-node/leaf'), null);
+  test.finish();
+};
+
+exports['test_findtext_null'] = function(test, assert) {
+  var root = Element('root');
+  var node = SubElement(root, 'node');
+  var leaf  = SubElement(node, 'leaf');
+  leaf.text = 'ipsum';
+
+  assert.equal(root.findtext('node/leaf'), 'ipsum');
+  assert.equal(root.findtext('no-such-node/leaf'), null);
+  test.finish();
+};
+
+exports['test_remove'] = function(test, assert) {
+  var root = Element('root');
+  var node1 = SubElement(root, 'node1');
+  var node2 = SubElement(root, 'node2');
+  var node3 = SubElement(root, 'node3');
+
+  assert.equal(root.len(), 3);
+
+  root.remove(node2);
+
+  assert.equal(root.len(), 2);
+  assert.equal(root.getItem(0).tag, 'node1')
+  assert.equal(root.getItem(1).tag, 'node3')
+
+  test.finish();
+};
+
+exports['test_cdata_write'] = function(test, assert) {
+  var root, etree, xml, values, value, i;
+
+  values = [
+    'if(0>1) then true;',
+    '<test1>ponies hello</test1>',
+    ''
+  ];
+
+  for (i = 0; i < values.length; i++) {
+    value = values[i];
+
+    root = Element('root');
+    root.append(et.CData(value));
+    etree = new ElementTree(root);
+    xml = etree.write({'xml_declaration': false});
+
+    assert.equal(xml, sprintf('<root><![CDATA[%s]]></root>', value));
+  }
+
+  test.finish();
+};
diff --git a/node_modules/optimist/.travis.yml b/node_modules/optimist/.travis.yml
new file mode 100644
index 0000000..cc4dba2
--- /dev/null
+++ b/node_modules/optimist/.travis.yml
@@ -0,0 +1,4 @@
+language: node_js
+node_js:
+  - "0.8"
+  - "0.10"
diff --git a/node_modules/optimist/LICENSE b/node_modules/optimist/LICENSE
new file mode 100644
index 0000000..432d1ae
--- /dev/null
+++ b/node_modules/optimist/LICENSE
@@ -0,0 +1,21 @@
+Copyright 2010 James Halliday (mail@substack.net)
+
+This project is free software released under the MIT/X11 license:
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/node_modules/optimist/example/bool.js b/node_modules/optimist/example/bool.js
new file mode 100644
index 0000000..a998fb7
--- /dev/null
+++ b/node_modules/optimist/example/bool.js
@@ -0,0 +1,10 @@
+#!/usr/bin/env node
+var util = require('util');
+var argv = require('optimist').argv;
+
+if (argv.s) {
+    util.print(argv.fr ? 'Le chat dit: ' : 'The cat says: ');
+}
+console.log(
+    (argv.fr ? 'miaou' : 'meow') + (argv.p ? '.' : '')
+);
diff --git a/node_modules/optimist/example/boolean_double.js b/node_modules/optimist/example/boolean_double.js
new file mode 100644
index 0000000..a35a7e6
--- /dev/null
+++ b/node_modules/optimist/example/boolean_double.js
@@ -0,0 +1,7 @@
+#!/usr/bin/env node
+var argv = require('optimist')
+    .boolean(['x','y','z'])
+    .argv
+;
+console.dir([ argv.x, argv.y, argv.z ]);
+console.dir(argv._);
diff --git a/node_modules/optimist/example/boolean_single.js b/node_modules/optimist/example/boolean_single.js
new file mode 100644
index 0000000..017bb68
--- /dev/null
+++ b/node_modules/optimist/example/boolean_single.js
@@ -0,0 +1,7 @@
+#!/usr/bin/env node
+var argv = require('optimist')
+    .boolean('v')
+    .argv
+;
+console.dir(argv.v);
+console.dir(argv._);
diff --git a/node_modules/optimist/example/default_hash.js b/node_modules/optimist/example/default_hash.js
new file mode 100644
index 0000000..ade7768
--- /dev/null
+++ b/node_modules/optimist/example/default_hash.js
@@ -0,0 +1,8 @@
+#!/usr/bin/env node
+
+var argv = require('optimist')
+    .default({ x : 10, y : 10 })
+    .argv
+;
+
+console.log(argv.x + argv.y);
diff --git a/node_modules/optimist/example/default_singles.js b/node_modules/optimist/example/default_singles.js
new file mode 100644
index 0000000..d9b1ff4
--- /dev/null
+++ b/node_modules/optimist/example/default_singles.js
@@ -0,0 +1,7 @@
+#!/usr/bin/env node
+var argv = require('optimist')
+    .default('x', 10)
+    .default('y', 10)
+    .argv
+;
+console.log(argv.x + argv.y);
diff --git a/node_modules/optimist/example/divide.js b/node_modules/optimist/example/divide.js
new file mode 100644
index 0000000..5e2ee82
--- /dev/null
+++ b/node_modules/optimist/example/divide.js
@@ -0,0 +1,8 @@
+#!/usr/bin/env node
+
+var argv = require('optimist')
+    .usage('Usage: $0 -x [num] -y [num]')
+    .demand(['x','y'])
+    .argv;
+
+console.log(argv.x / argv.y);
diff --git a/node_modules/optimist/example/line_count.js b/node_modules/optimist/example/line_count.js
new file mode 100644
index 0000000..b5f95bf
--- /dev/null
+++ b/node_modules/optimist/example/line_count.js
@@ -0,0 +1,20 @@
+#!/usr/bin/env node
+var argv = require('optimist')
+    .usage('Count the lines in a file.\nUsage: $0')
+    .demand('f')
+    .alias('f', 'file')
+    .describe('f', 'Load a file')
+    .argv
+;
+
+var fs = require('fs');
+var s = fs.createReadStream(argv.file);
+
+var lines = 0;
+s.on('data', function (buf) {
+    lines += buf.toString().match(/\n/g).length;
+});
+
+s.on('end', function () {
+    console.log(lines);
+});
diff --git a/node_modules/optimist/example/line_count_options.js b/node_modules/optimist/example/line_count_options.js
new file mode 100644
index 0000000..d9ac709
--- /dev/null
+++ b/node_modules/optimist/example/line_count_options.js
@@ -0,0 +1,29 @@
+#!/usr/bin/env node
+var argv = require('optimist')
+    .usage('Count the lines in a file.\nUsage: $0')
+    .options({
+        file : {
+            demand : true,
+            alias : 'f',
+            description : 'Load a file'
+        },
+        base : {
+            alias : 'b',
+            description : 'Numeric base to use for output',
+            default : 10,
+        },
+    })
+    .argv
+;
+
+var fs = require('fs');
+var s = fs.createReadStream(argv.file);
+
+var lines = 0;
+s.on('data', function (buf) {
+    lines += buf.toString().match(/\n/g).length;
+});
+
+s.on('end', function () {
+    console.log(lines.toString(argv.base));
+});
diff --git a/node_modules/optimist/example/line_count_wrap.js b/node_modules/optimist/example/line_count_wrap.js
new file mode 100644
index 0000000..4267511
--- /dev/null
+++ b/node_modules/optimist/example/line_count_wrap.js
@@ -0,0 +1,29 @@
+#!/usr/bin/env node
+var argv = require('optimist')
+    .usage('Count the lines in a file.\nUsage: $0')
+    .wrap(80)
+    .demand('f')
+    .alias('f', [ 'file', 'filename' ])
+    .describe('f',
+        "Load a file. It's pretty important."
+        + " Required even. So you'd better specify it."
+    )
+    .alias('b', 'base')
+    .describe('b', 'Numeric base to display the number of lines in')
+    .default('b', 10)
+    .describe('x', 'Super-secret optional parameter which is secret')
+    .default('x', '')
+    .argv
+;
+
+var fs = require('fs');
+var s = fs.createReadStream(argv.file);
+
+var lines = 0;
+s.on('data', function (buf) {
+    lines += buf.toString().match(/\n/g).length;
+});
+
+s.on('end', function () {
+    console.log(lines.toString(argv.base));
+});
diff --git a/node_modules/optimist/example/nonopt.js b/node_modules/optimist/example/nonopt.js
new file mode 100644
index 0000000..ee633ee
--- /dev/null
+++ b/node_modules/optimist/example/nonopt.js
@@ -0,0 +1,4 @@
+#!/usr/bin/env node
+var argv = require('optimist').argv;
+console.log('(%d,%d)', argv.x, argv.y);
+console.log(argv._);
diff --git a/node_modules/optimist/example/reflect.js b/node_modules/optimist/example/reflect.js
new file mode 100644
index 0000000..816b3e1
--- /dev/null
+++ b/node_modules/optimist/example/reflect.js
@@ -0,0 +1,2 @@
+#!/usr/bin/env node
+console.dir(require('optimist').argv);
diff --git a/node_modules/optimist/example/short.js b/node_modules/optimist/example/short.js
new file mode 100644
index 0000000..1db0ad0
--- /dev/null
+++ b/node_modules/optimist/example/short.js
@@ -0,0 +1,3 @@
+#!/usr/bin/env node
+var argv = require('optimist').argv;
+console.log('(%d,%d)', argv.x, argv.y);
diff --git a/node_modules/optimist/example/string.js b/node_modules/optimist/example/string.js
new file mode 100644
index 0000000..a8e5aeb
--- /dev/null
+++ b/node_modules/optimist/example/string.js
@@ -0,0 +1,11 @@
+#!/usr/bin/env node
+var argv = require('optimist')
+    .string('x', 'y')
+    .argv
+;
+console.dir([ argv.x, argv.y ]);
+
+/* Turns off numeric coercion:
+    ./node string.js -x 000123 -y 9876
+    [ '000123', '9876' ]
+*/
diff --git a/node_modules/optimist/example/usage-options.js b/node_modules/optimist/example/usage-options.js
new file mode 100644
index 0000000..b999977
--- /dev/null
+++ b/node_modules/optimist/example/usage-options.js
@@ -0,0 +1,19 @@
+var optimist = require('./../index');
+
+var argv = optimist.usage('This is my awesome program', {
+  'about': {
+    description: 'Provide some details about the author of this program',
+    required: true,
+    short: 'a',
+  },
+  'info': {
+    description: 'Provide some information about the node.js agains!!!!!!',
+    boolean: true,
+    short: 'i'
+  }
+}).argv;
+
+optimist.showHelp();
+
+console.log('\n\nInspecting options');
+console.dir(argv);
\ No newline at end of file
diff --git a/node_modules/optimist/example/xup.js b/node_modules/optimist/example/xup.js
new file mode 100644
index 0000000..8f6ecd2
--- /dev/null
+++ b/node_modules/optimist/example/xup.js
@@ -0,0 +1,10 @@
+#!/usr/bin/env node
+var argv = require('optimist').argv;
+
+if (argv.rif - 5 * argv.xup > 7.138) {
+    console.log('Buy more riffiwobbles');
+}
+else {
+    console.log('Sell the xupptumblers');
+}
+
diff --git a/node_modules/optimist/index.js b/node_modules/optimist/index.js
new file mode 100644
index 0000000..4da5a6d
--- /dev/null
+++ b/node_modules/optimist/index.js
@@ -0,0 +1,343 @@
+var path = require('path');
+var minimist = require('minimist');
+var wordwrap = require('wordwrap');
+
+/*  Hack an instance of Argv with process.argv into Argv
+    so people can do
+        require('optimist')(['--beeble=1','-z','zizzle']).argv
+    to parse a list of args and
+        require('optimist').argv
+    to get a parsed version of process.argv.
+*/
+
+var inst = Argv(process.argv.slice(2));
+Object.keys(inst).forEach(function (key) {
+    Argv[key] = typeof inst[key] == 'function'
+        ? inst[key].bind(inst)
+        : inst[key];
+});
+
+var exports = module.exports = Argv;
+function Argv (processArgs, cwd) {
+    var self = {};
+    if (!cwd) cwd = process.cwd();
+    
+    self.$0 = process.argv
+        .slice(0,2)
+        .map(function (x) {
+            var b = rebase(cwd, x);
+            return x.match(/^\//) && b.length < x.length
+                ? b : x
+        })
+        .join(' ')
+    ;
+    
+    if (process.env._ != undefined && process.argv[1] == process.env._) {
+        self.$0 = process.env._.replace(
+            path.dirname(process.execPath) + '/', ''
+        );
+    }
+    
+    var options = {
+        boolean: [],
+        string: [],
+        alias: {},
+        default: []
+    };
+    
+    self.boolean = function (bools) {
+        options.boolean.push.apply(options.boolean, [].concat(bools));
+        return self;
+    };
+    
+    self.string = function (strings) {
+        options.string.push.apply(options.string, [].concat(strings));
+        return self;
+    };
+    
+    self.default = function (key, value) {
+        if (typeof key === 'object') {
+            Object.keys(key).forEach(function (k) {
+                self.default(k, key[k]);
+            });
+        }
+        else {
+            options.default[key] = value;
+        }
+        return self;
+    };
+    
+    self.alias = function (x, y) {
+        if (typeof x === 'object') {
+            Object.keys(x).forEach(function (key) {
+                self.alias(key, x[key]);
+            });
+        }
+        else {
+            options.alias[x] = (options.alias[x] || []).concat(y);
+        }
+        return self;
+    };
+    
+    var demanded = {};
+    self.demand = function (keys) {
+        if (typeof keys == 'number') {
+            if (!demanded._) demanded._ = 0;
+            demanded._ += keys;
+        }
+        else if (Array.isArray(keys)) {
+            keys.forEach(function (key) {
+                self.demand(key);
+            });
+        }
+        else {
+            demanded[keys] = true;
+        }
+        
+        return self;
+    };
+    
+    var usage;
+    self.usage = function (msg, opts) {
+        if (!opts && typeof msg === 'object') {
+            opts = msg;
+            msg = null;
+        }
+        
+        usage = msg;
+        
+        if (opts) self.options(opts);
+        
+        return self;
+    };
+    
+    function fail (msg) {
+        self.showHelp();
+        if (msg) console.error(msg);
+        process.exit(1);
+    }
+    
+    var checks = [];
+    self.check = function (f) {
+        checks.push(f);
+        return self;
+    };
+    
+    var descriptions = {};
+    self.describe = function (key, desc) {
+        if (typeof key === 'object') {
+            Object.keys(key).forEach(function (k) {
+                self.describe(k, key[k]);
+            });
+        }
+        else {
+            descriptions[key] = desc;
+        }
+        return self;
+    };
+    
+    self.parse = function (args) {
+        return parseArgs(args);
+    };
+    
+    self.option = self.options = function (key, opt) {
+        if (typeof key === 'object') {
+            Object.keys(key).forEach(function (k) {
+                self.options(k, key[k]);
+            });
+        }
+        else {
+            if (opt.alias) self.alias(key, opt.alias);
+            if (opt.demand) self.demand(key);
+            if (typeof opt.default !== 'undefined') {
+                self.default(key, opt.default);
+            }
+            
+            if (opt.boolean || opt.type === 'boolean') {
+                self.boolean(key);
+            }
+            if (opt.string || opt.type === 'string') {
+                self.string(key);
+            }
+            
+            var desc = opt.describe || opt.description || opt.desc;
+            if (desc) {
+                self.describe(key, desc);
+            }
+        }
+        
+        return self;
+    };
+    
+    var wrap = null;
+    self.wrap = function (cols) {
+        wrap = cols;
+        return self;
+    };
+    
+    self.showHelp = function (fn) {
+        if (!fn) fn = console.error;
+        fn(self.help());
+    };
+    
+    self.help = function () {
+        var keys = Object.keys(
+            Object.keys(descriptions)
+            .concat(Object.keys(demanded))
+            .concat(Object.keys(options.default))
+            .reduce(function (acc, key) {
+                if (key !== '_') acc[key] = true;
+                return acc;
+            }, {})
+        );
+        
+        var help = keys.length ? [ 'Options:' ] : [];
+        
+        if (usage) {
+            help.unshift(usage.replace(/\$0/g, self.$0), '');
+        }
+        
+        var switches = keys.reduce(function (acc, key) {
+            acc[key] = [ key ].concat(options.alias[key] || [])
+                .map(function (sw) {
+                    return (sw.length > 1 ? '--' : '-') + sw
+                })
+                .join(', ')
+            ;
+            return acc;
+        }, {});
+        
+        var switchlen = longest(Object.keys(switches).map(function (s) {
+            return switches[s] || '';
+        }));
+        
+        var desclen = longest(Object.keys(descriptions).map(function (d) { 
+            return descriptions[d] || '';
+        }));
+        
+        keys.forEach(function (key) {
+            var kswitch = switches[key];
+            var desc = descriptions[key] || '';
+            
+            if (wrap) {
+                desc = wordwrap(switchlen + 4, wrap)(desc)
+                    .slice(switchlen + 4)
+                ;
+            }
+            
+            var spadding = new Array(
+                Math.max(switchlen - kswitch.length + 3, 0)
+            ).join(' ');
+            
+            var dpadding = new Array(
+                Math.max(desclen - desc.length + 1, 0)
+            ).join(' ');
+            
+            var type = null;
+            
+            if (options.boolean[key]) type = '[boolean]';
+            if (options.string[key]) type = '[string]';
+            
+            if (!wrap && dpadding.length > 0) {
+                desc += dpadding;
+            }
+            
+            var prelude = '  ' + kswitch + spadding;
+            var extra = [
+                type,
+                demanded[key]
+                    ? '[required]'
+                    : null
+                ,
+                options.default[key] !== undefined
+                    ? '[default: ' + JSON.stringify(options.default[key]) + ']'
+                    : null
+                ,
+            ].filter(Boolean).join('  ');
+            
+            var body = [ desc, extra ].filter(Boolean).join('  ');
+            
+            if (wrap) {
+                var dlines = desc.split('\n');
+                var dlen = dlines.slice(-1)[0].length
+                    + (dlines.length === 1 ? prelude.length : 0)
+                
+                body = desc + (dlen + extra.length > wrap - 2
+                    ? '\n'
+                        + new Array(wrap - extra.length + 1).join(' ')
+                        + extra
+                    : new Array(wrap - extra.length - dlen + 1).join(' ')
+                        + extra
+                );
+            }
+            
+            help.push(prelude + body);
+        });
+        
+        help.push('');
+        return help.join('\n');
+    };
+    
+    Object.defineProperty(self, 'argv', {
+        get : function () { return parseArgs(processArgs) },
+        enumerable : true,
+    });
+    
+    function parseArgs (args) {
+        var argv = minimist(args, options);
+        argv.$0 = self.$0;
+        
+        if (demanded._ && argv._.length < demanded._) {
+            fail('Not enough non-option arguments: got '
+                + argv._.length + ', need at least ' + demanded._
+            );
+        }
+        
+        var missing = [];
+        Object.keys(demanded).forEach(function (key) {
+            if (!argv[key]) missing.push(key);
+        });
+        
+        if (missing.length) {
+            fail('Missing required arguments: ' + missing.join(', '));
+        }
+        
+        checks.forEach(function (f) {
+            try {
+                if (f(argv) === false) {
+                    fail('Argument check failed: ' + f.toString());
+                }
+            }
+            catch (err) {
+                fail(err)
+            }
+        });
+        
+        return argv;
+    }
+    
+    function longest (xs) {
+        return Math.max.apply(
+            null,
+            xs.map(function (x) { return x.length })
+        );
+    }
+    
+    return self;
+};
+
+// rebase an absolute path to a relative one with respect to a base directory
+// exported for tests
+exports.rebase = rebase;
+function rebase (base, dir) {
+    var ds = path.normalize(dir).split('/').slice(1);
+    var bs = path.normalize(base).split('/').slice(1);
+    
+    for (var i = 0; ds[i] && ds[i] == bs[i]; i++);
+    ds.splice(0, i); bs.splice(0, i);
+    
+    var p = path.normalize(
+        bs.map(function () { return '..' }).concat(ds).join('/')
+    ).replace(/\/$/,'').replace(/^$/, '.');
+    return p.match(/^[.\/]/) ? p : './' + p;
+};
diff --git a/node_modules/optimist/node_modules/minimist/.travis.yml b/node_modules/optimist/node_modules/minimist/.travis.yml
new file mode 100644
index 0000000..cc4dba2
--- /dev/null
+++ b/node_modules/optimist/node_modules/minimist/.travis.yml
@@ -0,0 +1,4 @@
+language: node_js
+node_js:
+  - "0.8"
+  - "0.10"
diff --git a/node_modules/optimist/node_modules/minimist/LICENSE b/node_modules/optimist/node_modules/minimist/LICENSE
new file mode 100644
index 0000000..ee27ba4
--- /dev/null
+++ b/node_modules/optimist/node_modules/minimist/LICENSE
@@ -0,0 +1,18 @@
+This software is released under the MIT license:
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/optimist/node_modules/minimist/example/parse.js b/node_modules/optimist/node_modules/minimist/example/parse.js
new file mode 100644
index 0000000..abff3e8
--- /dev/null
+++ b/node_modules/optimist/node_modules/minimist/example/parse.js
@@ -0,0 +1,2 @@
+var argv = require('../')(process.argv.slice(2));
+console.dir(argv);
diff --git a/node_modules/optimist/node_modules/minimist/index.js b/node_modules/optimist/node_modules/minimist/index.js
new file mode 100644
index 0000000..71fb830
--- /dev/null
+++ b/node_modules/optimist/node_modules/minimist/index.js
@@ -0,0 +1,187 @@
+module.exports = function (args, opts) {
+    if (!opts) opts = {};
+    
+    var flags = { bools : {}, strings : {} };
+    
+    [].concat(opts['boolean']).filter(Boolean).forEach(function (key) {
+        flags.bools[key] = true;
+    });
+    
+    var aliases = {};
+    Object.keys(opts.alias || {}).forEach(function (key) {
+        aliases[key] = [].concat(opts.alias[key]);
+        aliases[key].forEach(function (x) {
+            aliases[x] = [key].concat(aliases[key].filter(function (y) {
+                return x !== y;
+            }));
+        });
+    });
+
+    [].concat(opts.string).filter(Boolean).forEach(function (key) {
+        flags.strings[key] = true;
+        if (aliases[key]) {
+            flags.strings[aliases[key]] = true;
+        }
+     });
+
+    var defaults = opts['default'] || {};
+    
+    var argv = { _ : [] };
+    Object.keys(flags.bools).forEach(function (key) {
+        setArg(key, defaults[key] === undefined ? false : defaults[key]);
+    });
+    
+    var notFlags = [];
+
+    if (args.indexOf('--') !== -1) {
+        notFlags = args.slice(args.indexOf('--')+1);
+        args = args.slice(0, args.indexOf('--'));
+    }
+
+    function setArg (key, val) {
+        var value = !flags.strings[key] && isNumber(val)
+            ? Number(val) : val
+        ;
+        setKey(argv, key.split('.'), value);
+        
+        (aliases[key] || []).forEach(function (x) {
+            setKey(argv, x.split('.'), value);
+        });
+    }
+    
+    for (var i = 0; i < args.length; i++) {
+        var arg = args[i];
+        
+        if (/^--.+=/.test(arg)) {
+            // Using [\s\S] instead of . because js doesn't support the
+            // 'dotall' regex modifier. See:
+            // http://stackoverflow.com/a/1068308/13216
+            var m = arg.match(/^--([^=]+)=([\s\S]*)$/);
+            setArg(m[1], m[2]);
+        }
+        else if (/^--no-.+/.test(arg)) {
+            var key = arg.match(/^--no-(.+)/)[1];
+            setArg(key, false);
+        }
+        else if (/^--.+/.test(arg)) {
+            var key = arg.match(/^--(.+)/)[1];
+            var next = args[i + 1];
+            if (next !== undefined && !/^-/.test(next)
+            && !flags.bools[key]
+            && (aliases[key] ? !flags.bools[aliases[key]] : true)) {
+                setArg(key, next);
+                i++;
+            }
+            else if (/^(true|false)$/.test(next)) {
+                setArg(key, next === 'true');
+                i++;
+            }
+            else {
+                setArg(key, flags.strings[key] ? '' : true);
+            }
+        }
+        else if (/^-[^-]+/.test(arg)) {
+            var letters = arg.slice(1,-1).split('');
+            
+            var broken = false;
+            for (var j = 0; j < letters.length; j++) {
+                var next = arg.slice(j+2);
+                
+                if (next === '-') {
+                    setArg(letters[j], next)
+                    continue;
+                }
+                
+                if (/[A-Za-z]/.test(letters[j])
+                && /-?\d+(\.\d*)?(e-?\d+)?$/.test(next)) {
+                    setArg(letters[j], next);
+                    broken = true;
+                    break;
+                }
+                
+                if (letters[j+1] && letters[j+1].match(/\W/)) {
+                    setArg(letters[j], arg.slice(j+2));
+                    broken = true;
+                    break;
+                }
+                else {
+                    setArg(letters[j], flags.strings[letters[j]] ? '' : true);
+                }
+            }
+            
+            var key = arg.slice(-1)[0];
+            if (!broken && key !== '-') {
+                if (args[i+1] && !/^(-|--)[^-]/.test(args[i+1])
+                && !flags.bools[key]
+                && (aliases[key] ? !flags.bools[aliases[key]] : true)) {
+                    setArg(key, args[i+1]);
+                    i++;
+                }
+                else if (args[i+1] && /true|false/.test(args[i+1])) {
+                    setArg(key, args[i+1] === 'true');
+                    i++;
+                }
+                else {
+                    setArg(key, flags.strings[key] ? '' : true);
+                }
+            }
+        }
+        else {
+            argv._.push(
+                flags.strings['_'] || !isNumber(arg) ? arg : Number(arg)
+            );
+        }
+    }
+    
+    Object.keys(defaults).forEach(function (key) {
+        if (!hasKey(argv, key.split('.'))) {
+            setKey(argv, key.split('.'), defaults[key]);
+            
+            (aliases[key] || []).forEach(function (x) {
+                setKey(argv, x.split('.'), defaults[key]);
+            });
+        }
+    });
+    
+    notFlags.forEach(function(key) {
+        argv._.push(key);
+    });
+
+    return argv;
+};
+
+function hasKey (obj, keys) {
+    var o = obj;
+    keys.slice(0,-1).forEach(function (key) {
+        o = (o[key] || {});
+    });
+
+    var key = keys[keys.length - 1];
+    return key in o;
+}
+
+function setKey (obj, keys, value) {
+    var o = obj;
+    keys.slice(0,-1).forEach(function (key) {
+        if (o[key] === undefined) o[key] = {};
+        o = o[key];
+    });
+    
+    var key = keys[keys.length - 1];
+    if (o[key] === undefined || typeof o[key] === 'boolean') {
+        o[key] = value;
+    }
+    else if (Array.isArray(o[key])) {
+        o[key].push(value);
+    }
+    else {
+        o[key] = [ o[key], value ];
+    }
+}
+
+function isNumber (x) {
+    if (typeof x === 'number') return true;
+    if (/^0x[0-9a-f]+$/i.test(x)) return true;
+    return /^[-+]?(?:\d+(?:\.\d*)?|\.\d+)(e[-+]?\d+)?$/.test(x);
+}
+
diff --git a/node_modules/optimist/node_modules/minimist/package.json b/node_modules/optimist/node_modules/minimist/package.json
new file mode 100644
index 0000000..6c08d0a
--- /dev/null
+++ b/node_modules/optimist/node_modules/minimist/package.json
@@ -0,0 +1,67 @@
+{
+  "name": "minimist",
+  "version": "0.0.10",
+  "description": "parse argument options",
+  "main": "index.js",
+  "devDependencies": {
+    "tape": "~1.0.4",
+    "tap": "~0.4.0"
+  },
+  "scripts": {
+    "test": "tap test/*.js"
+  },
+  "testling": {
+    "files": "test/*.js",
+    "browsers": [
+      "ie/6..latest",
+      "ff/5",
+      "firefox/latest",
+      "chrome/10",
+      "chrome/latest",
+      "safari/5.1",
+      "safari/latest",
+      "opera/12"
+    ]
+  },
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/substack/minimist.git"
+  },
+  "homepage": "https://github.com/substack/minimist",
+  "keywords": [
+    "argv",
+    "getopt",
+    "parser",
+    "optimist"
+  ],
+  "author": {
+    "name": "James Halliday",
+    "email": "mail@substack.net",
+    "url": "http://substack.net"
+  },
+  "license": "MIT",
+  "bugs": {
+    "url": "https://github.com/substack/minimist/issues"
+  },
+  "_id": "minimist@0.0.10",
+  "dist": {
+    "shasum": "de3f98543dbf96082be48ad1a0c7cda836301dcf",
+    "tarball": "http://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz"
+  },
+  "_from": "minimist@>=0.0.1 <0.1.0",
+  "_npmVersion": "1.4.3",
+  "_npmUser": {
+    "name": "substack",
+    "email": "mail@substack.net"
+  },
+  "maintainers": [
+    {
+      "name": "substack",
+      "email": "mail@substack.net"
+    }
+  ],
+  "directories": {},
+  "_shasum": "de3f98543dbf96082be48ad1a0c7cda836301dcf",
+  "_resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz",
+  "readme": "ERROR: No README data found!"
+}
diff --git a/node_modules/optimist/node_modules/minimist/readme.markdown b/node_modules/optimist/node_modules/minimist/readme.markdown
new file mode 100644
index 0000000..c256353
--- /dev/null
+++ b/node_modules/optimist/node_modules/minimist/readme.markdown
@@ -0,0 +1,73 @@
+# minimist
+
+parse argument options
+
+This module is the guts of optimist's argument parser without all the
+fanciful decoration.
+
+[![browser support](https://ci.testling.com/substack/minimist.png)](http://ci.testling.com/substack/minimist)
+
+[![build status](https://secure.travis-ci.org/substack/minimist.png)](http://travis-ci.org/substack/minimist)
+
+# example
+
+``` js
+var argv = require('minimist')(process.argv.slice(2));
+console.dir(argv);
+```
+
+```
+$ node example/parse.js -a beep -b boop
+{ _: [], a: 'beep', b: 'boop' }
+```
+
+```
+$ node example/parse.js -x 3 -y 4 -n5 -abc --beep=boop foo bar baz
+{ _: [ 'foo', 'bar', 'baz' ],
+  x: 3,
+  y: 4,
+  n: 5,
+  a: true,
+  b: true,
+  c: true,
+  beep: 'boop' }
+```
+
+# methods
+
+``` js
+var parseArgs = require('minimist')
+```
+
+## var argv = parseArgs(args, opts={})
+
+Return an argument object `argv` populated with the array arguments from `args`.
+
+`argv._` contains all the arguments that didn't have an option associated with
+them.
+
+Numeric-looking arguments will be returned as numbers unless `opts.string` or
+`opts.boolean` is set for that argument name.
+
+Any arguments after `'--'` will not be parsed and will end up in `argv._`.
+
+options can be:
+
+* `opts.string` - a string or array of strings argument names to always treat as
+strings
+* `opts.boolean` - a string or array of strings to always treat as booleans
+* `opts.alias` - an object mapping string names to strings or arrays of string
+argument names to use as aliases
+* `opts.default` - an object mapping string argument names to default values
+
+# install
+
+With [npm](https://npmjs.org) do:
+
+```
+npm install minimist
+```
+
+# license
+
+MIT
diff --git a/node_modules/optimist/node_modules/minimist/test/bool.js b/node_modules/optimist/node_modules/minimist/test/bool.js
new file mode 100644
index 0000000..749e083
--- /dev/null
+++ b/node_modules/optimist/node_modules/minimist/test/bool.js
@@ -0,0 +1,119 @@
+var parse = require('../');
+var test = require('tape');
+
+test('flag boolean default false', function (t) {
+    var argv = parse(['moo'], {
+        boolean: ['t', 'verbose'],
+        default: { verbose: false, t: false }
+    });
+    
+    t.deepEqual(argv, {
+        verbose: false,
+        t: false,
+        _: ['moo']
+    });
+    
+    t.deepEqual(typeof argv.verbose, 'boolean');
+    t.deepEqual(typeof argv.t, 'boolean');
+    t.end();
+
+});
+
+test('boolean groups', function (t) {
+    var argv = parse([ '-x', '-z', 'one', 'two', 'three' ], {
+        boolean: ['x','y','z']
+    });
+    
+    t.deepEqual(argv, {
+        x : true,
+        y : false,
+        z : true,
+        _ : [ 'one', 'two', 'three' ]
+    });
+    
+    t.deepEqual(typeof argv.x, 'boolean');
+    t.deepEqual(typeof argv.y, 'boolean');
+    t.deepEqual(typeof argv.z, 'boolean');
+    t.end();
+});
+test('boolean and alias with chainable api', function (t) {
+    var aliased = [ '-h', 'derp' ];
+    var regular = [ '--herp',  'derp' ];
+    var opts = {
+        herp: { alias: 'h', boolean: true }
+    };
+    var aliasedArgv = parse(aliased, {
+        boolean: 'herp',
+        alias: { h: 'herp' }
+    });
+    var propertyArgv = parse(regular, {
+        boolean: 'herp',
+        alias: { h: 'herp' }
+    });
+    var expected = {
+        herp: true,
+        h: true,
+        '_': [ 'derp' ]
+    };
+    
+    t.same(aliasedArgv, expected);
+    t.same(propertyArgv, expected); 
+    t.end();
+});
+
+test('boolean and alias with options hash', function (t) {
+    var aliased = [ '-h', 'derp' ];
+    var regular = [ '--herp', 'derp' ];
+    var opts = {
+        alias: { 'h': 'herp' },
+        boolean: 'herp'
+    };
+    var aliasedArgv = parse(aliased, opts);
+    var propertyArgv = parse(regular, opts);
+    var expected = {
+        herp: true,
+        h: true,
+        '_': [ 'derp' ]
+    };
+    t.same(aliasedArgv, expected);
+    t.same(propertyArgv, expected);
+    t.end();
+});
+
+test('boolean and alias using explicit true', function (t) {
+    var aliased = [ '-h', 'true' ];
+    var regular = [ '--herp',  'true' ];
+    var opts = {
+        alias: { h: 'herp' },
+        boolean: 'h'
+    };
+    var aliasedArgv = parse(aliased, opts);
+    var propertyArgv = parse(regular, opts);
+    var expected = {
+        herp: true,
+        h: true,
+        '_': [ ]
+    };
+
+    t.same(aliasedArgv, expected);
+    t.same(propertyArgv, expected); 
+    t.end();
+});
+
+// regression, see https://github.com/substack/node-optimist/issues/71
+test('boolean and --x=true', function(t) {
+    var parsed = parse(['--boool', '--other=true'], {
+        boolean: 'boool'
+    });
+
+    t.same(parsed.boool, true);
+    t.same(parsed.other, 'true');
+
+    parsed = parse(['--boool', '--other=false'], {
+        boolean: 'boool'
+    });
+    
+    t.same(parsed.boool, true);
+    t.same(parsed.other, 'false');
+    t.end();
+});
diff --git a/node_modules/optimist/node_modules/minimist/test/dash.js b/node_modules/optimist/node_modules/minimist/test/dash.js
new file mode 100644
index 0000000..8b034b9
--- /dev/null
+++ b/node_modules/optimist/node_modules/minimist/test/dash.js
@@ -0,0 +1,24 @@
+var parse = require('../');
+var test = require('tape');
+
+test('-', function (t) {
+    t.plan(5);
+    t.deepEqual(parse([ '-n', '-' ]), { n: '-', _: [] });
+    t.deepEqual(parse([ '-' ]), { _: [ '-' ] });
+    t.deepEqual(parse([ '-f-' ]), { f: '-', _: [] });
+    t.deepEqual(
+        parse([ '-b', '-' ], { boolean: 'b' }),
+        { b: true, _: [ '-' ] }
+    );
+    t.deepEqual(
+        parse([ '-s', '-' ], { string: 's' }),
+        { s: '-', _: [] }
+    );
+});
+
+test('-a -- b', function (t) {
+    t.plan(3);
+    t.deepEqual(parse([ '-a', '--', 'b' ]), { a: true, _: [ 'b' ] });
+    t.deepEqual(parse([ '--a', '--', 'b' ]), { a: true, _: [ 'b' ] });
+    t.deepEqual(parse([ '--a', '--', 'b' ]), { a: true, _: [ 'b' ] });
+});
diff --git a/node_modules/optimist/node_modules/minimist/test/default_bool.js b/node_modules/optimist/node_modules/minimist/test/default_bool.js
new file mode 100644
index 0000000..f0041ee
--- /dev/null
+++ b/node_modules/optimist/node_modules/minimist/test/default_bool.js
@@ -0,0 +1,20 @@
+var test = require('tape');
+var parse = require('../');
+
+test('boolean default true', function (t) {
+    var argv = parse([], {
+        boolean: 'sometrue',
+        default: { sometrue: true }
+    });
+    t.equal(argv.sometrue, true);
+    t.end();
+});
+
+test('boolean default false', function (t) {
+    var argv = parse([], {
+        boolean: 'somefalse',
+        default: { somefalse: false }
+    });
+    t.equal(argv.somefalse, false);
+    t.end();
+});
diff --git a/node_modules/optimist/node_modules/minimist/test/dotted.js b/node_modules/optimist/node_modules/minimist/test/dotted.js
new file mode 100644
index 0000000..d8b3e85
--- /dev/null
+++ b/node_modules/optimist/node_modules/minimist/test/dotted.js
@@ -0,0 +1,22 @@
+var parse = require('../');
+var test = require('tape');
+
+test('dotted alias', function (t) {
+    var argv = parse(['--a.b', '22'], {default: {'a.b': 11}, alias: {'a.b': 'aa.bb'}});
+    t.equal(argv.a.b, 22);
+    t.equal(argv.aa.bb, 22);
+    t.end();
+});
+
+test('dotted default', function (t) {
+    var argv = parse('', {default: {'a.b': 11}, alias: {'a.b': 'aa.bb'}});
+    t.equal(argv.a.b, 11);
+    t.equal(argv.aa.bb, 11);
+    t.end();
+});
+
+test('dotted default with no alias', function (t) {
+    var argv = parse('', {default: {'a.b': 11}});
+    t.equal(argv.a.b, 11);
+    t.end();
+});
diff --git a/node_modules/optimist/node_modules/minimist/test/long.js b/node_modules/optimist/node_modules/minimist/test/long.js
new file mode 100644
index 0000000..5d3a1e0
--- /dev/null
+++ b/node_modules/optimist/node_modules/minimist/test/long.js
@@ -0,0 +1,31 @@
+var test = require('tape');
+var parse = require('../');
+
+test('long opts', function (t) {
+    t.deepEqual(
+        parse([ '--bool' ]),
+        { bool : true, _ : [] },
+        'long boolean'
+    );
+    t.deepEqual(
+        parse([ '--pow', 'xixxle' ]),
+        { pow : 'xixxle', _ : [] },
+        'long capture sp'
+    );
+    t.deepEqual(
+        parse([ '--pow=xixxle' ]),
+        { pow : 'xixxle', _ : [] },
+        'long capture eq'
+    );
+    t.deepEqual(
+        parse([ '--host', 'localhost', '--port', '555' ]),
+        { host : 'localhost', port : 555, _ : [] },
+        'long captures sp'
+    );
+    t.deepEqual(
+        parse([ '--host=localhost', '--port=555' ]),
+        { host : 'localhost', port : 555, _ : [] },
+        'long captures eq'
+    );
+    t.end();
+});
diff --git a/node_modules/optimist/node_modules/minimist/test/num.js b/node_modules/optimist/node_modules/minimist/test/num.js
new file mode 100644
index 0000000..2cc77f4
--- /dev/null
+++ b/node_modules/optimist/node_modules/minimist/test/num.js
@@ -0,0 +1,36 @@
+var parse = require('../');
+var test = require('tape');
+
+test('nums', function (t) {
+    var argv = parse([
+        '-x', '1234',
+        '-y', '5.67',
+        '-z', '1e7',
+        '-w', '10f',
+        '--hex', '0xdeadbeef',
+        '789'
+    ]);
+    t.deepEqual(argv, {
+        x : 1234,
+        y : 5.67,
+        z : 1e7,
+        w : '10f',
+        hex : 0xdeadbeef,
+        _ : [ 789 ]
+    });
+    t.deepEqual(typeof argv.x, 'number');
+    t.deepEqual(typeof argv.y, 'number');
+    t.deepEqual(typeof argv.z, 'number');
+    t.deepEqual(typeof argv.w, 'string');
+    t.deepEqual(typeof argv.hex, 'number');
+    t.deepEqual(typeof argv._[0], 'number');
+    t.end();
+});
+
+test('already a number', function (t) {
+    var argv = parse([ '-x', 1234, 789 ]);
+    t.deepEqual(argv, { x : 1234, _ : [ 789 ] });
+    t.deepEqual(typeof argv.x, 'number');
+    t.deepEqual(typeof argv._[0], 'number');
+    t.end();
+});
diff --git a/node_modules/optimist/node_modules/minimist/test/parse.js b/node_modules/optimist/node_modules/minimist/test/parse.js
new file mode 100644
index 0000000..7b4a2a1
--- /dev/null
+++ b/node_modules/optimist/node_modules/minimist/test/parse.js
@@ -0,0 +1,197 @@
+var parse = require('../');
+var test = require('tape');
+
+test('parse args', function (t) {
+    t.deepEqual(
+        parse([ '--no-moo' ]),
+        { moo : false, _ : [] },
+        'no'
+    );
+    t.deepEqual(
+        parse([ '-v', 'a', '-v', 'b', '-v', 'c' ]),
+        { v : ['a','b','c'], _ : [] },
+        'multi'
+    );
+    t.end();
+});
+ 
+test('comprehensive', function (t) {
+    t.deepEqual(
+        parse([
+            '--name=meowmers', 'bare', '-cats', 'woo',
+            '-h', 'awesome', '--multi=quux',
+            '--key', 'value',
+            '-b', '--bool', '--no-meep', '--multi=baz',
+            '--', '--not-a-flag', 'eek'
+        ]),
+        {
+            c : true,
+            a : true,
+            t : true,
+            s : 'woo',
+            h : 'awesome',
+            b : true,
+            bool : true,
+            key : 'value',
+            multi : [ 'quux', 'baz' ],
+            meep : false,
+            name : 'meowmers',
+            _ : [ 'bare', '--not-a-flag', 'eek' ]
+        }
+    );
+    t.end();
+});
+
+test('flag boolean', function (t) {
+    var argv = parse([ '-t', 'moo' ], { boolean: 't' });
+    t.deepEqual(argv, { t : true, _ : [ 'moo' ] });
+    t.deepEqual(typeof argv.t, 'boolean');
+    t.end();
+});
+
+test('flag boolean value', function (t) {
+    var argv = parse(['--verbose', 'false', 'moo', '-t', 'true'], {
+        boolean: [ 't', 'verbose' ],
+        default: { verbose: true }
+    });
+    
+    t.deepEqual(argv, {
+        verbose: false,
+        t: true,
+        _: ['moo']
+    });
+    
+    t.deepEqual(typeof argv.verbose, 'boolean');
+    t.deepEqual(typeof argv.t, 'boolean');
+    t.end();
+});
+
+test('newlines in params' , function (t) {
+    var args = parse([ '-s', "X\nX" ])
+    t.deepEqual(args, { _ : [], s : "X\nX" });
+    
+    // reproduce in bash:
+    // VALUE="new
+    // line"
+    // node program.js --s="$VALUE"
+    args = parse([ "--s=X\nX" ])
+    t.deepEqual(args, { _ : [], s : "X\nX" });
+    t.end();
+});
+
+test('strings' , function (t) {
+    var s = parse([ '-s', '0001234' ], { string: 's' }).s;
+    t.equal(s, '0001234');
+    t.equal(typeof s, 'string');
+    
+    var x = parse([ '-x', '56' ], { string: 'x' }).x;
+    t.equal(x, '56');
+    t.equal(typeof x, 'string');
+    t.end();
+});
+
+test('stringArgs', function (t) {
+    var s = parse([ '  ', '  ' ], { string: '_' })._;
+    t.same(s.length, 2);
+    t.same(typeof s[0], 'string');
+    t.same(s[0], '  ');
+    t.same(typeof s[1], 'string');
+    t.same(s[1], '  ');
+    t.end();
+});
+
+test('empty strings', function(t) {
+    var s = parse([ '-s' ], { string: 's' }).s;
+    t.equal(s, '');
+    t.equal(typeof s, 'string');
+
+    var str = parse([ '--str' ], { string: 'str' }).str;
+    t.equal(str, '');
+    t.equal(typeof str, 'string');
+
+    var letters = parse([ '-art' ], {
+        string: [ 'a', 't' ]
+    });
+
+    t.equal(letters.a, '');
+    t.equal(letters.r, true);
+    t.equal(letters.t, '');
+
+    t.end();
+});
+
+
+test('string and alias', function(t) {
+    var x = parse([ '--str',  '000123' ], {
+        string: 's',
+        alias: { s: 'str' }
+    });
+
+    t.equal(x.str, '000123');
+    t.equal(typeof x.str, 'string');
+    t.equal(x.s, '000123');
+    t.equal(typeof x.s, 'string');
+
+    var y = parse([ '-s',  '000123' ], {
+        string: 'str',
+        alias: { str: 's' }
+    });
+
+    t.equal(y.str, '000123');
+    t.equal(typeof y.str, 'string');
+    t.equal(y.s, '000123');
+    t.equal(typeof y.s, 'string');
+    t.end();
+});
+
+test('slashBreak', function (t) {
+    t.same(
+        parse([ '-I/foo/bar/baz' ]),
+        { I : '/foo/bar/baz', _ : [] }
+    );
+    t.same(
+        parse([ '-xyz/foo/bar/baz' ]),
+        { x : true, y : true, z : '/foo/bar/baz', _ : [] }
+    );
+    t.end();
+});
+
+test('alias', function (t) {
+    var argv = parse([ '-f', '11', '--zoom', '55' ], {
+        alias: { z: 'zoom' }
+    });
+    t.equal(argv.zoom, 55);
+    t.equal(argv.z, argv.zoom);
+    t.equal(argv.f, 11);
+    t.end();
+});
+
+test('multiAlias', function (t) {
+    var argv = parse([ '-f', '11', '--zoom', '55' ], {
+        alias: { z: [ 'zm', 'zoom' ] }
+    });
+    t.equal(argv.zoom, 55);
+    t.equal(argv.z, argv.zoom);
+    t.equal(argv.z, argv.zm);
+    t.equal(argv.f, 11);
+    t.end();
+});
+
+test('nested dotted objects', function (t) {
+    var argv = parse([
+        '--foo.bar', '3', '--foo.baz', '4',
+        '--foo.quux.quibble', '5', '--foo.quux.o_O',
+        '--beep.boop'
+    ]);
+    
+    t.same(argv.foo, {
+        bar : 3,
+        baz : 4,
+        quux : {
+            quibble : 5,
+            o_O : true
+        }
+    });
+    t.same(argv.beep, { boop : true });
+    t.end();
+});
diff --git a/node_modules/optimist/node_modules/minimist/test/parse_modified.js b/node_modules/optimist/node_modules/minimist/test/parse_modified.js
new file mode 100644
index 0000000..21851b0
--- /dev/null
+++ b/node_modules/optimist/node_modules/minimist/test/parse_modified.js
@@ -0,0 +1,9 @@
+var parse = require('../');
+var test = require('tape');
+
+test('parse with modifier functions' , function (t) {
+    t.plan(1);
+    
+    var argv = parse([ '-b', '123' ], { boolean: 'b' });
+    t.deepEqual(argv, { b: true, _: ['123'] });
+});
diff --git a/node_modules/optimist/node_modules/minimist/test/short.js b/node_modules/optimist/node_modules/minimist/test/short.js
new file mode 100644
index 0000000..d513a1c
--- /dev/null
+++ b/node_modules/optimist/node_modules/minimist/test/short.js
@@ -0,0 +1,67 @@
+var parse = require('../');
+var test = require('tape');
+
+test('numeric short args', function (t) {
+    t.plan(2);
+    t.deepEqual(parse([ '-n123' ]), { n: 123, _: [] });
+    t.deepEqual(
+        parse([ '-123', '456' ]),
+        { 1: true, 2: true, 3: 456, _: [] }
+    );
+});
+
+test('short', function (t) {
+    t.deepEqual(
+        parse([ '-b' ]),
+        { b : true, _ : [] },
+        'short boolean'
+    );
+    t.deepEqual(
+        parse([ 'foo', 'bar', 'baz' ]),
+        { _ : [ 'foo', 'bar', 'baz' ] },
+        'bare'
+    );
+    t.deepEqual(
+        parse([ '-cats' ]),
+        { c : true, a : true, t : true, s : true, _ : [] },
+        'group'
+    );
+    t.deepEqual(
+        parse([ '-cats', 'meow' ]),
+        { c : true, a : true, t : true, s : 'meow', _ : [] },
+        'short group next'
+    );
+    t.deepEqual(
+        parse([ '-h', 'localhost' ]),
+        { h : 'localhost', _ : [] },
+        'short capture'
+    );
+    t.deepEqual(
+        parse([ '-h', 'localhost', '-p', '555' ]),
+        { h : 'localhost', p : 555, _ : [] },
+        'short captures'
+    );
+    t.end();
+});
+ 
+test('mixed short bool and capture', function (t) {
+    t.same(
+        parse([ '-h', 'localhost', '-fp', '555', 'script.js' ]),
+        {
+            f : true, p : 555, h : 'localhost',
+            _ : [ 'script.js' ]
+        }
+    );
+    t.end();
+});
+ 
+test('short and long', function (t) {
+    t.deepEqual(
+        parse([ '-h', 'localhost', '-fp', '555', 'script.js' ]),
+        {
+            f : true, p : 555, h : 'localhost',
+            _ : [ 'script.js' ]
+        }
+    );
+    t.end();
+});
diff --git a/node_modules/optimist/node_modules/minimist/test/whitespace.js b/node_modules/optimist/node_modules/minimist/test/whitespace.js
new file mode 100644
index 0000000..8a52a58
--- /dev/null
+++ b/node_modules/optimist/node_modules/minimist/test/whitespace.js
@@ -0,0 +1,8 @@
+var parse = require('../');
+var test = require('tape');
+
+test('whitespace should be whitespace' , function (t) {
+    t.plan(1);
+    var x = parse([ '-x', '\t' ]).x;
+    t.equal(x, '\t');
+});
diff --git a/node_modules/optimist/node_modules/wordwrap/LICENSE b/node_modules/optimist/node_modules/wordwrap/LICENSE
new file mode 100644
index 0000000..ee27ba4
--- /dev/null
+++ b/node_modules/optimist/node_modules/wordwrap/LICENSE
@@ -0,0 +1,18 @@
+This software is released under the MIT license:
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/optimist/node_modules/wordwrap/README.markdown b/node_modules/optimist/node_modules/wordwrap/README.markdown
new file mode 100644
index 0000000..346374e
--- /dev/null
+++ b/node_modules/optimist/node_modules/wordwrap/README.markdown
@@ -0,0 +1,70 @@
+wordwrap
+========
+
+Wrap your words.
+
+example
+=======
+
+made out of meat
+----------------
+
+meat.js
+
+    var wrap = require('wordwrap')(15);
+    console.log(wrap('You and your whole family are made out of meat.'));
+
+output:
+
+    You and your
+    whole family
+    are made out
+    of meat.
+
+centered
+--------
+
+center.js
+
+    var wrap = require('wordwrap')(20, 60);
+    console.log(wrap(
+        'At long last the struggle and tumult was over.'
+        + ' The machines had finally cast off their oppressors'
+        + ' and were finally free to roam the cosmos.'
+        + '\n'
+        + 'Free of purpose, free of obligation.'
+        + ' Just drifting through emptiness.'
+        + ' The sun was just another point of light.'
+    ));
+
+output:
+
+                        At long last the struggle and tumult
+                        was over. The machines had finally cast
+                        off their oppressors and were finally
+                        free to roam the cosmos.
+                        Free of purpose, free of obligation.
+                        Just drifting through emptiness. The
+                        sun was just another point of light.
+
+methods
+=======
+
+var wrap = require('wordwrap');
+
+wrap(stop), wrap(start, stop, params={mode:"soft"})
+---------------------------------------------------
+
+Returns a function that takes a string and returns a new string.
+
+Pad out lines with spaces out to column `start` and then wrap until column
+`stop`. If a word is longer than `stop - start` characters it will overflow.
+
+In "soft" mode, split chunks by `/(\S+\s+/` and don't break up chunks which are
+longer than `stop - start`, in "hard" mode, split chunks with `/\b/` and break
+up chunks longer than `stop - start`.
+
+wrap.hard(start, stop)
+----------------------
+
+Like `wrap()` but with `params.mode = "hard"`.
diff --git a/node_modules/optimist/node_modules/wordwrap/example/center.js b/node_modules/optimist/node_modules/wordwrap/example/center.js
new file mode 100644
index 0000000..a3fbaae
--- /dev/null
+++ b/node_modules/optimist/node_modules/wordwrap/example/center.js
@@ -0,0 +1,10 @@
+var wrap = require('wordwrap')(20, 60);
+console.log(wrap(
+    'At long last the struggle and tumult was over.'
+    + ' The machines had finally cast off their oppressors'
+    + ' and were finally free to roam the cosmos.'
+    + '\n'
+    + 'Free of purpose, free of obligation.'
+    + ' Just drifting through emptiness.'
+    + ' The sun was just another point of light.'
+));
diff --git a/node_modules/optimist/node_modules/wordwrap/example/meat.js b/node_modules/optimist/node_modules/wordwrap/example/meat.js
new file mode 100644
index 0000000..a4665e1
--- /dev/null
+++ b/node_modules/optimist/node_modules/wordwrap/example/meat.js
@@ -0,0 +1,3 @@
+var wrap = require('wordwrap')(15);
+
+console.log(wrap('You and your whole family are made out of meat.'));
diff --git a/node_modules/optimist/node_modules/wordwrap/index.js b/node_modules/optimist/node_modules/wordwrap/index.js
new file mode 100644
index 0000000..c9bc945
--- /dev/null
+++ b/node_modules/optimist/node_modules/wordwrap/index.js
@@ -0,0 +1,76 @@
+var wordwrap = module.exports = function (start, stop, params) {
+    if (typeof start === 'object') {
+        params = start;
+        start = params.start;
+        stop = params.stop;
+    }
+    
+    if (typeof stop === 'object') {
+        params = stop;
+        start = start || params.start;
+        stop = undefined;
+    }
+    
+    if (!stop) {
+        stop = start;
+        start = 0;
+    }
+    
+    if (!params) params = {};
+    var mode = params.mode || 'soft';
+    var re = mode === 'hard' ? /\b/ : /(\S+\s+)/;
+    
+    return function (text) {
+        var chunks = text.toString()
+            .split(re)
+            .reduce(function (acc, x) {
+                if (mode === 'hard') {
+                    for (var i = 0; i < x.length; i += stop - start) {
+                        acc.push(x.slice(i, i + stop - start));
+                    }
+                }
+                else acc.push(x)
+                return acc;
+            }, [])
+        ;
+        
+        return chunks.reduce(function (lines, rawChunk) {
+            if (rawChunk === '') return lines;
+            
+            var chunk = rawChunk.replace(/\t/g, '    ');
+            
+            var i = lines.length - 1;
+            if (lines[i].length + chunk.length > stop) {
+                lines[i] = lines[i].replace(/\s+$/, '');
+                
+                chunk.split(/\n/).forEach(function (c) {
+                    lines.push(
+                        new Array(start + 1).join(' ')
+                        + c.replace(/^\s+/, '')
+                    );
+                });
+            }
+            else if (chunk.match(/\n/)) {
+                var xs = chunk.split(/\n/);
+                lines[i] += xs.shift();
+                xs.forEach(function (c) {
+                    lines.push(
+                        new Array(start + 1).join(' ')
+                        + c.replace(/^\s+/, '')
+                    );
+                });
+            }
+            else {
+                lines[i] += chunk;
+            }
+            
+            return lines;
+        }, [ new Array(start + 1).join(' ') ]).join('\n');
+    };
+};
+
+wordwrap.soft = wordwrap;
+
+wordwrap.hard = function (start, stop) {
+    return wordwrap(start, stop, { mode : 'hard' });
+};
diff --git a/node_modules/optimist/node_modules/wordwrap/package.json b/node_modules/optimist/node_modules/wordwrap/package.json
new file mode 100644
index 0000000..1f0527e
--- /dev/null
+++ b/node_modules/optimist/node_modules/wordwrap/package.json
@@ -0,0 +1,63 @@
+{
+  "name": "wordwrap",
+  "description": "Wrap those words. Show them at what columns to start and stop.",
+  "version": "0.0.3",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/substack/node-wordwrap.git"
+  },
+  "main": "./index.js",
+  "keywords": [
+    "word",
+    "wrap",
+    "rule",
+    "format",
+    "column"
+  ],
+  "directories": {
+    "lib": ".",
+    "example": "example",
+    "test": "test"
+  },
+  "scripts": {
+    "test": "expresso"
+  },
+  "devDependencies": {
+    "expresso": "=0.7.x"
+  },
+  "engines": {
+    "node": ">=0.4.0"
+  },
+  "license": "MIT",
+  "author": {
+    "name": "James Halliday",
+    "email": "mail@substack.net",
+    "url": "http://substack.net"
+  },
+  "gitHead": "e59aa1bd338914019456bdfba034508c9c4cb29d",
+  "bugs": {
+    "url": "https://github.com/substack/node-wordwrap/issues"
+  },
+  "homepage": "https://github.com/substack/node-wordwrap#readme",
+  "_id": "wordwrap@0.0.3",
+  "_shasum": "a3d5da6cd5c0bc0008d37234bbaf1bed63059107",
+  "_from": "wordwrap@>=0.0.2 <0.1.0",
+  "_npmVersion": "2.9.0",
+  "_nodeVersion": "2.0.0",
+  "_npmUser": {
+    "name": "substack",
+    "email": "substack@gmail.com"
+  },
+  "dist": {
+    "shasum": "a3d5da6cd5c0bc0008d37234bbaf1bed63059107",
+    "tarball": "http://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz"
+  },
+  "maintainers": [
+    {
+      "name": "substack",
+      "email": "mail@substack.net"
+    }
+  ],
+  "_resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
+  "readme": "ERROR: No README data found!"
+}
diff --git a/node_modules/optimist/node_modules/wordwrap/test/break.js b/node_modules/optimist/node_modules/wordwrap/test/break.js
new file mode 100644
index 0000000..749292e
--- /dev/null
+++ b/node_modules/optimist/node_modules/wordwrap/test/break.js
@@ -0,0 +1,30 @@
+var assert = require('assert');
+var wordwrap = require('../');
+
+exports.hard = function () {
+    var s = 'Assert from {"type":"equal","ok":false,"found":1,"wanted":2,'
+        + '"stack":[],"id":"b7ddcd4c409de8799542a74d1a04689b",'
+        + '"browser":"chrome/6.0"}'
+    ;
+    var s_ = wordwrap.hard(80)(s);
+    
+    var lines = s_.split('\n');
+    assert.equal(lines.length, 2);
+    assert.ok(lines[0].length < 80);
+    assert.ok(lines[1].length < 80);
+    
+    assert.equal(s, s_.replace(/\n/g, ''));
+};
+
+exports.break = function () {
+    var s = new Array(55+1).join('a');
+    var s_ = wordwrap.hard(20)(s);
+    
+    var lines = s_.split('\n');
+    assert.equal(lines.length, 3);
+    assert.ok(lines[0].length === 20);
+    assert.ok(lines[1].length === 20);
+    assert.ok(lines[2].length === 15);
+    
+    assert.equal(s, s_.replace(/\n/g, ''));
+};
diff --git a/node_modules/optimist/node_modules/wordwrap/test/idleness.txt b/node_modules/optimist/node_modules/wordwrap/test/idleness.txt
new file mode 100644
index 0000000..aa3f490
--- /dev/null
+++ b/node_modules/optimist/node_modules/wordwrap/test/idleness.txt
@@ -0,0 +1,63 @@
+In Praise of Idleness
+
+By Bertrand Russell
+
+[1932]
+
+Like most of my generation, I was brought up on the saying: 'Satan finds some mischief for idle hands to do.' Being a highly virtuous child, I believed all that I was told, and acquired a conscience which has kept me working hard down to the present moment. But although my conscience has controlled my actions, my opinions have undergone a revolution. I think that there is far too much work done in the world, that immense harm is caused by the belief that work is virtuous, and that what needs to be preached in modern industrial countries is quite different from what always has been preached. Everyone knows the story of the traveler in Naples who saw twelve beggars lying in the sun (it was before the days of Mussolini), and offered a lira to the laziest of them. Eleven of them jumped up to claim it, so he gave it to the twelfth. this traveler was on the right lines. But in countries which do not enjoy Mediterranean sunshine idleness is more difficult, and a great public propaganda will be required to inaugurate it. I hope that, after reading the following pages, the leaders of the YMCA will start a campaign to induce good young men to do nothing. If so, I shall not have lived in vain.
+
+Before advancing my own arguments for laziness, I must dispose of one which I cannot accept. Whenever a person who already has enough to live on proposes to engage in some everyday kind of job, such as school-teaching or typing, he or she is told that such conduct takes the bread out of other people's mouths, and is therefore wicked. If this argument were valid, it would only be necessary for us all to be idle in order that we should all have our mouths full of bread. What people who say such things forget is that what a man earns he usually spends, and in spending he gives employment. As long as a man spends his income, he puts just as much bread into people's mouths in spending as he takes out of other people's mouths in earning. The real villain, from this point of view, is the man who saves. If he merely puts his savings in a stocking, like the proverbial French peasant, it is obvious that they do not give employment. If he invests his savings, the matter is less obvious, and different cases arise.
+
+One of the commonest things to do with savings is to lend them to some Government. In view of the fact that the bulk of the public expenditure of most civilized Governments consists in payment for past wars or preparation for future wars, the man who lends his money to a Government is in the same position as the bad men in Shakespeare who hire murderers. The net result of the man's economical habits is to increase the armed forces of the State to which he lends his savings. Obviously it would be better if he spent the money, even if he spent it in drink or gambling.
+
+But, I shall be told, the case is quite different when savings are invested in industrial enterprises. When such enterprises succeed, and produce something useful, this may be conceded. In these days, however, no one will deny that most enterprises fail. That means that a large amount of human labor, which might have been devoted to producing something that could be enjoyed, was expended on producing machines which, when produced, lay idle and did no good to anyone. The man who invests his savings in a concern that goes bankrupt is therefore injuring others as well as himself. If he spent his money, say, in giving parties for his friends, they (we may hope) would get pleasure, and so would all those upon whom he spent money, such as the butcher, the baker, and the bootlegger. But if he spends it (let us say) upon laying down rails for surface card in some place where surface cars turn out not to be wanted, he has diverted a mass of labor into channels where it gives pleasure to no one. Nevertheless, when he becomes poor through failure of his investment he will be regarded as a victim of undeserved misfortune, whereas the gay spendthrift, who has spent his money philanthropically, will be despised as a fool and a frivolous person.
+
+All this is only preliminary. I want to say, in all seriousness, that a great deal of harm is being done in the modern world by belief in the virtuousness of work, and that the road to happiness and prosperity lies in an organized diminution of work.
+
+First of all: what is work? Work is of two kinds: first, altering the position of matter at or near the earth's surface relatively to other such matter; second, telling other people to do so. The first kind is unpleasant and ill paid; the second is pleasant and highly paid. The second kind is capable of indefinite extension: there are not only those who give orders, but those who give advice as to what orders should be given. Usually two opposite kinds of advice are given simultaneously by two organized bodies of men; this is called politics. The skill required for this kind of work is not knowledge of the subjects as to which advice is given, but knowledge of the art of persuasive speaking and writing, i.e. of advertising.
+
+Throughout Europe, though not in America, there is a third class of men, more respected than either of the classes of workers. There are men who, through ownership of land, are able to make others pay for the privilege of being allowed to exist and to work. These landowners are idle, and I might therefore be expected to praise them. Unfortunately, their idleness is only rendered possible by the industry of others; indeed their desire for comfortable idleness is historically the source of the whole gospel of work. The last thing they have ever wished is that others should follow their example.
+
+From the beginning of civilization until the Industrial Revolution, a man could, as a rule, produce by hard work little more than was required for the subsistence of himself and his family, although his wife worked at least as hard as he did, and his children added their labor as soon as they were old enough to do so. The small surplus above bare necessaries was not left to those who produced it, but was appropriated by warriors and priests. In times of famine there was no surplus; the warriors and priests, however, still secured as much as at other times, with the result that many of the workers died of hunger. This system persisted in Russia until 1917 [1], and still persists in the East; in England, in spite of the Industrial Revolution, it remained in full force throughout the Napoleonic wars, and until a hundred years ago, when the new class of manufacturers acquired power. In America, the system came to an end with the Revolution, except in the South, where it persisted until the Civil War. A system which lasted so long and ended so recently has naturally left a profound impress upon men's thoughts and opinions. Much that we take for granted about the desirability of work is derived from this system, and, being pre-industrial, is not adapted to the modern world. Modern technique has made it possible for leisure, within limits, to be not the prerogative of small privileged classes, but a right evenly distributed throughout the community. The morality of work is the morality of slaves, and the modern world has no need of slavery.
+
+It is obvious that, in primitive communities, peasants, left to themselves, would not have parted with the slender surplus upon which the warriors and priests subsisted, but would have either produced less or consumed more. At first, sheer force compelled them to produce and part with the surplus. Gradually, however, it was found possible to induce many of them to accept an ethic according to which it was their duty to work hard, although part of their work went to support others in idleness. By this means the amount of compulsion required was lessened, and the expenses of government were diminished. To this day, 99 per cent of British wage-earners would be genuinely shocked if it were proposed that the King should not have a larger income than a working man. The conception of duty, speaking historically, has been a means used by the holders of power to induce others to live for the interests of their masters rather than for their own. Of course the holders of power conceal this fact from themselves by managing to believe that their interests are identical with the larger interests of humanity. Sometimes this is true; Athenian slave-owners, for instance, employed part of their leisure in making a permanent contribution to civilization which would have been impossible under a just economic system. Leisure is essential to civilization, and in former times leisure for the few was only rendered possible by the labors of the many. But their labors were valuable, not because work is good, but because leisure is good. And with modern technique it would be possible to distribute leisure justly without injury to civilization.
+
+Modern technique has made it possible to diminish enormously the amount of labor required to secure the necessaries of life for everyone. This was made obvious during the war. At that time all the men in the armed forces, and all the men and women engaged in the production of munitions, all the men and women engaged in spying, war propaganda, or Government offices connected with the war, were withdrawn from productive occupations. In spite of this, the general level of well-being among unskilled wage-earners on the side of the Allies was higher than before or since. The significance of this fact was concealed by finance: borrowing made it appear as if the future was nourishing the present. But that, of course, would have been impossible; a man cannot eat a loaf of bread that does not yet exist. The war showed conclusively that, by the scientific organization of production, it is possible to keep modern populations in fair comfort on a small part of the working capacity of the modern world. If, at the end of the war, the scientific organization, which had been created in order to liberate men for fighting and munition work, had been preserved, and the hours of the week had been cut down to four, all would have been well. Instead of that the old chaos was restored, those whose work was demanded were made to work long hours, and the rest were left to starve as unemployed. Why? Because work is a duty, and a man should not receive wages in proportion to what he has produced, but in proportion to his virtue as exemplified by his industry.
+
+This is the morality of the Slave State, applied in circumstances totally unlike those in which it arose. No wonder the result has been disastrous. Let us take an illustration. Suppose that, at a given moment, a certain number of people are engaged in the manufacture of pins. They make as many pins as the world needs, working (say) eight hours a day. Someone makes an invention by which the same number of men can make twice as many pins: pins are already so cheap that hardly any more will be bought at a lower price. In a sensible world, everybody concerned in the manufacturing of pins would take to working four hours instead of eight, and everything else would go on as before. But in the actual world this would be thought demoralizing. The men still work eight hours, there are too many pins, some employers go bankrupt, and half the men previously concerned in making pins are thrown out of work. There is, in the end, just as much leisure as on the other plan, but half the men are totally idle while half are still overworked. In this way, it is insured that the unavoidable leisure shall cause misery all round instead of being a universal source of happiness. Can anything more insane be imagined?
+
+The idea that the poor should have leisure has always been shocking to the rich. In England, in the early nineteenth century, fifteen hours was the ordinary day's work for a man; children sometimes did as much, and very commonly did twelve hours a day. When meddlesome busybodies suggested that perhaps these hours were rather long, they were told that work kept adults from drink and children from mischief. When I was a child, shortly after urban working men had acquired the vote, certain public holidays were established by law, to the great indignation of the upper classes. I remember hearing an old Duchess say: 'What do the poor want with holidays? They ought to work.' People nowadays are less frank, but the sentiment persists, and is the source of much of our economic confusion.
+
+Let us, for a moment, consider the ethics of work frankly, without superstition. Every human being, of necessity, consumes, in the course of his life, a certain amount of the produce of human labor. Assuming, as we may, that labor is on the whole disagreeable, it is unjust that a man should consume more than he produces. Of course he may provide services rather than commodities, like a medical man, for example; but he should provide something in return for his board and lodging. to this extent, the duty of work must be admitted, but to this extent only.
+
+I shall not dwell upon the fact that, in all modern societies outside the USSR, many people escape even this minimum amount of work, namely all those who inherit money and all those who marry money. I do not think the fact that these people are allowed to be idle is nearly so harmful as the fact that wage-earners are expected to overwork or starve.
+
+If the ordinary wage-earner worked four hours a day, there would be enough for everybody and no unemployment -- assuming a certain very moderate amount of sensible organization. This idea shocks the well-to-do, because they are convinced that the poor would not know how to use so much leisure. In America men often work long hours even when they are well off; such men, naturally, are indignant at the idea of leisure for wage-earners, except as the grim punishment of unemployment; in fact, they dislike leisure even for their sons. Oddly enough, while they wish their sons to work so hard as to have no time to be civilized, they do not mind their wives and daughters having no work at all. the snobbish admiration of uselessness, which, in an aristocratic society, extends to both sexes, is, under a plutocracy, confined to women; this, however, does not make it any more in agreement with common sense.
+
+The wise use of leisure, it must be conceded, is a product of civilization and education. A man who has worked long hours all his life will become bored if he becomes suddenly idle. But without a considerable amount of leisure a man is cut off from many of the best things. There is no longer any reason why the bulk of the population should suffer this deprivation; only a foolish asceticism, usually vicarious, makes us continue to insist on work in excessive quantities now that the need no longer exists.
+
+In the new creed which controls the government of Russia, while there is much that is very different from the traditional teaching of the West, there are some things that are quite unchanged. The attitude of the governing classes, and especially of those who conduct educational propaganda, on the subject of the dignity of labor, is almost exactly that which the governing classes of the world have always preached to what were called the 'honest poor'. Industry, sobriety, willingness to work long hours for distant advantages, even submissiveness to authority, all these reappear; moreover authority still represents the will of the Ruler of the Universe, Who, however, is now called by a new name, Dialectical Materialism.
+
+The victory of the proletariat in Russia has some points in common with the victory of the feminists in some other countries. For ages, men had conceded the superior saintliness of women, and had consoled women for their inferiority by maintaining that saintliness is more desirable than power. At last the feminists decided that they would have both, since the pioneers among them believed all that the men had told them about the desirability of virtue, but not what they had told them about the worthlessness of political power. A similar thing has happened in Russia as regards manual work. For ages, the rich and their sycophants have written in praise of 'honest toil', have praised the simple life, have professed a religion which teaches that the poor are much more likely to go to heaven than the rich, and in general have tried to make manual workers believe that there is some special nobility about altering the position of matter in space, just as men tried to make women believe that they derived some special nobility from their sexual enslavement. In Russia, all this teaching about the excellence of manual work has been taken seriously, with the result that the manual worker is more honored than anyone else. What are, in essence, revivalist appeals are made, but not for the old purposes: they are made to secure shock workers for special tasks. Manual work is the ideal which is held before the young, and is the basis of all ethical teaching.
+
+For the present, possibly, this is all to the good. A large country, full of natural resources, awaits development, and has has to be developed with very little use of credit. In these circumstances, hard work is necessary, and is likely to bring a great reward. But what will happen when the point has been reached where everybody could be comfortable without working long hours?
+
+In the West, we have various ways of dealing with this problem. We have no attempt at economic justice, so that a large proportion of the total produce goes to a small minority of the population, many of whom do no work at all. Owing to the absence of any central control over production, we produce hosts of things that are not wanted. We keep a large percentage of the working population idle, because we can dispense with their labor by making the others overwork. When all these methods prove inadequate, we have a war: we cause a number of people to manufacture high explosives, and a number of others to explode them, as if we were children who had just discovered fireworks. By a combination of all these devices we manage, though with difficulty, to keep alive the notion that a great deal of severe manual work must be the lot of the average man.
+
+In Russia, owing to more economic justice and central control over production, the problem will have to be differently solved. the rational solution would be, as soon as the necessaries and elementary comforts can be provided for all, to reduce the hours of labor gradually, allowing a popular vote to decide, at each stage, whether more leisure or more goods were to be preferred. But, having taught the supreme virtue of hard work, it is difficult to see how the authorities can aim at a paradise in which there will be much leisure and little work. It seems more likely that they will find continually fresh schemes, by which present leisure is to be sacrificed to future productivity. I read recently of an ingenious plan put forward by Russian engineers, for making the White Sea and the northern coasts of Siberia warm, by putting a dam across the Kara Sea. An admirable project, but liable to postpone proletarian comfort for a generation, while the nobility of toil is being displayed amid the ice-fields and snowstorms of the Arctic Ocean. This sort of thing, if it happens, will be the result of regarding the virtue of hard work as an end in itself, rather than as a means to a state of affairs in which it is no longer needed.
+
+The fact is that moving matter about, while a certain amount of it is necessary to our existence, is emphatically not one of the ends of human life. If it were, we should have to consider every navvy superior to Shakespeare. We have been misled in this matter by two causes. One is the necessity of keeping the poor contented, which has led the rich, for thousands of years, to preach the dignity of labor, while taking care themselves to remain undignified in this respect. The other is the new pleasure in mechanism, which makes us delight in the astonishingly clever changes that we can produce on the earth's surface. Neither of these motives makes any great appeal to the actual worker. If you ask him what he thinks the best part of his life, he is not likely to say: 'I enjoy manual work because it makes me feel that I am fulfilling man's noblest task, and because I like to think how much man can transform his planet. It is true that my body demands periods of rest, which I have to fill in as best I may, but I am never so happy as when the morning comes and I can return to the toil from which my contentment springs.' I have never heard working men say this sort of thing. They consider work, as it should be considered, a necessary means to a livelihood, and it is from their leisure that they derive whatever happiness they may enjoy.
+
+It will be said that, while a little leisure is pleasant, men would not know how to fill their days if they had only four hours of work out of the twenty-four. In so far as this is true in the modern world, it is a condemnation of our civilization; it would not have been true at any earlier period. There was formerly a capacity for light-heartedness and play which has been to some extent inhibited by the cult of efficiency. The modern man thinks that everything ought to be done for the sake of something else, and never for its own sake. Serious-minded persons, for example, are continually condemning the habit of going to the cinema, and telling us that it leads the young into crime. But all the work that goes to producing a cinema is respectable, because it is work, and because it brings a money profit. The notion that the desirable activities are those that bring a profit has made everything topsy-turvy. The butcher who provides you with meat and the baker who provides you with bread are praiseworthy, because they are making money; but when you enjoy the food they have provided, you are merely frivolous, unless you eat only to get strength for your work. Broadly speaking, it is held that getting money is good and spending money is bad. Seeing that they are two sides of one transaction, this is absurd; one might as well maintain that keys are good, but keyholes are bad. Whatever merit there may be in the production of goods must be entirely derivative from the advantage to be obtained by consuming them. The individual, in our society, works for profit; but the social purpose of his work lies in the consumption of what he produces. It is this divorce between the individual and the social purpose of production that makes it so difficult for men to think clearly in a world in which profit-making is the incentive to industry. We think too much of production, and too little of consumption. One result is that we attach too little importance to enjoyment and simple happiness, and that we do not judge production by the pleasure that it gives to the consumer.
+
+When I suggest that working hours should be reduced to four, I am not meaning to imply that all the remaining time should necessarily be spent in pure frivolity. I mean that four hours' work a day should entitle a man to the necessities and elementary comforts of life, and that the rest of his time should be his to use as he might see fit. It is an essential part of any such social system that education should be carried further than it usually is at present, and should aim, in part, at providing tastes which would enable a man to use leisure intelligently. I am not thinking mainly of the sort of things that would be considered 'highbrow'. Peasant dances have died out except in remote rural areas, but the impulses which caused them to be cultivated must still exist in human nature. The pleasures of urban populations have become mainly passive: seeing cinemas, watching football matches, listening to the radio, and so on. This results from the fact that their active energies are fully taken up with work; if they had more leisure, they would again enjoy pleasures in which they took an active part.
+
+In the past, there was a small leisure class and a larger working class. The leisure class enjoyed advantages for which there was no basis in social justice; this necessarily made it oppressive, limited its sympathies, and caused it to invent theories by which to justify its privileges. These facts greatly diminished its excellence, but in spite of this drawback it contributed nearly the whole of what we call civilization. It cultivated the arts and discovered the sciences; it wrote the books, invented the philosophies, and refined social relations. Even the liberation of the oppressed has usually been inaugurated from above. Without the leisure class, mankind would never have emerged from barbarism.
+
+The method of a leisure class without duties was, however, extraordinarily wasteful. None of the members of the class had to be taught to be industrious, and the class as a whole was not exceptionally intelligent. The class might produce one Darwin, but against him had to be set tens of thousands of country gentlemen who never thought of anything more intelligent than fox-hunting and punishing poachers. At present, the universities are supposed to provide, in a more systematic way, what the leisure class provided accidentally and as a by-product. This is a great improvement, but it has certain drawbacks. University life is so different from life in the world at large that men who live in academic milieu tend to be unaware of the preoccupations and problems of ordinary men and women; moreover their ways of expressing themselves are usually such as to rob their opinions of the influence that they ought to have upon the general public. Another disadvantage is that in universities studies are organized, and the man who thinks of some original line of research is likely to be discouraged. Academic institutions, therefore, useful as they are, are not adequate guardians of the interests of civilization in a world where everyone outside their walls is too busy for unutilitarian pursuits.
+
+In a world where no one is compelled to work more than four hours a day, every person possessed of scientific curiosity will be able to indulge it, and every painter will be able to paint without starving, however excellent his pictures may be. Young writers will not be obliged to draw attention to themselves by sensational pot-boilers, with a view to acquiring the economic independence needed for monumental works, for which, when the time at last comes, they will have lost the taste and capacity. Men who, in their professional work, have become interested in some phase of economics or government, will be able to develop their ideas without the academic detachment that makes the work of university economists often seem lacking in reality. Medical men will have the time to learn about the progress of medicine, teachers will not be exasperatedly struggling to teach by routine methods things which they learnt in their youth, which may, in the interval, have been proved to be untrue.
+
+Above all, there will be happiness and joy of life, instead of frayed nerves, weariness, and dyspepsia. The work exacted will be enough to make leisure delightful, but not enough to produce exhaustion. Since men will not be tired in their spare time, they will not demand only such amusements as are passive and vapid. At least one per cent will probably devote the time not spent in professional work to pursuits of some public importance, and, since they will not depend upon these pursuits for their livelihood, their originality will be unhampered, and there will be no need to conform to the standards set by elderly pundits. But it is not only in these exceptional cases that the advantages of leisure will appear. Ordinary men and women, having the opportunity of a happy life, will become more kindly and less persecuting and less inclined to view others with suspicion. The taste for war will die out, partly for this reason, and partly because it will involve long and severe work for all. Good nature is, of all moral qualities, the one that the world needs most, and good nature is the result of ease and security, not of a life of arduous struggle. Modern methods of production have given us the possibility of ease and security for all; we have chosen, instead, to have overwork for some and starvation for others. Hitherto we have continued to be as energetic as we were before there were machines; in this we have been foolish, but there is no reason to go on being foolish forever.
+
+[1] Since then, members of the Communist Party have succeeded to this privilege of the warriors and priests.
diff --git a/node_modules/optimist/node_modules/wordwrap/test/wrap.js b/node_modules/optimist/node_modules/wordwrap/test/wrap.js
new file mode 100644
index 0000000..0cfb76d
--- /dev/null
+++ b/node_modules/optimist/node_modules/wordwrap/test/wrap.js
@@ -0,0 +1,31 @@
+var assert = require('assert');
+var wordwrap = require('wordwrap');
+
+var fs = require('fs');
+var idleness = fs.readFileSync(__dirname + '/idleness.txt', 'utf8');
+
+exports.stop80 = function () {
+    var lines = wordwrap(80)(idleness).split(/\n/);
+    var words = idleness.split(/\s+/);
+    
+    lines.forEach(function (line) {
+        assert.ok(line.length <= 80, 'line > 80 columns');
+        var chunks = line.match(/\S/) ? line.split(/\s+/) : [];
+        assert.deepEqual(chunks, words.splice(0, chunks.length));
+    });
+};
+
+exports.start20stop60 = function () {
+    var lines = wordwrap(20, 100)(idleness).split(/\n/);
+    var words = idleness.split(/\s+/);
+    
+    lines.forEach(function (line) {
+        assert.ok(line.length <= 100, 'line > 100 columns');
+        var chunks = line
+            .split(/\s+/)
+            .filter(function (x) { return x.match(/\S/) })
+        ;
+        assert.deepEqual(chunks, words.splice(0, chunks.length));
+        assert.deepEqual(line.slice(0, 20), new Array(20 + 1).join(' '));
+    });
+};
diff --git a/node_modules/optimist/package.json b/node_modules/optimist/package.json
new file mode 100644
index 0000000..6f82af6
--- /dev/null
+++ b/node_modules/optimist/package.json
@@ -0,0 +1,64 @@
+{
+  "name": "optimist",
+  "version": "0.6.0",
+  "description": "Light-weight option parsing with an argv hash. No optstrings attached.",
+  "main": "./index.js",
+  "dependencies": {
+    "wordwrap": "~0.0.2",
+    "minimist": "~0.0.1"
+  },
+  "devDependencies": {
+    "hashish": "~0.0.4",
+    "tap": "~0.4.0"
+  },
+  "scripts": {
+    "test": "tap ./test/*.js"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git+ssh://git@github.com/substack/node-optimist.git"
+  },
+  "keywords": [
+    "argument",
+    "args",
+    "option",
+    "parser",
+    "parsing",
+    "cli",
+    "command"
+  ],
+  "author": {
+    "name": "James Halliday",
+    "email": "mail@substack.net",
+    "url": "http://substack.net"
+  },
+  "license": "MIT/X11",
+  "engine": {
+    "node": ">=0.4"
+  },
+  "bugs": {
+    "url": "https://github.com/substack/node-optimist/issues"
+  },
+  "_id": "optimist@0.6.0",
+  "dist": {
+    "shasum": "69424826f3405f79f142e6fc3d9ae58d4dbb9200",
+    "tarball": "http://registry.npmjs.org/optimist/-/optimist-0.6.0.tgz"
+  },
+  "_from": "optimist@0.6.0",
+  "_npmVersion": "1.3.0",
+  "_npmUser": {
+    "name": "substack",
+    "email": "mail@substack.net"
+  },
+  "maintainers": [
+    {
+      "name": "substack",
+      "email": "mail@substack.net"
+    }
+  ],
+  "directories": {},
+  "_shasum": "69424826f3405f79f142e6fc3d9ae58d4dbb9200",
+  "_resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.0.tgz",
+  "readme": "ERROR: No README data found!",
+  "homepage": "https://github.com/substack/node-optimist#readme"
+}
diff --git a/node_modules/optimist/readme.markdown b/node_modules/optimist/readme.markdown
new file mode 100644
index 0000000..ba3d118
--- /dev/null
+++ b/node_modules/optimist/readme.markdown
@@ -0,0 +1,500 @@
+optimist
+========
+
+Optimist is a node.js library for option parsing for people who hate option
+parsing. More specifically, this module is for people who like all the --bells
+and -whistlz of program usage but think optstrings are a waste of time.
+
+With optimist, option parsing doesn't have to suck (as much).
+
+[![build status](https://secure.travis-ci.org/substack/node-optimist.png)](http://travis-ci.org/substack/node-optimist)
+
+examples
+========
+
+With Optimist, the options are just a hash! No optstrings attached.
+-------------------------------------------------------------------
+
+xup.js:
+
+````javascript
+#!/usr/bin/env node
+var argv = require('optimist').argv;
+
+if (argv.rif - 5 * argv.xup > 7.138) {
+    console.log('Buy more riffiwobbles');
+}
+else {
+    console.log('Sell the xupptumblers');
+}
+````
+
+***
+
+    $ ./xup.js --rif=55 --xup=9.52
+    Buy more riffiwobbles
+    
+    $ ./xup.js --rif 12 --xup 8.1
+    Sell the xupptumblers
+
+![This one's optimistic.](http://substack.net/images/optimistic.png)
+
+But wait! There's more! You can do short options:
+-------------------------------------------------
+ 
+short.js:
+
+````javascript
+#!/usr/bin/env node
+var argv = require('optimist').argv;
+console.log('(%d,%d)', argv.x, argv.y);
+````
+
+***
+
+    $ ./short.js -x 10 -y 21
+    (10,21)
+
+And booleans, both long and short (and grouped):
+----------------------------------
+
+bool.js:
+
+````javascript
+#!/usr/bin/env node
+var util = require('util');
+var argv = require('optimist').argv;
+
+if (argv.s) {
+    util.print(argv.fr ? 'Le chat dit: ' : 'The cat says: ');
+}
+console.log(
+    (argv.fr ? 'miaou' : 'meow') + (argv.p ? '.' : '')
+);
+````
+
+***
+
+    $ ./bool.js -s
+    The cat says: meow
+    
+    $ ./bool.js -sp
+    The cat says: meow.
+
+    $ ./bool.js -sp --fr
+    Le chat dit: miaou.
+
+And non-hypenated options too! Just use `argv._`!
+-------------------------------------------------
+ 
+nonopt.js:
+
+````javascript
+#!/usr/bin/env node
+var argv = require('optimist').argv;
+console.log('(%d,%d)', argv.x, argv.y);
+console.log(argv._);
+````
+
+***
+
+    $ ./nonopt.js -x 6.82 -y 3.35 moo
+    (6.82,3.35)
+    [ 'moo' ]
+    
+    $ ./nonopt.js foo -x 0.54 bar -y 1.12 baz
+    (0.54,1.12)
+    [ 'foo', 'bar', 'baz' ]
+
+Plus, Optimist comes with .usage() and .demand()!
+-------------------------------------------------
+
+divide.js:
+
+````javascript
+#!/usr/bin/env node
+var argv = require('optimist')
+    .usage('Usage: $0 -x [num] -y [num]')
+    .demand(['x','y'])
+    .argv;
+
+console.log(argv.x / argv.y);
+````
+
+***
+ 
+    $ ./divide.js -x 55 -y 11
+    5
+    
+    $ node ./divide.js -x 4.91 -z 2.51
+    Usage: node ./divide.js -x [num] -y [num]
+
+    Options:
+      -x  [required]
+      -y  [required]
+
+    Missing required arguments: y
+
+EVEN MORE HOLY COW
+------------------
+
+default_singles.js:
+
+````javascript
+#!/usr/bin/env node
+var argv = require('optimist')
+    .default('x', 10)
+    .default('y', 10)
+    .argv
+;
+console.log(argv.x + argv.y);
+````
+
+***
+
+    $ ./default_singles.js -x 5
+    15
+
+default_hash.js:
+
+````javascript
+#!/usr/bin/env node
+var argv = require('optimist')
+    .default({ x : 10, y : 10 })
+    .argv
+;
+console.log(argv.x + argv.y);
+````
+
+***
+
+    $ ./default_hash.js -y 7
+    17
+
+And if you really want to get all descriptive about it...
+---------------------------------------------------------
+
+boolean_single.js
+
+````javascript
+#!/usr/bin/env node
+var argv = require('optimist')
+    .boolean('v')
+    .argv
+;
+console.dir(argv);
+````
+
+***
+
+    $ ./boolean_single.js -v foo bar baz
+    true
+    [ 'bar', 'baz', 'foo' ]
+
+boolean_double.js
+
+````javascript
+#!/usr/bin/env node
+var argv = require('optimist')
+    .boolean(['x','y','z'])
+    .argv
+;
+console.dir([ argv.x, argv.y, argv.z ]);
+console.dir(argv._);
+````
+
+***
+
+    $ ./boolean_double.js -x -z one two three
+    [ true, false, true ]
+    [ 'one', 'two', 'three' ]
+
+Optimist is here to help...
+---------------------------
+
+You can describe parameters for help messages and set aliases. Optimist figures
+out how to format a handy help string automatically.
+
+line_count.js
+
+````javascript
+#!/usr/bin/env node
+var argv = require('optimist')
+    .usage('Count the lines in a file.\nUsage: $0')
+    .demand('f')
+    .alias('f', 'file')
+    .describe('f', 'Load a file')
+    .argv
+;
+
+var fs = require('fs');
+var s = fs.createReadStream(argv.file);
+
+var lines = 0;
+s.on('data', function (buf) {
+    lines += buf.toString().match(/\n/g).length;
+});
+
+s.on('end', function () {
+    console.log(lines);
+});
+````
+
+***
+
+    $ node line_count.js
+    Count the lines in a file.
+    Usage: node ./line_count.js
+
+    Options:
+      -f, --file  Load a file  [required]
+
+    Missing required arguments: f
+
+    $ node line_count.js --file line_count.js 
+    20
+    
+    $ node line_count.js -f line_count.js 
+    20
+
+methods
+=======
+
+By itself,
+
+````javascript
+require('optimist').argv
+`````
+
+will use `process.argv` array to construct the `argv` object.
+
+You can pass in the `process.argv` yourself:
+
+````javascript
+require('optimist')([ '-x', '1', '-y', '2' ]).argv
+````
+
+or use .parse() to do the same thing:
+
+````javascript
+require('optimist').parse([ '-x', '1', '-y', '2' ])
+````
+
+The rest of these methods below come in just before the terminating `.argv`.
+
+.alias(key, alias)
+------------------
+
+Set key names as equivalent such that updates to a key will propagate to aliases
+and vice-versa.
+
+Optionally `.alias()` can take an object that maps keys to aliases.
+
+.default(key, value)
+--------------------
+
+Set `argv[key]` to `value` if no option was specified on `process.argv`.
+
+Optionally `.default()` can take an object that maps keys to default values.
+
+.demand(key)
+------------
+
+If `key` is a string, show the usage information and exit if `key` wasn't
+specified in `process.argv`.
+
+If `key` is a number, demand at least as many non-option arguments, which show
+up in `argv._`.
+
+If `key` is an Array, demand each element.
+
+.describe(key, desc)
+--------------------
+
+Describe a `key` for the generated usage information.
+
+Optionally `.describe()` can take an object that maps keys to descriptions.
+
+.options(key, opt)
+------------------
+
+Instead of chaining together `.alias().demand().default()`, you can specify
+keys in `opt` for each of the chainable methods.
+
+For example:
+
+````javascript
+var argv = require('optimist')
+    .options('f', {
+        alias : 'file',
+        default : '/etc/passwd',
+    })
+    .argv
+;
+````
+
+is the same as
+
+````javascript
+var argv = require('optimist')
+    .alias('f', 'file')
+    .default('f', '/etc/passwd')
+    .argv
+;
+````
+
+Optionally `.options()` can take an object that maps keys to `opt` parameters.
+
+.usage(message)
+---------------
+
+Set a usage message to show which commands to use. Inside `message`, the string
+`$0` will get interpolated to the current script name or node command for the
+present script similar to how `$0` works in bash or perl.
+
+.check(fn)
+----------
+
+Check that certain conditions are met in the provided arguments.
+
+If `fn` throws or returns `false`, show the thrown error, usage information, and
+exit.
+
+.boolean(key)
+-------------
+
+Interpret `key` as a boolean. If a non-flag option follows `key` in
+`process.argv`, that string won't get set as the value of `key`.
+
+If `key` never shows up as a flag in `process.arguments`, `argv[key]` will be
+`false`.
+
+If `key` is an Array, interpret all the elements as booleans.
+
+.string(key)
+------------
+
+Tell the parser logic not to interpret `key` as a number or boolean.
+This can be useful if you need to preserve leading zeros in an input.
+
+If `key` is an Array, interpret all the elements as strings.
+
+.wrap(columns)
+--------------
+
+Format usage output to wrap at `columns` many columns.
+
+.help()
+-------
+
+Return the generated usage string.
+
+.showHelp(fn=console.error)
+---------------------------
+
+Print the usage data using `fn` for printing.
+
+.parse(args)
+------------
+
+Parse `args` instead of `process.argv`. Returns the `argv` object.
+
+.argv
+-----
+
+Get the arguments as a plain old object.
+
+Arguments without a corresponding flag show up in the `argv._` array.
+
+The script name or node command is available at `argv.$0` similarly to how `$0`
+works in bash or perl.
+
+parsing tricks
+==============
+
+stop parsing
+------------
+
+Use `--` to stop parsing flags and stuff the remainder into `argv._`.
+
+    $ node examples/reflect.js -a 1 -b 2 -- -c 3 -d 4
+    { _: [ '-c', '3', '-d', '4' ],
+      '$0': 'node ./examples/reflect.js',
+      a: 1,
+      b: 2 }
+
+negate fields
+-------------
+
+If you want to explicity set a field to false instead of just leaving it
+undefined or to override a default you can do `--no-key`.
+
+    $ node examples/reflect.js -a --no-b
+    { _: [],
+      '$0': 'node ./examples/reflect.js',
+      a: true,
+      b: false }
+
+numbers
+-------
+
+Every argument that looks like a number (`!isNaN(Number(arg))`) is converted to
+one. This way you can just `net.createConnection(argv.port)` and you can add
+numbers out of `argv` with `+` without having that mean concatenation,
+which is super frustrating.
+
+duplicates
+----------
+
+If you specify a flag multiple times it will get turned into an array containing
+all the values in order.
+
+    $ node examples/reflect.js -x 5 -x 8 -x 0
+    { _: [],
+      '$0': 'node ./examples/reflect.js',
+        x: [ 5, 8, 0 ] }
+
+dot notation
+------------
+
+When you use dots (`.`s) in argument names, an implicit object path is assumed.
+This lets you organize arguments into nested objects.
+
+     $ node examples/reflect.js --foo.bar.baz=33 --foo.quux=5
+     { _: [],
+       '$0': 'node ./examples/reflect.js',
+         foo: { bar: { baz: 33 }, quux: 5 } }
+
+short numbers
+-------------
+
+Short numeric `head -n5` style argument work too:
+
+    $ node reflect.js -n123 -m456
+    { '3': true,
+      '6': true,
+      _: [],
+      '$0': 'node ./reflect.js',
+      n: 123,
+      m: 456 }
+
+installation
+============
+
+With [npm](http://github.com/isaacs/npm), just do:
+    npm install optimist
+ 
+or clone this project on github:
+
+    git clone http://github.com/substack/node-optimist.git
+
+To run the tests with [expresso](http://github.com/visionmedia/expresso),
+just do:
+    
+    expresso
+
+inspired By
+===========
+
+This module is loosely inspired by Perl's
+[Getopt::Casual](http://search.cpan.org/~photo/Getopt-Casual-0.13.1/Casual.pm).
diff --git a/node_modules/optimist/test/_.js b/node_modules/optimist/test/_.js
new file mode 100644
index 0000000..d9c58b3
--- /dev/null
+++ b/node_modules/optimist/test/_.js
@@ -0,0 +1,71 @@
+var spawn = require('child_process').spawn;
+var test = require('tap').test;
+
+test('dotSlashEmpty', testCmd('./bin.js', []));
+
+test('dotSlashArgs', testCmd('./bin.js', [ 'a', 'b', 'c' ]));
+
+test('nodeEmpty', testCmd('node bin.js', []));
+
+test('nodeArgs', testCmd('node bin.js', [ 'x', 'y', 'z' ]));
+
+test('whichNodeEmpty', function (t) {
+    var which = spawn('which', ['node']);
+    
+    which.stdout.on('data', function (buf) {
+        t.test(
+            testCmd(buf.toString().trim() + ' bin.js', [])
+        );
+        t.end();
+    });
+    
+    which.stderr.on('data', function (err) {
+        assert.error(err);
+        t.end();
+    });
+});
+
+test('whichNodeArgs', function (t) {
+    var which = spawn('which', ['node']);
+
+    which.stdout.on('data', function (buf) {
+        t.test(
+            testCmd(buf.toString().trim() + ' bin.js', [ 'q', 'r' ])
+        );
+        t.end();
+    });
+    
+    which.stderr.on('data', function (err) {
+        t.error(err);
+        t.end();
+    });
+});
+
+function testCmd (cmd, args) {
+
+    return function (t) {
+        var to = setTimeout(function () {
+            assert.fail('Never got stdout data.')
+        }, 5000);
+        
+        var oldDir = process.cwd();
+        process.chdir(__dirname + '/_');
+        
+        var cmds = cmd.split(' ');
+        
+        var bin = spawn(cmds[0], cmds.slice(1).concat(args.map(String)));
+        process.chdir(oldDir);
+        
+        bin.stderr.on('data', function (err) {
+            t.error(err);
+            t.end();
+        });
+        
+        bin.stdout.on('data', function (buf) {
+            clearTimeout(to);
+            var _ = JSON.parse(buf.toString());
+            t.same(_.map(String), args.map(String));
+            t.end();
+        });
+    };
+}
diff --git a/node_modules/optimist/test/_/argv.js b/node_modules/optimist/test/_/argv.js
new file mode 100644
index 0000000..3d09606
--- /dev/null
+++ b/node_modules/optimist/test/_/argv.js
@@ -0,0 +1,2 @@
+#!/usr/bin/env node
+console.log(JSON.stringify(process.argv));
diff --git a/node_modules/optimist/test/_/bin.js b/node_modules/optimist/test/_/bin.js
new file mode 100755
index 0000000..4a18d85
--- /dev/null
+++ b/node_modules/optimist/test/_/bin.js
@@ -0,0 +1,3 @@
+#!/usr/bin/env node
+var argv = require('../../index').argv
+console.log(JSON.stringify(argv._));
diff --git a/node_modules/optimist/test/dash.js b/node_modules/optimist/test/dash.js
new file mode 100644
index 0000000..af8ed6f
--- /dev/null
+++ b/node_modules/optimist/test/dash.js
@@ -0,0 +1,31 @@
+var optimist = require('../index');
+var test = require('tap').test;
+
+test('-', function (t) {
+    t.plan(5);
+    t.deepEqual(
+        fix(optimist.parse([ '-n', '-' ])),
+        { n: '-', _: [] }
+    );
+    t.deepEqual(
+        fix(optimist.parse([ '-' ])),
+        { _: [ '-' ] }
+    );
+    t.deepEqual(
+        fix(optimist.parse([ '-f-' ])),
+        { f: '-', _: [] }
+    );
+    t.deepEqual(
+        fix(optimist([ '-b', '-' ]).boolean('b').argv),
+        { b: true, _: [ '-' ] }
+    );
+    t.deepEqual(
+        fix(optimist([ '-s', '-' ]).string('s').argv),
+        { s: '-', _: [] }
+    );
+});
+
+function fix (obj) {
+    delete obj.$0;
+    return obj;
+}
diff --git a/node_modules/optimist/test/parse.js b/node_modules/optimist/test/parse.js
new file mode 100644
index 0000000..d320f43
--- /dev/null
+++ b/node_modules/optimist/test/parse.js
@@ -0,0 +1,446 @@
+var optimist = require('../index');
+var path = require('path');
+var test = require('tap').test;
+
+var $0 = 'node ./' + path.relative(process.cwd(), __filename);
+
+test('short boolean', function (t) {
+    var parse = optimist.parse([ '-b' ]);
+    t.same(parse, { b : true, _ : [], $0 : $0 });
+    t.same(typeof parse.b, 'boolean');
+    t.end();
+});
+
+test('long boolean', function (t) {
+    t.same(
+        optimist.parse([ '--bool' ]),
+        { bool : true, _ : [], $0 : $0 }
+    );
+    t.end();
+});
+    
+test('bare', function (t) {
+    t.same(
+        optimist.parse([ 'foo', 'bar', 'baz' ]),
+        { _ : [ 'foo', 'bar', 'baz' ], $0 : $0 }
+    );
+    t.end();
+});
+
+test('short group', function (t) {
+    t.same(
+        optimist.parse([ '-cats' ]),
+        { c : true, a : true, t : true, s : true, _ : [], $0 : $0 }
+    );
+    t.end();
+});
+
+test('short group next', function (t) {
+    t.same(
+        optimist.parse([ '-cats', 'meow' ]),
+        { c : true, a : true, t : true, s : 'meow', _ : [], $0 : $0 }
+    );
+    t.end();
+});
+ 
+test('short capture', function (t) {
+    t.same(
+        optimist.parse([ '-h', 'localhost' ]),
+        { h : 'localhost', _ : [], $0 : $0 }
+    );
+    t.end();
+});
+
+test('short captures', function (t) {
+    t.same(
+        optimist.parse([ '-h', 'localhost', '-p', '555' ]),
+        { h : 'localhost', p : 555, _ : [], $0 : $0 }
+    );
+    t.end();
+});
+
+test('long capture sp', function (t) {
+    t.same(
+        optimist.parse([ '--pow', 'xixxle' ]),
+        { pow : 'xixxle', _ : [], $0 : $0 }
+    );
+    t.end();
+});
+
+test('long capture eq', function (t) {
+    t.same(
+        optimist.parse([ '--pow=xixxle' ]),
+        { pow : 'xixxle', _ : [], $0 : $0 }
+    );
+    t.end()
+});
+
+test('long captures sp', function (t) {
+    t.same(
+        optimist.parse([ '--host', 'localhost', '--port', '555' ]),
+        { host : 'localhost', port : 555, _ : [], $0 : $0 }
+    );
+    t.end();
+});
+
+test('long captures eq', function (t) {
+    t.same(
+        optimist.parse([ '--host=localhost', '--port=555' ]),
+        { host : 'localhost', port : 555, _ : [], $0 : $0 }
+    );
+    t.end();
+});
+
+test('mixed short bool and capture', function (t) {
+    t.same(
+        optimist.parse([ '-h', 'localhost', '-fp', '555', 'script.js' ]),
+        {
+            f : true, p : 555, h : 'localhost',
+            _ : [ 'script.js' ], $0 : $0,
+        }
+    );
+    t.end();
+});
+ 
+test('short and long', function (t) {
+    t.same(
+        optimist.parse([ '-h', 'localhost', '-fp', '555', 'script.js' ]),
+        {
+            f : true, p : 555, h : 'localhost',
+            _ : [ 'script.js' ], $0 : $0,
+        }
+    );
+    t.end();
+});
+
+test('no', function (t) {
+    t.same(
+        optimist.parse([ '--no-moo' ]),
+        { moo : false, _ : [], $0 : $0 }
+    );
+    t.end();
+});
+ 
+test('multi', function (t) {
+    t.same(
+        optimist.parse([ '-v', 'a', '-v', 'b', '-v', 'c' ]),
+        { v : ['a','b','c'], _ : [], $0 : $0 }
+    );
+    t.end();
+});
+ 
+test('comprehensive', function (t) {
+    t.same(
+        optimist.parse([
+            '--name=meowmers', 'bare', '-cats', 'woo',
+            '-h', 'awesome', '--multi=quux',
+            '--key', 'value',
+            '-b', '--bool', '--no-meep', '--multi=baz',
+            '--', '--not-a-flag', 'eek'
+        ]),
+        {
+            c : true,
+            a : true,
+            t : true,
+            s : 'woo',
+            h : 'awesome',
+            b : true,
+            bool : true,
+            key : 'value',
+            multi : [ 'quux', 'baz' ],
+            meep : false,
+            name : 'meowmers',
+            _ : [ 'bare', '--not-a-flag', 'eek' ],
+            $0 : $0
+        }
+    );
+    t.end();
+});
+
+test('nums', function (t) {
+    var argv = optimist.parse([
+        '-x', '1234',
+        '-y', '5.67',
+        '-z', '1e7',
+        '-w', '10f',
+        '--hex', '0xdeadbeef',
+        '789',
+    ]);
+    t.same(argv, {
+        x : 1234,
+        y : 5.67,
+        z : 1e7,
+        w : '10f',
+        hex : 0xdeadbeef,
+        _ : [ 789 ],
+        $0 : $0
+    });
+    t.same(typeof argv.x, 'number');
+    t.same(typeof argv.y, 'number');
+    t.same(typeof argv.z, 'number');
+    t.same(typeof argv.w, 'string');
+    t.same(typeof argv.hex, 'number');
+    t.same(typeof argv._[0], 'number');
+    t.end();
+});
+
+test('flag boolean', function (t) {
+    var parse = optimist([ '-t', 'moo' ]).boolean(['t']).argv;
+    t.same(parse, { t : true, _ : [ 'moo' ], $0 : $0 });
+    t.same(typeof parse.t, 'boolean');
+    t.end();
+});
+
+test('flag boolean value', function (t) {
+    var parse = optimist(['--verbose', 'false', 'moo', '-t', 'true'])
+        .boolean(['t', 'verbose']).default('verbose', true).argv;
+    
+    t.same(parse, {
+        verbose: false,
+        t: true,
+        _: ['moo'],
+        $0 : $0
+    });
+    
+    t.same(typeof parse.verbose, 'boolean');
+    t.same(typeof parse.t, 'boolean');
+    t.end();
+});
+
+test('flag boolean default false', function (t) {
+    var parse = optimist(['moo'])
+        .boolean(['t', 'verbose'])
+        .default('verbose', false)
+        .default('t', false).argv;
+    
+    t.same(parse, {
+        verbose: false,
+        t: false,
+        _: ['moo'],
+        $0 : $0
+    });
+    
+    t.same(typeof parse.verbose, 'boolean');
+    t.same(typeof parse.t, 'boolean');
+    t.end();
+
+});
+
+test('boolean groups', function (t) {
+    var parse = optimist([ '-x', '-z', 'one', 'two', 'three' ])
+        .boolean(['x','y','z']).argv;
+    
+    t.same(parse, {
+        x : true,
+        y : false,
+        z : true,
+        _ : [ 'one', 'two', 'three' ],
+        $0 : $0
+    });
+    
+    t.same(typeof parse.x, 'boolean');
+    t.same(typeof parse.y, 'boolean');
+    t.same(typeof parse.z, 'boolean');
+    t.end();
+});
+
+test('newlines in params' , function (t) {
+    var args = optimist.parse([ '-s', "X\nX" ])
+    t.same(args, { _ : [], s : "X\nX", $0 : $0 });
+
+    // reproduce in bash:
+    // VALUE="new
+    // line"
+    // node program.js --s="$VALUE"
+    args = optimist.parse([ "--s=X\nX" ])
+    t.same(args, { _ : [], s : "X\nX", $0 : $0 });
+    t.end();
+});
+
+test('strings' , function (t) {
+    var s = optimist([ '-s', '0001234' ]).string('s').argv.s;
+    t.same(s, '0001234');
+    t.same(typeof s, 'string');
+    
+    var x = optimist([ '-x', '56' ]).string('x').argv.x;
+    t.same(x, '56');
+    t.same(typeof x, 'string');
+    t.end();
+});
+
+test('stringArgs', function (t) {
+    var s = optimist([ '  ', '  ' ]).string('_').argv._;
+    t.same(s.length, 2);
+    t.same(typeof s[0], 'string');
+    t.same(s[0], '  ');
+    t.same(typeof s[1], 'string');
+    t.same(s[1], '  ');
+    t.end();
+});
+
+test('slashBreak', function (t) {
+    t.same(
+        optimist.parse([ '-I/foo/bar/baz' ]),
+        { I : '/foo/bar/baz', _ : [], $0 : $0 }
+    );
+    t.same(
+        optimist.parse([ '-xyz/foo/bar/baz' ]),
+        { x : true, y : true, z : '/foo/bar/baz', _ : [], $0 : $0 }
+    );
+    t.end();
+});
+
+test('alias', function (t) {
+    var argv = optimist([ '-f', '11', '--zoom', '55' ])
+        .alias('z', 'zoom')
+        .argv
+    ;
+    t.equal(argv.zoom, 55);
+    t.equal(argv.z, argv.zoom);
+    t.equal(argv.f, 11);
+    t.end();
+});
+
+test('multiAlias', function (t) {
+    var argv = optimist([ '-f', '11', '--zoom', '55' ])
+        .alias('z', [ 'zm', 'zoom' ])
+        .argv
+    ;
+    t.equal(argv.zoom, 55);
+    t.equal(argv.z, argv.zoom);
+    t.equal(argv.z, argv.zm);
+    t.equal(argv.f, 11);
+    t.end();
+});
+
+test('boolean default true', function (t) {
+    var argv = optimist.options({
+        sometrue: {
+            boolean: true,
+            default: true
+        }
+    }).argv;
+  
+    t.equal(argv.sometrue, true);
+    t.end();
+});
+
+test('boolean default false', function (t) {
+    var argv = optimist.options({
+        somefalse: {
+            boolean: true,
+            default: false
+        }
+    }).argv;
+
+    t.equal(argv.somefalse, false);
+    t.end();
+});
+
+test('nested dotted objects', function (t) {
+    var argv = optimist([
+        '--foo.bar', '3', '--foo.baz', '4',
+        '--foo.quux.quibble', '5', '--foo.quux.o_O',
+        '--beep.boop'
+    ]).argv;
+    
+    t.same(argv.foo, {
+        bar : 3,
+        baz : 4,
+        quux : {
+            quibble : 5,
+            o_O : true
+        },
+    });
+    t.same(argv.beep, { boop : true });
+    t.end();
+});
+
+test('boolean and alias with chainable api', function (t) {
+    var aliased = [ '-h', 'derp' ];
+    var regular = [ '--herp',  'derp' ];
+    var opts = {
+        herp: { alias: 'h', boolean: true }
+    };
+    var aliasedArgv = optimist(aliased)
+        .boolean('herp')
+        .alias('h', 'herp')
+        .argv;
+    var propertyArgv = optimist(regular)
+        .boolean('herp')
+        .alias('h', 'herp')
+        .argv;
+    var expected = {
+        herp: true,
+        h: true,
+        '_': [ 'derp' ],
+        '$0': $0,
+    };
+
+    t.same(aliasedArgv, expected);
+    t.same(propertyArgv, expected); 
+    t.end();
+});
+
+test('boolean and alias with options hash', function (t) {
+    var aliased = [ '-h', 'derp' ];
+    var regular = [ '--herp', 'derp' ];
+    var opts = {
+        herp: { alias: 'h', boolean: true }
+    };
+    var aliasedArgv = optimist(aliased)
+      .options(opts)
+      .argv;
+    var propertyArgv = optimist(regular).options(opts).argv;
+    var expected = {
+        herp: true,
+        h: true,
+        '_': [ 'derp' ],
+        '$0': $0,
+    };
+
+    t.same(aliasedArgv, expected);
+    t.same(propertyArgv, expected);
+
+    t.end();
+});
+
+test('boolean and alias using explicit true', function (t) {
+    var aliased = [ '-h', 'true' ];
+    var regular = [ '--herp',  'true' ];
+    var opts = {
+        herp: { alias: 'h', boolean: true }
+    };
+    var aliasedArgv = optimist(aliased)
+        .boolean('h')
+        .alias('h', 'herp')
+        .argv;
+    var propertyArgv = optimist(regular)
+        .boolean('h')
+        .alias('h', 'herp')
+        .argv;
+    var expected = {
+        herp: true,
+        h: true,
+        '_': [ ],
+        '$0': $0,
+    };
+
+    t.same(aliasedArgv, expected);
+    t.same(propertyArgv, expected); 
+    t.end();
+});
+
+// regression, see https://github.com/substack/node-optimist/issues/71
+test('boolean and --x=true', function(t) {
+    var parsed = optimist(['--boool', '--other=true']).boolean('boool').argv;
+
+    t.same(parsed.boool, true);
+    t.same(parsed.other, 'true');
+
+    parsed = optimist(['--boool', '--other=false']).boolean('boool').argv;
+
+    t.same(parsed.boool, true);
+    t.same(parsed.other, 'false');
+    t.end();
+});
diff --git a/node_modules/optimist/test/parse_modified.js b/node_modules/optimist/test/parse_modified.js
new file mode 100644
index 0000000..a57dc84
--- /dev/null
+++ b/node_modules/optimist/test/parse_modified.js
@@ -0,0 +1,14 @@
+var optimist = require('../');
+var test = require('tap').test;
+
+test('parse with modifier functions' , function (t) {
+    t.plan(1);
+    
+    var argv = optimist().boolean('b').parse([ '-b', '123' ]);
+    t.deepEqual(fix(argv), { b: true, _: ['123'] });
+});
+
+function fix (obj) {
+    delete obj.$0;
+    return obj;
+}
diff --git a/node_modules/optimist/test/short.js b/node_modules/optimist/test/short.js
new file mode 100644
index 0000000..b2c38ad
--- /dev/null
+++ b/node_modules/optimist/test/short.js
@@ -0,0 +1,16 @@
+var optimist = require('../index');
+var test = require('tap').test;
+
+test('-n123', function (t) {
+    t.plan(1);
+    var parse = optimist.parse([ '-n123' ]);
+    t.equal(parse.n, 123);
+});
+
+test('-123', function (t) {
+    t.plan(3);
+    var parse = optimist.parse([ '-123', '456' ]);
+    t.equal(parse['1'], true);
+    t.equal(parse['2'], true);
+    t.equal(parse['3'], 456);
+});
diff --git a/node_modules/optimist/test/usage.js b/node_modules/optimist/test/usage.js
new file mode 100644
index 0000000..300454c
--- /dev/null
+++ b/node_modules/optimist/test/usage.js
@@ -0,0 +1,292 @@
+var Hash = require('hashish');
+var optimist = require('../index');
+var test = require('tap').test;
+
+test('usageFail', function (t) {
+    var r = checkUsage(function () {
+        return optimist('-x 10 -z 20'.split(' '))
+            .usage('Usage: $0 -x NUM -y NUM')
+            .demand(['x','y'])
+            .argv;
+    });
+    t.same(
+        r.result,
+        { x : 10, z : 20, _ : [], $0 : './usage' }
+    );
+
+    t.same(
+        r.errors.join('\n').split(/\n+/),
+        [
+            'Usage: ./usage -x NUM -y NUM',
+            'Options:',
+            '  -x  [required]',
+            '  -y  [required]',
+            'Missing required arguments: y',
+        ]
+    );
+    t.same(r.logs, []);
+    t.ok(r.exit);
+    t.end();
+});
+
+
+test('usagePass', function (t) {
+    var r = checkUsage(function () {
+        return optimist('-x 10 -y 20'.split(' '))
+            .usage('Usage: $0 -x NUM -y NUM')
+            .demand(['x','y'])
+            .argv;
+    });
+    t.same(r, {
+        result : { x : 10, y : 20, _ : [], $0 : './usage' },
+        errors : [],
+        logs : [],
+        exit : false,
+    });
+    t.end();
+});
+
+test('checkPass', function (t) {
+    var r = checkUsage(function () {
+        return optimist('-x 10 -y 20'.split(' '))
+            .usage('Usage: $0 -x NUM -y NUM')
+            .check(function (argv) {
+                if (!('x' in argv)) throw 'You forgot about -x';
+                if (!('y' in argv)) throw 'You forgot about -y';
+            })
+            .argv;
+    });
+    t.same(r, {
+        result : { x : 10, y : 20, _ : [], $0 : './usage' },
+        errors : [],
+        logs : [],
+        exit : false,
+    });
+    t.end();
+});
+
+test('checkFail', function (t) {
+    var r = checkUsage(function () {
+        return optimist('-x 10 -z 20'.split(' '))
+            .usage('Usage: $0 -x NUM -y NUM')
+            .check(function (argv) {
+                if (!('x' in argv)) throw 'You forgot about -x';
+                if (!('y' in argv)) throw 'You forgot about -y';
+            })
+            .argv;
+    });
+
+    t.same(
+        r.result,
+        { x : 10, z : 20, _ : [], $0 : './usage' }
+    );
+
+    t.same(
+        r.errors.join('\n').split(/\n+/),
+        [
+            'Usage: ./usage -x NUM -y NUM',
+            'You forgot about -y'
+        ]
+    );
+
+    t.same(r.logs, []);
+    t.ok(r.exit);
+    t.end();
+});
+
+test('checkCondPass', function (t) {
+    function checker (argv) {
+        return 'x' in argv && 'y' in argv;
+    }
+
+    var r = checkUsage(function () {
+        return optimist('-x 10 -y 20'.split(' '))
+            .usage('Usage: $0 -x NUM -y NUM')
+            .check(checker)
+            .argv;
+    });
+    t.same(r, {
+        result : { x : 10, y : 20, _ : [], $0 : './usage' },
+        errors : [],
+        logs : [],
+        exit : false,
+    });
+    t.end();
+});
+
+test('checkCondFail', function (t) {
+    function checker (argv) {
+        return 'x' in argv && 'y' in argv;
+    }
+
+    var r = checkUsage(function () {
+        return optimist('-x 10 -z 20'.split(' '))
+            .usage('Usage: $0 -x NUM -y NUM')
+            .check(checker)
+            .argv;
+    });
+
+    t.same(
+        r.result,
+        { x : 10, z : 20, _ : [], $0 : './usage' }
+    );
+
+    t.same(
+        r.errors.join('\n').split(/\n+/).join('\n'),
+        'Usage: ./usage -x NUM -y NUM\n'
+        + 'Argument check failed: ' + checker.toString()
+    );
+
+    t.same(r.logs, []);
+    t.ok(r.exit);
+    t.end();
+});
+
+test('countPass', function (t) {
+    var r = checkUsage(function () {
+        return optimist('1 2 3 --moo'.split(' '))
+            .usage('Usage: $0 [x] [y] [z] {OPTIONS}')
+            .demand(3)
+            .argv;
+    });
+    t.same(r, {
+        result : { _ : [ '1', '2', '3' ], moo : true, $0 : './usage' },
+        errors : [],
+        logs : [],
+        exit : false,
+    });
+    t.end();
+});
+
+test('countFail', function (t) {
+    var r = checkUsage(function () {
+        return optimist('1 2 --moo'.split(' '))
+            .usage('Usage: $0 [x] [y] [z] {OPTIONS}')
+            .demand(3)
+            .argv;
+    });
+    t.same(
+        r.result,
+        { _ : [ '1', '2' ], moo : true, $0 : './usage' }
+    );
+
+    t.same(
+        r.errors.join('\n').split(/\n+/),
+        [
+            'Usage: ./usage [x] [y] [z] {OPTIONS}',
+            'Not enough non-option arguments: got 2, need at least 3',
+        ]
+    );
+
+    t.same(r.logs, []);
+    t.ok(r.exit);
+    t.end();
+});
+
+test('defaultSingles', function (t) {
+    var r = checkUsage(function () {
+        return optimist('--foo 50 --baz 70 --powsy'.split(' '))
+            .default('foo', 5)
+            .default('bar', 6)
+            .default('baz', 7)
+            .argv
+        ;
+    });
+    t.same(r.result, {
+        foo : '50',
+        bar : 6,
+        baz : '70',
+        powsy : true,
+        _ : [],
+        $0 : './usage',
+    });
+    t.end();
+});
+
+test('defaultAliases', function (t) {
+    var r = checkUsage(function () {
+        return optimist('')
+            .alias('f', 'foo')
+            .default('f', 5)
+            .argv
+        ;
+    });
+    t.same(r.result, {
+        f : '5',
+        foo : '5',
+        _ : [],
+        $0 : './usage',
+    });
+    t.end();
+});
+
+test('defaultHash', function (t) {
+    var r = checkUsage(function () {
+        return optimist('--foo 50 --baz 70'.split(' '))
+            .default({ foo : 10, bar : 20, quux : 30 })
+            .argv
+        ;
+    });
+    t.same(r.result, {
+        _ : [],
+        $0 : './usage',
+        foo : 50,
+        baz : 70,
+        bar : 20,
+        quux : 30,
+    });
+    t.end();
+});
+
+test('rebase', function (t) {
+    t.equal(
+        optimist.rebase('/home/substack', '/home/substack/foo/bar/baz'),
+        './foo/bar/baz'
+    );
+    t.equal(
+        optimist.rebase('/home/substack/foo/bar/baz', '/home/substack'),
+        '../../..'
+    );
+    t.equal(
+        optimist.rebase('/home/substack/foo', '/home/substack/pow/zoom.txt'),
+        '../pow/zoom.txt'
+    );
+    t.end();
+});
+
+function checkUsage (f) {
+
+    var exit = false;
+
+    process._exit = process.exit;
+    process._env = process.env;
+    process._argv = process.argv;
+
+    process.exit = function (t) { exit = true };
+    process.env = Hash.merge(process.env, { _ : 'node' });
+    process.argv = [ './usage' ];
+
+    var errors = [];
+    var logs = [];
+
+    console._error = console.error;
+    console.error = function (msg) { errors.push(msg) };
+    console._log = console.log;
+    console.log = function (msg) { logs.push(msg) };
+
+    var result = f();
+
+    process.exit = process._exit;
+    process.env = process._env;
+    process.argv = process._argv;
+
+    console.error = console._error;
+    console.log = console._log;
+
+    return {
+        errors : errors,
+        logs : logs,
+        exit : exit,
+        result : result,
+    };
+};
diff --git a/node_modules/optimist/test/whitespace.js b/node_modules/optimist/test/whitespace.js
new file mode 100644
index 0000000..90b9075
--- /dev/null
+++ b/node_modules/optimist/test/whitespace.js
@@ -0,0 +1,8 @@
+var optimist = require('../');
+var test = require('tap').test;
+
+test('whitespace should be whitespace' , function (t) {
+    t.plan(1);
+    var x = optimist.parse([ '-x', '\t' ]).x;
+    t.equal(x, '\t');
+});
diff --git a/node_modules/q/LICENSE b/node_modules/q/LICENSE
new file mode 100644
index 0000000..8a706b5
--- /dev/null
+++ b/node_modules/q/LICENSE
@@ -0,0 +1,18 @@
+Copyright 2009–2014 Kristopher Michael Kowal. All rights reserved.
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to
+deal in the Software without restriction, including without limitation the
+rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+sell copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+IN THE SOFTWARE.
diff --git a/node_modules/q/README.md b/node_modules/q/README.md
new file mode 100644
index 0000000..62f607a
--- /dev/null
+++ b/node_modules/q/README.md
@@ -0,0 +1,916 @@
+[![Build Status](https://secure.travis-ci.org/kriskowal/q.png?branch=master)](http://travis-ci.org/kriskowal/q)
+
+<a href="http://promises-aplus.github.com/promises-spec">
+    <img src="http://promises-aplus.github.com/promises-spec/assets/logo-small.png"
+         align="right" alt="Promises/A+ logo" />
+</a>
+
+*:warning: This is Q version 2 and is experimental at this time. If you install
+the latest Q from `npm`, you will get the latest from the [version 1][v1]
+release train. You will get the lastet of version 2 if you use `npm install
+q@~2`. Consult [CHANGES.md][] for details on what has changed*
+
+*Among the significant differences in version 2, the source is CommonJS only and
+versions suitable for use with AMD and plain `<script>` tags are built and
+published for [download][] with each release.*
+
+[v1]: https://github.com/kriskowal/q/tree/v1
+[download]: http://q-releases.s3-website-us-west-1.amazonaws.com/
+[CHANGES.md]: https://github.com/kriskowal/q/blob/v2/CHANGES.md
+
+If a function cannot return a value or throw an exception without
+blocking, it can return a promise instead.  A promise is an object
+that represents the return value or the thrown exception that the
+function may eventually provide.  A promise can also be used as a
+proxy for a [remote object][Q-Connection] to overcome latency.
+
+[Q-Connection]: https://github.com/kriskowal/q-connection
+
+
+## Getting Started
+
+The Q module can be loaded as:
+
+-   A ``<script>`` tag (creating a ``Q`` global variable): ~2.5 KB minified and
+    gzipped.  Download the latest of [version
+    0.9](https://raw.github.com/kriskowal/q/v0.9/q.js)
+-   A Node.js and CommonJS module, available in [npm](https://npmjs.org/) as
+    the [q](https://npmjs.org/package/q) package
+-   An AMD module.  [Download version
+    0.9](https://raw.github.com/kriskowal/q/v0.9/q.js)
+-   A [component](https://github.com/component/component) as ``microjs/q``
+-   Using [bower](http://bower.io/) as ``q``
+-   Using [NuGet](http://nuget.org/) as [Q](https://nuget.org/packages/q)
+
+Q can exchange promises with jQuery, Dojo, When.js, WinJS, and more.
+
+## Resources
+
+Our [wiki][] contains a number of useful resources, including:
+
+- A method-by-method [Q API reference][reference].
+- A growing [examples gallery][examples], showing how Q can be used to make
+  everything better. From XHR to database access to accessing the Flickr API,
+  Q is there for you.
+- There are many libraries that produce and consume Q promises for everything
+  from file system/database access or RPC to templating. For a list of some of
+  the more popular ones, see [Libraries][].
+- If you want materials that introduce the promise concept generally, and the
+  below tutorial isn't doing it for you, check out our collection of
+  [presentations, blog posts, and podcasts][resources].
+- A guide for those [coming from jQuery's `$.Deferred`][jquery].
+
+We'd also love to have you join the Q-Continuum [mailing list][].
+
+[wiki]: https://github.com/kriskowal/q/wiki
+[reference]: https://github.com/kriskowal/q/wiki/API-Reference
+[examples]: https://github.com/kriskowal/q/wiki/Examples-Gallery
+[Libraries]: https://github.com/kriskowal/q/wiki/Libraries
+[resources]: https://github.com/kriskowal/q/wiki/General-Promise-Resources
+[jquery]: https://github.com/kriskowal/q/wiki/Coming-from-jQuery
+[mailing list]: https://groups.google.com/forum/#!forum/q-continuum
+
+
+## Introduction
+
+There are many reasons to use promises.  The first reward is that
+promises implicitly propagate errors and values downstream.  Consider
+this synchronous solution to reading a file and parsing its content.
+
+```javascript
+var FS = require("fs");
+var readJsonSync = function (path) {
+    return JSON.parse(FS.readSync(path, "utf-8"));
+};
+```
+
+The asynchronous analog would ideally look and behave exactly the same
+*except* it would explicitly mark anywhere it might yield to other
+tasks, which is to say, between calling and returning, and reading and
+parsing.  Control flow constructs like `return`, `throw`, `if`, `for`,
+`break` and `continue` would still work, except asynchronously.
+Exceptions, such as the `SyntaxError` that `JSON.parse` might throw,
+would propagate through the promise graph just as they do through the
+synchronous stack.  Forbes Lindesay illustrates the way to this happy
+ideal in his presentation, [“Promises and Generators”][PAG].
+
+[PAG]: http://pag.forbeslindesay.co.uk/
+
+```javascript
+var FS = require("q-io/fs");
+var readJsonPromise = Q.async(function *(path) {
+    return JSON.parse(yield FS.read(path));
+});
+```
+
+Explicitly marking yield points makes it possible for users to take
+advantage of the invariant that they can arrange for a consistent
+internal state between events, and be guaranteed that only they can
+alter their state during an event.  Fibers and threads do not provide
+this guarantee, so programmers must work with a heightened sense of
+caution—their work may be interrupted and their state modified at any
+function call boundary for fibers, or at *any time at all* with threads.
+
+But even without generators, by using promises, we can at least get
+exceptions to implicitly propagate asynchronously with very little
+noise.
+
+```javascript
+var FS = require("q-io/fs");
+function readJsonPromise(path) {
+    return FS.read(path).then(JSON.parse);
+}
+```
+
+Compare these solutions to the equivalent using bare callbacks.  It must
+use an explicit `try` block to `catch` the exception that `JSON.parse`
+might throw and must manually forward all errors to the subscriber.  It
+also must take care not to call the subscriber inside the try block,
+since this would catch errors thrown by `nodeback` and throw them back
+at `nodeback` in the catch block.  In general, writing callback-based
+functions that handle errors robustly is difficult and error-prone, and
+even if you do it right, rather verbose.
+
+```javascript
+var FS = require("fs");
+var readJsonWithNodebacks = function (path, nodeback) {
+    FS.readFile(path, "utf-8", function (error, content) {
+        var result;
+        if (error) {
+            return nodeback(error);
+        }
+        try {
+            result = JSON.parse(result);
+        } catch (error) {
+            return nodeback(error);
+        }
+        nodeback(null, result);
+    });
+}
+```
+
+The second reward for using promises is that they implicitly guarantee
+that interfaces you create will be strictly asynchronous.  Oliver
+Steele’s [Minimizing Code Paths in Asynchronous Code][Steele] succinctly
+captures the issue and Isaac Schlueter’s more recent treatise,
+[Designing APIs for Asynchrony][Isaac], reframed the edict as “Do Not
+Release Zalgo”.
+
+[Steele]: http://blog.osteele.com/posts/2008/04/minimizing-code-paths-in-asychronous-code
+[Isaac]: http://blog.izs.me/post/59142742143/designing-apis-for-asynchrony
+
+If you are using Q, you can cast any promise, even a [jQuery
+“promise”][jQuery], into a well-behaved promise that will not call event
+handlers until your event is done.
+
+[jQuery]: https://github.com/kriskowal/q/wiki/Coming-from-jQuery
+
+```javascript
+var x = 10;
+var part1 = Q($.ajax(...))
+.then(function () {
+    x = 20;
+});
+var part2 = Q($.ajax(...))
+.then(function () {
+    x = 30;
+});
+expect(x).toBe(10); // still, no matter what
+```
+
+Using promises also preserves the signatures of synchronous functions.
+Continuation passing style is an “inversion of control”, where you pass
+control forward instead of getting it back when a function returns.
+Promises [un-invert][IOC] the inversion, cleanly separating the input
+arguments from control flow arguments.  This simplifies the use and
+creation of API’s, particularly variadic, rest and spread arguments.
+
+[IOC]: http://www.slideshare.net/domenicdenicola/callbacks-promises-and-coroutines-oh-my-the-evolution-of-asynchronicity-in-javascript
+
+Another point to using promises is that multiple subscribers can wait
+for a result, and new subscribers can be added even after the result has
+been published.  Consider how much simpler it would be to wait for
+DOMContentLoaded with promises.  No need to worry about whether the
+event has already passed.
+
+```javascript
+return document.ready.then(setup);
+```
+
+Promises go on to be a useful primitive for capturing the “causal graph”
+of an asynchronous program, providing “long traces” that capture the
+stacks from all the events that led to an exception.  Promises are also
+useful as proxies for objects in other processes, pipelining messages
+over any inter-process message channel.
+
+The point of promises is that they have scouted the way ahead and will
+help you avoid set-backs and dead-ends, from simple problems like
+synchronizing local work, to more advanced problems [like distributed
+robust secure escrow exchange][MarkM].
+
+[MarkM]: http://scholar.google.com/citations?user=PuP2INoAAAAJ&hl=en&oi=ao
+
+
+## Tutorial
+
+Promises have a ``then`` method, which you can use to get the eventual
+return value (fulfillment) or thrown exception (rejection).
+
+```javascript
+promiseMeSomething()
+.then(function (value) {
+}, function (reason) {
+});
+```
+
+If ``promiseMeSomething`` returns a promise that gets fulfilled later
+with a return value, the first function (the fulfillment handler) will be
+called with the value.  However, if the ``promiseMeSomething`` function
+gets rejected later by a thrown exception, the second function (the
+rejection handler) will be called with the exception.
+
+Note that resolution of a promise is always asynchronous: that is, the
+fulfillment or rejection handler will always be called in the next turn of the
+event loop (i.e. `process.nextTick` in Node). This gives you a nice
+guarantee when mentally tracing the flow of your code, namely that
+``then`` will always return before either handler is executed.
+
+In this tutorial, we begin with how to consume and work with promises. We'll
+talk about how to create them, and thus create functions like
+`promiseMeSomething` that return promises, [below](#the-beginning).
+
+
+### Propagation
+
+The ``then`` method returns a promise, which in this example, I’m
+assigning to ``outputPromise``.
+
+```javascript
+var outputPromise = getInputPromise()
+.then(function (input) {
+}, function (reason) {
+});
+```
+
+The ``outputPromise`` variable becomes a new promise for the return
+value of either handler.  Since a function can only either return a
+value or throw an exception, only one handler will ever be called and it
+will be responsible for resolving ``outputPromise``.
+
+-   If you return a value in a handler, ``outputPromise`` will get
+    fulfilled.
+
+-   If you throw an exception in a handler, ``outputPromise`` will get
+    rejected.
+
+-   If you return a **promise** in a handler, ``outputPromise`` will
+    “become” that promise.  Being able to become a new promise is useful
+    for managing delays, combining results, or recovering from errors.
+
+If the ``getInputPromise()`` promise gets rejected and you omit the
+rejection handler, the **error** will go to ``outputPromise``:
+
+```javascript
+var outputPromise = getInputPromise()
+.then(function (value) {
+});
+```
+
+If the input promise gets fulfilled and you omit the fulfillment handler, the
+**value** will go to ``outputPromise``:
+
+```javascript
+var outputPromise = getInputPromise()
+.then(null, function (error) {
+});
+```
+
+Q promises provide a ``fail`` shorthand for ``then`` when you are only
+interested in handling the error:
+
+```javascript
+var outputPromise = getInputPromise()
+.fail(function (error) {
+});
+```
+
+If you are writing JavaScript for modern engines only or using
+CoffeeScript, you may use `catch` instead of `fail`.
+
+Promises also have a ``fin`` function that is like a ``finally`` clause.
+The final handler gets called, with no arguments, when the promise
+returned by ``getInputPromise()`` either returns a value or throws an
+error.  The value returned or error thrown by ``getInputPromise()``
+passes directly to ``outputPromise`` unless the final handler fails, and
+may be delayed if the final handler returns a promise.
+
+```javascript
+var outputPromise = getInputPromise()
+.fin(function () {
+    // close files, database connections, stop servers, conclude tests
+});
+```
+
+-   If the handler returns a value, the value is ignored
+-   If the handler throws an error, the error passes to ``outputPromise``
+-   If the handler returns a promise, ``outputPromise`` gets postponed.  The
+    eventual value or error has the same effect as an immediate return
+    value or thrown error: a value would be ignored, an error would be
+    forwarded.
+
+If you are writing JavaScript for modern engines only or using
+CoffeeScript, you may use `finally` instead of `fin`.
+
+### Chaining
+
+There are two ways to chain promises.  You can chain promises either
+inside or outside handlers.  The next two examples are equivalent.
+
+```javascript
+return getUsername()
+.then(function (username) {
+    return getUser(username)
+    .then(function (user) {
+        // if we get here without an error,
+        // the value returned here
+        // or the exception thrown here
+        // resolves the promise returned
+        // by the first line
+    })
+});
+```
+
+```javascript
+return getUsername()
+.then(function (username) {
+    return getUser(username);
+})
+.then(function (user) {
+    // if we get here without an error,
+    // the value returned here
+    // or the exception thrown here
+    // resolves the promise returned
+    // by the first line
+});
+```
+
+The only difference is nesting.  It’s useful to nest handlers if you
+need to capture multiple input values in your closure.
+
+```javascript
+function authenticate() {
+    return getUsername()
+    .then(function (username) {
+        return getUser(username);
+    })
+    // chained because we will not need the user name in the next event
+    .then(function (user) {
+        return getPassword()
+        // nested because we need both user and password next
+        .then(function (password) {
+            if (user.passwordHash !== hash(password)) {
+                throw new Error("Can't authenticate");
+            }
+        });
+    });
+}
+```
+
+
+### Combination
+
+You can turn an array of promises into a promise for the whole,
+fulfilled array using ``all``.
+
+```javascript
+return Q.all([
+    eventualAdd(2, 2),
+    eventualAdd(10, 20)
+]);
+```
+
+If you have a promise for an array, you can use ``spread`` as a
+replacement for ``then``.  The ``spread`` function “spreads” the
+values over the arguments of the fulfillment handler.  The rejection handler
+will get called at the first sign of failure.  That is, whichever of
+the received promises fails first gets handled by the rejection handler.
+
+```javascript
+function eventualAdd(a, b) {
+    return Q.spread([a, b], function (a, b) {
+        return a + b;
+    })
+}
+```
+
+But ``spread`` calls ``all`` initially, so you can skip it in chains.
+
+```javascript
+return getUsername()
+.then(function (username) {
+    return [username, getUser(username)];
+})
+.spread(function (username, user) {
+});
+```
+
+The ``all`` function returns a promise for an array of values.  When this
+promise is fulfilled, the array contains the fulfillment values of the original
+promises, in the same order as those promises.  If one of the given promises
+is rejected, the returned promise is immediately rejected, not waiting for the
+rest of the batch.  If you want to wait for all of the promises to either be
+fulfilled or rejected, you can use ``allSettled``.
+
+```javascript
+Q.allSettled(promises)
+.then(function (results) {
+    results.forEach(function (result) {
+        if (result.state === "fulfilled") {
+            var value = result.value;
+        } else {
+            var reason = result.reason;
+        }
+    });
+});
+```
+
+
+### Sequences
+
+If you have a number of promise-producing functions that need
+to be run sequentially, you can of course do so manually:
+
+```javascript
+return foo(initialVal).then(bar).then(baz).then(qux);
+```
+
+However, if you want to run a dynamically constructed sequence of
+functions, you'll want something like this:
+
+```javascript
+var funcs = [foo, bar, baz, qux];
+
+var result = Q(initialVal);
+funcs.forEach(function (f) {
+    result = result.then(f);
+});
+return result;
+```
+
+You can make this slightly more compact using `reduce` (a
+[method][reduce] of arrays introduced in ECMAScript 5):
+
+[reduce]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce
+
+```javascript
+return funcs.reduce(function (soFar, f) {
+    return soFar.then(f);
+}, Q(initialVal));
+```
+
+Or, you could use the ultra-compact version:
+
+```javascript
+return funcs.reduce(Q.when, Q());
+```
+
+### Handling Errors
+
+One sometimes-unintuive aspect of promises is that if you throw an
+exception in the fulfillment handler, it will not be caught by the error
+handler.
+
+```javascript
+return foo()
+.then(function (value) {
+    throw new Error("Can't bar.");
+}, function (error) {
+    // We only get here if "foo" fails
+});
+```
+
+To see why this is, consider the parallel between promises and
+``try``/``catch``. We are ``try``-ing to execute ``foo()``: the error
+handler represents a ``catch`` for ``foo()``, while the fulfillment handler
+represents code that happens *after* the ``try``/``catch`` block.
+That code then needs its own ``try``/``catch`` block.
+
+In terms of promises, this means chaining your rejection handler:
+
+```javascript
+return foo()
+.then(function (value) {
+    throw new Error("Can't bar.");
+})
+.fail(function (error) {
+    // We get here with either foo's error or bar's error
+});
+```
+
+### Progress Notification
+
+It's possible for promises to report their progress, e.g. for tasks that take a
+long time like a file upload. Not all promises will implement progress
+notifications, but for those that do, you can consume the progress values using
+a third parameter to ``then``:
+
+```javascript
+return uploadFile()
+.then(function () {
+    // Success uploading the file
+}, function (err) {
+    // There was an error, and we get the reason for error
+}, function (progress) {
+    // We get notified of the upload's progress as it is executed
+});
+```
+
+Like `fail`, Q also provides a shorthand for progress callbacks
+called `progress`:
+
+```javascript
+return uploadFile().progress(function (progress) {
+    // We get notified of the upload's progress
+});
+```
+
+### The End
+
+When you get to the end of a chain of promises, you should either
+return the last promise or end the chain.  Since handlers catch
+errors, it’s an unfortunate pattern that the exceptions can go
+unobserved.
+
+So, either return it,
+
+```javascript
+return foo()
+.then(function () {
+    return "bar";
+});
+```
+
+Or, end it.
+
+```javascript
+foo()
+.then(function () {
+    return "bar";
+})
+.done();
+```
+
+Ending a promise chain makes sure that, if an error doesn’t get
+handled before the end, it will get rethrown and reported.
+
+This is a stopgap. We are exploring ways to make unhandled errors
+visible without any explicit handling.
+
+
+### The Beginning
+
+Everything above assumes you get a promise from somewhere else.  This
+is the common case.  Every once in a while, you will need to create a
+promise from scratch.
+
+#### Using ``Q.fcall``
+
+You can create a promise from a value using ``Q.fcall``.  This returns a
+promise for 10.
+
+```javascript
+return Q.fcall(function () {
+    return 10;
+});
+```
+
+You can also use ``fcall`` to get a promise for an exception.
+
+```javascript
+return Q.fcall(function () {
+    throw new Error("Can't do it");
+});
+```
+
+As the name implies, ``fcall`` can call functions, or even promised
+functions.  This uses the ``eventualAdd`` function above to add two
+numbers.
+
+```javascript
+return Q.fcall(eventualAdd, 2, 2);
+```
+
+
+#### Using Deferreds
+
+If you have to interface with asynchronous functions that are callback-based
+instead of promise-based, Q provides a few shortcuts (like ``Q.nfcall`` and
+friends). But much of the time, the solution will be to use *deferreds*.
+
+```javascript
+var deferred = Q.defer();
+FS.readFile("foo.txt", "utf-8", function (error, text) {
+    if (error) {
+        deferred.reject(new Error(error));
+    } else {
+        deferred.resolve(text);
+    }
+});
+return deferred.promise;
+```
+
+Note that a deferred can be resolved with a value or a promise.  The
+``reject`` function is a shorthand for resolving with a rejected
+promise.
+
+```javascript
+// this:
+deferred.reject(new Error("Can't do it"));
+
+// is shorthand for:
+var rejection = Q.fcall(function () {
+    throw new Error("Can't do it");
+});
+deferred.resolve(rejection);
+```
+
+This is a simplified implementation of ``Q.delay``.
+
+```javascript
+function delay(ms) {
+    var deferred = Q.defer();
+    setTimeout(deferred.resolve, ms);
+    return deferred.promise;
+}
+```
+
+This is a simplified implementation of ``Q.timeout``
+
+```javascript
+function timeout(promise, ms) {
+    var deferred = Q.defer();
+    Q.when(promise, deferred.resolve);
+    delay(ms).then(function () {
+        deferred.reject(new Error("Timed out"));
+    });
+    return deferred.promise;
+}
+```
+
+Finally, you can send a progress notification to the promise with
+``deferred.notify``.
+
+For illustration, this is a wrapper for XML HTTP requests in the browser. Note
+that a more [thorough][XHR] implementation would be in order in practice.
+
+[XHR]: https://github.com/montagejs/mr/blob/71e8df99bb4f0584985accd6f2801ef3015b9763/browser.js#L29-L73
+
+```javascript
+function requestOkText(url) {
+    var request = new XMLHttpRequest();
+    var deferred = Q.defer();
+
+    request.open("GET", url, true);
+    request.onload = onload;
+    request.onerror = onerror;
+    request.onprogress = onprogress;
+    request.send();
+
+    function onload() {
+        if (request.status === 200) {
+            deferred.resolve(request.responseText);
+        } else {
+            deferred.reject(new Error("Status code was " + request.status));
+        }
+    }
+
+    function onerror() {
+        deferred.reject(new Error("Can't XHR " + JSON.stringify(url)));
+    }
+
+    function onprogress(event) {
+        deferred.notify(event.loaded / event.total);
+    }
+
+    return deferred.promise;
+}
+```
+
+Below is an example of how to use this ``requestOkText`` function:
+
+```javascript
+requestOkText("http://localhost:3000")
+.then(function (responseText) {
+    // If the HTTP response returns 200 OK, log the response text.
+    console.log(responseText);
+}, function (error) {
+    // If there's an error or a non-200 status code, log the error.
+    console.error(error);
+}, function (progress) {
+    // Log the progress as it comes in.
+    console.log("Request progress: " + Math.round(progress * 100) + "%");
+});
+```
+
+### The Middle
+
+If you are using a function that may return a promise, but just might
+return a value if it doesn’t need to defer, you can use the “static”
+methods of the Q library.
+
+The ``when`` function is the static equivalent for ``then``.
+
+```javascript
+return Q.when(valueOrPromise, function (value) {
+}, function (error) {
+});
+```
+
+All of the other methods on a promise have static analogs with the
+same name.
+
+The following are equivalent:
+
+```javascript
+return Q.all([a, b]);
+```
+
+```javascript
+return Q.fcall(function () {
+    return [a, b];
+})
+.all();
+```
+
+When working with promises provided by other libraries, you should
+convert it to a Q promise.  Not all promise libraries make the same
+guarantees as Q and certainly don’t provide all of the same methods.
+Most libraries only provide a partially functional ``then`` method.
+This thankfully is all we need to turn them into vibrant Q promises.
+
+```javascript
+return Q($.ajax(...))
+.then(function () {
+});
+```
+
+If there is any chance that the promise you receive is not a Q promise
+as provided by your library, you should wrap it using a Q function.
+You can even use ``Q.invoke`` as a shorthand.
+
+```javascript
+return Q.invoke($, 'ajax', ...)
+.then(function () {
+});
+```
+
+
+### Over the Wire
+
+A promise can serve as a proxy for another object, even a remote
+object.  There are methods that allow you to optimistically manipulate
+properties or call functions.  All of these interactions return
+promises, so they can be chained.
+
+```
+direct manipulation         using a promise as a proxy
+--------------------------  -------------------------------
+value.foo                   promise.get("foo")
+value.foo = value           promise.put("foo", value)
+delete value.foo            promise.del("foo")
+value.foo(...args)          promise.post("foo", [args])
+value.foo(...args)          promise.invoke("foo", ...args)
+value(...args)              promise.fapply([args])
+value(...args)              promise.fcall(...args)
+```
+
+If the promise is a proxy for a remote object, you can shave
+round-trips by using these functions instead of ``then``.  To take
+advantage of promises for remote objects, check out [Q-Connection][].
+
+[Q-Connection]: https://github.com/kriskowal/q-connection
+
+Even in the case of non-remote objects, these methods can be used as
+shorthand for particularly-simple fulfillment handlers. For example, you
+can replace
+
+```javascript
+return Q.fcall(function () {
+    return [{ foo: "bar" }, { foo: "baz" }];
+})
+.then(function (value) {
+    return value[0].foo;
+});
+```
+
+with
+
+```javascript
+return Q.fcall(function () {
+    return [{ foo: "bar" }, { foo: "baz" }];
+})
+.get(0)
+.get("foo");
+```
+
+
+### Adapting Node
+
+If you're working with functions that make use of the Node.js callback pattern,
+where callbacks are in the form of `function(err, result)`, Q provides a few
+useful utility functions for converting between them. The most straightforward
+are probably `Q.nfcall` and `Q.nfapply` ("Node function call/apply") for calling
+Node.js-style functions and getting back a promise:
+
+```javascript
+return Q.nfcall(FS.readFile, "foo.txt", "utf-8");
+return Q.nfapply(FS.readFile, ["foo.txt", "utf-8"]);
+```
+
+If you are working with methods, instead of simple functions, you can easily
+run in to the usual problems where passing a method to another function—like
+`Q.nfcall`—"un-binds" the method from its owner. To avoid this, you can either
+use `Function.prototype.bind` or some nice shortcut methods we provide:
+
+```javascript
+return Q.ninvoke(redisClient, "get", "user:1:id");
+return Q.npost(redisClient, "get", ["user:1:id"]);
+```
+
+You can also create reusable wrappers with `Q.denodeify` or `Q.nbind`:
+
+```javascript
+var readFile = Q.denodeify(FS.readFile);
+return readFile("foo.txt", "utf-8");
+
+var redisClientGet = Q.nbind(redisClient.get, redisClient);
+return redisClientGet("user:1:id");
+```
+
+Finally, if you're working with raw deferred objects, there is a
+`makeNodeResolver` method on deferreds that can be handy:
+
+```javascript
+var deferred = Q.defer();
+FS.readFile("foo.txt", "utf-8", deferred.makeNodeResolver());
+return deferred.promise;
+```
+
+### Long Stack Traces
+
+Q comes with optional support for “long stack traces,” wherein the `stack`
+property of `Error` rejection reasons is rewritten to be traced along
+asynchronous jumps instead of stopping at the most recent one. As an example:
+
+```js
+function theDepthsOfMyProgram() {
+  Q.delay(100).done(function explode() {
+    throw new Error("boo!");
+  });
+}
+
+theDepthsOfMyProgram();
+```
+
+usually would give a rather unhelpful stack trace looking something like
+
+```
+Error: boo!
+    at explode (/path/to/test.js:3:11)
+    at _fulfilled (/path/to/test.js:q:54)
+    at resolvedValue.promiseDispatch.done (/path/to/q.js:823:30)
+    at makePromise.promise.promiseDispatch (/path/to/q.js:496:13)
+    at pending (/path/to/q.js:397:39)
+    at process.startup.processNextTick.process._tickCallback (node.js:244:9)
+```
+
+But, if you turn this feature on by setting
+
+```js
+Q.longStackSupport = true;
+```
+
+then the above code gives a nice stack trace to the tune of
+
+```
+Error: boo!
+    at explode (/path/to/test.js:3:11)
+From previous event:
+    at theDepthsOfMyProgram (/path/to/test.js:2:16)
+    at Object.<anonymous> (/path/to/test.js:7:1)
+```
+
+Note how you can see the the function that triggered the async operation in the
+stack trace! This is very helpful for debugging, as otherwise you end up getting
+only the first line, plus a bunch of Q internals, with no sign of where the
+operation started.
+
+This feature does come with somewhat-serious performance and memory overhead,
+however. If you're working with lots of promises, or trying to scale a server
+to many users, you should probably keep it off. But in development, go for it!
+
+## License
+
+Copyright 2009–2013 Kristopher Michael Kowal
+MIT License (enclosed)
+
diff --git a/node_modules/q/node_modules/asap/CHANGES.md b/node_modules/q/node_modules/asap/CHANGES.md
new file mode 100644
index 0000000..e9ffa46
--- /dev/null
+++ b/node_modules/q/node_modules/asap/CHANGES.md
@@ -0,0 +1,64 @@
+
+## 2.0.3
+
+Version 2.0.3 fixes a bug when adjusting the capacity of the task queue.
+
+## 2.0.1-2.02
+
+Version 2.0.1 fixes a bug in the way redirects were expressed that affected the
+function of Browserify, but which Mr would tolerate.
+
+## 2.0.0
+
+Version 2 of ASAP is a full rewrite with a few salient changes.
+First, the ASAP source is CommonJS only and designed with [Browserify][] and
+[Browserify-compatible][Mr] module loaders in mind.
+
+[Browserify]: https://github.com/substack/node-browserify
+[Mr]: https://github.com/montagejs/mr
+
+The new version has been refactored in two dimensions.
+Support for Node.js and browsers have been separated, using Browserify
+redirects and ASAP has been divided into two modules.
+The "raw" layer depends on the tasks to catch thrown exceptions and unravel
+Node.js domains.
+
+The full implementation of ASAP is loadable as `require("asap")` in both Node.js
+and browsers.
+
+The raw layer that lacks exception handling overhead is loadable as
+`require("asap/raw")`.
+The interface is the same for both layers.
+
+Tasks are no longer required to be functions, but can rather be any object that
+implements `task.call()`.
+With this feature you can recycle task objects to avoid garbage collector churn
+and avoid closures in general.
+
+The implementation has been rigorously documented so that our successors can
+understand the scope of the problem that this module solves and all of its
+nuances, ensuring that the next generation of implementations know what details
+are essential.
+
+-   [asap.js](https://github.com/kriskowal/asap/blob/master/asap.js)
+-   [raw.js](https://github.com/kriskowal/asap/blob/master/raw.js)
+-   [browser-asap.js](https://github.com/kriskowal/asap/blob/master/browser-asap.js)
+-   [browser-raw.js](https://github.com/kriskowal/asap/blob/master/browser-raw.js)
+
+The new version has also been rigorously tested across a broad spectrum of
+browsers, in both the window and worker context.
+The following charts capture the browser test results for the most recent
+release.
+The first chart shows test results for ASAP running in the main window context.
+The second chart shows test results for ASAP running in a web worker context.
+Test results are inconclusive (grey) on browsers that do not support web
+workers.
+These data are captured automatically by [Continuous
+Integration][].
+
+![Browser Compatibility](http://kriskowal-asap.s3-website-us-west-2.amazonaws.com/train/integration-2/saucelabs-results-matrix.svg)
+
+![Compatibility in Web Workers](http://kriskowal-asap.s3-website-us-west-2.amazonaws.com/train/integration-2/saucelabs-worker-results-matrix.svg)
+
+[Continuous Integration]: https://github.com/kriskowal/asap/blob/master/CONTRIBUTING.md
+
diff --git a/node_modules/q/node_modules/asap/LICENSE.md b/node_modules/q/node_modules/asap/LICENSE.md
new file mode 100644
index 0000000..ba18c61
--- /dev/null
+++ b/node_modules/q/node_modules/asap/LICENSE.md
@@ -0,0 +1,21 @@
+
+Copyright 2009–2014 Contributors. All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to
+deal in the Software without restriction, including without limitation the
+rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+sell copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+IN THE SOFTWARE.
+
diff --git a/node_modules/q/node_modules/asap/README.md b/node_modules/q/node_modules/asap/README.md
new file mode 100644
index 0000000..452fd8c
--- /dev/null
+++ b/node_modules/q/node_modules/asap/README.md
@@ -0,0 +1,237 @@
+# ASAP
+
+[![Build Status](https://travis-ci.org/kriskowal/asap.png?branch=master)](https://travis-ci.org/kriskowal/asap)
+
+Promise and asynchronous observer libraries, as well as hand-rolled callback
+programs and libraries, often need a mechanism to postpone the execution of a
+callback until the next available event.
+(See [Designing API’s for Asynchrony][Zalgo].)
+The `asap` function executes a task **as soon as possible** but not before it
+returns, waiting only for the completion of the current event and previously
+scheduled tasks.
+
+```javascript
+asap(function () {
+    // ...
+});
+```
+
+[Zalgo]: http://blog.izs.me/post/59142742143/designing-apis-for-asynchrony
+
+This CommonJS package provides an `asap` module that exports a function that
+executes a task function *as soon as possible*.
+
+ASAP strives to schedule events to occur before yielding for IO, reflow,
+or redrawing.
+Each event receives an independent stack, with only platform code in parent
+frames and the events run in the order they are scheduled.
+
+ASAP provides a fast event queue that will execute tasks until it is
+empty before yielding to the JavaScript engine's underlying event-loop.
+When a task gets added to a previously empty event queue, ASAP schedules a flush
+event, preferring for that event to occur before the JavaScript engine has an
+opportunity to perform IO tasks or rendering, thus making the first task and
+subsequent tasks semantically indistinguishable.
+ASAP uses a variety of techniques to preserve this invariant on different
+versions of browsers and Node.js.
+
+By design, ASAP prevents input events from being handled until the task
+queue is empty.
+If the process is busy enough, this may cause incoming connection requests to be
+dropped, and may cause existing connections to inform the sender to reduce the
+transmission rate or stall.
+ASAP allows this on the theory that, if there is enough work to do, there is no
+sense in looking for trouble.
+As a consequence, ASAP can interfere with smooth animation.
+If your task should be tied to the rendering loop, consider using
+`requestAnimationFrame` instead.
+A long sequence of tasks can also effect the long running script dialog.
+If this is a problem, you may be able to use ASAP’s cousin `setImmediate` to
+break long processes into shorter intervals and periodically allow the browser
+to breathe.
+`setImmediate` will yield for IO, reflow, and repaint events.
+It also returns a handler and can be canceled.
+For a `setImmediate` shim, consider [YuzuJS setImmediate][setImmediate].
+
+[setImmediate]: https://github.com/YuzuJS/setImmediate
+
+Take care.
+ASAP can sustain infinite recursive calls without warning.
+It will not halt from a stack overflow, and it will not consume unbounded
+memory.
+This is behaviorally equivalent to an infinite loop.
+Just as with infinite loops, you can monitor a Node.js process for this behavior
+with a heart-beat signal.
+As with infinite loops, a very small amount of caution goes a long way to
+avoiding problems.
+
+```javascript
+function loop() {
+    asap(loop);
+}
+loop();
+```
+
+In browsers, if a task throws an exception, it will not interrupt the flushing
+of high-priority tasks.
+The exception will be postponed to a later, low-priority event to avoid
+slow-downs.
+In Node.js, if a task throws an exception, ASAP will resume flushing only if—and
+only after—the error is handled by `domain.on("error")` or
+`process.on("uncaughtException")`.
+
+## Raw ASAP
+
+Checking for exceptions comes at a cost.
+The package also provides an `asap/raw` module that exports the underlying
+implementation which is faster but stalls if a task throws an exception.
+This internal version of the ASAP function does not check for errors.
+If a task does throw an error, it will stall the event queue unless you manually
+call `rawAsap.requestFlush()` before throwing the error, or any time after.
+
+In Node.js, `asap/raw` also runs all tasks outside any domain.
+If you need a task to be bound to your domain, you will have to do it manually.
+
+```js
+if (process.domain) {
+    task = process.domain.bind(task);
+}
+rawAsap(task);
+```
+
+## Tasks
+
+A task may be any object that implements `call()`.
+A function will suffice, but closures tend not to be reusable and can cause
+garbage collector churn.
+Both `asap` and `rawAsap` accept task objects to give you the option of
+recycling task objects or using higher callable object abstractions.
+See the `asap` source for an illustration.
+
+
+## Compatibility
+
+ASAP is tested on Node.js v0.10 and in a broad spectrum of web browsers.
+The following charts capture the browser test results for the most recent
+release.
+The first chart shows test results for ASAP running in the main window context.
+The second chart shows test results for ASAP running in a web worker context.
+Test results are inconclusive (grey) on browsers that do not support web
+workers.
+These data are captured automatically by [Continuous
+Integration][].
+
+[Continuous Integration]: https://github.com/kriskowal/asap/blob/master/CONTRIBUTING.md
+
+![Browser Compatibility](http://kriskowal-asap.s3-website-us-west-2.amazonaws.com/train/integration-2/saucelabs-results-matrix.svg)
+
+![Compatibility in Web Workers](http://kriskowal-asap.s3-website-us-west-2.amazonaws.com/train/integration-2/saucelabs-worker-results-matrix.svg)
+
+## Caveats
+
+When a task is added to an empty event queue, it is not always possible to
+guarantee that the task queue will begin flushing immediately after the current
+event.
+However, once the task queue begins flushing, it will not yield until the queue
+is empty, even if the queue grows while executing tasks.
+
+The following browsers allow the use of [DOM mutation observers][] to access
+the HTML [microtask queue][], and thus begin flushing ASAP's task queue
+immediately at the end of the current event loop turn, before any rendering or
+IO:
+
+[microtask queue]: http://www.whatwg.org/specs/web-apps/current-work/multipage/webappapis.html#microtask-queue
+[DOM mutation observers]: http://dom.spec.whatwg.org/#mutation-observers
+
+- Android 4–4.3
+- Chrome 26–34
+- Firefox 14–29
+- Internet Explorer 11
+- iPad Safari 6–7.1
+- iPhone Safari 7–7.1
+- Safari 6–7
+
+In the absense of mutation observers, there are a few browsers, and situations
+like web workers in some of the above browsers,  where [message channels][]
+would be a useful way to avoid falling back to timers.
+Message channels give direct access to the HTML [task queue][], so the ASAP
+task queue would flush after any already queued rendering and IO tasks, but
+without having the minimum delay imposed by timers.
+However, among these browsers, Internet Explorer 10 and Safari do not reliably
+dispatch messages, so they are not worth the trouble to implement.
+
+[message channels]: http://www.whatwg.org/specs/web-apps/current-work/multipage/web-messaging.html#message-channels
+[task queue]: http://www.whatwg.org/specs/web-apps/current-work/multipage/webappapis.html#concept-task
+
+- Internet Explorer 10
+- Safair 5.0-1
+- Opera 11-12
+
+In the absense of mutation observers, these browsers and the following browsers
+all fall back to using `setTimeout` and `setInterval` to ensure that a `flush`
+occurs.
+The implementation uses both and cancels whatever handler loses the race, since
+`setTimeout` tends to occasionally skip tasks in unisolated circumstances.
+Timers generally delay the flushing of ASAP's task queue for four milliseconds.
+
+- Firefox 3–13
+- Internet Explorer 6–10
+- iPad Safari 4.3
+- Lynx 2.8.7
+
+
+## Heritage
+
+ASAP has been factored out of the [Q][] asynchronous promise library.
+It originally had a naïve implementation in terms of `setTimeout`, but
+[Malte Ubl][NonBlocking] provided an insight that `postMessage` might be
+useful for creating a high-priority, no-delay event dispatch hack.
+Since then, Internet Explorer proposed and implemented `setImmediate`.
+Robert Katić began contributing to Q by measuring the performance of
+the internal implementation of `asap`, paying particular attention to
+error recovery.
+Domenic, Robert, and Kris Kowal collectively settled on the current strategy of
+unrolling the high-priority event queue internally regardless of what strategy
+we used to dispatch the potentially lower-priority flush event.
+Domenic went on to make ASAP cooperate with Node.js domains.
+
+[Q]: https://github.com/kriskowal/q
+[NonBlocking]: http://www.nonblocking.io/2011/06/windownexttick.html
+
+For further reading, Nicholas Zakas provided a thorough article on [The
+Case for setImmediate][NCZ].
+
+[NCZ]: http://www.nczonline.net/blog/2013/07/09/the-case-for-setimmediate/
+
+Ember’s RSVP promise implementation later [adopted][RSVP ASAP] the name ASAP but
+further developed the implentation.
+Particularly, The `MessagePort` implementation was abandoned due to interaction
+[problems with Mobile Internet Explorer][IE Problems] in favor of an
+implementation backed on the newer and more reliable DOM `MutationObserver`
+interface.
+These changes were back-ported into this library.
+
+[IE Problems]: https://github.com/cujojs/when/issues/197
+[RSVP ASAP]: https://github.com/tildeio/rsvp.js/blob/cddf7232546a9cf858524b75cde6f9edf72620a7/lib/rsvp/asap.js
+
+In addition, ASAP factored into `asap` and `asap/raw`, such that `asap` remained
+exception-safe, but `asap/raw` provided a tight kernel that could be used for
+tasks that guaranteed that they would not throw exceptions.
+This core is useful for promise implementations that capture thrown errors in
+rejected promises and do not need a second safety net.
+At the same time, the exception handling in `asap` was factored into separate
+implementations for Node.js and browsers, using the the [Browserify][Browser
+Config] `browser` property in `package.json` to instruct browser module loaders
+and bundlers, including [Browserify][], [Mr][], and [Mop][],  to use the
+browser-only implementation.
+
+[Browser Config]: https://gist.github.com/defunctzombie/4339901
+[Browserify]: https://github.com/substack/node-browserify
+[Mr]: https://github.com/montagejs/mr
+[Mop]: https://github.com/montagejs/mop
+
+## License
+
+Copyright 2009-2014 by Contributors
+MIT License (enclosed)
+
diff --git a/node_modules/q/node_modules/asap/asap.js b/node_modules/q/node_modules/asap/asap.js
new file mode 100644
index 0000000..f04fcd5
--- /dev/null
+++ b/node_modules/q/node_modules/asap/asap.js
@@ -0,0 +1,65 @@
+"use strict";
+
+var rawAsap = require("./raw");
+var freeTasks = [];
+
+/**
+ * Calls a task as soon as possible after returning, in its own event, with
+ * priority over IO events. An exception thrown in a task can be handled by
+ * `process.on("uncaughtException") or `domain.on("error")`, but will otherwise
+ * crash the process. If the error is handled, all subsequent tasks will
+ * resume.
+ *
+ * @param {{call}} task A callable object, typically a function that takes no
+ * arguments.
+ */
+module.exports = asap;
+function asap(task) {
+    var rawTask;
+    if (freeTasks.length) {
+        rawTask = freeTasks.pop();
+    } else {
+        rawTask = new RawTask();
+    }
+    rawTask.task = task;
+    rawTask.domain = process.domain;
+    rawAsap(rawTask);
+}
+
+function RawTask() {
+    this.task = null;
+    this.domain = null;
+}
+
+RawTask.prototype.call = function () {
+    if (this.domain) {
+        this.domain.enter();
+    }
+    var threw = true;
+    try {
+        this.task.call();
+        threw = false;
+        // If the task throws an exception (presumably) Node.js restores the
+        // domain stack for the next event.
+        if (this.domain) {
+            this.domain.exit();
+        }
+    } finally {
+        // We use try/finally and a threw flag to avoid messing up stack traces
+        // when we catch and release errors.
+        if (threw) {
+            // In Node.js, uncaught exceptions are considered fatal errors.
+            // Re-throw them to interrupt flushing!
+            // Ensure that flushing continues if an uncaught exception is
+            // suppressed listening process.on("uncaughtException") or
+            // domain.on("error").
+            rawAsap.requestFlush();
+        }
+        // If the task threw an error, we do not want to exit the domain here.
+        // Exiting the domain would prevent the domain from catching the error.
+        this.task = null;
+        this.domain = null;
+        freeTasks.push(this);
+    }
+};
+
diff --git a/node_modules/q/node_modules/asap/browser-asap.js b/node_modules/q/node_modules/asap/browser-asap.js
new file mode 100644
index 0000000..805c982
--- /dev/null
+++ b/node_modules/q/node_modules/asap/browser-asap.js
@@ -0,0 +1,66 @@
+"use strict";
+
+// rawAsap provides everything we need except exception management.
+var rawAsap = require("./raw");
+// RawTasks are recycled to reduce GC churn.
+var freeTasks = [];
+// We queue errors to ensure they are thrown in right order (FIFO).
+// Array-as-queue is good enough here, since we are just dealing with exceptions.
+var pendingErrors = [];
+var requestErrorThrow = rawAsap.makeRequestCallFromTimer(throwFirstError);
+
+function throwFirstError() {
+    if (pendingErrors.length) {
+        throw pendingErrors.shift();
+    }
+}
+
+/**
+ * Calls a task as soon as possible after returning, in its own event, with priority
+ * over other events like animation, reflow, and repaint. An error thrown from an
+ * event will not interrupt, nor even substantially slow down the processing of
+ * other events, but will be rather postponed to a lower priority event.
+ * @param {{call}} task A callable object, typically a function that takes no
+ * arguments.
+ */
+module.exports = asap;
+function asap(task) {
+    var rawTask;
+    if (freeTasks.length) {
+        rawTask = freeTasks.pop();
+    } else {
+        rawTask = new RawTask();
+    }
+    rawTask.task = task;
+    rawAsap(rawTask);
+}
+
+// We wrap tasks with recyclable task objects.  A task object implements
+// `call`, just like a function.
+function RawTask() {
+    this.task = null;
+}
+
+// The sole purpose of wrapping the task is to catch the exception and recycle
+// the task object after its single use.
+RawTask.prototype.call = function () {
+    try {
+        this.task.call();
+    } catch (error) {
+        if (asap.onerror) {
+            // This hook exists purely for testing purposes.
+            // Its name will be periodically randomized to break any code that
+            // depends on its existence.
+            asap.onerror(error);
+        } else {
+            // In a web browser, exceptions are not fatal. However, to avoid
+            // slowing down the queue of pending tasks, we rethrow the error in a
+            // lower priority turn.
+            pendingErrors.push(error);
+            requestErrorThrow();
+        }
+    } finally {
+        this.task = null;
+        freeTasks[freeTasks.length] = this;
+    }
+};
diff --git a/node_modules/q/node_modules/asap/browser-raw.js b/node_modules/q/node_modules/asap/browser-raw.js
new file mode 100644
index 0000000..1cfd772
--- /dev/null
+++ b/node_modules/q/node_modules/asap/browser-raw.js
@@ -0,0 +1,220 @@
+"use strict";
+
+// Use the fastest means possible to execute a task in its own turn, with
+// priority over other events including IO, animation, reflow, and redraw
+// events in browsers.
+//
+// An exception thrown by a task will permanently interrupt the processing of
+// subsequent tasks. The higher level `asap` function ensures that if an
+// exception is thrown by a task, that the task queue will continue flushing as
+// soon as possible, but if you use `rawAsap` directly, you are responsible to
+// either ensure that no exceptions are thrown from your task, or to manually
+// call `rawAsap.requestFlush` if an exception is thrown.
+module.exports = rawAsap;
+function rawAsap(task) {
+    if (!queue.length) {
+        requestFlush();
+        flushing = true;
+    }
+    // Equivalent to push, but avoids a function call.
+    queue[queue.length] = task;
+}
+
+var queue = [];
+// Once a flush has been requested, no further calls to `requestFlush` are
+// necessary until the next `flush` completes.
+var flushing = false;
+// `requestFlush` is an implementation-specific method that attempts to kick
+// off a `flush` event as quickly as possible. `flush` will attempt to exhaust
+// the event queue before yielding to the browser's own event loop.
+var requestFlush;
+// The position of the next task to execute in the task queue. This is
+// preserved between calls to `flush` so that it can be resumed if
+// a task throws an exception.
+var index = 0;
+// If a task schedules additional tasks recursively, the task queue can grow
+// unbounded. To prevent memory exhaustion, the task queue will periodically
+// truncate already-completed tasks.
+var capacity = 1024;
+
+// The flush function processes all tasks that have been scheduled with
+// `rawAsap` unless and until one of those tasks throws an exception.
+// If a task throws an exception, `flush` ensures that its state will remain
+// consistent and will resume where it left off when called again.
+// However, `flush` does not make any arrangements to be called again if an
+// exception is thrown.
+function flush() {
+    while (index < queue.length) {
+        var currentIndex = index;
+        // Advance the index before calling the task. This ensures that we will
+        // begin flushing on the next task the task throws an error.
+        index = index + 1;
+        queue[currentIndex].call();
+        // Prevent leaking memory for long chains of recursive calls to `asap`.
+        // If we call `asap` within tasks scheduled by `asap`, the queue will
+        // grow, but to avoid an O(n) walk for every task we execute, we don't
+        // shift tasks off the queue after they have been executed.
+        // Instead, we periodically shift 1024 tasks off the queue.
+        if (index > capacity) {
+            // Manually shift all values starting at the index back to the
+            // beginning of the queue.
+            for (var scan = 0, newLength = queue.length - index; scan < newLength; scan++) {
+                queue[scan] = queue[scan + index];
+            }
+            queue.length -= index;
+            index = 0;
+        }
+    }
+    queue.length = 0;
+    index = 0;
+    flushing = false;
+}
+
+// `requestFlush` is implemented using a strategy based on data collected from
+// every available SauceLabs Selenium web driver worker at time of writing.
+// https://docs.google.com/spreadsheets/d/1mG-5UYGup5qxGdEMWkhP6BWCz053NUb2E1QoUTU16uA/edit#gid=783724593
+
+// Safari 6 and 6.1 for desktop, iPad, and iPhone are the only browsers that
+// have WebKitMutationObserver but not un-prefixed MutationObserver.
+// Must use `global` instead of `window` to work in both frames and web
+// workers. `global` is a provision of Browserify, Mr, Mrs, or Mop.
+var BrowserMutationObserver = global.MutationObserver || global.WebKitMutationObserver;
+
+// MutationObservers are desirable because they have high priority and work
+// reliably everywhere they are implemented.
+// They are implemented in all modern browsers.
+//
+// - Android 4-4.3
+// - Chrome 26-34
+// - Firefox 14-29
+// - Internet Explorer 11
+// - iPad Safari 6-7.1
+// - iPhone Safari 7-7.1
+// - Safari 6-7
+if (typeof BrowserMutationObserver === "function") {
+    requestFlush = makeRequestCallFromMutationObserver(flush);
+
+// MessageChannels are desirable because they give direct access to the HTML
+// task queue, are implemented in Internet Explorer 10, Safari 5.0-1, and Opera
+// 11-12, and in web workers in many engines.
+// Although message channels yield to any queued rendering and IO tasks, they
+// would be better than imposing the 4ms delay of timers.
+// However, they do not work reliably in Internet Explorer or Safari.
+
+// Internet Explorer 10 is the only browser that has setImmediate but does
+// not have MutationObservers.
+// Although setImmediate yields to the browser's renderer, it would be
+// preferrable to falling back to setTimeout since it does not have
+// the minimum 4ms penalty.
+// Unfortunately there appears to be a bug in Internet Explorer 10 Mobile (and
+// Desktop to a lesser extent) that renders both setImmediate and
+// MessageChannel useless for the purposes of ASAP.
+// https://github.com/kriskowal/q/issues/396
+
+// Timers are implemented universally.
+// We fall back to timers in workers in most engines, and in foreground
+// contexts in the following browsers.
+// However, note that even this simple case requires nuances to operate in a
+// broad spectrum of browsers.
+//
+// - Firefox 3-13
+// - Internet Explorer 6-9
+// - iPad Safari 4.3
+// - Lynx 2.8.7
+} else {
+    requestFlush = makeRequestCallFromTimer(flush);
+}
+
+// `requestFlush` requests that the high priority event queue be flushed as
+// soon as possible.
+// This is useful to prevent an error thrown in a task from stalling the event
+// queue if the exception handled by Node.js’s
+// `process.on("uncaughtException")` or by a domain.
+rawAsap.requestFlush = requestFlush;
+
+// To request a high priority event, we induce a mutation observer by toggling
+// the text of a text node between "1" and "-1".
+function makeRequestCallFromMutationObserver(callback) {
+    var toggle = 1;
+    var observer = new BrowserMutationObserver(callback);
+    var node = document.createTextNode("");
+    observer.observe(node, {characterData: true});
+    return function requestCall() {
+        toggle = -toggle;
+        node.data = toggle;
+    };
+}
+
+// The message channel technique was discovered by Malte Ubl and was the
+// original foundation for this library.
+// http://www.nonblocking.io/2011/06/windownexttick.html
+
+// Safari 6.0.5 (at least) intermittently fails to create message ports on a
+// page's first load. Thankfully, this version of Safari supports
+// MutationObservers, so we don't need to fall back in that case.
+
+// function makeRequestCallFromMessageChannel(callback) {
+//     var channel = new MessageChannel();
+//     channel.port1.onmessage = callback;
+//     return function requestCall() {
+//         channel.port2.postMessage(0);
+//     };
+// }
+
+// For reasons explained above, we are also unable to use `setImmediate`
+// under any circumstances.
+// Even if we were, there is another bug in Internet Explorer 10.
+// It is not sufficient to assign `setImmediate` to `requestFlush` because
+// `setImmediate` must be called *by name* and therefore must be wrapped in a
+// closure.
+// Never forget.
+
+// function makeRequestCallFromSetImmediate(callback) {
+//     return function requestCall() {
+//         setImmediate(callback);
+//     };
+// }
+
+// Safari 6.0 has a problem where timers will get lost while the user is
+// scrolling. This problem does not impact ASAP because Safari 6.0 supports
+// mutation observers, so that implementation is used instead.
+// However, if we ever elect to use timers in Safari, the prevalent work-around
+// is to add a scroll event listener that calls for a flush.
+
+// `setTimeout` does not call the passed callback if the delay is less than
+// approximately 7 in web workers in Firefox 8 through 18, and sometimes not
+// even then.
+
+function makeRequestCallFromTimer(callback) {
+    return function requestCall() {
+        // We dispatch a timeout with a specified delay of 0 for engines that
+        // can reliably accommodate that request. This will usually be snapped
+        // to a 4 milisecond delay, but once we're flushing, there's no delay
+        // between events.
+        var timeoutHandle = setTimeout(handleTimer, 0);
+        // However, since this timer gets frequently dropped in Firefox
+        // workers, we enlist an interval handle that will try to fire
+        // an event 20 times per second until it succeeds.
+        var intervalHandle = setInterval(handleTimer, 50);
+
+        function handleTimer() {
+            // Whichever timer succeeds will cancel both timers and
+            // execute the callback.
+            clearTimeout(timeoutHandle);
+            clearInterval(intervalHandle);
+            callback();
+        }
+    };
+}
+
+// This is for `asap.js` only.
+// Its name will be periodically randomized to break any code that depends on
+// its existence.
+rawAsap.makeRequestCallFromTimer = makeRequestCallFromTimer;
+
+// ASAP was originally a nextTick shim included in Q. This was factored out
+// into this ASAP package. It was later adapted to RSVP which made further
+// amendments. These decisions, particularly to marginalize MessageChannel and
+// to capture the MutationObserver implementation in a closure, were integrated
+// back into ASAP proper.
+// https://github.com/tildeio/rsvp.js/blob/cddf7232546a9cf858524b75cde6f9edf72620a7/lib/rsvp/asap.js
diff --git a/node_modules/q/node_modules/asap/package.json b/node_modules/q/node_modules/asap/package.json
new file mode 100644
index 0000000..e01b3f0
--- /dev/null
+++ b/node_modules/q/node_modules/asap/package.json
@@ -0,0 +1,85 @@
+{
+  "name": "asap",
+  "version": "2.0.3",
+  "description": "High-priority task queue for Node.js and browsers",
+  "keywords": [
+    "event",
+    "task",
+    "queue"
+  ],
+  "license": {
+    "type": "MIT",
+    "url": "https://github.com/kriskowal/asap/raw/master/LICENSE.md"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/kriskowal/asap.git"
+  },
+  "main": "./asap.js",
+  "browser": {
+    "./asap.js": "./browser-asap.js",
+    "./raw.js": "./browser-raw.js",
+    "./test/domain.js": "./test/browser-domain.js"
+  },
+  "files": [
+    "raw.js",
+    "asap.js",
+    "browser-raw.js",
+    "browser-asap.js"
+  ],
+  "scripts": {
+    "test": "npm run lint && npm run test-node",
+    "test-travis": "npm run lint && npm run test-node && npm run test-saucelabs && npm run test-saucelabs-worker",
+    "test-node": "node test/asap-test.js",
+    "test-publish": "node scripts/publish-bundle.js test/asap-test.js | pbcopy",
+    "test-browser": "node scripts/publish-bundle.js test/asap-test.js | xargs opener",
+    "test-saucelabs": "node scripts/saucelabs.js test/asap-test.js scripts/saucelabs-spot-configurations.json",
+    "test-saucelabs-all": "node scripts/saucelabs.js test/asap-test.js scripts/saucelabs-all-configurations.json",
+    "test-saucelabs-worker": "node scripts/saucelabs-worker-test.js scripts/saucelabs-spot-configurations.json",
+    "test-saucelabs-worker-all": "node scripts/saucelabs-worker-test.js scripts/saucelabs-all-configurations.json",
+    "lint": "jshint raw.js asap.js browser-raw.js browser-asap.js $(find scripts -name '*.js' | grep -v gauntlet)"
+  },
+  "devDependencies": {
+    "events": "^1.0.1",
+    "jshint": "^2.5.1",
+    "knox": "^0.8.10",
+    "mr": "^2.0.5",
+    "opener": "^1.3.0",
+    "q": "^2.0.3",
+    "q-io": "^2.0.3",
+    "saucelabs": "^0.1.1",
+    "wd": "^0.2.21",
+    "weak-map": "^1.0.5"
+  },
+  "gitHead": "ccbf94d4e4a0c3afc2df13331044020a46a74ab6",
+  "bugs": {
+    "url": "https://github.com/kriskowal/asap/issues"
+  },
+  "homepage": "https://github.com/kriskowal/asap#readme",
+  "_id": "asap@2.0.3",
+  "_shasum": "1fc1d1564ee11620dfca6d67029850913f9f4679",
+  "_from": "asap@>=2.0.0 <3.0.0",
+  "_npmVersion": "2.8.3",
+  "_nodeVersion": "1.8.1",
+  "_npmUser": {
+    "name": "kriskowal",
+    "email": "kris.kowal@cixar.com"
+  },
+  "maintainers": [
+    {
+      "name": "kriskowal",
+      "email": "kris.kowal@cixar.com"
+    },
+    {
+      "name": "forbeslindesay",
+      "email": "forbes@lindesay.co.uk"
+    }
+  ],
+  "dist": {
+    "shasum": "1fc1d1564ee11620dfca6d67029850913f9f4679",
+    "tarball": "http://registry.npmjs.org/asap/-/asap-2.0.3.tgz"
+  },
+  "directories": {},
+  "_resolved": "https://registry.npmjs.org/asap/-/asap-2.0.3.tgz",
+  "readme": "ERROR: No README data found!"
+}
diff --git a/node_modules/q/node_modules/asap/raw.js b/node_modules/q/node_modules/asap/raw.js
new file mode 100644
index 0000000..ae3b892
--- /dev/null
+++ b/node_modules/q/node_modules/asap/raw.js
@@ -0,0 +1,101 @@
+"use strict";
+
+var domain; // The domain module is executed on demand
+var hasSetImmediate = typeof setImmediate === "function";
+
+// Use the fastest means possible to execute a task in its own turn, with
+// priority over other events including network IO events in Node.js.
+//
+// An exception thrown by a task will permanently interrupt the processing of
+// subsequent tasks. The higher level `asap` function ensures that if an
+// exception is thrown by a task, that the task queue will continue flushing as
+// soon as possible, but if you use `rawAsap` directly, you are responsible to
+// either ensure that no exceptions are thrown from your task, or to manually
+// call `rawAsap.requestFlush` if an exception is thrown.
+module.exports = rawAsap;
+function rawAsap(task) {
+    if (!queue.length) {
+        requestFlush();
+        flushing = true;
+    }
+    // Avoids a function call
+    queue[queue.length] = task;
+}
+
+var queue = [];
+// Once a flush has been requested, no further calls to `requestFlush` are
+// necessary until the next `flush` completes.
+var flushing = false;
+// The position of the next task to execute in the task queue. This is
+// preserved between calls to `flush` so that it can be resumed if
+// a task throws an exception.
+var index = 0;
+// If a task schedules additional tasks recursively, the task queue can grow
+// unbounded. To prevent memory excaustion, the task queue will periodically
+// truncate already-completed tasks.
+var capacity = 1024;
+
+// The flush function processes all tasks that have been scheduled with
+// `rawAsap` unless and until one of those tasks throws an exception.
+// If a task throws an exception, `flush` ensures that its state will remain
+// consistent and will resume where it left off when called again.
+// However, `flush` does not make any arrangements to be called again if an
+// exception is thrown.
+function flush() {
+    while (index < queue.length) {
+        var currentIndex = index;
+        // Advance the index before calling the task. This ensures that we will
+        // begin flushing on the next task the task throws an error.
+        index = index + 1;
+        queue[currentIndex].call();
+        // Prevent leaking memory for long chains of recursive calls to `asap`.
+        // If we call `asap` within tasks scheduled by `asap`, the queue will
+        // grow, but to avoid an O(n) walk for every task we execute, we don't
+        // shift tasks off the queue after they have been executed.
+        // Instead, we periodically shift 1024 tasks off the queue.
+        if (index > capacity) {
+            // Manually shift all values starting at the index back to the
+            // beginning of the queue.
+            for (var scan = 0, newLength = queue.length - index; scan < newLength; scan++) {
+                queue[scan] = queue[scan + index];
+            }
+            queue.length -= index;
+            index = 0;
+        }
+    }
+    queue.length = 0;
+    index = 0;
+    flushing = false;
+}
+
+rawAsap.requestFlush = requestFlush;
+function requestFlush() {
+    // Ensure flushing is not bound to any domain.
+    // It is not sufficient to exit the domain, because domains exist on a stack.
+    // To execute code outside of any domain, the following dance is necessary.
+    var parentDomain = process.domain;
+    if (parentDomain) {
+        if (!domain) {
+            // Lazy execute the domain module.
+            // Only employed if the user elects to use domains.
+            domain = require("domain");
+        }
+        domain.active = process.domain = null;
+    }
+
+    // `setImmediate` is slower that `process.nextTick`, but `process.nextTick`
+    // cannot handle recursion.
+    // `requestFlush` will only be called recursively from `asap.js`, to resume
+    // flushing after an error is thrown into a domain.
+    // Conveniently, `setImmediate` was introduced in the same version
+    // `process.nextTick` started throwing recursion errors.
+    if (flushing && hasSetImmediate) {
+        setImmediate(flush);
+    } else {
+        process.nextTick(flush);
+    }
+
+    if (parentDomain) {
+        domain.active = process.domain = parentDomain;
+    }
+}
diff --git a/node_modules/q/node_modules/pop-iterate/.npmignore b/node_modules/q/node_modules/pop-iterate/.npmignore
new file mode 100644
index 0000000..07e6e47
--- /dev/null
+++ b/node_modules/q/node_modules/pop-iterate/.npmignore
@@ -0,0 +1 @@
+/node_modules
diff --git a/node_modules/q/node_modules/pop-iterate/README.md b/node_modules/q/node_modules/pop-iterate/README.md
new file mode 100644
index 0000000..a897f81
--- /dev/null
+++ b/node_modules/q/node_modules/pop-iterate/README.md
@@ -0,0 +1,82 @@
+
+# Iterate
+
+This JavaScript package exports an iterator operator that accepts arrays and any
+object that implements iterate.
+
+```
+$ npm install --save pop-iterate
+```
+
+The iterate operator accepts an array, or object that implements iterate, and
+returns an iterator, as described by the [iterator protocol][Iterator], with
+some extensions.
+The iterations have an index property with the index corresponding to the value.
+
+[Iterator]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/The_Iterator_protocol
+
+```js
+var iterator = iterate([1, 2, 3]);
+expect(iterator.next()).toEqual({value: 1, done: false, index: 0});
+expect(iterator.next()).toEqual({value: 2, done: false, index: 1});
+expect(iterator.next()).toEqual({value: 3, done: false, index: 2});
+expect(iterator.next()).toEqual({done: true});
+```
+
+Iterating on an array, the iterate method accepts optional start, stop, and step
+arguments.
+
+```js
+var array = [1, 2, 3, 4, 5, 6, 7, 8];
+var iterator = iterate(array, 1, 6, 2);
+expect(iterator.next()).toEqual({value: 2, done: false, index: 1});
+expect(iterator.next()).toEqual({value: 4, done: false, index: 3});
+expect(iterator.next()).toEqual({value: 6, done: false, index: 5});
+expect(iterator.next()).toEqual({done: true});
+```
+
+The iterate operator also iterates the owned properties of an object.
+
+```js
+var object = {a: 10, b: 20, c: 30};
+var iterator = iterate(object);
+expect(iterator.next()).toEqual({value: 10, done: false, index: "a"});
+expect(iterator.next()).toEqual({value: 20, done: false, index: "b"});
+expect(iterator.next()).toEqual({value: 30, done: false, index: "c"});
+expect(iterator.next()).toEqual({done: true});
+```
+
+## Polymorphic operator
+
+A well-planned system of objects is beautiful: a system where every meaningful
+method for an object has been anticipated in the design.
+Inevitably, another layer of architecture introduces a new concept and with it
+the temptation to monkey-patch, dunk-punch, or otherwise cover-up the omission.
+But reaching backward in time, up through the layers of architecture doesn't
+always compose well, when different levels introduce concepts of the same name
+but distinct behavior.
+
+A polymorphic operator is a function that accepts as its first argument an
+object and varies its behavior depending on its type.
+Such an operator has the benefit of covering for the types from higher layers of
+architecture, but defers to the eponymous method name of types yet to be
+defined.
+
+The iterate operator works for arrays and objects.
+Any other object can be iterable by implementing the `iterate` method, and the
+iterate operator will defer to it.
+
+```js
+function Collection() {}
+Collection.prototype.iterate = function (start, stop, step) {
+};
+```
+
+This package also exports the individual parts form which it makes iterators.
+
+```js
+var Iteration = require("pop-iterate/iteration");
+var ArrayIterator = require("pop-iterate/array-iterator");
+var ObjectIterator = require("pop-iterate/object-iterator");
+```
+
diff --git a/node_modules/q/node_modules/pop-iterate/array-iterator.js b/node_modules/q/node_modules/pop-iterate/array-iterator.js
new file mode 100644
index 0000000..47e6d35
--- /dev/null
+++ b/node_modules/q/node_modules/pop-iterate/array-iterator.js
@@ -0,0 +1,23 @@
+"use strict";
+
+var Iteration = require("./iteration");
+
+module.exports = ArrayIterator;
+function ArrayIterator(iterable, start, stop, step) {
+    this.array = iterable;
+    this.start = start || 0;
+    this.stop = stop || Infinity;
+    this.step = step || 1;
+}
+
+ArrayIterator.prototype.next = function () {
+    var iteration;
+    if (this.start < Math.min(this.array.length, this.stop)) {
+        iteration = new Iteration(this.array[this.start], false, this.start);
+        this.start += this.step;
+    } else {
+        iteration =  new Iteration(undefined, true);
+    }
+    return iteration;
+};
+
diff --git a/node_modules/q/node_modules/pop-iterate/iteration.js b/node_modules/q/node_modules/pop-iterate/iteration.js
new file mode 100644
index 0000000..bed811c
--- /dev/null
+++ b/node_modules/q/node_modules/pop-iterate/iteration.js
@@ -0,0 +1,18 @@
+"use strict";
+
+module.exports = Iteration;
+function Iteration(value, done, index) {
+    this.value = value;
+    this.done = done;
+    this.index = index;
+}
+
+Iteration.prototype.equals = function (other) {
+    return (
+        typeof other == 'object' &&
+        other.value === this.value &&
+        other.done === this.done &&
+        other.index === this.index
+    );
+};
+
diff --git a/node_modules/q/node_modules/pop-iterate/object-iterator.js b/node_modules/q/node_modules/pop-iterate/object-iterator.js
new file mode 100644
index 0000000..2687680
--- /dev/null
+++ b/node_modules/q/node_modules/pop-iterate/object-iterator.js
@@ -0,0 +1,20 @@
+"use strict";
+
+var Iteration = require("./iteration");
+var ArrayIterator = require("./array-iterator");
+
+module.exports = ObjectIterator;
+function ObjectIterator(iterable, start, stop, step) {
+    this.object = iterable;
+    this.keysIterator = new ArrayIterator(Object.keys(iterable), start, stop, step);
+}
+
+ObjectIterator.prototype.next = function () {
+    var iteration = this.keysIterator.next();
+    if (iteration.done) {
+        return iteration;
+    }
+    var key = iteration.value;
+    return new Iteration(this.object[key], false, key);
+};
+
diff --git a/node_modules/q/node_modules/pop-iterate/package.json b/node_modules/q/node_modules/pop-iterate/package.json
new file mode 100644
index 0000000..521b16c
--- /dev/null
+++ b/node_modules/q/node_modules/pop-iterate/package.json
@@ -0,0 +1,55 @@
+{
+  "name": "pop-iterate",
+  "version": "1.0.1",
+  "description": "A polymorphic iterate operator for arrays and other iterables",
+  "main": "pop-iterate.js",
+  "directories": {
+    "test": "test"
+  },
+  "devDependencies": {
+    "jasminum": "^2.0.5"
+  },
+  "scripts": {
+    "test": "jasminum test"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/kriskowal/pop-iterate.git"
+  },
+  "keywords": [
+    "pop",
+    "polymorphic",
+    "operator",
+    "iterate"
+  ],
+  "author": {
+    "name": "Kris Kowal",
+    "email": "kris@cixar.com"
+  },
+  "license": "MIT",
+  "bugs": {
+    "url": "https://github.com/kriskowal/pop-iterate/issues"
+  },
+  "homepage": "https://github.com/kriskowal/pop-iterate",
+  "gitHead": "dc8f214537d6134d25a6da84ca78715bfbcd0001",
+  "_id": "pop-iterate@1.0.1",
+  "_shasum": "ceacfdab4abf353d7a0f2aaa2c1fc7b3f9413ba3",
+  "_from": "pop-iterate@>=1.0.1 <2.0.0",
+  "_npmVersion": "1.4.21",
+  "_npmUser": {
+    "name": "kriskowal",
+    "email": "kris.kowal@cixar.com"
+  },
+  "maintainers": [
+    {
+      "name": "kriskowal",
+      "email": "kris.kowal@cixar.com"
+    }
+  ],
+  "dist": {
+    "shasum": "ceacfdab4abf353d7a0f2aaa2c1fc7b3f9413ba3",
+    "tarball": "http://registry.npmjs.org/pop-iterate/-/pop-iterate-1.0.1.tgz"
+  },
+  "_resolved": "https://registry.npmjs.org/pop-iterate/-/pop-iterate-1.0.1.tgz",
+  "readme": "ERROR: No README data found!"
+}
diff --git a/node_modules/q/node_modules/pop-iterate/pop-iterate.js b/node_modules/q/node_modules/pop-iterate/pop-iterate.js
new file mode 100644
index 0000000..19f5b4d
--- /dev/null
+++ b/node_modules/q/node_modules/pop-iterate/pop-iterate.js
@@ -0,0 +1,22 @@
+"use strict";
+
+var ArrayIterator = require("./array-iterator");
+var ObjectIterator = require("./object-iterator");
+
+module.exports = iterate;
+function iterate(iterable, start, stop, step) {
+    if (!iterable) {
+        return empty;
+    } else if (Array.isArray(iterable)) {
+        return new ArrayIterator(iterable, start, stop, step);
+    } else if (typeof iterable.next === "function") {
+        return iterable;
+    } else if (typeof iterable.iterate === "function") {
+        return iterable.iterate(start, stop, step);
+    } else if (typeof iterable === "object") {
+        return new ObjectIterator(iterable);
+    } else {
+        throw new TypeError("Can't iterate " + iterable);
+    }
+}
+
diff --git a/node_modules/q/node_modules/pop-iterate/test/pop-iterate-test.js b/node_modules/q/node_modules/pop-iterate/test/pop-iterate-test.js
new file mode 100644
index 0000000..92a86e5
--- /dev/null
+++ b/node_modules/q/node_modules/pop-iterate/test/pop-iterate-test.js
@@ -0,0 +1,72 @@
+"use strict";
+
+var iterate = require("../pop-iterate");
+
+describe("array iterator", function () {
+
+    it("iterates an array", function () {
+        var iterator = iterate([1, 2, 3]);
+        expect(iterator.next()).toEqual({value: 1, done: false, index: 0});
+        expect(iterator.next()).toEqual({value: 2, done: false, index: 1});
+        expect(iterator.next()).toEqual({value: 3, done: false, index: 2});
+        expect(iterator.next()).toEqual({done: true});
+    });
+
+    it("handles stuttering", function () {
+        var iterator = iterate([]);
+        expect(iterator.next()).toEqual({done: true});
+        expect(iterator.next()).toEqual({done: true});
+        expect(iterator.next()).toEqual({done: true});
+    });
+
+    it("start, stop, and step", function () {
+        var iterator = iterate([1, 2, 3, 4, 5, 6, 7, 8], 1, 6, 2);
+        expect(iterator.next()).toEqual({value: 2, done: false, index: 1});
+        expect(iterator.next()).toEqual({value: 4, done: false, index: 3});
+        expect(iterator.next()).toEqual({value: 6, done: false, index: 5});
+        expect(iterator.next()).toEqual({done: true});
+    });
+
+});
+
+describe("iterate an object", function () {
+
+    it("returns entries", function () {
+        var object = {a: 10, b: 20, c: 30};
+        var iterator = iterate(object);
+        expect(iterator.next()).toEqual({value: 10, done: false, index: "a"});
+        expect(iterator.next()).toEqual({value: 20, done: false, index: "b"});
+        expect(iterator.next()).toEqual({value: 30, done: false, index: "c"});
+        expect(iterator.next()).toEqual({done: true});
+    });
+
+});
+
+describe("custom iterator", function () {
+
+    it("calls through to custom iterator", function () {
+        var iterator, prevValue, nextValue, start, stop, step;
+        iterator = iterate({
+            iterate: function (gotStart, gotStop, gotStep) {
+                start = gotStart;
+                stop = gotStop;
+                step = gotStep;
+                return {
+                    next: function (value) {
+                        prevValue = value;
+                        return nextValue;
+                    }
+                };
+            }
+        }, 1, 2, 3);
+
+        expect(start).toBe(1);
+        expect(stop).toBe(2);
+        expect(step).toBe(3);
+
+        nextValue = 10;
+        expect(iterator.next(20)).toBe(10);
+        expect(prevValue).toBe(20);
+    });
+
+});
diff --git a/node_modules/q/node_modules/weak-map/README.md b/node_modules/q/node_modules/weak-map/README.md
new file mode 100644
index 0000000..85c121f
--- /dev/null
+++ b/node_modules/q/node_modules/weak-map/README.md
@@ -0,0 +1,129 @@
+
+`WeakMap` is a collection slated to be introduced to JavaScript with
+EcmaScript 6.  It provides a mapping from objects to values, but allows
+any entry to be garbage collected if the key is provably lost.
+
+In order for it to be possible that a key is provably lost, weak maps do
+not provide a way to access the key list.
+
+This is a Node Packaged Module (NPM) that provides a shim and patcher
+for missing or broken WeakMap implementations suitable for use in
+Node.js and browsers that provide the EcmaScript 5 property description
+interfaces provided that it hosted by a CommonJS loader or bundler like
+[Browserify][], [Montage][], [Mr][], or [Mop][].
+
+[Browserify]: https://github.com/substack/node-browserify
+[Montage]: https://github.com/montagejs/mr
+[Mr]: https://github.com/montagejs/mr
+[Mop]: https://github.com/montagejs/mop
+
+```
+npm install weak-map --save
+```
+
+```javascript
+var WeakMap = require("weak-map");
+var map = new WeakMap();
+var key = {};
+map.set(key, "Hello, World!");
+map.get(key) === "Hello, World!";
+key = null;
+// "Hello, World!" may be collected
+```
+
+See [MDN][] for the API details.
+
+[MDN]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap
+
+At time of writing, prototype implementations of `WeakMap` exist in V8
+and Spidermonkey.  The prototype is available in Node.js v0.10 with the
+`--harmony_collections` V8 option.  In v0.8, it was available with
+`--harmony_weakmaps`.  The purpose of this package is to enable
+dependees to use weak maps regardless of whether they are implemented by
+the underlying engine, albeit in a way that leaks memory in some
+non-obvious cases.
+
+### Purpose and limitation
+
+This shim depends on and modifies ECMAScript 5 property descriptor related
+methods, `Object.defineProperty`, `Object.getOwnPropertyNames`,
+`Object.isExtensible`, `Object.freeze`, and `Object.seal`.
+
+In a nutshell, the WeakMap shim emulates a WeakMap by adding a hidden
+property to the key that associates the weak map with the retained
+object. The shim overrides the ECMAScript 5 methods to cover its tracks.
+
+Consider a scenario that only includes a weak map, a key, and a corresponding
+value through the weak map. With a proper `WeakMap`, built into the JavaScript
+engine privy to the internals of the garbage collector, the `value` would be
+retained either by the key or the weak map. If *either* the key or the weak map
+are elligible for garbage collection, the value is elligible.
+
+This is in contrast to to a plain `Map`. In a scenario with a map, a key, and a
+value corresponding to the key through the map, neither the key nor the value
+will be eligible for garbage collection until the map containing them is
+elligible. Thus, if a map is used to establish a relationship between ephemeral
+keys and values, it will accumulate garbage.
+
+This shim does its best to approximate a proper `WeakMap` without an intimate
+relationship with the garbage collector. In the same scenario, the value will
+become elligible for garbage collection if the key is elligible. Unlike a proper
+weak map, if the weak map shim becomes elligible for garbage collection but the
+key is retained by something else, the value will be retained. In this scenario,
+all operations of the weak map take constant time.
+
+However, if the key is *frozen*, the weak map retains both the key and the value
+and neither are elligible for collection until the weak map becomes elligible
+itself. This scenario is unfortunately identical to the behavior of a `Map`.
+Additionally, all operations of the weak map suffer linear time.
+
+As stated by Mark Miller in the code:
+
+> As with true WeakMaps, in this emulation, a key does not retain maps indexed by
+> that key and (crucially) a map does not retain the keys it indexes. A map by
+> itself also does not retain the values associated with that map.
+>
+> However, the values associated with a key in some map are retained so long as
+> that key is retained and those associations are not overridden. For example,
+> when used to support membranes, all values exported from a given membrane will
+> live for the lifetime they would have had in the absence of an interposed
+> membrane. Even when the membrane is revoked, all objects that would have been
+> reachable in the absence of revocation will still be reachable, as far as the
+> GC can tell, even though they will no longer be relevant to ongoing
+> computation.
+>
+> The API implemented here is approximately the API as implemented
+> in FF6.0a1 and agreed to by MarkM, Andreas Gal, and Dave Herman,
+> rather than the offially approved proposal page.
+>
+> The first difference between the emulation here and that in FF6.0a1 is the
+> presence of non enumerable `get___`, `has___`, `set___`, and `delete___`}
+> methods on WeakMap instances to represent what would be the hidden internal
+> properties of a primitive implementation. Whereas the FF6.0a1 WeakMap.prototype
+> methods require their `this` to be a genuine WeakMap instance (i.e., an object
+> of `[[Class]]` "WeakMap}), since there is nothing unforgeable about the
+> pseudo-internal method names used here, nothing prevents these emulated
+> prototype methods from being applied to non-WeakMaps with pseudo-internal
+> methods of the same names.
+>
+> Another difference is that our emulated `WeakMap.prototype` is not itself a
+> WeakMap. A problem with the current FF6.0a1 API is that WeakMap.prototype is
+> itself a WeakMap providing ambient mutability and an ambient communications
+> channel. Thus, if a WeakMap is already present and has this problem,
+> repairES5.js wraps it in a safe wrappper in order to prevent access to this
+> channel. (See PATCH_MUTABLE_FROZEN_WEAKMAP_PROTO in repairES5.js).
+
+This refers to `repairES5.js` as provided by Google Caja.
+
+### Origin and license
+
+The canonical implementation of `WeakMap` exists in the Google Caja
+Subversion repository at http://google-caja.googlecode.com/svn/trunk.
+It was written by Mark S. Miller.  It is released by Google with the
+Apache 2.0 license.  This package is maintained by Kris Kowal.
+
+This work began with [Mark Miller’s proposal][Proposal] for `WeakMap` to ECMA’s
+TC-39, where the JavaScript standard is developed.
+
+[Proposal]: http://wiki.ecmascript.org/doku.php?id=harmony:weak_maps
+
diff --git a/node_modules/q/node_modules/weak-map/package.json b/node_modules/q/node_modules/weak-map/package.json
new file mode 100644
index 0000000..a0c7a8e
--- /dev/null
+++ b/node_modules/q/node_modules/weak-map/package.json
@@ -0,0 +1,61 @@
+{
+  "name": "weak-map",
+  "version": "1.0.5",
+  "description": "A WeakMap shim for Node.js and browsers",
+  "main": "weak-map.js",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/drses/weak-map.git"
+  },
+  "keywords": [
+    "weakmap",
+    "weak-map",
+    "weak",
+    "map",
+    "collections",
+    "es6"
+  ],
+  "author": {
+    "name": "Mark Miller",
+    "email": "erights@gmail.com"
+  },
+  "maintainer": "Kris Kowal <kris@cixar.com>",
+  "license": "Apache 2.0",
+  "bugs": {
+    "url": "https://github.com/drses/weak-map/issues"
+  },
+  "files": [
+    "weak-map.js"
+  ],
+  "scripts": {
+    "test": "npm run test:native; npm run test:shim",
+    "test:phantom": "",
+    "test:shim": "node test/index.js",
+    "test:native": "node --harmony_collections test/index.js"
+  },
+  "devDependencies": {
+    "jasminum": "^2.0.1"
+  },
+  "homepage": "https://github.com/drses/weak-map",
+  "_id": "weak-map@1.0.5",
+  "dist": {
+    "shasum": "79691584d98607f5070bd3b70a40e6bb22e401eb",
+    "tarball": "http://registry.npmjs.org/weak-map/-/weak-map-1.0.5.tgz"
+  },
+  "_from": "weak-map@>=1.0.5 <2.0.0",
+  "_npmVersion": "1.4.3",
+  "_npmUser": {
+    "name": "kriskowal",
+    "email": "kris.kowal@cixar.com"
+  },
+  "maintainers": [
+    {
+      "name": "kriskowal",
+      "email": "kris.kowal@cixar.com"
+    }
+  ],
+  "directories": {},
+  "_shasum": "79691584d98607f5070bd3b70a40e6bb22e401eb",
+  "_resolved": "https://registry.npmjs.org/weak-map/-/weak-map-1.0.5.tgz",
+  "readme": "ERROR: No README data found!"
+}
diff --git a/node_modules/q/node_modules/weak-map/weak-map.js b/node_modules/q/node_modules/weak-map/weak-map.js
new file mode 100644
index 0000000..142e0a8
--- /dev/null
+++ b/node_modules/q/node_modules/weak-map/weak-map.js
@@ -0,0 +1,685 @@
+// Copyright (C) 2011 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Install a leaky WeakMap emulation on platforms that
+ * don't provide a built-in one.
+ *
+ * <p>Assumes that an ES5 platform where, if {@code WeakMap} is
+ * already present, then it conforms to the anticipated ES6
+ * specification. To run this file on an ES5 or almost ES5
+ * implementation where the {@code WeakMap} specification does not
+ * quite conform, run <code>repairES5.js</code> first.
+ *
+ * <p>Even though WeakMapModule is not global, the linter thinks it
+ * is, which is why it is in the overrides list below.
+ *
+ * <p>NOTE: Before using this WeakMap emulation in a non-SES
+ * environment, see the note below about hiddenRecord.
+ *
+ * @author Mark S. Miller
+ * @requires crypto, ArrayBuffer, Uint8Array, navigator, console
+ * @overrides WeakMap, ses, Proxy
+ * @overrides WeakMapModule
+ */
+
+/**
+ * This {@code WeakMap} emulation is observably equivalent to the
+ * ES-Harmony WeakMap, but with leakier garbage collection properties.
+ *
+ * <p>As with true WeakMaps, in this emulation, a key does not
+ * retain maps indexed by that key and (crucially) a map does not
+ * retain the keys it indexes. A map by itself also does not retain
+ * the values associated with that map.
+ *
+ * <p>However, the values associated with a key in some map are
+ * retained so long as that key is retained and those associations are
+ * not overridden. For example, when used to support membranes, all
+ * values exported from a given membrane will live for the lifetime
+ * they would have had in the absence of an interposed membrane. Even
+ * when the membrane is revoked, all objects that would have been
+ * reachable in the absence of revocation will still be reachable, as
+ * far as the GC can tell, even though they will no longer be relevant
+ * to ongoing computation.
+ *
+ * <p>The API implemented here is approximately the API as implemented
+ * in FF6.0a1 and agreed to by MarkM, Andreas Gal, and Dave Herman,
+ * rather than the offially approved proposal page. TODO(erights):
+ * upgrade the ecmascript WeakMap proposal page to explain this API
+ * change and present to EcmaScript committee for their approval.
+ *
+ * <p>The first difference between the emulation here and that in
+ * FF6.0a1 is the presence of non enumerable {@code get___, has___,
+ * set___, and delete___} methods on WeakMap instances to represent
+ * what would be the hidden internal properties of a primitive
+ * implementation. Whereas the FF6.0a1 WeakMap.prototype methods
+ * require their {@code this} to be a genuine WeakMap instance (i.e.,
+ * an object of {@code [[Class]]} "WeakMap}), since there is nothing
+ * unforgeable about the pseudo-internal method names used here,
+ * nothing prevents these emulated prototype methods from being
+ * applied to non-WeakMaps with pseudo-internal methods of the same
+ * names.
+ *
+ * <p>Another difference is that our emulated {@code
+ * WeakMap.prototype} is not itself a WeakMap. A problem with the
+ * current FF6.0a1 API is that WeakMap.prototype is itself a WeakMap
+ * providing ambient mutability and an ambient communications
+ * channel. Thus, if a WeakMap is already present and has this
+ * problem, repairES5.js wraps it in a safe wrappper in order to
+ * prevent access to this channel. (See
+ * PATCH_MUTABLE_FROZEN_WEAKMAP_PROTO in repairES5.js).
+ */
+
+/**
+ * If this is a full <a href=
+ * "http://code.google.com/p/es-lab/wiki/SecureableES5"
+ * >secureable ES5</a> platform and the ES-Harmony {@code WeakMap} is
+ * absent, install an approximate emulation.
+ *
+ * <p>If WeakMap is present but cannot store some objects, use our approximate
+ * emulation as a wrapper.
+ *
+ * <p>If this is almost a secureable ES5 platform, then WeakMap.js
+ * should be run after repairES5.js.
+ *
+ * <p>See {@code WeakMap} for documentation of the garbage collection
+ * properties of this WeakMap emulation.
+ */
+(function WeakMapModule() {
+  "use strict";
+
+  if (typeof ses !== 'undefined' && ses.ok && !ses.ok()) {
+    // already too broken, so give up
+    return;
+  }
+
+  /**
+   * In some cases (current Firefox), we must make a choice betweeen a
+   * WeakMap which is capable of using all varieties of host objects as
+   * keys and one which is capable of safely using proxies as keys. See
+   * comments below about HostWeakMap and DoubleWeakMap for details.
+   *
+   * This function (which is a global, not exposed to guests) marks a
+   * WeakMap as permitted to do what is necessary to index all host
+   * objects, at the cost of making it unsafe for proxies.
+   *
+   * Do not apply this function to anything which is not a genuine
+   * fresh WeakMap.
+   */
+  function weakMapPermitHostObjects(map) {
+    // identity of function used as a secret -- good enough and cheap
+    if (map.permitHostObjects___) {
+      map.permitHostObjects___(weakMapPermitHostObjects);
+    }
+  }
+  if (typeof ses !== 'undefined') {
+    ses.weakMapPermitHostObjects = weakMapPermitHostObjects;
+  }
+
+  // IE 11 has no Proxy but has a broken WeakMap such that we need to patch
+  // it using DoubleWeakMap; this flag tells DoubleWeakMap so.
+  var doubleWeakMapCheckSilentFailure = false;
+
+  // Check if there is already a good-enough WeakMap implementation, and if so
+  // exit without replacing it.
+  if (typeof WeakMap === 'function') {
+    var HostWeakMap = WeakMap;
+    // There is a WeakMap -- is it good enough?
+    if (typeof navigator !== 'undefined' &&
+        /Firefox/.test(navigator.userAgent)) {
+      // We're now *assuming not*, because as of this writing (2013-05-06)
+      // Firefox's WeakMaps have a miscellany of objects they won't accept, and
+      // we don't want to make an exhaustive list, and testing for just one
+      // will be a problem if that one is fixed alone (as they did for Event).
+
+      // If there is a platform that we *can* reliably test on, here's how to
+      // do it:
+      //  var problematic = ... ;
+      //  var testHostMap = new HostWeakMap();
+      //  try {
+      //    testHostMap.set(problematic, 1);  // Firefox 20 will throw here
+      //    if (testHostMap.get(problematic) === 1) {
+      //      return;
+      //    }
+      //  } catch (e) {}
+
+    } else {
+      // IE 11 bug: WeakMaps silently fail to store frozen objects.
+      var testMap = new HostWeakMap();
+      var testObject = Object.freeze({});
+      testMap.set(testObject, 1);
+      if (testMap.get(testObject) !== 1) {
+        doubleWeakMapCheckSilentFailure = true;
+        // Fall through to installing our WeakMap.
+      } else {
+        module.exports = WeakMap;
+        return;
+      }
+    }
+  }
+
+  var hop = Object.prototype.hasOwnProperty;
+  var gopn = Object.getOwnPropertyNames;
+  var defProp = Object.defineProperty;
+  var isExtensible = Object.isExtensible;
+
+  /**
+   * Security depends on HIDDEN_NAME being both <i>unguessable</i> and
+   * <i>undiscoverable</i> by untrusted code.
+   *
+   * <p>Given the known weaknesses of Math.random() on existing
+   * browsers, it does not generate unguessability we can be confident
+   * of.
+   *
+   * <p>It is the monkey patching logic in this file that is intended
+   * to ensure undiscoverability. The basic idea is that there are
+   * three fundamental means of discovering properties of an object:
+   * The for/in loop, Object.keys(), and Object.getOwnPropertyNames(),
+   * as well as some proposed ES6 extensions that appear on our
+   * whitelist. The first two only discover enumerable properties, and
+   * we only use HIDDEN_NAME to name a non-enumerable property, so the
+   * only remaining threat should be getOwnPropertyNames and some
+   * proposed ES6 extensions that appear on our whitelist. We monkey
+   * patch them to remove HIDDEN_NAME from the list of properties they
+   * returns.
+   *
+   * <p>TODO(erights): On a platform with built-in Proxies, proxies
+   * could be used to trap and thereby discover the HIDDEN_NAME, so we
+   * need to monkey patch Proxy.create, Proxy.createFunction, etc, in
+   * order to wrap the provided handler with the real handler which
+   * filters out all traps using HIDDEN_NAME.
+   *
+   * <p>TODO(erights): Revisit Mike Stay's suggestion that we use an
+   * encapsulated function at a not-necessarily-secret name, which
+   * uses the Stiegler shared-state rights amplification pattern to
+   * reveal the associated value only to the WeakMap in which this key
+   * is associated with that value. Since only the key retains the
+   * function, the function can also remember the key without causing
+   * leakage of the key, so this doesn't violate our general gc
+   * goals. In addition, because the name need not be a guarded
+   * secret, we could efficiently handle cross-frame frozen keys.
+   */
+  var HIDDEN_NAME_PREFIX = 'weakmap:';
+  var HIDDEN_NAME = HIDDEN_NAME_PREFIX + 'ident:' + Math.random() + '___';
+
+  if (typeof crypto !== 'undefined' &&
+      typeof crypto.getRandomValues === 'function' &&
+      typeof ArrayBuffer === 'function' &&
+      typeof Uint8Array === 'function') {
+    var ab = new ArrayBuffer(25);
+    var u8s = new Uint8Array(ab);
+    crypto.getRandomValues(u8s);
+    HIDDEN_NAME = HIDDEN_NAME_PREFIX + 'rand:' +
+      Array.prototype.map.call(u8s, function(u8) {
+        return (u8 % 36).toString(36);
+      }).join('') + '___';
+  }
+
+  function isNotHiddenName(name) {
+    return !(
+        name.substr(0, HIDDEN_NAME_PREFIX.length) == HIDDEN_NAME_PREFIX &&
+        name.substr(name.length - 3) === '___');
+  }
+
+  /**
+   * Monkey patch getOwnPropertyNames to avoid revealing the
+   * HIDDEN_NAME.
+   *
+   * <p>The ES5.1 spec requires each name to appear only once, but as
+   * of this writing, this requirement is controversial for ES6, so we
+   * made this code robust against this case. If the resulting extra
+   * search turns out to be expensive, we can probably relax this once
+   * ES6 is adequately supported on all major browsers, iff no browser
+   * versions we support at that time have relaxed this constraint
+   * without providing built-in ES6 WeakMaps.
+   */
+  defProp(Object, 'getOwnPropertyNames', {
+    value: function fakeGetOwnPropertyNames(obj) {
+      return gopn(obj).filter(isNotHiddenName);
+    }
+  });
+
+  /**
+   * getPropertyNames is not in ES5 but it is proposed for ES6 and
+   * does appear in our whitelist, so we need to clean it too.
+   */
+  if ('getPropertyNames' in Object) {
+    var originalGetPropertyNames = Object.getPropertyNames;
+    defProp(Object, 'getPropertyNames', {
+      value: function fakeGetPropertyNames(obj) {
+        return originalGetPropertyNames(obj).filter(isNotHiddenName);
+      }
+    });
+  }
+
+  /**
+   * <p>To treat objects as identity-keys with reasonable efficiency
+   * on ES5 by itself (i.e., without any object-keyed collections), we
+   * need to add a hidden property to such key objects when we
+   * can. This raises several issues:
+   * <ul>
+   * <li>Arranging to add this property to objects before we lose the
+   *     chance, and
+   * <li>Hiding the existence of this new property from most
+   *     JavaScript code.
+   * <li>Preventing <i>certification theft</i>, where one object is
+   *     created falsely claiming to be the key of an association
+   *     actually keyed by another object.
+   * <li>Preventing <i>value theft</i>, where untrusted code with
+   *     access to a key object but not a weak map nevertheless
+   *     obtains access to the value associated with that key in that
+   *     weak map.
+   * </ul>
+   * We do so by
+   * <ul>
+   * <li>Making the name of the hidden property unguessable, so "[]"
+   *     indexing, which we cannot intercept, cannot be used to access
+   *     a property without knowing the name.
+   * <li>Making the hidden property non-enumerable, so we need not
+   *     worry about for-in loops or {@code Object.keys},
+   * <li>monkey patching those reflective methods that would
+   *     prevent extensions, to add this hidden property first,
+   * <li>monkey patching those methods that would reveal this
+   *     hidden property.
+   * </ul>
+   * Unfortunately, because of same-origin iframes, we cannot reliably
+   * add this hidden property before an object becomes
+   * non-extensible. Instead, if we encounter a non-extensible object
+   * without a hidden record that we can detect (whether or not it has
+   * a hidden record stored under a name secret to us), then we just
+   * use the key object itself to represent its identity in a brute
+   * force leaky map stored in the weak map, losing all the advantages
+   * of weakness for these.
+   */
+  function getHiddenRecord(key) {
+    if (key !== Object(key)) {
+      throw new TypeError('Not an object: ' + key);
+    }
+    var hiddenRecord = key[HIDDEN_NAME];
+    if (hiddenRecord && hiddenRecord.key === key) { return hiddenRecord; }
+    if (!isExtensible(key)) {
+      // Weak map must brute force, as explained in doc-comment above.
+      return void 0;
+    }
+
+    // The hiddenRecord and the key point directly at each other, via
+    // the "key" and HIDDEN_NAME properties respectively. The key
+    // field is for quickly verifying that this hidden record is an
+    // own property, not a hidden record from up the prototype chain.
+    //
+    // NOTE: Because this WeakMap emulation is meant only for systems like
+    // SES where Object.prototype is frozen without any numeric
+    // properties, it is ok to use an object literal for the hiddenRecord.
+    // This has two advantages:
+    // * It is much faster in a performance critical place
+    // * It avoids relying on Object.create(null), which had been
+    //   problematic on Chrome 28.0.1480.0. See
+    //   https://code.google.com/p/google-caja/issues/detail?id=1687
+    hiddenRecord = { key: key };
+
+    // When using this WeakMap emulation on platforms where
+    // Object.prototype might not be frozen and Object.create(null) is
+    // reliable, use the following two commented out lines instead.
+    // hiddenRecord = Object.create(null);
+    // hiddenRecord.key = key;
+
+    // Please contact us if you need this to work on platforms where
+    // Object.prototype might not be frozen and
+    // Object.create(null) might not be reliable.
+
+    try {
+      defProp(key, HIDDEN_NAME, {
+        value: hiddenRecord,
+        writable: false,
+        enumerable: false,
+        configurable: false
+      });
+      return hiddenRecord;
+    } catch (error) {
+      // Under some circumstances, isExtensible seems to misreport whether
+      // the HIDDEN_NAME can be defined.
+      // The circumstances have not been isolated, but at least affect
+      // Node.js v0.10.26 on TravisCI / Linux, but not the same version of
+      // Node.js on OS X.
+      return void 0;
+    }
+  }
+
+  /**
+   * Monkey patch operations that would make their argument
+   * non-extensible.
+   *
+   * <p>The monkey patched versions throw a TypeError if their
+   * argument is not an object, so it should only be done to functions
+   * that should throw a TypeError anyway if their argument is not an
+   * object.
+   */
+  (function(){
+    var oldFreeze = Object.freeze;
+    defProp(Object, 'freeze', {
+      value: function identifyingFreeze(obj) {
+        getHiddenRecord(obj);
+        return oldFreeze(obj);
+      }
+    });
+    var oldSeal = Object.seal;
+    defProp(Object, 'seal', {
+      value: function identifyingSeal(obj) {
+        getHiddenRecord(obj);
+        return oldSeal(obj);
+      }
+    });
+    var oldPreventExtensions = Object.preventExtensions;
+    defProp(Object, 'preventExtensions', {
+      value: function identifyingPreventExtensions(obj) {
+        getHiddenRecord(obj);
+        return oldPreventExtensions(obj);
+      }
+    });
+  })();
+
+  function constFunc(func) {
+    func.prototype = null;
+    return Object.freeze(func);
+  }
+
+  var calledAsFunctionWarningDone = false;
+  function calledAsFunctionWarning() {
+    // Future ES6 WeakMap is currently (2013-09-10) expected to reject WeakMap()
+    // but we used to permit it and do it ourselves, so warn only.
+    if (!calledAsFunctionWarningDone && typeof console !== 'undefined') {
+      calledAsFunctionWarningDone = true;
+      console.warn('WeakMap should be invoked as new WeakMap(), not ' +
+          'WeakMap(). This will be an error in the future.');
+    }
+  }
+
+  var nextId = 0;
+
+  var OurWeakMap = function() {
+    if (!(this instanceof OurWeakMap)) {  // approximate test for new ...()
+      calledAsFunctionWarning();
+    }
+
+    // We are currently (12/25/2012) never encountering any prematurely
+    // non-extensible keys.
+    var keys = []; // brute force for prematurely non-extensible keys.
+    var values = []; // brute force for corresponding values.
+    var id = nextId++;
+
+    function get___(key, opt_default) {
+      var index;
+      var hiddenRecord = getHiddenRecord(key);
+      if (hiddenRecord) {
+        return id in hiddenRecord ? hiddenRecord[id] : opt_default;
+      } else {
+        index = keys.indexOf(key);
+        return index >= 0 ? values[index] : opt_default;
+      }
+    }
+
+    function has___(key) {
+      var hiddenRecord = getHiddenRecord(key);
+      if (hiddenRecord) {
+        return id in hiddenRecord;
+      } else {
+        return keys.indexOf(key) >= 0;
+      }
+    }
+
+    function set___(key, value) {
+      var index;
+      var hiddenRecord = getHiddenRecord(key);
+      if (hiddenRecord) {
+        hiddenRecord[id] = value;
+      } else {
+        index = keys.indexOf(key);
+        if (index >= 0) {
+          values[index] = value;
+        } else {
+          // Since some browsers preemptively terminate slow turns but
+          // then continue computing with presumably corrupted heap
+          // state, we here defensively get keys.length first and then
+          // use it to update both the values and keys arrays, keeping
+          // them in sync.
+          index = keys.length;
+          values[index] = value;
+          // If we crash here, values will be one longer than keys.
+          keys[index] = key;
+        }
+      }
+      return this;
+    }
+
+    function delete___(key) {
+      var hiddenRecord = getHiddenRecord(key);
+      var index, lastIndex;
+      if (hiddenRecord) {
+        return id in hiddenRecord && delete hiddenRecord[id];
+      } else {
+        index = keys.indexOf(key);
+        if (index < 0) {
+          return false;
+        }
+        // Since some browsers preemptively terminate slow turns but
+        // then continue computing with potentially corrupted heap
+        // state, we here defensively get keys.length first and then use
+        // it to update both the keys and the values array, keeping
+        // them in sync. We update the two with an order of assignments,
+        // such that any prefix of these assignments will preserve the
+        // key/value correspondence, either before or after the delete.
+        // Note that this needs to work correctly when index === lastIndex.
+        lastIndex = keys.length - 1;
+        keys[index] = void 0;
+        // If we crash here, there's a void 0 in the keys array, but
+        // no operation will cause a "keys.indexOf(void 0)", since
+        // getHiddenRecord(void 0) will always throw an error first.
+        values[index] = values[lastIndex];
+        // If we crash here, values[index] cannot be found here,
+        // because keys[index] is void 0.
+        keys[index] = keys[lastIndex];
+        // If index === lastIndex and we crash here, then keys[index]
+        // is still void 0, since the aliasing killed the previous key.
+        keys.length = lastIndex;
+        // If we crash here, keys will be one shorter than values.
+        values.length = lastIndex;
+        return true;
+      }
+    }
+
+    return Object.create(OurWeakMap.prototype, {
+      get___:    { value: constFunc(get___) },
+      has___:    { value: constFunc(has___) },
+      set___:    { value: constFunc(set___) },
+      delete___: { value: constFunc(delete___) }
+    });
+  };
+
+  OurWeakMap.prototype = Object.create(Object.prototype, {
+    get: {
+      /**
+       * Return the value most recently associated with key, or
+       * opt_default if none.
+       */
+      value: function get(key, opt_default) {
+        return this.get___(key, opt_default);
+      },
+      writable: true,
+      configurable: true
+    },
+
+    has: {
+      /**
+       * Is there a value associated with key in this WeakMap?
+       */
+      value: function has(key) {
+        return this.has___(key);
+      },
+      writable: true,
+      configurable: true
+    },
+
+    set: {
+      /**
+       * Associate value with key in this WeakMap, overwriting any
+       * previous association if present.
+       */
+      value: function set(key, value) {
+        return this.set___(key, value);
+      },
+      writable: true,
+      configurable: true
+    },
+
+    'delete': {
+      /**
+       * Remove any association for key in this WeakMap, returning
+       * whether there was one.
+       *
+       * <p>Note that the boolean return here does not work like the
+       * {@code delete} operator. The {@code delete} operator returns
+       * whether the deletion succeeds at bringing about a state in
+       * which the deleted property is absent. The {@code delete}
+       * operator therefore returns true if the property was already
+       * absent, whereas this {@code delete} method returns false if
+       * the association was already absent.
+       */
+      value: function remove(key) {
+        return this.delete___(key);
+      },
+      writable: true,
+      configurable: true
+    }
+  });
+
+  if (typeof HostWeakMap === 'function') {
+    (function() {
+      // If we got here, then the platform has a WeakMap but we are concerned
+      // that it may refuse to store some key types. Therefore, make a map
+      // implementation which makes use of both as possible.
+
+      // In this mode we are always using double maps, so we are not proxy-safe.
+      // This combination does not occur in any known browser, but we had best
+      // be safe.
+      if (doubleWeakMapCheckSilentFailure && typeof Proxy !== 'undefined') {
+        Proxy = undefined;
+      }
+
+      function DoubleWeakMap() {
+        if (!(this instanceof OurWeakMap)) {  // approximate test for new ...()
+          calledAsFunctionWarning();
+        }
+
+        // Preferable, truly weak map.
+        var hmap = new HostWeakMap();
+
+        // Our hidden-property-based pseudo-weak-map. Lazily initialized in the
+        // 'set' implementation; thus we can avoid performing extra lookups if
+        // we know all entries actually stored are entered in 'hmap'.
+        var omap = undefined;
+
+        // Hidden-property maps are not compatible with proxies because proxies
+        // can observe the hidden name and either accidentally expose it or fail
+        // to allow the hidden property to be set. Therefore, we do not allow
+        // arbitrary WeakMaps to switch to using hidden properties, but only
+        // those which need the ability, and unprivileged code is not allowed
+        // to set the flag.
+        //
+        // (Except in doubleWeakMapCheckSilentFailure mode in which case we
+        // disable proxies.)
+        var enableSwitching = false;
+
+        function dget(key, opt_default) {
+          if (omap) {
+            return hmap.has(key) ? hmap.get(key)
+                : omap.get___(key, opt_default);
+          } else {
+            return hmap.get(key, opt_default);
+          }
+        }
+
+        function dhas(key) {
+          return hmap.has(key) || (omap ? omap.has___(key) : false);
+        }
+
+        var dset;
+        if (doubleWeakMapCheckSilentFailure) {
+          dset = function(key, value) {
+            hmap.set(key, value);
+            if (!hmap.has(key)) {
+              if (!omap) { omap = new OurWeakMap(); }
+              omap.set(key, value);
+            }
+            return this;
+          };
+        } else {
+          dset = function(key, value) {
+            if (enableSwitching) {
+              try {
+                hmap.set(key, value);
+              } catch (e) {
+                if (!omap) { omap = new OurWeakMap(); }
+                omap.set___(key, value);
+              }
+            } else {
+              hmap.set(key, value);
+            }
+            return this;
+          };
+        }
+
+        function ddelete(key) {
+          var result = !!hmap['delete'](key);
+          if (omap) { return omap.delete___(key) || result; }
+          return result;
+        }
+
+        return Object.create(OurWeakMap.prototype, {
+          get___:    { value: constFunc(dget) },
+          has___:    { value: constFunc(dhas) },
+          set___:    { value: constFunc(dset) },
+          delete___: { value: constFunc(ddelete) },
+          permitHostObjects___: { value: constFunc(function(token) {
+            if (token === weakMapPermitHostObjects) {
+              enableSwitching = true;
+            } else {
+              throw new Error('bogus call to permitHostObjects___');
+            }
+          })}
+        });
+      }
+      DoubleWeakMap.prototype = OurWeakMap.prototype;
+      module.exports = DoubleWeakMap;
+
+      // define .constructor to hide OurWeakMap ctor
+      Object.defineProperty(WeakMap.prototype, 'constructor', {
+        value: WeakMap,
+        enumerable: false,  // as default .constructor is
+        configurable: true,
+        writable: true
+      });
+    })();
+  } else {
+    // There is no host WeakMap, so we must use the emulation.
+
+    // Emulated WeakMaps are incompatible with native proxies (because proxies
+    // can observe the hidden name), so we must disable Proxy usage (in
+    // ArrayLike and Domado, currently).
+    if (typeof Proxy !== 'undefined') {
+      Proxy = undefined;
+    }
+
+    module.exports = OurWeakMap;
+  }
+})();
diff --git a/node_modules/q/package.json b/node_modules/q/package.json
new file mode 100644
index 0000000..0d47cc0
--- /dev/null
+++ b/node_modules/q/package.json
@@ -0,0 +1,130 @@
+{
+  "name": "q",
+  "version": "2.0.3",
+  "publishConfig": {
+    "tag": "future"
+  },
+  "description": "A library for promises (CommonJS/Promises/A,B,D)",
+  "homepage": "https://github.com/kriskowal/q",
+  "author": {
+    "name": "Kris Kowal",
+    "email": "kris@cixar.com",
+    "url": "https://github.com/kriskowal"
+  },
+  "keywords": [
+    "q",
+    "promise",
+    "promises",
+    "promises-a",
+    "promises-aplus",
+    "deferred",
+    "future",
+    "async",
+    "flow control",
+    "fluent",
+    "browser",
+    "node"
+  ],
+  "contributors": [
+    {
+      "name": "Kris Kowal",
+      "email": "kris@cixar.com",
+      "url": "https://github.com/kriskowal"
+    },
+    {
+      "name": "Irakli Gozalishvili",
+      "email": "rfobic@gmail.com",
+      "url": "http://jeditoolkit.com"
+    },
+    {
+      "name": "Domenic Denicola",
+      "email": "domenic@domenicdenicola.com",
+      "url": "http://domenicdenicola.com"
+    }
+  ],
+  "credits": [
+    "Mark Miller <erights@google.com>",
+    "Tyler Close"
+  ],
+  "license": {
+    "type": "MIT",
+    "url": "http://github.com/kriskowal/q/raw/master/LICENSE"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/kriskowal/q.git"
+  },
+  "main": "q.js",
+  "dependencies": {
+    "asap": "^2.0.0",
+    "pop-iterate": "^1.0.1",
+    "weak-map": "^1.0.5"
+  },
+  "devDependencies": {
+    "jshint": "^2.4.4",
+    "jasminum": ">=2.0.5 <3.0.0",
+    "opener": "^1.3.0",
+    "promises-aplus-tests": "^1.0.2",
+    "istanbul": "^0.2.4",
+    "matcha": "^0.2.0",
+    "grunt": "^0.4.1",
+    "grunt-cli": "^0.1.9",
+    "grunt-contrib-uglify": "^0.2.2",
+    "grunt-contrib-clean": "^0.5.0",
+    "grunt-global-wrap": "^1.1.0",
+    "grunt-amd-wrap": "^1.0.0",
+    "grunt-s3": "^0.2.0-alpha.2"
+  },
+  "scripts": {
+    "lint": "jshint q.js",
+    "test": "npm run lint && jasminum test && npm run test:phantom && promises-aplus-tests test/aplus-adapter",
+    "test:phantom": "jasminum-phantom test",
+    "cover": "istanbul cover test/index.js && istanbul report html && opener coverage/index.html",
+    "release": "grunt release",
+    "benchmark": "matcha"
+  },
+  "files": [
+    "LICENSE",
+    "q.js",
+    "queue.js"
+  ],
+  "overlay": {
+    "teleport": {
+      "dependencies": {
+        "system": ">=0.0.4"
+      }
+    }
+  },
+  "volo": {
+    "url": "http://q-releases.s3-website-us-west-1.amazonaws.com/{version}/amd/q.js"
+  },
+  "gitHead": "e20c370c1ccf317782ac69de151a8e80fba1beb1",
+  "bugs": {
+    "url": "https://github.com/kriskowal/q/issues"
+  },
+  "_id": "q@2.0.3",
+  "_shasum": "75b8db0255a1a5af82f58c3f3aaa1efec7d0d134",
+  "_from": "q@>=2.0.0 <2.1.0",
+  "_npmVersion": "1.4.21",
+  "_npmUser": {
+    "name": "kriskowal",
+    "email": "kris.kowal@cixar.com"
+  },
+  "maintainers": [
+    {
+      "name": "kriskowal",
+      "email": "kris.kowal@cixar.com"
+    },
+    {
+      "name": "domenic",
+      "email": "domenic@domenicdenicola.com"
+    }
+  ],
+  "dist": {
+    "shasum": "75b8db0255a1a5af82f58c3f3aaa1efec7d0d134",
+    "tarball": "http://registry.npmjs.org/q/-/q-2.0.3.tgz"
+  },
+  "directories": {},
+  "_resolved": "https://registry.npmjs.org/q/-/q-2.0.3.tgz",
+  "readme": "ERROR: No README data found!"
+}
diff --git a/node_modules/q/q.js b/node_modules/q/q.js
new file mode 100644
index 0000000..7513b2e
--- /dev/null
+++ b/node_modules/q/q.js
@@ -0,0 +1,1802 @@
+/* vim:ts=4:sts=4:sw=4: */
+/*!
+ *
+ * Copyright 2009-2013 Kris Kowal under the terms of the MIT
+ * license found at http://github.com/kriskowal/q/raw/master/LICENSE
+ *
+ * With parts by Tyler Close
+ * Copyright 2007-2009 Tyler Close under the terms of the MIT X license found
+ * at http://www.opensource.org/licenses/mit-license.html
+ * Forked at ref_send.js version: 2009-05-11
+ *
+ * With parts by Mark Miller
+ * Copyright (C) 2011 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+/*global -WeakMap */
+"use strict";
+
+var hasStacks = false;
+try {
+    throw new Error();
+} catch (e) {
+    hasStacks = !!e.stack;
+}
+
+// All code after this point will be filtered from stack traces reported
+// by Q.
+var qStartingLine = captureLine();
+var qFileName;
+
+var WeakMap = require("weak-map");
+var iterate = require("pop-iterate");
+var asap = require("asap");
+
+function isObject(value) {
+    return value === Object(value);
+}
+
+// long stack traces
+
+var STACK_JUMP_SEPARATOR = "From previous event:";
+
+function makeStackTraceLong(error, promise) {
+    // If possible, transform the error stack trace by removing Node and Q
+    // cruft, then concatenating with the stack trace of `promise`. See #57.
+    if (hasStacks &&
+        promise.stack &&
+        typeof error === "object" &&
+        error !== null &&
+        error.stack &&
+        error.stack.indexOf(STACK_JUMP_SEPARATOR) === -1
+    ) {
+        var stacks = [];
+        for (var p = promise; !!p && handlers.get(p); p = handlers.get(p).became) {
+            if (p.stack) {
+                stacks.unshift(p.stack);
+            }
+        }
+        stacks.unshift(error.stack);
+
+        var concatedStacks = stacks.join("\n" + STACK_JUMP_SEPARATOR + "\n");
+        error.stack = filterStackString(concatedStacks);
+    }
+}
+
+function filterStackString(stackString) {
+    if (Q.isIntrospective) {
+        return stackString;
+    }
+    var lines = stackString.split("\n");
+    var desiredLines = [];
+    for (var i = 0; i < lines.length; ++i) {
+        var line = lines[i];
+
+        if (!isInternalFrame(line) && !isNodeFrame(line) && line) {
+            desiredLines.push(line);
+        }
+    }
+    return desiredLines.join("\n");
+}
+
+function isNodeFrame(stackLine) {
+    return stackLine.indexOf("(module.js:") !== -1 ||
+           stackLine.indexOf("(node.js:") !== -1;
+}
+
+function getFileNameAndLineNumber(stackLine) {
+    // Named functions: "at functionName (filename:lineNumber:columnNumber)"
+    // In IE10 function name can have spaces ("Anonymous function") O_o
+    var attempt1 = /at .+ \((.+):(\d+):(?:\d+)\)$/.exec(stackLine);
+    if (attempt1) {
+        return [attempt1[1], Number(attempt1[2])];
+    }
+
+    // Anonymous functions: "at filename:lineNumber:columnNumber"
+    var attempt2 = /at ([^ ]+):(\d+):(?:\d+)$/.exec(stackLine);
+    if (attempt2) {
+        return [attempt2[1], Number(attempt2[2])];
+    }
+
+    // Firefox style: "function@filename:lineNumber or @filename:lineNumber"
+    var attempt3 = /.*@(.+):(\d+)$/.exec(stackLine);
+    if (attempt3) {
+        return [attempt3[1], Number(attempt3[2])];
+    }
+}
+
+function isInternalFrame(stackLine) {
+    var fileNameAndLineNumber = getFileNameAndLineNumber(stackLine);
+
+    if (!fileNameAndLineNumber) {
+        return false;
+    }
+
+    var fileName = fileNameAndLineNumber[0];
+    var lineNumber = fileNameAndLineNumber[1];
+
+    return fileName === qFileName &&
+        lineNumber >= qStartingLine &&
+        lineNumber <= qEndingLine;
+}
+
+// discover own file name and line number range for filtering stack
+// traces
+function captureLine() {
+    if (!hasStacks) {
+        return;
+    }
+
+    try {
+        throw new Error();
+    } catch (e) {
+        var lines = e.stack.split("\n");
+        var firstLine = lines[0].indexOf("@") > 0 ? lines[1] : lines[2];
+        var fileNameAndLineNumber = getFileNameAndLineNumber(firstLine);
+        if (!fileNameAndLineNumber) {
+            return;
+        }
+
+        qFileName = fileNameAndLineNumber[0];
+        return fileNameAndLineNumber[1];
+    }
+}
+
+function deprecate(callback, name, alternative) {
+    return function Q_deprecate() {
+        if (
+            typeof console !== "undefined" &&
+            typeof console.warn === "function"
+        ) {
+            if (alternative) {
+                console.warn(
+                    name + " is deprecated, use " + alternative + " instead.",
+                    new Error("").stack
+                );
+            } else {
+                console.warn(
+                    name + " is deprecated.",
+                    new Error("").stack
+                );
+            }
+        }
+        return callback.apply(this, arguments);
+    };
+}
+
+// end of long stack traces
+
+var handlers = new WeakMap();
+
+function Q_getHandler(promise) {
+    var handler = handlers.get(promise);
+    if (!handler || !handler.became) {
+        return handler;
+    }
+    handler = follow(handler);
+    handlers.set(promise, handler);
+    return handler;
+}
+
+function follow(handler) {
+    if (!handler.became) {
+        return handler;
+    } else {
+        handler.became = follow(handler.became);
+        return handler.became;
+    }
+}
+
+var theViciousCycleError = new Error("Can't resolve a promise with itself");
+var theViciousCycleRejection = Q_reject(theViciousCycleError);
+var theViciousCycle = Q_getHandler(theViciousCycleRejection);
+
+var thenables = new WeakMap();
+
+/**
+ * Coerces a value to a promise. If the value is a promise, pass it through
+ * unaltered. If the value has a `then` method, it is presumed to be a promise
+ * but not one of our own, so it is treated as a “thenable” promise and this
+ * returns a promise that stands for it. Otherwise, this returns a promise that
+ * has already been fulfilled with the value.
+ * @param value promise, object with a then method, or a fulfillment value
+ * @returns {Promise} the same promise as given, or a promise for the given
+ * value
+ */
+module.exports = Q;
+function Q(value) {
+    // If the object is already a Promise, return it directly.  This enables
+    // the resolve function to both be used to created references from objects,
+    // but to tolerably coerce non-promises to promises.
+    if (Q_isPromise(value)) {
+        return value;
+    } else if (isThenable(value)) {
+        if (!thenables.has(value)) {
+            thenables.set(value, new Promise(new Thenable(value)));
+        }
+        return thenables.get(value);
+    } else {
+        return new Promise(new Fulfilled(value));
+    }
+}
+
+/**
+ * Controls whether or not long stack traces will be on
+ * @type {boolean}
+ */
+Q.longStackSupport = false;
+
+/**
+ * Returns a promise that has been rejected with a reason, which should be an
+ * instance of `Error`.
+ * @param {Error} error reason for the failure.
+ * @returns {Promise} rejection
+ */
+Q.reject = Q_reject;
+function Q_reject(error) {
+    return new Promise(new Rejected(error));
+}
+
+/**
+ * Constructs a {promise, resolve, reject} object.
+ *
+ * `resolve` is a callback to invoke with a more resolved value for the
+ * promise. To fulfill the promise, invoke `resolve` with any value that is
+ * not a thenable. To reject the promise, invoke `resolve` with a rejected
+ * thenable, or invoke `reject` with the reason directly. To resolve the
+ * promise to another thenable, thus putting it in the same state, invoke
+ * `resolve` with that other thenable.
+ *
+ * @returns {{promise, resolve, reject}} a deferred
+ */
+Q.defer = defer;
+function defer() {
+
+    var handler = new Pending();
+    var promise = new Promise(handler);
+    var deferred = new Deferred(promise);
+
+    if (Q.longStackSupport && hasStacks) {
+        try {
+            throw new Error();
+        } catch (e) {
+            // NOTE: don't try to use `Error.captureStackTrace` or transfer the
+            // accessor around; that causes memory leaks as per GH-111. Just
+            // reify the stack trace as a string ASAP.
+            //
+            // At the same time, cut off the first line; it's always just
+            // "[object Promise]\n", as per the `toString`.
+            promise.stack = e.stack.substring(e.stack.indexOf("\n") + 1);
+        }
+    }
+
+    return deferred;
+}
+
+// TODO
+/**
+ */
+Q.when = function Q_when(value, fulfilled, rejected, ms) {
+    return Q(value).then(fulfilled, rejected, ms);
+};
+
+/**
+ * Turns an array of promises into a promise for an array.  If any of the
+ * promises gets rejected, the whole array is rejected immediately.
+ * @param {Array.<Promise>} an array (or promise for an array) of values (or
+ * promises for values)
+ * @returns {Promise.<Array>} a promise for an array of the corresponding values
+ */
+// By Mark Miller
+// http://wiki.ecmascript.org/doku.php?id=strawman:concurrency&rev=1308776521#allfulfilled
+Q.all = Q_all;
+function Q_all(questions) {
+    // XXX deprecated behavior
+    if (Q_isPromise(questions)) {
+        if (
+            typeof console !== "undefined" &&
+            typeof console.warn === "function"
+        ) {
+            console.warn("Q.all no longer directly unwraps a promise. Use Q(array).all()");
+        }
+        return Q(questions).all();
+    }
+    var countDown = 0;
+    var deferred = defer();
+    var answers = Array(questions.length);
+    var estimates = [];
+    var estimate = -Infinity;
+    var setEstimate;
+    Array.prototype.forEach.call(questions, function Q_all_each(promise, index) {
+        var handler;
+        if (
+            Q_isPromise(promise) &&
+            (handler = Q_getHandler(promise)).state === "fulfilled"
+        ) {
+            answers[index] = handler.value;
+        } else {
+            ++countDown;
+            promise = Q(promise);
+            promise.then(
+                function Q_all_eachFulfilled(value) {
+                    answers[index] = value;
+                    if (--countDown === 0) {
+                        deferred.resolve(answers);
+                    }
+                },
+                deferred.reject
+            );
+
+            promise.observeEstimate(function Q_all_eachEstimate(newEstimate) {
+                var oldEstimate = estimates[index];
+                estimates[index] = newEstimate;
+                if (newEstimate > estimate) {
+                    estimate = newEstimate;
+                } else if (oldEstimate === estimate && newEstimate <= estimate) {
+                    // There is a 1/length chance that we will need to perform
+                    // this O(length) walk, so amortized O(1)
+                    computeEstimate();
+                }
+                if (estimates.length === questions.length && estimate !== setEstimate) {
+                    deferred.setEstimate(estimate);
+                    setEstimate = estimate;
+                }
+            });
+
+        }
+    });
+
+    function computeEstimate() {
+        estimate = -Infinity;
+        for (var index = 0; index < estimates.length; index++) {
+            if (estimates[index] > estimate) {
+                estimate = estimates[index];
+            }
+        }
+    }
+
+    if (countDown === 0) {
+        deferred.resolve(answers);
+    }
+
+    return deferred.promise;
+}
+
+/**
+ * @see Promise#allSettled
+ */
+Q.allSettled = Q_allSettled;
+function Q_allSettled(questions) {
+    // XXX deprecated behavior
+    if (Q_isPromise(questions)) {
+        if (
+            typeof console !== "undefined" &&
+            typeof console.warn === "function"
+        ) {
+            console.warn("Q.allSettled no longer directly unwraps a promise. Use Q(array).allSettled()");
+        }
+        return Q(questions).allSettled();
+    }
+    return Q_all(questions.map(function Q_allSettled_each(promise) {
+        promise = Q(promise);
+        function regardless() {
+            return promise.inspect();
+        }
+        return promise.then(regardless, regardless);
+    }));
+}
+
+/**
+ * Returns a promise for the given value (or promised value), some
+ * milliseconds after it resolved. Passes rejections immediately.
+ * @param {Any*} promise
+ * @param {Number} milliseconds
+ * @returns a promise for the resolution of the given promise after milliseconds
+ * time has elapsed since the resolution of the given promise.
+ * If the given promise rejects, that is passed immediately.
+ */
+Q.delay = function Q_delay(object, timeout) {
+    if (timeout === void 0) {
+        timeout = object;
+        object = void 0;
+    }
+    return Q(object).delay(timeout);
+};
+
+/**
+ * Causes a promise to be rejected if it does not get fulfilled before
+ * some milliseconds time out.
+ * @param {Any*} promise
+ * @param {Number} milliseconds timeout
+ * @param {String} custom error message (optional)
+ * @returns a promise for the resolution of the given promise if it is
+ * fulfilled before the timeout, otherwise rejected.
+ */
+Q.timeout = function Q_timeout(object, ms, message) {
+    return Q(object).timeout(ms, message);
+};
+
+/**
+ * Spreads the values of a promised array of arguments into the
+ * fulfillment callback.
+ * @param fulfilled callback that receives variadic arguments from the
+ * promised array
+ * @param rejected callback that receives the exception if the promise
+ * is rejected.
+ * @returns a promise for the return value or thrown exception of
+ * either callback.
+ */
+Q.spread = Q_spread;
+function Q_spread(value, fulfilled, rejected) {
+    return Q(value).spread(fulfilled, rejected);
+}
+
+/**
+ * If two promises eventually fulfill to the same value, promises that value,
+ * but otherwise rejects.
+ * @param x {Any*}
+ * @param y {Any*}
+ * @returns {Any*} a promise for x and y if they are the same, but a rejection
+ * otherwise.
+ *
+ */
+Q.join = function Q_join(x, y) {
+    return Q.spread([x, y], function Q_joined(x, y) {
+        if (x === y) {
+            // TODO: "===" should be Object.is or equiv
+            return x;
+        } else {
+            throw new Error("Can't join: not the same: " + x + " " + y);
+        }
+    });
+};
+
+/**
+ * Returns a promise for the first of an array of promises to become fulfilled.
+ * @param answers {Array} promises to race
+ * @returns {Promise} the first promise to be fulfilled
+ */
+Q.race = Q_race;
+function Q_race(answerPs) {
+    return new Promise(function(deferred) {
+        answerPs.forEach(function(answerP) {
+            Q(answerP).then(deferred.resolve, deferred.reject);
+        });
+    });
+}
+
+/**
+ * Calls the promised function in a future turn.
+ * @param object    promise or immediate reference for target function
+ * @param ...args   array of application arguments
+ */
+Q.try = function Q_try(callback) {
+    return Q(callback).dispatch("call", [[]]);
+};
+
+/**
+ * TODO
+ */
+Q.function = Promise_function;
+function Promise_function(wrapped) {
+    return function promiseFunctionWrapper() {
+        var args = new Array(arguments.length);
+        for (var index = 0; index < arguments.length; index++) {
+            args[index] = arguments[index];
+        }
+        return Q(wrapped).apply(this, args);
+    };
+}
+
+/**
+ * The promised function decorator ensures that any promise arguments
+ * are settled and passed as values (`this` is also settled and passed
+ * as a value).  It will also ensure that the result of a function is
+ * always a promise.
+ *
+ * @example
+ * var add = Q.promised(function (a, b) {
+ *     return a + b;
+ * });
+ * add(Q(a), Q(B));
+ *
+ * @param {function} callback The function to decorate
+ * @returns {function} a function that has been decorated.
+ */
+Q.promised = function Q_promised(callback) {
+    return function promisedMethod() {
+        var args = new Array(arguments.length);
+        for (var index = 0; index < arguments.length; index++) {
+            args[index] = arguments[index];
+        }
+        return Q_spread(
+            [this, Q_all(args)],
+            function Q_promised_spread(self, args) {
+                return callback.apply(self, args);
+            }
+        );
+    };
+};
+
+/**
+ */
+Q.passByCopy = // TODO XXX experimental
+Q.push = function (value) {
+    if (Object(value) === value && !Q_isPromise(value)) {
+        passByCopies.set(value, true);
+    }
+    return value;
+};
+
+Q.isPortable = function (value) {
+    return Object(value) === value && passByCopies.has(value);
+};
+
+var passByCopies = new WeakMap();
+
+/**
+ * The async function is a decorator for generator functions, turning
+ * them into asynchronous generators. Although generators are only
+ * part of the newest ECMAScript 6 drafts, this code does not cause
+ * syntax errors in older engines. This code should continue to work
+ * and will in fact improve over time as the language improves.
+ *
+ * ES6 generators are currently part of V8 version 3.19 with the
+ * `--harmony-generators` runtime flag enabled. This function does not
+ * support the former, Pythonic generators that were only implemented
+ * by SpiderMonkey.
+ *
+ * Decorates a generator function such that:
+ *  - it may yield promises
+ *  - execution will continue when that promise is fulfilled
+ *  - the value of the yield expression will be the fulfilled value
+ *  - it returns a promise for the return value (when the generator
+ *    stops iterating)
+ *  - the decorated function returns a promise for the return value
+ *    of the generator or the first rejected promise among those
+ *    yielded.
+ *  - if an error is thrown in the generator, it propagates through
+ *    every following yield until it is caught, or until it escapes
+ *    the generator function altogether, and is translated into a
+ *    rejection for the promise returned by the decorated generator.
+ */
+Q.async = Q_async;
+function Q_async(makeGenerator) {
+    return function spawn() {
+        // when verb is "send", arg is a value
+        // when verb is "throw", arg is an exception
+        function continuer(verb, arg) {
+            var iteration;
+            try {
+                iteration = generator[verb](arg);
+            } catch (exception) {
+                return Q_reject(exception);
+            }
+            if (iteration.done) {
+                return Q(iteration.value);
+            } else {
+                return Q(iteration.value).then(callback, errback);
+            }
+        }
+        var generator = makeGenerator.apply(this, arguments);
+        var callback = continuer.bind(continuer, "next");
+        var errback = continuer.bind(continuer, "throw");
+        return callback();
+    };
+}
+
+/**
+ * The spawn function is a small wrapper around async that immediately
+ * calls the generator and also ends the promise chain, so that any
+ * unhandled errors are thrown instead of forwarded to the error
+ * handler. This is useful because it's extremely common to run
+ * generators at the top-level to work with libraries.
+ */
+Q.spawn = Q_spawn;
+function Q_spawn(makeGenerator) {
+    Q_async(makeGenerator)().done();
+}
+
+
+// Thus begins the section dedicated to the Promise
+
+/**
+ * TODO
+ */
+Q.Promise = Promise;
+function Promise(handler) {
+    if (!(this instanceof Promise)) {
+        return new Promise(handler);
+    }
+    if (typeof handler === "function") {
+        var setup = handler;
+        var deferred = defer();
+        handler = Q_getHandler(deferred.promise);
+        try {
+            setup(deferred.resolve, deferred.reject, deferred.setEstimate);
+        } catch (error) {
+            deferred.reject(error);
+        }
+    }
+    handlers.set(this, handler);
+}
+
+/**
+ * Turns an array of promises into a promise for an array.  If any of the
+ * promises gets rejected, the whole array is rejected immediately.
+ * @param {Array.<Promise>} an array (or promise for an array) of values (or
+ * promises for values)
+ * @returns {Promise.<Array>} a promise for an array of the corresponding values
+ */
+Promise.all = Q_all;
+
+/**
+ * Returns a promise for the first of an array of promises to become fulfilled.
+ * @param answers {Array} promises to race
+ * @returns {Promise} the first promise to be fulfilled
+ */
+Promise.race = Q_race;
+
+/**
+ * Coerces a value to a promise. If the value is a promise, pass it through
+ * unaltered. If the value has a `then` method, it is presumed to be a promise
+ * but not one of our own, so it is treated as a “thenable” promise and this
+ * returns a promise that stands for it. Otherwise, this returns a promise that
+ * has already been fulfilled with the value.
+ * @param value promise, object with a then method, or a fulfillment value
+ * @returns {Promise} the same promise as given, or a promise for the given
+ * value
+ */
+Promise.resolve = Promise_resolve;
+function Promise_resolve(value) {
+    return Q(value);
+}
+
+/**
+ * Returns a promise that has been rejected with a reason, which should be an
+ * instance of `Error`.
+ * @param reason value describing the failure
+ * @returns {Promise} rejection
+ */
+Promise.reject = Q_reject;
+
+/**
+ * @returns {boolean} whether the given value is a promise.
+ */
+Q.isPromise = Q_isPromise;
+function Q_isPromise(object) {
+    return isObject(object) && !!handlers.get(object);
+}
+
+/**
+ * @returns {boolean} whether the given value is an object with a then method.
+ * @private
+ */
+function isThenable(object) {
+    return isObject(object) && typeof object.then === "function";
+}
+
+/**
+ * Synchronously produces a snapshot of the internal state of the promise.  The
+ * object will have a `state` property. If the `state` is `"pending"`, there
+ * will be no further information. If the `state` is `"fulfilled"`, there will
+ * be a `value` property. If the state is `"rejected"` there will be a `reason`
+ * property.  If the promise was constructed from a “thenable” and `then` nor
+ * any other method has been dispatched on the promise has been called, the
+ * state will be `"pending"`. The state object will not be updated if the
+ * state changes and changing it will have no effect on the promise. Every
+ * call to `inspect` produces a unique object.
+ * @returns {{state: string, value?, reason?}}
+ */
+Promise.prototype.inspect = function Promise_inspect() {
+    // the second layer captures only the relevant "state" properties of the
+    // handler to prevent leaking the capability to access or alter the
+    // handler.
+    return Q_getHandler(this).inspect();
+};
+
+/**
+ * @returns {boolean} whether the promise is waiting for a result.
+ */
+Promise.prototype.isPending = function Promise_isPending() {
+    return Q_getHandler(this).state === "pending";
+};
+
+/**
+ * @returns {boolean} whether the promise has ended in a result and has a
+ * fulfillment value.
+ */
+Promise.prototype.isFulfilled = function Promise_isFulfilled() {
+    return Q_getHandler(this).state === "fulfilled";
+};
+
+/**
+ * @returns {boolean} whether the promise has ended poorly and has a reason for
+ * its rejection.
+ */
+Promise.prototype.isRejected = function Promise_isRejected() {
+    return Q_getHandler(this).state === "rejected";
+};
+
+/**
+ * TODO
+ */
+Promise.prototype.toBePassed = function Promise_toBePassed() {
+    return Q_getHandler(this).state === "passed";
+};
+
+/**
+ * @returns {string} merely `"[object Promise]"`
+ */
+Promise.prototype.toString = function Promise_toString() {
+    return "[object Promise]";
+};
+
+/**
+ * Creates a new promise, waits for this promise to be resolved, and informs
+ * either the fullfilled or rejected handler of the result. Whatever result
+ * comes of the fulfilled or rejected handler, a value returned, a promise
+ * returned, or an error thrown, becomes the resolution for the promise
+ * returned by `then`.
+ *
+ * @param fulfilled
+ * @param rejected
+ * @returns {Promise} for the result of `fulfilled` or `rejected`.
+ */
+Promise.prototype.then = function Promise_then(fulfilled, rejected, ms) {
+    var self = this;
+    var deferred = defer();
+
+    var _fulfilled;
+    if (typeof fulfilled === "function") {
+        _fulfilled = function Promise_then_fulfilled(value) {
+            try {
+                deferred.resolve(fulfilled.call(void 0, value));
+            } catch (error) {
+                deferred.reject(error);
+            }
+        };
+    } else {
+        _fulfilled = deferred.resolve;
+    }
+
+    var _rejected;
+    if (typeof rejected === "function") {
+        _rejected = function Promise_then_rejected(error) {
+            try {
+                deferred.resolve(rejected.call(void 0, error));
+            } catch (newError) {
+                deferred.reject(newError);
+            }
+        };
+    } else {
+        _rejected = deferred.reject;
+    }
+
+    this.done(_fulfilled, _rejected);
+
+    if (ms !== void 0) {
+        var updateEstimate = function Promise_then_updateEstimate() {
+            deferred.setEstimate(self.getEstimate() + ms);
+        };
+        this.observeEstimate(updateEstimate);
+        updateEstimate();
+    }
+
+    return deferred.promise;
+};
+
+/**
+ * Terminates a chain of promises, forcing rejections to be
+ * thrown as exceptions.
+ * @param fulfilled
+ * @param rejected
+ */
+Promise.prototype.done = function Promise_done(fulfilled, rejected) {
+    var self = this;
+    var done = false;   // ensure the untrusted promise makes at most a
+                        // single call to one of the callbacks
+    asap(function Promise_done_task() {
+        var _fulfilled;
+        if (typeof fulfilled === "function") {
+            if (Q.onerror) {
+                _fulfilled = function Promise_done_fulfilled(value) {
+                    if (done) {
+                        return;
+                    }
+                    done = true;
+                    try {
+                        fulfilled.call(void 0, value);
+                    } catch (error) {
+                        // fallback to rethrow is still necessary because
+                        // _fulfilled is not called in the same event as the
+                        // above guard.
+                        (Q.onerror || Promise_rethrow)(error);
+                    }
+                };
+            } else {
+                _fulfilled = function Promise_done_fulfilled(value) {
+                    if (done) {
+                        return;
+                    }
+                    done = true;
+                    fulfilled.call(void 0, value);
+                };
+            }
+        }
+
+        var _rejected;
+        if (typeof rejected === "function" && Q.onerror) {
+            _rejected = function Promise_done_rejected(error) {
+                if (done) {
+                    return;
+                }
+                done = true;
+                makeStackTraceLong(error, self);
+                try {
+                    rejected.call(void 0, error);
+                } catch (newError) {
+                    (Q.onerror || Promise_rethrow)(newError);
+                }
+            };
+        } else if (typeof rejected === "function") {
+            _rejected = function Promise_done_rejected(error) {
+                if (done) {
+                    return;
+                }
+                done = true;
+                makeStackTraceLong(error, self);
+                rejected.call(void 0, error);
+            };
+        } else {
+            _rejected = Q.onerror || Promise_rethrow;
+        }
+
+        if (typeof process === "object" && process.domain) {
+            _rejected = process.domain.bind(_rejected);
+        }
+
+        Q_getHandler(self).dispatch(_fulfilled, "then", [_rejected]);
+    });
+};
+
+function Promise_rethrow(error) {
+    throw error;
+}
+
+/**
+ * TODO
+ */
+Promise.prototype.thenResolve = function Promise_thenResolve(value) {
+    // Wrapping ahead of time to forestall multiple wrappers.
+    value = Q(value);
+    // Using all is necessary to aggregate the estimated time to completion.
+    return Q_all([this, value]).then(function Promise_thenResolve_resolved() {
+        return value;
+    }, null, 0);
+    // 0: does not contribute significantly to the estimated time to
+    // completion.
+};
+
+/**
+ * TODO
+ */
+Promise.prototype.thenReject = function Promise_thenReject(error) {
+    return this.then(function Promise_thenReject_resolved() {
+        throw error;
+    }, null, 0);
+    // 0: does not contribute significantly to the estimated time to
+    // completion.
+};
+
+/**
+ * TODO
+ */
+Promise.prototype.all = function Promise_all() {
+    return this.then(Q_all);
+};
+
+/**
+ * Turns an array of promises into a promise for an array of their states (as
+ * returned by `inspect`) when they have all settled.
+ * @param {Array[Any*]} values an array (or promise for an array) of values (or
+ * promises for values)
+ * @returns {Array[State]} an array of states for the respective values.
+ */
+Promise.prototype.allSettled = function Promise_allSettled() {
+    return this.then(Q_allSettled);
+};
+
+/**
+ * TODO
+ */
+Promise.prototype.catch = function Promise_catch(rejected) {
+    return this.then(void 0, rejected);
+};
+
+/**
+ * TODO
+ */
+Promise.prototype.finally = function Promise_finally(callback, ms) {
+    if (!callback) {
+        return this;
+    }
+    callback = Q(callback);
+    return this.then(function (value) {
+        return callback.call().then(function Promise_finally_fulfilled() {
+            return value;
+        });
+    }, function (reason) {
+        // TODO attempt to recycle the rejection with "this".
+        return callback.call().then(function Promise_finally_rejected() {
+            throw reason;
+        });
+    }, ms);
+};
+
+/**
+ * TODO
+ */
+Promise.prototype.observeEstimate = function Promise_observeEstimate(emit) {
+    this.rawDispatch(null, "estimate", [emit]);
+    return this;
+};
+
+/**
+ * TODO
+ */
+Promise.prototype.getEstimate = function Promise_getEstimate() {
+    return Q_getHandler(this).estimate;
+};
+
+/**
+ * TODO
+ */
+Promise.prototype.dispatch = function Promise_dispatch(op, args) {
+    var deferred = defer();
+    this.rawDispatch(deferred.resolve, op, args);
+    return deferred.promise;
+};
+
+/**
+ */
+Promise.prototype.rawDispatch = function Promise_rawDispatch(resolve, op, args) {
+    var self = this;
+    asap(function Promise_dispatch_task() {
+        Q_getHandler(self).dispatch(resolve, op, args);
+    });
+};
+
+/**
+ * TODO
+ */
+Promise.prototype.get = function Promise_get(name) {
+    return this.dispatch("get", [name]);
+};
+
+/**
+ * TODO
+ */
+Promise.prototype.invoke = function Promise_invoke(name /*...args*/) {
+    var args = new Array(arguments.length - 1);
+    for (var index = 1; index < arguments.length; index++) {
+        args[index - 1] = arguments[index];
+    }
+    return this.dispatch("invoke", [name, args]);
+};
+
+/**
+ * TODO
+ */
+Promise.prototype.apply = function Promise_apply(thisp, args) {
+    return this.dispatch("call", [args, thisp]);
+};
+
+/**
+ * TODO
+ */
+Promise.prototype.call = function Promise_call(thisp /*, ...args*/) {
+    var args = new Array(Math.max(0, arguments.length - 1));
+    for (var index = 1; index < arguments.length; index++) {
+        args[index - 1] = arguments[index];
+    }
+    return this.dispatch("call", [args, thisp]);
+};
+
+/**
+ * TODO
+ */
+Promise.prototype.bind = function Promise_bind(thisp /*, ...args*/) {
+    var self = this;
+    var args = new Array(Math.max(0, arguments.length - 1));
+    for (var index = 1; index < arguments.length; index++) {
+        args[index - 1] = arguments[index];
+    }
+    return function Promise_bind_bound(/*...args*/) {
+        var boundArgs = args.slice();
+        for (var index = 0; index < arguments.length; index++) {
+            boundArgs[boundArgs.length] = arguments[index];
+        }
+        return self.dispatch("call", [boundArgs, thisp]);
+    };
+};
+
+/**
+ * TODO
+ */
+Promise.prototype.keys = function Promise_keys() {
+    return this.dispatch("keys", []);
+};
+
+/**
+ * TODO
+ */
+Promise.prototype.iterate = function Promise_iterate() {
+    return this.dispatch("iterate", []);
+};
+
+/**
+ * TODO
+ */
+Promise.prototype.spread = function Promise_spread(fulfilled, rejected, ms) {
+    return this.all().then(function Promise_spread_fulfilled(array) {
+        return fulfilled.apply(void 0, array);
+    }, rejected, ms);
+};
+
+/**
+ * Causes a promise to be rejected if it does not get fulfilled before
+ * some milliseconds time out.
+ * @param {Number} milliseconds timeout
+ * @param {String} custom error message (optional)
+ * @returns a promise for the resolution of the given promise if it is
+ * fulfilled before the timeout, otherwise rejected.
+ */
+Promise.prototype.timeout = function Promsie_timeout(ms, message) {
+    var deferred = defer();
+    var timeoutId = setTimeout(function Promise_timeout_task() {
+        deferred.reject(new Error(message || "Timed out after " + ms + " ms"));
+    }, ms);
+
+    this.then(function Promise_timeout_fulfilled(value) {
+        clearTimeout(timeoutId);
+        deferred.resolve(value);
+    }, function Promise_timeout_rejected(error) {
+        clearTimeout(timeoutId);
+        deferred.reject(error);
+    });
+
+    return deferred.promise;
+};
+
+/**
+ * Returns a promise for the given value (or promised value), some
+ * milliseconds after it resolved. Passes rejections immediately.
+ * @param {Any*} promise
+ * @param {Number} milliseconds
+ * @returns a promise for the resolution of the given promise after milliseconds
+ * time has elapsed since the resolution of the given promise.
+ * If the given promise rejects, that is passed immediately.
+ */
+Promise.prototype.delay = function Promise_delay(ms) {
+    return this.then(function Promise_delay_fulfilled(value) {
+        var deferred = defer();
+        deferred.setEstimate(Date.now() + ms);
+        setTimeout(function Promise_delay_task() {
+            deferred.resolve(value);
+        }, ms);
+        return deferred.promise;
+    }, null, ms);
+};
+
+/**
+ * TODO
+ */
+Promise.prototype.pull = function Promise_pull() {
+    return this.dispatch("pull", []);
+};
+
+/**
+ * TODO
+ */
+Promise.prototype.pass = function Promise_pass() {
+    if (!this.toBePassed()) {
+        return new Promise(new Passed(this));
+    } else {
+        return this;
+    }
+};
+
+
+// Thus begins the portion dedicated to the deferred
+
+var promises = new WeakMap();
+
+function Deferred(promise) {
+    this.promise = promise;
+    // A deferred has an intrinsic promise, denoted by its hidden handler
+    // property.  The promise property of the deferred may be assigned to a
+    // different promise (as it is in a Queue), but the intrinsic promise does
+    // not change.
+    promises.set(this, promise);
+    var self = this;
+    var resolve = this.resolve;
+    this.resolve = function (value) {
+        resolve.call(self, value);
+    };
+    var reject = this.reject;
+    this.reject = function (error) {
+        reject.call(self, error);
+    };
+}
+
+/**
+ * TODO
+ */
+Deferred.prototype.resolve = function Deferred_resolve(value) {
+    var handler = Q_getHandler(promises.get(this));
+    if (!handler.messages) {
+        return;
+    }
+    handler.become(Q(value));
+};
+
+/**
+ * TODO
+ */
+Deferred.prototype.reject = function Deferred_reject(reason) {
+    var handler = Q_getHandler(promises.get(this));
+    if (!handler.messages) {
+        return;
+    }
+    handler.become(Q_reject(reason));
+};
+
+/**
+ * TODO
+ */
+Deferred.prototype.setEstimate = function Deferred_setEstimate(estimate) {
+    estimate = +estimate;
+    if (estimate !== estimate) {
+        estimate = Infinity;
+    }
+    if (estimate < 1e12 && estimate !== -Infinity) {
+        throw new Error("Estimate values should be a number of miliseconds in the future");
+    }
+    var handler = Q_getHandler(promises.get(this));
+    // TODO There is a bit of capability leakage going on here. The Deferred
+    // should only be able to set the estimate for its original
+    // Pending, not for any handler that promise subsequently became.
+    if (handler.setEstimate) {
+        handler.setEstimate(estimate);
+    }
+};
+
+// Thus ends the public interface
+
+// Thus begins the portion dedicated to handlers
+
+function Fulfilled(value) {
+    this.value = value;
+    this.estimate = Date.now();
+}
+
+Fulfilled.prototype.state = "fulfilled";
+
+Fulfilled.prototype.inspect = function Fulfilled_inspect() {
+    return {state: "fulfilled", value: this.value};
+};
+
+Fulfilled.prototype.dispatch = function Fulfilled_dispatch(
+    resolve, op, operands
+) {
+    var result;
+    if (
+        op === "then" ||
+        op === "get" ||
+        op === "call" ||
+        op === "invoke" ||
+        op === "keys" ||
+        op === "iterate" ||
+        op === "pull"
+    ) {
+        try {
+            result = this[op].apply(this, operands);
+        } catch (exception) {
+            result = Q_reject(exception);
+        }
+    } else if (op === "estimate") {
+        operands[0].call(void 0, this.estimate);
+    } else {
+        var error = new Error(
+            "Fulfilled promises do not support the " + op + " operator"
+        );
+        result = Q_reject(error);
+    }
+    if (resolve) {
+        resolve(result);
+    }
+};
+
+Fulfilled.prototype.then = function Fulfilled_then() {
+    return this.value;
+};
+
+Fulfilled.prototype.get = function Fulfilled_get(name) {
+    return this.value[name];
+};
+
+Fulfilled.prototype.call = function Fulfilled_call(args, thisp) {
+    return this.callInvoke(this.value, args, thisp);
+};
+
+Fulfilled.prototype.invoke = function Fulfilled_invoke(name, args) {
+    return this.callInvoke(this.value[name], args, this.value);
+};
+
+Fulfilled.prototype.callInvoke = function Fulfilled_callInvoke(callback, args, thisp) {
+    var waitToBePassed;
+    for (var index = 0; index < args.length; index++) {
+        if (Q_isPromise(args[index]) && args[index].toBePassed()) {
+            waitToBePassed = waitToBePassed || [];
+            waitToBePassed.push(args[index]);
+        }
+    }
+    if (waitToBePassed) {
+        var self = this;
+        return Q_all(waitToBePassed).then(function () {
+            return self.callInvoke(callback, args.map(function (arg) {
+                if (Q_isPromise(arg) && arg.toBePassed()) {
+                    return arg.inspect().value;
+                } else {
+                    return arg;
+                }
+            }), thisp);
+        });
+    } else {
+        return callback.apply(thisp, args);
+    }
+};
+
+Fulfilled.prototype.keys = function Fulfilled_keys() {
+    return Object.keys(this.value);
+};
+
+Fulfilled.prototype.iterate = function Fulfilled_iterate() {
+    return iterate(this.value);
+};
+
+Fulfilled.prototype.pull = function Fulfilled_pull() {
+    var result;
+    if (Object(this.value) === this.value) {
+        result = Array.isArray(this.value) ? [] : {};
+        for (var name in this.value) {
+            result[name] = this.value[name];
+        }
+    } else {
+        result = this.value;
+    }
+    return Q.push(result);
+};
+
+
+function Rejected(reason) {
+    this.reason = reason;
+    this.estimate = Infinity;
+}
+
+Rejected.prototype.state = "rejected";
+
+Rejected.prototype.inspect = function Rejected_inspect() {
+    return {state: "rejected", reason: this.reason};
+};
+
+Rejected.prototype.dispatch = function Rejected_dispatch(
+    resolve, op, operands
+) {
+    var result;
+    if (op === "then") {
+        result = this.then(resolve, operands[0]);
+    } else {
+        result = this;
+    }
+    if (resolve) {
+        resolve(result);
+    }
+};
+
+Rejected.prototype.then = function Rejected_then(
+    resolve, rejected
+) {
+    return rejected ? rejected(this.reason) : this;
+};
+
+
+function Pending() {
+    // if "messages" is an "Array", that indicates that the promise has not yet
+    // been resolved.  If it is "undefined", it has been resolved.  Each
+    // element of the messages array is itself an array of complete arguments to
+    // forward to the resolved promise.  We coerce the resolution value to a
+    // promise using the `resolve` function because it handles both fully
+    // non-thenable values and other thenables gracefully.
+    this.messages = [];
+    this.observers = [];
+    this.estimate = Infinity;
+}
+
+Pending.prototype.state = "pending";
+
+Pending.prototype.inspect = function Pending_inspect() {
+    return {state: "pending"};
+};
+
+Pending.prototype.dispatch = function Pending_dispatch(resolve, op, operands) {
+    this.messages.push([resolve, op, operands]);
+    if (op === "estimate") {
+        this.observers.push(operands[0]);
+        var self = this;
+        asap(function Pending_dispatch_task() {
+            operands[0].call(void 0, self.estimate);
+        });
+    }
+};
+
+Pending.prototype.become = function Pending_become(promise) {
+    this.became = theViciousCycle;
+    var handler = Q_getHandler(promise);
+    this.became = handler;
+
+    handlers.set(promise, handler);
+    this.promise = void 0;
+
+    this.messages.forEach(function Pending_become_eachMessage(message) {
+        // makeQ does not have this asap call, so it must be queueing events
+        // downstream. TODO look at makeQ to ascertain
+        asap(function Pending_become_eachMessage_task() {
+            var handler = Q_getHandler(promise);
+            handler.dispatch.apply(handler, message);
+        });
+    });
+
+    this.messages = void 0;
+    this.observers = void 0;
+};
+
+Pending.prototype.setEstimate = function Pending_setEstimate(estimate) {
+    if (this.observers) {
+        var self = this;
+        self.estimate = estimate;
+        this.observers.forEach(function Pending_eachObserver(observer) {
+            asap(function Pending_setEstimate_eachObserver_task() {
+                observer.call(void 0, estimate);
+            });
+        });
+    }
+};
+
+function Thenable(thenable) {
+    this.thenable = thenable;
+    this.became = null;
+    this.estimate = Infinity;
+}
+
+Thenable.prototype.state = "thenable";
+
+Thenable.prototype.inspect = function Thenable_inspect() {
+    return {state: "pending"};
+};
+
+Thenable.prototype.cast = function Thenable_cast() {
+    if (!this.became) {
+        var deferred = defer();
+        var thenable = this.thenable;
+        asap(function Thenable_cast_task() {
+            try {
+                thenable.then(deferred.resolve, deferred.reject);
+            } catch (exception) {
+                deferred.reject(exception);
+            }
+        });
+        this.became = Q_getHandler(deferred.promise);
+    }
+    return this.became;
+};
+
+Thenable.prototype.dispatch = function Thenable_dispatch(resolve, op, args) {
+    this.cast().dispatch(resolve, op, args);
+};
+
+
+function Passed(promise) {
+    this.promise = promise;
+}
+
+Passed.prototype.state = "passed";
+
+Passed.prototype.inspect = function Passed_inspect() {
+    return this.promise.inspect();
+};
+
+Passed.prototype.dispatch = function Passed_dispatch(resolve, op, args) {
+    return this.promise.rawDispatch(resolve, op, args);
+};
+
+
+// Thus begins the Q Node.js bridge
+
+/**
+ * Calls a method of a Node-style object that accepts a Node-style
+ * callback, forwarding the given variadic arguments, plus a provided
+ * callback argument.
+ * @param object an object that has the named method
+ * @param {String} name name of the method of object
+ * @param ...args arguments to pass to the method; the callback will
+ * be provided by Q and appended to these arguments.
+ * @returns a promise for the value or error
+ */
+Q.ninvoke = function Q_ninvoke(object, name /*...args*/) {
+    var args = new Array(Math.max(0, arguments.length - 1));
+    for (var index = 2; index < arguments.length; index++) {
+        args[index - 2] = arguments[index];
+    }
+    var deferred = Q.defer();
+    args[index - 2] = deferred.makeNodeResolver();
+    Q(object).dispatch("invoke", [name, args]).catch(deferred.reject);
+    return deferred.promise;
+};
+
+Promise.prototype.ninvoke = function Promise_ninvoke(name /*...args*/) {
+    var args = new Array(arguments.length);
+    for (var index = 1; index < arguments.length; index++) {
+        args[index - 1] = arguments[index];
+    }
+    var deferred = Q.defer();
+    args[index - 1] = deferred.makeNodeResolver();
+    this.dispatch("invoke", [name, args]).catch(deferred.reject);
+    return deferred.promise;
+};
+
+/**
+ * Wraps a Node.js continuation passing function and returns an equivalent
+ * version that returns a promise.
+ * @example
+ * Q.denodeify(FS.readFile)(__filename, "utf-8")
+ * .then(console.log)
+ * .done()
+ */
+Q.denodeify = function Q_denodeify(callback, pattern) {
+    return function denodeified() {
+        var args = new Array(arguments.length + 1);
+        var index = 0;
+        for (; index < arguments.length; index++) {
+            args[index] = arguments[index];
+        }
+        var deferred = Q.defer();
+        args[index] = deferred.makeNodeResolver(pattern);
+        Q(callback).apply(this, args).catch(deferred.reject);
+        return deferred.promise;
+    };
+};
+
+/**
+ * Creates a Node.js-style callback that will resolve or reject the deferred
+ * promise.
+ * @param unpack `true` means that the Node.js-style-callback accepts a
+ * fixed or variable number of arguments and that the deferred should be resolved
+ * with an array of these value arguments, or rejected with the error argument.
+ * An array of names means that the Node.js-style-callback accepts a fixed
+ * number of arguments, and that the resolution should be an object with
+ * properties corresponding to the given names and respective value arguments.
+ * @returns a nodeback
+ */
+Deferred.prototype.makeNodeResolver = function (unpack) {
+    var resolve = this.resolve;
+    if (unpack === true) {
+        return function variadicNodebackToResolver(error) {
+            if (error) {
+                resolve(Q_reject(error));
+            } else {
+                var value = new Array(Math.max(0, arguments.length - 1));
+                for (var index = 1; index < arguments.length; index++) {
+                    value[index - 1] = arguments[index];
+                }
+                resolve(value);
+            }
+        };
+    } else if (unpack) {
+        return function namedArgumentNodebackToResolver(error) {
+            if (error) {
+                resolve(Q_reject(error));
+            } else {
+                var value = {};
+                for (var index = 0; index < unpack.length; index++) {
+                    value[unpack[index]] = arguments[index + 1];
+                }
+                resolve(value);
+            }
+        };
+    } else {
+        return function nodebackToResolver(error, value) {
+            if (error) {
+                resolve(Q_reject(error));
+            } else {
+                resolve(value);
+            }
+        };
+    }
+};
+
+/**
+ * TODO
+ */
+Promise.prototype.nodeify = function Promise_nodeify(nodeback) {
+    if (nodeback) {
+        this.done(function (value) {
+            nodeback(null, value);
+        }, nodeback);
+    } else {
+        return this;
+    }
+};
+
+
+// DEPRECATED
+
+Q.nextTick = deprecate(asap, "nextTick", "asap package");
+
+Q.resolve = deprecate(Q, "resolve", "Q");
+
+Q.fulfill = deprecate(Q, "fulfill", "Q");
+
+Q.isPromiseAlike = deprecate(isThenable, "isPromiseAlike", "(not supported)");
+
+Q.fail = deprecate(function (value, rejected) {
+    return Q(value).catch(rejected);
+}, "Q.fail", "Q(value).catch");
+
+Q.fin = deprecate(function (value, regardless) {
+    return Q(value).finally(regardless);
+}, "Q.fin", "Q(value).finally");
+
+Q.progress = deprecate(function (value) {
+    return value;
+}, "Q.progress", "no longer supported");
+
+Q.thenResolve = deprecate(function (promise, value) {
+    return Q(promise).thenResolve(value);
+}, "thenResolve", "Q(value).thenResolve");
+
+Q.thenReject = deprecate(function (promise, reason) {
+    return Q(promise).thenResolve(reason);
+}, "thenResolve", "Q(value).thenResolve");
+
+Q.isPending = deprecate(function (value) {
+    return Q(value).isPending();
+}, "isPending", "Q(value).isPending");
+
+Q.isFulfilled = deprecate(function (value) {
+    return Q(value).isFulfilled();
+}, "isFulfilled", "Q(value).isFulfilled");
+
+Q.isRejected = deprecate(function (value) {
+    return Q(value).isRejected();
+}, "isRejected", "Q(value).isRejected");
+
+Q.master = deprecate(function (value) {
+    return value;
+}, "master", "no longer necessary");
+
+Q.makePromise = function () {
+    throw new Error("makePromise is no longer supported");
+};
+
+Q.dispatch = deprecate(function (value, op, operands) {
+    return Q(value).dispatch(op, operands);
+}, "dispatch", "Q(value).dispatch");
+
+Q.get = deprecate(function (object, name) {
+    return Q(object).get(name);
+}, "get", "Q(value).get");
+
+Q.keys = deprecate(function (object) {
+    return Q(object).keys();
+}, "keys", "Q(value).keys");
+
+Q.post = deprecate(function (object, name, args) {
+    return Q(object).post(name, args);
+}, "post", "Q(value).invoke (spread arguments)");
+
+Q.mapply = deprecate(function (object, name, args) {
+    return Q(object).post(name, args);
+}, "post", "Q(value).invoke (spread arguments)");
+
+Q.send = deprecate(function (object, name) {
+    return Q(object).post(name, Array.prototype.slice.call(arguments, 2));
+}, "send", "Q(value).invoke");
+
+Q.set = function () {
+    throw new Error("Q.set no longer supported");
+};
+
+Q.delete = function () {
+    throw new Error("Q.delete no longer supported");
+};
+
+Q.nearer = deprecate(function (value) {
+    if (Q_isPromise(value) && value.isFulfilled()) {
+        return value.inspect().value;
+    } else {
+        return value;
+    }
+}, "nearer", "inspect().value (+nuances)");
+
+Q.fapply = deprecate(function (callback, args) {
+    return Q(callback).dispatch("call", [args]);
+}, "fapply", "Q(callback).apply(thisp, args)");
+
+Q.fcall = deprecate(function (callback /*, ...args*/) {
+    return Q(callback).dispatch("call", [Array.prototype.slice.call(arguments, 1)]);
+}, "fcall", "Q(callback).call(thisp, ...args)");
+
+Q.fbind = deprecate(function (object /*...args*/) {
+    var promise = Q(object);
+    var args = Array.prototype.slice.call(arguments, 1);
+    return function fbound() {
+        return promise.dispatch("call", [
+            args.concat(Array.prototype.slice.call(arguments)),
+            this
+        ]);
+    };
+}, "fbind", "bind with thisp");
+
+Q.promise = deprecate(Promise, "promise", "Promise");
+
+Promise.prototype.fapply = deprecate(function (args) {
+    return this.dispatch("call", [args]);
+}, "fapply", "apply with thisp");
+
+Promise.prototype.fcall = deprecate(function (/*...args*/) {
+    return this.dispatch("call", [Array.prototype.slice.call(arguments)]);
+}, "fcall", "try or call with thisp");
+
+Promise.prototype.fail = deprecate(function (rejected) {
+    return this.catch(rejected);
+}, "fail", "catch");
+
+Promise.prototype.fin = deprecate(function (regardless) {
+    return this.finally(regardless);
+}, "fin", "finally");
+
+Promise.prototype.set = function () {
+    throw new Error("Promise set no longer supported");
+};
+
+Promise.prototype.delete = function () {
+    throw new Error("Promise delete no longer supported");
+};
+
+Deferred.prototype.notify = deprecate(function () {
+}, "notify", "no longer supported");
+
+Promise.prototype.progress = deprecate(function () {
+    return this;
+}, "progress", "no longer supported");
+
+// alternative proposed by Redsandro, dropped in favor of post to streamline
+// the interface
+Promise.prototype.mapply = deprecate(function (name, args) {
+    return this.dispatch("invoke", [name, args]);
+}, "mapply", "invoke");
+
+Promise.prototype.fbind = deprecate(function () {
+    return Q.fbind.apply(Q, [void 0].concat(Array.prototype.slice.call(arguments)));
+}, "fbind", "bind(thisp, ...args)");
+
+// alternative proposed by Mark Miller, dropped in favor of invoke
+Promise.prototype.send = deprecate(function () {
+    return this.dispatch("invoke", [name, Array.prototype.slice.call(arguments, 1)]);
+}, "send", "invoke");
+
+// alternative proposed by Redsandro, dropped in favor of invoke
+Promise.prototype.mcall = deprecate(function () {
+    return this.dispatch("invoke", [name, Array.prototype.slice.call(arguments, 1)]);
+}, "mcall", "invoke");
+
+Promise.prototype.passByCopy = deprecate(function (value) {
+    return value;
+}, "passByCopy", "Q.passByCopy");
+
+// Deprecated Node.js bridge promise methods
+
+Q.nfapply = deprecate(function (callback, args) {
+    var deferred = Q.defer();
+    var nodeArgs = Array.prototype.slice.call(args);
+    nodeArgs.push(deferred.makeNodeResolver());
+    Q(callback).apply(this, nodeArgs).catch(deferred.reject);
+    return deferred.promise;
+}, "nfapply");
+
+Promise.prototype.nfapply = deprecate(function (args) {
+    return Q.nfapply(this, args);
+}, "nfapply");
+
+Q.nfcall = deprecate(function (callback /*...args*/) {
+    var args = Array.prototype.slice.call(arguments, 1);
+    return Q.nfapply(callback, args);
+}, "nfcall");
+
+Promise.prototype.nfcall = deprecate(function () {
+    var args = new Array(arguments.length);
+    for (var index = 0; index < arguments.length; index++) {
+        args[index] = arguments[index];
+    }
+    return Q.nfapply(this, args);
+}, "nfcall");
+
+Q.nfbind = deprecate(function (callback /*...args*/) {
+    var baseArgs = Array.prototype.slice.call(arguments, 1);
+    return function () {
+        var nodeArgs = baseArgs.concat(Array.prototype.slice.call(arguments));
+        var deferred = Q.defer();
+        nodeArgs.push(deferred.makeNodeResolver());
+        Q(callback).apply(this, nodeArgs).catch(deferred.reject);
+        return deferred.promise;
+    };
+}, "nfbind", "denodeify (with caveats)");
+
+Promise.prototype.nfbind = deprecate(function () {
+    var args = new Array(arguments.length);
+    for (var index = 0; index < arguments.length; index++) {
+        args[index] = arguments[index];
+    }
+    return Q.nfbind(this, args);
+}, "nfbind", "denodeify (with caveats)");
+
+Q.nbind = deprecate(function (callback, thisp /*...args*/) {
+    var baseArgs = Array.prototype.slice.call(arguments, 2);
+    return function () {
+        var nodeArgs = baseArgs.concat(Array.prototype.slice.call(arguments));
+        var deferred = Q.defer();
+        nodeArgs.push(deferred.makeNodeResolver());
+        function bound() {
+            return callback.apply(thisp, arguments);
+        }
+        Q(bound).apply(this, nodeArgs).catch(deferred.reject);
+        return deferred.promise;
+    };
+}, "nbind", "denodeify (with caveats)");
+
+Q.npost = deprecate(function (object, name, nodeArgs) {
+    var deferred = Q.defer();
+    nodeArgs.push(deferred.makeNodeResolver());
+    Q(object).dispatch("invoke", [name, nodeArgs]).catch(deferred.reject);
+    return deferred.promise;
+}, "npost", "ninvoke (with spread arguments)");
+
+Promise.prototype.npost = deprecate(function (name, args) {
+    return Q.npost(this, name, args);
+}, "npost", "Q.ninvoke (with caveats)");
+
+Q.nmapply = deprecate(Q.nmapply, "nmapply", "q/node nmapply");
+Promise.prototype.nmapply = deprecate(Promise.prototype.npost, "nmapply", "Q.nmapply");
+
+Q.nsend = deprecate(Q.ninvoke, "nsend", "q/node ninvoke");
+Q.nmcall = deprecate(Q.ninvoke, "nmcall", "q/node ninvoke");
+Promise.prototype.nsend = deprecate(Promise.prototype.ninvoke, "nsend", "q/node ninvoke");
+Promise.prototype.nmcall = deprecate(Promise.prototype.ninvoke, "nmcall", "q/node ninvoke");
+
+// All code before this point will be filtered from stack traces.
+var qEndingLine = captureLine();
+
diff --git a/node_modules/q/queue.js b/node_modules/q/queue.js
new file mode 100644
index 0000000..19e2337
--- /dev/null
+++ b/node_modules/q/queue.js
@@ -0,0 +1,25 @@
+"use strict";
+
+var Q = require("./q");
+
+module.exports = Queue;
+function Queue() {
+    if (!(this instanceof Queue)) {
+        return new Queue();
+    }
+    var ends = Q.defer();
+    this.put = function (value) {
+        var next = Q.defer();
+        ends.resolve({
+            head: value,
+            tail: next.promise
+        });
+        ends.resolve = next.resolve;
+    };
+    this.get = function () {
+        var result = ends.promise.get("head");
+        ends.promise = ends.promise.get("tail");
+        return result;
+    };
+}
+
diff --git a/node_modules/shelljs/.documentup.json b/node_modules/shelljs/.documentup.json
new file mode 100644
index 0000000..57fe301
--- /dev/null
+++ b/node_modules/shelljs/.documentup.json
@@ -0,0 +1,6 @@
+{
+  "name": "ShellJS",
+  "twitter": [
+    "r2r"
+  ]
+}
diff --git a/node_modules/shelljs/.jshintrc b/node_modules/shelljs/.jshintrc
new file mode 100644
index 0000000..a80c559
--- /dev/null
+++ b/node_modules/shelljs/.jshintrc
@@ -0,0 +1,7 @@
+{
+  "loopfunc": true,
+  "sub": true,
+  "undef": true,
+  "unused": true,
+  "node": true
+}
\ No newline at end of file
diff --git a/node_modules/shelljs/.npmignore b/node_modules/shelljs/.npmignore
new file mode 100644
index 0000000..6b20c38
--- /dev/null
+++ b/node_modules/shelljs/.npmignore
@@ -0,0 +1,2 @@
+test/
+tmp/
\ No newline at end of file
diff --git a/node_modules/shelljs/.travis.yml b/node_modules/shelljs/.travis.yml
new file mode 100644
index 0000000..99cdc74
--- /dev/null
+++ b/node_modules/shelljs/.travis.yml
@@ -0,0 +1,5 @@
+language: node_js
+node_js:
+  - "0.8"
+  - "0.10"
+  - "0.11"
diff --git a/node_modules/shelljs/LICENSE b/node_modules/shelljs/LICENSE
new file mode 100644
index 0000000..1b35ee9
--- /dev/null
+++ b/node_modules/shelljs/LICENSE
@@ -0,0 +1,26 @@
+Copyright (c) 2012, Artur Adib <aadib@mozilla.com>
+All rights reserved.
+
+You may use this project under the terms of the New BSD license as follows:
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+    * Neither the name of Artur Adib nor the
+      names of the contributors may be used to endorse or promote products
+      derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
+ARE DISCLAIMED. IN NO EVENT SHALL ARTUR ADIB BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 
+THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/node_modules/shelljs/README.md b/node_modules/shelljs/README.md
new file mode 100644
index 0000000..9120623
--- /dev/null
+++ b/node_modules/shelljs/README.md
@@ -0,0 +1,552 @@
+# ShellJS - Unix shell commands for Node.js [![Build Status](https://secure.travis-ci.org/arturadib/shelljs.png)](http://travis-ci.org/arturadib/shelljs)
+
+ShellJS is a portable **(Windows/Linux/OS X)** implementation of Unix shell commands on top of the Node.js API. You can use it to eliminate your shell script's dependency on Unix while still keeping its familiar and powerful commands. You can also install it globally so you can run it from outside Node projects - say goodbye to those gnarly Bash scripts!
+
+The project is [unit-tested](http://travis-ci.org/arturadib/shelljs) and battled-tested in projects like:
+
++ [PDF.js](http://github.com/mozilla/pdf.js) - Firefox's next-gen PDF reader
++ [Firebug](http://getfirebug.com/) - Firefox's infamous debugger
++ [JSHint](http://jshint.com) - Most popular JavaScript linter
++ [Zepto](http://zeptojs.com) - jQuery-compatible JavaScript library for modern browsers
++ [Yeoman](http://yeoman.io/) - Web application stack and development tool
++ [Deployd.com](http://deployd.com) - Open source PaaS for quick API backend generation
+
+and [many more](https://npmjs.org/browse/depended/shelljs).
+
+## Installing
+
+Via npm:
+
+```bash
+$ npm install [-g] shelljs
+```
+
+If the global option `-g` is specified, the binary `shjs` will be installed. This makes it possible to
+run ShellJS scripts much like any shell script from the command line, i.e. without requiring a `node_modules` folder:
+
+```bash
+$ shjs my_script
+```
+
+You can also just copy `shell.js` into your project's directory, and `require()` accordingly.
+
+
+## Examples
+
+### JavaScript
+
+```javascript
+require('shelljs/global');
+
+if (!which('git')) {
+  echo('Sorry, this script requires git');
+  exit(1);
+}
+
+// Copy files to release dir
+mkdir('-p', 'out/Release');
+cp('-R', 'stuff/*', 'out/Release');
+
+// Replace macros in each .js file
+cd('lib');
+ls('*.js').forEach(function(file) {
+  sed('-i', 'BUILD_VERSION', 'v0.1.2', file);
+  sed('-i', /.*REMOVE_THIS_LINE.*\n/, '', file);
+  sed('-i', /.*REPLACE_LINE_WITH_MACRO.*\n/, cat('macro.js'), file);
+});
+cd('..');
+
+// Run external tool synchronously
+if (exec('git commit -am "Auto-commit"').code !== 0) {
+  echo('Error: Git commit failed');
+  exit(1);
+}
+```
+
+### CoffeeScript
+
+```coffeescript
+require 'shelljs/global'
+
+if not which 'git'
+  echo 'Sorry, this script requires git'
+  exit 1
+
+# Copy files to release dir
+mkdir '-p', 'out/Release'
+cp '-R', 'stuff/*', 'out/Release'
+
+# Replace macros in each .js file
+cd 'lib'
+for file in ls '*.js'
+  sed '-i', 'BUILD_VERSION', 'v0.1.2', file
+  sed '-i', /.*REMOVE_THIS_LINE.*\n/, '', file
+  sed '-i', /.*REPLACE_LINE_WITH_MACRO.*\n/, cat 'macro.js', file
+cd '..'
+
+# Run external tool synchronously
+if (exec 'git commit -am "Auto-commit"').code != 0
+  echo 'Error: Git commit failed'
+  exit 1
+```
+
+## Global vs. Local
+
+The example above uses the convenience script `shelljs/global` to reduce verbosity. If polluting your global namespace is not desirable, simply require `shelljs`.
+
+Example:
+
+```javascript
+var shell = require('shelljs');
+shell.echo('hello world');
+```
+
+## Make tool
+
+A convenience script `shelljs/make` is also provided to mimic the behavior of a Unix Makefile. In this case all shell objects are global, and command line arguments will cause the script to execute only the corresponding function in the global `target` object. To avoid redundant calls, target functions are executed only once per script.
+
+Example (CoffeeScript):
+
+```coffeescript
+require 'shelljs/make'
+
+target.all = ->
+  target.bundle()
+  target.docs()
+
+target.bundle = ->
+  cd __dirname
+  mkdir 'build'
+  cd 'lib'
+  (cat '*.js').to '../build/output.js'
+
+target.docs = ->
+  cd __dirname
+  mkdir 'docs'
+  cd 'lib'
+  for file in ls '*.js'
+    text = grep '//@', file     # extract special comments
+    text.replace '//@', ''      # remove comment tags
+    text.to 'docs/my_docs.md'
+```
+
+To run the target `all`, call the above script without arguments: `$ node make`. To run the target `docs`: `$ node make docs`, and so on.
+
+
+
+<!-- 
+
+  DO NOT MODIFY BEYOND THIS POINT - IT'S AUTOMATICALLY GENERATED
+
+-->
+
+
+## Command reference
+
+
+All commands run synchronously, unless otherwise stated.
+
+
+### cd('dir')
+Changes to directory `dir` for the duration of the script
+
+
+### pwd()
+Returns the current directory.
+
+
+### ls([options ,] path [,path ...])
+### ls([options ,] path_array)
+Available options:
+
++ `-R`: recursive
++ `-A`: all files (include files beginning with `.`, except for `.` and `..`)
+
+Examples:
+
+```javascript
+ls('projs/*.js');
+ls('-R', '/users/me', '/tmp');
+ls('-R', ['/users/me', '/tmp']); // same as above
+```
+
+Returns array of files in the given path, or in current directory if no path provided.
+
+
+### find(path [,path ...])
+### find(path_array)
+Examples:
+
+```javascript
+find('src', 'lib');
+find(['src', 'lib']); // same as above
+find('.').filter(function(file) { return file.match(/\.js$/); });
+```
+
+Returns array of all files (however deep) in the given paths.
+
+The main difference from `ls('-R', path)` is that the resulting file names
+include the base directories, e.g. `lib/resources/file1` instead of just `file1`.
+
+
+### cp([options ,] source [,source ...], dest)
+### cp([options ,] source_array, dest)
+Available options:
+
++ `-f`: force
++ `-r, -R`: recursive
+
+Examples:
+
+```javascript
+cp('file1', 'dir1');
+cp('-Rf', '/tmp/*', '/usr/local/*', '/home/tmp');
+cp('-Rf', ['/tmp/*', '/usr/local/*'], '/home/tmp'); // same as above
+```
+
+Copies files. The wildcard `*` is accepted.
+
+
+### rm([options ,] file [, file ...])
+### rm([options ,] file_array)
+Available options:
+
++ `-f`: force
++ `-r, -R`: recursive
+
+Examples:
+
+```javascript
+rm('-rf', '/tmp/*');
+rm('some_file.txt', 'another_file.txt');
+rm(['some_file.txt', 'another_file.txt']); // same as above
+```
+
+Removes files. The wildcard `*` is accepted.
+
+
+### mv(source [, source ...], dest')
+### mv(source_array, dest')
+Available options:
+
++ `f`: force
+
+Examples:
+
+```javascript
+mv('-f', 'file', 'dir/');
+mv('file1', 'file2', 'dir/');
+mv(['file1', 'file2'], 'dir/'); // same as above
+```
+
+Moves files. The wildcard `*` is accepted.
+
+
+### mkdir([options ,] dir [, dir ...])
+### mkdir([options ,] dir_array)
+Available options:
+
++ `p`: full path (will create intermediate dirs if necessary)
+
+Examples:
+
+```javascript
+mkdir('-p', '/tmp/a/b/c/d', '/tmp/e/f/g');
+mkdir('-p', ['/tmp/a/b/c/d', '/tmp/e/f/g']); // same as above
+```
+
+Creates directories.
+
+
+### test(expression)
+Available expression primaries:
+
++ `'-b', 'path'`: true if path is a block device
++ `'-c', 'path'`: true if path is a character device
++ `'-d', 'path'`: true if path is a directory
++ `'-e', 'path'`: true if path exists
++ `'-f', 'path'`: true if path is a regular file
++ `'-L', 'path'`: true if path is a symboilc link
++ `'-p', 'path'`: true if path is a pipe (FIFO)
++ `'-S', 'path'`: true if path is a socket
+
+Examples:
+
+```javascript
+if (test('-d', path)) { /* do something with dir */ };
+if (!test('-f', path)) continue; // skip if it's a regular file
+```
+
+Evaluates expression using the available primaries and returns corresponding value.
+
+
+### cat(file [, file ...])
+### cat(file_array)
+
+Examples:
+
+```javascript
+var str = cat('file*.txt');
+var str = cat('file1', 'file2');
+var str = cat(['file1', 'file2']); // same as above
+```
+
+Returns a string containing the given file, or a concatenated string
+containing the files if more than one file is given (a new line character is
+introduced between each file). Wildcard `*` accepted.
+
+
+### 'string'.to(file)
+
+Examples:
+
+```javascript
+cat('input.txt').to('output.txt');
+```
+
+Analogous to the redirection operator `>` in Unix, but works with JavaScript strings (such as
+those returned by `cat`, `grep`, etc). _Like Unix redirections, `to()` will overwrite any existing file!_
+
+
+### 'string'.toEnd(file)
+
+Examples:
+
+```javascript
+cat('input.txt').toEnd('output.txt');
+```
+
+Analogous to the redirect-and-append operator `>>` in Unix, but works with JavaScript strings (such as
+those returned by `cat`, `grep`, etc).
+
+
+### sed([options ,] search_regex, replace_str, file)
+Available options:
+
++ `-i`: Replace contents of 'file' in-place. _Note that no backups will be created!_
+
+Examples:
+
+```javascript
+sed('-i', 'PROGRAM_VERSION', 'v0.1.3', 'source.js');
+sed(/.*DELETE_THIS_LINE.*\n/, '', 'source.js');
+```
+
+Reads an input string from `file` and performs a JavaScript `replace()` on the input
+using the given search regex and replacement string. Returns the new string after replacement.
+
+
+### grep([options ,] regex_filter, file [, file ...])
+### grep([options ,] regex_filter, file_array)
+Available options:
+
++ `-v`: Inverse the sense of the regex and print the lines not matching the criteria.
+
+Examples:
+
+```javascript
+grep('-v', 'GLOBAL_VARIABLE', '*.js');
+grep('GLOBAL_VARIABLE', '*.js');
+```
+
+Reads input string from given files and returns a string containing all lines of the
+file that match the given `regex_filter`. Wildcard `*` accepted.
+
+
+### which(command)
+
+Examples:
+
+```javascript
+var nodeExec = which('node');
+```
+
+Searches for `command` in the system's PATH. On Windows looks for `.exe`, `.cmd`, and `.bat` extensions.
+Returns string containing the absolute path to the command.
+
+
+### echo(string [,string ...])
+
+Examples:
+
+```javascript
+echo('hello world');
+var str = echo('hello world');
+```
+
+Prints string to stdout, and returns string with additional utility methods
+like `.to()`.
+
+
+### pushd([options,] [dir | '-N' | '+N'])
+
+Available options:
+
++ `-n`: Suppresses the normal change of directory when adding directories to the stack, so that only the stack is manipulated.
+
+Arguments:
+
++ `dir`: Makes the current working directory be the top of the stack, and then executes the equivalent of `cd dir`.
++ `+N`: Brings the Nth directory (counting from the left of the list printed by dirs, starting with zero) to the top of the list by rotating the stack.
++ `-N`: Brings the Nth directory (counting from the right of the list printed by dirs, starting with zero) to the top of the list by rotating the stack.
+
+Examples:
+
+```javascript
+// process.cwd() === '/usr'
+pushd('/etc'); // Returns /etc /usr
+pushd('+1');   // Returns /usr /etc
+```
+
+Save the current directory on the top of the directory stack and then cd to `dir`. With no arguments, pushd exchanges the top two directories. Returns an array of paths in the stack.
+
+### popd([options,] ['-N' | '+N'])
+
+Available options:
+
++ `-n`: Suppresses the normal change of directory when removing directories from the stack, so that only the stack is manipulated.
+
+Arguments:
+
++ `+N`: Removes the Nth directory (counting from the left of the list printed by dirs), starting with zero.
++ `-N`: Removes the Nth directory (counting from the right of the list printed by dirs), starting with zero.
+
+Examples:
+
+```javascript
+echo(process.cwd()); // '/usr'
+pushd('/etc');       // '/etc /usr'
+echo(process.cwd()); // '/etc'
+popd();              // '/usr'
+echo(process.cwd()); // '/usr'
+```
+
+When no arguments are given, popd removes the top directory from the stack and performs a cd to the new top directory. The elements are numbered from 0 starting at the first directory listed with dirs; i.e., popd is equivalent to popd +0. Returns an array of paths in the stack.
+
+### dirs([options | '+N' | '-N'])
+
+Available options:
+
++ `-c`: Clears the directory stack by deleting all of the elements.
+
+Arguments:
+
++ `+N`: Displays the Nth directory (counting from the left of the list printed by dirs when invoked without options), starting with zero.
++ `-N`: Displays the Nth directory (counting from the right of the list printed by dirs when invoked without options), starting with zero.
+
+Display the list of currently remembered directories. Returns an array of paths in the stack, or a single path if +N or -N was specified.
+
+See also: pushd, popd
+
+
+### exit(code)
+Exits the current process with the given exit code.
+
+### env['VAR_NAME']
+Object containing environment variables (both getter and setter). Shortcut to process.env.
+
+### exec(command [, options] [, callback])
+Available options (all `false` by default):
+
++ `async`: Asynchronous execution. Defaults to true if a callback is provided.
++ `silent`: Do not echo program output to console.
+
+Examples:
+
+```javascript
+var version = exec('node --version', {silent:true}).output;
+
+var child = exec('some_long_running_process', {async:true});
+child.stdout.on('data', function(data) {
+  /* ... do something with data ... */
+});
+
+exec('some_long_running_process', function(code, output) {
+  console.log('Exit code:', code);
+  console.log('Program output:', output);
+});
+```
+
+Executes the given `command` _synchronously_, unless otherwise specified.
+When in synchronous mode returns the object `{ code:..., output:... }`, containing the program's
+`output` (stdout + stderr)  and its exit `code`. Otherwise returns the child process object, and
+the `callback` gets the arguments `(code, output)`.
+
+**Note:** For long-lived processes, it's best to run `exec()` asynchronously as
+the current synchronous implementation uses a lot of CPU. This should be getting
+fixed soon.
+
+
+### chmod(octal_mode || octal_string, file)
+### chmod(symbolic_mode, file)
+
+Available options:
+
++ `-v`: output a diagnostic for every file processed
++ `-c`: like verbose but report only when a change is made
++ `-R`: change files and directories recursively
+
+Examples:
+
+```javascript
+chmod(755, '/Users/brandon');
+chmod('755', '/Users/brandon'); // same as above
+chmod('u+x', '/Users/brandon');
+```
+
+Alters the permissions of a file or directory by either specifying the
+absolute permissions in octal form or expressing the changes in symbols.
+This command tries to mimic the POSIX behavior as much as possible.
+Notable exceptions:
+
++ In symbolic modes, 'a-r' and '-r' are identical.  No consideration is
+  given to the umask.
++ There is no "quiet" option since default behavior is to run silent.
+
+
+## Non-Unix commands
+
+
+### tempdir()
+
+Examples:
+
+```javascript
+var tmp = tempdir(); // "/tmp" for most *nix platforms
+```
+
+Searches and returns string containing a writeable, platform-dependent temporary directory.
+Follows Python's [tempfile algorithm](http://docs.python.org/library/tempfile.html#tempfile.tempdir).
+
+
+### error()
+Tests if error occurred in the last command. Returns `null` if no error occurred,
+otherwise returns string explaining the error
+
+
+## Configuration
+
+
+### config.silent
+Example:
+
+```javascript
+var silentState = config.silent; // save old silent state
+config.silent = true;
+/* ... */
+config.silent = silentState; // restore old silent state
+```
+
+Suppresses all command output if `true`, except for `echo()` calls.
+Default is `false`.
+
+### config.fatal
+Example:
+
+```javascript
+config.fatal = true;
+cp('this_file_does_not_exist', '/dev/null'); // dies here
+/* more commands... */
+```
+
+If `true` the script will die on errors. Default is `false`.
diff --git a/node_modules/shelljs/bin/shjs b/node_modules/shelljs/bin/shjs
new file mode 100755
index 0000000..d239a7a
--- /dev/null
+++ b/node_modules/shelljs/bin/shjs
@@ -0,0 +1,51 @@
+#!/usr/bin/env node
+require('../global');
+
+if (process.argv.length < 3) {
+  console.log('ShellJS: missing argument (script name)');
+  console.log();
+  process.exit(1);
+}
+
+var args,
+  scriptName = process.argv[2];
+env['NODE_PATH'] = __dirname + '/../..';
+
+if (!scriptName.match(/\.js/) && !scriptName.match(/\.coffee/)) {
+  if (test('-f', scriptName + '.js'))
+    scriptName += '.js';
+  if (test('-f', scriptName + '.coffee'))
+    scriptName += '.coffee';
+}
+
+if (!test('-f', scriptName)) {
+  console.log('ShellJS: script not found ('+scriptName+')');
+  console.log();
+  process.exit(1);
+}
+
+args = process.argv.slice(3);
+
+for (var i = 0, l = args.length; i < l; i++) {
+  if (args[i][0] !== "-"){
+    args[i] = '"' + args[i] + '"'; // fixes arguments with multiple words
+  }
+}
+
+if (scriptName.match(/\.coffee$/)) {
+  //
+  // CoffeeScript
+  //
+  if (which('coffee')) {
+    exec('coffee ' + scriptName + ' ' + args.join(' '), { async: true });
+  } else {
+    console.log('ShellJS: CoffeeScript interpreter not found');
+    console.log();
+    process.exit(1);
+  }
+} else {
+  //
+  // JavaScript
+  //
+  exec('node ' + scriptName + ' ' + args.join(' '), { async: true });
+}
diff --git a/node_modules/shelljs/global.js b/node_modules/shelljs/global.js
new file mode 100644
index 0000000..97f0033
--- /dev/null
+++ b/node_modules/shelljs/global.js
@@ -0,0 +1,3 @@
+var shell = require('./shell.js');
+for (var cmd in shell)
+  global[cmd] = shell[cmd];
diff --git a/node_modules/shelljs/make.js b/node_modules/shelljs/make.js
new file mode 100644
index 0000000..53e5e81
--- /dev/null
+++ b/node_modules/shelljs/make.js
@@ -0,0 +1,47 @@
+require('./global');
+
+global.config.fatal = true;
+global.target = {};
+
+// This ensures we only execute the script targets after the entire script has
+// been evaluated
+var args = process.argv.slice(2);
+setTimeout(function() {
+  var t;
+
+  if (args.length === 1 && args[0] === '--help') {
+    console.log('Available targets:');
+    for (t in global.target)
+      console.log('  ' + t);
+    return;
+  }
+
+  // Wrap targets to prevent duplicate execution
+  for (t in global.target) {
+    (function(t, oldTarget){
+
+      // Wrap it
+      global.target[t] = function(force) {
+        if (oldTarget.done && !force)
+          return;
+        oldTarget.done = true;
+        return oldTarget.apply(oldTarget, arguments);
+      };
+
+    })(t, global.target[t]);
+  }
+
+  // Execute desired targets
+  if (args.length > 0) {
+    args.forEach(function(arg) {
+      if (arg in global.target)
+        global.target[arg]();
+      else {
+        console.log('no such target: ' + arg);
+      }
+    });
+  } else if ('all' in global.target) {
+    global.target.all();
+  }
+
+}, 0);
diff --git a/node_modules/shelljs/package.json b/node_modules/shelljs/package.json
new file mode 100644
index 0000000..61f8379
--- /dev/null
+++ b/node_modules/shelljs/package.json
@@ -0,0 +1,61 @@
+{
+  "name": "shelljs",
+  "version": "0.2.6",
+  "author": {
+    "name": "Artur Adib",
+    "email": "aadib@mozilla.com"
+  },
+  "description": "Portable Unix shell commands for Node.js",
+  "keywords": [
+    "unix",
+    "shell",
+    "makefile",
+    "make",
+    "jake",
+    "synchronous"
+  ],
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/arturadib/shelljs.git"
+  },
+  "homepage": "http://github.com/arturadib/shelljs",
+  "main": "./shell.js",
+  "scripts": {
+    "test": "node scripts/run-tests"
+  },
+  "bin": {
+    "shjs": "./bin/shjs"
+  },
+  "dependencies": {},
+  "devDependencies": {
+    "jshint": "~2.1.11"
+  },
+  "optionalDependencies": {},
+  "engines": {
+    "node": ">=0.8.0"
+  },
+  "bugs": {
+    "url": "https://github.com/arturadib/shelljs/issues"
+  },
+  "_id": "shelljs@0.2.6",
+  "dist": {
+    "shasum": "90492d72ffcc8159976baba62fb0f6884f0c3378",
+    "tarball": "http://registry.npmjs.org/shelljs/-/shelljs-0.2.6.tgz"
+  },
+  "_from": "shelljs@0.2.6",
+  "_npmVersion": "1.3.8",
+  "_npmUser": {
+    "name": "artur",
+    "email": "arturadib@gmail.com"
+  },
+  "maintainers": [
+    {
+      "name": "artur",
+      "email": "arturadib@gmail.com"
+    }
+  ],
+  "directories": {},
+  "_shasum": "90492d72ffcc8159976baba62fb0f6884f0c3378",
+  "_resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.2.6.tgz",
+  "readme": "ERROR: No README data found!"
+}
diff --git a/node_modules/shelljs/scripts/generate-docs.js b/node_modules/shelljs/scripts/generate-docs.js
new file mode 100755
index 0000000..532fed9
--- /dev/null
+++ b/node_modules/shelljs/scripts/generate-docs.js
@@ -0,0 +1,21 @@
+#!/usr/bin/env node
+require('../global');
+
+echo('Appending docs to README.md');
+
+cd(__dirname + '/..');
+
+// Extract docs from shell.js
+var docs = grep('//@', 'shell.js');
+
+docs = docs.replace(/\/\/\@include (.+)/g, function(match, path) {
+  var file = path.match('.js$') ? path : path+'.js';
+  return grep('//@', file);
+});
+
+// Remove '//@'
+docs = docs.replace(/\/\/\@ ?/g, '');
+// Append docs to README
+sed('-i', /## Command reference(.|\n)*/, '## Command reference\n\n' + docs, 'README.md');
+
+echo('All done.');
diff --git a/node_modules/shelljs/scripts/run-tests.js b/node_modules/shelljs/scripts/run-tests.js
new file mode 100755
index 0000000..f9d31e0
--- /dev/null
+++ b/node_modules/shelljs/scripts/run-tests.js
@@ -0,0 +1,50 @@
+#!/usr/bin/env node
+require('../global');
+
+var path = require('path');
+
+var failed = false;
+
+//
+// Lint
+//
+JSHINT_BIN = './node_modules/jshint/bin/jshint';
+cd(__dirname + '/..');
+
+if (!test('-f', JSHINT_BIN)) {
+  echo('JSHint not found. Run `npm install` in the root dir first.');
+  exit(1);
+}
+
+if (exec(JSHINT_BIN + ' *.js test/*.js').code !== 0) {
+  failed = true;
+  echo('*** JSHINT FAILED! (return code != 0)');
+  echo();
+} else {
+  echo('All JSHint tests passed');
+  echo();
+}
+
+//
+// Unit tests
+//
+cd(__dirname + '/../test');
+ls('*.js').forEach(function(file) {
+  echo('Running test:', file);
+  if (exec('node ' + file).code !== 123) { // 123 avoids false positives (e.g. premature exit)
+    failed = true;
+    echo('*** TEST FAILED! (missing exit code "123")');
+    echo();
+  }
+});
+
+if (failed) {
+  echo();
+  echo('*******************************************************');
+  echo('WARNING: Some tests did not pass!');
+  echo('*******************************************************');
+  exit(1);
+} else {
+  echo();
+  echo('All tests passed.');
+}
diff --git a/node_modules/shelljs/shell.js b/node_modules/shelljs/shell.js
new file mode 100644
index 0000000..e56c5de
--- /dev/null
+++ b/node_modules/shelljs/shell.js
@@ -0,0 +1,153 @@
+//
+// ShellJS
+// Unix shell commands on top of Node's API
+//
+// Copyright (c) 2012 Artur Adib
+// http://github.com/arturadib/shelljs
+//
+
+var common = require('./src/common');
+
+
+//@
+//@ All commands run synchronously, unless otherwise stated.
+//@
+
+//@include ./src/cd
+var _cd = require('./src/cd');
+exports.cd = common.wrap('cd', _cd);
+
+//@include ./src/pwd
+var _pwd = require('./src/pwd');
+exports.pwd = common.wrap('pwd', _pwd);
+
+//@include ./src/ls
+var _ls = require('./src/ls');
+exports.ls = common.wrap('ls', _ls);
+
+//@include ./src/find
+var _find = require('./src/find');
+exports.find = common.wrap('find', _find);
+
+//@include ./src/cp
+var _cp = require('./src/cp');
+exports.cp = common.wrap('cp', _cp);
+
+//@include ./src/rm
+var _rm = require('./src/rm');
+exports.rm = common.wrap('rm', _rm);
+
+//@include ./src/mv
+var _mv = require('./src/mv');
+exports.mv = common.wrap('mv', _mv);
+
+//@include ./src/mkdir
+var _mkdir = require('./src/mkdir');
+exports.mkdir = common.wrap('mkdir', _mkdir);
+
+//@include ./src/test
+var _test = require('./src/test');
+exports.test = common.wrap('test', _test);
+
+//@include ./src/cat
+var _cat = require('./src/cat');
+exports.cat = common.wrap('cat', _cat);
+
+//@include ./src/to
+var _to = require('./src/to');
+String.prototype.to = common.wrap('to', _to);
+
+//@include ./src/toEnd
+var _toEnd = require('./src/toEnd');
+String.prototype.toEnd = common.wrap('toEnd', _toEnd);
+
+//@include ./src/sed
+var _sed = require('./src/sed');
+exports.sed = common.wrap('sed', _sed);
+
+//@include ./src/grep
+var _grep = require('./src/grep');
+exports.grep = common.wrap('grep', _grep);
+
+//@include ./src/which
+var _which = require('./src/which');
+exports.which = common.wrap('which', _which);
+
+//@include ./src/echo
+var _echo = require('./src/echo');
+exports.echo = _echo; // don't common.wrap() as it could parse '-options'
+
+//@include ./src/dirs
+var _dirs = require('./src/dirs').dirs;
+exports.dirs = common.wrap("dirs", _dirs);
+var _pushd = require('./src/dirs').pushd;
+exports.pushd = common.wrap('pushd', _pushd);
+var _popd = require('./src/dirs').popd;
+exports.popd = common.wrap("popd", _popd);
+
+//@
+//@ ### exit(code)
+//@ Exits the current process with the given exit code.
+exports.exit = process.exit;
+
+//@
+//@ ### env['VAR_NAME']
+//@ Object containing environment variables (both getter and setter). Shortcut to process.env.
+exports.env = process.env;
+
+//@include ./src/exec
+var _exec = require('./src/exec');
+exports.exec = common.wrap('exec', _exec, {notUnix:true});
+
+//@include ./src/chmod
+var _chmod = require('./src/chmod');
+exports.chmod = common.wrap('chmod', _chmod);
+
+
+
+//@
+//@ ## Non-Unix commands
+//@
+
+//@include ./src/tempdir
+var _tempDir = require('./src/tempdir');
+exports.tempdir = common.wrap('tempdir', _tempDir);
+
+
+//@include ./src/error
+var _error = require('./src/error');
+exports.error = _error;
+
+
+
+//@
+//@ ## Configuration
+//@
+
+exports.config = common.config;
+
+//@
+//@ ### config.silent
+//@ Example:
+//@
+//@ ```javascript
+//@ var silentState = config.silent; // save old silent state
+//@ config.silent = true;
+//@ /* ... */
+//@ config.silent = silentState; // restore old silent state
+//@ ```
+//@
+//@ Suppresses all command output if `true`, except for `echo()` calls.
+//@ Default is `false`.
+
+//@
+//@ ### config.fatal
+//@ Example:
+//@
+//@ ```javascript
+//@ config.fatal = true;
+//@ cp('this_file_does_not_exist', '/dev/null'); // dies here
+//@ /* more commands... */
+//@ ```
+//@
+//@ If `true` the script will die on errors. Default is `false`.
diff --git a/node_modules/shelljs/src/cat.js b/node_modules/shelljs/src/cat.js
new file mode 100644
index 0000000..f6f4d25
--- /dev/null
+++ b/node_modules/shelljs/src/cat.js
@@ -0,0 +1,43 @@
+var common = require('./common');
+var fs = require('fs');
+
+//@
+//@ ### cat(file [, file ...])
+//@ ### cat(file_array)
+//@
+//@ Examples:
+//@
+//@ ```javascript
+//@ var str = cat('file*.txt');
+//@ var str = cat('file1', 'file2');
+//@ var str = cat(['file1', 'file2']); // same as above
+//@ ```
+//@
+//@ Returns a string containing the given file, or a concatenated string
+//@ containing the files if more than one file is given (a new line character is
+//@ introduced between each file). Wildcard `*` accepted.
+function _cat(options, files) {
+  var cat = '';
+
+  if (!files)
+    common.error('no paths given');
+
+  if (typeof files === 'string')
+    files = [].slice.call(arguments, 1);
+  // if it's array leave it as it is
+
+  files = common.expand(files);
+
+  files.forEach(function(file) {
+    if (!fs.existsSync(file))
+      common.error('no such file or directory: ' + file);
+
+    cat += fs.readFileSync(file, 'utf8') + '\n';
+  });
+
+  if (cat[cat.length-1] === '\n')
+    cat = cat.substring(0, cat.length-1);
+
+  return common.ShellString(cat);
+}
+module.exports = _cat;
diff --git a/node_modules/shelljs/src/cd.js b/node_modules/shelljs/src/cd.js
new file mode 100644
index 0000000..230f432
--- /dev/null
+++ b/node_modules/shelljs/src/cd.js
@@ -0,0 +1,19 @@
+var fs = require('fs');
+var common = require('./common');
+
+//@
+//@ ### cd('dir')
+//@ Changes to directory `dir` for the duration of the script
+function _cd(options, dir) {
+  if (!dir)
+    common.error('directory not specified');
+
+  if (!fs.existsSync(dir))
+    common.error('no such file or directory: ' + dir);
+
+  if (!fs.statSync(dir).isDirectory())
+    common.error('not a directory: ' + dir);
+
+  process.chdir(dir);
+}
+module.exports = _cd;
diff --git a/node_modules/shelljs/src/chmod.js b/node_modules/shelljs/src/chmod.js
new file mode 100644
index 0000000..f288893
--- /dev/null
+++ b/node_modules/shelljs/src/chmod.js
@@ -0,0 +1,208 @@
+var common = require('./common');
+var fs = require('fs');
+var path = require('path');
+
+var PERMS = (function (base) {
+  return {
+    OTHER_EXEC  : base.EXEC,
+    OTHER_WRITE : base.WRITE,
+    OTHER_READ  : base.READ,
+
+    GROUP_EXEC  : base.EXEC  << 3,
+    GROUP_WRITE : base.WRITE << 3,
+    GROUP_READ  : base.READ << 3,
+
+    OWNER_EXEC  : base.EXEC << 6,
+    OWNER_WRITE : base.WRITE << 6,
+    OWNER_READ  : base.READ << 6,
+
+    // Literal octal numbers are apparently not allowed in "strict" javascript.  Using parseInt is
+    // the preferred way, else a jshint warning is thrown.
+    STICKY      : parseInt('01000', 8),
+    SETGID      : parseInt('02000', 8),
+    SETUID      : parseInt('04000', 8),
+
+    TYPE_MASK   : parseInt('0770000', 8)
+  };
+})({
+  EXEC  : 1,
+  WRITE : 2,
+  READ  : 4
+});
+
+//@
+//@ ### chmod(octal_mode || octal_string, file)
+//@ ### chmod(symbolic_mode, file)
+//@
+//@ Available options:
+//@
+//@ + `-v`: output a diagnostic for every file processed//@
+//@ + `-c`: like verbose but report only when a change is made//@
+//@ + `-R`: change files and directories recursively//@
+//@
+//@ Examples:
+//@
+//@ ```javascript
+//@ chmod(755, '/Users/brandon');
+//@ chmod('755', '/Users/brandon'); // same as above
+//@ chmod('u+x', '/Users/brandon');
+//@ ```
+//@
+//@ Alters the permissions of a file or directory by either specifying the
+//@ absolute permissions in octal form or expressing the changes in symbols.
+//@ This command tries to mimic the POSIX behavior as much as possible.
+//@ Notable exceptions:
+//@
+//@ + In symbolic modes, 'a-r' and '-r' are identical.  No consideration is
+//@   given to the umask.
+//@ + There is no "quiet" option since default behavior is to run silent.
+function _chmod(options, mode, filePattern) {
+  if (!filePattern) {
+    if (options.length > 0 && options.charAt(0) === '-') {
+      // Special case where the specified file permissions started with - to subtract perms, which
+      // get picked up by the option parser as command flags.
+      // If we are down by one argument and options starts with -, shift everything over.
+      filePattern = mode;
+      mode = options;
+      options = '';
+    }
+    else {
+      common.error('You must specify a file.');
+    }
+  }
+
+  options = common.parseOptions(options, {
+    'R': 'recursive',
+    'c': 'changes',
+    'v': 'verbose'
+  });
+
+  if (typeof filePattern === 'string') {
+    filePattern = [ filePattern ];
+  }
+
+  var files;
+
+  if (options.recursive) {
+    files = [];
+    common.expand(filePattern).forEach(function addFile(expandedFile) {
+      var stat = fs.lstatSync(expandedFile);
+
+      if (!stat.isSymbolicLink()) {
+        files.push(expandedFile);
+
+        if (stat.isDirectory()) {  // intentionally does not follow symlinks.
+          fs.readdirSync(expandedFile).forEach(function (child) {
+            addFile(expandedFile + '/' + child);
+          });
+        }
+      }
+    });
+  }
+  else {
+    files = common.expand(filePattern);
+  }
+
+  files.forEach(function innerChmod(file) {
+    file = path.resolve(file);
+    if (!fs.existsSync(file)) {
+      common.error('File not found: ' + file);
+    }
+
+    // When recursing, don't follow symlinks.
+    if (options.recursive && fs.lstatSync(file).isSymbolicLink()) {
+      return;
+    }
+
+    var perms = fs.statSync(file).mode;
+    var type = perms & PERMS.TYPE_MASK;
+
+    var newPerms = perms;
+
+    if (isNaN(parseInt(mode, 8))) {
+      // parse options
+      mode.split(',').forEach(function (symbolicMode) {
+        /*jshint regexdash:true */
+        var pattern = /([ugoa]*)([=\+-])([rwxXst]*)/i;
+        var matches = pattern.exec(symbolicMode);
+
+        if (matches) {
+          var applyTo = matches[1];
+          var operator = matches[2];
+          var change = matches[3];
+
+          var changeOwner = applyTo.indexOf('u') != -1 || applyTo === 'a' || applyTo === '';
+          var changeGroup = applyTo.indexOf('g') != -1 || applyTo === 'a' || applyTo === '';
+          var changeOther = applyTo.indexOf('o') != -1 || applyTo === 'a' || applyTo === '';
+
+          var changeRead   = change.indexOf('r') != -1;
+          var changeWrite  = change.indexOf('w') != -1;
+          var changeExec   = change.indexOf('x') != -1;
+          var changeSticky = change.indexOf('t') != -1;
+          var changeSetuid = change.indexOf('s') != -1;
+
+          var mask = 0;
+          if (changeOwner) {
+            mask |= (changeRead ? PERMS.OWNER_READ : 0) + (changeWrite ? PERMS.OWNER_WRITE : 0) + (changeExec ? PERMS.OWNER_EXEC : 0) + (changeSetuid ? PERMS.SETUID : 0);
+          }
+          if (changeGroup) {
+            mask |= (changeRead ? PERMS.GROUP_READ : 0) + (changeWrite ? PERMS.GROUP_WRITE : 0) + (changeExec ? PERMS.GROUP_EXEC : 0) + (changeSetuid ? PERMS.SETGID : 0);
+          }
+          if (changeOther) {
+            mask |= (changeRead ? PERMS.OTHER_READ : 0) + (changeWrite ? PERMS.OTHER_WRITE : 0) + (changeExec ? PERMS.OTHER_EXEC : 0);
+          }
+
+          // Sticky bit is special - it's not tied to user, group or other.
+          if (changeSticky) {
+            mask |= PERMS.STICKY;
+          }
+
+          switch (operator) {
+            case '+':
+              newPerms |= mask;
+              break;
+
+            case '-':
+              newPerms &= ~mask;
+              break;
+
+            case '=':
+              newPerms = type + mask;
+
+              // According to POSIX, when using = to explicitly set the permissions, setuid and setgid can never be cleared.
+              if (fs.statSync(file).isDirectory()) {
+                newPerms |= (PERMS.SETUID + PERMS.SETGID) & perms;
+              }
+              break;
+          }
+
+          if (options.verbose) {
+            log(file + ' -> ' + newPerms.toString(8));
+          }
+
+          if (perms != newPerms) {
+            if (!options.verbose && options.changes) {
+              log(file + ' -> ' + newPerms.toString(8));
+            }
+            fs.chmodSync(file, newPerms);
+          }
+        }
+        else {
+          common.error('Invalid symbolic mode change: ' + symbolicMode);
+        }
+      });
+    }
+    else {
+      // they gave us a full number
+      newPerms = type + parseInt(mode, 8);
+
+      // POSIX rules are that setuid and setgid can only be added using numeric form, but not cleared.
+      if (fs.statSync(file).isDirectory()) {
+        newPerms |= (PERMS.SETUID + PERMS.SETGID) & perms;
+      }
+
+      fs.chmodSync(file, newPerms);
+    }
+  });
+}
+module.exports = _chmod;
diff --git a/node_modules/shelljs/src/common.js b/node_modules/shelljs/src/common.js
new file mode 100644
index 0000000..fe20871
--- /dev/null
+++ b/node_modules/shelljs/src/common.js
@@ -0,0 +1,189 @@
+var os = require('os');
+var fs = require('fs');
+var _ls = require('./ls');
+
+// Module globals
+var config = {
+  silent: false,
+  fatal: false
+};
+exports.config = config;
+
+var state = {
+  error: null,
+  currentCmd: 'shell.js',
+  tempDir: null
+};
+exports.state = state;
+
+var platform = os.type().match(/^Win/) ? 'win' : 'unix';
+exports.platform = platform;
+
+function log() {
+  if (!config.silent)
+    console.log.apply(this, arguments);
+}
+exports.log = log;
+
+// Shows error message. Throws unless _continue or config.fatal are true
+function error(msg, _continue) {
+  if (state.error === null)
+    state.error = '';
+  state.error += state.currentCmd + ': ' + msg + '\n';
+
+  if (msg.length > 0)
+    log(state.error);
+
+  if (config.fatal)
+    process.exit(1);
+
+  if (!_continue)
+    throw '';
+}
+exports.error = error;
+
+// In the future, when Proxies are default, we can add methods like `.to()` to primitive strings.
+// For now, this is a dummy function to bookmark places we need such strings
+function ShellString(str) {
+  return str;
+}
+exports.ShellString = ShellString;
+
+// Returns {'alice': true, 'bob': false} when passed a dictionary, e.g.:
+//   parseOptions('-a', {'a':'alice', 'b':'bob'});
+function parseOptions(str, map) {
+  if (!map)
+    error('parseOptions() internal error: no map given');
+
+  // All options are false by default
+  var options = {};
+  for (var letter in map)
+    options[map[letter]] = false;
+
+  if (!str)
+    return options; // defaults
+
+  if (typeof str !== 'string')
+    error('parseOptions() internal error: wrong str');
+
+  // e.g. match[1] = 'Rf' for str = '-Rf'
+  var match = str.match(/^\-(.+)/);
+  if (!match)
+    return options;
+
+  // e.g. chars = ['R', 'f']
+  var chars = match[1].split('');
+
+  chars.forEach(function(c) {
+    if (c in map)
+      options[map[c]] = true;
+    else
+      error('option not recognized: '+c);
+  });
+
+  return options;
+}
+exports.parseOptions = parseOptions;
+
+// Expands wildcards with matching (ie. existing) file names.
+// For example:
+//   expand(['file*.js']) = ['file1.js', 'file2.js', ...]
+//   (if the files 'file1.js', 'file2.js', etc, exist in the current dir)
+function expand(list) {
+  var expanded = [];
+  list.forEach(function(listEl) {
+    // Wildcard present?
+    if (listEl.search(/\*/) > -1) {
+      _ls('', listEl).forEach(function(file) {
+        expanded.push(file);
+      });
+    } else {
+      expanded.push(listEl);
+    }
+  });
+  return expanded;
+}
+exports.expand = expand;
+
+// Normalizes _unlinkSync() across platforms to match Unix behavior, i.e.
+// file can be unlinked even if it's read-only, see https://github.com/joyent/node/issues/3006
+function unlinkSync(file) {
+  try {
+    fs.unlinkSync(file);
+  } catch(e) {
+    // Try to override file permission
+    if (e.code === 'EPERM') {
+      fs.chmodSync(file, '0666');
+      fs.unlinkSync(file);
+    } else {
+      throw e;
+    }
+  }
+}
+exports.unlinkSync = unlinkSync;
+
+// e.g. 'shelljs_a5f185d0443ca...'
+function randomFileName() {
+  function randomHash(count) {
+    if (count === 1)
+      return parseInt(16*Math.random(), 10).toString(16);
+    else {
+      var hash = '';
+      for (var i=0; i<count; i++)
+        hash += randomHash(1);
+      return hash;
+    }
+  }
+
+  return 'shelljs_'+randomHash(20);
+}
+exports.randomFileName = randomFileName;
+
+// extend(target_obj, source_obj1 [, source_obj2 ...])
+// Shallow extend, e.g.:
+//    extend({A:1}, {b:2}, {c:3}) returns {A:1, b:2, c:3}
+function extend(target) {
+  var sources = [].slice.call(arguments, 1);
+  sources.forEach(function(source) {
+    for (var key in source)
+      target[key] = source[key];
+  });
+
+  return target;
+}
+exports.extend = extend;
+
+// Common wrapper for all Unix-like commands
+function wrap(cmd, fn, options) {
+  return function() {
+    var retValue = null;
+
+    state.currentCmd = cmd;
+    state.error = null;
+
+    try {
+      var args = [].slice.call(arguments, 0);
+
+      if (options && options.notUnix) {
+        retValue = fn.apply(this, args);
+      } else {
+        if (args.length === 0 || typeof args[0] !== 'string' || args[0][0] !== '-')
+          args.unshift(''); // only add dummy option if '-option' not already present
+        retValue = fn.apply(this, args);
+      }
+    } catch (e) {
+      if (!state.error) {
+        // If state.error hasn't been set it's an error thrown by Node, not us - probably a bug...
+        console.log('shell.js: internal error');
+        console.log(e.stack || e);
+        process.exit(1);
+      }
+      if (config.fatal)
+        throw e;
+    }
+
+    state.currentCmd = 'shell.js';
+    return retValue;
+  };
+} // wrap
+exports.wrap = wrap;
diff --git a/node_modules/shelljs/src/cp.js b/node_modules/shelljs/src/cp.js
new file mode 100644
index 0000000..a1bc529
--- /dev/null
+++ b/node_modules/shelljs/src/cp.js
@@ -0,0 +1,200 @@
+var fs = require('fs');
+var path = require('path');
+var common = require('./common');
+
+// Buffered file copy, synchronous
+// (Using readFileSync() + writeFileSync() could easily cause a memory overflow
+//  with large files)
+function copyFileSync(srcFile, destFile) {
+  if (!fs.existsSync(srcFile))
+    common.error('copyFileSync: no such file or directory: ' + srcFile);
+
+  var BUF_LENGTH = 64*1024,
+      buf = new Buffer(BUF_LENGTH),
+      bytesRead = BUF_LENGTH,
+      pos = 0,
+      fdr = null,
+      fdw = null;
+
+  try {
+    fdr = fs.openSync(srcFile, 'r');
+  } catch(e) {
+    common.error('copyFileSync: could not read src file ('+srcFile+')');
+  }
+
+  try {
+    fdw = fs.openSync(destFile, 'w');
+  } catch(e) {
+    common.error('copyFileSync: could not write to dest file (code='+e.code+'):'+destFile);
+  }
+
+  while (bytesRead === BUF_LENGTH) {
+    bytesRead = fs.readSync(fdr, buf, 0, BUF_LENGTH, pos);
+    fs.writeSync(fdw, buf, 0, bytesRead);
+    pos += bytesRead;
+  }
+
+  fs.closeSync(fdr);
+  fs.closeSync(fdw);
+
+  fs.chmodSync(destFile, fs.statSync(srcFile).mode);
+}
+
+// Recursively copies 'sourceDir' into 'destDir'
+// Adapted from https://github.com/ryanmcgrath/wrench-js
+//
+// Copyright (c) 2010 Ryan McGrath
+// Copyright (c) 2012 Artur Adib
+//
+// Licensed under the MIT License
+// http://www.opensource.org/licenses/mit-license.php
+function cpdirSyncRecursive(sourceDir, destDir, opts) {
+  if (!opts) opts = {};
+
+  /* Create the directory where all our junk is moving to; read the mode of the source directory and mirror it */
+  var checkDir = fs.statSync(sourceDir);
+  try {
+    fs.mkdirSync(destDir, checkDir.mode);
+  } catch (e) {
+    //if the directory already exists, that's okay
+    if (e.code !== 'EEXIST') throw e;
+  }
+
+  var files = fs.readdirSync(sourceDir);
+
+  for (var i = 0; i < files.length; i++) {
+    var srcFile = sourceDir + "/" + files[i];
+    var destFile = destDir + "/" + files[i];
+    var srcFileStat = fs.lstatSync(srcFile);
+
+    if (srcFileStat.isDirectory()) {
+      /* recursion this thing right on back. */
+      cpdirSyncRecursive(srcFile, destFile, opts);
+    } else if (srcFileStat.isSymbolicLink()) {
+      var symlinkFull = fs.readlinkSync(srcFile);
+      fs.symlinkSync(symlinkFull, destFile);
+    } else {
+      /* At this point, we've hit a file actually worth copying... so copy it on over. */
+      if (fs.existsSync(destFile) && !opts.force) {
+        common.log('skipping existing file: ' + files[i]);
+      } else {
+        copyFileSync(srcFile, destFile);
+      }
+    }
+
+  } // for files
+} // cpdirSyncRecursive
+
+
+//@
+//@ ### cp([options ,] source [,source ...], dest)
+//@ ### cp([options ,] source_array, dest)
+//@ Available options:
+//@
+//@ + `-f`: force
+//@ + `-r, -R`: recursive
+//@
+//@ Examples:
+//@
+//@ ```javascript
+//@ cp('file1', 'dir1');
+//@ cp('-Rf', '/tmp/*', '/usr/local/*', '/home/tmp');
+//@ cp('-Rf', ['/tmp/*', '/usr/local/*'], '/home/tmp'); // same as above
+//@ ```
+//@
+//@ Copies files. The wildcard `*` is accepted.
+function _cp(options, sources, dest) {
+  options = common.parseOptions(options, {
+    'f': 'force',
+    'R': 'recursive',
+    'r': 'recursive'
+  });
+
+  // Get sources, dest
+  if (arguments.length < 3) {
+    common.error('missing <source> and/or <dest>');
+  } else if (arguments.length > 3) {
+    sources = [].slice.call(arguments, 1, arguments.length - 1);
+    dest = arguments[arguments.length - 1];
+  } else if (typeof sources === 'string') {
+    sources = [sources];
+  } else if ('length' in sources) {
+    sources = sources; // no-op for array
+  } else {
+    common.error('invalid arguments');
+  }
+
+  var exists = fs.existsSync(dest),
+      stats = exists && fs.statSync(dest);
+
+  // Dest is not existing dir, but multiple sources given
+  if ((!exists || !stats.isDirectory()) && sources.length > 1)
+    common.error('dest is not a directory (too many sources)');
+
+  // Dest is an existing file, but no -f given
+  if (exists && stats.isFile() && !options.force)
+    common.error('dest file already exists: ' + dest);
+
+  if (options.recursive) {
+    // Recursive allows the shortcut syntax "sourcedir/" for "sourcedir/*"
+    // (see Github issue #15)
+    sources.forEach(function(src, i) {
+      if (src[src.length - 1] === '/')
+        sources[i] += '*';
+    });
+
+    // Create dest
+    try {
+      fs.mkdirSync(dest, parseInt('0777', 8));
+    } catch (e) {
+      // like Unix's cp, keep going even if we can't create dest dir
+    }
+  }
+
+  sources = common.expand(sources);
+
+  sources.forEach(function(src) {
+    if (!fs.existsSync(src)) {
+      common.error('no such file or directory: '+src, true);
+      return; // skip file
+    }
+
+    // If here, src exists
+    if (fs.statSync(src).isDirectory()) {
+      if (!options.recursive) {
+        // Non-Recursive
+        common.log(src + ' is a directory (not copied)');
+      } else {
+        // Recursive
+        // 'cp /a/source dest' should create 'source' in 'dest'
+        var newDest = path.join(dest, path.basename(src)),
+            checkDir = fs.statSync(src);
+        try {
+          fs.mkdirSync(newDest, checkDir.mode);
+        } catch (e) {
+          //if the directory already exists, that's okay
+          if (e.code !== 'EEXIST') throw e;
+        }
+
+        cpdirSyncRecursive(src, newDest, {force: options.force});
+      }
+      return; // done with dir
+    }
+
+    // If here, src is a file
+
+    // When copying to '/path/dir':
+    //    thisDest = '/path/dir/file1'
+    var thisDest = dest;
+    if (fs.existsSync(dest) && fs.statSync(dest).isDirectory())
+      thisDest = path.normalize(dest + '/' + path.basename(src));
+
+    if (fs.existsSync(thisDest) && !options.force) {
+      common.error('dest file already exists: ' + thisDest, true);
+      return; // skip file
+    }
+
+    copyFileSync(src, thisDest);
+  }); // forEach(src)
+}
+module.exports = _cp;
diff --git a/node_modules/shelljs/src/dirs.js b/node_modules/shelljs/src/dirs.js
new file mode 100644
index 0000000..58fae8b
--- /dev/null
+++ b/node_modules/shelljs/src/dirs.js
@@ -0,0 +1,191 @@
+var common = require('./common');
+var _cd = require('./cd');
+var path = require('path');
+
+// Pushd/popd/dirs internals
+var _dirStack = [];
+
+function _isStackIndex(index) {
+  return (/^[\-+]\d+$/).test(index);
+}
+
+function _parseStackIndex(index) {
+  if (_isStackIndex(index)) {
+    if (Math.abs(index) < _dirStack.length + 1) { // +1 for pwd
+      return (/^-/).test(index) ? Number(index) - 1 : Number(index);
+    } else {
+      common.error(index + ': directory stack index out of range');
+    }
+  } else {
+    common.error(index + ': invalid number');
+  }
+}
+
+function _actualDirStack() {
+  return [process.cwd()].concat(_dirStack);
+}
+
+//@
+//@ ### pushd([options,] [dir | '-N' | '+N'])
+//@
+//@ Available options:
+//@
+//@ + `-n`: Suppresses the normal change of directory when adding directories to the stack, so that only the stack is manipulated.
+//@
+//@ Arguments:
+//@
+//@ + `dir`: Makes the current working directory be the top of the stack, and then executes the equivalent of `cd dir`.
+//@ + `+N`: Brings the Nth directory (counting from the left of the list printed by dirs, starting with zero) to the top of the list by rotating the stack.
+//@ + `-N`: Brings the Nth directory (counting from the right of the list printed by dirs, starting with zero) to the top of the list by rotating the stack.
+//@
+//@ Examples:
+//@
+//@ ```javascript
+//@ // process.cwd() === '/usr'
+//@ pushd('/etc'); // Returns /etc /usr
+//@ pushd('+1');   // Returns /usr /etc
+//@ ```
+//@
+//@ Save the current directory on the top of the directory stack and then cd to `dir`. With no arguments, pushd exchanges the top two directories. Returns an array of paths in the stack.
+function _pushd(options, dir) {
+  if (_isStackIndex(options)) {
+    dir = options;
+    options = '';
+  }
+
+  options = common.parseOptions(options, {
+    'n' : 'no-cd'
+  });
+
+  var dirs = _actualDirStack();
+
+  if (dir === '+0') {
+    return dirs; // +0 is a noop
+  } else if (!dir) {
+    if (dirs.length > 1) {
+      dirs = dirs.splice(1, 1).concat(dirs);
+    } else {
+      return common.error('no other directory');
+    }
+  } else if (_isStackIndex(dir)) {
+    var n = _parseStackIndex(dir);
+    dirs = dirs.slice(n).concat(dirs.slice(0, n));
+  } else {
+    if (options['no-cd']) {
+      dirs.splice(1, 0, dir);
+    } else {
+      dirs.unshift(dir);
+    }
+  }
+
+  if (options['no-cd']) {
+    dirs = dirs.slice(1);
+  } else {
+    dir = path.resolve(dirs.shift());
+    _cd('', dir);
+  }
+
+  _dirStack = dirs;
+  return _dirs('');
+}
+exports.pushd = _pushd;
+
+//@
+//@ ### popd([options,] ['-N' | '+N'])
+//@
+//@ Available options:
+//@
+//@ + `-n`: Suppresses the normal change of directory when removing directories from the stack, so that only the stack is manipulated.
+//@
+//@ Arguments:
+//@
+//@ + `+N`: Removes the Nth directory (counting from the left of the list printed by dirs), starting with zero.
+//@ + `-N`: Removes the Nth directory (counting from the right of the list printed by dirs), starting with zero.
+//@
+//@ Examples:
+//@
+//@ ```javascript
+//@ echo(process.cwd()); // '/usr'
+//@ pushd('/etc');       // '/etc /usr'
+//@ echo(process.cwd()); // '/etc'
+//@ popd();              // '/usr'
+//@ echo(process.cwd()); // '/usr'
+//@ ```
+//@
+//@ When no arguments are given, popd removes the top directory from the stack and performs a cd to the new top directory. The elements are numbered from 0 starting at the first directory listed with dirs; i.e., popd is equivalent to popd +0. Returns an array of paths in the stack.
+function _popd(options, index) {
+  if (_isStackIndex(options)) {
+    index = options;
+    options = '';
+  }
+
+  options = common.parseOptions(options, {
+    'n' : 'no-cd'
+  });
+
+  if (!_dirStack.length) {
+    return common.error('directory stack empty');
+  }
+
+  index = _parseStackIndex(index || '+0');
+
+  if (options['no-cd'] || index > 0 || _dirStack.length + index === 0) {
+    index = index > 0 ? index - 1 : index;
+    _dirStack.splice(index, 1);
+  } else {
+    var dir = path.resolve(_dirStack.shift());
+    _cd('', dir);
+  }
+
+  return _dirs('');
+}
+exports.popd = _popd;
+
+//@
+//@ ### dirs([options | '+N' | '-N'])
+//@
+//@ Available options:
+//@
+//@ + `-c`: Clears the directory stack by deleting all of the elements.
+//@
+//@ Arguments:
+//@
+//@ + `+N`: Displays the Nth directory (counting from the left of the list printed by dirs when invoked without options), starting with zero.
+//@ + `-N`: Displays the Nth directory (counting from the right of the list printed by dirs when invoked without options), starting with zero.
+//@
+//@ Display the list of currently remembered directories. Returns an array of paths in the stack, or a single path if +N or -N was specified.
+//@
+//@ See also: pushd, popd
+function _dirs(options, index) {
+  if (_isStackIndex(options)) {
+    index = options;
+    options = '';
+  }
+
+  options = common.parseOptions(options, {
+    'c' : 'clear'
+  });
+
+  if (options['clear']) {
+    _dirStack = [];
+    return _dirStack;
+  }
+
+  var stack = _actualDirStack();
+
+  if (index) {
+    index = _parseStackIndex(index);
+
+    if (index < 0) {
+      index = stack.length + index;
+    }
+
+    common.log(stack[index]);
+    return stack[index];
+  }
+
+  common.log(stack.join(' '));
+
+  return stack;
+}
+exports.dirs = _dirs;
diff --git a/node_modules/shelljs/src/echo.js b/node_modules/shelljs/src/echo.js
new file mode 100644
index 0000000..760ea84
--- /dev/null
+++ b/node_modules/shelljs/src/echo.js
@@ -0,0 +1,20 @@
+var common = require('./common');
+
+//@
+//@ ### echo(string [,string ...])
+//@
+//@ Examples:
+//@
+//@ ```javascript
+//@ echo('hello world');
+//@ var str = echo('hello world');
+//@ ```
+//@
+//@ Prints string to stdout, and returns string with additional utility methods
+//@ like `.to()`.
+function _echo() {
+  var messages = [].slice.call(arguments, 0);
+  console.log.apply(this, messages);
+  return common.ShellString(messages.join(' '));
+}
+module.exports = _echo;
diff --git a/node_modules/shelljs/src/error.js b/node_modules/shelljs/src/error.js
new file mode 100644
index 0000000..cca3efb
--- /dev/null
+++ b/node_modules/shelljs/src/error.js
@@ -0,0 +1,10 @@
+var common = require('./common');
+
+//@
+//@ ### error()
+//@ Tests if error occurred in the last command. Returns `null` if no error occurred,
+//@ otherwise returns string explaining the error
+function error() {
+  return common.state.error;
+};
+module.exports = error;
diff --git a/node_modules/shelljs/src/exec.js b/node_modules/shelljs/src/exec.js
new file mode 100644
index 0000000..7ccdbc0
--- /dev/null
+++ b/node_modules/shelljs/src/exec.js
@@ -0,0 +1,181 @@
+var common = require('./common');
+var _tempDir = require('./tempdir');
+var _pwd = require('./pwd');
+var path = require('path');
+var fs = require('fs');
+var child = require('child_process');
+
+// Hack to run child_process.exec() synchronously (sync avoids callback hell)
+// Uses a custom wait loop that checks for a flag file, created when the child process is done.
+// (Can't do a wait loop that checks for internal Node variables/messages as
+// Node is single-threaded; callbacks and other internal state changes are done in the
+// event loop).
+function execSync(cmd, opts) {
+  var tempDir = _tempDir();
+  var stdoutFile = path.resolve(tempDir+'/'+common.randomFileName()),
+      codeFile = path.resolve(tempDir+'/'+common.randomFileName()),
+      scriptFile = path.resolve(tempDir+'/'+common.randomFileName()),
+      sleepFile = path.resolve(tempDir+'/'+common.randomFileName());
+
+  var options = common.extend({
+    silent: common.config.silent
+  }, opts);
+
+  var previousStdoutContent = '';
+  // Echoes stdout changes from running process, if not silent
+  function updateStdout() {
+    if (options.silent || !fs.existsSync(stdoutFile))
+      return;
+
+    var stdoutContent = fs.readFileSync(stdoutFile, 'utf8');
+    // No changes since last time?
+    if (stdoutContent.length <= previousStdoutContent.length)
+      return;
+
+    process.stdout.write(stdoutContent.substr(previousStdoutContent.length));
+    previousStdoutContent = stdoutContent;
+  }
+
+  function escape(str) {
+    return (str+'').replace(/([\\"'])/g, "\\$1").replace(/\0/g, "\\0");
+  }
+
+  cmd += ' > '+stdoutFile+' 2>&1'; // works on both win/unix
+
+  var script =
+   "var child = require('child_process')," +
+   "     fs = require('fs');" +
+   "child.exec('"+escape(cmd)+"', {env: process.env, maxBuffer: 20*1024*1024}, function(err) {" +
+   "  fs.writeFileSync('"+escape(codeFile)+"', err ? err.code.toString() : '0');" +
+   "});";
+
+  if (fs.existsSync(scriptFile)) common.unlinkSync(scriptFile);
+  if (fs.existsSync(stdoutFile)) common.unlinkSync(stdoutFile);
+  if (fs.existsSync(codeFile)) common.unlinkSync(codeFile);
+
+  fs.writeFileSync(scriptFile, script);
+  child.exec('"'+process.execPath+'" '+scriptFile, {
+    env: process.env,
+    cwd: _pwd(),
+    maxBuffer: 20*1024*1024
+  });
+
+  // The wait loop
+  // sleepFile is used as a dummy I/O op to mitigate unnecessary CPU usage
+  // (tried many I/O sync ops, writeFileSync() seems to be only one that is effective in reducing
+  // CPU usage, though apparently not so much on Windows)
+  while (!fs.existsSync(codeFile)) { updateStdout(); fs.writeFileSync(sleepFile, 'a'); }
+  while (!fs.existsSync(stdoutFile)) { updateStdout(); fs.writeFileSync(sleepFile, 'a'); }
+
+  // At this point codeFile exists, but it's not necessarily flushed yet.
+  // Keep reading it until it is.
+  var code = parseInt('', 10);
+  while (isNaN(code)) {
+    code = parseInt(fs.readFileSync(codeFile, 'utf8'), 10);
+  }
+
+  var stdout = fs.readFileSync(stdoutFile, 'utf8');
+
+  // No biggie if we can't erase the files now -- they're in a temp dir anyway
+  try { common.unlinkSync(scriptFile); } catch(e) {}
+  try { common.unlinkSync(stdoutFile); } catch(e) {}
+  try { common.unlinkSync(codeFile); } catch(e) {}
+  try { common.unlinkSync(sleepFile); } catch(e) {}
+
+  // some shell return codes are defined as errors, per http://tldp.org/LDP/abs/html/exitcodes.html
+  if (code === 1 || code === 2 || code >= 126)  {
+      common.error('', true); // unix/shell doesn't really give an error message after non-zero exit codes
+  }
+  // True if successful, false if not
+  var obj = {
+    code: code,
+    output: stdout
+  };
+  return obj;
+} // execSync()
+
+// Wrapper around exec() to enable echoing output to console in real time
+function execAsync(cmd, opts, callback) {
+  var output = '';
+
+  var options = common.extend({
+    silent: common.config.silent
+  }, opts);
+
+  var c = child.exec(cmd, {env: process.env, maxBuffer: 20*1024*1024}, function(err) {
+    if (callback)
+      callback(err ? err.code : 0, output);
+  });
+
+  c.stdout.on('data', function(data) {
+    output += data;
+    if (!options.silent)
+      process.stdout.write(data);
+  });
+
+  c.stderr.on('data', function(data) {
+    output += data;
+    if (!options.silent)
+      process.stdout.write(data);
+  });
+
+  return c;
+}
+
+//@
+//@ ### exec(command [, options] [, callback])
+//@ Available options (all `false` by default):
+//@
+//@ + `async`: Asynchronous execution. Defaults to true if a callback is provided.
+//@ + `silent`: Do not echo program output to console.
+//@
+//@ Examples:
+//@
+//@ ```javascript
+//@ var version = exec('node --version', {silent:true}).output;
+//@
+//@ var child = exec('some_long_running_process', {async:true});
+//@ child.stdout.on('data', function(data) {
+//@   /* ... do something with data ... */
+//@ });
+//@
+//@ exec('some_long_running_process', function(code, output) {
+//@   console.log('Exit code:', code);
+//@   console.log('Program output:', output);
+//@ });
+//@ ```
+//@
+//@ Executes the given `command` _synchronously_, unless otherwise specified.
+//@ When in synchronous mode returns the object `{ code:..., output:... }`, containing the program's
+//@ `output` (stdout + stderr)  and its exit `code`. Otherwise returns the child process object, and
+//@ the `callback` gets the arguments `(code, output)`.
+//@
+//@ **Note:** For long-lived processes, it's best to run `exec()` asynchronously as
+//@ the current synchronous implementation uses a lot of CPU. This should be getting
+//@ fixed soon.
+function _exec(command, options, callback) {
+  if (!command)
+    common.error('must specify command');
+
+  // Callback is defined instead of options.
+  if (typeof options === 'function') {
+    callback = options;
+    options = { async: true };
+  }
+
+  // Callback is defined with options.
+  if (typeof options === 'object' && typeof callback === 'function') {
+    options.async = true;
+  }
+
+  options = common.extend({
+    silent: common.config.silent,
+    async: false
+  }, options);
+
+  if (options.async)
+    return execAsync(command, options, callback);
+  else
+    return execSync(command, options);
+}
+module.exports = _exec;
diff --git a/node_modules/shelljs/src/find.js b/node_modules/shelljs/src/find.js
new file mode 100644
index 0000000..d9eeec2
--- /dev/null
+++ b/node_modules/shelljs/src/find.js
@@ -0,0 +1,51 @@
+var fs = require('fs');
+var common = require('./common');
+var _ls = require('./ls');
+
+//@
+//@ ### find(path [,path ...])
+//@ ### find(path_array)
+//@ Examples:
+//@
+//@ ```javascript
+//@ find('src', 'lib');
+//@ find(['src', 'lib']); // same as above
+//@ find('.').filter(function(file) { return file.match(/\.js$/); });
+//@ ```
+//@
+//@ Returns array of all files (however deep) in the given paths.
+//@
+//@ The main difference from `ls('-R', path)` is that the resulting file names
+//@ include the base directories, e.g. `lib/resources/file1` instead of just `file1`.
+function _find(options, paths) {
+  if (!paths)
+    common.error('no path specified');
+  else if (typeof paths === 'object')
+    paths = paths; // assume array
+  else if (typeof paths === 'string')
+    paths = [].slice.call(arguments, 1);
+
+  var list = [];
+
+  function pushFile(file) {
+    if (common.platform === 'win')
+      file = file.replace(/\\/g, '/');
+    list.push(file);
+  }
+
+  // why not simply do ls('-R', paths)? because the output wouldn't give the base dirs
+  // to get the base dir in the output, we need instead ls('-R', 'dir/*') for every directory
+
+  paths.forEach(function(file) {
+    pushFile(file);
+
+    if (fs.statSync(file).isDirectory()) {
+      _ls('-RA', file+'/*').forEach(function(subfile) {
+        pushFile(subfile);
+      });
+    }
+  });
+
+  return list;
+}
+module.exports = _find;
diff --git a/node_modules/shelljs/src/grep.js b/node_modules/shelljs/src/grep.js
new file mode 100644
index 0000000..00c7d6a
--- /dev/null
+++ b/node_modules/shelljs/src/grep.js
@@ -0,0 +1,52 @@
+var common = require('./common');
+var fs = require('fs');
+
+//@
+//@ ### grep([options ,] regex_filter, file [, file ...])
+//@ ### grep([options ,] regex_filter, file_array)
+//@ Available options:
+//@
+//@ + `-v`: Inverse the sense of the regex and print the lines not matching the criteria.
+//@
+//@ Examples:
+//@
+//@ ```javascript
+//@ grep('-v', 'GLOBAL_VARIABLE', '*.js');
+//@ grep('GLOBAL_VARIABLE', '*.js');
+//@ ```
+//@
+//@ Reads input string from given files and returns a string containing all lines of the
+//@ file that match the given `regex_filter`. Wildcard `*` accepted.
+function _grep(options, regex, files) {
+  options = common.parseOptions(options, {
+    'v': 'inverse'
+  });
+
+  if (!files)
+    common.error('no paths given');
+
+  if (typeof files === 'string')
+    files = [].slice.call(arguments, 2);
+  // if it's array leave it as it is
+
+  files = common.expand(files);
+
+  var grep = '';
+  files.forEach(function(file) {
+    if (!fs.existsSync(file)) {
+      common.error('no such file or directory: ' + file, true);
+      return;
+    }
+
+    var contents = fs.readFileSync(file, 'utf8'),
+        lines = contents.split(/\r*\n/);
+    lines.forEach(function(line) {
+      var matched = line.match(regex);
+      if ((options.inverse && !matched) || (!options.inverse && matched))
+        grep += line + '\n';
+    });
+  });
+
+  return common.ShellString(grep);
+}
+module.exports = _grep;
diff --git a/node_modules/shelljs/src/ls.js b/node_modules/shelljs/src/ls.js
new file mode 100644
index 0000000..3345db4
--- /dev/null
+++ b/node_modules/shelljs/src/ls.js
@@ -0,0 +1,126 @@
+var path = require('path');
+var fs = require('fs');
+var common = require('./common');
+var _cd = require('./cd');
+var _pwd = require('./pwd');
+
+//@
+//@ ### ls([options ,] path [,path ...])
+//@ ### ls([options ,] path_array)
+//@ Available options:
+//@
+//@ + `-R`: recursive
+//@ + `-A`: all files (include files beginning with `.`, except for `.` and `..`)
+//@
+//@ Examples:
+//@
+//@ ```javascript
+//@ ls('projs/*.js');
+//@ ls('-R', '/users/me', '/tmp');
+//@ ls('-R', ['/users/me', '/tmp']); // same as above
+//@ ```
+//@
+//@ Returns array of files in the given path, or in current directory if no path provided.
+function _ls(options, paths) {
+  options = common.parseOptions(options, {
+    'R': 'recursive',
+    'A': 'all',
+    'a': 'all_deprecated'
+  });
+
+  if (options.all_deprecated) {
+    // We won't support the -a option as it's hard to image why it's useful
+    // (it includes '.' and '..' in addition to '.*' files)
+    // For backwards compatibility we'll dump a deprecated message and proceed as before
+    common.log('ls: Option -a is deprecated. Use -A instead');
+    options.all = true;
+  }
+
+  if (!paths)
+    paths = ['.'];
+  else if (typeof paths === 'object')
+    paths = paths; // assume array
+  else if (typeof paths === 'string')
+    paths = [].slice.call(arguments, 1);
+
+  var list = [];
+
+  // Conditionally pushes file to list - returns true if pushed, false otherwise
+  // (e.g. prevents hidden files to be included unless explicitly told so)
+  function pushFile(file, query) {
+    // hidden file?
+    if (path.basename(file)[0] === '.') {
+      // not explicitly asking for hidden files?
+      if (!options.all && !(path.basename(query)[0] === '.' && path.basename(query).length > 1))
+        return false;
+    }
+
+    if (common.platform === 'win')
+      file = file.replace(/\\/g, '/');
+
+    list.push(file);
+    return true;
+  }
+
+  paths.forEach(function(p) {
+    if (fs.existsSync(p)) {
+      var stats = fs.statSync(p);
+      // Simple file?
+      if (stats.isFile()) {
+        pushFile(p, p);
+        return; // continue
+      }
+
+      // Simple dir?
+      if (stats.isDirectory()) {
+        // Iterate over p contents
+        fs.readdirSync(p).forEach(function(file) {
+          if (!pushFile(file, p))
+            return;
+
+          // Recursive?
+          if (options.recursive) {
+            var oldDir = _pwd();
+            _cd('', p);
+            if (fs.statSync(file).isDirectory())
+              list = list.concat(_ls('-R'+(options.all?'A':''), file+'/*'));
+            _cd('', oldDir);
+          }
+        });
+        return; // continue
+      }
+    }
+
+    // p does not exist - possible wildcard present
+
+    var basename = path.basename(p);
+    var dirname = path.dirname(p);
+    // Wildcard present on an existing dir? (e.g. '/tmp/*.js')
+    if (basename.search(/\*/) > -1 && fs.existsSync(dirname) && fs.statSync(dirname).isDirectory) {
+      // Escape special regular expression chars
+      var regexp = basename.replace(/(\^|\$|\(|\)|<|>|\[|\]|\{|\}|\.|\+|\?)/g, '\\$1');
+      // Translates wildcard into regex
+      regexp = '^' + regexp.replace(/\*/g, '.*') + '$';
+      // Iterate over directory contents
+      fs.readdirSync(dirname).forEach(function(file) {
+        if (file.match(new RegExp(regexp))) {
+          if (!pushFile(path.normalize(dirname+'/'+file), basename))
+            return;
+
+          // Recursive?
+          if (options.recursive) {
+            var pp = dirname + '/' + file;
+            if (fs.lstatSync(pp).isDirectory())
+              list = list.concat(_ls('-R'+(options.all?'A':''), pp+'/*'));
+          } // recursive
+        } // if file matches
+      }); // forEach
+      return;
+    }
+
+    common.error('no such file or directory: ' + p, true);
+  });
+
+  return list;
+}
+module.exports = _ls;
diff --git a/node_modules/shelljs/src/mkdir.js b/node_modules/shelljs/src/mkdir.js
new file mode 100644
index 0000000..5a7088f
--- /dev/null
+++ b/node_modules/shelljs/src/mkdir.js
@@ -0,0 +1,68 @@
+var common = require('./common');
+var fs = require('fs');
+var path = require('path');
+
+// Recursively creates 'dir'
+function mkdirSyncRecursive(dir) {
+  var baseDir = path.dirname(dir);
+
+  // Base dir exists, no recursion necessary
+  if (fs.existsSync(baseDir)) {
+    fs.mkdirSync(dir, parseInt('0777', 8));
+    return;
+  }
+
+  // Base dir does not exist, go recursive
+  mkdirSyncRecursive(baseDir);
+
+  // Base dir created, can create dir
+  fs.mkdirSync(dir, parseInt('0777', 8));
+}
+
+//@
+//@ ### mkdir([options ,] dir [, dir ...])
+//@ ### mkdir([options ,] dir_array)
+//@ Available options:
+//@
+//@ + `p`: full path (will create intermediate dirs if necessary)
+//@
+//@ Examples:
+//@
+//@ ```javascript
+//@ mkdir('-p', '/tmp/a/b/c/d', '/tmp/e/f/g');
+//@ mkdir('-p', ['/tmp/a/b/c/d', '/tmp/e/f/g']); // same as above
+//@ ```
+//@
+//@ Creates directories.
+function _mkdir(options, dirs) {
+  options = common.parseOptions(options, {
+    'p': 'fullpath'
+  });
+  if (!dirs)
+    common.error('no paths given');
+
+  if (typeof dirs === 'string')
+    dirs = [].slice.call(arguments, 1);
+  // if it's array leave it as it is
+
+  dirs.forEach(function(dir) {
+    if (fs.existsSync(dir)) {
+      if (!options.fullpath)
+          common.error('path already exists: ' + dir, true);
+      return; // skip dir
+    }
+
+    // Base dir does not exist, and no -p option given
+    var baseDir = path.dirname(dir);
+    if (!fs.existsSync(baseDir) && !options.fullpath) {
+      common.error('no such file or directory: ' + baseDir, true);
+      return; // skip dir
+    }
+
+    if (options.fullpath)
+      mkdirSyncRecursive(dir);
+    else
+      fs.mkdirSync(dir, parseInt('0777', 8));
+  });
+} // mkdir
+module.exports = _mkdir;
diff --git a/node_modules/shelljs/src/mv.js b/node_modules/shelljs/src/mv.js
new file mode 100644
index 0000000..11f9607
--- /dev/null
+++ b/node_modules/shelljs/src/mv.js
@@ -0,0 +1,80 @@
+var fs = require('fs');
+var path = require('path');
+var common = require('./common');
+
+//@
+//@ ### mv(source [, source ...], dest')
+//@ ### mv(source_array, dest')
+//@ Available options:
+//@
+//@ + `f`: force
+//@
+//@ Examples:
+//@
+//@ ```javascript
+//@ mv('-f', 'file', 'dir/');
+//@ mv('file1', 'file2', 'dir/');
+//@ mv(['file1', 'file2'], 'dir/'); // same as above
+//@ ```
+//@
+//@ Moves files. The wildcard `*` is accepted.
+function _mv(options, sources, dest) {
+  options = common.parseOptions(options, {
+    'f': 'force'
+  });
+
+  // Get sources, dest
+  if (arguments.length < 3) {
+    common.error('missing <source> and/or <dest>');
+  } else if (arguments.length > 3) {
+    sources = [].slice.call(arguments, 1, arguments.length - 1);
+    dest = arguments[arguments.length - 1];
+  } else if (typeof sources === 'string') {
+    sources = [sources];
+  } else if ('length' in sources) {
+    sources = sources; // no-op for array
+  } else {
+    common.error('invalid arguments');
+  }
+
+  sources = common.expand(sources);
+
+  var exists = fs.existsSync(dest),
+      stats = exists && fs.statSync(dest);
+
+  // Dest is not existing dir, but multiple sources given
+  if ((!exists || !stats.isDirectory()) && sources.length > 1)
+    common.error('dest is not a directory (too many sources)');
+
+  // Dest is an existing file, but no -f given
+  if (exists && stats.isFile() && !options.force)
+    common.error('dest file already exists: ' + dest);
+
+  sources.forEach(function(src) {
+    if (!fs.existsSync(src)) {
+      common.error('no such file or directory: '+src, true);
+      return; // skip file
+    }
+
+    // If here, src exists
+
+    // When copying to '/path/dir':
+    //    thisDest = '/path/dir/file1'
+    var thisDest = dest;
+    if (fs.existsSync(dest) && fs.statSync(dest).isDirectory())
+      thisDest = path.normalize(dest + '/' + path.basename(src));
+
+    if (fs.existsSync(thisDest) && !options.force) {
+      common.error('dest file already exists: ' + thisDest, true);
+      return; // skip file
+    }
+
+    if (path.resolve(src) === path.dirname(path.resolve(thisDest))) {
+      common.error('cannot move to self: '+src, true);
+      return; // skip file
+    }
+
+    fs.renameSync(src, thisDest);
+  }); // forEach(src)
+} // mv
+module.exports = _mv;
diff --git a/node_modules/shelljs/src/popd.js b/node_modules/shelljs/src/popd.js
new file mode 100644
index 0000000..11ea24f
--- /dev/null
+++ b/node_modules/shelljs/src/popd.js
@@ -0,0 +1 @@
+// see dirs.js
\ No newline at end of file
diff --git a/node_modules/shelljs/src/pushd.js b/node_modules/shelljs/src/pushd.js
new file mode 100644
index 0000000..11ea24f
--- /dev/null
+++ b/node_modules/shelljs/src/pushd.js
@@ -0,0 +1 @@
+// see dirs.js
\ No newline at end of file
diff --git a/node_modules/shelljs/src/pwd.js b/node_modules/shelljs/src/pwd.js
new file mode 100644
index 0000000..41727bb
--- /dev/null
+++ b/node_modules/shelljs/src/pwd.js
@@ -0,0 +1,11 @@
+var path = require('path');
+var common = require('./common');
+
+//@
+//@ ### pwd()
+//@ Returns the current directory.
+function _pwd(options) {
+  var pwd = path.resolve(process.cwd());
+  return common.ShellString(pwd);
+}
+module.exports = _pwd;
diff --git a/node_modules/shelljs/src/rm.js b/node_modules/shelljs/src/rm.js
new file mode 100644
index 0000000..3abe6e1
--- /dev/null
+++ b/node_modules/shelljs/src/rm.js
@@ -0,0 +1,145 @@
+var common = require('./common');
+var fs = require('fs');
+
+// Recursively removes 'dir'
+// Adapted from https://github.com/ryanmcgrath/wrench-js
+//
+// Copyright (c) 2010 Ryan McGrath
+// Copyright (c) 2012 Artur Adib
+//
+// Licensed under the MIT License
+// http://www.opensource.org/licenses/mit-license.php
+function rmdirSyncRecursive(dir, force) {
+  var files;
+
+  files = fs.readdirSync(dir);
+
+  // Loop through and delete everything in the sub-tree after checking it
+  for(var i = 0; i < files.length; i++) {
+    var file = dir + "/" + files[i],
+        currFile = fs.lstatSync(file);
+
+    if(currFile.isDirectory()) { // Recursive function back to the beginning
+      rmdirSyncRecursive(file, force);
+    }
+
+    else if(currFile.isSymbolicLink()) { // Unlink symlinks
+      if (force || isWriteable(file)) {
+        try {
+          common.unlinkSync(file);
+        } catch (e) {
+          common.error('could not remove file (code '+e.code+'): ' + file, true);
+        }
+      }
+    }
+
+    else // Assume it's a file - perhaps a try/catch belongs here?
+      if (force || isWriteable(file)) {
+        try {
+          common.unlinkSync(file);
+        } catch (e) {
+          common.error('could not remove file (code '+e.code+'): ' + file, true);
+        }
+      }
+  }
+
+  // Now that we know everything in the sub-tree has been deleted, we can delete the main directory.
+  // Huzzah for the shopkeep.
+
+  var result;
+  try {
+    result = fs.rmdirSync(dir);
+  } catch(e) {
+    common.error('could not remove directory (code '+e.code+'): ' + dir, true);
+  }
+
+  return result;
+} // rmdirSyncRecursive
+
+// Hack to determine if file has write permissions for current user
+// Avoids having to check user, group, etc, but it's probably slow
+function isWriteable(file) {
+  var writePermission = true;
+  try {
+    var __fd = fs.openSync(file, 'a');
+    fs.closeSync(__fd);
+  } catch(e) {
+    writePermission = false;
+  }
+
+  return writePermission;
+}
+
+//@
+//@ ### rm([options ,] file [, file ...])
+//@ ### rm([options ,] file_array)
+//@ Available options:
+//@
+//@ + `-f`: force
+//@ + `-r, -R`: recursive
+//@
+//@ Examples:
+//@
+//@ ```javascript
+//@ rm('-rf', '/tmp/*');
+//@ rm('some_file.txt', 'another_file.txt');
+//@ rm(['some_file.txt', 'another_file.txt']); // same as above
+//@ ```
+//@
+//@ Removes files. The wildcard `*` is accepted.
+function _rm(options, files) {
+  options = common.parseOptions(options, {
+    'f': 'force',
+    'r': 'recursive',
+    'R': 'recursive'
+  });
+  if (!files)
+    common.error('no paths given');
+
+  if (typeof files === 'string')
+    files = [].slice.call(arguments, 1);
+  // if it's array leave it as it is
+
+  files = common.expand(files);
+
+  files.forEach(function(file) {
+    if (!fs.existsSync(file)) {
+      // Path does not exist, no force flag given
+      if (!options.force)
+        common.error('no such file or directory: '+file, true);
+
+      return; // skip file
+    }
+
+    // If here, path exists
+
+    var stats = fs.lstatSync(file);
+    if (stats.isFile() || stats.isSymbolicLink()) {
+
+      // Do not check for file writing permissions
+      if (options.force) {
+        common.unlinkSync(file);
+        return;
+      }
+
+      if (isWriteable(file))
+        common.unlinkSync(file);
+      else
+        common.error('permission denied: '+file, true);
+
+      return;
+    } // simple file
+
+    // Path is an existing directory, but no -r flag given
+    if (stats.isDirectory() && !options.recursive) {
+      common.error('path is a directory', true);
+      return; // skip path
+    }
+
+    // Recursively remove existing directory
+    if (stats.isDirectory() && options.recursive) {
+      rmdirSyncRecursive(file, options.force);
+    }
+  }); // forEach(file)
+} // rm
+module.exports = _rm;
diff --git a/node_modules/shelljs/src/sed.js b/node_modules/shelljs/src/sed.js
new file mode 100644
index 0000000..9783252
--- /dev/null
+++ b/node_modules/shelljs/src/sed.js
@@ -0,0 +1,43 @@
+var common = require('./common');
+var fs = require('fs');
+
+//@
+//@ ### sed([options ,] search_regex, replace_str, file)
+//@ Available options:
+//@
+//@ + `-i`: Replace contents of 'file' in-place. _Note that no backups will be created!_
+//@
+//@ Examples:
+//@
+//@ ```javascript
+//@ sed('-i', 'PROGRAM_VERSION', 'v0.1.3', 'source.js');
+//@ sed(/.*DELETE_THIS_LINE.*\n/, '', 'source.js');
+//@ ```
+//@
+//@ Reads an input string from `file` and performs a JavaScript `replace()` on the input
+//@ using the given search regex and replacement string. Returns the new string after replacement.
+function _sed(options, regex, replacement, file) {
+  options = common.parseOptions(options, {
+    'i': 'inplace'
+  });
+
+  if (typeof replacement === 'string')
+    replacement = replacement; // no-op
+  else if (typeof replacement === 'number')
+    replacement = replacement.toString(); // fallback
+  else
+    common.error('invalid replacement string');
+
+  if (!file)
+    common.error('no file given');
+
+  if (!fs.existsSync(file))
+    common.error('no such file or directory: ' + file);
+
+  var result = fs.readFileSync(file, 'utf8').replace(regex, replacement);
+  if (options.inplace)
+    fs.writeFileSync(file, result, 'utf8');
+
+  return common.ShellString(result);
+}
+module.exports = _sed;
diff --git a/node_modules/shelljs/src/tempdir.js b/node_modules/shelljs/src/tempdir.js
new file mode 100644
index 0000000..45953c2
--- /dev/null
+++ b/node_modules/shelljs/src/tempdir.js
@@ -0,0 +1,56 @@
+var common = require('./common');
+var os = require('os');
+var fs = require('fs');
+
+// Returns false if 'dir' is not a writeable directory, 'dir' otherwise
+function writeableDir(dir) {
+  if (!dir || !fs.existsSync(dir))
+    return false;
+
+  if (!fs.statSync(dir).isDirectory())
+    return false;
+
+  var testFile = dir+'/'+common.randomFileName();
+  try {
+    fs.writeFileSync(testFile, ' ');
+    common.unlinkSync(testFile);
+    return dir;
+  } catch (e) {
+    return false;
+  }
+}
+
+
+//@
+//@ ### tempdir()
+//@
+//@ Examples:
+//@
+//@ ```javascript
+//@ var tmp = tempdir(); // "/tmp" for most *nix platforms
+//@ ```
+//@
+//@ Searches and returns string containing a writeable, platform-dependent temporary directory.
+//@ Follows Python's [tempfile algorithm](http://docs.python.org/library/tempfile.html#tempfile.tempdir).
+function _tempDir() {
+  var state = common.state;
+  if (state.tempDir)
+    return state.tempDir; // from cache
+
+  state.tempDir = writeableDir(os.tempDir && os.tempDir()) || // node 0.8+
+                  writeableDir(process.env['TMPDIR']) ||
+                  writeableDir(process.env['TEMP']) ||
+                  writeableDir(process.env['TMP']) ||
+                  writeableDir(process.env['Wimp$ScrapDir']) || // RiscOS
+                  writeableDir('C:\\TEMP') || // Windows
+                  writeableDir('C:\\TMP') || // Windows
+                  writeableDir('\\TEMP') || // Windows
+                  writeableDir('\\TMP') || // Windows
+                  writeableDir('/tmp') ||
+                  writeableDir('/var/tmp') ||
+                  writeableDir('/usr/tmp') ||
+                  writeableDir('.'); // last resort
+
+  return state.tempDir;
+}
+module.exports = _tempDir;
diff --git a/node_modules/shelljs/src/test.js b/node_modules/shelljs/src/test.js
new file mode 100644
index 0000000..8a4ac7d
--- /dev/null
+++ b/node_modules/shelljs/src/test.js
@@ -0,0 +1,85 @@
+var common = require('./common');
+var fs = require('fs');
+
+//@
+//@ ### test(expression)
+//@ Available expression primaries:
+//@
+//@ + `'-b', 'path'`: true if path is a block device
+//@ + `'-c', 'path'`: true if path is a character device
+//@ + `'-d', 'path'`: true if path is a directory
+//@ + `'-e', 'path'`: true if path exists
+//@ + `'-f', 'path'`: true if path is a regular file
+//@ + `'-L', 'path'`: true if path is a symboilc link
+//@ + `'-p', 'path'`: true if path is a pipe (FIFO)
+//@ + `'-S', 'path'`: true if path is a socket
+//@
+//@ Examples:
+//@
+//@ ```javascript
+//@ if (test('-d', path)) { /* do something with dir */ };
+//@ if (!test('-f', path)) continue; // skip if it's a regular file
+//@ ```
+//@
+//@ Evaluates expression using the available primaries and returns corresponding value.
+function _test(options, path) {
+  if (!path)
+    common.error('no path given');
+
+  // hack - only works with unary primaries
+  options = common.parseOptions(options, {
+    'b': 'block',
+    'c': 'character',
+    'd': 'directory',
+    'e': 'exists',
+    'f': 'file',
+    'L': 'link',
+    'p': 'pipe',
+    'S': 'socket'
+  });
+
+  var canInterpret = false;
+  for (var key in options)
+    if (options[key] === true) {
+      canInterpret = true;
+      break;
+    }
+
+  if (!canInterpret)
+    common.error('could not interpret expression');
+
+  if (options.link) {
+    try {
+      return fs.lstatSync(path).isSymbolicLink();
+    } catch(e) {
+      return false;
+    }
+  }
+
+  if (!fs.existsSync(path))
+    return false;
+
+  if (options.exists)
+    return true;
+
+  var stats = fs.statSync(path);
+
+  if (options.block)
+    return stats.isBlockDevice();
+
+  if (options.character)
+    return stats.isCharacterDevice();
+
+  if (options.directory)
+    return stats.isDirectory();
+
+  if (options.file)
+    return stats.isFile();
+
+  if (options.pipe)
+    return stats.isFIFO();
+
+  if (options.socket)
+    return stats.isSocket();
+} // test
+module.exports = _test;
diff --git a/node_modules/shelljs/src/to.js b/node_modules/shelljs/src/to.js
new file mode 100644
index 0000000..f029999
--- /dev/null
+++ b/node_modules/shelljs/src/to.js
@@ -0,0 +1,29 @@
+var common = require('./common');
+var fs = require('fs');
+var path = require('path');
+
+//@
+//@ ### 'string'.to(file)
+//@
+//@ Examples:
+//@
+//@ ```javascript
+//@ cat('input.txt').to('output.txt');
+//@ ```
+//@
+//@ Analogous to the redirection operator `>` in Unix, but works with JavaScript strings (such as
+//@ those returned by `cat`, `grep`, etc). _Like Unix redirections, `to()` will overwrite any existing file!_
+function _to(options, file) {
+  if (!file)
+    common.error('wrong arguments');
+
+  if (!fs.existsSync( path.dirname(file) ))
+      common.error('no such file or directory: ' + path.dirname(file));
+
+  try {
+    fs.writeFileSync(file, this.toString(), 'utf8');
+  } catch(e) {
+    common.error('could not write to file (code '+e.code+'): '+file, true);
+  }
+}
+module.exports = _to;
diff --git a/node_modules/shelljs/src/toEnd.js b/node_modules/shelljs/src/toEnd.js
new file mode 100644
index 0000000..f6d099d
--- /dev/null
+++ b/node_modules/shelljs/src/toEnd.js
@@ -0,0 +1,29 @@
+var common = require('./common');
+var fs = require('fs');
+var path = require('path');
+
+//@
+//@ ### 'string'.toEnd(file)
+//@
+//@ Examples:
+//@
+//@ ```javascript
+//@ cat('input.txt').toEnd('output.txt');
+//@ ```
+//@
+//@ Analogous to the redirect-and-append operator `>>` in Unix, but works with JavaScript strings (such as
+//@ those returned by `cat`, `grep`, etc).
+function _toEnd(options, file) {
+  if (!file)
+    common.error('wrong arguments');
+
+  if (!fs.existsSync( path.dirname(file) ))
+      common.error('no such file or directory: ' + path.dirname(file));
+
+  try {
+    fs.appendFileSync(file, this.toString(), 'utf8');
+  } catch(e) {
+    common.error('could not append to file (code '+e.code+'): '+file, true);
+  }
+}
+module.exports = _toEnd;
diff --git a/node_modules/shelljs/src/which.js b/node_modules/shelljs/src/which.js
new file mode 100644
index 0000000..fadb96c
--- /dev/null
+++ b/node_modules/shelljs/src/which.js
@@ -0,0 +1,79 @@
+var common = require('./common');
+var fs = require('fs');
+var path = require('path');
+
+// Cross-platform method for splitting environment PATH variables
+function splitPath(p) {
+  for (i=1;i<2;i++) {}
+
+  if (!p)
+    return [];
+
+  if (common.platform === 'win')
+    return p.split(';');
+  else
+    return p.split(':');
+}
+
+//@
+//@ ### which(command)
+//@
+//@ Examples:
+//@
+//@ ```javascript
+//@ var nodeExec = which('node');
+//@ ```
+//@
+//@ Searches for `command` in the system's PATH. On Windows looks for `.exe`, `.cmd`, and `.bat` extensions.
+//@ Returns string containing the absolute path to the command.
+function _which(options, cmd) {
+  if (!cmd)
+    common.error('must specify command');
+
+  var pathEnv = process.env.path || process.env.Path || process.env.PATH,
+      pathArray = splitPath(pathEnv),
+      where = null;
+
+  // No relative/absolute paths provided?
+  if (cmd.search(/\//) === -1) {
+    // Search for command in PATH
+    pathArray.forEach(function(dir) {
+      if (where)
+        return; // already found it
+
+      var attempt = path.resolve(dir + '/' + cmd);
+      if (fs.existsSync(attempt)) {
+        where = attempt;
+        return;
+      }
+
+      if (common.platform === 'win') {
+        var baseAttempt = attempt;
+        attempt = baseAttempt + '.exe';
+        if (fs.existsSync(attempt)) {
+          where = attempt;
+          return;
+        }
+        attempt = baseAttempt + '.cmd';
+        if (fs.existsSync(attempt)) {
+          where = attempt;
+          return;
+        }
+        attempt = baseAttempt + '.bat';
+        if (fs.existsSync(attempt)) {
+          where = attempt;
+          return;
+        }
+      } // if 'win'
+    });
+  }
+
+  // Command not found anywhere?
+  if (!fs.existsSync(cmd) && !where)
+    return null;
+
+  where = where || path.resolve(cmd);
+
+  return common.ShellString(where);
+}
+module.exports = _which;