(function e(t, n, r) {
  function s(o, u) {
    if (!n[o]) {
      if (!t[o]) {
        var a = typeof require == "function" && require;
        if (!u && a) {
          return a(o, !0);
        }
        if (i) {
          return i(o, !0);
        }
        var f = new Error("Cannot find module '" + o + "'");
        throw f.code = "MODULE_NOT_FOUND", f
      }
      var l = n[o] = { exports: {} };
      t[o][0].call(l.exports, function (e) {
        var n = t[o][1][e];
        return s(n ? n : e)
      }, l, l.exports, e, t, n, r)
    }
    return n[o].exports
  }

  var i = typeof require == "function" && require;
  for (var o = 0; o < r.length; o++)s(r[o]);
  return s
})({
  1: [function (require, module, exports) {

  }, {}],
  2: [function (require, module, exports) {
    /*!
     * The buffer module from node.js, for the browser.
     *
     * @author   Feross Aboukhadijeh <feross@feross.org> <http://feross.org>
     * @license  MIT
     */

    var base64 = require('base64-js')
    var ieee754 = require('ieee754')
    var isArray = require('is-array')

    exports.Buffer = Buffer
    exports.SlowBuffer = SlowBuffer
    exports.INSPECT_MAX_BYTES = 50
    Buffer.poolSize = 8192 // not used by this implementation

    var rootParent = {}

    /**
     * If `Buffer.TYPED_ARRAY_SUPPORT`:
     *   === true    Use Uint8Array implementation (fastest)
     *   === false   Use Object implementation (most compatible, even IE6)
     *
     * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,
     * Opera 11.6+, iOS 4.2+.
     *
     * Note:
     *
     * - Implementation must support adding new properties to `Uint8Array` instances.
     *   Firefox 4-29 lacked support, fixed in Firefox 30+.
     *   See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.
     *
     *  - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.
     *
     *  - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of
     *    incorrect length in some situations.
     *
     * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they will
     * get the Object implementation, which is slower but will work correctly.
     */
    Buffer.TYPED_ARRAY_SUPPORT = (function () {
      function Foo() {
      }

      try {
        var buf = new ArrayBuffer(0)
        var arr = new Uint8Array(buf)
        arr.foo = function () {
          return 42
        }
        arr.constructor = Foo
        return arr.foo() === 42 && // typed array instances can be augmented
          arr.constructor === Foo && // constructor can be set
          typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray`
          new Uint8Array(1).subarray(1, 1).byteLength === 0 // ie10 has broken `subarray`
      } catch (e) {
        return false
      }
    })()

    function kMaxLength() {
      return Buffer.TYPED_ARRAY_SUPPORT
        ? 0x7fffffff
        : 0x3fffffff
    }

    /**
     * Class: Buffer
     * =============
     *
     * The Buffer constructor returns instances of `Uint8Array` that are augmented
     * with function properties for all the node `Buffer` API functions. We use
     * `Uint8Array` so that square bracket notation works as expected -- it returns
     * a single octet.
     *
     * By augmenting the instances, we can avoid modifying the `Uint8Array`
     * prototype.
     */
    function Buffer(arg) {
      if (!(this instanceof Buffer)) {
        // Avoid going through an ArgumentsAdaptorTrampoline in the common case.
        if (arguments.length > 1) {
          return new Buffer(arg, arguments[1])
        }
        return new Buffer(arg)
      }

      this.length = 0
      this.parent = undefined

      // Common case.
      if (typeof arg === 'number') {
        return fromNumber(this, arg)
      }

      // Slightly less common case.
      if (typeof arg === 'string') {
        return fromString(this, arg, arguments.length > 1 ? arguments[1] : 'utf8')
      }

      // Unusual.
      return fromObject(this, arg)
    }

    function fromNumber(that, length) {
      that = allocate(that, length < 0 ? 0 : checked(length) | 0)
      if (!Buffer.TYPED_ARRAY_SUPPORT) {
        for (var i = 0; i < length; i++) {
          that[i] = 0
        }
      }
      return that
    }

    function fromString(that, string, encoding) {
      if (typeof encoding !== 'string' || encoding === '') {
        encoding = 'utf8'
      }

      // Assumption: byteLength() return value is always < kMaxLength.
      var length = byteLength(string, encoding) | 0
      that = allocate(that, length)

      that.write(string, encoding)
      return that
    }

    function fromObject(that, object) {
      if (Buffer.isBuffer(object)) {
        return fromBuffer(that, object)
      }

      if (isArray(object)) {
        return fromArray(that, object)
      }

      if (object == null) {
        throw new TypeError('must start with number, buffer, array or string')
      }

      if (typeof ArrayBuffer !== 'undefined' && object.buffer instanceof ArrayBuffer) {
        return fromTypedArray(that, object)
      }

      if (object.length) {
        return fromArrayLike(that, object)
      }

      return fromJsonObject(that, object)
    }

    function fromBuffer(that, buffer) {
      var length = checked(buffer.length) | 0
      that = allocate(that, length)
      buffer.copy(that, 0, 0, length)
      return that
    }

    function fromArray(that, array) {
      var length = checked(array.length) | 0
      that = allocate(that, length)
      for (var i = 0; i < length; i += 1) {
        that[i] = array[i] & 255
      }
      return that
    }

// Duplicate of fromArray() to keep fromArray() monomorphic.
    function fromTypedArray(that, array) {
      var length = checked(array.length) | 0
      that = allocate(that, length)
      // Truncating the elements is probably not what people expect from typed
      // arrays with BYTES_PER_ELEMENT > 1 but it's compatible with the behavior
      // of the old Buffer constructor.
      for (var i = 0; i < length; i += 1) {
        that[i] = array[i] & 255
      }
      return that
    }

    function fromArrayLike(that, array) {
      var length = checked(array.length) | 0
      that = allocate(that, length)
      for (var i = 0; i < length; i += 1) {
        that[i] = array[i] & 255
      }
      return that
    }

// Deserialize { type: 'Buffer', data: [1,2,3,...] } into a Buffer object.
// Returns a zero-length buffer for inputs that don't conform to the spec.
    function fromJsonObject(that, object) {
      var array
      var length = 0

      if (object.type === 'Buffer' && isArray(object.data)) {
        array = object.data
        length = checked(array.length) | 0
      }
      that = allocate(that, length)

      for (var i = 0; i < length; i += 1) {
        that[i] = array[i] & 255
      }
      return that
    }

    function allocate(that, length) {
      if (Buffer.TYPED_ARRAY_SUPPORT) {
        // Return an augmented `Uint8Array` instance, for best performance
        that = Buffer._augment(new Uint8Array(length))
      } else {
        // Fallback: Return an object instance of the Buffer class
        that.length = length
        that._isBuffer = true
      }

      var fromPool = length !== 0 && length <= Buffer.poolSize >>> 1
      if (fromPool) {
        that.parent = rootParent
      }

      return that
    }

    function checked(length) {
      // Note: cannot use `length < kMaxLength` here because that fails when
      // length is NaN (which is otherwise coerced to zero.)
      if (length >= kMaxLength()) {
        throw new RangeError('Attempt to allocate Buffer larger than maximum ' +
          'size: 0x' + kMaxLength().toString(16) + ' bytes')
      }
      return length | 0
    }

    function SlowBuffer(subject, encoding) {
      if (!(this instanceof SlowBuffer)) {
        return new SlowBuffer(subject, encoding)
      }

      var buf = new Buffer(subject, encoding)
      delete buf.parent
      return buf
    }

    Buffer.isBuffer = function isBuffer(b) {
      return !!(b != null && b._isBuffer)
    }

    Buffer.compare = function compare(a, b) {
      if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {
        throw new TypeError('Arguments must be Buffers')
      }

      if (a === b) {
        return 0
      }

      var x = a.length
      var y = b.length

      var i = 0
      var len = Math.min(x, y)
      while (i < len) {
        if (a[i] !== b[i]) {
          break
        }

        ++i
      }

      if (i !== len) {
        x = a[i]
        y = b[i]
      }

      if (x < y) {
        return -1
      }
      if (y < x) {
        return 1
      }
      return 0
    }

    Buffer.isEncoding = function isEncoding(encoding) {
      switch (String(encoding).toLowerCase()) {
        case 'hex':
        case 'utf8':
        case 'utf-8':
        case 'ascii':
        case 'binary':
        case 'base64':
        case 'raw':
        case 'ucs2':
        case 'ucs-2':
        case 'utf16le':
        case 'utf-16le':
          return true
        default:
          return false
      }
    }

    Buffer.concat = function concat(list, length) {
      if (!isArray(list)) {
        throw new TypeError('list argument must be an Array of Buffers.')
      }

      if (list.length === 0) {
        return new Buffer(0)
      } else if (list.length === 1) {
        return list[0]
      }

      var i
      if (length === undefined) {
        length = 0
        for (i = 0; i < list.length; i++) {
          length += list[i].length
        }
      }

      var buf = new Buffer(length)
      var pos = 0
      for (i = 0; i < list.length; i++) {
        var item = list[i]
        item.copy(buf, pos)
        pos += item.length
      }
      return buf
    }

    function byteLength(string, encoding) {
      if (typeof string !== 'string') {
        string = '' + string
      }

      var len = string.length
      if (len === 0) {
        return 0
      }

      // Use a for loop to avoid recursion
      var loweredCase = false
      for (; ;) {
        switch (encoding) {
          case 'ascii':
          case 'binary':
          // Deprecated
          case 'raw':
          case 'raws':
            return len
          case 'utf8':
          case 'utf-8':
            return utf8ToBytes(string).length
          case 'ucs2':
          case 'ucs-2':
          case 'utf16le':
          case 'utf-16le':
            return len * 2
          case 'hex':
            return len >>> 1
          case 'base64':
            return base64ToBytes(string).length
          default:
            if (loweredCase) {
              return utf8ToBytes(string).length
            } // assume utf8
            encoding = ('' + encoding).toLowerCase()
            loweredCase = true
        }
      }
    }

    Buffer.byteLength = byteLength

// pre-set for values that may exist in the future
    Buffer.prototype.length = undefined
    Buffer.prototype.parent = undefined

    function slowToString(encoding, start, end) {
      var loweredCase = false

      start = start | 0
      end = end === undefined || end === Infinity ? this.length : end | 0

      if (!encoding) {
        encoding = 'utf8'
      }
      if (start < 0) {
        start = 0
      }
      if (end > this.length) {
        end = this.length
      }
      if (end <= start) {
        return ''
      }

      while (true) {
        switch (encoding) {
          case 'hex':
            return hexSlice(this, start, end)

          case 'utf8':
          case 'utf-8':
            return utf8Slice(this, start, end)

          case 'ascii':
            return asciiSlice(this, start, end)

          case 'binary':
            return binarySlice(this, start, end)

          case 'base64':
            return base64Slice(this, start, end)

          case 'ucs2':
          case 'ucs-2':
          case 'utf16le':
          case 'utf-16le':
            return utf16leSlice(this, start, end)

          default:
            if (loweredCase) {
              throw new TypeError('Unknown encoding: ' + encoding)
            }
            encoding = (encoding + '').toLowerCase()
            loweredCase = true
        }
      }
    }

    Buffer.prototype.toString = function toString() {
      var length = this.length | 0
      if (length === 0) {
        return ''
      }
      if (arguments.length === 0) {
        return utf8Slice(this, 0, length)
      }
      return slowToString.apply(this, arguments)
    }

    Buffer.prototype.equals = function equals(b) {
      if (!Buffer.isBuffer(b)) {
        throw new TypeError('Argument must be a Buffer')
      }
      if (this === b) {
        return true
      }
      return Buffer.compare(this, b) === 0
    }

    Buffer.prototype.inspect = function inspect() {
      var str = ''
      var max = exports.INSPECT_MAX_BYTES
      if (this.length > 0) {
        str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')
        if (this.length > max) {
          str += ' ... '
        }
      }
      return '<Buffer ' + str + '>'
    }

    Buffer.prototype.compare = function compare(b) {
      if (!Buffer.isBuffer(b)) {
        throw new TypeError('Argument must be a Buffer')
      }
      if (this === b) {
        return 0
      }
      return Buffer.compare(this, b)
    }

    Buffer.prototype.indexOf = function indexOf(val, byteOffset) {
      if (byteOffset > 0x7fffffff) {
        byteOffset = 0x7fffffff
      } else if (byteOffset < -0x80000000) {
        byteOffset = -0x80000000
      }
      byteOffset >>= 0

      if (this.length === 0) {
        return -1
      }
      if (byteOffset >= this.length) {
        return -1
      }

      // Negative offsets start from the end of the buffer
      if (byteOffset < 0) {
        byteOffset = Math.max(this.length + byteOffset, 0)
      }

      if (typeof val === 'string') {
        if (val.length === 0) {
          return -1
        } // special case: looking for empty string always fails
        return String.prototype.indexOf.call(this, val, byteOffset)
      }
      if (Buffer.isBuffer(val)) {
        return arrayIndexOf(this, val, byteOffset)
      }
      if (typeof val === 'number') {
        if (Buffer.TYPED_ARRAY_SUPPORT && Uint8Array.prototype.indexOf === 'function') {
          return Uint8Array.prototype.indexOf.call(this, val, byteOffset)
        }
        return arrayIndexOf(this, [val], byteOffset)
      }

      function arrayIndexOf(arr, val, byteOffset) {
        var foundIndex = -1
        for (var i = 0; byteOffset + i < arr.length; i++) {
          if (arr[byteOffset + i] === val[foundIndex === -1 ? 0 : i - foundIndex]) {
            if (foundIndex === -1) {
              foundIndex = i
            }
            if (i - foundIndex + 1 === val.length) {
              return byteOffset + foundIndex
            }
          } else {
            foundIndex = -1
          }
        }
        return -1
      }

      throw new TypeError('val must be string, number or Buffer')
    }

// `get` will be removed in Node 0.13+
    Buffer.prototype.get = function get(offset) {
      console.log('.get() is deprecated. Access using array indexes instead.')
      return this.readUInt8(offset)
    }

// `set` will be removed in Node 0.13+
    Buffer.prototype.set = function set(v, offset) {
      console.log('.set() is deprecated. Access using array indexes instead.')
      return this.writeUInt8(v, offset)
    }

    function hexWrite(buf, string, offset, length) {
      offset = Number(offset) || 0
      var remaining = buf.length - offset
      if (!length) {
        length = remaining
      } else {
        length = Number(length)
        if (length > remaining) {
          length = remaining
        }
      }

      // must be an even number of digits
      var strLen = string.length
      if (strLen % 2 !== 0) {
        throw new Error('Invalid hex string')
      }

      if (length > strLen / 2) {
        length = strLen / 2
      }
      for (var i = 0; i < length; i++) {
        var parsed = parseInt(string.substr(i * 2, 2), 16)
        if (isNaN(parsed)) {
          throw new Error('Invalid hex string')
        }
        buf[offset + i] = parsed
      }
      return i
    }

    function utf8Write(buf, string, offset, length) {
      return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)
    }

    function asciiWrite(buf, string, offset, length) {
      return blitBuffer(asciiToBytes(string), buf, offset, length)
    }

    function binaryWrite(buf, string, offset, length) {
      return asciiWrite(buf, string, offset, length)
    }

    function base64Write(buf, string, offset, length) {
      return blitBuffer(base64ToBytes(string), buf, offset, length)
    }

    function ucs2Write(buf, string, offset, length) {
      return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)
    }

    Buffer.prototype.write = function write(string, offset, length, encoding) {
      // Buffer#write(string)
      if (offset === undefined) {
        encoding = 'utf8'
        length = this.length
        offset = 0
        // Buffer#write(string, encoding)
      } else if (length === undefined && typeof offset === 'string') {
        encoding = offset
        length = this.length
        offset = 0
        // Buffer#write(string, offset[, length][, encoding])
      } else if (isFinite(offset)) {
        offset = offset | 0
        if (isFinite(length)) {
          length = length | 0
          if (encoding === undefined) {
            encoding = 'utf8'
          }
        } else {
          encoding = length
          length = undefined
        }
        // legacy write(string, encoding, offset, length) - remove in v0.13
      } else {
        var swap = encoding
        encoding = offset
        offset = length | 0
        length = swap
      }

      var remaining = this.length - offset
      if (length === undefined || length > remaining) {
        length = remaining
      }

      if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {
        throw new RangeError('attempt to write outside buffer bounds')
      }

      if (!encoding) {
        encoding = 'utf8'
      }

      var loweredCase = false
      for (; ;) {
        switch (encoding) {
          case 'hex':
            return hexWrite(this, string, offset, length)

          case 'utf8':
          case 'utf-8':
            return utf8Write(this, string, offset, length)

          case 'ascii':
            return asciiWrite(this, string, offset, length)

          case 'binary':
            return binaryWrite(this, string, offset, length)

          case 'base64':
            // Warning: maxLength not taken into account in base64Write
            return base64Write(this, string, offset, length)

          case 'ucs2':
          case 'ucs-2':
          case 'utf16le':
          case 'utf-16le':
            return ucs2Write(this, string, offset, length)

          default:
            if (loweredCase) {
              throw new TypeError('Unknown encoding: ' + encoding)
            }
            encoding = ('' + encoding).toLowerCase()
            loweredCase = true
        }
      }
    }

    Buffer.prototype.toJSON = function toJSON() {
      return {
        type: 'Buffer',
        data: Array.prototype.slice.call(this._arr || this, 0)
      }
    }

    function base64Slice(buf, start, end) {
      if (start === 0 && end === buf.length) {
        return base64.fromByteArray(buf)
      } else {
        return base64.fromByteArray(buf.slice(start, end))
      }
    }

    function utf8Slice(buf, start, end) {
      var res = ''
      var tmp = ''
      end = Math.min(buf.length, end)

      for (var i = start; i < end; i++) {
        if (buf[i] <= 0x7F) {
          res += decodeUtf8Char(tmp) + String.fromCharCode(buf[i])
          tmp = ''
        } else {
          tmp += '%' + buf[i].toString(16)
        }
      }

      return res + decodeUtf8Char(tmp)
    }

    function asciiSlice(buf, start, end) {
      var ret = ''
      end = Math.min(buf.length, end)

      for (var i = start; i < end; i++) {
        ret += String.fromCharCode(buf[i] & 0x7F)
      }
      return ret
    }

    function binarySlice(buf, start, end) {
      var ret = ''
      end = Math.min(buf.length, end)

      for (var i = start; i < end; i++) {
        ret += String.fromCharCode(buf[i])
      }
      return ret
    }

    function hexSlice(buf, start, end) {
      var len = buf.length

      if (!start || start < 0) {
        start = 0
      }
      if (!end || end < 0 || end > len) {
        end = len
      }

      var out = ''
      for (var i = start; i < end; i++) {
        out += toHex(buf[i])
      }
      return out
    }

    function utf16leSlice(buf, start, end) {
      var bytes = buf.slice(start, end)
      var res = ''
      for (var i = 0; i < bytes.length; i += 2) {
        res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256)
      }
      return res
    }

    Buffer.prototype.slice = function slice(start, end) {
      var len = this.length
      start = ~~start
      end = end === undefined ? len : ~~end

      if (start < 0) {
        start += len
        if (start < 0) {
          start = 0
        }
      } else if (start > len) {
        start = len
      }

      if (end < 0) {
        end += len
        if (end < 0) {
          end = 0
        }
      } else if (end > len) {
        end = len
      }

      if (end < start) {
        end = start
      }

      var newBuf
      if (Buffer.TYPED_ARRAY_SUPPORT) {
        newBuf = Buffer._augment(this.subarray(start, end))
      } else {
        var sliceLen = end - start
        newBuf = new Buffer(sliceLen, undefined)
        for (var i = 0; i < sliceLen; i++) {
          newBuf[i] = this[i + start]
        }
      }

      if (newBuf.length) {
        newBuf.parent = this.parent || this
      }

      return newBuf
    }

    /*
     * Need to make sure that buffer isn't trying to write out of bounds.
     */
    function checkOffset(offset, ext, length) {
      if ((offset % 1) !== 0 || offset < 0) {
        throw new RangeError('offset is not uint')
      }
      if (offset + ext > length) {
        throw new RangeError('Trying to access beyond buffer length')
      }
    }

    Buffer.prototype.readUIntLE = function readUIntLE(offset, byteLength, noAssert) {
      offset = offset | 0
      byteLength = byteLength | 0
      if (!noAssert) {
        checkOffset(offset, byteLength, this.length)
      }

      var val = this[offset]
      var mul = 1
      var i = 0
      while (++i < byteLength && (mul *= 0x100)) {
        val += this[offset + i] * mul
      }

      return val
    }

    Buffer.prototype.readUIntBE = function readUIntBE(offset, byteLength, noAssert) {
      offset = offset | 0
      byteLength = byteLength | 0
      if (!noAssert) {
        checkOffset(offset, byteLength, this.length)
      }

      var val = this[offset + --byteLength]
      var mul = 1
      while (byteLength > 0 && (mul *= 0x100)) {
        val += this[offset + --byteLength] * mul
      }

      return val
    }

    Buffer.prototype.readUInt8 = function readUInt8(offset, noAssert) {
      if (!noAssert) {
        checkOffset(offset, 1, this.length)
      }
      return this[offset]
    }

    Buffer.prototype.readUInt16LE = function readUInt16LE(offset, noAssert) {
      if (!noAssert) {
        checkOffset(offset, 2, this.length)
      }
      return this[offset] | (this[offset + 1] << 8)
    }

    Buffer.prototype.readUInt16BE = function readUInt16BE(offset, noAssert) {
      if (!noAssert) {
        checkOffset(offset, 2, this.length)
      }
      return (this[offset] << 8) | this[offset + 1]
    }

    Buffer.prototype.readUInt32LE = function readUInt32LE(offset, noAssert) {
      if (!noAssert) {
        checkOffset(offset, 4, this.length)
      }

      return ((this[offset]) |
        (this[offset + 1] << 8) |
        (this[offset + 2] << 16)) +
        (this[offset + 3] * 0x1000000)
    }

    Buffer.prototype.readUInt32BE = function readUInt32BE(offset, noAssert) {
      if (!noAssert) {
        checkOffset(offset, 4, this.length)
      }

      return (this[offset] * 0x1000000) +
        ((this[offset + 1] << 16) |
        (this[offset + 2] << 8) |
        this[offset + 3])
    }

    Buffer.prototype.readIntLE = function readIntLE(offset, byteLength, noAssert) {
      offset = offset | 0
      byteLength = byteLength | 0
      if (!noAssert) {
        checkOffset(offset, byteLength, this.length)
      }

      var val = this[offset]
      var mul = 1
      var i = 0
      while (++i < byteLength && (mul *= 0x100)) {
        val += this[offset + i] * mul
      }
      mul *= 0x80

      if (val >= mul) {
        val -= Math.pow(2, 8 * byteLength)
      }

      return val
    }

    Buffer.prototype.readIntBE = function readIntBE(offset, byteLength, noAssert) {
      offset = offset | 0
      byteLength = byteLength | 0
      if (!noAssert) {
        checkOffset(offset, byteLength, this.length)
      }

      var i = byteLength
      var mul = 1
      var val = this[offset + --i]
      while (i > 0 && (mul *= 0x100)) {
        val += this[offset + --i] * mul
      }
      mul *= 0x80

      if (val >= mul) {
        val -= Math.pow(2, 8 * byteLength)
      }

      return val
    }

    Buffer.prototype.readInt8 = function readInt8(offset, noAssert) {
      if (!noAssert) {
        checkOffset(offset, 1, this.length)
      }
      if (!(this[offset] & 0x80)) {
        return (this[offset])
      }
      return ((0xff - this[offset] + 1) * -1)
    }

    Buffer.prototype.readInt16LE = function readInt16LE(offset, noAssert) {
      if (!noAssert) {
        checkOffset(offset, 2, this.length)
      }
      var val = this[offset] | (this[offset + 1] << 8)
      return (val & 0x8000) ? val | 0xFFFF0000 : val
    }

    Buffer.prototype.readInt16BE = function readInt16BE(offset, noAssert) {
      if (!noAssert) {
        checkOffset(offset, 2, this.length)
      }
      var val = this[offset + 1] | (this[offset] << 8)
      return (val & 0x8000) ? val | 0xFFFF0000 : val
    }

    Buffer.prototype.readInt32LE = function readInt32LE(offset, noAssert) {
      if (!noAssert) {
        checkOffset(offset, 4, this.length)
      }

      return (this[offset]) |
        (this[offset + 1] << 8) |
        (this[offset + 2] << 16) |
        (this[offset + 3] << 24)
    }

    Buffer.prototype.readInt32BE = function readInt32BE(offset, noAssert) {
      if (!noAssert) {
        checkOffset(offset, 4, this.length)
      }

      return (this[offset] << 24) |
        (this[offset + 1] << 16) |
        (this[offset + 2] << 8) |
        (this[offset + 3])
    }

    Buffer.prototype.readFloatLE = function readFloatLE(offset, noAssert) {
      if (!noAssert) {
        checkOffset(offset, 4, this.length)
      }
      return ieee754.read(this, offset, true, 23, 4)
    }

    Buffer.prototype.readFloatBE = function readFloatBE(offset, noAssert) {
      if (!noAssert) {
        checkOffset(offset, 4, this.length)
      }
      return ieee754.read(this, offset, false, 23, 4)
    }

    Buffer.prototype.readDoubleLE = function readDoubleLE(offset, noAssert) {
      if (!noAssert) {
        checkOffset(offset, 8, this.length)
      }
      return ieee754.read(this, offset, true, 52, 8)
    }

    Buffer.prototype.readDoubleBE = function readDoubleBE(offset, noAssert) {
      if (!noAssert) {
        checkOffset(offset, 8, this.length)
      }
      return ieee754.read(this, offset, false, 52, 8)
    }

    function checkInt(buf, value, offset, ext, max, min) {
      if (!Buffer.isBuffer(buf)) {
        throw new TypeError('buffer must be a Buffer instance')
      }
      if (value > max || value < min) {
        throw new RangeError('value is out of bounds')
      }
      if (offset + ext > buf.length) {
        throw new RangeError('index out of range')
      }
    }

    Buffer.prototype.writeUIntLE = function writeUIntLE(value, offset, byteLength, noAssert) {
      value = +value
      offset = offset | 0
      byteLength = byteLength | 0
      if (!noAssert) {
        checkInt(this, value, offset, byteLength, Math.pow(2, 8 * byteLength), 0)
      }

      var mul = 1
      var i = 0
      this[offset] = value & 0xFF
      while (++i < byteLength && (mul *= 0x100)) {
        this[offset + i] = (value / mul) & 0xFF
      }

      return offset + byteLength
    }

    Buffer.prototype.writeUIntBE = function writeUIntBE(value, offset, byteLength, noAssert) {
      value = +value
      offset = offset | 0
      byteLength = byteLength | 0
      if (!noAssert) {
        checkInt(this, value, offset, byteLength, Math.pow(2, 8 * byteLength), 0)
      }

      var i = byteLength - 1
      var mul = 1
      this[offset + i] = value & 0xFF
      while (--i >= 0 && (mul *= 0x100)) {
        this[offset + i] = (value / mul) & 0xFF
      }

      return offset + byteLength
    }

    Buffer.prototype.writeUInt8 = function writeUInt8(value, offset, noAssert) {
      value = +value
      offset = offset | 0
      if (!noAssert) {
        checkInt(this, value, offset, 1, 0xff, 0)
      }
      if (!Buffer.TYPED_ARRAY_SUPPORT) {
        value = Math.floor(value)
      }
      this[offset] = value
      return offset + 1
    }

    function objectWriteUInt16(buf, value, offset, littleEndian) {
      if (value < 0) {
        value = 0xffff + value + 1
      }
      for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; i++) {
        buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>
          (littleEndian ? i : 1 - i) * 8
      }
    }

    Buffer.prototype.writeUInt16LE = function writeUInt16LE(value, offset, noAssert) {
      value = +value
      offset = offset | 0
      if (!noAssert) {
        checkInt(this, value, offset, 2, 0xffff, 0)
      }
      if (Buffer.TYPED_ARRAY_SUPPORT) {
        this[offset] = value
        this[offset + 1] = (value >>> 8)
      } else {
        objectWriteUInt16(this, value, offset, true)
      }
      return offset + 2
    }

    Buffer.prototype.writeUInt16BE = function writeUInt16BE(value, offset, noAssert) {
      value = +value
      offset = offset | 0
      if (!noAssert) {
        checkInt(this, value, offset, 2, 0xffff, 0)
      }
      if (Buffer.TYPED_ARRAY_SUPPORT) {
        this[offset] = (value >>> 8)
        this[offset + 1] = value
      } else {
        objectWriteUInt16(this, value, offset, false)
      }
      return offset + 2
    }

    function objectWriteUInt32(buf, value, offset, littleEndian) {
      if (value < 0) {
        value = 0xffffffff + value + 1
      }
      for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; i++) {
        buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff
      }
    }

    Buffer.prototype.writeUInt32LE = function writeUInt32LE(value, offset, noAssert) {
      value = +value
      offset = offset | 0
      if (!noAssert) {
        checkInt(this, value, offset, 4, 0xffffffff, 0)
      }
      if (Buffer.TYPED_ARRAY_SUPPORT) {
        this[offset + 3] = (value >>> 24)
        this[offset + 2] = (value >>> 16)
        this[offset + 1] = (value >>> 8)
        this[offset] = value
      } else {
        objectWriteUInt32(this, value, offset, true)
      }
      return offset + 4
    }

    Buffer.prototype.writeUInt32BE = function writeUInt32BE(value, offset, noAssert) {
      value = +value
      offset = offset | 0
      if (!noAssert) {
        checkInt(this, value, offset, 4, 0xffffffff, 0)
      }
      if (Buffer.TYPED_ARRAY_SUPPORT) {
        this[offset] = (value >>> 24)
        this[offset + 1] = (value >>> 16)
        this[offset + 2] = (value >>> 8)
        this[offset + 3] = value
      } else {
        objectWriteUInt32(this, value, offset, false)
      }
      return offset + 4
    }

    Buffer.prototype.writeIntLE = function writeIntLE(value, offset, byteLength, noAssert) {
      value = +value
      offset = offset | 0
      if (!noAssert) {
        var limit = Math.pow(2, 8 * byteLength - 1)

        checkInt(this, value, offset, byteLength, limit - 1, -limit)
      }

      var i = 0
      var mul = 1
      var sub = value < 0 ? 1 : 0
      this[offset] = value & 0xFF
      while (++i < byteLength && (mul *= 0x100)) {
        this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
      }

      return offset + byteLength
    }

    Buffer.prototype.writeIntBE = function writeIntBE(value, offset, byteLength, noAssert) {
      value = +value
      offset = offset | 0
      if (!noAssert) {
        var limit = Math.pow(2, 8 * byteLength - 1)

        checkInt(this, value, offset, byteLength, limit - 1, -limit)
      }

      var i = byteLength - 1
      var mul = 1
      var sub = value < 0 ? 1 : 0
      this[offset + i] = value & 0xFF
      while (--i >= 0 && (mul *= 0x100)) {
        this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
      }

      return offset + byteLength
    }

    Buffer.prototype.writeInt8 = function writeInt8(value, offset, noAssert) {
      value = +value
      offset = offset | 0
      if (!noAssert) {
        checkInt(this, value, offset, 1, 0x7f, -0x80)
      }
      if (!Buffer.TYPED_ARRAY_SUPPORT) {
        value = Math.floor(value)
      }
      if (value < 0) {
        value = 0xff + value + 1
      }
      this[offset] = value
      return offset + 1
    }

    Buffer.prototype.writeInt16LE = function writeInt16LE(value, offset, noAssert) {
      value = +value
      offset = offset | 0
      if (!noAssert) {
        checkInt(this, value, offset, 2, 0x7fff, -0x8000)
      }
      if (Buffer.TYPED_ARRAY_SUPPORT) {
        this[offset] = value
        this[offset + 1] = (value >>> 8)
      } else {
        objectWriteUInt16(this, value, offset, true)
      }
      return offset + 2
    }

    Buffer.prototype.writeInt16BE = function writeInt16BE(value, offset, noAssert) {
      value = +value
      offset = offset | 0
      if (!noAssert) {
        checkInt(this, value, offset, 2, 0x7fff, -0x8000)
      }
      if (Buffer.TYPED_ARRAY_SUPPORT) {
        this[offset] = (value >>> 8)
        this[offset + 1] = value
      } else {
        objectWriteUInt16(this, value, offset, false)
      }
      return offset + 2
    }

    Buffer.prototype.writeInt32LE = function writeInt32LE(value, offset, noAssert) {
      value = +value
      offset = offset | 0
      if (!noAssert) {
        checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
      }
      if (Buffer.TYPED_ARRAY_SUPPORT) {
        this[offset] = value
        this[offset + 1] = (value >>> 8)
        this[offset + 2] = (value >>> 16)
        this[offset + 3] = (value >>> 24)
      } else {
        objectWriteUInt32(this, value, offset, true)
      }
      return offset + 4
    }

    Buffer.prototype.writeInt32BE = function writeInt32BE(value, offset, noAssert) {
      value = +value
      offset = offset | 0
      if (!noAssert) {
        checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
      }
      if (value < 0) {
        value = 0xffffffff + value + 1
      }
      if (Buffer.TYPED_ARRAY_SUPPORT) {
        this[offset] = (value >>> 24)
        this[offset + 1] = (value >>> 16)
        this[offset + 2] = (value >>> 8)
        this[offset + 3] = value
      } else {
        objectWriteUInt32(this, value, offset, false)
      }
      return offset + 4
    }

    function checkIEEE754(buf, value, offset, ext, max, min) {
      if (value > max || value < min) {
        throw new RangeError('value is out of bounds')
      }
      if (offset + ext > buf.length) {
        throw new RangeError('index out of range')
      }
      if (offset < 0) {
        throw new RangeError('index out of range')
      }
    }

    function writeFloat(buf, value, offset, littleEndian, noAssert) {
      if (!noAssert) {
        checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)
      }
      ieee754.write(buf, value, offset, littleEndian, 23, 4)
      return offset + 4
    }

    Buffer.prototype.writeFloatLE = function writeFloatLE(value, offset, noAssert) {
      return writeFloat(this, value, offset, true, noAssert)
    }

    Buffer.prototype.writeFloatBE = function writeFloatBE(value, offset, noAssert) {
      return writeFloat(this, value, offset, false, noAssert)
    }

    function writeDouble(buf, value, offset, littleEndian, noAssert) {
      if (!noAssert) {
        checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)
      }
      ieee754.write(buf, value, offset, littleEndian, 52, 8)
      return offset + 8
    }

    Buffer.prototype.writeDoubleLE = function writeDoubleLE(value, offset, noAssert) {
      return writeDouble(this, value, offset, true, noAssert)
    }

    Buffer.prototype.writeDoubleBE = function writeDoubleBE(value, offset, noAssert) {
      return writeDouble(this, value, offset, false, noAssert)
    }

// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)
    Buffer.prototype.copy = function copy(target, targetStart, start, end) {
      if (!start) {
        start = 0
      }
      if (!end && end !== 0) {
        end = this.length
      }
      if (targetStart >= target.length) {
        targetStart = target.length
      }
      if (!targetStart) {
        targetStart = 0
      }
      if (end > 0 && end < start) {
        end = start
      }

      // Copy 0 bytes; we're done
      if (end === start) {
        return 0
      }
      if (target.length === 0 || this.length === 0) {
        return 0
      }

      // Fatal error conditions
      if (targetStart < 0) {
        throw new RangeError('targetStart out of bounds')
      }
      if (start < 0 || start >= this.length) {
        throw new RangeError('sourceStart out of bounds')
      }
      if (end < 0) {
        throw new RangeError('sourceEnd out of bounds')
      }

      // Are we oob?
      if (end > this.length) {
        end = this.length
      }
      if (target.length - targetStart < end - start) {
        end = target.length - targetStart + start
      }

      var len = end - start

      if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {
        for (var i = 0; i < len; i++) {
          target[i + targetStart] = this[i + start]
        }
      } else {
        target._set(this.subarray(start, start + len), targetStart)
      }

      return len
    }

// fill(value, start=0, end=buffer.length)
    Buffer.prototype.fill = function fill(value, start, end) {
      if (!value) {
        value = 0
      }
      if (!start) {
        start = 0
      }
      if (!end) {
        end = this.length
      }

      if (end < start) {
        throw new RangeError('end < start')
      }

      // Fill 0 bytes; we're done
      if (end === start) {
        return
      }
      if (this.length === 0) {
        return
      }

      if (start < 0 || start >= this.length) {
        throw new RangeError('start out of bounds')
      }
      if (end < 0 || end > this.length) {
        throw new RangeError('end out of bounds')
      }

      var i
      if (typeof value === 'number') {
        for (i = start; i < end; i++) {
          this[i] = value
        }
      } else {
        var bytes = utf8ToBytes(value.toString())
        var len = bytes.length
        for (i = start; i < end; i++) {
          this[i] = bytes[i % len]
        }
      }

      return this
    }

    /**
     * Creates a new `ArrayBuffer` with the *copied* memory of the buffer instance.
     * Added in Node 0.12. Only available in browsers that support ArrayBuffer.
     */
    Buffer.prototype.toArrayBuffer = function toArrayBuffer() {
      if (typeof Uint8Array !== 'undefined') {
        if (Buffer.TYPED_ARRAY_SUPPORT) {
          return (new Buffer(this)).buffer
        } else {
          var buf = new Uint8Array(this.length)
          for (var i = 0, len = buf.length; i < len; i += 1) {
            buf[i] = this[i]
          }
          return buf.buffer
        }
      } else {
        throw new TypeError('Buffer.toArrayBuffer not supported in this browser')
      }
    }

// HELPER FUNCTIONS
// ================

    var BP = Buffer.prototype

    /**
     * Augment a Uint8Array *instance* (not the Uint8Array class!) with Buffer methods
     */
    Buffer._augment = function _augment(arr) {
      arr.constructor = Buffer
      arr._isBuffer = true

      // save reference to original Uint8Array set method before overwriting
      arr._set = arr.set

      // deprecated, will be removed in node 0.13+
      arr.get = BP.get
      arr.set = BP.set

      arr.write = BP.write
      arr.toString = BP.toString
      arr.toLocaleString = BP.toString
      arr.toJSON = BP.toJSON
      arr.equals = BP.equals
      arr.compare = BP.compare
      arr.indexOf = BP.indexOf
      arr.copy = BP.copy
      arr.slice = BP.slice
      arr.readUIntLE = BP.readUIntLE
      arr.readUIntBE = BP.readUIntBE
      arr.readUInt8 = BP.readUInt8
      arr.readUInt16LE = BP.readUInt16LE
      arr.readUInt16BE = BP.readUInt16BE
      arr.readUInt32LE = BP.readUInt32LE
      arr.readUInt32BE = BP.readUInt32BE
      arr.readIntLE = BP.readIntLE
      arr.readIntBE = BP.readIntBE
      arr.readInt8 = BP.readInt8
      arr.readInt16LE = BP.readInt16LE
      arr.readInt16BE = BP.readInt16BE
      arr.readInt32LE = BP.readInt32LE
      arr.readInt32BE = BP.readInt32BE
      arr.readFloatLE = BP.readFloatLE
      arr.readFloatBE = BP.readFloatBE
      arr.readDoubleLE = BP.readDoubleLE
      arr.readDoubleBE = BP.readDoubleBE
      arr.writeUInt8 = BP.writeUInt8
      arr.writeUIntLE = BP.writeUIntLE
      arr.writeUIntBE = BP.writeUIntBE
      arr.writeUInt16LE = BP.writeUInt16LE
      arr.writeUInt16BE = BP.writeUInt16BE
      arr.writeUInt32LE = BP.writeUInt32LE
      arr.writeUInt32BE = BP.writeUInt32BE
      arr.writeIntLE = BP.writeIntLE
      arr.writeIntBE = BP.writeIntBE
      arr.writeInt8 = BP.writeInt8
      arr.writeInt16LE = BP.writeInt16LE
      arr.writeInt16BE = BP.writeInt16BE
      arr.writeInt32LE = BP.writeInt32LE
      arr.writeInt32BE = BP.writeInt32BE
      arr.writeFloatLE = BP.writeFloatLE
      arr.writeFloatBE = BP.writeFloatBE
      arr.writeDoubleLE = BP.writeDoubleLE
      arr.writeDoubleBE = BP.writeDoubleBE
      arr.fill = BP.fill
      arr.inspect = BP.inspect
      arr.toArrayBuffer = BP.toArrayBuffer

      return arr
    }

    var INVALID_BASE64_RE = /[^+\/0-9A-z\-]/g

    function base64clean(str) {
      // Node strips out invalid characters like \n and \t from the string, base64-js does not
      str = stringtrim(str).replace(INVALID_BASE64_RE, '')
      // Node converts strings with length < 2 to ''
      if (str.length < 2) {
        return ''
      }
      // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not
      while (str.length % 4 !== 0) {
        str = str + '='
      }
      return str
    }

    function stringtrim(str) {
      if (str.trim) {
        return str.trim()
      }
      return str.replace(/^\s+|\s+$/g, '')
    }

    function toHex(n) {
      if (n < 16) {
        return '0' + n.toString(16)
      }
      return n.toString(16)
    }

    function utf8ToBytes(string, units) {
      units = units || Infinity
      var codePoint
      var length = string.length
      var leadSurrogate = null
      var bytes = []
      var i = 0

      for (; i < length; i++) {
        codePoint = string.charCodeAt(i)

        // is surrogate component
        if (codePoint > 0xD7FF && codePoint < 0xE000) {
          // last char was a lead
          if (leadSurrogate) {
            // 2 leads in a row
            if (codePoint < 0xDC00) {
              if ((units -= 3) > -1) {
                bytes.push(0xEF, 0xBF, 0xBD)
              }
              leadSurrogate = codePoint
              continue
            } else {
              // valid surrogate pair
              codePoint = leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00 | 0x10000
              leadSurrogate = null
            }
          } else {
            // no lead yet

            if (codePoint > 0xDBFF) {
              // unexpected trail
              if ((units -= 3) > -1) {
                bytes.push(0xEF, 0xBF, 0xBD)
              }
              continue
            } else if (i + 1 === length) {
              // unpaired lead
              if ((units -= 3) > -1) {
                bytes.push(0xEF, 0xBF, 0xBD)
              }
              continue
            } else {
              // valid lead
              leadSurrogate = codePoint
              continue
            }
          }
        } else if (leadSurrogate) {
          // valid bmp char, but last char was a lead
          if ((units -= 3) > -1) {
            bytes.push(0xEF, 0xBF, 0xBD)
          }
          leadSurrogate = null
        }

        // encode utf8
        if (codePoint < 0x80) {
          if ((units -= 1) < 0) {
            break
          }
          bytes.push(codePoint)
        } else if (codePoint < 0x800) {
          if ((units -= 2) < 0) {
            break
          }
          bytes.push(
            codePoint >> 0x6 | 0xC0,
            codePoint & 0x3F | 0x80
          )
        } else if (codePoint < 0x10000) {
          if ((units -= 3) < 0) {
            break
          }
          bytes.push(
            codePoint >> 0xC | 0xE0,
            codePoint >> 0x6 & 0x3F | 0x80,
            codePoint & 0x3F | 0x80
          )
        } else if (codePoint < 0x200000) {
          if ((units -= 4) < 0) {
            break
          }
          bytes.push(
            codePoint >> 0x12 | 0xF0,
            codePoint >> 0xC & 0x3F | 0x80,
            codePoint >> 0x6 & 0x3F | 0x80,
            codePoint & 0x3F | 0x80
          )
        } else {
          throw new Error('Invalid code point')
        }
      }

      return bytes
    }

    function asciiToBytes(str) {
      var byteArray = []
      for (var i = 0; i < str.length; i++) {
        // Node's code seems to be doing this and not & 0x7F..
        byteArray.push(str.charCodeAt(i) & 0xFF)
      }
      return byteArray
    }

    function utf16leToBytes(str, units) {
      var c, hi, lo
      var byteArray = []
      for (var i = 0; i < str.length; i++) {
        if ((units -= 2) < 0) {
          break
        }

        c = str.charCodeAt(i)
        hi = c >> 8
        lo = c % 256
        byteArray.push(lo)
        byteArray.push(hi)
      }

      return byteArray
    }

    function base64ToBytes(str) {
      return base64.toByteArray(base64clean(str))
    }

    function blitBuffer(src, dst, offset, length) {
      for (var i = 0; i < length; i++) {
        if ((i + offset >= dst.length) || (i >= src.length)) {
          break
        }
        dst[i + offset] = src[i]
      }
      return i
    }

    function decodeUtf8Char(str) {
      try {
        return decodeURIComponent(str)
      } catch (err) {
        return String.fromCharCode(0xFFFD) // UTF 8 invalid char
      }
    }

  }, { "base64-js": 3, "ieee754": 4, "is-array": 5 }],
  3: [function (require, module, exports) {
    var lookup = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';

    ;
    (function (exports) {
      'use strict';

      var Arr = (typeof Uint8Array !== 'undefined')
        ? Uint8Array
        : Array

      var PLUS = '+'.charCodeAt(0)
      var SLASH = '/'.charCodeAt(0)
      var NUMBER = '0'.charCodeAt(0)
      var LOWER = 'a'.charCodeAt(0)
      var UPPER = 'A'.charCodeAt(0)
      var PLUS_URL_SAFE = '-'.charCodeAt(0)
      var SLASH_URL_SAFE = '_'.charCodeAt(0)

      function decode(elt) {
        var code = elt.charCodeAt(0)
        if (code === PLUS ||
          code === PLUS_URL_SAFE) {
          return 62
        } // '+'
        if (code === SLASH ||
          code === SLASH_URL_SAFE) {
          return 63
        } // '/'
        if (code < NUMBER) {
          return -1
        } //no match
        if (code < NUMBER + 10) {
          return code - NUMBER + 26 + 26
        }
        if (code < UPPER + 26) {
          return code - UPPER
        }
        if (code < LOWER + 26) {
          return code - LOWER + 26
        }
      }

      function b64ToByteArray(b64) {
        var i, j, l, tmp, placeHolders, arr

        if (b64.length % 4 > 0) {
          throw new Error('Invalid string. Length must be a multiple of 4')
        }

        // the number of equal signs (place holders)
        // if there are two placeholders, than the two characters before it
        // represent one byte
        // if there is only one, then the three characters before it represent 2 bytes
        // this is just a cheap hack to not do indexOf twice
        var len = b64.length
        placeHolders = '=' === b64.charAt(len - 2) ? 2 : '=' === b64.charAt(len - 1) ? 1 : 0

        // base64 is 4/3 + up to two characters of the original data
        arr = new Arr(b64.length * 3 / 4 - placeHolders)

        // if there are placeholders, only get up to the last complete 4 chars
        l = placeHolders > 0 ? b64.length - 4 : b64.length

        var L = 0

        function push(v) {
          arr[L++] = v
        }

        for (i = 0, j = 0; i < l; i += 4, j += 3) {
          tmp = (decode(b64.charAt(i)) << 18) | (decode(b64.charAt(i + 1)) << 12) | (decode(b64.charAt(i + 2)) << 6) | decode(b64.charAt(i + 3))
          push((tmp & 0xFF0000) >> 16)
          push((tmp & 0xFF00) >> 8)
          push(tmp & 0xFF)
        }

        if (placeHolders === 2) {
          tmp = (decode(b64.charAt(i)) << 2) | (decode(b64.charAt(i + 1)) >> 4)
          push(tmp & 0xFF)
        } else if (placeHolders === 1) {
          tmp = (decode(b64.charAt(i)) << 10) | (decode(b64.charAt(i + 1)) << 4) | (decode(b64.charAt(i + 2)) >> 2)
          push((tmp >> 8) & 0xFF)
          push(tmp & 0xFF)
        }

        return arr
      }

      function uint8ToBase64(uint8) {
        var i,
          extraBytes = uint8.length % 3, // if we have 1 byte left, pad 2 bytes
          output = "",
          temp, length

        function encode(num) {
          return lookup.charAt(num)
        }

        function tripletToBase64(num) {
          return encode(num >> 18 & 0x3F) + encode(num >> 12 & 0x3F) + encode(num >> 6 & 0x3F) + encode(num & 0x3F)
        }

        // go through the array every three bytes, we'll deal with trailing stuff later
        for (i = 0, length = uint8.length - extraBytes; i < length; i += 3) {
          temp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2])
          output += tripletToBase64(temp)
        }

        // pad the end with zeros, but make sure to not forget the extra bytes
        switch (extraBytes) {
          case 1:
            temp = uint8[uint8.length - 1]
            output += encode(temp >> 2)
            output += encode((temp << 4) & 0x3F)
            output += '=='
            break
          case 2:
            temp = (uint8[uint8.length - 2] << 8) + (uint8[uint8.length - 1])
            output += encode(temp >> 10)
            output += encode((temp >> 4) & 0x3F)
            output += encode((temp << 2) & 0x3F)
            output += '='
            break
        }

        return output
      }

      exports.toByteArray = b64ToByteArray
      exports.fromByteArray = uint8ToBase64
    }(typeof exports === 'undefined' ? (this.base64js = {}) : exports))

  }, {}],
  4: [function (require, module, exports) {
    exports.read = function (buffer, offset, isLE, mLen, nBytes) {
      var e, m
      var eLen = nBytes * 8 - mLen - 1
      var eMax = (1 << eLen) - 1
      var eBias = eMax >> 1
      var nBits = -7
      var i = isLE ? (nBytes - 1) : 0
      var d = isLE ? -1 : 1
      var s = buffer[offset + i]

      i += d

      e = s & ((1 << (-nBits)) - 1)
      s >>= (-nBits)
      nBits += eLen
      for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {
      }

      m = e & ((1 << (-nBits)) - 1)
      e >>= (-nBits)
      nBits += mLen
      for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {
      }

      if (e === 0) {
        e = 1 - eBias
      } else if (e === eMax) {
        return m ? NaN : ((s ? -1 : 1) * Infinity)
      } else {
        m = m + Math.pow(2, mLen)
        e = e - eBias
      }
      return (s ? -1 : 1) * m * Math.pow(2, e - mLen)
    }

    exports.write = function (buffer, value, offset, isLE, mLen, nBytes) {
      var e, m, c
      var eLen = nBytes * 8 - mLen - 1
      var eMax = (1 << eLen) - 1
      var eBias = eMax >> 1
      var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)
      var i = isLE ? 0 : (nBytes - 1)
      var d = isLE ? 1 : -1
      var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0

      value = Math.abs(value)

      if (isNaN(value) || value === Infinity) {
        m = isNaN(value) ? 1 : 0
        e = eMax
      } else {
        e = Math.floor(Math.log(value) / Math.LN2)
        if (value * (c = Math.pow(2, -e)) < 1) {
          e--
          c *= 2
        }
        if (e + eBias >= 1) {
          value += rt / c
        } else {
          value += rt * Math.pow(2, 1 - eBias)
        }
        if (value * c >= 2) {
          e++
          c /= 2
        }

        if (e + eBias >= eMax) {
          m = 0
          e = eMax
        } else if (e + eBias >= 1) {
          m = (value * c - 1) * Math.pow(2, mLen)
          e = e + eBias
        } else {
          m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)
          e = 0
        }
      }

      for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {
      }

      e = (e << mLen) | m
      eLen += mLen
      for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {
      }

      buffer[offset + i - d] |= s * 128
    }

  }, {}],
  5: [function (require, module, exports) {

    /**
     * isArray
     */

    var isArray = Array.isArray;

    /**
     * toString
     */

    var str = Object.prototype.toString;

    /**
     * Whether or not the given `val`
     * is an array.
     *
     * example:
     *
     *        isArray([]);
     *        // > true
     *        isArray(arguments);
     *        // > false
     *        isArray('');
     *        // > false
     *
     * @param {mixed} val
     * @return {bool}
     */

    module.exports = isArray || function (val) {
        return !!val && '[object Array]' == str.call(val);
      };

  }, {}],
  6: [function (require, module, exports) {
// Copyright Joyent, Inc. and other Node contributors.
//
// 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.

    function EventEmitter() {
      this._events = this._events || {};
      this._maxListeners = this._maxListeners || undefined;
    }

    module.exports = EventEmitter;

// Backwards-compat with node 0.10.x
    EventEmitter.EventEmitter = EventEmitter;

    EventEmitter.prototype._events = undefined;
    EventEmitter.prototype._maxListeners = undefined;

// By default EventEmitters will print a warning if more than 10 listeners are
// added to it. This is a useful default which helps finding memory leaks.
    EventEmitter.defaultMaxListeners = 10;

// Obviously not all Emitters should be limited to 10. This function allows
// that to be increased. Set to zero for unlimited.
    EventEmitter.prototype.setMaxListeners = function (n) {
      if (!isNumber(n) || n < 0 || isNaN(n)) {
        throw TypeError('n must be a positive number');
      }
      this._maxListeners = n;
      return this;
    };

    EventEmitter.prototype.emit = function (type) {
      var er, handler, len, args, i, listeners;

      if (!this._events) {
        this._events = {};
      }

      // If there is no 'error' event listener then throw.
      if (type === 'error') {
        if (!this._events.error ||
          (isObject(this._events.error) && !this._events.error.length)) {
          er = arguments[1];
          if (er instanceof Error) {
            throw er; // Unhandled 'error' event
          }
          throw TypeError('Uncaught, unspecified "error" event.');
        }
      }

      handler = this._events[type];

      if (isUndefined(handler)) {
        return false;
      }

      if (isFunction(handler)) {
        switch (arguments.length) {
          // fast cases
          case 1:
            handler.call(this);
            break;
          case 2:
            handler.call(this, arguments[1]);
            break;
          case 3:
            handler.call(this, arguments[1], arguments[2]);
            break;
          // slower
          default:
            len = arguments.length;
            args = new Array(len - 1);
            for (i = 1; i < len; i++)
              args[i - 1] = arguments[i];
            handler.apply(this, args);
        }
      } else if (isObject(handler)) {
        len = arguments.length;
        args = new Array(len - 1);
        for (i = 1; i < len; i++)
          args[i - 1] = arguments[i];

        listeners = handler.slice();
        len = listeners.length;
        for (i = 0; i < len; i++)
          listeners[i].apply(this, args);
      }

      return true;
    };

    EventEmitter.prototype.addListener = function (type, listener) {
      var m;

      if (!isFunction(listener)) {
        throw TypeError('listener must be a function');
      }

      if (!this._events) {
        this._events = {};
      }

      // To avoid recursion in the case that type === "newListener"! Before
      // adding it to the listeners, first emit "newListener".
      if (this._events.newListener) {
        this.emit('newListener', type,
          isFunction(listener.listener) ?
            listener.listener : listener);
      }

      if (!this._events[type])
      // Optimize the case of one listener. Don't need the extra array object.
      {
        this._events[type] = listener;
      } else if (isObject(this._events[type]))
      // If we've already got an array, just append.
      {
        this._events[type].push(listener);
      } else
      // Adding the second element, need to change to array.
      {
        this._events[type] = [this._events[type], listener];
      }

      // Check for listener leak
      if (isObject(this._events[type]) && !this._events[type].warned) {
        var m;
        if (!isUndefined(this._maxListeners)) {
          m = this._maxListeners;
        } else {
          m = EventEmitter.defaultMaxListeners;
        }

        if (m && m > 0 && this._events[type].length > m) {
          this._events[type].warned = true;
          console.error('(node) warning: possible EventEmitter memory ' +
            'leak detected. %d listeners added. ' +
            'Use emitter.setMaxListeners() to increase limit.',
            this._events[type].length);
          if (typeof console.trace === 'function') {
            // not supported in IE 10
            console.trace();
          }
        }
      }

      return this;
    };

    EventEmitter.prototype.on = EventEmitter.prototype.addListener;

    EventEmitter.prototype.once = function (type, listener) {
      if (!isFunction(listener)) {
        throw TypeError('listener must be a function');
      }

      var fired = false;

      function g() {
        this.removeListener(type, g);

        if (!fired) {
          fired = true;
          listener.apply(this, arguments);
        }
      }

      g.listener = listener;
      this.on(type, g);

      return this;
    };

// emits a 'removeListener' event iff the listener was removed
    EventEmitter.prototype.removeListener = function (type, listener) {
      var list, position, length, i;

      if (!isFunction(listener)) {
        throw TypeError('listener must be a function');
      }

      if (!this._events || !this._events[type]) {
        return this;
      }

      list = this._events[type];
      length = list.length;
      position = -1;

      if (list === listener ||
        (isFunction(list.listener) && list.listener === listener)) {
        delete this._events[type];
        if (this._events.removeListener) {
          this.emit('removeListener', type, listener);
        }

      } else if (isObject(list)) {
        for (i = length; i-- > 0;) {
          if (list[i] === listener ||
            (list[i].listener && list[i].listener === listener)) {
            position = i;
            break;
          }
        }

        if (position < 0) {
          return this;
        }

        if (list.length === 1) {
          list.length = 0;
          delete this._events[type];
        } else {
          list.splice(position, 1);
        }

        if (this._events.removeListener) {
          this.emit('removeListener', type, listener);
        }
      }

      return this;
    };

    EventEmitter.prototype.removeAllListeners = function (type) {
      var key, listeners;

      if (!this._events) {
        return this;
      }

      // not listening for removeListener, no need to emit
      if (!this._events.removeListener) {
        if (arguments.length === 0) {
          this._events = {};
        } else if (this._events[type]) {
          delete this._events[type];
        }
        return this;
      }

      // emit removeListener for all listeners on all events
      if (arguments.length === 0) {
        for (key in this._events) {
          if (key === 'removeListener') {
            continue;
          }
          this.removeAllListeners(key);
        }
        this.removeAllListeners('removeListener');
        this._events = {};
        return this;
      }

      listeners = this._events[type];

      if (isFunction(listeners)) {
        this.removeListener(type, listeners);
      } else {
        // LIFO order
        while (listeners.length)
          this.removeListener(type, listeners[listeners.length - 1]);
      }
      delete this._events[type];

      return this;
    };

    EventEmitter.prototype.listeners = function (type) {
      var ret;
      if (!this._events || !this._events[type]) {
        ret = [];
      } else if (isFunction(this._events[type])) {
        ret = [this._events[type]];
      } else {
        ret = this._events[type].slice();
      }
      return ret;
    };

    EventEmitter.listenerCount = function (emitter, type) {
      var ret;
      if (!emitter._events || !emitter._events[type]) {
        ret = 0;
      } else if (isFunction(emitter._events[type])) {
        ret = 1;
      } else {
        ret = emitter._events[type].length;
      }
      return ret;
    };

    function isFunction(arg) {
      return typeof arg === 'function';
    }

    function isNumber(arg) {
      return typeof arg === 'number';
    }

    function isObject(arg) {
      return typeof arg === 'object' && arg !== null;
    }

    function isUndefined(arg) {
      return arg === void 0;
    }

  }, {}],
  7: [function (require, module, exports) {
    if (typeof Object.create === 'function') {
      // implementation from standard node.js 'util' module
      module.exports = function inherits(ctor, superCtor) {
        ctor.super_ = superCtor
        ctor.prototype = Object.create(superCtor.prototype, {
          constructor: {
            value: ctor,
            enumerable: false,
            writable: true,
            configurable: true
          }
        });
      };
    } else {
      // old school shim for old browsers
      module.exports = function inherits(ctor, superCtor) {
        ctor.super_ = superCtor
        var TempCtor = function () {
        }
        TempCtor.prototype = superCtor.prototype
        ctor.prototype = new TempCtor()
        ctor.prototype.constructor = ctor
      }
    }

  }, {}],
  8: [function (require, module, exports) {
    module.exports = Array.isArray || function (arr) {
        return Object.prototype.toString.call(arr) == '[object Array]';
      };

  }, {}],
  9: [function (require, module, exports) {
// shim for using process in browser

    var process = module.exports = {};
    var queue = [];
    var draining = false;
    var currentQueue;
    var queueIndex = -1;

    function cleanUpNextTick() {
      draining = false;
      if (currentQueue.length) {
        queue = currentQueue.concat(queue);
      } else {
        queueIndex = -1;
      }
      if (queue.length) {
        drainQueue();
      }
    }

    function drainQueue() {
      if (draining) {
        return;
      }
      var timeout = setTimeout(cleanUpNextTick);
      draining = true;

      var len = queue.length;
      while (len) {
        currentQueue = queue;
        queue = [];
        while (++queueIndex < len) {
          currentQueue[queueIndex].run();
        }
        queueIndex = -1;
        len = queue.length;
      }
      currentQueue = null;
      draining = false;
      clearTimeout(timeout);
    }

    process.nextTick = function (fun) {
      var args = new Array(arguments.length - 1);
      if (arguments.length > 1) {
        for (var i = 1; i < arguments.length; i++) {
          args[i - 1] = arguments[i];
        }
      }
      queue.push(new Item(fun, args));
      if (queue.length === 1 && !draining) {
        setTimeout(drainQueue, 0);
      }
    };

// v8 likes predictible objects
    function Item(fun, array) {
      this.fun = fun;
      this.array = array;
    }

    Item.prototype.run = function () {
      this.fun.apply(null, this.array);
    };
    process.title = 'browser';
    process.browser = true;
    process.env = {};
    process.argv = [];
    process.version = ''; // empty string to avoid regexp issues
    process.versions = {};

    function noop() {
    }

    process.on = noop;
    process.addListener = noop;
    process.once = noop;
    process.off = noop;
    process.removeListener = noop;
    process.removeAllListeners = noop;
    process.emit = noop;

    process.binding = function (name) {
      throw new Error('process.binding is not supported');
    };

// TODO(shtylman)
    process.cwd = function () {
      return '/'
    };
    process.chdir = function (dir) {
      throw new Error('process.chdir is not supported');
    };
    process.umask = function () {
      return 0;
    };

  }, {}],
  10: [function (require, module, exports) {
    module.exports = require("./lib/_stream_duplex.js")

  }, { "./lib/_stream_duplex.js": 11 }],
  11: [function (require, module, exports) {
    (function (process) {
// Copyright Joyent, Inc. and other Node contributors.
//
// 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.

// a duplex stream is just a stream that is both readable and writable.
// Since JS doesn't have multiple prototypal inheritance, this class
// prototypally inherits from Readable, and then parasitically from
// Writable.

      module.exports = Duplex;

      /*<replacement>*/
      var objectKeys = Object.keys || function (obj) {
          var keys = [];
          for (var key in obj) keys.push(key);
          return keys;
        }
      /*</replacement>*/

      /*<replacement>*/
      var util = require('core-util-is');
      util.inherits = require('inherits');
      /*</replacement>*/

      var Readable = require('./_stream_readable');
      var Writable = require('./_stream_writable');

      util.inherits(Duplex, Readable);

      forEach(objectKeys(Writable.prototype), function (method) {
        if (!Duplex.prototype[method]) {
          Duplex.prototype[method] = Writable.prototype[method];
        }
      });

      function Duplex(options) {
        if (!(this instanceof Duplex)) {
          return new Duplex(options);
        }

        Readable.call(this, options);
        Writable.call(this, options);

        if (options && options.readable === false) {
          this.readable = false;
        }

        if (options && options.writable === false) {
          this.writable = false;
        }

        this.allowHalfOpen = true;
        if (options && options.allowHalfOpen === false) {
          this.allowHalfOpen = false;
        }

        this.once('end', onend);
      }

// the no-half-open enforcer
      function onend() {
        // if we allow half-open state, or if the writable side ended,
        // then we're ok.
        if (this.allowHalfOpen || this._writableState.ended) {
          return;
        }

        // no more data can be written.
        // But allow more writes to happen in this tick.
        process.nextTick(this.end.bind(this));
      }

      function forEach(xs, f) {
        for (var i = 0, l = xs.length; i < l; i++) {
          f(xs[i], i);
        }
      }

    }).call(this, require('_process'))
  }, { "./_stream_readable": 13, "./_stream_writable": 15, "_process": 9, "core-util-is": 16, "inherits": 7 }],
  12: [function (require, module, exports) {
// Copyright Joyent, Inc. and other Node contributors.
//
// 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.

// a passthrough stream.
// basically just the most minimal sort of Transform stream.
// Every written chunk gets output as-is.

    module.exports = PassThrough;

    var Transform = require('./_stream_transform');

    /*<replacement>*/
    var util = require('core-util-is');
    util.inherits = require('inherits');
    /*</replacement>*/

    util.inherits(PassThrough, Transform);

    function PassThrough(options) {
      if (!(this instanceof PassThrough)) {
        return new PassThrough(options);
      }

      Transform.call(this, options);
    }

    PassThrough.prototype._transform = function (chunk, encoding, cb) {
      cb(null, chunk);
    };

  }, { "./_stream_transform": 14, "core-util-is": 16, "inherits": 7 }],
  13: [function (require, module, exports) {
    (function (process) {
// Copyright Joyent, Inc. and other Node contributors.
//
// 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.

      module.exports = Readable;

      /*<replacement>*/
      var isArray = require('isarray');
      /*</replacement>*/

      /*<replacement>*/
      var Buffer = require('buffer').Buffer;
      /*</replacement>*/

      Readable.ReadableState = ReadableState;

      var EE = require('events').EventEmitter;

      /*<replacement>*/
      if (!EE.listenerCount) {
        EE.listenerCount = function (emitter, type) {
          return emitter.listeners(type).length;
        };
      }
      /*</replacement>*/

      var Stream = require('stream');

      /*<replacement>*/
      var util = require('core-util-is');
      util.inherits = require('inherits');
      /*</replacement>*/

      var StringDecoder;

      /*<replacement>*/
      var debug = require('util');
      if (debug && debug.debuglog) {
        debug = debug.debuglog('stream');
      } else {
        debug = function () {
        };
      }
      /*</replacement>*/

      util.inherits(Readable, Stream);

      function ReadableState(options, stream) {
        var Duplex = require('./_stream_duplex');

        options = options || {};

        // the point at which it stops calling _read() to fill the buffer
        // Note: 0 is a valid value, means "don't call _read preemptively ever"
        var hwm = options.highWaterMark;
        var defaultHwm = options.objectMode ? 16 : 16 * 1024;
        this.highWaterMark = (hwm || hwm === 0) ? hwm : defaultHwm;

        // cast to ints.
        this.highWaterMark = ~~this.highWaterMark;

        this.buffer = [];
        this.length = 0;
        this.pipes = null;
        this.pipesCount = 0;
        this.flowing = null;
        this.ended = false;
        this.endEmitted = false;
        this.reading = false;

        // a flag to be able to tell if the onwrite cb is called immediately,
        // or on a later tick.  We set this to true at first, because any
        // actions that shouldn't happen until "later" should generally also
        // not happen before the first write call.
        this.sync = true;

        // whenever we return null, then we set a flag to say
        // that we're awaiting a 'readable' event emission.
        this.needReadable = false;
        this.emittedReadable = false;
        this.readableListening = false;

        // object stream flag. Used to make read(n) ignore n and to
        // make all the buffer merging and length checks go away
        this.objectMode = !!options.objectMode;

        if (stream instanceof Duplex) {
          this.objectMode = this.objectMode || !!options.readableObjectMode;
        }

        // Crypto is kind of old and crusty.  Historically, its default string
        // encoding is 'binary' so we have to make this configurable.
        // Everything else in the universe uses 'utf8', though.
        this.defaultEncoding = options.defaultEncoding || 'utf8';

        // when piping, we only care about 'readable' events that happen
        // after read()ing all the bytes and not getting any pushback.
        this.ranOut = false;

        // the number of writers that are awaiting a drain event in .pipe()s
        this.awaitDrain = 0;

        // if true, a maybeReadMore has been scheduled
        this.readingMore = false;

        this.decoder = null;
        this.encoding = null;
        if (options.encoding) {
          if (!StringDecoder) {
            StringDecoder = require('string_decoder/').StringDecoder;
          }
          this.decoder = new StringDecoder(options.encoding);
          this.encoding = options.encoding;
        }
      }

      function Readable(options) {
        var Duplex = require('./_stream_duplex');

        if (!(this instanceof Readable)) {
          return new Readable(options);
        }

        this._readableState = new ReadableState(options, this);

        // legacy
        this.readable = true;

        Stream.call(this);
      }

// Manually shove something into the read() buffer.
// This returns true if the highWaterMark has not been hit yet,
// similar to how Writable.write() returns true if you should
// write() some more.
      Readable.prototype.push = function (chunk, encoding) {
        var state = this._readableState;

        if (util.isString(chunk) && !state.objectMode) {
          encoding = encoding || state.defaultEncoding;
          if (encoding !== state.encoding) {
            chunk = new Buffer(chunk, encoding);
            encoding = '';
          }
        }

        return readableAddChunk(this, state, chunk, encoding, false);
      };

// Unshift should *always* be something directly out of read()
      Readable.prototype.unshift = function (chunk) {
        var state = this._readableState;
        return readableAddChunk(this, state, chunk, '', true);
      };

      function readableAddChunk(stream, state, chunk, encoding, addToFront) {
        var er = chunkInvalid(state, chunk);
        if (er) {
          stream.emit('error', er);
        } else if (util.isNullOrUndefined(chunk)) {
          state.reading = false;
          if (!state.ended) {
            onEofChunk(stream, state);
          }
        } else if (state.objectMode || chunk && chunk.length > 0) {
          if (state.ended && !addToFront) {
            var e = new Error('stream.push() after EOF');
            stream.emit('error', e);
          } else if (state.endEmitted && addToFront) {
            var e = new Error('stream.unshift() after end event');
            stream.emit('error', e);
          } else {
            if (state.decoder && !addToFront && !encoding) {
              chunk = state.decoder.write(chunk);
            }

            if (!addToFront) {
              state.reading = false;
            }

            // if we want the data now, just emit it.
            if (state.flowing && state.length === 0 && !state.sync) {
              stream.emit('data', chunk);
              stream.read(0);
            } else {
              // update the buffer info.
              state.length += state.objectMode ? 1 : chunk.length;
              if (addToFront) {
                state.buffer.unshift(chunk);
              } else {
                state.buffer.push(chunk);
              }

              if (state.needReadable) {
                emitReadable(stream);
              }
            }

            maybeReadMore(stream, state);
          }
        } else if (!addToFront) {
          state.reading = false;
        }

        return needMoreData(state);
      }

// if it's past the high water mark, we can push in some more.
// Also, if we have no data yet, we can stand some
// more bytes.  This is to work around cases where hwm=0,
// such as the repl.  Also, if the push() triggered a
// readable event, and the user called read(largeNumber) such that
// needReadable was set, then we ought to push more, so that another
// 'readable' event will be triggered.
      function needMoreData(state) {
        return !state.ended &&
          (state.needReadable ||
          state.length < state.highWaterMark ||
          state.length === 0);
      }

// backwards compatibility.
      Readable.prototype.setEncoding = function (enc) {
        if (!StringDecoder) {
          StringDecoder = require('string_decoder/').StringDecoder;
        }
        this._readableState.decoder = new StringDecoder(enc);
        this._readableState.encoding = enc;
        return this;
      };

// Don't raise the hwm > 128MB
      var MAX_HWM = 0x800000;

      function roundUpToNextPowerOf2(n) {
        if (n >= MAX_HWM) {
          n = MAX_HWM;
        } else {
          // Get the next highest power of 2
          n--;
          for (var p = 1; p < 32; p <<= 1) n |= n >> p;
          n++;
        }
        return n;
      }

      function howMuchToRead(n, state) {
        if (state.length === 0 && state.ended) {
          return 0;
        }

        if (state.objectMode) {
          return n === 0 ? 0 : 1;
        }

        if (isNaN(n) || util.isNull(n)) {
          // only flow one buffer at a time
          if (state.flowing && state.buffer.length) {
            return state.buffer[0].length;
          } else {
            return state.length;
          }
        }

        if (n <= 0) {
          return 0;
        }

        // If we're asking for more than the target buffer level,
        // then raise the water mark.  Bump up to the next highest
        // power of 2, to prevent increasing it excessively in tiny
        // amounts.
        if (n > state.highWaterMark) {
          state.highWaterMark = roundUpToNextPowerOf2(n);
        }

        // don't have that much.  return null, unless we've ended.
        if (n > state.length) {
          if (!state.ended) {
            state.needReadable = true;
            return 0;
          } else {
            return state.length;
          }
        }

        return n;
      }

// you can override either this method, or the async _read(n) below.
      Readable.prototype.read = function (n) {
        debug('read', n);
        var state = this._readableState;
        var nOrig = n;

        if (!util.isNumber(n) || n > 0) {
          state.emittedReadable = false;
        }

        // if we're doing read(0) to trigger a readable event, but we
        // already have a bunch of data in the buffer, then just trigger
        // the 'readable' event and move on.
        if (n === 0 &&
          state.needReadable &&
          (state.length >= state.highWaterMark || state.ended)) {
          debug('read: emitReadable', state.length, state.ended);
          if (state.length === 0 && state.ended) {
            endReadable(this);
          } else {
            emitReadable(this);
          }
          return null;
        }

        n = howMuchToRead(n, state);

        // if we've ended, and we're now clear, then finish it up.
        if (n === 0 && state.ended) {
          if (state.length === 0) {
            endReadable(this);
          }
          return null;
        }

        // All the actual chunk generation logic needs to be
        // *below* the call to _read.  The reason is that in certain
        // synthetic stream cases, such as passthrough streams, _read
        // may be a completely synchronous operation which may change
        // the state of the read buffer, providing enough data when
        // before there was *not* enough.
        //
        // So, the steps are:
        // 1. Figure out what the state of things will be after we do
        // a read from the buffer.
        //
        // 2. If that resulting state will trigger a _read, then call _read.
        // Note that this may be asynchronous, or synchronous.  Yes, it is
        // deeply ugly to write APIs this way, but that still doesn't mean
        // that the Readable class should behave improperly, as streams are
        // designed to be sync/async agnostic.
        // Take note if the _read call is sync or async (ie, if the read call
        // has returned yet), so that we know whether or not it's safe to emit
        // 'readable' etc.
        //
        // 3. Actually pull the requested chunks out of the buffer and return.

        // if we need a readable event, then we need to do some reading.
        var doRead = state.needReadable;
        debug('need readable', doRead);

        // if we currently have less than the highWaterMark, then also read some
        if (state.length === 0 || state.length - n < state.highWaterMark) {
          doRead = true;
          debug('length less than watermark', doRead);
        }

        // however, if we've ended, then there's no point, and if we're already
        // reading, then it's unnecessary.
        if (state.ended || state.reading) {
          doRead = false;
          debug('reading or ended', doRead);
        }

        if (doRead) {
          debug('do read');
          state.reading = true;
          state.sync = true;
          // if the length is currently zero, then we *need* a readable event.
          if (state.length === 0) {
            state.needReadable = true;
          }
          // call internal read method
          this._read(state.highWaterMark);
          state.sync = false;
        }

        // If _read pushed data synchronously, then `reading` will be false,
        // and we need to re-evaluate how much data we can return to the user.
        if (doRead && !state.reading) {
          n = howMuchToRead(nOrig, state);
        }

        var ret;
        if (n > 0) {
          ret = fromList(n, state);
        } else {
          ret = null;
        }

        if (util.isNull(ret)) {
          state.needReadable = true;
          n = 0;
        }

        state.length -= n;

        // If we have nothing in the buffer, then we want to know
        // as soon as we *do* get something into the buffer.
        if (state.length === 0 && !state.ended) {
          state.needReadable = true;
        }

        // If we tried to read() past the EOF, then emit end on the next tick.
        if (nOrig !== n && state.ended && state.length === 0) {
          endReadable(this);
        }

        if (!util.isNull(ret)) {
          this.emit('data', ret);
        }

        return ret;
      };

      function chunkInvalid(state, chunk) {
        var er = null;
        if (!util.isBuffer(chunk) && !util.isString(chunk) && !util.isNullOrUndefined(chunk) && !state.objectMode) {
          er = new TypeError('Invalid non-string/buffer chunk');
        }
        return er;
      }

      function onEofChunk(stream, state) {
        if (state.decoder && !state.ended) {
          var chunk = state.decoder.end();
          if (chunk && chunk.length) {
            state.buffer.push(chunk);
            state.length += state.objectMode ? 1 : chunk.length;
          }
        }
        state.ended = true;

        // emit 'readable' now to make sure it gets picked up.
        emitReadable(stream);
      }

// Don't emit readable right away in sync mode, because this can trigger
// another read() call => stack overflow.  This way, it might trigger
// a nextTick recursion warning, but that's not so bad.
      function emitReadable(stream) {
        var state = stream._readableState;
        state.needReadable = false;
        if (!state.emittedReadable) {
          debug('emitReadable', state.flowing);
          state.emittedReadable = true;
          if (state.sync) {
            process.nextTick(function () {
              emitReadable_(stream);
            });
          } else {
            emitReadable_(stream);
          }
        }
      }

      function emitReadable_(stream) {
        debug('emit readable');
        stream.emit('readable');
        flow(stream);
      }

// at this point, the user has presumably seen the 'readable' event,
// and called read() to consume some data.  that may have triggered
// in turn another _read(n) call, in which case reading = true if
// it's in progress.
// However, if we're not ended, or reading, and the length < hwm,
// then go ahead and try to read some more preemptively.
      function maybeReadMore(stream, state) {
        if (!state.readingMore) {
          state.readingMore = true;
          process.nextTick(function () {
            maybeReadMore_(stream, state);
          });
        }
      }

      function maybeReadMore_(stream, state) {
        var len = state.length;
        while (!state.reading && !state.flowing && !state.ended &&
        state.length < state.highWaterMark) {
          debug('maybeReadMore read 0');
          stream.read(0);
          if (len === state.length)
          // didn't get any data, stop spinning.
          {
            break;
          } else {
            len = state.length;
          }
        }
        state.readingMore = false;
      }

// abstract method.  to be overridden in specific implementation classes.
// call cb(er, data) where data is <= n in length.
// for virtual (non-string, non-buffer) streams, "length" is somewhat
// arbitrary, and perhaps not very meaningful.
      Readable.prototype._read = function (n) {
        this.emit('error', new Error('not implemented'));
      };

      Readable.prototype.pipe = function (dest, pipeOpts) {
        var src = this;
        var state = this._readableState;

        switch (state.pipesCount) {
          case 0:
            state.pipes = dest;
            break;
          case 1:
            state.pipes = [state.pipes, dest];
            break;
          default:
            state.pipes.push(dest);
            break;
        }
        state.pipesCount += 1;
        debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts);

        var doEnd = (!pipeOpts || pipeOpts.end !== false) &&
          dest !== process.stdout &&
          dest !== process.stderr;

        var endFn = doEnd ? onend : cleanup;
        if (state.endEmitted) {
          process.nextTick(endFn);
        } else {
          src.once('end', endFn);
        }

        dest.on('unpipe', onunpipe);
        function onunpipe(readable) {
          debug('onunpipe');
          if (readable === src) {
            cleanup();
          }
        }

        function onend() {
          debug('onend');
          dest.end();
        }

        // when the dest drains, it reduces the awaitDrain counter
        // on the source.  This would be more elegant with a .once()
        // handler in flow(), but adding and removing repeatedly is
        // too slow.
        var ondrain = pipeOnDrain(src);
        dest.on('drain', ondrain);

        function cleanup() {
          debug('cleanup');
          // cleanup event handlers once the pipe is broken
          dest.removeListener('close', onclose);
          dest.removeListener('finish', onfinish);
          dest.removeListener('drain', ondrain);
          dest.removeListener('error', onerror);
          dest.removeListener('unpipe', onunpipe);
          src.removeListener('end', onend);
          src.removeListener('end', cleanup);
          src.removeListener('data', ondata);

          // if the reader is waiting for a drain event from this
          // specific writer, then it would cause it to never start
          // flowing again.
          // So, if this is awaiting a drain, then we just call it now.
          // If we don't know, then assume that we are waiting for one.
          if (state.awaitDrain &&
            (!dest._writableState || dest._writableState.needDrain)) {
            ondrain();
          }
        }

        src.on('data', ondata);
        function ondata(chunk) {
          debug('ondata');
          var ret = dest.write(chunk);
          if (false === ret) {
            debug('false write response, pause',
              src._readableState.awaitDrain);
            src._readableState.awaitDrain++;
            src.pause();
          }
        }

        // if the dest has an error, then stop piping into it.
        // however, don't suppress the throwing behavior for this.
        function onerror(er) {
          debug('onerror', er);
          unpipe();
          dest.removeListener('error', onerror);
          if (EE.listenerCount(dest, 'error') === 0) {
            dest.emit('error', er);
          }
        }

        // This is a brutally ugly hack to make sure that our error handler
        // is attached before any userland ones.  NEVER DO THIS.
        if (!dest._events || !dest._events.error) {
          dest.on('error', onerror);
        } else if (isArray(dest._events.error)) {
          dest._events.error.unshift(onerror);
        } else {
          dest._events.error = [onerror, dest._events.error];
        }

        // Both close and finish should trigger unpipe, but only once.
        function onclose() {
          dest.removeListener('finish', onfinish);
          unpipe();
        }

        dest.once('close', onclose);
        function onfinish() {
          debug('onfinish');
          dest.removeListener('close', onclose);
          unpipe();
        }

        dest.once('finish', onfinish);

        function unpipe() {
          debug('unpipe');
          src.unpipe(dest);
        }

        // tell the dest that it's being piped to
        dest.emit('pipe', src);

        // start the flow if it hasn't been started already.
        if (!state.flowing) {
          debug('pipe resume');
          src.resume();
        }

        return dest;
      };

      function pipeOnDrain(src) {
        return function () {
          var state = src._readableState;
          debug('pipeOnDrain', state.awaitDrain);
          if (state.awaitDrain) {
            state.awaitDrain--;
          }
          if (state.awaitDrain === 0 && EE.listenerCount(src, 'data')) {
            state.flowing = true;
            flow(src);
          }
        };
      }

      Readable.prototype.unpipe = function (dest) {
        var state = this._readableState;

        // if we're not piping anywhere, then do nothing.
        if (state.pipesCount === 0) {
          return this;
        }

        // just one destination.  most common case.
        if (state.pipesCount === 1) {
          // passed in one, but it's not the right one.
          if (dest && dest !== state.pipes) {
            return this;
          }

          if (!dest) {
            dest = state.pipes;
          }

          // got a match.
          state.pipes = null;
          state.pipesCount = 0;
          state.flowing = false;
          if (dest) {
            dest.emit('unpipe', this);
          }
          return this;
        }

        // slow case. multiple pipe destinations.

        if (!dest) {
          // remove all.
          var dests = state.pipes;
          var len = state.pipesCount;
          state.pipes = null;
          state.pipesCount = 0;
          state.flowing = false;

          for (var i = 0; i < len; i++)
            dests[i].emit('unpipe', this);
          return this;
        }

        // try to find the right one.
        var i = indexOf(state.pipes, dest);
        if (i === -1) {
          return this;
        }

        state.pipes.splice(i, 1);
        state.pipesCount -= 1;
        if (state.pipesCount === 1) {
          state.pipes = state.pipes[0];
        }

        dest.emit('unpipe', this);

        return this;
      };

// set up data events if they are asked for
// Ensure readable listeners eventually get something
      Readable.prototype.on = function (ev, fn) {
        var res = Stream.prototype.on.call(this, ev, fn);

        // If listening to data, and it has not explicitly been paused,
        // then call resume to start the flow of data on the next tick.
        if (ev === 'data' && false !== this._readableState.flowing) {
          this.resume();
        }

        if (ev === 'readable' && this.readable) {
          var state = this._readableState;
          if (!state.readableListening) {
            state.readableListening = true;
            state.emittedReadable = false;
            state.needReadable = true;
            if (!state.reading) {
              var self = this;
              process.nextTick(function () {
                debug('readable nexttick read 0');
                self.read(0);
              });
            } else if (state.length) {
              emitReadable(this, state);
            }
          }
        }

        return res;
      };
      Readable.prototype.addListener = Readable.prototype.on;

// pause() and resume() are remnants of the legacy readable stream API
// If the user uses them, then switch into old mode.
      Readable.prototype.resume = function () {
        var state = this._readableState;
        if (!state.flowing) {
          debug('resume');
          state.flowing = true;
          if (!state.reading) {
            debug('resume read 0');
            this.read(0);
          }
          resume(this, state);
        }
        return this;
      };

      function resume(stream, state) {
        if (!state.resumeScheduled) {
          state.resumeScheduled = true;
          process.nextTick(function () {
            resume_(stream, state);
          });
        }
      }

      function resume_(stream, state) {
        state.resumeScheduled = false;
        stream.emit('resume');
        flow(stream);
        if (state.flowing && !state.reading) {
          stream.read(0);
        }
      }

      Readable.prototype.pause = function () {
        debug('call pause flowing=%j', this._readableState.flowing);
        if (false !== this._readableState.flowing) {
          debug('pause');
          this._readableState.flowing = false;
          this.emit('pause');
        }
        return this;
      };

      function flow(stream) {
        var state = stream._readableState;
        debug('flow', state.flowing);
        if (state.flowing) {
          do {
            var chunk = stream.read();
          } while (null !== chunk && state.flowing);
        }
      }

// wrap an old-style stream as the async data source.
// This is *not* part of the readable stream interface.
// It is an ugly unfortunate mess of history.
      Readable.prototype.wrap = function (stream) {
        var state = this._readableState;
        var paused = false;

        var self = this;
        stream.on('end', function () {
          debug('wrapped end');
          if (state.decoder && !state.ended) {
            var chunk = state.decoder.end();
            if (chunk && chunk.length) {
              self.push(chunk);
            }
          }

          self.push(null);
        });

        stream.on('data', function (chunk) {
          debug('wrapped data');
          if (state.decoder) {
            chunk = state.decoder.write(chunk);
          }
          if (!chunk || !state.objectMode && !chunk.length) {
            return;
          }

          var ret = self.push(chunk);
          if (!ret) {
            paused = true;
            stream.pause();
          }
        });

        // proxy all the other methods.
        // important when wrapping filters and duplexes.
        for (var i in stream) {
          if (util.isFunction(stream[i]) && util.isUndefined(this[i])) {
            this[i] = function (method) {
              return function () {
                return stream[method].apply(stream, arguments);
              }
            }(i);
          }
        }

        // proxy certain important events.
        var events = ['error', 'close', 'destroy', 'pause', 'resume'];
        forEach(events, function (ev) {
          stream.on(ev, self.emit.bind(self, ev));
        });

        // when we try to consume some more bytes, simply unpause the
        // underlying stream.
        self._read = function (n) {
          debug('wrapped _read', n);
          if (paused) {
            paused = false;
            stream.resume();
          }
        };

        return self;
      };

// exposed for testing purposes only.
      Readable._fromList = fromList;

// Pluck off n bytes from an array of buffers.
// Length is the combined lengths of all the buffers in the list.
      function fromList(n, state) {
        var list = state.buffer;
        var length = state.length;
        var stringMode = !!state.decoder;
        var objectMode = !!state.objectMode;
        var ret;

        // nothing in the list, definitely empty.
        if (list.length === 0) {
          return null;
        }

        if (length === 0) {
          ret = null;
        } else if (objectMode) {
          ret = list.shift();
        } else if (!n || n >= length) {
          // read it all, truncate the array.
          if (stringMode) {
            ret = list.join('');
          } else {
            ret = Buffer.concat(list, length);
          }
          list.length = 0;
        } else {
          // read just some of it.
          if (n < list[0].length) {
            // just take a part of the first list item.
            // slice is the same for buffers and strings.
            var buf = list[0];
            ret = buf.slice(0, n);
            list[0] = buf.slice(n);
          } else if (n === list[0].length) {
            // first list is a perfect match
            ret = list.shift();
          } else {
            // complex case.
            // we have enough to cover it, but it spans past the first buffer.
            if (stringMode) {
              ret = '';
            } else {
              ret = new Buffer(n);
            }

            var c = 0;
            for (var i = 0, l = list.length; i < l && c < n; i++) {
              var buf = list[0];
              var cpy = Math.min(n - c, buf.length);

              if (stringMode) {
                ret += buf.slice(0, cpy);
              } else {
                buf.copy(ret, c, 0, cpy);
              }

              if (cpy < buf.length) {
                list[0] = buf.slice(cpy);
              } else {
                list.shift();
              }

              c += cpy;
            }
          }
        }

        return ret;
      }

      function endReadable(stream) {
        var state = stream._readableState;

        // If we get here before consuming all the bytes, then that is a
        // bug in node.  Should never happen.
        if (state.length > 0) {
          throw new Error('endReadable called on non-empty stream');
        }

        if (!state.endEmitted) {
          state.ended = true;
          process.nextTick(function () {
            // Check that we didn't get one last unshift.
            if (!state.endEmitted && state.length === 0) {
              state.endEmitted = true;
              stream.readable = false;
              stream.emit('end');
            }
          });
        }
      }

      function forEach(xs, f) {
        for (var i = 0, l = xs.length; i < l; i++) {
          f(xs[i], i);
        }
      }

      function indexOf(xs, x) {
        for (var i = 0, l = xs.length; i < l; i++) {
          if (xs[i] === x) {
            return i;
          }
        }
        return -1;
      }

    }).call(this, require('_process'))
  }, {
    "./_stream_duplex": 11,
    "_process": 9,
    "buffer": 2,
    "core-util-is": 16,
    "events": 6,
    "inherits": 7,
    "isarray": 8,
    "stream": 21,
    "string_decoder/": 22,
    "util": 1
  }],
  14: [function (require, module, exports) {
// Copyright Joyent, Inc. and other Node contributors.
//
// 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.

// a transform stream is a readable/writable stream where you do
// something with the data.  Sometimes it's called a "filter",
// but that's not a great name for it, since that implies a thing where
// some bits pass through, and others are simply ignored.  (That would
// be a valid example of a transform, of course.)
//
// While the output is causally related to the input, it's not a
// necessarily symmetric or synchronous transformation.  For example,
// a zlib stream might take multiple plain-text writes(), and then
// emit a single compressed chunk some time in the future.
//
// Here's how this works:
//
// The Transform stream has all the aspects of the readable and writable
// stream classes.  When you write(chunk), that calls _write(chunk,cb)
// internally, and returns false if there's a lot of pending writes
// buffered up.  When you call read(), that calls _read(n) until
// there's enough pending readable data buffered up.
//
// In a transform stream, the written data is placed in a buffer.  When
// _read(n) is called, it transforms the queued up data, calling the
// buffered _write cb's as it consumes chunks.  If consuming a single
// written chunk would result in multiple output chunks, then the first
// outputted bit calls the readcb, and subsequent chunks just go into
// the read buffer, and will cause it to emit 'readable' if necessary.
//
// This way, back-pressure is actually determined by the reading side,
// since _read has to be called to start processing a new chunk.  However,
// a pathological inflate type of transform can cause excessive buffering
// here.  For example, imagine a stream where every byte of input is
// interpreted as an integer from 0-255, and then results in that many
// bytes of output.  Writing the 4 bytes {ff,ff,ff,ff} would result in
// 1kb of data being output.  In this case, you could write a very small
// amount of input, and end up with a very large amount of output.  In
// such a pathological inflating mechanism, there'd be no way to tell
// the system to stop doing the transform.  A single 4MB write could
// cause the system to run out of memory.
//
// However, even in such a pathological case, only a single written chunk
// would be consumed, and then the rest would wait (un-transformed) until
// the results of the previous transformed chunk were consumed.

    module.exports = Transform;

    var Duplex = require('./_stream_duplex');

    /*<replacement>*/
    var util = require('core-util-is');
    util.inherits = require('inherits');
    /*</replacement>*/

    util.inherits(Transform, Duplex);

    function TransformState(options, stream) {
      this.afterTransform = function (er, data) {
        return afterTransform(stream, er, data);
      };

      this.needTransform = false;
      this.transforming = false;
      this.writecb = null;
      this.writechunk = null;
    }

    function afterTransform(stream, er, data) {
      var ts = stream._transformState;
      ts.transforming = false;

      var cb = ts.writecb;

      if (!cb) {
        return stream.emit('error', new Error('no writecb in Transform class'));
      }

      ts.writechunk = null;
      ts.writecb = null;

      if (!util.isNullOrUndefined(data)) {
        stream.push(data);
      }

      if (cb) {
        cb(er);
      }

      var rs = stream._readableState;
      rs.reading = false;
      if (rs.needReadable || rs.length < rs.highWaterMark) {
        stream._read(rs.highWaterMark);
      }
    }

    function Transform(options) {
      if (!(this instanceof Transform)) {
        return new Transform(options);
      }

      Duplex.call(this, options);

      this._transformState = new TransformState(options, this);

      // when the writable side finishes, then flush out anything remaining.
      var stream = this;

      // start out asking for a readable event once data is transformed.
      this._readableState.needReadable = true;

      // we have implemented the _read method, and done the other things
      // that Readable wants before the first _read call, so unset the
      // sync guard flag.
      this._readableState.sync = false;

      this.once('prefinish', function () {
        if (util.isFunction(this._flush)) {
          this._flush(function (er) {
            done(stream, er);
          });
        } else {
          done(stream);
        }
      });
    }

    Transform.prototype.push = function (chunk, encoding) {
      this._transformState.needTransform = false;
      return Duplex.prototype.push.call(this, chunk, encoding);
    };

// This is the part where you do stuff!
// override this function in implementation classes.
// 'chunk' is an input chunk.
//
// Call `push(newChunk)` to pass along transformed output
// to the readable side.  You may call 'push' zero or more times.
//
// Call `cb(err)` when you are done with this chunk.  If you pass
// an error, then that'll put the hurt on the whole operation.  If you
// never call cb(), then you'll never get another chunk.
    Transform.prototype._transform = function (chunk, encoding, cb) {
      throw new Error('not implemented');
    };

    Transform.prototype._write = function (chunk, encoding, cb) {
      var ts = this._transformState;
      ts.writecb = cb;
      ts.writechunk = chunk;
      ts.writeencoding = encoding;
      if (!ts.transforming) {
        var rs = this._readableState;
        if (ts.needTransform ||
          rs.needReadable ||
          rs.length < rs.highWaterMark) {
          this._read(rs.highWaterMark);
        }
      }
    };

// Doesn't matter what the args are here.
// _transform does all the work.
// That we got here means that the readable side wants more data.
    Transform.prototype._read = function (n) {
      var ts = this._transformState;

      if (!util.isNull(ts.writechunk) && ts.writecb && !ts.transforming) {
        ts.transforming = true;
        this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform);
      } else {
        // mark that we need a transform, so that any data that comes in
        // will get processed, now that we've asked for it.
        ts.needTransform = true;
      }
    };

    function done(stream, er) {
      if (er) {
        return stream.emit('error', er);
      }

      // if there's nothing in the write buffer, then that means
      // that nothing more will ever be provided
      var ws = stream._writableState;
      var ts = stream._transformState;

      if (ws.length) {
        throw new Error('calling transform done when ws.length != 0');
      }

      if (ts.transforming) {
        throw new Error('calling transform done when still transforming');
      }

      return stream.push(null);
    }

  }, { "./_stream_duplex": 11, "core-util-is": 16, "inherits": 7 }],
  15: [function (require, module, exports) {
    (function (process) {
// Copyright Joyent, Inc. and other Node contributors.
//
// 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.

// A bit simpler than readable streams.
// Implement an async ._write(chunk, cb), and it'll handle all
// the drain event emission and buffering.

      module.exports = Writable;

      /*<replacement>*/
      var Buffer = require('buffer').Buffer;
      /*</replacement>*/

      Writable.WritableState = WritableState;

      /*<replacement>*/
      var util = require('core-util-is');
      util.inherits = require('inherits');
      /*</replacement>*/

      var Stream = require('stream');

      util.inherits(Writable, Stream);

      function WriteReq(chunk, encoding, cb) {
        this.chunk = chunk;
        this.encoding = encoding;
        this.callback = cb;
      }

      function WritableState(options, stream) {
        var Duplex = require('./_stream_duplex');

        options = options || {};

        // the point at which write() starts returning false
        // Note: 0 is a valid value, means that we always return false if
        // the entire buffer is not flushed immediately on write()
        var hwm = options.highWaterMark;
        var defaultHwm = options.objectMode ? 16 : 16 * 1024;
        this.highWaterMark = (hwm || hwm === 0) ? hwm : defaultHwm;

        // object stream flag to indicate whether or not this stream
        // contains buffers or objects.
        this.objectMode = !!options.objectMode;

        if (stream instanceof Duplex) {
          this.objectMode = this.objectMode || !!options.writableObjectMode;
        }

        // cast to ints.
        this.highWaterMark = ~~this.highWaterMark;

        this.needDrain = false;
        // at the start of calling end()
        this.ending = false;
        // when end() has been called, and returned
        this.ended = false;
        // when 'finish' is emitted
        this.finished = false;

        // should we decode strings into buffers before passing to _write?
        // this is here so that some node-core streams can optimize string
        // handling at a lower level.
        var noDecode = options.decodeStrings === false;
        this.decodeStrings = !noDecode;

        // Crypto is kind of old and crusty.  Historically, its default string
        // encoding is 'binary' so we have to make this configurable.
        // Everything else in the universe uses 'utf8', though.
        this.defaultEncoding = options.defaultEncoding || 'utf8';

        // not an actual buffer we keep track of, but a measurement
        // of how much we're waiting to get pushed to some underlying
        // socket or file.
        this.length = 0;

        // a flag to see when we're in the middle of a write.
        this.writing = false;

        // when true all writes will be buffered until .uncork() call
        this.corked = 0;

        // a flag to be able to tell if the onwrite cb is called immediately,
        // or on a later tick.  We set this to true at first, because any
        // actions that shouldn't happen until "later" should generally also
        // not happen before the first write call.
        this.sync = true;

        // a flag to know if we're processing previously buffered items, which
        // may call the _write() callback in the same tick, so that we don't
        // end up in an overlapped onwrite situation.
        this.bufferProcessing = false;

        // the callback that's passed to _write(chunk,cb)
        this.onwrite = function (er) {
          onwrite(stream, er);
        };

        // the callback that the user supplies to write(chunk,encoding,cb)
        this.writecb = null;

        // the amount that is being written when _write is called.
        this.writelen = 0;

        this.buffer = [];

        // number of pending user-supplied write callbacks
        // this must be 0 before 'finish' can be emitted
        this.pendingcb = 0;

        // emit prefinish if the only thing we're waiting for is _write cbs
        // This is relevant for synchronous Transform streams
        this.prefinished = false;

        // True if the error was already emitted and should not be thrown again
        this.errorEmitted = false;
      }

      function Writable(options) {
        var Duplex = require('./_stream_duplex');

        // Writable ctor is applied to Duplexes, though they're not
        // instanceof Writable, they're instanceof Readable.
        if (!(this instanceof Writable) && !(this instanceof Duplex)) {
          return new Writable(options);
        }

        this._writableState = new WritableState(options, this);

        // legacy.
        this.writable = true;

        Stream.call(this);
      }

// Otherwise people can pipe Writable streams, which is just wrong.
      Writable.prototype.pipe = function () {
        this.emit('error', new Error('Cannot pipe. Not readable.'));
      };

      function writeAfterEnd(stream, state, cb) {
        var er = new Error('write after end');
        // TODO: defer error events consistently everywhere, not just the cb
        stream.emit('error', er);
        process.nextTick(function () {
          cb(er);
        });
      }

// If we get something that is not a buffer, string, null, or undefined,
// and we're not in objectMode, then that's an error.
// Otherwise stream chunks are all considered to be of length=1, and the
// watermarks determine how many objects to keep in the buffer, rather than
// how many bytes or characters.
      function validChunk(stream, state, chunk, cb) {
        var valid = true;
        if (!util.isBuffer(chunk) && !util.isString(chunk) && !util.isNullOrUndefined(chunk) && !state.objectMode) {
          var er = new TypeError('Invalid non-string/buffer chunk');
          stream.emit('error', er);
          process.nextTick(function () {
            cb(er);
          });
          valid = false;
        }
        return valid;
      }

      Writable.prototype.write = function (chunk, encoding, cb) {
        var state = this._writableState;
        var ret = false;

        if (util.isFunction(encoding)) {
          cb = encoding;
          encoding = null;
        }

        if (util.isBuffer(chunk)) {
          encoding = 'buffer';
        } else if (!encoding) {
          encoding = state.defaultEncoding;
        }

        if (!util.isFunction(cb)) {
          cb = function () {
          };
        }

        if (state.ended) {
          writeAfterEnd(this, state, cb);
        } else if (validChunk(this, state, chunk, cb)) {
          state.pendingcb++;
          ret = writeOrBuffer(this, state, chunk, encoding, cb);
        }

        return ret;
      };

      Writable.prototype.cork = function () {
        var state = this._writableState;

        state.corked++;
      };

      Writable.prototype.uncork = function () {
        var state = this._writableState;

        if (state.corked) {
          state.corked--;

          if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing &&
            state.buffer.length) {
            clearBuffer(this, state);
          }
        }
      };

      function decodeChunk(state, chunk, encoding) {
        if (!state.objectMode &&
          state.decodeStrings !== false &&
          util.isString(chunk)) {
          chunk = new Buffer(chunk, encoding);
        }
        return chunk;
      }

// if we're already writing something, then just put this
// in the queue, and wait our turn.  Otherwise, call _write
// If we return false, then we need a drain event, so set that flag.
      function writeOrBuffer(stream, state, chunk, encoding, cb) {
        chunk = decodeChunk(state, chunk, encoding);
        if (util.isBuffer(chunk)) {
          encoding = 'buffer';
        }
        var len = state.objectMode ? 1 : chunk.length;

        state.length += len;

        var ret = state.length < state.highWaterMark;
        // we must ensure that previous needDrain will not be reset to false.
        if (!ret) {
          state.needDrain = true;
        }

        if (state.writing || state.corked) {
          state.buffer.push(new WriteReq(chunk, encoding, cb));
        } else {
          doWrite(stream, state, false, len, chunk, encoding, cb);
        }

        return ret;
      }

      function doWrite(stream, state, writev, len, chunk, encoding, cb) {
        state.writelen = len;
        state.writecb = cb;
        state.writing = true;
        state.sync = true;
        if (writev) {
          stream._writev(chunk, state.onwrite);
        } else {
          stream._write(chunk, encoding, state.onwrite);
        }
        state.sync = false;
      }

      function onwriteError(stream, state, sync, er, cb) {
        if (sync) {
          process.nextTick(function () {
            state.pendingcb--;
            cb(er);
          });
        } else {
          state.pendingcb--;
          cb(er);
        }

        stream._writableState.errorEmitted = true;
        stream.emit('error', er);
      }

      function onwriteStateUpdate(state) {
        state.writing = false;
        state.writecb = null;
        state.length -= state.writelen;
        state.writelen = 0;
      }

      function onwrite(stream, er) {
        var state = stream._writableState;
        var sync = state.sync;
        var cb = state.writecb;

        onwriteStateUpdate(state);

        if (er) {
          onwriteError(stream, state, sync, er, cb);
        } else {
          // Check if we're actually ready to finish, but don't emit yet
          var finished = needFinish(stream, state);

          if (!finished && !state.corked && !state.bufferProcessing &&
            state.buffer.length) {
            clearBuffer(stream, state);
          }

          if (sync) {
            process.nextTick(function () {
              afterWrite(stream, state, finished, cb);
            });
          } else {
            afterWrite(stream, state, finished, cb);
          }
        }
      }

      function afterWrite(stream, state, finished, cb) {
        if (!finished) {
          onwriteDrain(stream, state);
        }
        state.pendingcb--;
        cb();
        finishMaybe(stream, state);
      }

// Must force callback to be called on nextTick, so that we don't
// emit 'drain' before the write() consumer gets the 'false' return
// value, and has a chance to attach a 'drain' listener.
      function onwriteDrain(stream, state) {
        if (state.length === 0 && state.needDrain) {
          state.needDrain = false;
          stream.emit('drain');
        }
      }

// if there's something in the buffer waiting, then process it
      function clearBuffer(stream, state) {
        state.bufferProcessing = true;

        if (stream._writev && state.buffer.length > 1) {
          // Fast case, write everything using _writev()
          var cbs = [];
          for (var c = 0; c < state.buffer.length; c++)
            cbs.push(state.buffer[c].callback);

          // count the one we are adding, as well.
          // TODO(isaacs) clean this up
          state.pendingcb++;
          doWrite(stream, state, true, state.length, state.buffer, '', function (err) {
            for (var i = 0; i < cbs.length; i++) {
              state.pendingcb--;
              cbs[i](err);
            }
          });

          // Clear buffer
          state.buffer = [];
        } else {
          // Slow case, write chunks one-by-one
          for (var c = 0; c < state.buffer.length; c++) {
            var entry = state.buffer[c];
            var chunk = entry.chunk;
            var encoding = entry.encoding;
            var cb = entry.callback;
            var len = state.objectMode ? 1 : chunk.length;

            doWrite(stream, state, false, len, chunk, encoding, cb);

            // if we didn't call the onwrite immediately, then
            // it means that we need to wait until it does.
            // also, that means that the chunk and cb are currently
            // being processed, so move the buffer counter past them.
            if (state.writing) {
              c++;
              break;
            }
          }

          if (c < state.buffer.length) {
            state.buffer = state.buffer.slice(c);
          } else {
            state.buffer.length = 0;
          }
        }

        state.bufferProcessing = false;
      }

      Writable.prototype._write = function (chunk, encoding, cb) {
        cb(new Error('not implemented'));

      };

      Writable.prototype._writev = null;

      Writable.prototype.end = function (chunk, encoding, cb) {
        var state = this._writableState;

        if (util.isFunction(chunk)) {
          cb = chunk;
          chunk = null;
          encoding = null;
        } else if (util.isFunction(encoding)) {
          cb = encoding;
          encoding = null;
        }

        if (!util.isNullOrUndefined(chunk)) {
          this.write(chunk, encoding);
        }

        // .end() fully uncorks
        if (state.corked) {
          state.corked = 1;
          this.uncork();
        }

        // ignore unnecessary end() calls.
        if (!state.ending && !state.finished) {
          endWritable(this, state, cb);
        }
      };

      function needFinish(stream, state) {
        return (state.ending &&
        state.length === 0 && !state.finished && !state.writing);
      }

      function prefinish(stream, state) {
        if (!state.prefinished) {
          state.prefinished = true;
          stream.emit('prefinish');
        }
      }

      function finishMaybe(stream, state) {
        var need = needFinish(stream, state);
        if (need) {
          if (state.pendingcb === 0) {
            prefinish(stream, state);
            state.finished = true;
            stream.emit('finish');
          } else {
            prefinish(stream, state);
          }
        }
        return need;
      }

      function endWritable(stream, state, cb) {
        state.ending = true;
        finishMaybe(stream, state);
        if (cb) {
          if (state.finished) {
            process.nextTick(cb);
          } else {
            stream.once('finish', cb);
          }
        }
        state.ended = true;
      }

    }).call(this, require('_process'))
  }, { "./_stream_duplex": 11, "_process": 9, "buffer": 2, "core-util-is": 16, "inherits": 7, "stream": 21 }],
  16: [function (require, module, exports) {
    (function (Buffer) {
// Copyright Joyent, Inc. and other Node contributors.
//
// 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.

// NOTE: These type checking functions intentionally don't use `instanceof`
// because it is fragile and can be easily faked with `Object.create()`.
      function isArray(ar) {
        return Array.isArray(ar);
      }

      exports.isArray = isArray;

      function isBoolean(arg) {
        return typeof arg === 'boolean';
      }

      exports.isBoolean = isBoolean;

      function isNull(arg) {
        return arg === null;
      }

      exports.isNull = isNull;

      function isNullOrUndefined(arg) {
        return arg == null;
      }

      exports.isNullOrUndefined = isNullOrUndefined;

      function isNumber(arg) {
        return typeof arg === 'number';
      }

      exports.isNumber = isNumber;

      function isString(arg) {
        return typeof arg === 'string';
      }

      exports.isString = isString;

      function isSymbol(arg) {
        return typeof arg === 'symbol';
      }

      exports.isSymbol = isSymbol;

      function isUndefined(arg) {
        return arg === void 0;
      }

      exports.isUndefined = isUndefined;

      function isRegExp(re) {
        return isObject(re) && objectToString(re) === '[object RegExp]';
      }

      exports.isRegExp = isRegExp;

      function isObject(arg) {
        return typeof arg === 'object' && arg !== null;
      }

      exports.isObject = isObject;

      function isDate(d) {
        return isObject(d) && objectToString(d) === '[object Date]';
      }

      exports.isDate = isDate;

      function isError(e) {
        return isObject(e) &&
          (objectToString(e) === '[object Error]' || e instanceof Error);
      }

      exports.isError = isError;

      function isFunction(arg) {
        return typeof arg === 'function';
      }

      exports.isFunction = isFunction;

      function isPrimitive(arg) {
        return arg === null ||
          typeof arg === 'boolean' ||
          typeof arg === 'number' ||
          typeof arg === 'string' ||
          typeof arg === 'symbol' ||  // ES6 symbol
          typeof arg === 'undefined';
      }

      exports.isPrimitive = isPrimitive;

      function isBuffer(arg) {
        return Buffer.isBuffer(arg);
      }

      exports.isBuffer = isBuffer;

      function objectToString(o) {
        return Object.prototype.toString.call(o);
      }
    }).call(this, require("buffer").Buffer)
  }, { "buffer": 2 }],
  17: [function (require, module, exports) {
    module.exports = require("./lib/_stream_passthrough.js")

  }, { "./lib/_stream_passthrough.js": 12 }],
  18: [function (require, module, exports) {
    exports = module.exports = require('./lib/_stream_readable.js');
    exports.Stream = require('stream');
    exports.Readable = exports;
    exports.Writable = require('./lib/_stream_writable.js');
    exports.Duplex = require('./lib/_stream_duplex.js');
    exports.Transform = require('./lib/_stream_transform.js');
    exports.PassThrough = require('./lib/_stream_passthrough.js');

  }, {
    "./lib/_stream_duplex.js": 11,
    "./lib/_stream_passthrough.js": 12,
    "./lib/_stream_readable.js": 13,
    "./lib/_stream_transform.js": 14,
    "./lib/_stream_writable.js": 15,
    "stream": 21
  }],
  19: [function (require, module, exports) {
    module.exports = require("./lib/_stream_transform.js")

  }, { "./lib/_stream_transform.js": 14 }],
  20: [function (require, module, exports) {
    module.exports = require("./lib/_stream_writable.js")

  }, { "./lib/_stream_writable.js": 15 }],
  21: [function (require, module, exports) {
// Copyright Joyent, Inc. and other Node contributors.
//
// 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.

    module.exports = Stream;

    var EE = require('events').EventEmitter;
    var inherits = require('inherits');

    inherits(Stream, EE);
    Stream.Readable = require('readable-stream/readable.js');
    Stream.Writable = require('readable-stream/writable.js');
    Stream.Duplex = require('readable-stream/duplex.js');
    Stream.Transform = require('readable-stream/transform.js');
    Stream.PassThrough = require('readable-stream/passthrough.js');

// Backwards-compat with node 0.4.x
    Stream.Stream = Stream;

// old-style streams.  Note that the pipe method (the only relevant
// part of this class) is overridden in the Readable class.

    function Stream() {
      EE.call(this);
    }

    Stream.prototype.pipe = function (dest, options) {
      var source = this;

      function ondata(chunk) {
        if (dest.writable) {
          if (false === dest.write(chunk) && source.pause) {
            source.pause();
          }
        }
      }

      source.on('data', ondata);

      function ondrain() {
        if (source.readable && source.resume) {
          source.resume();
        }
      }

      dest.on('drain', ondrain);

      // If the 'end' option is not supplied, dest.end() will be called when
      // source gets the 'end' or 'close' events.  Only dest.end() once.
      if (!dest._isStdio && (!options || options.end !== false)) {
        source.on('end', onend);
        source.on('close', onclose);
      }

      var didOnEnd = false;

      function onend() {
        if (didOnEnd) {
          return;
        }
        didOnEnd = true;

        dest.end();
      }

      function onclose() {
        if (didOnEnd) {
          return;
        }
        didOnEnd = true;

        if (typeof dest.destroy === 'function') {
          dest.destroy();
        }
      }

      // don't leave dangling pipes when there are errors.
      function onerror(er) {
        cleanup();
        if (EE.listenerCount(this, 'error') === 0) {
          throw er; // Unhandled stream error in pipe.
        }
      }

      source.on('error', onerror);
      dest.on('error', onerror);

      // remove all the event listeners that were added.
      function cleanup() {
        source.removeListener('data', ondata);
        dest.removeListener('drain', ondrain);

        source.removeListener('end', onend);
        source.removeListener('close', onclose);

        source.removeListener('error', onerror);
        dest.removeListener('error', onerror);

        source.removeListener('end', cleanup);
        source.removeListener('close', cleanup);

        dest.removeListener('close', cleanup);
      }

      source.on('end', cleanup);
      source.on('close', cleanup);

      dest.on('close', cleanup);

      dest.emit('pipe', source);

      // Allow for unix-like usage: A.pipe(B).pipe(C)
      return dest;
    };

  }, {
    "events": 6,
    "inherits": 7,
    "readable-stream/duplex.js": 10,
    "readable-stream/passthrough.js": 17,
    "readable-stream/readable.js": 18,
    "readable-stream/transform.js": 19,
    "readable-stream/writable.js": 20
  }],
  22: [function (require, module, exports) {
// Copyright Joyent, Inc. and other Node contributors.
//
// 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 Buffer = require('buffer').Buffer;

    var isBufferEncoding = Buffer.isEncoding
      || function (encoding) {
        switch (encoding && encoding.toLowerCase()) {
          case 'hex':
          case 'utf8':
          case 'utf-8':
          case 'ascii':
          case 'binary':
          case 'base64':
          case 'ucs2':
          case 'ucs-2':
          case 'utf16le':
          case 'utf-16le':
          case 'raw':
            return true;
          default:
            return false;
        }
      }

    function assertEncoding(encoding) {
      if (encoding && !isBufferEncoding(encoding)) {
        throw new Error('Unknown encoding: ' + encoding);
      }
    }

// StringDecoder provides an interface for efficiently splitting a series of
// buffers into a series of JS strings without breaking apart multi-byte
// characters. CESU-8 is handled as part of the UTF-8 encoding.
//
// @TODO Handling all encodings inside a single object makes it very difficult
// to reason about this code, so it should be split up in the future.
// @TODO There should be a utf8-strict encoding that rejects invalid UTF-8 code
// points as used by CESU-8.
    var StringDecoder = exports.StringDecoder = function (encoding) {
      this.encoding = (encoding || 'utf8').toLowerCase().replace(/[-_]/, '');
      assertEncoding(encoding);
      switch (this.encoding) {
        case 'utf8':
          // CESU-8 represents each of Surrogate Pair by 3-bytes
          this.surrogateSize = 3;
          break;
        case 'ucs2':
        case 'utf16le':
          // UTF-16 represents each of Surrogate Pair by 2-bytes
          this.surrogateSize = 2;
          this.detectIncompleteChar = utf16DetectIncompleteChar;
          break;
        case 'base64':
          // Base-64 stores 3 bytes in 4 chars, and pads the remainder.
          this.surrogateSize = 3;
          this.detectIncompleteChar = base64DetectIncompleteChar;
          break;
        default:
          this.write = passThroughWrite;
          return;
      }

      // Enough space to store all bytes of a single character. UTF-8 needs 4
      // bytes, but CESU-8 may require up to 6 (3 bytes per surrogate).
      this.charBuffer = new Buffer(6);
      // Number of bytes received for the current incomplete multi-byte character.
      this.charReceived = 0;
      // Number of bytes expected for the current incomplete multi-byte character.
      this.charLength = 0;
    };

// write decodes the given buffer and returns it as JS string that is
// guaranteed to not contain any partial multi-byte characters. Any partial
// character found at the end of the buffer is buffered up, and will be
// returned when calling write again with the remaining bytes.
//
// Note: Converting a Buffer containing an orphan surrogate to a String
// currently works, but converting a String to a Buffer (via `new Buffer`, or
// Buffer#write) will replace incomplete surrogates with the unicode
// replacement character. See https://codereview.chromium.org/121173009/ .
    StringDecoder.prototype.write = function (buffer) {
      var charStr = '';
      // if our last write ended with an incomplete multibyte character
      while (this.charLength) {
        // determine how many remaining bytes this buffer has to offer for this char
        var available = (buffer.length >= this.charLength - this.charReceived) ?
          this.charLength - this.charReceived :
          buffer.length;

        // add the new bytes to the char buffer
        buffer.copy(this.charBuffer, this.charReceived, 0, available);
        this.charReceived += available;

        if (this.charReceived < this.charLength) {
          // still not enough chars in this buffer? wait for more ...
          return '';
        }

        // remove bytes belonging to the current character from the buffer
        buffer = buffer.slice(available, buffer.length);

        // get the character that was split
        charStr = this.charBuffer.slice(0, this.charLength).toString(this.encoding);

        // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character
        var charCode = charStr.charCodeAt(charStr.length - 1);
        if (charCode >= 0xD800 && charCode <= 0xDBFF) {
          this.charLength += this.surrogateSize;
          charStr = '';
          continue;
        }
        this.charReceived = this.charLength = 0;

        // if there are no more bytes in this buffer, just emit our char
        if (buffer.length === 0) {
          return charStr;
        }
        break;
      }

      // determine and set charLength / charReceived
      this.detectIncompleteChar(buffer);

      var end = buffer.length;
      if (this.charLength) {
        // buffer the incomplete character bytes we got
        buffer.copy(this.charBuffer, 0, buffer.length - this.charReceived, end);
        end -= this.charReceived;
      }

      charStr += buffer.toString(this.encoding, 0, end);

      var end = charStr.length - 1;
      var charCode = charStr.charCodeAt(end);
      // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character
      if (charCode >= 0xD800 && charCode <= 0xDBFF) {
        var size = this.surrogateSize;
        this.charLength += size;
        this.charReceived += size;
        this.charBuffer.copy(this.charBuffer, size, 0, size);
        buffer.copy(this.charBuffer, 0, 0, size);
        return charStr.substring(0, end);
      }

      // or just emit the charStr
      return charStr;
    };

// detectIncompleteChar determines if there is an incomplete UTF-8 character at
// the end of the given buffer. If so, it sets this.charLength to the byte
// length that character, and sets this.charReceived to the number of bytes
// that are available for this character.
    StringDecoder.prototype.detectIncompleteChar = function (buffer) {
      // determine how many bytes we have to check at the end of this buffer
      var i = (buffer.length >= 3) ? 3 : buffer.length;

      // Figure out if one of the last i bytes of our buffer announces an
      // incomplete char.
      for (; i > 0; i--) {
        var c = buffer[buffer.length - i];

        // See http://en.wikipedia.org/wiki/UTF-8#Description

        // 110XXXXX
        if (i == 1 && c >> 5 == 0x06) {
          this.charLength = 2;
          break;
        }

        // 1110XXXX
        if (i <= 2 && c >> 4 == 0x0E) {
          this.charLength = 3;
          break;
        }

        // 11110XXX
        if (i <= 3 && c >> 3 == 0x1E) {
          this.charLength = 4;
          break;
        }
      }
      this.charReceived = i;
    };

    StringDecoder.prototype.end = function (buffer) {
      var res = '';
      if (buffer && buffer.length) {
        res = this.write(buffer);
      }

      if (this.charReceived) {
        var cr = this.charReceived;
        var buf = this.charBuffer;
        var enc = this.encoding;
        res += buf.slice(0, cr).toString(enc);
      }

      return res;
    };

    function passThroughWrite(buffer) {
      return buffer.toString(this.encoding);
    }

    function utf16DetectIncompleteChar(buffer) {
      this.charReceived = buffer.length % 2;
      this.charLength = this.charReceived ? 2 : 0;
    }

    function base64DetectIncompleteChar(buffer) {
      this.charReceived = buffer.length % 3;
      this.charLength = this.charReceived ? 3 : 0;
    }

  }, { "buffer": 2 }],
  23: [function (require, module, exports) {
    module.exports = function isBuffer(arg) {
      return arg && typeof arg === 'object'
        && typeof arg.copy === 'function'
        && typeof arg.fill === 'function'
        && typeof arg.readUInt8 === 'function';
    }
  }, {}],
  24: [function (require, module, exports) {
    (function (process, global) {
// Copyright Joyent, Inc. and other Node contributors.
//
// 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 formatRegExp = /%[sdj%]/g;
      exports.format = function (f) {
        if (!isString(f)) {
          var objects = [];
          for (var i = 0; i < arguments.length; i++) {
            objects.push(inspect(arguments[i]));
          }
          return objects.join(' ');
        }

        var i = 1;
        var args = arguments;
        var len = args.length;
        var str = String(f).replace(formatRegExp, function (x) {
          if (x === '%%') {
            return '%';
          }
          if (i >= len) {
            return x;
          }
          switch (x) {
            case '%s':
              return String(args[i++]);
            case '%d':
              return Number(args[i++]);
            case '%j':
              try {
                return JSON.stringify(args[i++]);
              } catch (_) {
                return '[Circular]';
              }
            default:
              return x;
          }
        });
        for (var x = args[i]; i < len; x = args[++i]) {
          if (isNull(x) || !isObject(x)) {
            str += ' ' + x;
          } else {
            str += ' ' + inspect(x);
          }
        }
        return str;
      };

// Mark that a method should not be used.
// Returns a modified function which warns once by default.
// If --no-deprecation is set, then it is a no-op.
      exports.deprecate = function (fn, msg) {
        // Allow for deprecating things in the process of starting up.
        if (isUndefined(global.process)) {
          return function () {
            return exports.deprecate(fn, msg).apply(this, arguments);
          };
        }

        if (process.noDeprecation === true) {
          return fn;
        }

        var warned = false;

        function deprecated() {
          if (!warned) {
            if (process.throwDeprecation) {
              throw new Error(msg);
            } else if (process.traceDeprecation) {
              console.trace(msg);
            } else {
              console.error(msg);
            }
            warned = true;
          }
          return fn.apply(this, arguments);
        }

        return deprecated;
      };

      var debugs = {};
      var debugEnviron;
      exports.debuglog = function (set) {
        if (isUndefined(debugEnviron)) {
          debugEnviron = process.env.NODE_DEBUG || '';
        }
        set = set.toUpperCase();
        if (!debugs[set]) {
          if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) {
            var pid = process.pid;
            debugs[set] = function () {
              var msg = exports.format.apply(exports, arguments);
              console.error('%s %d: %s', set, pid, msg);
            };
          } else {
            debugs[set] = function () {
            };
          }
        }
        return debugs[set];
      };

      /**
       * Echos the value of a value. Trys to print the value out
       * in the best way possible given the different types.
       *
       * @param {Object} obj The object to print out.
       * @param {Object} opts Optional options object that alters the output.
       */
      /* legacy: obj, showHidden, depth, colors*/
      function inspect(obj, opts) {
        // default options
        var ctx = {
          seen: [],
          stylize: stylizeNoColor
        };
        // legacy...
        if (arguments.length >= 3) {
          ctx.depth = arguments[2];
        }
        if (arguments.length >= 4) {
          ctx.colors = arguments[3];
        }
        if (isBoolean(opts)) {
          // legacy...
          ctx.showHidden = opts;
        } else if (opts) {
          // got an "options" object
          exports._extend(ctx, opts);
        }
        // set default options
        if (isUndefined(ctx.showHidden)) {
          ctx.showHidden = false;
        }
        if (isUndefined(ctx.depth)) {
          ctx.depth = 2;
        }
        if (isUndefined(ctx.colors)) {
          ctx.colors = false;
        }
        if (isUndefined(ctx.customInspect)) {
          ctx.customInspect = true;
        }
        if (ctx.colors) {
          ctx.stylize = stylizeWithColor;
        }
        return formatValue(ctx, obj, ctx.depth);
      }

      exports.inspect = inspect;

// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics
      inspect.colors = {
        'bold': [1, 22],
        'italic': [3, 23],
        'underline': [4, 24],
        'inverse': [7, 27],
        'white': [37, 39],
        'grey': [90, 39],
        'black': [30, 39],
        'blue': [34, 39],
        'cyan': [36, 39],
        'green': [32, 39],
        'magenta': [35, 39],
        'red': [31, 39],
        'yellow': [33, 39]
      };

// Don't use 'blue' not visible on cmd.exe
      inspect.styles = {
        'special': 'cyan',
        'number': 'yellow',
        'boolean': 'yellow',
        'undefined': 'grey',
        'null': 'bold',
        'string': 'green',
        'date': 'magenta',
        // "name": intentionally not styling
        'regexp': 'red'
      };

      function stylizeWithColor(str, styleType) {
        var style = inspect.styles[styleType];

        if (style) {
          return '\u001b[' + inspect.colors[style][0] + 'm' + str +
            '\u001b[' + inspect.colors[style][1] + 'm';
        } else {
          return str;
        }
      }

      function stylizeNoColor(str, styleType) {
        return str;
      }

      function arrayToHash(array) {
        var hash = {};

        array.forEach(function (val, idx) {
          hash[val] = true;
        });

        return hash;
      }

      function formatValue(ctx, value, recurseTimes) {
        // Provide a hook for user-specified inspect functions.
        // Check that value is an object with an inspect function on it
        if (ctx.customInspect &&
          value &&
          isFunction(value.inspect) &&
          // Filter out the util module, it's inspect function is special
          value.inspect !== exports.inspect &&
          // Also filter out any prototype objects using the circular check.
          !(value.constructor && value.constructor.prototype === value)) {
          var ret = value.inspect(recurseTimes, ctx);
          if (!isString(ret)) {
            ret = formatValue(ctx, ret, recurseTimes);
          }
          return ret;
        }

        // Primitive types cannot have properties
        var primitive = formatPrimitive(ctx, value);
        if (primitive) {
          return primitive;
        }

        // Look up the keys of the object.
        var keys = Object.keys(value);
        var visibleKeys = arrayToHash(keys);

        if (ctx.showHidden) {
          keys = Object.getOwnPropertyNames(value);
        }

        // IE doesn't make error fields non-enumerable
        // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx
        if (isError(value)
          && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) {
          return formatError(value);
        }

        // Some type of object without properties can be shortcutted.
        if (keys.length === 0) {
          if (isFunction(value)) {
            var name = value.name ? ': ' + value.name : '';
            return ctx.stylize('[Function' + name + ']', 'special');
          }
          if (isRegExp(value)) {
            return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
          }
          if (isDate(value)) {
            return ctx.stylize(Date.prototype.toString.call(value), 'date');
          }
          if (isError(value)) {
            return formatError(value);
          }
        }

        var base = '', array = false, braces = ['{', '}'];

        // Make Array say that they are Array
        if (isArray(value)) {
          array = true;
          braces = ['[', ']'];
        }

        // Make functions say that they are functions
        if (isFunction(value)) {
          var n = value.name ? ': ' + value.name : '';
          base = ' [Function' + n + ']';
        }

        // Make RegExps say that they are RegExps
        if (isRegExp(value)) {
          base = ' ' + RegExp.prototype.toString.call(value);
        }

        // Make dates with properties first say the date
        if (isDate(value)) {
          base = ' ' + Date.prototype.toUTCString.call(value);
        }

        // Make error with message first say the error
        if (isError(value)) {
          base = ' ' + formatError(value);
        }

        if (keys.length === 0 && (!array || value.length == 0)) {
          return braces[0] + base + braces[1];
        }

        if (recurseTimes < 0) {
          if (isRegExp(value)) {
            return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
          } else {
            return ctx.stylize('[Object]', 'special');
          }
        }

        ctx.seen.push(value);

        var output;
        if (array) {
          output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);
        } else {
          output = keys.map(function (key) {
            return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);
          });
        }

        ctx.seen.pop();

        return reduceToSingleString(output, base, braces);
      }

      function formatPrimitive(ctx, value) {
        if (isUndefined(value)) {
          return ctx.stylize('undefined', 'undefined');
        }
        if (isString(value)) {
          var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '')
              .replace(/'/g, "\\'")
              .replace(/\\"/g, '"') + '\'';
          return ctx.stylize(simple, 'string');
        }
        if (isNumber(value)) {
          return ctx.stylize('' + value, 'number');
        }
        if (isBoolean(value)) {
          return ctx.stylize('' + value, 'boolean');
        }
        // For some reason typeof null is "object", so special case here.
        if (isNull(value)) {
          return ctx.stylize('null', 'null');
        }
      }

      function formatError(value) {
        return '[' + Error.prototype.toString.call(value) + ']';
      }

      function formatArray(ctx, value, recurseTimes, visibleKeys, keys) {
        var output = [];
        for (var i = 0, l = value.length; i < l; ++i) {
          if (hasOwnProperty(value, String(i))) {
            output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
              String(i), true));
          } else {
            output.push('');
          }
        }
        keys.forEach(function (key) {
          if (!key.match(/^\d+$/)) {
            output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
              key, true));
          }
        });
        return output;
      }

      function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {
        var name, str, desc;
        desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };
        if (desc.get) {
          if (desc.set) {
            str = ctx.stylize('[Getter/Setter]', 'special');
          } else {
            str = ctx.stylize('[Getter]', 'special');
          }
        } else {
          if (desc.set) {
            str = ctx.stylize('[Setter]', 'special');
          }
        }
        if (!hasOwnProperty(visibleKeys, key)) {
          name = '[' + key + ']';
        }
        if (!str) {
          if (ctx.seen.indexOf(desc.value) < 0) {
            if (isNull(recurseTimes)) {
              str = formatValue(ctx, desc.value, null);
            } else {
              str = formatValue(ctx, desc.value, recurseTimes - 1);
            }
            if (str.indexOf('\n') > -1) {
              if (array) {
                str = str.split('\n').map(function (line) {
                  return '  ' + line;
                }).join('\n').substr(2);
              } else {
                str = '\n' + str.split('\n').map(function (line) {
                    return '   ' + line;
                  }).join('\n');
              }
            }
          } else {
            str = ctx.stylize('[Circular]', 'special');
          }
        }
        if (isUndefined(name)) {
          if (array && key.match(/^\d+$/)) {
            return str;
          }
          name = JSON.stringify('' + key);
          if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) {
            name = name.substr(1, name.length - 2);
            name = ctx.stylize(name, 'name');
          } else {
            name = name.replace(/'/g, "\\'")
              .replace(/\\"/g, '"')
              .replace(/(^"|"$)/g, "'");
            name = ctx.stylize(name, 'string');
          }
        }

        return name + ': ' + str;
      }

      function reduceToSingleString(output, base, braces) {
        var numLinesEst = 0;
        var length = output.reduce(function (prev, cur) {
          numLinesEst++;
          if (cur.indexOf('\n') >= 0) {
            numLinesEst++;
          }
          return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1;
        }, 0);

        if (length > 60) {
          return braces[0] +
            (base === '' ? '' : base + '\n ') +
            ' ' +
            output.join(',\n  ') +
            ' ' +
            braces[1];
        }

        return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];
      }

// NOTE: These type checking functions intentionally don't use `instanceof`
// because it is fragile and can be easily faked with `Object.create()`.
      function isArray(ar) {
        return Array.isArray(ar);
      }

      exports.isArray = isArray;

      function isBoolean(arg) {
        return typeof arg === 'boolean';
      }

      exports.isBoolean = isBoolean;

      function isNull(arg) {
        return arg === null;
      }

      exports.isNull = isNull;

      function isNullOrUndefined(arg) {
        return arg == null;
      }

      exports.isNullOrUndefined = isNullOrUndefined;

      function isNumber(arg) {
        return typeof arg === 'number';
      }

      exports.isNumber = isNumber;

      function isString(arg) {
        return typeof arg === 'string';
      }

      exports.isString = isString;

      function isSymbol(arg) {
        return typeof arg === 'symbol';
      }

      exports.isSymbol = isSymbol;

      function isUndefined(arg) {
        return arg === void 0;
      }

      exports.isUndefined = isUndefined;

      function isRegExp(re) {
        return isObject(re) && objectToString(re) === '[object RegExp]';
      }

      exports.isRegExp = isRegExp;

      function isObject(arg) {
        return typeof arg === 'object' && arg !== null;
      }

      exports.isObject = isObject;

      function isDate(d) {
        return isObject(d) && objectToString(d) === '[object Date]';
      }

      exports.isDate = isDate;

      function isError(e) {
        return isObject(e) &&
          (objectToString(e) === '[object Error]' || e instanceof Error);
      }

      exports.isError = isError;

      function isFunction(arg) {
        return typeof arg === 'function';
      }

      exports.isFunction = isFunction;

      function isPrimitive(arg) {
        return arg === null ||
          typeof arg === 'boolean' ||
          typeof arg === 'number' ||
          typeof arg === 'string' ||
          typeof arg === 'symbol' ||  // ES6 symbol
          typeof arg === 'undefined';
      }

      exports.isPrimitive = isPrimitive;

      exports.isBuffer = require('./support/isBuffer');

      function objectToString(o) {
        return Object.prototype.toString.call(o);
      }

      function pad(n) {
        return n < 10 ? '0' + n.toString(10) : n.toString(10);
      }

      var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',
        'Oct', 'Nov', 'Dec'];

// 26 Feb 16:19:34
      function timestamp() {
        var d = new Date();
        var time = [pad(d.getHours()),
          pad(d.getMinutes()),
          pad(d.getSeconds())].join(':');
        return [d.getDate(), months[d.getMonth()], time].join(' ');
      }

// log is just a thin wrapper to console.log that prepends a timestamp
      exports.log = function () {
        console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));
      };

      /**
       * Inherit the prototype methods from one constructor into another.
       *
       * The Function.prototype.inherits from lang.js rewritten as a standalone
       * function (not on Function.prototype). NOTE: If this file is to be loaded
       * during bootstrapping this function needs to be rewritten using some native
       * functions as prototype setup using normal JavaScript does not work as
       * expected during bootstrapping (see mirror.js in r114903).
       *
       * @param {function} ctor Constructor function which needs to inherit the
       *     prototype.
       * @param {function} superCtor Constructor function to inherit prototype from.
       */
      exports.inherits = require('inherits');

      exports._extend = function (origin, add) {
        // Don't do anything if add isn't an object
        if (!add || !isObject(add)) {
          return origin;
        }

        var keys = Object.keys(add);
        var i = keys.length;
        while (i--) {
          origin[keys[i]] = add[keys[i]];
        }
        return origin;
      };

      function hasOwnProperty(obj, prop) {
        return Object.prototype.hasOwnProperty.call(obj, prop);
      }

    }).call(this, require('_process'), typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
  }, { "./support/isBuffer": 23, "_process": 9, "inherits": 7 }],
  25: [function (require, module, exports) {
    var M3U = module.exports = function M3U() {
      this.items = {
        PlaylistItem: [],
        StreamItem: [],
        IframeStreamItem: [],
        MediaItem: []
      };
      this.properties = {};
    };

    M3U.PlaylistItem = require('./m3u/PlaylistItem');
    M3U.MediaItem = require('./m3u/MediaItem');
    M3U.StreamItem = require('./m3u/StreamItem');
    M3U.IframeStreamItem = require('./m3u/IframeStreamItem');

    var Item = require('./m3u/Item');

    M3U.create = function createM3U() {
      return new M3U;
    };

    M3U.prototype.get = function getProperty(key) {
      return this.properties[key];
    };

    M3U.prototype.set = function setProperty(key, value) {
      var tagKey = propertyMap.findByTag(key);
      if (tagKey) {
        key = tagKey.key;
      }
      this.properties[key] = coerce[dataTypes[key] || 'unknown'](value);

      return this;
    };

    M3U.prototype.addItem = function addItem(item) {
      this.items[item.constructor.name].push(item);

      return this;
    };

    M3U.prototype.addPlaylistItem = function addPlaylistItem(data) {
      this.items.PlaylistItem.push(M3U.PlaylistItem.create(data));
    };

    M3U.prototype.removePlaylistItem = function removePlaylistItem(index) {
      if (index < this.items.PlaylistItem.length && index >= 0) {
        this.items.PlaylistItem.splice(index, 1);
      } else {
        throw new RangeError('M3U PlaylistItem out of range');
      }
    };

    M3U.prototype.addMediaItem = function addMediaItem(data) {
      this.items.MediaItem.push(M3U.MediaItem.create(data));
    };

    M3U.prototype.addStreamItem = function addStreamItem(data) {
      this.items.StreamItem.push(M3U.StreamItem.create(data));
    };

    M3U.prototype.addIframeStreamItem = function addIframeStreamItem(data) {
      this.items.IframeStreamItem.push(M3U.IframeStreamItem.create(data));
    };

    M3U.prototype.domainDurations = function domainDurations() {
      var index = 0;
      return this.items.PlaylistItem.reduce(function (duration, item) {
        if (item.get('discontinuity')) {
          index = duration.push(0) - 1;
        }

        duration[index] += item.get('duration');
        return duration;
      }, [0]);
    };

    M3U.prototype.totalDuration = function totalDuration() {
      return this.items.PlaylistItem.reduce(function (duration, item) {
        return duration + item.get('duration');
      }, 0);
    };

    M3U.prototype.merge = function merge(m3u) {
      if (m3u.get('targetDuration') > this.get('targetDuration')) {
        this.set('targetDuration', m3u.get('targetDuration'));
      }
      m3u.items.PlaylistItem[0].set('discontinuity', true);
      this.items.PlaylistItem = this.items.PlaylistItem.concat(m3u.items.PlaylistItem);

      return this;
    };

    M3U.prototype.toString = function toString() {
      var self = this;
      var output = ['#EXTM3U'];
      Object.keys(this.properties).forEach(function (key) {
        var tagKey = propertyMap.findByKey(key);
        var tag = tagKey ? tagKey.tag : key;

        if (dataTypes[key] == 'boolean') {
          output.push('#' + tag);
        } else {
          output.push('#' + tag + ':' + self.get(key));
        }
      });

      if (this.items.PlaylistItem.length) {
        output.push(this.items.PlaylistItem.map(itemToString).join('\n'));

        if (this.get('playlistType') === 'VOD') {
          output.push('#EXT-X-ENDLIST');
        }
      } else {
        if (this.items.StreamItem.length) {
          output.push(this.items.StreamItem.map(itemToString).join('\n') + '\n');
        }
        if (this.items.IframeStreamItem.length) {
          output.push(this.items.IframeStreamItem.map(itemToString).join('\n') + '\n');
        }
        if (this.items.MediaItem.length) {
          output.push(this.items.MediaItem.map(itemToString).join('\n') + '\n');
        }
      }

      return output.join('\n') + '\n';
    };

    M3U.prototype.serialize = function serialize() {
      var object = { properties: this.properties, items: {} };
      var self = this;
      Object.keys(this.items).forEach(function (constructor) {
        object.items[constructor] = self.items[constructor].map(serializeItem);
      });
      return object;
    };

    M3U.unserialize = function unserialize(object) {
      var m3u = new M3U;
      m3u.properties = object.properties;
      Object.keys(object.items).forEach(function (constructor) {
        m3u.items[constructor] = object.items[constructor].map(
          Item.unserialize.bind(null, M3U[constructor])
        );
      });
      return m3u;
    };

    function itemToString(item) {
      return item.toString();
    }

    function serializeItem(item) {
      return item.serialize();
    }

    var coerce = {
      boolean: function coerceBoolean(value) {
        return true;
      },
      integer: function coerceInteger(value) {
        return parseInt(value, 10);
      },
      unknown: function coerceUnknown(value) {
        return value;
      }
    };

    var dataTypes = {
      iframesOnly: 'boolean',
      targetDuration: 'integer',
      mediaSequence: 'integer',
      version: 'integer'
    };

    var propertyMap = [
      { tag: 'EXT-X-ALLOW-CACHE', key: 'allowCache' },
      { tag: 'EXT-X-I-FRAMES-ONLY', key: 'iframesOnly' },
      { tag: 'EXT-X-MEDIA-SEQUENCE', key: 'mediaSequence' },
      { tag: 'EXT-X-PLAYLIST-TYPE', key: 'playlistType' },
      { tag: 'EXT-X-TARGETDURATION', key: 'targetDuration' },
      { tag: 'EXT-X-VERSION', key: 'version' }
    ];

    propertyMap.findByTag = function findByTag(tag) {
      return propertyMap[propertyMap.map(function (tagKey) {
        return tagKey.tag;
      }).indexOf(tag)];
    };

    propertyMap.findByKey = function findByKey(key) {
      return propertyMap[propertyMap.map(function (tagKey) {
        return tagKey.key;
      }).indexOf(key)];
    };

  }, {
    "./m3u/IframeStreamItem": 27,
    "./m3u/Item": 28,
    "./m3u/MediaItem": 29,
    "./m3u/PlaylistItem": 30,
    "./m3u/StreamItem": 31
  }],
  26: [function (require, module, exports) {
    var AttributeList = module.exports = function AttributeList(attributes) {
      this.attributes = {};
      this.mergeAttributes(attributes);
    };

    var dataTypes = AttributeList.dataTypes = {
      'audio': 'quoted-string',
      'autoselect': 'boolean',
      'bandwidth': 'decimal-integer',
      'byterange': 'enumerated-string',
      'codecs': 'quoted-string',
      'default': 'boolean',
      'duration': 'decimal-floating-point',
      'forced': 'boolean',
      'group-id': 'quoted-string',
      'language': 'quoted-string',
      'name': 'quoted-string',
      'program-id': 'decimal-integer',
      'resolution': 'decimal-resolution',
      'subtitles': 'quoted-string',
      'title': 'enumerated-string',
      'type': 'enumerated-string',
      'uri': 'quoted-string',
      'video': 'quoted-string'
    };

    AttributeList.prototype.mergeAttributes = function mergeAttributes(attributes) {
      var self = this;
      if (Array.isArray(attributes)) {
        attributes.forEach(function (attribute) {
          self.set(attribute.key, attribute.value);
        });
      }
    };

    AttributeList.prototype.get = function getValue(key) {
      return this.attributes[key];
    };

    AttributeList.prototype.set = function setValue(key, value) {
      key = key.toLowerCase();
      this.attributes[key] = parse[dataTypes[key] || 'unknown'](value, key);

      return this;
    };

    AttributeList.prototype.getCoerced = function getCoerced(key) {
      return coerce[dataTypes[key] || 'unknown'](this.get(key));
    };

    AttributeList.prototype.toString = function toString() {
      var self = this;
      return Object.keys(this.attributes).map(function (key) {
        return [key.toUpperCase(), self.getCoerced(key)].join('=');
      }).join(',');
    };

    AttributeList.prototype.serialize = function serialize() {
      return this.attributes;
    };

    AttributeList.unserialize = function unserialize(object) {
      var list = new AttributeList;
      list.attributes = object;
      return list;
    };

    var coerce = {
      'boolean': function coerceBoolean(value) {
        return value ? 'YES' : 'NO';
      },
      'decimal-floating-point': parseFloat,
      'decimal-integer': function coerceDecimalInteger(value) {
        return parseInt(value, 10);
      },
      'decimal-resolution': function coerceDecimalResolution(value) {
        if (Array.isArray(value)) {
          return value.join('x');
        } else {
          return value;
        }
      },
      'enumerated-string': function coerceEnumeratedString(value) {
        return value;
      },
      'quoted-string': function coerceQuotedString(value) {
        return '"' + value.replace(/"/g, '\\"') + '"';
      },
      'unknown': function coerceUnknown(value) {
        return value;
      }
    };

    var parse = {
      'boolean': function parseBoolean(value) {
        return typeof value == 'boolean'
          ? value
          : (value == 'YES' ? true : false);
      },
      'decimal-floating-point': parseFloat,
      'decimal-integer': function parseDecimalInteger(value) {
        return parseInt(value, 10);
      },
      'decimal-resolution': function coerceDecimalResolution(value) {
        return value.split('x').map(parse['decimal-integer']);
      },
      'enumerated-string': function parseEnumeratedString(value) {
        return value;
      },
      'quoted-string': function parseQuotedString(value) {
        if (Array.isArray(value)) {
          return value.join(',');
        } else if (value.indexOf('"') === 0 &&
          value.lastIndexOf('"') == value.length - 1) {
          return value.slice(1, -1);
        } else {
          return value;
        }
      },
      'unknown': function parseUnknown(value, key) {
        console.error('Handling value:', value, ' for unknown key:', key);
        return value;
      }
    };
  }, {}],
  27: [function (require, module, exports) {
    var util = require('util'),
      StreamItem = require('./StreamItem');

    var IframeStreamItem = module.exports = function IframeStreamItem(attributes) {
      StreamItem.apply(this, arguments);

      delete this.properties['uri'];
    };

    util.inherits(IframeStreamItem, StreamItem);

    IframeStreamItem.create = function createIframeStreamItem(data) {
      var item = new IframeStreamItem();
      item.setData(data);
      return item;
    };

    IframeStreamItem.prototype.toString = function toString() {
      return '#EXT-X-I-FRAME-STREAM-INF:' + this.attributes.toString();
    };
  }, { "./StreamItem": 31, "util": 24 }],
  28: [function (require, module, exports) {
    var AttributeList = require('./AttributeList');

    var Item = module.exports = function Item(attributes) {
      this.attributes = new AttributeList(attributes);
      this.properties = {
        byteRange: null,
        date: null,
        discontinuity: null,
        duration: null,
        title: null,
        uri: null
      };
    };

    Item.prototype.get = function get(key) {
      if (this.propertiesHasKey(key)) {
        return this.properties[key];
      } else {
        return this.attributes.get(key);
      }
    };

    Item.prototype.set = function set(key, value) {
      if (this.propertiesHasKey(key)) {
        this.properties[key] = value;
      } else {
        this.attributes.set(key, value);
      }

      return this;
    };

    Item.prototype.serialize = function serialize() {
      return {
        attributes: this.attributes.serialize(),
        properties: this.properties
      }
    };

    Item.unserialize = function unserialize(constructor, object) {
      var item = new constructor;
      item.attributes = AttributeList.unserialize(object.attributes);
      item.properties = object.properties;
      return item;
    };

    Item.prototype.setData = function setData(data) {
      var self = this;
      Object.keys(data).forEach(function (key) {
        self.set(key, data[key]);
      });
    };

    Item.prototype.propertiesHasKey = function hasKey(key) {
      return Object.keys(this.properties).indexOf(key) > -1;
    };

  }, { "./AttributeList": 26 }],
  29: [function (require, module, exports) {
    var util = require('util'),
      Item = require('./Item');

    var MediaItem = module.exports = function MediaItem(attributes) {
      Item.apply(this, arguments);

      delete this.properties['uri'];
    };

    util.inherits(MediaItem, Item);

    MediaItem.create = function createMediaItem(data) {
      var item = new MediaItem();
      item.setData(data);
      return item;
    };

    MediaItem.prototype.toString = function toString() {
      return '#EXT-X-MEDIA:' + this.attributes.toString();
    };
  }, { "./Item": 28, "util": 24 }],
  30: [function (require, module, exports) {
    var util = require('util'),
      Item = require('./Item');

    var PlaylistItem = module.exports = function PlaylistItem() {
      Item.call(this);
    };

    util.inherits(PlaylistItem, Item);

    PlaylistItem.create = function createPlaylistItem(data) {
      var item = new PlaylistItem();
      item.setData(data);
      return item;
    };

    PlaylistItem.prototype.toString = function toString() {
      var output = [];
      if (this.get('discontinuity')) {
        output.push('#EXT-X-DISCONTINUITY');
      }
      if (this.get('date')) {
        var date = this.get('date');
        if (date.getMonth) {
          date = date.toISOString();
        }
        output.push('#EXT-X-PROGRAM-DATE-TIME:' + date);
      }
      if (this.get('duration') != null || this.get('title') != null) {
        output.push(
          '#EXTINF:' + [this.get('duration').toFixed(4), this.get('title')].join(',')
        );
      }
      if (this.get('byteRange') != null) {
        output.push('#EXT-X-BYTERANGE:' + this.get('byteRange'));
      }
      output.push(this.get('uri'));

      return output.join('\n');
    };

  }, { "./Item": 28, "util": 24 }],
  31: [function (require, module, exports) {
    var util = require('util'),
      Item = require('./Item'),
      AttributeList = require('./AttributeList');

    var StreamItem = module.exports = function StreamItem(attributes) {
      Item.apply(this, arguments);
    };

    util.inherits(StreamItem, Item);

    StreamItem.create = function createStreamItem(data) {
      var item = new StreamItem();
      item.setData(data);
      return item;
    };

    StreamItem.prototype.toString = function toString() {
      var output = [];
      output.push('#EXT-X-STREAM-INF:' + this.attributes.toString());
      output.push(this.get('uri'));

      return output.join('\n');
    };
  }, { "./AttributeList": 26, "./Item": 28, "util": 24 }],
  32: [function (require, module, exports) {
    /*!
     * ChunkedStream
     * Copyright(c) 2012 Daniel D. Shaw <dshaw@dshaw.com>
     * MIT Licensed
     */

    /**
     * Module dependencies.
     */

    var Stream = require('stream').Stream
      , util = require('util')

    /**
     * Exports.
     */

    module.exports = ChunkedStream

    /**
     * Chunked Stream
     *
     * - Buffers and rechunks on a specific character, by default '\n'.
     */


    function ChunkedStream(matcher, passEmpty) {
      if (!(this instanceof ChunkedStream)) {
        return new ChunkedStream(matcher, passEmpty)
      }

      if (typeof matcher === 'undefined') {
        matcher = '\n'
      }

      this.matcher = matcher
      this.passEmpty = passEmpty
      this.buffer = ''

      this.writable = true
      this.readable = true
    }

    util.inherits(ChunkedStream, Stream)

    ChunkedStream.prototype.write = function (chunk) {
      chunk = chunk.toString()
      var len = chunk.length
        , i = 0

      while (i < len) {
        var char = chunk[i].toString()
        this.buffer += char
        if (char == this.matcher) {
          var data = this.buffer
          this.buffer = ''
          if (!this.passEmpty && data == this.matcher) {
            return true // skip
          }
          this.emit('data', data)
        }
        i++
      }
      return true
    }

    ChunkedStream.prototype.end = function () {
      if (this.buffer) {
        this.emit('data', this.buffer)
      }
      this.emit('end')
    }

  }, { "stream": 21, "util": 24 }],
  33: [function (require, module, exports) {
    var util = require('util'),
      ChunkedStream = require('chunked-stream'),
      M3U = require('./m3u'),
      PlaylistItem = require('./m3u/PlaylistItem'),
      StreamItem = require('./m3u/StreamItem'),
      IframeStreamItem = require('./m3u/IframeStreamItem'),
      MediaItem = require('./m3u/MediaItem');

// used for splitting strings by commas not within double quotes
    var NON_QUOTED_COMMA = /,(?=(?:[^"]|"[^"]*")*$)/;

    var m3uParser = module.exports = function m3uParser() {
      ChunkedStream.apply(this, ['\n', true]);

      this.linesRead = 0;
      this.m3u = new M3U;

      this.on('data', this.parse.bind(this));
      var self = this;
      this.on('end', function () {
        self.emit('m3u', self.m3u);
      });
    };

    util.inherits(m3uParser, ChunkedStream);

    m3uParser.M3U = M3U;

    m3uParser.createStream = function () {
      return new m3uParser;
    };

    m3uParser.prototype.parse = function parse(line) {
      line = line.trim();
      if (this.linesRead == 0) {
        if (line != '#EXTM3U') {
          return this.emit('error', new Error(
            'Non-valid M3U file. First line: ' + line
          ));
        }
        this.linesRead++;
        return true;
      }
      if (['', '#EXT-X-ENDLIST'].indexOf(line) > -1) {
        return true;
      }
      if (line.indexOf('#') == 0) {
        this.parseLine(line);
      } else {
        if (this.currentItem.attributes.uri != undefined) {
          this.addItem(new PlaylistItem);
        }
        this.currentItem.set('uri', line);
        this.emit('item', this.currentItem);
      }
      this.linesRead++;
    };

    m3uParser.prototype.parseLine = function parseLine(line) {
      var parts = line.slice(1).split(/:(.*)/);
      var tag = parts[0];
      var data = parts[1];
      if (typeof this[tag] == 'function') {
        this[tag](data, tag);
      } else {
        this.m3u.set(tag, data);
      }
    };

    m3uParser.prototype.addItem = function addItem(item) {
      this.m3u.addItem(item);
      this.currentItem = item;
      return item;
    };

    m3uParser.prototype['EXTINF'] = function parseInf(data) {
      this.addItem(new PlaylistItem);

      data = data.split(',');
      this.currentItem.set('duration', parseFloat(data[0]));
      this.currentItem.set('title', data[1]);
      if (this.playlistDiscontinuity) {
        this.currentItem.set('discontinuity', true);
        this.playlistDiscontinuity = false;
      }
    };

    m3uParser.prototype['EXT-X-DISCONTINUITY'] = function parseInf() {
      this.playlistDiscontinuity = true;
    }

    m3uParser.prototype['EXT-X-BYTERANGE'] = function parseByteRange(data) {
      this.currentItem.set('byteRange', data);
    };

    m3uParser.prototype['EXT-X-STREAM-INF'] = function (data) {
      this.addItem(new StreamItem(this.parseAttributes(data)));
    };

    m3uParser.prototype['EXT-X-I-FRAME-STREAM-INF'] = function (data) {
      this.addItem(new IframeStreamItem(this.parseAttributes(data)));
      this.emit('item', this.currentItem);
    };

    m3uParser.prototype['EXT-X-MEDIA'] = function (data) {
      this.addItem(new MediaItem(this.parseAttributes(data)));
      this.emit('item', this.currentItem);
    };

    m3uParser.prototype.parseAttributes = function parseAttributes(data) {
      data = data.split(NON_QUOTED_COMMA);
      var self = this;
      return data.map(function (attribute) {
        var keyValue = attribute.split(/=(.+)/).map(function (str) {
          return str.trim();
        });
        return {
          key: keyValue[0],
          value: keyValue[1]
        };
      });
    };

  }, {
    "./m3u": 25,
    "./m3u/IframeStreamItem": 27,
    "./m3u/MediaItem": 29,
    "./m3u/PlaylistItem": 30,
    "./m3u/StreamItem": 31,
    "chunked-stream": 32,
    "util": 24
  }],
  34: [function (require, module, exports) {
    window.m3u8 = require('m3u8');
  }, { "m3u8": 33 }]
}, {}, [34]);
