@getopenpay/openpay-js
Version:
Accept payments through OpenPay, right on your site
270 lines • 56.9 kB
JavaScript
import { d as P } from "./diag-api-CWQhqUTV.js";
import { m as O } from "./metrics-api-iPwJu8TJ.js";
import { t as x } from "./index-B_XmW797.js";
var w = (
/** @class */
(function() {
function r() {
}
return r.prototype.emit = function(t) {
}, r;
})()
), A = new w(), I = (
/** @class */
(function() {
function r() {
}
return r.prototype.getLogger = function(t, e, n) {
return new w();
}, r;
})()
), b = new I(), E = (
/** @class */
(function() {
function r(t, e, n, i) {
this._provider = t, this.name = e, this.version = n, this.options = i;
}
return r.prototype.emit = function(t) {
this._getLogger().emit(t);
}, r.prototype._getLogger = function() {
if (this._delegate)
return this._delegate;
var t = this._provider.getDelegateLogger(this.name, this.version, this.options);
return t ? (this._delegate = t, this._delegate) : A;
}, r;
})()
), d = (
/** @class */
(function() {
function r() {
}
return r.prototype.getLogger = function(t, e, n) {
var i;
return (i = this.getDelegateLogger(t, e, n)) !== null && i !== void 0 ? i : new E(this, t, e, n);
}, r.prototype.getDelegate = function() {
var t;
return (t = this._delegate) !== null && t !== void 0 ? t : b;
}, r.prototype.setDelegate = function(t) {
this._delegate = t;
}, r.prototype.getDelegateLogger = function(t, e, n) {
var i;
return (i = this._delegate) === null || i === void 0 ? void 0 : i.getLogger(t, e, n);
}, r;
})()
), j = typeof globalThis == "object" ? globalThis : typeof self == "object" ? self : typeof window == "object" ? window : typeof global == "object" ? global : {}, l = Symbol.for("io.opentelemetry.js.api.logs"), g = j;
function T(r, t, e) {
return function(n) {
return n === r ? t : e;
};
}
var v = 1, S = (
/** @class */
(function() {
function r() {
this._proxyLoggerProvider = new d();
}
return r.getInstance = function() {
return this._instance || (this._instance = new r()), this._instance;
}, r.prototype.setGlobalLoggerProvider = function(t) {
return g[l] ? this.getLoggerProvider() : (g[l] = T(v, t, b), this._proxyLoggerProvider.setDelegate(t), t);
}, r.prototype.getLoggerProvider = function() {
var t, e;
return (e = (t = g[l]) === null || t === void 0 ? void 0 : t.call(g, v)) !== null && e !== void 0 ? e : this._proxyLoggerProvider;
}, r.prototype.getLogger = function(t, e, n) {
return this.getLoggerProvider().getLogger(t, e, n);
}, r.prototype.disable = function() {
delete g[l], this._proxyLoggerProvider = new d();
}, r;
})()
), k = S.getInstance(), h, m;
function D() {
if (m) return h;
m = 1;
function r(o) {
return typeof o == "function";
}
var t = console.error.bind(console);
function e(o, a, s) {
var c = !!o[a] && o.propertyIsEnumerable(a);
Object.defineProperty(o, a, {
configurable: !0,
enumerable: c,
writable: !0,
value: s
});
}
function n(o) {
o && o.logger && (r(o.logger) ? t = o.logger : t("new logger isn't a function, not replacing"));
}
function i(o, a, s) {
if (!o || !o[a]) {
t("no original function " + a + " to wrap");
return;
}
if (!s) {
t("no wrapper function"), t(new Error().stack);
return;
}
if (!r(o[a]) || !r(s)) {
t("original object and wrapper must be functions");
return;
}
var c = o[a], f = s(c, a);
return e(f, "__original", c), e(f, "__unwrap", function() {
o[a] === f && e(o, a, c);
}), e(f, "__wrapped", !0), e(o, a, f), f;
}
function u(o, a, s) {
if (o)
Array.isArray(o) || (o = [o]);
else {
t("must provide one or more modules to patch"), t(new Error().stack);
return;
}
if (!(a && Array.isArray(a))) {
t("must provide one or more functions to wrap on modules");
return;
}
o.forEach(function(c) {
a.forEach(function(f) {
i(c, f, s);
});
});
}
function y(o, a) {
if (!o || !o[a]) {
t("no function to unwrap."), t(new Error().stack);
return;
}
if (!o[a].__unwrap)
t("no original to unwrap to -- has " + a + " already been unwrapped?");
else
return o[a].__unwrap();
}
function L(o, a) {
if (o)
Array.isArray(o) || (o = [o]);
else {
t("must provide one or more modules to patch"), t(new Error().stack);
return;
}
if (!(a && Array.isArray(a))) {
t("must provide one or more functions to unwrap on modules");
return;
}
o.forEach(function(s) {
a.forEach(function(c) {
y(s, c);
});
});
}
return n.wrap = i, n.massWrap = u, n.unwrap = y, n.massUnwrap = L, h = n, h;
}
var p = D(), _ = function() {
return _ = Object.assign || function(r) {
for (var t, e = 1, n = arguments.length; e < n; e++) {
t = arguments[e];
for (var i in t) Object.prototype.hasOwnProperty.call(t, i) && (r[i] = t[i]);
}
return r;
}, _.apply(this, arguments);
}, G = (
/** @class */
(function() {
function r(t, e, n) {
this.instrumentationName = t, this.instrumentationVersion = e, this._config = {}, this._wrap = p.wrap, this._unwrap = p.unwrap, this._massWrap = p.massWrap, this._massUnwrap = p.massUnwrap, this.setConfig(n), this._diag = P.createComponentLogger({
namespace: t
}), this._tracer = x.getTracer(t, e), this._meter = O.getMeter(t, e), this._logger = k.getLogger(t, e), this._updateMetricInstruments();
}
return Object.defineProperty(r.prototype, "meter", {
/* Returns meter */
get: function() {
return this._meter;
},
enumerable: !1,
configurable: !0
}), r.prototype.setMeterProvider = function(t) {
this._meter = t.getMeter(this.instrumentationName, this.instrumentationVersion), this._updateMetricInstruments();
}, Object.defineProperty(r.prototype, "logger", {
/* Returns logger */
get: function() {
return this._logger;
},
enumerable: !1,
configurable: !0
}), r.prototype.setLoggerProvider = function(t) {
this._logger = t.getLogger(this.instrumentationName, this.instrumentationVersion);
}, r.prototype.getModuleDefinitions = function() {
var t, e = (t = this.init()) !== null && t !== void 0 ? t : [];
return Array.isArray(e) ? e : [e];
}, r.prototype._updateMetricInstruments = function() {
}, r.prototype.getConfig = function() {
return this._config;
}, r.prototype.setConfig = function(t) {
this._config = _({ enabled: !0 }, t);
}, r.prototype.setTracerProvider = function(t) {
this._tracer = t.getTracer(this.instrumentationName, this.instrumentationVersion);
}, Object.defineProperty(r.prototype, "tracer", {
/* Returns tracer */
get: function() {
return this._tracer;
},
enumerable: !1,
configurable: !0
}), r.prototype._runSpanCustomizationHook = function(t, e, n, i) {
if (t)
try {
t(n, i);
} catch (u) {
this._diag.error("Error running span customization hook due to exception in handler", { triggerName: e }, u);
}
}, r;
})()
), M = /* @__PURE__ */ (function() {
var r = function(t, e) {
return r = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(n, i) {
n.__proto__ = i;
} || function(n, i) {
for (var u in i) Object.prototype.hasOwnProperty.call(i, u) && (n[u] = i[u]);
}, r(t, e);
};
return function(t, e) {
if (typeof e != "function" && e !== null)
throw new TypeError("Class extends value " + String(e) + " is not a constructor or null");
r(t, e);
function n() {
this.constructor = t;
}
t.prototype = e === null ? Object.create(e) : (n.prototype = e.prototype, new n());
};
})(), W = (
/** @class */
(function(r) {
M(t, r);
function t(e, n, i) {
var u = r.call(this, e, n, i) || this;
return u._config.enabled && u.enable(), u;
}
return t;
})(G)
);
function B(r, t, e) {
var n, i;
try {
i = r();
} catch (u) {
n = u;
} finally {
return t(n, i), i;
}
}
function U(r) {
return typeof r == "function" && typeof r.__original == "function" && typeof r.__unwrap == "function" && r.__wrapped === !0;
}
export {
W as I,
U as i,
k as l,
B as s
};
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidXRpbHMtIX57MDBnfX4uanMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IGQgYXMgZGlhZyB9IGZyb20gJy4vZGlhZy1hcGktIX57MDA4fX4uanMnO1xuaW1wb3J0IHsgbSBhcyBtZXRyaWNzIH0gZnJvbSAnLi9tZXRyaWNzLWFwaS0hfnswMGZ9fi5qcyc7XG5pbXBvcnQgeyB0IGFzIHRyYWNlIH0gZnJvbSAnLi9pbmRleC0hfnswMDl9fi5qcyc7XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG52YXIgTm9vcExvZ2dlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBOb29wTG9nZ2VyKCkge1xuICAgIH1cbiAgICBOb29wTG9nZ2VyLnByb3RvdHlwZS5lbWl0ID0gZnVuY3Rpb24gKF9sb2dSZWNvcmQpIHsgfTtcbiAgICByZXR1cm4gTm9vcExvZ2dlcjtcbn0oKSk7XG52YXIgTk9PUF9MT0dHRVIgPSBuZXcgTm9vcExvZ2dlcigpO1xuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xudmFyIE5vb3BMb2dnZXJQcm92aWRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBOb29wTG9nZ2VyUHJvdmlkZXIoKSB7XG4gICAgfVxuICAgIE5vb3BMb2dnZXJQcm92aWRlci5wcm90b3R5cGUuZ2V0TG9nZ2VyID0gZnVuY3Rpb24gKF9uYW1lLCBfdmVyc2lvbiwgX29wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBOb29wTG9nZ2VyKCk7XG4gICAgfTtcbiAgICByZXR1cm4gTm9vcExvZ2dlclByb3ZpZGVyO1xufSgpKTtcbnZhciBOT09QX0xPR0dFUl9QUk9WSURFUiA9IG5ldyBOb29wTG9nZ2VyUHJvdmlkZXIoKTtcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbnZhciBQcm94eUxvZ2dlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBQcm94eUxvZ2dlcihfcHJvdmlkZXIsIG5hbWUsIHZlcnNpb24sIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5fcHJvdmlkZXIgPSBfcHJvdmlkZXI7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEVtaXQgYSBsb2cgcmVjb3JkLiBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSB1c2VkIGJ5IGxvZyBhcHBlbmRlcnMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbG9nUmVjb3JkXG4gICAgICovXG4gICAgUHJveHlMb2dnZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbiAobG9nUmVjb3JkKSB7XG4gICAgICAgIHRoaXMuX2dldExvZ2dlcigpLmVtaXQobG9nUmVjb3JkKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFRyeSB0byBnZXQgYSBsb2dnZXIgZnJvbSB0aGUgcHJveHkgbG9nZ2VyIHByb3ZpZGVyLlxuICAgICAqIElmIHRoZSBwcm94eSBsb2dnZXIgcHJvdmlkZXIgaGFzIG5vIGRlbGVnYXRlLCByZXR1cm4gYSBub29wIGxvZ2dlci5cbiAgICAgKi9cbiAgICBQcm94eUxvZ2dlci5wcm90b3R5cGUuX2dldExvZ2dlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2RlbGVnYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGxvZ2dlciA9IHRoaXMuX3Byb3ZpZGVyLmdldERlbGVnYXRlTG9nZ2VyKHRoaXMubmFtZSwgdGhpcy52ZXJzaW9uLCB0aGlzLm9wdGlvbnMpO1xuICAgICAgICBpZiAoIWxvZ2dlcikge1xuICAgICAgICAgICAgcmV0dXJuIE5PT1BfTE9HR0VSO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2RlbGVnYXRlID0gbG9nZ2VyO1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGU7XG4gICAgfTtcbiAgICByZXR1cm4gUHJveHlMb2dnZXI7XG59KCkpO1xuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xudmFyIFByb3h5TG9nZ2VyUHJvdmlkZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUHJveHlMb2dnZXJQcm92aWRlcigpIHtcbiAgICB9XG4gICAgUHJveHlMb2dnZXJQcm92aWRlci5wcm90b3R5cGUuZ2V0TG9nZ2VyID0gZnVuY3Rpb24gKG5hbWUsIHZlcnNpb24sIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICByZXR1cm4gKChfYSA9IHRoaXMuZ2V0RGVsZWdhdGVMb2dnZXIobmFtZSwgdmVyc2lvbiwgb3B0aW9ucykpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IG5ldyBQcm94eUxvZ2dlcih0aGlzLCBuYW1lLCB2ZXJzaW9uLCBvcHRpb25zKSk7XG4gICAgfTtcbiAgICBQcm94eUxvZ2dlclByb3ZpZGVyLnByb3RvdHlwZS5nZXREZWxlZ2F0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICByZXR1cm4gKF9hID0gdGhpcy5fZGVsZWdhdGUpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IE5PT1BfTE9HR0VSX1BST1ZJREVSO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBkZWxlZ2F0ZSBsb2dnZXIgcHJvdmlkZXJcbiAgICAgKi9cbiAgICBQcm94eUxvZ2dlclByb3ZpZGVyLnByb3RvdHlwZS5zZXREZWxlZ2F0ZSA9IGZ1bmN0aW9uIChkZWxlZ2F0ZSkge1xuICAgICAgICB0aGlzLl9kZWxlZ2F0ZSA9IGRlbGVnYXRlO1xuICAgIH07XG4gICAgUHJveHlMb2dnZXJQcm92aWRlci5wcm90b3R5cGUuZ2V0RGVsZWdhdGVMb2dnZXIgPSBmdW5jdGlvbiAobmFtZSwgdmVyc2lvbiwgb3B0aW9ucykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHJldHVybiAoX2EgPSB0aGlzLl9kZWxlZ2F0ZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmdldExvZ2dlcihuYW1lLCB2ZXJzaW9uLCBvcHRpb25zKTtcbiAgICB9O1xuICAgIHJldHVybiBQcm94eUxvZ2dlclByb3ZpZGVyO1xufSgpKTtcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8vIFVwZGF0ZXMgdG8gdGhpcyBmaWxlIHNob3VsZCBhbHNvIGJlIHJlcGxpY2F0ZWQgdG8gQG9wZW50ZWxlbWV0cnkvYXBpIGFuZFxuLy8gQG9wZW50ZWxlbWV0cnkvY29yZSB0b28uXG4vKipcbiAqIC0gZ2xvYmFsVGhpcyAoTmV3IHN0YW5kYXJkKVxuICogLSBzZWxmIChXaWxsIHJldHVybiB0aGUgY3VycmVudCB3aW5kb3cgaW5zdGFuY2UgZm9yIHN1cHBvcnRlZCBicm93c2VycylcbiAqIC0gd2luZG93IChmYWxsYmFjayBmb3Igb2xkZXIgYnJvd3NlciBpbXBsZW1lbnRhdGlvbnMpXG4gKiAtIGdsb2JhbCAoTm9kZUpTIGltcGxlbWVudGF0aW9uKVxuICogLSA8b2JqZWN0PiAoV2hlbiBhbGwgZWxzZSBmYWlscylcbiAqL1xuLyoqIG9ubHkgZ2xvYmFscyB0aGF0IGNvbW1vbiB0byBub2RlIGFuZCBicm93c2VycyBhcmUgYWxsb3dlZCAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vZGUvbm8tdW5zdXBwb3J0ZWQtZmVhdHVyZXMvZXMtYnVpbHRpbnMsIG5vLXVuZGVmXG52YXIgX2dsb2JhbFRoaXMgPSB0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gJ29iamVjdCdcbiAgICA/IGdsb2JhbFRoaXNcbiAgICA6IHR5cGVvZiBzZWxmID09PSAnb2JqZWN0J1xuICAgICAgICA/IHNlbGZcbiAgICAgICAgOiB0eXBlb2Ygd2luZG93ID09PSAnb2JqZWN0J1xuICAgICAgICAgICAgPyB3aW5kb3dcbiAgICAgICAgICAgIDogdHlwZW9mIGdsb2JhbCA9PT0gJ29iamVjdCdcbiAgICAgICAgICAgICAgICA/IGdsb2JhbFxuICAgICAgICAgICAgICAgIDoge307XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG52YXIgR0xPQkFMX0xPR1NfQVBJX0tFWSA9IFN5bWJvbC5mb3IoJ2lvLm9wZW50ZWxlbWV0cnkuanMuYXBpLmxvZ3MnKTtcbnZhciBfZ2xvYmFsID0gX2dsb2JhbFRoaXM7XG4vKipcbiAqIE1ha2UgYSBmdW5jdGlvbiB3aGljaCBhY2NlcHRzIGEgdmVyc2lvbiBpbnRlZ2VyIGFuZCByZXR1cm5zIHRoZSBpbnN0YW5jZSBvZiBhbiBBUEkgaWYgdGhlIHZlcnNpb25cbiAqIGlzIGNvbXBhdGlibGUsIG9yIGEgZmFsbGJhY2sgdmVyc2lvbiAodXN1YWxseSBOT09QKSBpZiBpdCBpcyBub3QuXG4gKlxuICogQHBhcmFtIHJlcXVpcmVkVmVyc2lvbiBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB2ZXJzaW9uIHdoaWNoIGlzIHJlcXVpcmVkIHRvIHJldHVybiB0aGUgaW5zdGFuY2VcbiAqIEBwYXJhbSBpbnN0YW5jZSBJbnN0YW5jZSB3aGljaCBzaG91bGQgYmUgcmV0dXJuZWQgaWYgdGhlIHJlcXVpcmVkIHZlcnNpb24gaXMgY29tcGF0aWJsZVxuICogQHBhcmFtIGZhbGxiYWNrIEZhbGxiYWNrIGluc3RhbmNlLCB1c3VhbGx5IE5PT1AsIHdoaWNoIHdpbGwgYmUgcmV0dXJuZWQgaWYgdGhlIHJlcXVpcmVkIHZlcnNpb24gaXMgbm90IGNvbXBhdGlibGVcbiAqL1xuZnVuY3Rpb24gbWFrZUdldHRlcihyZXF1aXJlZFZlcnNpb24sIGluc3RhbmNlLCBmYWxsYmFjaykge1xuICAgIHJldHVybiBmdW5jdGlvbiAodmVyc2lvbikge1xuICAgICAgICByZXR1cm4gdmVyc2lvbiA9PT0gcmVxdWlyZWRWZXJzaW9uID8gaW5zdGFuY2UgOiBmYWxsYmFjaztcbiAgICB9O1xufVxuLyoqXG4gKiBBIG51bWJlciB3aGljaCBzaG91bGQgYmUgaW5jcmVtZW50ZWQgZWFjaCB0aW1lIGEgYmFja3dhcmRzIGluY29tcGF0aWJsZVxuICogY2hhbmdlIGlzIG1hZGUgdG8gdGhlIEFQSS4gVGhpcyBudW1iZXIgaXMgdXNlZCB3aGVuIGFuIEFQSSBwYWNrYWdlXG4gKiBhdHRlbXB0cyB0byBhY2Nlc3MgdGhlIGdsb2JhbCBBUEkgdG8gZW5zdXJlIGl0IGlzIGdldHRpbmcgYSBjb21wYXRpYmxlXG4gKiB2ZXJzaW9uLiBJZiB0aGUgZ2xvYmFsIEFQSSBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBBUEkgcGFja2FnZVxuICogYXR0ZW1wdGluZyB0byBnZXQgaXQsIGEgTk9PUCBBUEkgaW1wbGVtZW50YXRpb24gd2lsbCBiZSByZXR1cm5lZC5cbiAqL1xudmFyIEFQSV9CQUNLV0FSRFNfQ09NUEFUSUJJTElUWV9WRVJTSU9OID0gMTtcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbnZhciBMb2dzQVBJID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIExvZ3NBUEkoKSB7XG4gICAgICAgIHRoaXMuX3Byb3h5TG9nZ2VyUHJvdmlkZXIgPSBuZXcgUHJveHlMb2dnZXJQcm92aWRlcigpO1xuICAgIH1cbiAgICBMb2dzQVBJLmdldEluc3RhbmNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIXRoaXMuX2luc3RhbmNlKSB7XG4gICAgICAgICAgICB0aGlzLl9pbnN0YW5jZSA9IG5ldyBMb2dzQVBJKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2luc3RhbmNlO1xuICAgIH07XG4gICAgTG9nc0FQSS5wcm90b3R5cGUuc2V0R2xvYmFsTG9nZ2VyUHJvdmlkZXIgPSBmdW5jdGlvbiAocHJvdmlkZXIpIHtcbiAgICAgICAgaWYgKF9nbG9iYWxbR0xPQkFMX0xPR1NfQVBJX0tFWV0pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldExvZ2dlclByb3ZpZGVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgX2dsb2JhbFtHTE9CQUxfTE9HU19BUElfS0VZXSA9IG1ha2VHZXR0ZXIoQVBJX0JBQ0tXQVJEU19DT01QQVRJQklMSVRZX1ZFUlNJT04sIHByb3ZpZGVyLCBOT09QX0xPR0dFUl9QUk9WSURFUik7XG4gICAgICAgIHRoaXMuX3Byb3h5TG9nZ2VyUHJvdmlkZXIuc2V0RGVsZWdhdGUocHJvdmlkZXIpO1xuICAgICAgICByZXR1cm4gcHJvdmlkZXI7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBnbG9iYWwgbG9nZ2VyIHByb3ZpZGVyLlxuICAgICAqXG4gICAgICogQHJldHVybnMgTG9nZ2VyUHJvdmlkZXJcbiAgICAgKi9cbiAgICBMb2dzQVBJLnByb3RvdHlwZS5nZXRMb2dnZXJQcm92aWRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgcmV0dXJuICgoX2IgPSAoX2EgPSBfZ2xvYmFsW0dMT0JBTF9MT0dTX0FQSV9LRVldKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2FsbChfZ2xvYmFsLCBBUElfQkFDS1dBUkRTX0NPTVBBVElCSUxJVFlfVkVSU0lPTikpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHRoaXMuX3Byb3h5TG9nZ2VyUHJvdmlkZXIpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIGxvZ2dlciBmcm9tIHRoZSBnbG9iYWwgbG9nZ2VyIHByb3ZpZGVyLlxuICAgICAqXG4gICAgICogQHJldHVybnMgTG9nZ2VyXG4gICAgICovXG4gICAgTG9nc0FQSS5wcm90b3R5cGUuZ2V0TG9nZ2VyID0gZnVuY3Rpb24gKG5hbWUsIHZlcnNpb24sIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TG9nZ2VyUHJvdmlkZXIoKS5nZXRMb2dnZXIobmFtZSwgdmVyc2lvbiwgb3B0aW9ucyk7XG4gICAgfTtcbiAgICAvKiogUmVtb3ZlIHRoZSBnbG9iYWwgbG9nZ2VyIHByb3ZpZGVyICovXG4gICAgTG9nc0FQSS5wcm90b3R5cGUuZGlzYWJsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZGVsZXRlIF9nbG9iYWxbR0xPQkFMX0xPR1NfQVBJX0tFWV07XG4gICAgICAgIHRoaXMuX3Byb3h5TG9nZ2VyUHJvdmlkZXIgPSBuZXcgUHJveHlMb2dnZXJQcm92aWRlcigpO1xuICAgIH07XG4gICAgcmV0dXJuIExvZ3NBUEk7XG59KCkpO1xuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xudmFyIGxvZ3MgPSBMb2dzQVBJLmdldEluc3RhbmNlKCk7XG5cbnZhciBzaGltbWVyXzE7XG52YXIgaGFzUmVxdWlyZWRTaGltbWVyO1xuXG5mdW5jdGlvbiByZXF1aXJlU2hpbW1lciAoKSB7XG5cdGlmIChoYXNSZXF1aXJlZFNoaW1tZXIpIHJldHVybiBzaGltbWVyXzE7XG5cdGhhc1JlcXVpcmVkU2hpbW1lciA9IDE7XG5cblx0ZnVuY3Rpb24gaXNGdW5jdGlvbiAoZnVua3Rpb24pIHtcblx0ICByZXR1cm4gdHlwZW9mIGZ1bmt0aW9uID09PSAnZnVuY3Rpb24nXG5cdH1cblxuXHQvLyBEZWZhdWx0IHRvIGNvbXBsYWluaW5nIGxvdWRseSB3aGVuIHRoaW5ncyBkb24ndCBnbyBhY2NvcmRpbmcgdG8gcGxhbi5cblx0dmFyIGxvZ2dlciA9IGNvbnNvbGUuZXJyb3IuYmluZChjb25zb2xlKTtcblxuXHQvLyBTZXRzIGEgcHJvcGVydHkgb24gYW4gb2JqZWN0LCBwcmVzZXJ2aW5nIGl0cyBlbnVtZXJhYmlsaXR5LlxuXHQvLyBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCB0aGUgcHJvcGVydHkgaXMgYWxyZWFkeSB3cml0YWJsZS5cblx0ZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkgKG9iaiwgbmFtZSwgdmFsdWUpIHtcblx0ICB2YXIgZW51bWVyYWJsZSA9ICEhb2JqW25hbWVdICYmIG9iai5wcm9wZXJ0eUlzRW51bWVyYWJsZShuYW1lKTtcblx0ICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBuYW1lLCB7XG5cdCAgICBjb25maWd1cmFibGU6IHRydWUsXG5cdCAgICBlbnVtZXJhYmxlOiBlbnVtZXJhYmxlLFxuXHQgICAgd3JpdGFibGU6IHRydWUsXG5cdCAgICB2YWx1ZTogdmFsdWVcblx0ICB9KTtcblx0fVxuXG5cdC8vIEtlZXAgaW5pdGlhbGl6YXRpb24gaWRlbXBvdGVudC5cblx0ZnVuY3Rpb24gc2hpbW1lciAob3B0aW9ucykge1xuXHQgIGlmIChvcHRpb25zICYmIG9wdGlvbnMubG9nZ2VyKSB7XG5cdCAgICBpZiAoIWlzRnVuY3Rpb24ob3B0aW9ucy5sb2dnZXIpKSBsb2dnZXIoXCJuZXcgbG9nZ2VyIGlzbid0IGEgZnVuY3Rpb24sIG5vdCByZXBsYWNpbmdcIik7XG5cdCAgICBlbHNlIGxvZ2dlciA9IG9wdGlvbnMubG9nZ2VyO1xuXHQgIH1cblx0fVxuXG5cdGZ1bmN0aW9uIHdyYXAgKG5vZHVsZSwgbmFtZSwgd3JhcHBlcikge1xuXHQgIGlmICghbm9kdWxlIHx8ICFub2R1bGVbbmFtZV0pIHtcblx0ICAgIGxvZ2dlcignbm8gb3JpZ2luYWwgZnVuY3Rpb24gJyArIG5hbWUgKyAnIHRvIHdyYXAnKTtcblx0ICAgIHJldHVyblxuXHQgIH1cblxuXHQgIGlmICghd3JhcHBlcikge1xuXHQgICAgbG9nZ2VyKCdubyB3cmFwcGVyIGZ1bmN0aW9uJyk7XG5cdCAgICBsb2dnZXIoKG5ldyBFcnJvcigpKS5zdGFjayk7XG5cdCAgICByZXR1cm5cblx0ICB9XG5cblx0ICBpZiAoIWlzRnVuY3Rpb24obm9kdWxlW25hbWVdKSB8fCAhaXNGdW5jdGlvbih3cmFwcGVyKSkge1xuXHQgICAgbG9nZ2VyKCdvcmlnaW5hbCBvYmplY3QgYW5kIHdyYXBwZXIgbXVzdCBiZSBmdW5jdGlvbnMnKTtcblx0ICAgIHJldHVyblxuXHQgIH1cblxuXHQgIHZhciBvcmlnaW5hbCA9IG5vZHVsZVtuYW1lXTtcblx0ICB2YXIgd3JhcHBlZCA9IHdyYXBwZXIob3JpZ2luYWwsIG5hbWUpO1xuXG5cdCAgZGVmaW5lUHJvcGVydHkod3JhcHBlZCwgJ19fb3JpZ2luYWwnLCBvcmlnaW5hbCk7XG5cdCAgZGVmaW5lUHJvcGVydHkod3JhcHBlZCwgJ19fdW53cmFwJywgZnVuY3Rpb24gKCkge1xuXHQgICAgaWYgKG5vZHVsZVtuYW1lXSA9PT0gd3JhcHBlZCkgZGVmaW5lUHJvcGVydHkobm9kdWxlLCBuYW1lLCBvcmlnaW5hbCk7XG5cdCAgfSk7XG5cdCAgZGVmaW5lUHJvcGVydHkod3JhcHBlZCwgJ19fd3JhcHBlZCcsIHRydWUpO1xuXG5cdCAgZGVmaW5lUHJvcGVydHkobm9kdWxlLCBuYW1lLCB3cmFwcGVkKTtcblx0ICByZXR1cm4gd3JhcHBlZFxuXHR9XG5cblx0ZnVuY3Rpb24gbWFzc1dyYXAgKG5vZHVsZXMsIG5hbWVzLCB3cmFwcGVyKSB7XG5cdCAgaWYgKCFub2R1bGVzKSB7XG5cdCAgICBsb2dnZXIoJ211c3QgcHJvdmlkZSBvbmUgb3IgbW9yZSBtb2R1bGVzIHRvIHBhdGNoJyk7XG5cdCAgICBsb2dnZXIoKG5ldyBFcnJvcigpKS5zdGFjayk7XG5cdCAgICByZXR1cm5cblx0ICB9IGVsc2UgaWYgKCFBcnJheS5pc0FycmF5KG5vZHVsZXMpKSB7XG5cdCAgICBub2R1bGVzID0gW25vZHVsZXNdO1xuXHQgIH1cblxuXHQgIGlmICghKG5hbWVzICYmIEFycmF5LmlzQXJyYXkobmFtZXMpKSkge1xuXHQgICAgbG9nZ2VyKCdtdXN0IHByb3ZpZGUgb25lIG9yIG1vcmUgZnVuY3Rpb25zIHRvIHdyYXAgb24gbW9kdWxlcycpO1xuXHQgICAgcmV0dXJuXG5cdCAgfVxuXG5cdCAgbm9kdWxlcy5mb3JFYWNoKGZ1bmN0aW9uIChub2R1bGUpIHtcblx0ICAgIG5hbWVzLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcblx0ICAgICAgd3JhcChub2R1bGUsIG5hbWUsIHdyYXBwZXIpO1xuXHQgICAgfSk7XG5cdCAgfSk7XG5cdH1cblxuXHRmdW5jdGlvbiB1bndyYXAgKG5vZHVsZSwgbmFtZSkge1xuXHQgIGlmICghbm9kdWxlIHx8ICFub2R1bGVbbmFtZV0pIHtcblx0ICAgIGxvZ2dlcignbm8gZnVuY3Rpb24gdG8gdW53cmFwLicpO1xuXHQgICAgbG9nZ2VyKChuZXcgRXJyb3IoKSkuc3RhY2spO1xuXHQgICAgcmV0dXJuXG5cdCAgfVxuXG5cdCAgaWYgKCFub2R1bGVbbmFtZV0uX191bndyYXApIHtcblx0ICAgIGxvZ2dlcignbm8gb3JpZ2luYWwgdG8gdW53cmFwIHRvIC0tIGhhcyAnICsgbmFtZSArICcgYWxyZWFkeSBiZWVuIHVud3JhcHBlZD8nKTtcblx0ICB9IGVsc2Uge1xuXHQgICAgcmV0dXJuIG5vZHVsZVtuYW1lXS5fX3Vud3JhcCgpXG5cdCAgfVxuXHR9XG5cblx0ZnVuY3Rpb24gbWFzc1Vud3JhcCAobm9kdWxlcywgbmFtZXMpIHtcblx0ICBpZiAoIW5vZHVsZXMpIHtcblx0ICAgIGxvZ2dlcignbXVzdCBwcm92aWRlIG9uZSBvciBtb3JlIG1vZHVsZXMgdG8gcGF0Y2gnKTtcblx0ICAgIGxvZ2dlcigobmV3IEVycm9yKCkpLnN0YWNrKTtcblx0ICAgIHJldHVyblxuXHQgIH0gZWxzZSBpZiAoIUFycmF5LmlzQXJyYXkobm9kdWxlcykpIHtcblx0ICAgIG5vZHVsZXMgPSBbbm9kdWxlc107XG5cdCAgfVxuXG5cdCAgaWYgKCEobmFtZXMgJiYgQXJyYXkuaXNBcnJheShuYW1lcykpKSB7XG5cdCAgICBsb2dnZXIoJ211c3QgcHJvdmlkZSBvbmUgb3IgbW9yZSBmdW5jdGlvbnMgdG8gdW53cmFwIG9uIG1vZHVsZXMnKTtcblx0ICAgIHJldHVyblxuXHQgIH1cblxuXHQgIG5vZHVsZXMuZm9yRWFjaChmdW5jdGlvbiAobm9kdWxlKSB7XG5cdCAgICBuYW1lcy5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG5cdCAgICAgIHVud3JhcChub2R1bGUsIG5hbWUpO1xuXHQgICAgfSk7XG5cdCAgfSk7XG5cdH1cblxuXHRzaGltbWVyLndyYXAgPSB3cmFwO1xuXHRzaGltbWVyLm1hc3NXcmFwID0gbWFzc1dyYXA7XG5cdHNoaW1tZXIudW53cmFwID0gdW53cmFwO1xuXHRzaGltbWVyLm1hc3NVbndyYXAgPSBtYXNzVW53cmFwO1xuXG5cdHNoaW1tZXJfMSA9IHNoaW1tZXI7XG5cdHJldHVybiBzaGltbWVyXzE7XG59XG5cbnZhciBzaGltbWVyRXhwb3J0cyA9IHJlcXVpcmVTaGltbWVyKCk7XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG52YXIgX19hc3NpZ24gPSAodW5kZWZpbmVkICYmIHVuZGVmaW5lZC5fX2Fzc2lnbikgfHwgZnVuY3Rpb24gKCkge1xuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbih0KSB7XG4gICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSlcbiAgICAgICAgICAgICAgICB0W3BdID0gc1twXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdDtcbiAgICB9O1xuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufTtcbi8qKlxuICogQmFzZSBhYnN0cmFjdCBpbnRlcm5hbCBjbGFzcyBmb3IgaW5zdHJ1bWVudGluZyBub2RlIGFuZCB3ZWIgcGx1Z2luc1xuICovXG52YXIgSW5zdHJ1bWVudGF0aW9uQWJzdHJhY3QgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gSW5zdHJ1bWVudGF0aW9uQWJzdHJhY3QoaW5zdHJ1bWVudGF0aW9uTmFtZSwgaW5zdHJ1bWVudGF0aW9uVmVyc2lvbiwgY29uZmlnKSB7XG4gICAgICAgIHRoaXMuaW5zdHJ1bWVudGF0aW9uTmFtZSA9IGluc3RydW1lbnRhdGlvbk5hbWU7XG4gICAgICAgIHRoaXMuaW5zdHJ1bWVudGF0aW9uVmVyc2lvbiA9IGluc3RydW1lbnRhdGlvblZlcnNpb247XG4gICAgICAgIHRoaXMuX2NvbmZpZyA9IHt9O1xuICAgICAgICAvKiBBcGkgdG8gd3JhcCBpbnN0cnVtZW50ZWQgbWV0aG9kICovXG4gICAgICAgIHRoaXMuX3dyYXAgPSBzaGltbWVyRXhwb3J0cy53cmFwO1xuICAgICAgICAvKiBBcGkgdG8gdW53cmFwIGluc3RydW1lbnRlZCBtZXRob2RzICovXG4gICAgICAgIHRoaXMuX3Vud3JhcCA9IHNoaW1tZXJFeHBvcnRzLnVud3JhcDtcbiAgICAgICAgLyogQXBpIHRvIG1hc3Mgd3JhcCBpbnN0cnVtZW50ZWQgbWV0aG9kICovXG4gICAgICAgIHRoaXMuX21hc3NXcmFwID0gc2hpbW1lckV4cG9ydHMubWFzc1dyYXA7XG4gICAgICAgIC8qIEFwaSB0byBtYXNzIHVud3JhcCBpbnN0cnVtZW50ZWQgbWV0aG9kcyAqL1xuICAgICAgICB0aGlzLl9tYXNzVW53cmFwID0gc2hpbW1lckV4cG9ydHMubWFzc1Vud3JhcDtcbiAgICAgICAgdGhpcy5zZXRDb25maWcoY29uZmlnKTtcbiAgICAgICAgdGhpcy5fZGlhZyA9IGRpYWcuY3JlYXRlQ29tcG9uZW50TG9nZ2VyKHtcbiAgICAgICAgICAgIG5hbWVzcGFjZTogaW5zdHJ1bWVudGF0aW9uTmFtZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX3RyYWNlciA9IHRyYWNlLmdldFRyYWNlcihpbnN0cnVtZW50YXRpb25OYW1lLCBpbnN0cnVtZW50YXRpb25WZXJzaW9uKTtcbiAgICAgICAgdGhpcy5fbWV0ZXIgPSBtZXRyaWNzLmdldE1ldGVyKGluc3RydW1lbnRhdGlvbk5hbWUsIGluc3RydW1lbnRhdGlvblZlcnNpb24pO1xuICAgICAgICB0aGlzLl9sb2dnZXIgPSBsb2dzLmdldExvZ2dlcihpbnN0cnVtZW50YXRpb25OYW1lLCBpbnN0cnVtZW50YXRpb25WZXJzaW9uKTtcbiAgICAgICAgdGhpcy5fdXBkYXRlTWV0cmljSW5zdHJ1bWVudHMoKTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEluc3RydW1lbnRhdGlvbkFic3RyYWN0LnByb3RvdHlwZSwgXCJtZXRlclwiLCB7XG4gICAgICAgIC8qIFJldHVybnMgbWV0ZXIgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbWV0ZXI7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICAvKipcbiAgICAgKiBTZXRzIE1ldGVyUHJvdmlkZXIgdG8gdGhpcyBwbHVnaW5cbiAgICAgKiBAcGFyYW0gbWV0ZXJQcm92aWRlclxuICAgICAqL1xuICAgIEluc3RydW1lbnRhdGlvbkFic3RyYWN0LnByb3RvdHlwZS5zZXRNZXRlclByb3ZpZGVyID0gZnVuY3Rpb24gKG1ldGVyUHJvdmlkZXIpIHtcbiAgICAgICAgdGhpcy5fbWV0ZXIgPSBtZXRlclByb3ZpZGVyLmdldE1ldGVyKHRoaXMuaW5zdHJ1bWVudGF0aW9uTmFtZSwgdGhpcy5pbnN0cnVtZW50YXRpb25WZXJzaW9uKTtcbiAgICAgICAgdGhpcy5fdXBkYXRlTWV0cmljSW5zdHJ1bWVudHMoKTtcbiAgICB9O1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShJbnN0cnVtZW50YXRpb25BYnN0cmFjdC5wcm90b3R5cGUsIFwibG9nZ2VyXCIsIHtcbiAgICAgICAgLyogUmV0dXJucyBsb2dnZXIgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbG9nZ2VyO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgLyoqXG4gICAgICogU2V0cyBMb2dnZXJQcm92aWRlciB0byB0aGlzIHBsdWdpblxuICAgICAqIEBwYXJhbSBsb2dnZXJQcm92aWRlclxuICAgICAqL1xuICAgIEluc3RydW1lbnRhdGlvbkFic3RyYWN0LnByb3RvdHlwZS5zZXRMb2dnZXJQcm92aWRlciA9IGZ1bmN0aW9uIChsb2dnZXJQcm92aWRlcikge1xuICAgICAgICB0aGlzLl9sb2dnZXIgPSBsb2dnZXJQcm92aWRlci5nZXRMb2dnZXIodGhpcy5pbnN0cnVtZW50YXRpb25OYW1lLCB0aGlzLmluc3RydW1lbnRhdGlvblZlcnNpb24pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQGV4cGVyaW1lbnRhbFxuICAgICAqXG4gICAgICogR2V0IG1vZHVsZSBkZWZpbml0aW9ucyBkZWZpbmVkIGJ5IHtAbGluayBpbml0fS5cbiAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIGZvciBleHBlcmltZW50YWwgY29tcGlsZS10aW1lIGluc3RydW1lbnRhdGlvbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIGFuIGFycmF5IG9mIHtAbGluayBJbnN0cnVtZW50YXRpb25Nb2R1bGVEZWZpbml0aW9ufVxuICAgICAqL1xuICAgIEluc3RydW1lbnRhdGlvbkFic3RyYWN0LnByb3RvdHlwZS5nZXRNb2R1bGVEZWZpbml0aW9ucyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB2YXIgaW5pdFJlc3VsdCA9IChfYSA9IHRoaXMuaW5pdCgpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBbXTtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGluaXRSZXN1bHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gW2luaXRSZXN1bHRdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbml0UmVzdWx0O1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgbmV3IG1ldHJpYyBpbnN0cnVtZW50cyB3aXRoIHRoZSBjdXJyZW50IE1ldGVyLlxuICAgICAqL1xuICAgIEluc3RydW1lbnRhdGlvbkFic3RyYWN0LnByb3RvdHlwZS5fdXBkYXRlTWV0cmljSW5zdHJ1bWVudHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9O1xuICAgIC8qIFJldHVybnMgSW5zdHJ1bWVudGF0aW9uQ29uZmlnICovXG4gICAgSW5zdHJ1bWVudGF0aW9uQWJzdHJhY3QucHJvdG90eXBlLmdldENvbmZpZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbmZpZztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNldHMgSW5zdHJ1bWVudGF0aW9uQ29uZmlnIHRvIHRoaXMgcGx1Z2luXG4gICAgICogQHBhcmFtIGNvbmZpZ1xuICAgICAqL1xuICAgIEluc3RydW1lbnRhdGlvbkFic3RyYWN0LnByb3RvdHlwZS5zZXRDb25maWcgPSBmdW5jdGlvbiAoY29uZmlnKSB7XG4gICAgICAgIC8vIGNvcHkgY29uZmlnIGZpcnN0IGxldmVsIHByb3BlcnRpZXMgdG8gZW5zdXJlIHRoZXkgYXJlIGltbXV0YWJsZS5cbiAgICAgICAgLy8gbmVzdGVkIHByb3BlcnRpZXMgYXJlIG5vdCBjb3BpZWQsIHRodXMgYXJlIG11dGFibGUgZnJvbSB0aGUgb3V0c2lkZS5cbiAgICAgICAgdGhpcy5fY29uZmlnID0gX19hc3NpZ24oeyBlbmFibGVkOiB0cnVlIH0sIGNvbmZpZyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZXRzIFRyYWNlUHJvdmlkZXIgdG8gdGhpcyBwbHVnaW5cbiAgICAgKiBAcGFyYW0gdHJhY2VyUHJvdmlkZXJcbiAgICAgKi9cbiAgICBJbnN0cnVtZW50YXRpb25BYnN0cmFjdC5wcm90b3R5cGUuc2V0VHJhY2VyUHJvdmlkZXIgPSBmdW5jdGlvbiAodHJhY2VyUHJvdmlkZXIpIHtcbiAgICAgICAgdGhpcy5fdHJhY2VyID0gdHJhY2VyUHJvdmlkZXIuZ2V0VHJhY2VyKHRoaXMuaW5zdHJ1bWVudGF0aW9uTmFtZSwgdGhpcy5pbnN0cnVtZW50YXRpb25WZXJzaW9uKTtcbiAgICB9O1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShJbnN0cnVtZW50YXRpb25BYnN0cmFjdC5wcm90b3R5cGUsIFwidHJhY2VyXCIsIHtcbiAgICAgICAgLyogUmV0dXJucyB0cmFjZXIgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdHJhY2VyO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgLyoqXG4gICAgICogRXhlY3V0ZSBzcGFuIGN1c3RvbWl6YXRpb24gaG9vaywgaWYgY29uZmlndXJlZCwgYW5kIGxvZyBhbnkgZXJyb3JzLlxuICAgICAqIEFueSBzZW1hbnRpY3Mgb2YgdGhlIHRyaWdnZXIgYW5kIGluZm8gYXJlIGRlZmluZWQgYnkgdGhlIHNwZWNpZmljIGluc3RydW1lbnRhdGlvbi5cbiAgICAgKiBAcGFyYW0gaG9va0hhbmRsZXIgVGhlIG9wdGlvbmFsIGhvb2sgaGFuZGxlciB3aGljaCB0aGUgdXNlciBoYXMgY29uZmlndXJlZCB2aWEgaW5zdHJ1bWVudGF0aW9uIGNvbmZpZ1xuICAgICAqIEBwYXJhbSB0cmlnZ2VyTmFtZSBUaGUgbmFtZSBvZiB0aGUgdHJpZ2dlciBmb3IgZXhlY3V0aW5nIHRoZSBob29rIGZvciBsb2dnaW5nIHB1cnBvc2VzXG4gICAgICogQHBhcmFtIHNwYW4gVGhlIHNwYW4gdG8gd2hpY2ggdGhlIGhvb2sgc2hvdWxkIGJlIGFwcGxpZWRcbiAgICAgKiBAcGFyYW0gaW5mbyBUaGUgaW5mbyBvYmplY3QgdG8gYmUgcGFzc2VkIHRvIHRoZSBob29rLCB3aXRoIHVzZWZ1bCBkYXRhIHRoZSBob29rIG1heSB1c2VcbiAgICAgKi9cbiAgICBJbnN0cnVtZW50YXRpb25BYnN0cmFjdC5wcm90b3R5cGUuX3J1blNwYW5DdXN0b21pemF0aW9uSG9vayA9IGZ1bmN0aW9uIChob29rSGFuZGxlciwgdHJpZ2dlck5hbWUsIHNwYW4sIGluZm8pIHtcbiAgICAgICAgaWYgKCFob29rSGFuZGxlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBob29rSGFuZGxlcihzcGFuLCBpbmZvKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5fZGlhZy5lcnJvcihcIkVycm9yIHJ1bm5pbmcgc3BhbiBjdXN0b21pemF0aW9uIGhvb2sgZHVlIHRvIGV4Y2VwdGlvbiBpbiBoYW5kbGVyXCIsIHsgdHJpZ2dlck5hbWU6IHRyaWdnZXJOYW1lIH0sIGUpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gSW5zdHJ1bWVudGF0aW9uQWJzdHJhY3Q7XG59KCkpO1xuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xudmFyIF9fZXh0ZW5kcyA9ICh1bmRlZmluZWQgJiYgdW5kZWZpbmVkLl9fZXh0ZW5kcykgfHwgKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcbiAgICAgICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcbiAgICAgICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07IH07XG4gICAgICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgIH07XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhiKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG4gICAgfTtcbn0pKCk7XG4vKipcbiAqIEJhc2UgYWJzdHJhY3QgY2xhc3MgZm9yIGluc3RydW1lbnRpbmcgd2ViIHBsdWdpbnNcbiAqL1xudmFyIEluc3RydW1lbnRhdGlvbkJhc2UgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEluc3RydW1lbnRhdGlvbkJhc2UsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gSW5zdHJ1bWVudGF0aW9uQmFzZShpbnN0cnVtZW50YXRpb25OYW1lLCBpbnN0cnVtZW50YXRpb25WZXJzaW9uLCBjb25maWcpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgaW5zdHJ1bWVudGF0aW9uTmFtZSwgaW5zdHJ1bWVudGF0aW9uVmVyc2lvbiwgY29uZmlnKSB8fCB0aGlzO1xuICAgICAgICBpZiAoX3RoaXMuX2NvbmZpZy5lbmFibGVkKSB7XG4gICAgICAgICAgICBfdGhpcy5lbmFibGUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBJbnN0cnVtZW50YXRpb25CYXNlO1xufShJbnN0cnVtZW50YXRpb25BYnN0cmFjdCkpO1xuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuKHVuZGVmaW5lZCAmJiB1bmRlZmluZWQuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG4odW5kZWZpbmVkICYmIHVuZGVmaW5lZC5fX2dlbmVyYXRvcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIGJvZHkpIHtcbiAgICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnO1xuICAgIHJldHVybiBnID0geyBuZXh0OiB2ZXJiKDApLCBcInRocm93XCI6IHZlcmIoMSksIFwicmV0dXJuXCI6IHZlcmIoMikgfSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxuICAgIGZ1bmN0aW9uIHN0ZXAob3ApIHtcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xuICAgICAgICB3aGlsZSAoXykgdHJ5IHtcbiAgICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcbiAgICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xuICAgICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xuICAgIH1cbn07XG4vKipcbiAqIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgcGF0Y2hlZCBmdW5jdGlvbiBhbmQgYmVpbmcgYWJsZSB0byBjYXRjaCBlcnJvcnNcbiAqIEBwYXJhbSBleGVjdXRlIC0gZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWRcbiAqIEBwYXJhbSBvbkZpbmlzaCAtIGNhbGxiYWNrIHRvIHJ1biB3aGVuIGV4ZWN1dGUgZmluaXNoZXNcbiAqL1xuZnVuY3Rpb24gc2FmZUV4ZWN1dGVJblRoZU1pZGRsZShleGVjdXRlLCBvbkZpbmlzaCwgcHJldmVudFRocm93aW5nRXJyb3IpIHtcbiAgICB2YXIgZXJyb3I7XG4gICAgdmFyIHJlc3VsdDtcbiAgICB0cnkge1xuICAgICAgICByZXN1bHQgPSBleGVjdXRlKCk7XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIGVycm9yID0gZTtcbiAgICB9XG4gICAgZmluYWxseSB7XG4gICAgICAgIG9uRmluaXNoKGVycm9yLCByZXN1bHQpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5zYWZlLWZpbmFsbHlcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG4vKipcbiAqIENoZWNrcyBpZiBjZXJ0YWluIGZ1bmN0aW9uIGhhcyBiZWVuIGFscmVhZHkgd3JhcHBlZFxuICogQHBhcmFtIGZ1bmNcbiAqL1xuZnVuY3Rpb24gaXNXcmFwcGVkKGZ1bmMpIHtcbiAgICByZXR1cm4gKHR5cGVvZiBmdW5jID09PSAnZnVuY3Rpb24nICYmXG4gICAgICAgIHR5cGVvZiBmdW5jLl9fb3JpZ2luYWwgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgICAgdHlwZW9mIGZ1bmMuX191bndyYXAgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgICAgZnVuYy5fX3dyYXBwZWQgPT09IHRydWUpO1xufVxuXG5leHBvcnQgeyBJbnN0cnVtZW50YXRpb25CYXNlIGFzIEksIGlzV3JhcHBlZCBhcyBpLCBsb2dzIGFzIGwsIHNhZmVFeGVjdXRlSW5UaGVNaWRkbGUgYXMgcyB9OyJdLAogICJtYXBwaW5ncyI6ICJBQUFBLFNBQVMsS0FBS0EsU0FBWTtBQUMxQixTQUFTLEtBQUtDLFNBQWU7QUFDN0IsU0FBUyxLQUFLQyxTQUFhO0FBaUIzQixJQUFJQztBQUFBO0FBQUEsR0FBNEIsV0FBWTtBQUN4QyxhQUFTQSxJQUFhO0FBQUEsSUFDdEI7QUFDQSxXQUFBQSxFQUFXLFVBQVUsT0FBTyxTQUFVQyxHQUFZO0FBQUEsSUFBRSxHQUM3Q0Q7QUFBQSxFQUNYLEdBQUU7QUFBQSxHQUNFRSxJQUFjLElBQUlGLEVBQVcsR0FpQjdCRztBQUFBO0FBQUEsR0FBb0MsV0FBWTtBQUNoRCxhQUFTQSxJQUFxQjtBQUFBLElBQzlCO0FBQ0EsV0FBQUEsRUFBbUIsVUFBVSxZQUFZLFNBQVVDLEdBQU9DLEdBQVVDLEdBQVU7QUFDMUUsYUFBTyxJQUFJTixFQUFXO0FBQUEsSUFDMUIsR0FDT0c7QUFBQSxFQUNYLEdBQUU7QUFBQSxHQUNFSSxJQUF1QixJQUFJSixFQUFtQixHQWlCOUNLO0FBQUE7QUFBQSxHQUE2QixXQUFZO0FBQ3pDLGFBQVNBLEVBQVlDLEdBQVdDLEdBQU1DLEdBQVNDLEdBQVM7QUFDcEQsV0FBSyxZQUFZSCxHQUNqQixLQUFLLE9BQU9DLEdBQ1osS0FBSyxVQUFVQyxHQUNmLEtBQUssVUFBVUM7QUFBQSxJQUNuQjtBQU1BLFdBQUFKLEVBQVksVUFBVSxPQUFPLFNBQVVLLEdBQVc7QUFDOUMsV0FBSyxXQUFXLEVBQUUsS0FBS0EsQ0FBUztBQUFBLElBQ3BDLEdBS0FMLEVBQVksVUFBVSxhQUFhLFdBQVk7QUFDM0MsVUFBSSxLQUFLO0FBQ0wsZUFBTyxLQUFLO0FBRWhCLFVBQUlNLElBQVMsS0FBSyxVQUFVLGtCQUFrQixLQUFLLE1BQU0sS0FBSyxTQUFTLEtBQUssT0FBTztBQUNuRixhQUFLQSxLQUdMLEtBQUssWUFBWUEsR0FDVixLQUFLLGFBSERa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