(function(v, w) {
  "object" === typeof exports && "undefined" !== typeof module
    ? (module.exports = w())
    : "function" === typeof define && define.amd
    ? define(w)
    : (v.ES6Promise = w());
})(this, function() {
  function v(a) {
    return "function" === typeof a;
  }
  function w() {
    return function() {
      return process.nextTick(n);
    };
  }
  function R() {
    return "undefined" !== typeof B
      ? function() {
          B(n);
        }
      : C();
  }
  function S() {
    var a = 0,
      b = new J(n),
      c = document.createTextNode("");
    b.observe(c, { characterData: !0 });
    return function() {
      c.data = a = ++a % 2;
    };
  }
  function T() {
    var a = new MessageChannel();
    a.port1.onmessage = n;
    return function() {
      return a.port2.postMessage(0);
    };
  }
  function C() {
    var a = setTimeout;
    return function() {
      return a(n, 1);
    };
  }
  function n() {
    for (var a = 0; a < k; a += 2)
      (0, q[a])(q[a + 1]), (q[a] = void 0), (q[a + 1] = void 0);
    k = 0;
  }
  function U() {
    try {
      var a = Function("return this")().require("vertx");
      B = a.runOnLoop || a.runOnContext;
      return R();
    } catch (b) {
      return C();
    }
  }
  function D(a, b) {
    var c = this,
      d = new this.constructor(r);
    void 0 === d[z] && K(d);
    var e = c._state;
    if (e) {
      var f = arguments[e - 1];
      l(function() {
        return L(e, d, f, c._result);
      });
    } else E(c, d, a, b);
    return d;
  }
  function F(a) {
    if (a && "object" === typeof a && a.constructor === this) return a;
    var b = new this(r);
    x(b, a);
    return b;
  }
  function r() {}
  function M(a) {
    try {
      return a.then;
    } catch (b) {
      return (p.error = b), p;
    }
  }
  function V(a, b, c, d) {
    try {
      a.call(b, c, d);
    } catch (e) {
      return e;
    }
  }
  function W(a, b, c) {
    l(function(a) {
      var e = !1,
        f = V(
          c,
          b,
          function(c) {
            e || ((e = !0), b !== c ? x(a, c) : m(a, c));
          },
          function(b) {
            e || ((e = !0), g(a, b));
          },
          "Settle: " + (a._label || " unknown promise")
        );
      !e && f && ((e = !0), g(a, f));
    }, a);
  }
  function X(a, b) {
    b._state === y
      ? m(a, b._result)
      : b._state === t
      ? g(a, b._result)
      : E(
          b,
          void 0,
          function(b) {
            return x(a, b);
          },
          function(b) {
            return g(a, b);
          }
        );
  }
  function N(a, b, c) {
    b.constructor === a.constructor && c === D && b.constructor.resolve === F
      ? X(a, b)
      : c === p
      ? (g(a, p.error), (p.error = null))
      : void 0 === c
      ? m(a, b)
      : v(c)
      ? W(a, b, c)
      : m(a, b);
  }
  function x(a, b) {
    if (a === b)
      g(a, new TypeError("You cannot resolve a promise with itself"));
    else {
      var c = typeof b;
      null === b || ("object" !== c && "function" !== c)
        ? m(a, b)
        : N(a, b, M(b));
    }
  }
  function Y(a) {
    a._onerror && a._onerror(a._result);
    G(a);
  }
  function m(a, b) {
    a._state === u &&
      ((a._result = b), (a._state = y), 0 !== a._subscribers.length && l(G, a));
  }
  function g(a, b) {
    a._state === u && ((a._state = t), (a._result = b), l(Y, a));
  }
  function E(a, b, c, d) {
    var e = a._subscribers,
      f = e.length;
    a._onerror = null;
    e[f] = b;
    e[f + y] = c;
    e[f + t] = d;
    0 === f && a._state && l(G, a);
  }
  function G(a) {
    var b = a._subscribers,
      c = a._state;
    if (0 !== b.length) {
      for (
        var d = void 0, e = void 0, f = a._result, g = 0;
        g < b.length;
        g += 3
      )
        (d = b[g]), (e = b[g + c]), d ? L(c, d, e, f) : e(f);
      a._subscribers.length = 0;
    }
  }
  function L(a, b, c, d) {
    var e = v(c),
      f = void 0,
      h = void 0,
      k = void 0,
      l = void 0;
    if (e) {
      try {
        f = c(d);
      } catch (n) {
        (p.error = n), (f = p);
      }
      f === p ? ((l = !0), (h = f.error), (f.error = null)) : (k = !0);
      if (b === f) {
        g(
          b,
          new TypeError("A promises callback cannot return that same promise.")
        );
        return;
      }
    } else (f = d), (k = !0);
    b._state === u &&
      (e && k ? x(b, f) : l ? g(b, h) : a === y ? m(b, f) : a === t && g(b, f));
  }
  function Z(a, b) {
    try {
      b(
        function(b) {
          x(a, b);
        },
        function(b) {
          g(a, b);
        }
      );
    } catch (c) {
      g(a, c);
    }
  }
  function K(a) {
    a[z] = O++;
    a._state = void 0;
    a._result = void 0;
    a._subscribers = [];
  }
  var H = void 0,
    P = (H = Array.isArray
      ? Array.isArray
      : function(a) {
          return "[object Array]" === Object.prototype.toString.call(a);
        }),
    k = 0,
    B = void 0,
    I = void 0,
    l = function(a, b) {
      q[k] = a;
      q[k + 1] = b;
      k += 2;
      2 === k && (I ? I(n) : Q());
    },
    A = (H = "undefined" !== typeof window ? window : void 0) || {},
    J = A.MutationObserver || A.WebKitMutationObserver,
    A =
      "undefined" === typeof self &&
      "undefined" !== typeof process &&
      "[object process]" === {}.toString.call(process),
    aa =
      "undefined" !== typeof Uint8ClampedArray &&
      "undefined" !== typeof importScripts &&
      "undefined" !== typeof MessageChannel,
    q = Array(1e3),
    Q = void 0,
    Q = A
      ? w()
      : J
      ? S()
      : aa
      ? T()
      : void 0 === H && "function" === typeof require
      ? U()
      : C(),
    z = Math.random()
      .toString(36)
      .substring(2),
    u = void 0,
    y = 1,
    t = 2,
    p = { error: null },
    O = 0,
    ba = (function() {
      function a(a, c) {
        this._instanceConstructor = a;
        this.promise = new a(r);
        this.promise[z] || K(this.promise);
        P(c)
          ? ((this._remaining = this.length = c.length),
            (this._result = Array(this.length)),
            0 === this.length
              ? m(this.promise, this._result)
              : ((this.length = this.length || 0),
                this._enumerate(c),
                0 === this._remaining && m(this.promise, this._result)))
          : g(this.promise, Error("Array Methods must be provided an Array"));
      }
      a.prototype._enumerate = function(a) {
        for (var c = 0; this._state === u && c < a.length; c++)
          this._eachEntry(a[c], c);
      };
      a.prototype._eachEntry = function(a, c) {
        var d = this._instanceConstructor,
          e = d.resolve;
        e === F
          ? ((e = M(a)),
            e === D && a._state !== u
              ? this._settledAt(a._state, c, a._result)
              : "function" !== typeof e
              ? (this._remaining--, (this._result[c] = a))
              : d === h
              ? ((d = new d(r)), N(d, a, e), this._willSettleAt(d, c))
              : this._willSettleAt(
                  new d(function(c) {
                    return c(a);
                  }),
                  c
                ))
          : this._willSettleAt(e(a), c);
      };
      a.prototype._settledAt = function(a, c, d) {
        var e = this.promise;
        e._state === u &&
          (this._remaining--, a === t ? g(e, d) : (this._result[c] = d));
        0 === this._remaining && m(e, this._result);
      };
      a.prototype._willSettleAt = function(a, c) {
        var d = this;
        E(
          a,
          void 0,
          function(a) {
            return d._settledAt(y, c, a);
          },
          function(a) {
            return d._settledAt(t, c, a);
          }
        );
      };
      return a;
    })(),
    h = (function() {
      function a(b) {
        this[z] = O++;
        this._result = this._state = void 0;
        this._subscribers = [];
        if (r !== b) {
          if ("function" !== typeof b)
            throw new TypeError(
              "You must pass a resolver function as the first argument to the promise constructor"
            );
          if (this instanceof a) Z(this, b);
          else
            throw new TypeError(
              "Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function."
            );
        }
      }
      a.prototype["catch"] = function(a) {
        return this.then(null, a);
      };
      a.prototype["finally"] = function(a) {
        var c = this.constructor;
        return v(a)
          ? this.then(
              function(d) {
                return c.resolve(a()).then(function() {
                  return d;
                });
              },
              function(d) {
                return c.resolve(a()).then(function() {
                  throw d;
                });
              }
            )
          : this.then(a, a);
      };
      return a;
    })();
  h.prototype.then = D;
  h.all = function(a) {
    return new ba(this, a).promise;
  };
  h.race = function(a) {
    var b = this;
    return P(a)
      ? new b(function(c, d) {
          for (var e = a.length, f = 0; f < e; f++) b.resolve(a[f]).then(c, d);
        })
      : new b(function(a, b) {
          return b(new TypeError("You must pass an array to race."));
        });
  };
  h.resolve = F;
  h.reject = function(a) {
    var b = new this(r);
    g(b, a);
    return b;
  };
  h._setScheduler = function(a) {
    I = a;
  };
  h._setAsap = function(a) {
    l = a;
  };
  h._asap = l;
  h.polyfill = function() {
    var a = void 0;
    if ("undefined" !== typeof global) a = global;
    else if ("undefined" !== typeof self) a = self;
    else
      try {
        a = Function("return this")();
      } catch (b) {
        throw Error(
          "polyfill failed because global object is unavailable in this environment"
        );
      }
    var c = a.Promise;
    if (c) {
      var d = null;
      try {
        d = Object.prototype.toString.call(c.resolve());
      } catch (e) {}
      if ("[object Promise]" === d && !c.cast) return;
    }
    a.Promise = h;
  };
  return (h.Promise = h);
});